From 3c3778db9cbfeaa659ee8fb602248040f43bc6fe Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 14 Mar 2025 16:44:46 +0000 Subject: [PATCH 1/4] wallet: towards killing create_transaction: rm "sign" arg --- electrum/commands.py | 8 ++--- electrum/gui/stdio.py | 2 +- electrum/gui/text.py | 2 +- electrum/submarine_swaps.py | 3 +- electrum/txbatcher.py | 2 +- electrum/wallet.py | 6 ---- tests/test_invoices.py | 4 +++ tests/test_wallet_vertical.py | 59 ++++++++++++++++++++--------------- 8 files changed, 45 insertions(+), 41 deletions(-) diff --git a/electrum/commands.py b/electrum/commands.py index b131f1807..dab371749 100644 --- a/electrum/commands.py +++ b/electrum/commands.py @@ -792,10 +792,10 @@ class Commands(Logger): change_addr=change_addr, domain_addr=domain_addr, domain_coins=domain_coins, - sign=not unsigned, rbf=rbf, - password=password, locktime=locktime) + if not unsigned: + wallet.sign_transaction(tx, password) result = tx.serialize() if addtransaction: await self.addtransaction(result, wallet=wallet) @@ -822,10 +822,10 @@ class Commands(Logger): change_addr=change_addr, domain_addr=domain_addr, domain_coins=domain_coins, - sign=not unsigned, rbf=rbf, - password=password, locktime=locktime) + if not unsigned: + wallet.sign_transaction(tx, password) result = tx.serialize() if addtransaction: await self.addtransaction(result, wallet=wallet) diff --git a/electrum/gui/stdio.py b/electrum/gui/stdio.py index e6abc0866..f96f948a6 100644 --- a/electrum/gui/stdio.py +++ b/electrum/gui/stdio.py @@ -214,9 +214,9 @@ class ElectrumGui(BaseElectrumGui, EventListener): try: tx = self.wallet.create_transaction( outputs=[PartialTxOutput.from_address_and_value(self.str_recipient, amount)], - password=password, fee_policy=FixedFeePolicy(fee), ) + self.wallet.sign_transaction(tx, password) except Exception as e: print(repr(e)) return diff --git a/electrum/gui/text.py b/electrum/gui/text.py index e009a8012..dbea07b21 100644 --- a/electrum/gui/text.py +++ b/electrum/gui/text.py @@ -693,9 +693,9 @@ class ElectrumGui(BaseElectrumGui, EventListener): try: tx = self.wallet.create_transaction( outputs=invoice.outputs, - password=password, fee_policy=fee_policy, ) + self.wallet.sign_transaction(tx, password) except Exception as e: self.show_message(repr(e)) return diff --git a/electrum/submarine_swaps.py b/electrum/submarine_swaps.py index 25f8653dd..d69524f2a 100644 --- a/electrum/submarine_swaps.py +++ b/electrum/submarine_swaps.py @@ -774,13 +774,12 @@ class SwapManager(Logger): tx = self.wallet.create_transaction( outputs=[funding_output], rbf=True, - password=password, fee_policy=fee_policy, ) else: tx.replace_output_address(DummyAddress.SWAP, swap.lockup_address) tx.set_rbf(True) - self.wallet.sign_transaction(tx, password) + self.wallet.sign_transaction(tx, password) return tx @log_exceptions diff --git a/electrum/txbatcher.py b/electrum/txbatcher.py index 3800583ac..589adc3cd 100644 --- a/electrum/txbatcher.py +++ b/electrum/txbatcher.py @@ -396,11 +396,11 @@ class TxBatch(Logger): base_tx=base_tx, inputs=inputs, outputs=outputs, - password=password, locktime=locktime, BIP69_sort=False, merge_duplicate_outputs=False, ) + self.wallet.sign_transaction(tx, password) # this assert will fail if we merge duplicate outputs for o in outputs: assert o in tx.outputs() assert tx.is_complete() diff --git a/electrum/wallet.py b/electrum/wallet.py index 2cd193582..5f8f4a0c1 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -3107,9 +3107,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): change_addr=None, domain_addr=None, domain_coins=None, - sign=True, rbf=True, - password=None, locktime=None, tx_version: Optional[int] = None, base_tx: Optional[PartialTransaction] = None, @@ -3139,8 +3137,6 @@ class Abstract_Wallet(ABC, Logger, EventListener): tx.locktime = locktime if tx_version is not None: tx.version = tx_version - if sign: - self.sign_transaction(tx, password) return tx def _check_risk_of_burning_coins_as_fees(self, tx: 'PartialTransaction') -> TxSighashDanger: @@ -3396,9 +3392,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): tx = self.create_transaction( inputs=[txin], outputs=[], - password=None, fee_policy=FixedFeePolicy(0), - sign=False, ) try: self.adb.add_transaction(tx) diff --git a/tests/test_invoices.py b/tests/test_invoices.py index 20accb917..f967c3092 100644 --- a/tests/test_invoices.py +++ b/tests/test_invoices.py @@ -73,6 +73,7 @@ class TestWalletPaymentRequests(ElectrumTestCase): wallet2 = self.create_wallet2() # type: Standard_Wallet outputs = [PartialTxOutput.from_address_and_value(pr.get_address(), pr.get_amount_sat())] tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) + wallet2.sign_transaction(tx, password=None) wallet1.adb.receive_tx_callback(tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual(PR_UNCONFIRMED, wallet1.get_invoice_status(pr)) # tx gets mined @@ -103,6 +104,7 @@ class TestWalletPaymentRequests(ElectrumTestCase): wallet2 = self.create_wallet2() # type: Standard_Wallet outputs = [PartialTxOutput.from_address_and_value(pr.get_address(), pr.get_amount_sat())] tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) + wallet2.sign_transaction(tx, password=None) wallet1.adb.receive_tx_callback(tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual(PR_UNCONFIRMED, wallet1.get_invoice_status(pr)) # tx gets mined @@ -133,6 +135,7 @@ class TestWalletPaymentRequests(ElectrumTestCase): wallet2 = self.create_wallet2() # type: Standard_Wallet outputs = [PartialTxOutput.from_address_and_value(pr.get_address(), pr.get_amount_sat())] tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) + wallet2.sign_transaction(tx, password=None) wallet1.adb.receive_tx_callback(tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual(PR_UNCONFIRMED, wallet1.get_invoice_status(pr)) # tx mined in the past (before invoice creation) @@ -202,6 +205,7 @@ class TestWalletPaymentRequests(ElectrumTestCase): wallet2 = self.create_wallet2() # type: Standard_Wallet outputs = [PartialTxOutput.from_address_and_value(pr2.get_address(), pr2.get_amount_sat())] tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) + wallet2.sign_transaction(tx, password=None) wallet1.adb.receive_tx_callback(tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual(PR_UNCONFIRMED, wallet1.get_invoice_status(pr2)) self.assertEqual(pr2, wallet1.get_request_by_addr(addr1)) diff --git a/tests/test_wallet_vertical.py b/tests/test_wallet_vertical.py index f2411abfb..cf1f37d27 100644 --- a/tests/test_wallet_vertical.py +++ b/tests/test_wallet_vertical.py @@ -873,7 +873,8 @@ class TestWalletSending(ElectrumTestCase): # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2.get_receiving_address(), 250000)] - tx = wallet1.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet1.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + wallet1.sign_transaction(tx, password=None) self.assertTrue(tx.is_complete()) self.assertTrue(tx.is_segwit()) @@ -892,7 +893,8 @@ class TestWalletSending(ElectrumTestCase): # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1.get_receiving_address(), 100000)] - tx = wallet2.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + wallet2.sign_transaction(tx, password=None) self.assertTrue(tx.is_complete()) self.assertFalse(tx.is_segwit()) @@ -945,7 +947,8 @@ class TestWalletSending(ElectrumTestCase): # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2.get_receiving_address(), 370000)] - tx = wallet1a.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet1a.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + wallet1a.sign_transaction(tx, password=None) partial_tx = tx.serialize_as_bytes().hex() self.assertEqual("70736274ff01007501000000017120d4e1f2cdfe7df000d632cff74167fb354f0546d5cfc228e5c98756d55cb20100000000feffffff0250a50500000000001976a9149cd3dfb0d87a861770ae4e268e74b45335cf00ab88ac2862b1000000000017a9142e517854aa54668128c0e9a3fdd4dec13ad571368700000000000100e0010000000001014121f99dc02f0364d2dab3d08905ff4c36fc76c55437fd90b769c35cc18618280100000000fdffffff02d4c22d00000000001600143fd1bc5d32245850c8cb5be5b09c73ccbb9a0f75001bb7000000000017a91480c2353f6a7bc3c71e99e062655b19adb3dd2e4887024830450221008781c78df0c9d4b5ea057333195d5d76bc29494d773f14fa80e27d2f288b2c360220762531614799b6f0fb8d539b18cb5232ab4253dd4385435157b28a44ff63810d0121033de77d21926e09efd04047ae2d39dbd3fb9db446e8b7ed53e0f70f9c9478f735dac11300220202afb4af9a91264e1c6dce3ebe5312801723270ac0ba8134b7b49129328fcb0f284730440220751ee3599e59debb8b2aeef61bb5f574f26379cd961caf382d711a507bc632390220598d53e62557c4a5ab8cfb2f8948f37cca06a861714b55c781baf2c3d7a580b501010469522102afb4af9a91264e1c6dce3ebe5312801723270ac0ba8134b7b49129328fcb0f2821030b482838721a38d94847699fed8818b5c5f56500ef72f13489e365b65e5749cf2103e5db7969ae2f2576e6a061bf3bb2db16571e77ffb41e0b27170734359235cbce53ae220602afb4af9a91264e1c6dce3ebe5312801723270ac0ba8134b7b49129328fcb0f280c0036e9ac00000000000000002206030b482838721a38d94847699fed8818b5c5f56500ef72f13489e365b65e5749cf0c48adc7a00000000000000000220603e5db7969ae2f2576e6a061bf3bb2db16571e77ffb41e0b27170734359235cbce0cdb692427000000000000000000000100695221022ec6f62b0f3b7c2446f44346bff0a6f06b5fdbc27368be8a36478e0287fe47be21024238f21f90527dc87e945f389f3d1711943b06f0a738d5baab573fc0ab6c98582102b7139e93747d7c77f62af5a38b8a2b009f3456aa94dea9bf21f73a6298c867a253ae2202022ec6f62b0f3b7c2446f44346bff0a6f06b5fdbc27368be8a36478e0287fe47be0cdb69242701000000000000002202024238f21f90527dc87e945f389f3d1711943b06f0a738d5baab573fc0ab6c98580c0036e9ac0100000000000000220202b7139e93747d7c77f62af5a38b8a2b009f3456aa94dea9bf21f73a6298c867a20c48adc7a0010000000000000000", partial_tx) @@ -970,7 +973,7 @@ class TestWalletSending(ElectrumTestCase): # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1a.get_receiving_address(), 100000)] - tx = wallet2.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False, sign=False) + tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) self.assertEqual( "pkh(045f7ba332df2a7b4f5d13f246e307c9174cfa9b8b05f3b83410a3c23ef8958d610be285963d67c7bc1feb082f168fa9877c25999963ff8b56b242a852b23e25ed)", tx.inputs()[0].script_descriptor.to_string_no_checksum()) @@ -1044,7 +1047,7 @@ class TestWalletSending(ElectrumTestCase): # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2a.get_receiving_address(), 165000)] - tx = wallet1a.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False, sign=False) + tx = wallet1a.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) self.assertEqual((0, 2), tx.signature_count()) self.assertEqual( "wsh(sortedmulti(2,[b2e35a7d/1h]tpubD9aPYLPPYw8MxU3cD57LwpV5v7GomHxdv62MSbPcRkp47zwXx69ACUFsKrj8xzuzRrij9FWVhfvkvNqtqsr8ZtefkDsGZ9GLuHzoS6bXyk1/0/0,[53b77ddb/1h]tpubD8spLJysN7v7V1KHvkZ7AwjnXShKafopi7Vu3Ahs2S46FxBPTode8DgGxDo55k4pJvETGScZFwnM5f2Y31EUjteJdhxR73sjr9ieydgah2U/0/0,[43067d63/1h]tpubD8khd1g1tzFeKeaU59QV811hyvhwn9KDfy5sqFJ5m2wJLw6rUt4AZviqutRPXTUAK4SpU2we3y2WBP916Ma8Em4qFGcbYkFvXVfpGYV3oZR/0/0))", @@ -1079,7 +1082,8 @@ class TestWalletSending(ElectrumTestCase): # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1a.get_receiving_address(), 100000)] - tx = wallet2a.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet2a.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + wallet2a.sign_transaction(tx, password=None) self.assertEqual((1, 2), tx.signature_count()) self.assertEqual( "sh(wsh(sortedmulti(2,[d1dbcc21]tpubDDsv4RpsGViZeEVwivuj3aaKhFQSv1kYsz64mwRoHkqBfw8qBSYEmc8TtyVGotJb44V3pviGzefP9m9hidRg9dPPaDWL2yoRpMW3hdje3Rk/0/0,[17cea914]tpubDCZU2kACPGACYDvAXvZUXQ7cE7msFfCtpah5QCuaz8iarKMLTgR4c2u8RGKdFhbb3YJxzmktDd1rCtF58ksyVgFw28pchY55uwkDiXjY9hU/0/0)))", @@ -1141,7 +1145,8 @@ class TestWalletSending(ElectrumTestCase): # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2.get_receiving_address(), 1000000)] - tx = wallet1a.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet1a.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + wallet1a.sign_transaction(tx, password=None) self.assertTrue(tx.is_complete()) self.assertFalse(tx.is_segwit()) @@ -1160,7 +1165,8 @@ class TestWalletSending(ElectrumTestCase): # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1a.get_receiving_address(), 300000)] - tx = wallet2.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + wallet2.sign_transaction(tx, password=None) self.assertTrue(tx.is_complete()) self.assertTrue(tx.is_segwit()) @@ -2323,7 +2329,7 @@ class TestWalletSending(ElectrumTestCase): # wallet1 creates tx1, with output back to himself outputs = [PartialTxOutput.from_address_and_value("tb1qhye4wfp26kn0l7ynpn5a4hvt539xc3zf0n76t3", 10_000_000)] - tx1 = wallet1.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=2, rbf=True, sign=False) + tx1 = wallet1.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=2, rbf=True) tx1.locktime = 1607022 partial_tx1 = tx1.serialize_as_bytes().hex() self.assertEqual("70736274ff0100710200000001d5bd4f8ebe63f0521f94e2d174b95d4327757a7e74fda3c9ff5c08796318f8d80000000000fdffffff02b82e0f0000000000160014250dbabd5761d7e0773d6147699938dd08ec2eb88096980000000000160014b93357242ad5a6fff8930ce9dadd8ba44a6c44496e8518000001011fc0d8a70000000000160014aba1c9faecc3f8882e641583e8734a3f9d01b15a0100df0200000000010162ecbac2f0c8662f53505d9410fdc56c84c5642ddbd3358d9a27d564e26731130200000000fdffffff02c0d8a70000000000160014aba1c9faecc3f8882e641583e8734a3f9d01b15ab89ed5000000000016001470afbd97b2dc351bd167f714e294b2fd3b60aedf02483045022100c93449989510e279eb14a0193d5c262ae93034b81376a1f6be259c6080d3ba5d0220536ab394f7c20f301d7ec2ef11be6e7b6d492053dce56458931c1b54218ec0fd012103b8f5a11df8e68cf335848e83a41fdad3c7413dc42148248a3799b58c93919ca01085180022060205e8db1b1906219782fadb18e763c0874a3118a17ce931e01707cbde194e041510775087560000008000000000000000000022020240ef5d2efee3b04b313a254df1b13a0b155451581e73943b21f3346bf6e1ba351077508756000000800100000000000000002202024a410b1212e88573561887b2bc38c90c074e4be425b9f3d971a9207825d9d3c8107750875600000080000000000100000000", @@ -2335,7 +2341,7 @@ class TestWalletSending(ElectrumTestCase): # wallet2 creates tx2, with output back to himself outputs = [PartialTxOutput.from_address_and_value("tb1qufnj5k2rrsnpjq7fg6d2pq3q9um6skdyyehw5m", 10_000_000)] - tx2 = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=2, rbf=True, sign=False) + tx2 = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=2, rbf=True) tx2.locktime = 1607023 partial_tx2 = tx2.serialize_as_bytes().hex() self.assertEqual("70736274ff0100710200000001e546bc0a7c9736e82a07df5c24fe6d05df58a310dc376cf09302842ca7264f930100000000fdffffff02988d07000000000016001453675a59be834aa6d139c3ebea56646a9b160c4c8096980000000000160014e2672a59431c261903c9469aa082202f37a859a46f8518000001011fa037a000000000001600140719d12228c61cab793ecd659c09cfe565a845c30100df02000000000101d5bd4f8ebe63f0521f94e2d174b95d4327757a7e74fda3c9ff5c08796318f8d80100000000fdffffff025066350000000000160014e3aa82aa2e754507d5585c0b6db06cc0cb4927b7a037a000000000001600140719d12228c61cab793ecd659c09cfe565a845c302483045022100f42e27519bd2379c22951c16b038fa6d49164fe6802854f2fdc7ee87fe31a8bc02204ea71e9324781b44bf7fea2f318caf3bedc5b497cbd1b4313fa71f833500bcb7012103a7853e1ee02a1629c8e870ec694a1420aeb98e6f5d071815257028f62d6f784169851800220602275b4fba18bb34e5198a9cfb3e940306658839079b3bda50d504a9cf2bae36f41067f36697000000800000000001000000002202036e4d0a5fb845b2f1c3c868c2ce7212b155b73e91c05be1b7a77c48830831ba4f1067f366970000008001000000000000000022020200062fdea2b0a056b17fa6b91dd87f5b5d838fe1ee84d636a5022f9a340eebcc1067f3669700000080000000000000000000", @@ -3166,8 +3172,9 @@ class TestWalletSending(ElectrumTestCase): # wallet1 -> dummy address outputs = [PartialTxOutput.from_address_and_value(bitcoin.DummyAddress.CHANNEL, 250000)] + tx = wallet1.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) with self.assertRaises(bitcoin.DummyAddressUsedInTxException): - tx = wallet1.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + wallet1.sign_transaction(tx, password=None) coins = wallet1.get_spendable_coins(domain=None) tx = wallet1.make_unsigned_transaction(coins=coins, outputs=outputs, fee_policy=FixedFeePolicy(5000)) @@ -3247,7 +3254,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qyw3c0rvn6kk2c688y3dygvckn57525y8qnxt3a', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1446655 tx.version = 1 @@ -3295,7 +3302,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3350,7 +3357,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325341 tx.version = 1 @@ -3395,7 +3402,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325341 tx.version = 1 @@ -3453,7 +3460,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325341 tx.version = 1 @@ -3512,7 +3519,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3549,7 +3556,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3589,7 +3596,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3630,7 +3637,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3674,7 +3681,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3715,7 +3722,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3769,7 +3776,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('2MuCQQHJNnrXzQzuqfUCfAwAjPqpyEHbgue', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325503 tx.version = 1 @@ -3836,7 +3843,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('2N8CtJRwxb2GCaiWWdSHLZHHLoZy53CCyxf', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325504 tx.version = 1 @@ -3906,7 +3913,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('2MyoZVy8T1t94yLmyKu8DP1SmbWvnxbkwRA', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325505 tx.version = 1 @@ -4229,7 +4236,7 @@ class TestWalletHistory_HelperFns(ElectrumTestCase): # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value("2MuUcGmQ2mLN3vjTuqDSgZpk4LPKDsuPmhN", 165000)] - tx = wallet1.create_transaction(outputs=outputs, password=None, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False, sign=False) + tx = wallet1.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) self.assertEqual( "wsh(sortedmulti(2,[b2e35a7d/1h]tpubD9aPYLPPYw8MxU3cD57LwpV5v7GomHxdv62MSbPcRkp47zwXx69ACUFsKrj8xzuzRrij9FWVhfvkvNqtqsr8ZtefkDsGZ9GLuHzoS6bXyk1/0/0,[53b77ddb/1h]tpubD8spLJysN7v7V1KHvkZ7AwjnXShKafopi7Vu3Ahs2S46FxBPTode8DgGxDo55k4pJvETGScZFwnM5f2Y31EUjteJdhxR73sjr9ieydgah2U/0/0,[43067d63/1h]tpubD8khd1g1tzFeKeaU59QV811hyvhwn9KDfy5sqFJ5m2wJLw6rUt4AZviqutRPXTUAK4SpU2we3y2WBP916Ma8Em4qFGcbYkFvXVfpGYV3oZR/0/0))", tx.inputs()[0].script_descriptor.to_string_no_checksum()) From cab1dc5c290d657c99dad2e094834c8440083d28 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 14 Mar 2025 17:03:49 +0000 Subject: [PATCH 2/4] wallet: towards killing create_transaction: pass through "locktime", "version" --- electrum/commands.py | 6 ++++-- electrum/wallet.py | 16 ++++++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/electrum/commands.py b/electrum/commands.py index dab371749..50c57b8dc 100644 --- a/electrum/commands.py +++ b/electrum/commands.py @@ -793,7 +793,8 @@ class Commands(Logger): domain_addr=domain_addr, domain_coins=domain_coins, rbf=rbf, - locktime=locktime) + locktime=locktime, + ) if not unsigned: wallet.sign_transaction(tx, password) result = tx.serialize() @@ -823,7 +824,8 @@ class Commands(Logger): domain_addr=domain_addr, domain_coins=domain_coins, rbf=rbf, - locktime=locktime) + locktime=locktime, + ) if not unsigned: wallet.sign_transaction(tx, password) result = tx.serialize() diff --git a/electrum/wallet.py b/electrum/wallet.py index 5f8f4a0c1..d88dd3b6b 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -1841,6 +1841,8 @@ class Abstract_Wallet(ABC, Logger, EventListener): base_tx: Optional[Transaction] = None, send_change_to_lightning: bool = False, merge_duplicate_outputs: bool = False, + locktime: Optional[int] = None, + tx_version: Optional[int] = None, ) -> PartialTransaction: """Can raise NotEnoughFunds or NoDynamicFeeEstimates.""" @@ -1953,8 +1955,12 @@ class Abstract_Wallet(ABC, Logger, EventListener): outputs[i].value += (amount - distr_amount) tx = PartialTransaction.from_io(list(coins), list(outputs)) - # Timelock tx to current height. - tx.locktime = get_locktime_for_new_transaction(self.network) + if locktime is None: + # Timelock tx to current height. + locktime = get_locktime_for_new_transaction(self.network) + tx.locktime = locktime + if tx_version is not None: + tx.version = tx_version tx.rbf_merge_txid = rbf_merge_txid tx.add_info_from_wallet(self) run_hook('make_unsigned_transaction', self, tx) @@ -3132,11 +3138,9 @@ class Abstract_Wallet(ABC, Logger, EventListener): merge_duplicate_outputs=merge_duplicate_outputs, rbf=rbf, BIP69_sort=BIP69_sort, + locktime=locktime, + tx_version=tx_version, ) - if locktime is not None: - tx.locktime = locktime - if tx_version is not None: - tx.version = tx_version return tx def _check_risk_of_burning_coins_as_fees(self, tx: 'PartialTransaction') -> TxSighashDanger: From 4689a0e78c850299890be59a5ef40ce6b605c1f4 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 14 Mar 2025 17:14:59 +0000 Subject: [PATCH 3/4] wallet: towards killing create_transaction: rm "coins" logic --- electrum/commands.py | 12 ++++++++---- electrum/wallet.py | 11 ++++------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/electrum/commands.py b/electrum/commands.py index 50c57b8dc..4ceb72714 100644 --- a/electrum/commands.py +++ b/electrum/commands.py @@ -786,12 +786,14 @@ class Commands(Logger): domain_addr = None if domain_addr is None else map(self._resolver, domain_addr, repeat(wallet)) amount_sat = satoshis_or_max(amount) outputs = [PartialTxOutput.from_address_and_value(destination, amount_sat)] + coins = wallet.get_spendable_coins(domain_addr) + if domain_coins is not None: + coins = [coin for coin in coins if (coin.prevout.to_str() in domain_coins)] tx = wallet.create_transaction( outputs, fee_policy=fee_policy, change_addr=change_addr, - domain_addr=domain_addr, - domain_coins=domain_coins, + coins=coins, rbf=rbf, locktime=locktime, ) @@ -817,12 +819,14 @@ class Commands(Logger): address = self._resolver(address, wallet) amount_sat = satoshis_or_max(amount) final_outputs.append(PartialTxOutput.from_address_and_value(address, amount_sat)) + coins = wallet.get_spendable_coins(domain_addr) + if domain_coins is not None: + coins = [coin for coin in coins if (coin.prevout.to_str() in domain_coins)] tx = wallet.create_transaction( final_outputs, fee_policy=fee_policy, change_addr=change_addr, - domain_addr=domain_addr, - domain_coins=domain_coins, + coins=coins, rbf=rbf, locktime=locktime, ) diff --git a/electrum/wallet.py b/electrum/wallet.py index d88dd3b6b..19559a7bf 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -1830,7 +1830,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): @profiler(min_threshold=0.1) def make_unsigned_transaction( self, *, - coins: Sequence[PartialTxInput], + coins: Optional[Sequence[PartialTxInput]] = None, outputs: List[PartialTxOutput], inputs: Optional[List[PartialTxInput]] = None, fee_policy: FeePolicy, @@ -1846,6 +1846,8 @@ class Abstract_Wallet(ABC, Logger, EventListener): ) -> PartialTransaction: """Can raise NotEnoughFunds or NoDynamicFeeEstimates.""" + if coins is None: + coins = self.get_spendable_coins() if not inputs and not coins: # any bitcoin tx must have at least 1 input by consensus raise NotEnoughFunds() if any([c.already_has_some_signatures() for c in coins]): @@ -3111,8 +3113,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): *, fee_policy: FeePolicy, change_addr=None, - domain_addr=None, - domain_coins=None, + coins=None, rbf=True, locktime=None, tx_version: Optional[int] = None, @@ -3120,13 +3121,9 @@ class Abstract_Wallet(ABC, Logger, EventListener): inputs: Optional[List[PartialTxInput]] = None, send_change_to_lightning: Optional[bool] = None, merge_duplicate_outputs: Optional[bool] = None, - nonlocal_only: bool = False, BIP69_sort: bool = True, ) -> PartialTransaction: """Helper function for make_unsigned_transaction.""" - coins = self.get_spendable_coins(domain_addr, nonlocal_only=nonlocal_only) - if domain_coins is not None: - coins = [coin for coin in coins if (coin.prevout.to_str() in domain_coins)] tx = self.make_unsigned_transaction( coins=coins, inputs=inputs, From 977d8b1dd64adcaaaccad0a161b935cc397a46d8 Mon Sep 17 00:00:00 2001 From: SomberNight Date: Fri, 14 Mar 2025 17:19:41 +0000 Subject: [PATCH 4/4] wallet: kill create_transaction --- electrum/commands.py | 8 +++--- electrum/gui/stdio.py | 2 +- electrum/gui/text.py | 2 +- electrum/submarine_swaps.py | 2 +- electrum/txbatcher.py | 2 +- electrum/wallet.py | 35 +---------------------- tests/test_invoices.py | 8 +++--- tests/test_wallet_vertical.py | 52 +++++++++++++++++------------------ 8 files changed, 39 insertions(+), 72 deletions(-) diff --git a/electrum/commands.py b/electrum/commands.py index 4ceb72714..d6206c3df 100644 --- a/electrum/commands.py +++ b/electrum/commands.py @@ -789,8 +789,8 @@ class Commands(Logger): coins = wallet.get_spendable_coins(domain_addr) if domain_coins is not None: coins = [coin for coin in coins if (coin.prevout.to_str() in domain_coins)] - tx = wallet.create_transaction( - outputs, + tx = wallet.make_unsigned_transaction( + outputs=outputs, fee_policy=fee_policy, change_addr=change_addr, coins=coins, @@ -822,8 +822,8 @@ class Commands(Logger): coins = wallet.get_spendable_coins(domain_addr) if domain_coins is not None: coins = [coin for coin in coins if (coin.prevout.to_str() in domain_coins)] - tx = wallet.create_transaction( - final_outputs, + tx = wallet.make_unsigned_transaction( + outputs=final_outputs, fee_policy=fee_policy, change_addr=change_addr, coins=coins, diff --git a/electrum/gui/stdio.py b/electrum/gui/stdio.py index f96f948a6..1871c726e 100644 --- a/electrum/gui/stdio.py +++ b/electrum/gui/stdio.py @@ -212,7 +212,7 @@ class ElectrumGui(BaseElectrumGui, EventListener): if c == "n": return try: - tx = self.wallet.create_transaction( + tx = self.wallet.make_unsigned_transaction( outputs=[PartialTxOutput.from_address_and_value(self.str_recipient, amount)], fee_policy=FixedFeePolicy(fee), ) diff --git a/electrum/gui/text.py b/electrum/gui/text.py index dbea07b21..b51d0d01f 100644 --- a/electrum/gui/text.py +++ b/electrum/gui/text.py @@ -691,7 +691,7 @@ class ElectrumGui(BaseElectrumGui, EventListener): password = None fee_policy = FeePolicy(self.config.FEE_POLICY) try: - tx = self.wallet.create_transaction( + tx = self.wallet.make_unsigned_transaction( outputs=invoice.outputs, fee_policy=fee_policy, ) diff --git a/electrum/submarine_swaps.py b/electrum/submarine_swaps.py index d69524f2a..d4a1bbaf0 100644 --- a/electrum/submarine_swaps.py +++ b/electrum/submarine_swaps.py @@ -771,7 +771,7 @@ class SwapManager(Logger): # this is taken care of in wallet._is_rbf_allowed_to_touch_tx_output if tx is None: funding_output = self.create_funding_output(swap) - tx = self.wallet.create_transaction( + tx = self.wallet.make_unsigned_transaction( outputs=[funding_output], rbf=True, fee_policy=fee_policy, diff --git a/electrum/txbatcher.py b/electrum/txbatcher.py index 589adc3cd..23300300b 100644 --- a/electrum/txbatcher.py +++ b/electrum/txbatcher.py @@ -391,7 +391,7 @@ class TxBatch(Logger): txin.witness_script = sweep_info.txin.witness_script txin.script_sig = sweep_info.txin.script_sig # create tx - tx = self.wallet.create_transaction( + tx = self.wallet.make_unsigned_transaction( fee_policy=self.fee_policy, base_tx=base_tx, inputs=inputs, diff --git a/electrum/wallet.py b/electrum/wallet.py index 19559a7bf..206660169 100644 --- a/electrum/wallet.py +++ b/electrum/wallet.py @@ -3107,39 +3107,6 @@ class Abstract_Wallet(ABC, Logger, EventListener): def get_all_known_addresses_beyond_gap_limit(self) -> Set[str]: pass - def create_transaction( - self, - outputs, - *, - fee_policy: FeePolicy, - change_addr=None, - coins=None, - rbf=True, - locktime=None, - tx_version: Optional[int] = None, - base_tx: Optional[PartialTransaction] = None, - inputs: Optional[List[PartialTxInput]] = None, - send_change_to_lightning: Optional[bool] = None, - merge_duplicate_outputs: Optional[bool] = None, - BIP69_sort: bool = True, - ) -> PartialTransaction: - """Helper function for make_unsigned_transaction.""" - tx = self.make_unsigned_transaction( - coins=coins, - inputs=inputs, - outputs=outputs, - fee_policy=fee_policy, - change_addr=change_addr, - base_tx=base_tx, - send_change_to_lightning=send_change_to_lightning, - merge_duplicate_outputs=merge_duplicate_outputs, - rbf=rbf, - BIP69_sort=BIP69_sort, - locktime=locktime, - tx_version=tx_version, - ) - return tx - def _check_risk_of_burning_coins_as_fees(self, tx: 'PartialTransaction') -> TxSighashDanger: """Helper method to check if there is risk of burning coins as fees if we sign. Note that if not all inputs are ismine, e.g. coinjoin, the risk is not just about fees. @@ -3390,7 +3357,7 @@ class Abstract_Wallet(ABC, Logger, EventListener): return name = sweep_info.name # outputs = [] will send coins to a change address - tx = self.create_transaction( + tx = self.make_unsigned_transaction( inputs=[txin], outputs=[], fee_policy=FixedFeePolicy(0), diff --git a/tests/test_invoices.py b/tests/test_invoices.py index f967c3092..a22a8e189 100644 --- a/tests/test_invoices.py +++ b/tests/test_invoices.py @@ -72,7 +72,7 @@ class TestWalletPaymentRequests(ElectrumTestCase): # get paid onchain wallet2 = self.create_wallet2() # type: Standard_Wallet outputs = [PartialTxOutput.from_address_and_value(pr.get_address(), pr.get_amount_sat())] - tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) + tx = wallet2.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) wallet2.sign_transaction(tx, password=None) wallet1.adb.receive_tx_callback(tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual(PR_UNCONFIRMED, wallet1.get_invoice_status(pr)) @@ -103,7 +103,7 @@ class TestWalletPaymentRequests(ElectrumTestCase): # get paid onchain wallet2 = self.create_wallet2() # type: Standard_Wallet outputs = [PartialTxOutput.from_address_and_value(pr.get_address(), pr.get_amount_sat())] - tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) + tx = wallet2.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) wallet2.sign_transaction(tx, password=None) wallet1.adb.receive_tx_callback(tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual(PR_UNCONFIRMED, wallet1.get_invoice_status(pr)) @@ -134,7 +134,7 @@ class TestWalletPaymentRequests(ElectrumTestCase): # get paid onchain wallet2 = self.create_wallet2() # type: Standard_Wallet outputs = [PartialTxOutput.from_address_and_value(pr.get_address(), pr.get_amount_sat())] - tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) + tx = wallet2.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) wallet2.sign_transaction(tx, password=None) wallet1.adb.receive_tx_callback(tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual(PR_UNCONFIRMED, wallet1.get_invoice_status(pr)) @@ -204,7 +204,7 @@ class TestWalletPaymentRequests(ElectrumTestCase): # pr2 gets paid onchain wallet2 = self.create_wallet2() # type: Standard_Wallet outputs = [PartialTxOutput.from_address_and_value(pr2.get_address(), pr2.get_amount_sat())] - tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) + tx = wallet2.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000)) wallet2.sign_transaction(tx, password=None) wallet1.adb.receive_tx_callback(tx, TX_HEIGHT_UNCONFIRMED) self.assertEqual(PR_UNCONFIRMED, wallet1.get_invoice_status(pr2)) diff --git a/tests/test_wallet_vertical.py b/tests/test_wallet_vertical.py index cf1f37d27..d92f8cae0 100644 --- a/tests/test_wallet_vertical.py +++ b/tests/test_wallet_vertical.py @@ -873,7 +873,7 @@ class TestWalletSending(ElectrumTestCase): # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2.get_receiving_address(), 250000)] - tx = wallet1.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet1.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) wallet1.sign_transaction(tx, password=None) self.assertTrue(tx.is_complete()) @@ -893,7 +893,7 @@ class TestWalletSending(ElectrumTestCase): # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1.get_receiving_address(), 100000)] - tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet2.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) wallet2.sign_transaction(tx, password=None) self.assertTrue(tx.is_complete()) @@ -947,7 +947,7 @@ class TestWalletSending(ElectrumTestCase): # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2.get_receiving_address(), 370000)] - tx = wallet1a.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet1a.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) wallet1a.sign_transaction(tx, password=None) partial_tx = tx.serialize_as_bytes().hex() self.assertEqual("70736274ff01007501000000017120d4e1f2cdfe7df000d632cff74167fb354f0546d5cfc228e5c98756d55cb20100000000feffffff0250a50500000000001976a9149cd3dfb0d87a861770ae4e268e74b45335cf00ab88ac2862b1000000000017a9142e517854aa54668128c0e9a3fdd4dec13ad571368700000000000100e0010000000001014121f99dc02f0364d2dab3d08905ff4c36fc76c55437fd90b769c35cc18618280100000000fdffffff02d4c22d00000000001600143fd1bc5d32245850c8cb5be5b09c73ccbb9a0f75001bb7000000000017a91480c2353f6a7bc3c71e99e062655b19adb3dd2e4887024830450221008781c78df0c9d4b5ea057333195d5d76bc29494d773f14fa80e27d2f288b2c360220762531614799b6f0fb8d539b18cb5232ab4253dd4385435157b28a44ff63810d0121033de77d21926e09efd04047ae2d39dbd3fb9db446e8b7ed53e0f70f9c9478f735dac11300220202afb4af9a91264e1c6dce3ebe5312801723270ac0ba8134b7b49129328fcb0f284730440220751ee3599e59debb8b2aeef61bb5f574f26379cd961caf382d711a507bc632390220598d53e62557c4a5ab8cfb2f8948f37cca06a861714b55c781baf2c3d7a580b501010469522102afb4af9a91264e1c6dce3ebe5312801723270ac0ba8134b7b49129328fcb0f2821030b482838721a38d94847699fed8818b5c5f56500ef72f13489e365b65e5749cf2103e5db7969ae2f2576e6a061bf3bb2db16571e77ffb41e0b27170734359235cbce53ae220602afb4af9a91264e1c6dce3ebe5312801723270ac0ba8134b7b49129328fcb0f280c0036e9ac00000000000000002206030b482838721a38d94847699fed8818b5c5f56500ef72f13489e365b65e5749cf0c48adc7a00000000000000000220603e5db7969ae2f2576e6a061bf3bb2db16571e77ffb41e0b27170734359235cbce0cdb692427000000000000000000000100695221022ec6f62b0f3b7c2446f44346bff0a6f06b5fdbc27368be8a36478e0287fe47be21024238f21f90527dc87e945f389f3d1711943b06f0a738d5baab573fc0ab6c98582102b7139e93747d7c77f62af5a38b8a2b009f3456aa94dea9bf21f73a6298c867a253ae2202022ec6f62b0f3b7c2446f44346bff0a6f06b5fdbc27368be8a36478e0287fe47be0cdb69242701000000000000002202024238f21f90527dc87e945f389f3d1711943b06f0a738d5baab573fc0ab6c98580c0036e9ac0100000000000000220202b7139e93747d7c77f62af5a38b8a2b009f3456aa94dea9bf21f73a6298c867a20c48adc7a0010000000000000000", @@ -973,7 +973,7 @@ class TestWalletSending(ElectrumTestCase): # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1a.get_receiving_address(), 100000)] - tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet2.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) self.assertEqual( "pkh(045f7ba332df2a7b4f5d13f246e307c9174cfa9b8b05f3b83410a3c23ef8958d610be285963d67c7bc1feb082f168fa9877c25999963ff8b56b242a852b23e25ed)", tx.inputs()[0].script_descriptor.to_string_no_checksum()) @@ -1047,7 +1047,7 @@ class TestWalletSending(ElectrumTestCase): # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2a.get_receiving_address(), 165000)] - tx = wallet1a.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet1a.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) self.assertEqual((0, 2), tx.signature_count()) self.assertEqual( "wsh(sortedmulti(2,[b2e35a7d/1h]tpubD9aPYLPPYw8MxU3cD57LwpV5v7GomHxdv62MSbPcRkp47zwXx69ACUFsKrj8xzuzRrij9FWVhfvkvNqtqsr8ZtefkDsGZ9GLuHzoS6bXyk1/0/0,[53b77ddb/1h]tpubD8spLJysN7v7V1KHvkZ7AwjnXShKafopi7Vu3Ahs2S46FxBPTode8DgGxDo55k4pJvETGScZFwnM5f2Y31EUjteJdhxR73sjr9ieydgah2U/0/0,[43067d63/1h]tpubD8khd1g1tzFeKeaU59QV811hyvhwn9KDfy5sqFJ5m2wJLw6rUt4AZviqutRPXTUAK4SpU2we3y2WBP916Ma8Em4qFGcbYkFvXVfpGYV3oZR/0/0))", @@ -1082,7 +1082,7 @@ class TestWalletSending(ElectrumTestCase): # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1a.get_receiving_address(), 100000)] - tx = wallet2a.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet2a.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) wallet2a.sign_transaction(tx, password=None) self.assertEqual((1, 2), tx.signature_count()) self.assertEqual( @@ -1145,7 +1145,7 @@ class TestWalletSending(ElectrumTestCase): # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value(wallet2.get_receiving_address(), 1000000)] - tx = wallet1a.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet1a.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) wallet1a.sign_transaction(tx, password=None) self.assertTrue(tx.is_complete()) @@ -1165,7 +1165,7 @@ class TestWalletSending(ElectrumTestCase): # wallet2 -> wallet1 outputs = [PartialTxOutput.from_address_and_value(wallet1a.get_receiving_address(), 300000)] - tx = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet2.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) wallet2.sign_transaction(tx, password=None) self.assertTrue(tx.is_complete()) @@ -2329,7 +2329,7 @@ class TestWalletSending(ElectrumTestCase): # wallet1 creates tx1, with output back to himself outputs = [PartialTxOutput.from_address_and_value("tb1qhye4wfp26kn0l7ynpn5a4hvt539xc3zf0n76t3", 10_000_000)] - tx1 = wallet1.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=2, rbf=True) + tx1 = wallet1.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=2, rbf=True) tx1.locktime = 1607022 partial_tx1 = tx1.serialize_as_bytes().hex() self.assertEqual("70736274ff0100710200000001d5bd4f8ebe63f0521f94e2d174b95d4327757a7e74fda3c9ff5c08796318f8d80000000000fdffffff02b82e0f0000000000160014250dbabd5761d7e0773d6147699938dd08ec2eb88096980000000000160014b93357242ad5a6fff8930ce9dadd8ba44a6c44496e8518000001011fc0d8a70000000000160014aba1c9faecc3f8882e641583e8734a3f9d01b15a0100df0200000000010162ecbac2f0c8662f53505d9410fdc56c84c5642ddbd3358d9a27d564e26731130200000000fdffffff02c0d8a70000000000160014aba1c9faecc3f8882e641583e8734a3f9d01b15ab89ed5000000000016001470afbd97b2dc351bd167f714e294b2fd3b60aedf02483045022100c93449989510e279eb14a0193d5c262ae93034b81376a1f6be259c6080d3ba5d0220536ab394f7c20f301d7ec2ef11be6e7b6d492053dce56458931c1b54218ec0fd012103b8f5a11df8e68cf335848e83a41fdad3c7413dc42148248a3799b58c93919ca01085180022060205e8db1b1906219782fadb18e763c0874a3118a17ce931e01707cbde194e041510775087560000008000000000000000000022020240ef5d2efee3b04b313a254df1b13a0b155451581e73943b21f3346bf6e1ba351077508756000000800100000000000000002202024a410b1212e88573561887b2bc38c90c074e4be425b9f3d971a9207825d9d3c8107750875600000080000000000100000000", @@ -2341,7 +2341,7 @@ class TestWalletSending(ElectrumTestCase): # wallet2 creates tx2, with output back to himself outputs = [PartialTxOutput.from_address_and_value("tb1qufnj5k2rrsnpjq7fg6d2pq3q9um6skdyyehw5m", 10_000_000)] - tx2 = wallet2.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=2, rbf=True) + tx2 = wallet2.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=2, rbf=True) tx2.locktime = 1607023 partial_tx2 = tx2.serialize_as_bytes().hex() self.assertEqual("70736274ff0100710200000001e546bc0a7c9736e82a07df5c24fe6d05df58a310dc376cf09302842ca7264f930100000000fdffffff02988d07000000000016001453675a59be834aa6d139c3ebea56646a9b160c4c8096980000000000160014e2672a59431c261903c9469aa082202f37a859a46f8518000001011fa037a000000000001600140719d12228c61cab793ecd659c09cfe565a845c30100df02000000000101d5bd4f8ebe63f0521f94e2d174b95d4327757a7e74fda3c9ff5c08796318f8d80100000000fdffffff025066350000000000160014e3aa82aa2e754507d5585c0b6db06cc0cb4927b7a037a000000000001600140719d12228c61cab793ecd659c09cfe565a845c302483045022100f42e27519bd2379c22951c16b038fa6d49164fe6802854f2fdc7ee87fe31a8bc02204ea71e9324781b44bf7fea2f318caf3bedc5b497cbd1b4313fa71f833500bcb7012103a7853e1ee02a1629c8e870ec694a1420aeb98e6f5d071815257028f62d6f784169851800220602275b4fba18bb34e5198a9cfb3e940306658839079b3bda50d504a9cf2bae36f41067f36697000000800000000001000000002202036e4d0a5fb845b2f1c3c868c2ce7212b155b73e91c05be1b7a77c48830831ba4f1067f366970000008001000000000000000022020200062fdea2b0a056b17fa6b91dd87f5b5d838fe1ee84d636a5022f9a340eebcc1067f3669700000080000000000000000000", @@ -3172,7 +3172,7 @@ class TestWalletSending(ElectrumTestCase): # wallet1 -> dummy address outputs = [PartialTxOutput.from_address_and_value(bitcoin.DummyAddress.CHANNEL, 250000)] - tx = wallet1.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet1.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) with self.assertRaises(bitcoin.DummyAddressUsedInTxException): wallet1.sign_transaction(tx, password=None) @@ -3254,7 +3254,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qyw3c0rvn6kk2c688y3dygvckn57525y8qnxt3a', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1446655 tx.version = 1 @@ -3302,7 +3302,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3357,7 +3357,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325341 tx.version = 1 @@ -3402,7 +3402,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325341 tx.version = 1 @@ -3460,7 +3460,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1qp0mv2sxsyxxfj5gl0332f9uyez93su9cf26757', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325341 tx.version = 1 @@ -3519,7 +3519,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3556,7 +3556,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3596,7 +3596,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3637,7 +3637,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3681,7 +3681,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3722,7 +3722,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('tb1quk7ahlhr3qmjndy0uvu9y9hxfesrtahtta9ghm', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325340 tx.version = 1 @@ -3776,7 +3776,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('2MuCQQHJNnrXzQzuqfUCfAwAjPqpyEHbgue', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325503 tx.version = 1 @@ -3843,7 +3843,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('2N8CtJRwxb2GCaiWWdSHLZHHLoZy53CCyxf', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325504 tx.version = 1 @@ -3913,7 +3913,7 @@ class TestWalletOfflineSigning(ElectrumTestCase): # create unsigned tx outputs = [PartialTxOutput.from_address_and_value('2MyoZVy8T1t94yLmyKu8DP1SmbWvnxbkwRA', 2500000)] - tx = wallet_online.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) + tx = wallet_online.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), rbf=True) tx.locktime = 1325505 tx.version = 1 @@ -4236,7 +4236,7 @@ class TestWalletHistory_HelperFns(ElectrumTestCase): # wallet1 -> wallet2 outputs = [PartialTxOutput.from_address_and_value("2MuUcGmQ2mLN3vjTuqDSgZpk4LPKDsuPmhN", 165000)] - tx = wallet1.create_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) + tx = wallet1.make_unsigned_transaction(outputs=outputs, fee_policy=FixedFeePolicy(5000), tx_version=1, rbf=False) self.assertEqual( "wsh(sortedmulti(2,[b2e35a7d/1h]tpubD9aPYLPPYw8MxU3cD57LwpV5v7GomHxdv62MSbPcRkp47zwXx69ACUFsKrj8xzuzRrij9FWVhfvkvNqtqsr8ZtefkDsGZ9GLuHzoS6bXyk1/0/0,[53b77ddb/1h]tpubD8spLJysN7v7V1KHvkZ7AwjnXShKafopi7Vu3Ahs2S46FxBPTode8DgGxDo55k4pJvETGScZFwnM5f2Y31EUjteJdhxR73sjr9ieydgah2U/0/0,[43067d63/1h]tpubD8khd1g1tzFeKeaU59QV811hyvhwn9KDfy5sqFJ5m2wJLw6rUt4AZviqutRPXTUAK4SpU2we3y2WBP916Ma8Em4qFGcbYkFvXVfpGYV3oZR/0/0))", tx.inputs()[0].script_descriptor.to_string_no_checksum())