commit f846d1d59aa0a6eac4c3f21a966524e759dfade9
parent f05aabd8028e74b62eb63ad32e17cec679c3b38d
Author: ThomasV <thomasv@electrum.org>
Date: Fri, 1 Feb 2019 20:48:18 +0100
Merge pull request #5039 from SomberNight/tx_version_bump_to_2
transaction: change default version to 2
Diffstat:
3 files changed, 37 insertions(+), 14 deletions(-)
diff --git a/electrum/tests/test_wallet_vertical.py b/electrum/tests/test_wallet_vertical.py
@@ -570,7 +570,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet1 -> wallet2
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet2.get_receiving_address(), 250000)]
- tx = wallet1.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
+ tx = wallet1.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
self.assertTrue(tx.is_complete())
self.assertTrue(tx.is_segwit())
@@ -590,7 +590,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet2 -> wallet1
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet1.get_receiving_address(), 100000)]
- tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
+ tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
self.assertTrue(tx.is_complete())
self.assertFalse(tx.is_segwit())
@@ -643,7 +643,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet1 -> wallet2
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet2.get_receiving_address(), 370000)]
- tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
+ tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
tx = Transaction(tx.serialize()) # simulates moving partial txn between cosigners
self.assertFalse(tx.is_complete())
wallet1b.sign_transaction(tx, password=None)
@@ -666,7 +666,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet2 -> wallet1
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet1a.get_receiving_address(), 100000)]
- tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
+ tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
self.assertTrue(tx.is_complete())
self.assertFalse(tx.is_segwit())
@@ -734,7 +734,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet1 -> wallet2
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet2a.get_receiving_address(), 165000)]
- tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
+ tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
txid = tx.txid()
tx = Transaction(tx.serialize()) # simulates moving partial txn between cosigners
self.assertEqual(txid, tx.txid())
@@ -760,7 +760,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet2 -> wallet1
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet1a.get_receiving_address(), 100000)]
- tx = wallet2a.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
+ tx = wallet2a.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
txid = tx.txid()
tx = Transaction(tx.serialize()) # simulates moving partial txn between cosigners
self.assertEqual(txid, tx.txid())
@@ -814,7 +814,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet1 -> wallet2
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet2.get_receiving_address(), 1000000)]
- tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
+ tx = wallet1a.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
self.assertTrue(tx.is_complete())
self.assertFalse(tx.is_segwit())
@@ -834,7 +834,7 @@ class TestWalletSending(TestCaseForTestnet):
# wallet2 -> wallet1
outputs = [TxOutput(bitcoin.TYPE_ADDRESS, wallet1a.get_receiving_address(), 300000)]
- tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
+ tx = wallet2.mktx(outputs=outputs, password=None, config=self.config, fee=5000, tx_version=1)
self.assertTrue(tx.is_complete())
self.assertTrue(tx.is_segwit())
@@ -874,6 +874,7 @@ class TestWalletSending(TestCaseForTestnet):
tx = wallet.make_unsigned_transaction(coins, outputs, config=self.config, fixed_fee=5000)
tx.set_rbf(True)
tx.locktime = 1325501
+ tx.version = 1
wallet.sign_transaction(tx, password=None)
self.assertTrue(tx.is_complete())
@@ -895,6 +896,7 @@ class TestWalletSending(TestCaseForTestnet):
# bump tx
tx = wallet.bump_fee(tx=Transaction(tx.serialize()), delta=5000)
tx.locktime = 1325501
+ tx.version = 1
self.assertFalse(tx.is_complete())
wallet.sign_transaction(tx, password=None)
@@ -925,6 +927,7 @@ class TestWalletSending(TestCaseForTestnet):
tx = wallet.cpfp(funding_tx, fee=50000)
tx.set_rbf(True)
tx.locktime = 1325502
+ tx.version = 1
wallet.sign_transaction(tx, password=None)
self.assertTrue(tx.is_complete())
@@ -960,6 +963,7 @@ class TestWalletSending(TestCaseForTestnet):
tx = wallet.make_unsigned_transaction(coins, outputs, config=self.config, fixed_fee=5000)
tx.set_rbf(True)
tx.locktime = 1325499
+ tx.version = 1
wallet.sign_transaction(tx, password=None)
self.assertTrue(tx.is_complete())
@@ -981,6 +985,7 @@ class TestWalletSending(TestCaseForTestnet):
# bump tx
tx = wallet.bump_fee(tx=Transaction(tx.serialize()), delta=5000)
tx.locktime = 1325500
+ tx.version = 1
self.assertFalse(tx.is_complete())
wallet.sign_transaction(tx, password=None)
@@ -1011,6 +1016,7 @@ class TestWalletSending(TestCaseForTestnet):
tx = wallet.cpfp(funding_tx, fee=50000)
tx.set_rbf(True)
tx.locktime = 1325501
+ tx.version = 1
wallet.sign_transaction(tx, password=None)
self.assertTrue(tx.is_complete())
@@ -1045,7 +1051,7 @@ class TestWalletSending(TestCaseForTestnet):
privkeys = ['93NQ7CFbwTPyKDJLXe97jczw33fiLijam2SCZL3Uinz1NSbHrTu', ]
network = NetworkMock()
dest_addr = 'tb1q3ws2p0qjk5vrravv065xqlnkckvzcpclk79eu2'
- tx = sweep(privkeys, network, config=None, recipient=dest_addr, fee=5000, locktime=1325785)
+ tx = sweep(privkeys, network, config=None, recipient=dest_addr, fee=5000, locktime=1325785, tx_version=1)
tx_copy = Transaction(tx.serialize())
self.assertEqual('010000000129349e5641d79915e9d0282fdbaee8c3df0b6731bab9d70bf626e8588bde24ac010000004847304402206bf0d0a93abae0d5873a62ebf277a5dd2f33837821e8b93e74d04e19d71b578002201a6d729bc159941ef5c4c9e5fe13ece9fc544351ba531b00f68ba549c8b38a9a01fdffffff01b82e0f00000000001600148ba0a0bc12b51831f58c7ea8607e76c5982c071fd93a1400',
@@ -1090,6 +1096,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1446655
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertFalse(tx.is_segwit())
@@ -1132,6 +1139,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertFalse(tx.is_segwit())
@@ -1172,6 +1180,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325341
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertTrue(tx.is_segwit())
@@ -1213,6 +1222,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325341
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertTrue(tx.is_segwit())
@@ -1249,6 +1259,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@@ -1283,6 +1294,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@@ -1317,6 +1329,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@@ -1354,6 +1367,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@@ -1391,6 +1405,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@@ -1428,6 +1443,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325340
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@@ -1477,6 +1493,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325503
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@@ -1534,6 +1551,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325504
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
@@ -1593,6 +1611,7 @@ class TestWalletOfflineSigning(TestCaseForTestnet):
tx = wallet_online.mktx(outputs=outputs, password=None, config=self.config, fee=5000)
tx.set_rbf(True)
tx.locktime = 1325505
+ tx.version = 1
self.assertFalse(tx.is_complete())
self.assertEqual(1, len(tx.inputs()))
diff --git a/electrum/transaction.py b/electrum/transaction.py
@@ -679,7 +679,7 @@ class Transaction:
self._inputs = None
self._outputs = None # type: List[TxOutput]
self.locktime = 0
- self.version = 1
+ self.version = 2
# by default we assume this is a partial txn;
# this value will get properly set when deserializing
self.is_partial_originally = True
@@ -787,11 +787,13 @@ class Transaction:
return d
@classmethod
- def from_io(klass, inputs, outputs, locktime=0):
+ def from_io(klass, inputs, outputs, locktime=0, version=None):
self = klass(None)
self._inputs = inputs
self._outputs = outputs
self.locktime = locktime
+ if version is not None:
+ self.version = version
self.BIP69_sort()
return self
diff --git a/electrum/wallet.py b/electrum/wallet.py
@@ -126,7 +126,7 @@ def sweep_preparations(privkeys, network: 'Network', imax=100):
def sweep(privkeys, network: 'Network', config: 'SimpleConfig', recipient, fee=None, imax=100,
- *, locktime=None):
+ *, locktime=None, tx_version=None):
inputs, keypairs = sweep_preparations(privkeys, network, imax)
total = sum(i.get('value') for i in inputs)
if fee is None:
@@ -142,7 +142,7 @@ def sweep(privkeys, network: 'Network', config: 'SimpleConfig', recipient, fee=N
if locktime is None:
locktime = get_locktime_for_new_transaction(network)
- tx = Transaction.from_io(inputs, outputs, locktime=locktime)
+ tx = Transaction.from_io(inputs, outputs, locktime=locktime, version=tx_version)
tx.set_rbf(True)
tx.sign(keypairs)
return tx
@@ -719,10 +719,12 @@ class Abstract_Wallet(AddressSynchronizer):
return tx
def mktx(self, outputs, password, config, fee=None, change_addr=None,
- domain=None, rbf=False, nonlocal_only=False):
+ domain=None, rbf=False, nonlocal_only=False, *, tx_version=None):
coins = self.get_spendable_coins(domain, config, nonlocal_only=nonlocal_only)
tx = self.make_unsigned_transaction(coins, outputs, config, fee, change_addr)
tx.set_rbf(rbf)
+ if tx_version is not None:
+ tx.version = tx_version
self.sign_transaction(tx, password)
return tx