Unlock inputs when abandoning a bid.
This commit is contained in:
parent
69ed836496
commit
da56a5e2c8
@ -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)
|
||||||
|
|
||||||
|
use_session = None
|
||||||
|
try:
|
||||||
|
if session:
|
||||||
|
use_session = session
|
||||||
|
else:
|
||||||
|
self.mxDB.acquire()
|
||||||
|
use_session = scoped_session(self.session_factory)
|
||||||
|
|
||||||
# Remove any delayed events
|
# Remove any delayed events
|
||||||
if self.debug:
|
if self.debug:
|
||||||
session.execute('UPDATE eventqueue SET active_ind = 2 WHERE linked_id = {}'.format(bid.bid_id))
|
use_session.execute('UPDATE eventqueue SET active_ind = 2 WHERE linked_id = x\'{}\' '.format(bid.bid_id.hex()))
|
||||||
else:
|
else:
|
||||||
session.execute('DELETE FROM eventqueue WHERE linked_id = {}'.format(bid.bid_id))
|
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…
Reference in New Issue
Block a user