diff --git a/basicswap/__init__.py b/basicswap/__init__.py index 5218d44..ef1fd25 100644 --- a/basicswap/__init__.py +++ b/basicswap/__init__.py @@ -1,3 +1,3 @@ name = "basicswap" -__version__ = "0.11.65" +__version__ = "0.11.66" diff --git a/basicswap/basicswap.py b/basicswap/basicswap.py index d181d36..b74643a 100644 --- a/basicswap/basicswap.py +++ b/basicswap/basicswap.py @@ -266,7 +266,7 @@ class BasicSwap(BaseApp): # TODO: Set dynamically self.scriptless_coins = (Coins.XMR, Coins.PART_ANON) self.adaptor_swap_only_coins = self.scriptless_coins + (Coins.PART_BLIND, ) - self.secret_hash_swap_only_coins = (Coins.PIVX, Coins.DASH, Coins.FIRO, Coins.NMC) + self.secret_hash_swap_only_coins = (Coins.PIVX, Coins.DASH, Coins.FIRO, Coins.NMC) # Coins without segwit # TODO: Adjust ranges self.min_delay_event = self.settings.get('min_delay_event', 10) @@ -1145,14 +1145,16 @@ class BasicSwap(BaseApp): return bytes.fromhex(ro['msgid']) def validateSwapType(self, coin_from, coin_to, swap_type): - if (coin_from in self.adaptor_swap_only_coins or coin_to in self.adaptor_swap_only_coins) and swap_type != SwapTypes.XMR_SWAP: - raise ValueError('Invalid swap type for: {} -> {}'.format(coin_from.name, coin_to.name)) - if swap_type == SwapTypes.XMR_SWAP: - if (coin_from in self.secret_hash_swap_only_coins or coin_to in self.secret_hash_swap_only_coins): + reverse_bid: bool = coin_from in self.scriptless_coins + itx_coin = coin_to if reverse_bid else coin_from + if (itx_coin in self.secret_hash_swap_only_coins): raise ValueError('Invalid swap type for: {} -> {}'.format(coin_from.name, coin_to.name)) if (coin_from in self.scriptless_coins and coin_to in self.scriptless_coins): raise ValueError('Invalid swap type for: {} -> {}'.format(coin_from.name, coin_to.name)) + else: + if coin_from in self.adaptor_swap_only_coins or coin_to in self.adaptor_swap_only_coins: + raise ValueError('Invalid swap type for: {} -> {}'.format(coin_from.name, coin_to.name)) def notify(self, event_type, event_data, session=None) -> None: show_event = event_type not in self._disabled_notification_types @@ -2066,8 +2068,8 @@ class BasicSwap(BaseApp): def getLinkedMessageId(self, linked_type: int, linked_id: int, msg_type: int, msg_sequence: int = 0, session=None) -> bytes: try: use_session = self.openSession(session) - q = session.execute('SELECT msg_id FROM message_links WHERE linked_type = :linked_type AND linked_id = :linked_id AND msg_type = :msg_type AND msg_sequence = :msg_sequence', - {'linked_type': linked_type, 'linked_id': linked_id, 'msg_type': msg_type, 'msg_sequence': msg_sequence}).first() + q = use_session.execute('SELECT msg_id FROM message_links WHERE linked_type = :linked_type AND linked_id = :linked_id AND msg_type = :msg_type AND msg_sequence = :msg_sequence', + {'linked_type': linked_type, 'linked_id': linked_id, 'msg_type': msg_type, 'msg_sequence': msg_sequence}).first() return q[0] finally: if session is None: diff --git a/doc/release-notes.md b/doc/release-notes.md index 0156fb3..7fef925 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -1,18 +1,29 @@ +0.0.66 +============== +- Fixed bugs in getLinkedMessageId and validateSwapType. + + +0.0.65 +============== + +- smsg: Outbox messages are removed when expired. +- Fixed BTC witness size estimation. +- Added option to remove Offers and bids from the database automatically one week + after they expire if they have no active bids. + - Controlled by new settings: expire_db_records and expire_db_records_after +- ui: Show ITX and PTX status for adaptor sig type swaps. + + 0.0.64 ============== - protocol: Added reversed Adaptor sig protocol. - Runs the adaptor-sig protocol with leader and follower swapped to enable offers from no-script coins to script coins. -- smsg: Outbox messages are removed when expired. -- Fixed BTC witness size estimation. -- Added option to remove Offers and bids from the database automatically one week - after they expire if they have no active bids. - - Controlled by new settings: expire_db_records and expire_db_records_after + - Raised adaptor signature swap protocol version - Not backwards compatible with previous versions. -- ui: Show ITX and PTX status for adaptor sig type swaps. 0.0.63 diff --git a/tests/basicswap/test_btc_xmr.py b/tests/basicswap/test_btc_xmr.py index d3798de..3cc1cf2 100644 --- a/tests/basicswap/test_btc_xmr.py +++ b/tests/basicswap/test_btc_xmr.py @@ -506,9 +506,10 @@ class BasicSwapTest(TestFunctions): tx_spend_hex = ToHex(tx_spend) try: txid = self.callnoderpc('sendrawtransaction', [tx_spend_hex, ]) - assert False, 'Should fail' except Exception as e: assert ('non-final' in str(e)) + else: + assert False, 'Should fail' self.mineBlock(5) txid = self.callnoderpc('sendrawtransaction', [tx_spend_hex, ]) @@ -551,9 +552,10 @@ class BasicSwapTest(TestFunctions): tx_spend_hex = ToHex(tx_spend) try: txid = self.callnoderpc('sendrawtransaction', [tx_spend_hex, ]) - assert False, 'Should fail' except Exception as e: assert ('non-BIP68-final' in str(e)) + else: + assert False, 'Should fail' self.mineBlock(3) txid = self.callnoderpc('sendrawtransaction', [tx_spend_hex, ]) diff --git a/tests/basicswap/test_run.py b/tests/basicswap/test_run.py index fcb2a61..ddf3d4c 100644 --- a/tests/basicswap/test_run.py +++ b/tests/basicswap/test_run.py @@ -166,6 +166,31 @@ class Test(BaseTest): rv = read_json_api(1800, 'automationstrategies/1') assert (rv['label'] == 'Accept All') + def test_004_validateSwapType(self): + logging.info('---------- Test validateSwapType') + + sc = self.swap_clients[0] + + should_pass = [ + (Coins.BTC, Coins.XMR, SwapTypes.XMR_SWAP), + (Coins.XMR, Coins.BTC, SwapTypes.XMR_SWAP), + (Coins.BTC, Coins.FIRO, SwapTypes.XMR_SWAP), + (Coins.FIRO, Coins.BTC, SwapTypes.SELLER_FIRST), + (Coins.BTC, Coins.FIRO, SwapTypes.SELLER_FIRST), + ] + should_fail = [ + (Coins.BTC, Coins.XMR, SwapTypes.SELLER_FIRST), + (Coins.FIRO, Coins.BTC, SwapTypes.XMR_SWAP), + (Coins.XMR, Coins.PART_ANON, SwapTypes.XMR_SWAP), + (Coins.FIRO, Coins.PART_ANON, SwapTypes.XMR_SWAP), + (Coins.PART_ANON, Coins.FIRO, SwapTypes.XMR_SWAP), + ] + + for case in should_pass: + sc.validateSwapType(case[0], case[1], case[2]) + for case in should_fail: + self.assertRaises(ValueError, sc.validateSwapType, case[0], case[1], case[2]) + def test_01_verifyrawtransaction(self): txn = '0200000001eb6e5c4ebba4efa32f40c7314cad456a64008e91ee30b2dd0235ab9bb67fbdbb01000000ee47304402200956933242dde94f6cf8f195a470f8d02aef21ec5c9b66c5d3871594bdb74c9d02201d7e1b440de8f4da672d689f9e37e98815fb63dbc1706353290887eb6e8f7235012103dc1b24feb32841bc2f4375da91fa97834e5983668c2a39a6b7eadb60e7033f9d205a803b28fe2f86c17db91fa99d7ed2598f79b5677ffe869de2e478c0d1c02cc7514c606382012088a8201fe90717abb84b481c2a59112414ae56ec8acc72273642ca26cc7a5812fdc8f68876a914225fbfa4cb725b75e511810ac4d6f74069bdded26703520140b27576a914207eb66b2fd6ed9924d6217efc7fa7b38dfabe666888acffffffff01e0167118020000001976a9140044e188928710cecba8311f1cf412135b98145c88ac00000000' prevout = {