Add bitcoin redeem func
This commit is contained in:
parent
173b5d108f
commit
f0b6389648
46
bXcat.py
46
bXcat.py
|
@ -65,6 +65,7 @@ def check_funds(p2sh):
|
||||||
amount = amount/COIN
|
amount = amount/COIN
|
||||||
return amount
|
return amount
|
||||||
|
|
||||||
|
## TODO: FIX search for p2sh in block
|
||||||
def search_p2sh(block, p2sh):
|
def search_p2sh(block, p2sh):
|
||||||
print("Fetching block...")
|
print("Fetching block...")
|
||||||
blockdata = bitcoind.getblock(lx(block))
|
blockdata = bitcoind.getblock(lx(block))
|
||||||
|
@ -85,3 +86,48 @@ def search_p2sh(block, p2sh):
|
||||||
if addr == p2sh:
|
if addr == p2sh:
|
||||||
print("Address to p2sh found in transaction!", addr)
|
print("Address to p2sh found in transaction!", addr)
|
||||||
print("Returning from search_p2sh")
|
print("Returning from search_p2sh")
|
||||||
|
|
||||||
|
|
||||||
|
def get_tx_details(txid):
|
||||||
|
fund_txinfo = bitcoind.gettransaction(fund_tx)
|
||||||
|
return fund_txinfo['details'][0]
|
||||||
|
|
||||||
|
def redeem(p2sh, action):
|
||||||
|
contracts = get_contract()
|
||||||
|
trade = get_trade()
|
||||||
|
for key in contracts:
|
||||||
|
if key == p2sh:
|
||||||
|
contract = contracts[key]
|
||||||
|
if contract:
|
||||||
|
print("Redeeming tx in p2sh", p2sh)
|
||||||
|
# TODO: Have to get tx info from saved contract p2sh
|
||||||
|
redeemblocknum = contract['redeemblocknum']
|
||||||
|
zec_redeemScript = contract['zec_redeemScript']
|
||||||
|
|
||||||
|
txid = trade['action']['fund_tx']
|
||||||
|
details = get_tx_details(txid)
|
||||||
|
txin = CMutableTxIn(COutPoint(txid, details['vout']))
|
||||||
|
redeemPubKey = CBitcoinAddress(contract['redeemer'])
|
||||||
|
txout = CMutableTxOut(details['amount'] - FEE, redeemPubKey.to_scriptPubKey())
|
||||||
|
# Create the unsigned raw transaction.
|
||||||
|
tx = CMutableTransaction([txin], [txout])
|
||||||
|
# nLockTime needs to be at least as large as parameter of CHECKLOCKTIMEVERIFY for script to verify
|
||||||
|
# TODO: these things like redeemblocknum should really be properties of a tx class...
|
||||||
|
# Need: redeemblocknum, zec_redeemScript, secret (for creator...), txid, redeemer...
|
||||||
|
tx.nLockTime = redeemblocknum
|
||||||
|
sighash = SignatureHash(zec_redeemScript, tx, 0, SIGHASH_ALL)
|
||||||
|
# TODO: figure out how to better protect privkey?
|
||||||
|
privkey = bitcoind.dumpprivkey(redeemPubKey)
|
||||||
|
sig = privkey.sign(sighash) + bytes([SIGHASH_ALL])
|
||||||
|
txin.scriptSig = CScript([sig, privkey.pub, contract['secret'], OP_TRUE, zec_redeemScript])
|
||||||
|
print("Redeem tx hex:", b2x(tx.serialize()))
|
||||||
|
|
||||||
|
print("txin.scriptSig", b2x(txin.scriptSig))
|
||||||
|
print("txin_scriptPubKey", b2x(txin_scriptPubKey))
|
||||||
|
print('tx', tx)
|
||||||
|
VerifyScript(txin.scriptSig, txin_scriptPubKey, tx, 0, (SCRIPT_VERIFY_P2SH,))
|
||||||
|
print("script verified, sending raw tx")
|
||||||
|
txid = bitcoind.sendrawtransaction(tx)
|
||||||
|
print("Txid of submitted redeem tx: ", b2x(lx(b2x(txid))))
|
||||||
|
else:
|
||||||
|
print("No contract for this p2sh found in database", p2sh)
|
||||||
|
|
13
xcat.py
13
xcat.py
|
@ -7,11 +7,6 @@ import json
|
||||||
import os
|
import os
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
|
|
||||||
def delay():
|
|
||||||
sleep(1)
|
|
||||||
return "hi"
|
|
||||||
|
|
||||||
|
|
||||||
def check_p2sh(currency, address):
|
def check_p2sh(currency, address):
|
||||||
if currency == 'bitcoin':
|
if currency == 'bitcoin':
|
||||||
print("Checking funds in btc p2sh")
|
print("Checking funds in btc p2sh")
|
||||||
|
@ -190,7 +185,8 @@ if __name__ == '__main__':
|
||||||
# Means buyer has already funded the currency the transaction initiator wants to exchange into
|
# Means buyer has already funded the currency the transaction initiator wants to exchange into
|
||||||
seller_redeem()
|
seller_redeem()
|
||||||
else:
|
else:
|
||||||
if trade['sell']['status'] == 'funded':
|
# if 'status' not in trade['buy']:
|
||||||
|
elif trade['sell']['status'] == 'funded':
|
||||||
trade = get_trade()
|
trade = get_trade()
|
||||||
buyer_fulfill()
|
buyer_fulfill()
|
||||||
# How to monitor if txs are included in blocks -- should use blocknotify and a monitor daemon?
|
# How to monitor if txs are included in blocks -- should use blocknotify and a monitor daemon?
|
||||||
|
@ -202,8 +198,3 @@ if __name__ == '__main__':
|
||||||
buyer_redeem()
|
buyer_redeem()
|
||||||
|
|
||||||
pprint(get_trade())
|
pprint(get_trade())
|
||||||
|
|
||||||
|
|
||||||
# result = delay()
|
|
||||||
# wait(lambda: result) is result
|
|
||||||
# print(result)
|
|
||||||
|
|
Loading…
Reference in New Issue