From 79a330ecd2cbb940ab277c5e98a16dd4e221c77d Mon Sep 17 00:00:00 2001 From: Kristaps Kaupe Date: Sat, 7 Aug 2021 00:53:25 +0300 Subject: [PATCH] Check that gettimelockaddress argument is in future --- jmclient/jmclient/wallet_utils.py | 5 +++++ jmclient/test/test_wallet.py | 19 +++++++++++++++++++ requirements/testing.txt | 1 + 3 files changed, 25 insertions(+) diff --git a/jmclient/jmclient/wallet_utils.py b/jmclient/jmclient/wallet_utils.py index 02b9446..4ca3f48 100644 --- a/jmclient/jmclient/wallet_utils.py +++ b/jmclient/jmclient/wallet_utils.py @@ -1224,7 +1224,12 @@ def wallet_gettimelockaddress(wallet, locktime_string): m = FidelityBondMixin.FIDELITY_BOND_MIXDEPTH address_type = FidelityBondMixin.BIP32_TIMELOCK_ID + lock_datetime = datetime.strptime(locktime_string, "%Y-%m") + if jm_single().config.get("BLOCKCHAIN", "network") == "mainnet" and lock_datetime <= datetime.now(): + jmprint("Error: locktime must be a future date", "error") + return "" + timenumber = FidelityBondMixin.datetime_to_time_number(lock_datetime) path = wallet.get_path(m, address_type, timenumber) diff --git a/jmclient/test/test_wallet.py b/jmclient/test/test_wallet.py index ca7f928..5e36583 100644 --- a/jmclient/test/test_wallet.py +++ b/jmclient/test/test_wallet.py @@ -15,6 +15,7 @@ from jmclient import load_test_config, jm_single, BaseWallet, \ create_wallet, open_test_wallet_maybe, \ FidelityBondMixin, FidelityBondWatchonlyWallet, wallet_gettimelockaddress from test_blockchaininterface import sync_test_wallet +from freezegun import freeze_time testdir = os.path.dirname(os.path.realpath(__file__)) @@ -242,6 +243,7 @@ def test_bip32_addresses_p2sh_p2wpkh(setup_wallet, mixdepth, internal, index, ad assert wif == wallet.get_wif(mixdepth, internal, index) assert address == wallet.get_addr(mixdepth, internal, index) + @pytest.mark.parametrize('timenumber,address,wif', [ [0, 'bcrt1qgysu2eynn6klarz200ctgev7gqhhp7hwsdaaec3c7h0ltmc3r68q87c2d3', 'cVASAS6bpC5yctGmnsKaDz7D8CxEwccUtpjSNBQzeV2fw8ox8RR9'], [50, 'bcrt1q0cnscj0hlf6xqzlqwk7swngd3kmvd6unn49j9h4zgg68kg8fd7gq0r87lf', 'cMtnaLzC2EW3URnmAapRnPQECGwGruxqXJpAnuRjKup3pkWfrxRE'], @@ -264,6 +266,7 @@ def test_bip32_timelocked_addresses(setup_wallet, timenumber, address, wif): assert address == wallet.get_addr(mixdepth, address_type, timenumber) assert wif == wallet.get_wif_path(wallet.get_path(mixdepth, address_type, timenumber)) + @pytest.mark.parametrize('timenumber,locktime_string', [ [0, "2020-01"], [20, "2021-09"], @@ -271,7 +274,9 @@ def test_bip32_timelocked_addresses(setup_wallet, timenumber, address, wif): [150, "2032-07"], [350, "2049-03"] ]) +@freeze_time("2019-12") def test_gettimelockaddress_method(setup_wallet, timenumber, locktime_string): + jm_single().config.set("BLOCKCHAIN", "network", "mainnet") storage = VolatileStorage() SegwitWalletFidelityBonds.initialize(storage, get_network()) wallet = SegwitWalletFidelityBonds(storage) @@ -285,6 +290,19 @@ def test_gettimelockaddress_method(setup_wallet, timenumber, locktime_string): assert addr == addr_from_method + +@freeze_time("2021-01") +def test_gettimelockaddress_in_past(setup_wallet): + jm_single().config.set("BLOCKCHAIN", "network", "mainnet") + storage = VolatileStorage() + SegwitWalletFidelityBonds.initialize(storage, get_network()) + wallet = SegwitWalletFidelityBonds(storage) + + assert wallet_gettimelockaddress(wallet, "2020-01") == "" + assert wallet_gettimelockaddress(wallet, "2021-01") == "" + assert wallet_gettimelockaddress(wallet, "2021-02") != "" + + @pytest.mark.parametrize('index,wif', [ [0, 'cVQbz7DB5JQ1TGsg9Dbm32VtJbXBHaj39Yc9QLkaGpRgXcibHTDH'], [9, 'cULqe2sYZ4z8jZTGybr2Bzf4EyiT5Ts6wAE3mvCUofRuTVsofR8N'], @@ -306,6 +324,7 @@ def test_bip32_burn_keys(setup_wallet, index, wif): assert wif == wallet.get_wif_path(wallet.get_path(mixdepth, address_type, index)) + def test_import_key(setup_wallet): jm_single().config.set('BLOCKCHAIN', 'network', 'testnet') storage = VolatileStorage() diff --git a/requirements/testing.txt b/requirements/testing.txt index 837f79c..d82ea4d 100644 --- a/requirements/testing.txt +++ b/requirements/testing.txt @@ -8,3 +8,4 @@ pytest-cov>=2.4.0,<2.6 python-coveralls mock flake8 +freezegun