Show coin a lock tx blocks confirmed.
This commit is contained in:
parent
645571e47c
commit
2979b3e244
@ -41,6 +41,8 @@ from .util import (
|
|||||||
toWIF,
|
toWIF,
|
||||||
getKeyID,
|
getKeyID,
|
||||||
make_int,
|
make_int,
|
||||||
|
getP2SHScriptForHash,
|
||||||
|
getP2WSH,
|
||||||
)
|
)
|
||||||
from .chainparams import (
|
from .chainparams import (
|
||||||
chainparams,
|
chainparams,
|
||||||
@ -190,6 +192,8 @@ class EventLogTypes(IntEnum):
|
|||||||
LOCK_TX_A_PUBLISHED = auto()
|
LOCK_TX_A_PUBLISHED = auto()
|
||||||
LOCK_TX_B_PUBLISHED = auto()
|
LOCK_TX_B_PUBLISHED = auto()
|
||||||
FAILED_TX_B_SPEND = auto()
|
FAILED_TX_B_SPEND = auto()
|
||||||
|
LOCK_TX_A_SEEN = auto()
|
||||||
|
LOCK_TX_A_CONFIRMED = auto()
|
||||||
LOCK_TX_B_SEEN = auto()
|
LOCK_TX_B_SEEN = auto()
|
||||||
LOCK_TX_B_CONFIRMED = auto()
|
LOCK_TX_B_CONFIRMED = auto()
|
||||||
|
|
||||||
@ -324,6 +328,10 @@ def describeEventEntry(event_type, event_msg):
|
|||||||
return 'Lock tx b published'
|
return 'Lock tx b published'
|
||||||
if event_type == EventLogTypes.FAILED_TX_B_SPEND:
|
if event_type == EventLogTypes.FAILED_TX_B_SPEND:
|
||||||
return 'Failed to publish lock tx b spend'
|
return 'Failed to publish lock tx b spend'
|
||||||
|
if event_type == EventLogTypes.LOCK_TX_A_SEEN:
|
||||||
|
return 'Lock tx a seen in chain'
|
||||||
|
if event_type == EventLogTypes.LOCK_TX_A_CONFIRMED:
|
||||||
|
return 'Lock tx a confirmed in chain'
|
||||||
if event_type == EventLogTypes.LOCK_TX_B_SEEN:
|
if event_type == EventLogTypes.LOCK_TX_B_SEEN:
|
||||||
return 'Lock tx b seen in chain'
|
return 'Lock tx b seen in chain'
|
||||||
if event_type == EventLogTypes.LOCK_TX_B_CONFIRMED:
|
if event_type == EventLogTypes.LOCK_TX_B_CONFIRMED:
|
||||||
@ -351,10 +359,6 @@ def decodeSequence(lock_value):
|
|||||||
return lock_value & SEQUENCE_LOCKTIME_MASK
|
return lock_value & SEQUENCE_LOCKTIME_MASK
|
||||||
|
|
||||||
|
|
||||||
def extractScriptSecretHash(script):
|
|
||||||
return script[7:39]
|
|
||||||
|
|
||||||
|
|
||||||
def getVoutByAddress(txjs, p2sh):
|
def getVoutByAddress(txjs, p2sh):
|
||||||
for o in txjs['vout']:
|
for o in txjs['vout']:
|
||||||
try:
|
try:
|
||||||
@ -375,16 +379,6 @@ def getVoutByP2WSH(txjs, p2wsh_hex):
|
|||||||
raise ValueError('P2WSH output not found in txn')
|
raise ValueError('P2WSH output not found in txn')
|
||||||
|
|
||||||
|
|
||||||
def getP2SHScriptForHash(p2sh):
|
|
||||||
return bytearray([OpCodes.OP_HASH160, 0x14]) \
|
|
||||||
+ p2sh \
|
|
||||||
+ bytearray([OpCodes.OP_EQUAL])
|
|
||||||
|
|
||||||
|
|
||||||
def getP2WSH(script):
|
|
||||||
return bytearray([OpCodes.OP_0, 0x20]) + hashlib.sha256(script).digest()
|
|
||||||
|
|
||||||
|
|
||||||
def replaceAddrPrefix(addr, coin_type, chain_name, addr_type='pubkey_address'):
|
def replaceAddrPrefix(addr, coin_type, chain_name, addr_type='pubkey_address'):
|
||||||
return encodeAddress(bytes((chainparams[coin_type][chain_name][addr_type],)) + decodeAddress(addr)[1:])
|
return encodeAddress(bytes((chainparams[coin_type][chain_name][addr_type],)) + decodeAddress(addr)[1:])
|
||||||
|
|
||||||
@ -566,7 +560,7 @@ class BasicSwap(BaseApp):
|
|||||||
else:
|
else:
|
||||||
raise ValueError('Missing XMR wallet rpc credentials.')
|
raise ValueError('Missing XMR wallet rpc credentials.')
|
||||||
|
|
||||||
def ci(self, coin): # coin interface
|
def ci(self, coin): # Coin interface
|
||||||
return self.coin_clients[coin]['interface']
|
return self.coin_clients[coin]['interface']
|
||||||
|
|
||||||
def createInterface(self, coin):
|
def createInterface(self, coin):
|
||||||
@ -611,7 +605,7 @@ class BasicSwap(BaseApp):
|
|||||||
except Exception:
|
except Exception:
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
try:
|
try:
|
||||||
if os.name != 'nt' or cc['core_version_group'] > 17: # litecoin on windows doesn't write a pid file
|
if os.name != 'nt' or cc['core_version_group'] > 17: # Litecoin on windows doesn't write a pid file
|
||||||
assert(datadir_pid == cc['pid']), 'Mismatched pid'
|
assert(datadir_pid == cc['pid']), 'Mismatched pid'
|
||||||
with open(authcookiepath, 'rb') as fp:
|
with open(authcookiepath, 'rb') as fp:
|
||||||
cc['rpcauth'] = fp.read().decode('utf-8')
|
cc['rpcauth'] = fp.read().decode('utf-8')
|
||||||
@ -2025,7 +2019,7 @@ class BasicSwap(BaseApp):
|
|||||||
|
|
||||||
bid_date = dt.datetime.fromtimestamp(bid.created_at).date()
|
bid_date = dt.datetime.fromtimestamp(bid.created_at).date()
|
||||||
|
|
||||||
secret_hash = extractScriptSecretHash(bid.initiate_tx.script)
|
secret_hash = atomic_swap_1.extractScriptSecretHash(bid.initiate_tx.script)
|
||||||
pkhash_seller = bid.pkhash_seller
|
pkhash_seller = bid.pkhash_seller
|
||||||
pkhash_buyer_refund = bid.pkhash_buyer
|
pkhash_buyer_refund = bid.pkhash_buyer
|
||||||
|
|
||||||
@ -2594,9 +2588,10 @@ class BasicSwap(BaseApp):
|
|||||||
return rv
|
return rv
|
||||||
|
|
||||||
# TODO: Timeout waiting for transactions
|
# TODO: Timeout waiting for transactions
|
||||||
|
bid_changed = False
|
||||||
a_lock_tx_dest = ci_from.getScriptDest(xmr_swap.a_lock_tx_script)
|
a_lock_tx_dest = ci_from.getScriptDest(xmr_swap.a_lock_tx_script)
|
||||||
utxos = ci_from.getOutput(bid.xmr_a_lock_tx.txid, a_lock_tx_dest, bid.amount)
|
utxos, chain_height = ci_from.getOutput(bid.xmr_a_lock_tx.txid, a_lock_tx_dest, bid.amount)
|
||||||
|
self.coin_clients[ci_from.coin_type()]['last_height'] = chain_height
|
||||||
|
|
||||||
if len(utxos) < 1:
|
if len(utxos) < 1:
|
||||||
return rv
|
return rv
|
||||||
@ -2605,7 +2600,15 @@ class BasicSwap(BaseApp):
|
|||||||
raise ValueError('Too many outputs for chain A lock tx')
|
raise ValueError('Too many outputs for chain A lock tx')
|
||||||
|
|
||||||
utxo = utxos[0]
|
utxo = utxos[0]
|
||||||
|
if not bid.xmr_a_lock_tx.chain_height and utxo['height'] != 0:
|
||||||
|
self.logBidEvent(bid, EventLogTypes.LOCK_TX_A_SEEN, '', session)
|
||||||
|
bid_changed = True
|
||||||
|
if bid.xmr_a_lock_tx.chain_height != utxo['height'] and utxo['height'] != 0:
|
||||||
|
bid.xmr_a_lock_tx.chain_height = utxo['height']
|
||||||
|
bid_changed = True
|
||||||
|
|
||||||
if utxo['depth'] >= ci_from.blocks_confirmed:
|
if utxo['depth'] >= ci_from.blocks_confirmed:
|
||||||
|
self.logBidEvent(bid, EventLogTypes.LOCK_TX_A_CONFIRMED, '', session)
|
||||||
bid.xmr_a_lock_tx.setState(TxStates.TX_CONFIRMED)
|
bid.xmr_a_lock_tx.setState(TxStates.TX_CONFIRMED)
|
||||||
bid.setState(BidStates.XMR_SWAP_SCRIPT_COIN_LOCKED)
|
bid.setState(BidStates.XMR_SWAP_SCRIPT_COIN_LOCKED)
|
||||||
self.saveBidInSession(bid_id, bid, session, xmr_swap)
|
self.saveBidInSession(bid_id, bid, session, xmr_swap)
|
||||||
@ -2615,7 +2618,9 @@ class BasicSwap(BaseApp):
|
|||||||
self.log.info('Sending xmr swap chain B lock tx for bid %s in %d seconds', bid_id.hex(), delay)
|
self.log.info('Sending xmr swap chain B lock tx for bid %s in %d seconds', bid_id.hex(), delay)
|
||||||
self.createEventInSession(delay, EventTypes.SEND_XMR_SWAP_LOCK_TX_B, bid_id, session)
|
self.createEventInSession(delay, EventTypes.SEND_XMR_SWAP_LOCK_TX_B, bid_id, session)
|
||||||
# bid.setState(BidStates.SWAP_DELAYING)
|
# bid.setState(BidStates.SWAP_DELAYING)
|
||||||
|
bid_changed = True
|
||||||
|
|
||||||
|
if bid_changed:
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
elif state == BidStates.XMR_SWAP_SCRIPT_COIN_LOCKED:
|
elif state == BidStates.XMR_SWAP_SCRIPT_COIN_LOCKED:
|
||||||
|
@ -874,9 +874,6 @@ class BTCInterface(CoinInterface):
|
|||||||
chain_height = utxos['height']
|
chain_height = utxos['height']
|
||||||
rv = []
|
rv = []
|
||||||
for utxo in utxos['unspents']:
|
for utxo in utxos['unspents']:
|
||||||
print('utxo', utxo)
|
|
||||||
depth = 0 if 'height' not in utxo else utxos['height'] - utxo['height']
|
|
||||||
|
|
||||||
if txid and txid.hex() != utxo['txid']:
|
if txid and txid.hex() != utxo['txid']:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -884,11 +881,12 @@ class BTCInterface(CoinInterface):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
rv.append({
|
rv.append({
|
||||||
'depth': depth,
|
'depth': 0 if 'height' not in utxo else chain_height - utxo['height'],
|
||||||
|
'height': 0 if 'height' not in utxo else utxo['height'],
|
||||||
'amount': utxo['amount'] * COIN,
|
'amount': utxo['amount'] * COIN,
|
||||||
'txid': utxo['txid'],
|
'txid': utxo['txid'],
|
||||||
'vout': utxo['vout']})
|
'vout': utxo['vout']})
|
||||||
return rv
|
return rv, chain_height
|
||||||
|
|
||||||
def withdrawCoin(self, value, addr_to, subfee):
|
def withdrawCoin(self, value, addr_to, subfee):
|
||||||
params = [addr_to, value, '', '', subfee, True, self._conf_target]
|
params = [addr_to, value, '', '', subfee, True, self._conf_target]
|
||||||
|
@ -41,3 +41,7 @@ def buildContractScript(lock_val, secret_hash, pkh_redeem, pkh_refund, op_lock=O
|
|||||||
OpCodes.OP_EQUALVERIFY,
|
OpCodes.OP_EQUALVERIFY,
|
||||||
OpCodes.OP_CHECKSIG])
|
OpCodes.OP_CHECKSIG])
|
||||||
return script
|
return script
|
||||||
|
|
||||||
|
|
||||||
|
def extractScriptSecretHash(script):
|
||||||
|
return script[7:39]
|
||||||
|
@ -152,7 +152,10 @@ def describeBid(swap_client, bid, offer, edit_bid, show_txns):
|
|||||||
if offer.swap_type == SwapTypes.XMR_SWAP:
|
if offer.swap_type == SwapTypes.XMR_SWAP:
|
||||||
txns = []
|
txns = []
|
||||||
if bid.xmr_a_lock_tx:
|
if bid.xmr_a_lock_tx:
|
||||||
txns.append({'type': 'Chain A Lock', 'txid': bid.xmr_a_lock_tx.txid.hex()})
|
confirms = None
|
||||||
|
if swap_client.coin_clients[ci_from.coin_type()]['last_height'] and bid.xmr_a_lock_tx.chain_height:
|
||||||
|
confirms = swap_client.coin_clients[ci_from.coin_type()]['last_height'] - bid.xmr_a_lock_tx.chain_height
|
||||||
|
txns.append({'type': 'Chain A Lock', 'txid': bid.xmr_a_lock_tx.txid.hex(), 'confirms': confirms})
|
||||||
if bid.xmr_a_lock_spend_tx:
|
if bid.xmr_a_lock_spend_tx:
|
||||||
txns.append({'type': 'Chain A Lock Spend', 'txid': bid.xmr_a_lock_spend_tx.txid.hex()})
|
txns.append({'type': 'Chain A Lock Spend', 'txid': bid.xmr_a_lock_spend_tx.txid.hex()})
|
||||||
if bid.xmr_b_lock_tx:
|
if bid.xmr_b_lock_tx:
|
||||||
@ -162,7 +165,6 @@ def describeBid(swap_client, bid, offer, edit_bid, show_txns):
|
|||||||
txns.append({'type': 'Chain B Lock', 'txid': bid.xmr_b_lock_tx.txid.hex(), 'confirms': confirms})
|
txns.append({'type': 'Chain B Lock', 'txid': bid.xmr_b_lock_tx.txid.hex(), 'confirms': confirms})
|
||||||
if bid.xmr_b_lock_tx and bid.xmr_b_lock_tx.spend_txid:
|
if bid.xmr_b_lock_tx and bid.xmr_b_lock_tx.spend_txid:
|
||||||
txns.append({'type': 'Chain B Lock Spend', 'txid': bid.xmr_b_lock_tx.spend_txid.hex()})
|
txns.append({'type': 'Chain B Lock Spend', 'txid': bid.xmr_b_lock_tx.spend_txid.hex()})
|
||||||
|
|
||||||
for tx_type, tx in bid.txns.items():
|
for tx_type, tx in bid.txns.items():
|
||||||
txns.append({'type': strTxType(tx_type), 'txid': tx.txid.hex()})
|
txns.append({'type': strTxType(tx_type), 'txid': tx.txid.hex()})
|
||||||
data['txns'] = txns
|
data['txns'] = txns
|
||||||
|
@ -301,3 +301,13 @@ def format_amount(i, display_scale, scale=None):
|
|||||||
if i < 0:
|
if i < 0:
|
||||||
rv = '-' + rv
|
rv = '-' + rv
|
||||||
return rv
|
return rv
|
||||||
|
|
||||||
|
|
||||||
|
def getP2SHScriptForHash(p2sh):
|
||||||
|
return bytes([OpCodes.OP_HASH160, 0x14]) \
|
||||||
|
+ p2sh \
|
||||||
|
+ bytes([OpCodes.OP_EQUAL])
|
||||||
|
|
||||||
|
|
||||||
|
def getP2WSH(script):
|
||||||
|
return bytes([OpCodes.OP_0, 0x20]) + hashlib.sha256(script).digest()
|
||||||
|
Loading…
Reference in New Issue
Block a user