diff --git a/basicswap/basicswap.py b/basicswap/basicswap.py index 491269c..9ecf95c 100644 --- a/basicswap/basicswap.py +++ b/basicswap/basicswap.py @@ -101,6 +101,7 @@ import basicswap.config as cfg import basicswap.network as bsn import basicswap.protocols.atomic_swap_1 as atomic_swap_1 from .basicswap_util import ( + KeyTypes, TxLockTypes, AddressTypes, MessageTypes, @@ -2031,10 +2032,10 @@ class BasicSwap(BaseApp): xmr_swap.dest_af = msg_buf.dest_af for_ed25519 = True if coin_to == Coins.XMR else False - kbvf = self.getPathKey(coin_from, coin_to, bid_created_at, xmr_swap.contract_count, 1, for_ed25519) - kbsf = self.getPathKey(coin_from, coin_to, bid_created_at, xmr_swap.contract_count, 2, for_ed25519) + kbvf = self.getPathKey(coin_from, coin_to, bid_created_at, xmr_swap.contract_count, KeyTypes.KBVF, for_ed25519) + kbsf = self.getPathKey(coin_from, coin_to, bid_created_at, xmr_swap.contract_count, KeyTypes.KBSF, for_ed25519) - kaf = self.getPathKey(coin_from, coin_to, bid_created_at, xmr_swap.contract_count, 3) + kaf = self.getPathKey(coin_from, coin_to, bid_created_at, xmr_swap.contract_count, KeyTypes.KAF) xmr_swap.vkbvf = kbvf xmr_swap.pkbvf = ci_to.getPubkey(kbvf) @@ -2158,10 +2159,10 @@ class BasicSwap(BaseApp): xmr_swap.contract_count = self.getNewContractId() for_ed25519 = True if coin_to == Coins.XMR else False - kbvl = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, 1, for_ed25519) - kbsl = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, 2, for_ed25519) + kbvl = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KBVL, for_ed25519) + kbsl = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KBSL, for_ed25519) - kal = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, 3) + kal = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KAL) xmr_swap.vkbvl = kbvl xmr_swap.pkbvl = ci_to.getPubkey(kbvl) @@ -4260,7 +4261,7 @@ class BasicSwap(BaseApp): ci_to = self.ci(coin_to) try: - kaf = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, 3) + kaf = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KAF) prevout_amount = ci_from.getLockRefundTxSwapOutputValue(bid, xmr_swap) xmr_swap.af_lock_refund_spend_tx_esig = ci_from.signTxOtVES(kaf, xmr_swap.pkasl, xmr_swap.a_lock_refund_spend_tx, 0, xmr_swap.a_lock_refund_tx_script, prevout_amount) @@ -4320,7 +4321,7 @@ class BasicSwap(BaseApp): ci_from = self.ci(coin_from) ci_to = self.ci(coin_to) - kal = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, 3) + kal = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KAL) xmr_swap.a_lock_spend_tx = ci_from.createScriptLockSpendTx( xmr_swap.a_lock_tx, xmr_swap.a_lock_tx_script, @@ -4477,8 +4478,8 @@ class BasicSwap(BaseApp): ci_to = self.ci(coin_to) for_ed25519 = True if coin_to == Coins.XMR else False - kbsf = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, 2, for_ed25519) - kaf = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, 3) + kbsf = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KBSF, for_ed25519) + kaf = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KAF) al_lock_spend_sig = ci_from.decryptOtVES(kbsf, xmr_swap.al_lock_spend_tx_esig) prevout_amount = ci_from.getLockTxSwapOutputValue(bid, xmr_swap) @@ -4539,7 +4540,7 @@ class BasicSwap(BaseApp): assert(kbsf is not None) for_ed25519 = True if coin_to == Coins.XMR else False - kbsl = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, 2, for_ed25519) + kbsl = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KBSL, for_ed25519) vkbs = ci_to.sumKeys(kbsl, kbsf) if coin_to == Coins.XMR: @@ -4595,7 +4596,7 @@ class BasicSwap(BaseApp): assert(kbsl is not None) for_ed25519 = True if coin_to == Coins.XMR else False - kbsf = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, 2, for_ed25519) + kbsf = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KBSF, for_ed25519) vkbs = ci_to.sumKeys(kbsl, kbsf) try: @@ -4656,8 +4657,8 @@ class BasicSwap(BaseApp): xmr_swap.af_lock_refund_tx_sig = msg_data.af_lock_refund_tx_sig for_ed25519 = True if coin_to == Coins.XMR else False - kbsl = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, 2, for_ed25519) - kal = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, 3) + kbsl = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KBSL, for_ed25519) + kal = self.getPathKey(coin_from, coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KAL) xmr_swap.af_lock_refund_spend_tx_sig = ci_from.decryptOtVES(kbsl, xmr_swap.af_lock_refund_spend_tx_esig) prevout_amount = ci_from.getLockRefundTxSwapOutputValue(bid, xmr_swap) @@ -4941,9 +4942,9 @@ class BasicSwap(BaseApp): for_ed25519 = True if Coins(offer.coin_to) == Coins.XMR else False if bid.was_sent: kbsl = ci_to.decodeKey(encoded_key) - kbsf = self.getPathKey(offer.coin_from, offer.coin_to, bid.created_at, xmr_swap.contract_count, 2, for_ed25519) + kbsf = self.getPathKey(offer.coin_from, offer.coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KBSF, for_ed25519) else: - kbsl = self.getPathKey(offer.coin_from, offer.coin_to, bid.created_at, xmr_swap.contract_count, 2, for_ed25519) + kbsl = self.getPathKey(offer.coin_from, offer.coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KBSL, for_ed25519) kbsf = ci_to.decodeKey(encoded_key) ensure(ci_to.verifyKey(kbsl), 'Invalid kbsl') ensure(ci_to.verifyKey(kbsf), 'Invalid kbsf') @@ -5581,7 +5582,7 @@ class BasicSwap(BaseApp): pkh_dest, xmr_offer.a_fee_rate, xmr_swap.vkbv) - vkaf = self.getPathKey(offer.coin_from, offer.coin_to, bid.created_at, xmr_swap.contract_count, 3) + vkaf = self.getPathKey(offer.coin_from, offer.coin_to, bid.created_at, xmr_swap.contract_count, KeyTypes.KAF) prevout_amount = ci.getLockRefundTxSwapOutputValue(bid, xmr_swap) sig = ci.signTx(vkaf, spend_tx, 0, xmr_swap.a_lock_refund_tx_script, prevout_amount) diff --git a/basicswap/basicswap_util.py b/basicswap/basicswap_util.py index a5e4c31..d4598f1 100644 --- a/basicswap/basicswap_util.py +++ b/basicswap/basicswap_util.py @@ -24,6 +24,15 @@ class TxLockTypes(IntEnum): ABS_LOCK_TIME = 4 +class KeyTypes(IntEnum): + KBVL = 1 + KBSL = 2 + KAL = 3 + KBVF = 4 + KBSF = 5 + KAF = 6 + + class MessageTypes(IntEnum): OFFER = auto() BID = auto() diff --git a/basicswap/ui.py b/basicswap/ui.py index 55cbefa..f151608 100644 --- a/basicswap/ui.py +++ b/basicswap/ui.py @@ -13,15 +13,16 @@ from .chainparams import ( Coins, ) from .basicswap_util import ( - TxLockTypes, - DebugTypes, - SwapTypes, - BidStates, - TxStates, TxTypes, + KeyTypes, + TxStates, + BidStates, + SwapTypes, strTxType, - strBidState, + DebugTypes, strTxState, + strBidState, + TxLockTypes, getLastBidState, ) @@ -207,10 +208,9 @@ def describeBid(swap_client, bid, xmr_swap, offer, xmr_offer, bid_events, edit_b state_description = f'Waiting for {ticker_to} lock tx spend tx to confirm in chain' elif bid.state == BidStates.XMR_SWAP_SCRIPT_TX_PREREFUND: if bid.was_sent: - state_description = f'Waiting for offerer to redeem or locktime to expire' + state_description = 'Waiting for offerer to redeem or locktime to expire' else: - state_description = f'Redeeming output' - + state_description = 'Redeeming output' addr_label = swap_client.getAddressLabel([bid.bid_addr, ])[0] bid_rate = offer.rate if bid.rate is None else bid.rate @@ -283,7 +283,8 @@ def describeBid(swap_client, bid, xmr_swap, offer, xmr_offer, bid_events, edit_b data['xmr_b_shared_address'] = ci_to.encodeSharedAddress(xmr_swap.pkbv, xmr_swap.pkbs) if xmr_swap.pkbs else None if swap_client.debug_ui: - data['xmr_b_half_privatekey'] = ci_to.encodeKey(swap_client.getPathKey(offer.coin_from, offer.coin_to, bid.created_at, xmr_swap.contract_count, 2, True if offer.coin_to == Coins.XMR else False)) + key_type = KeyTypes.KBSF if bid.was_sent else KeyTypes.KBSL + data['xmr_b_half_privatekey'] = ci_to.encodeKey(swap_client.getPathKey(offer.coin_from, offer.coin_to, bid.created_at, xmr_swap.contract_count, key_type, True if offer.coin_to == Coins.XMR else False)) if show_lock_transfers: if xmr_swap.pkbs: diff --git a/doc/release-notes.md b/doc/release-notes.md index 06d41a0..888c384 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -1,7 +1,24 @@ 0.0.x ============== + + +0.0.29 +============== + +- Use unique key path per key type. + - Incompatible with previous versions. +- XMR swaps: Can manually spend chain B lock tx if both keys are known. + + +0.0.28 +============== + - Set working dir to datadir for daemons. +- Remove requests module dependency by implementing HTTP digest authentication client. + - Reduces log messages +- New 'debug_ui' mode, locktime can be specified in minutes. + - Must also reduce the 'min_sequence_lock_seconds' setting. 0.0.27 diff --git a/tests/basicswap/test_partblind_xmr.py b/tests/basicswap/test_partblind_xmr.py index f3ce796..d016255 100644 --- a/tests/basicswap/test_partblind_xmr.py +++ b/tests/basicswap/test_partblind_xmr.py @@ -171,7 +171,7 @@ class Test(BaseTest): bid, xmr_swap = swap_clients[0].getXmrBid(bid_id) assert(xmr_swap) - swap_clients[1].setBidDebugInd(bid_id, DebugTypes.BID_STOP_AFTER_COIN_A_LOCK) + swap_clients[1].setBidDebugInd(bid_id, DebugTypes.CREATE_INVALID_COIN_B_LOCK) swap_clients[0].setBidDebugInd(bid_id, DebugTypes.BID_DONT_SPEND_COIN_A_LOCK_REFUND) swap_clients[0].acceptXmrBid(bid_id)