Unlock inputs when abandoning a bid.

2024-05-20_merge
tecnovert 4 years ago
parent 69ed836496
commit da56a5e2c8
No known key found for this signature in database
GPG Key ID: 8ED6D8750C4E3F93
  1. 46
      basicswap/basicswap.py
  2. 8
      basicswap/interface_btc.py

@ -436,6 +436,8 @@ class BasicSwap(BaseApp):
self.min_delay_retry = self.settings.get('min_delay_retry', 60) self.min_delay_retry = self.settings.get('min_delay_retry', 60)
self.max_delay_retry = self.settings.get('max_delay_retry', 5 * 60) self.max_delay_retry = self.settings.get('max_delay_retry', 5 * 60)
self._bid_expired_leeway = 5
self.swaps_in_progress = dict() self.swaps_in_progress = dict()
if self.chain == 'regtest': if self.chain == 'regtest':
@ -896,11 +898,36 @@ class BasicSwap(BaseApp):
if ptx_state is not None and ptx_state != TxStates.TX_REFUNDED: if ptx_state is not None and ptx_state != TxStates.TX_REFUNDED:
self.returnAddressToPool(bid.bid_id, TxTypes.PTX_REFUND) self.returnAddressToPool(bid.bid_id, TxTypes.PTX_REFUND)
# Remove any delayed events use_session = None
if self.debug: try:
session.execute('UPDATE eventqueue SET active_ind = 2 WHERE linked_id = {}'.format(bid.bid_id)) if session:
else: use_session = session
session.execute('DELETE FROM eventqueue WHERE linked_id = {}'.format(bid.bid_id)) else:
self.mxDB.acquire()
use_session = scoped_session(self.session_factory)
# Remove any delayed events
if self.debug:
use_session.execute('UPDATE eventqueue SET active_ind = 2 WHERE linked_id = x\'{}\' '.format(bid.bid_id.hex()))
else:
use_session.execute('DELETE FROM eventqueue WHERE linked_id = x\'{}\' '.format(bid.bid_id.hex()))
# Unlock locked inputs (TODO)
if offer.swap_type == SwapTypes.XMR_SWAP:
xmr_swap = use_session.query(XmrSwap).filter_by(bid_id=bid.bid_id).first()
if xmr_swap:
try:
self.ci(offer.coin_from).unlockInputs(xmr_swap.a_lock_tx)
except Exception as e:
if self.debug:
self.log.info('unlockInputs failed {}'.format(str(e)))
pass # Invalid parameter, unknown transaction
finally:
if session is None:
use_session.commit()
use_session.close()
use_session.remove()
self.mxDB.release()
def loadFromDB(self): def loadFromDB(self):
self.log.info('Loading data from db') self.log.info('Loading data from db')
@ -1370,7 +1397,6 @@ class BasicSwap(BaseApp):
session.remove() session.remove()
finally: finally:
self.mxDB.release() self.mxDB.release()
return self._contract_count return self._contract_count
def getProofOfFunds(self, coin_type, amount_for): def getProofOfFunds(self, coin_type, amount_for):
@ -1486,7 +1512,7 @@ class BasicSwap(BaseApp):
q = session.execute('SELECT COUNT(*) FROM eventlog WHERE linked_type = {} AND linked_id = x\'{}\' AND event_type = {}'.format(int(TableTypes.BID), bid.bid_id.hex(), int(event_type))).first() q = session.execute('SELECT COUNT(*) FROM eventlog WHERE linked_type = {} AND linked_id = x\'{}\' AND event_type = {}'.format(int(TableTypes.BID), bid.bid_id.hex(), int(event_type))).first()
return q[0] return q[0]
def postBid(self, offer_id, amount, addr_send_from=None): def postBid(self, offer_id, amount, addr_send_from=None, extra_options={}):
# Bid to send bid.amount * offer.rate of coin_to in exchange for bid.amount of coin_from # Bid to send bid.amount * offer.rate of coin_to in exchange for bid.amount of coin_from
self.log.debug('postBid %s %s', offer_id.hex(), format8(amount)) self.log.debug('postBid %s %s', offer_id.hex(), format8(amount))
@ -1501,7 +1527,7 @@ class BasicSwap(BaseApp):
try: try:
msg_buf = BidMessage() msg_buf = BidMessage()
msg_buf.offer_msg_id = offer_id msg_buf.offer_msg_id = offer_id
msg_buf.time_valid = 60 * 10 msg_buf.time_valid = extra_options.get('time_valid', 60 * 10)
msg_buf.amount = int(amount) # amount of coin_from msg_buf.amount = int(amount) # amount of coin_from
coin_from = Coins(offer.coin_from) coin_from = Coins(offer.coin_from)
@ -2855,7 +2881,7 @@ class BasicSwap(BaseApp):
if bid.initiate_tx is None and \ if bid.initiate_tx is None and \
bid.state_time + INITIATE_TX_TIMEOUT < int(time.time()): bid.state_time + INITIATE_TX_TIMEOUT < int(time.time()):
self.log.info('Swap timed out waiting for initiate tx for bid %s', bid_id.hex()) self.log.info('Swap timed out waiting for initiate tx for bid %s', bid_id.hex())
bid.setState(BidStates.SWAP_TIMEDOUT) bid.setState(BidStates.SWAP_TIMEDOUT, 'Timed out waiting for initiate tx')
self.saveBid(bid_id, bid) self.saveBid(bid_id, bid)
return True # Mark bid for archiving return True # Mark bid for archiving
elif state == BidStates.SWAP_INITIATED: elif state == BidStates.SWAP_INITIATED:
@ -3553,7 +3579,7 @@ class BasicSwap(BaseApp):
assert(offer), 'Offer not found ' + bid.offer_id.hex() assert(offer), 'Offer not found ' + bid.offer_id.hex()
coin_from = Coins(offer.coin_from) coin_from = Coins(offer.coin_from)
# assert(bid.expire_at > now), 'Bid expired' # How much time over to accept assert(bid.expire_at > now + self._bid_expired_leeway), 'Bid expired'
if bid.state >= BidStates.BID_ACCEPTED: if bid.state >= BidStates.BID_ACCEPTED:
if bid.was_received: # Sent to self if bid.was_received: # Sent to self

@ -680,6 +680,14 @@ class BTCInterface(CoinInterface):
rv = self.rpc_callback('fundrawtransaction', [tx.hex(), options]) rv = self.rpc_callback('fundrawtransaction', [tx.hex(), options])
return bytes.fromhex(rv['hex']) return bytes.fromhex(rv['hex'])
def unlockInputs(self, tx_bytes):
tx = self.loadTx(tx_bytes)
inputs = []
for pi in tx.vin:
inputs.append({'txid': i2h(pi.prevout.hash), 'vout': pi.prevout.n})
self.rpc_callback('lockunspent', [True, inputs])
def signTxWithWallet(self, tx): def signTxWithWallet(self, tx):
rv = self.rpc_callback('signrawtransactionwithwallet', [tx.hex()]) rv = self.rpc_callback('signrawtransactionwithwallet', [tx.hex()])
return bytes.fromhex(rv['hex']) return bytes.fromhex(rv['hex'])

Loading…
Cancel
Save