mirror of
https://github.com/basicswap/basicswap.git
synced 2025-11-06 02:38:11 +01:00
Continue extending bch interface and test coverage
Support reverse swap happy path
This commit is contained in:
@@ -2987,7 +2987,7 @@ class BasicSwap(BaseApp):
|
||||
refundExtraArgs = dict()
|
||||
lockExtraArgs = dict()
|
||||
if self.isBchXmrSwap(offer):
|
||||
pkh_refund_to = ci_from.decodeAddress(self.getCachedAddressForCoin(offer.coin_from, use_session))
|
||||
pkh_refund_to = ci_from.decodeAddress(self.getCachedAddressForCoin(coin_from, use_session))
|
||||
pkh_dest = xmr_swap.dest_af
|
||||
# refund script
|
||||
refundExtraArgs['mining_fee'] = 1000
|
||||
@@ -3957,7 +3957,8 @@ class BasicSwap(BaseApp):
|
||||
bid.xmr_a_lock_tx.tx_data = xmr_swap.a_lock_tx
|
||||
bid.xmr_a_lock_tx.spend_txid = xmr_swap.a_lock_spend_tx_id
|
||||
|
||||
self.addWatchedOutput(offer.coin_from, bid.bid_id, bid.xmr_a_lock_tx.txid.hex(), bid.xmr_a_lock_tx.vout, TxTypes.XMR_SWAP_A_LOCK, SwapTypes.XMR_SWAP)
|
||||
coin_from = Coins(offer.coin_to if reverse_bid else offer.coin_from)
|
||||
self.addWatchedOutput(coin_from, bid.bid_id, bid.xmr_a_lock_tx.txid.hex(), bid.xmr_a_lock_tx.vout, TxTypes.XMR_SWAP_A_LOCK, SwapTypes.XMR_SWAP)
|
||||
bid_changed = True
|
||||
|
||||
if bid.xmr_a_lock_tx.state == TxStates.TX_NONE and lock_tx_chain_info['height'] == 0:
|
||||
@@ -4922,11 +4923,10 @@ class BasicSwap(BaseApp):
|
||||
raise ValueError('TODO')
|
||||
elif offer_data.swap_type == SwapTypes.XMR_SWAP:
|
||||
ensure(offer_data.protocol_version >= MINPROTO_VERSION_ADAPTOR_SIG, 'Invalid protocol version')
|
||||
if Coins.BCH not in (coin_from, coin_to):
|
||||
if reverse_bid:
|
||||
ensure(ci_to.has_segwit(), 'Coin-to must support segwit for reverse bid offers')
|
||||
else:
|
||||
ensure(ci_from.has_segwit(), 'Coin-from must support segwit')
|
||||
if reverse_bid:
|
||||
ensure(ci_to.has_segwit(), 'Coin-to must support segwit for reverse bid offers')
|
||||
else:
|
||||
ensure(ci_from.has_segwit(), 'Coin-from must support segwit')
|
||||
ensure(len(offer_data.proof_address) == 0, 'Unexpected data')
|
||||
ensure(len(offer_data.proof_signature) == 0, 'Unexpected data')
|
||||
ensure(len(offer_data.pkhash_seller) == 0, 'Unexpected data')
|
||||
|
||||
@@ -13,7 +13,7 @@ from .btc import BTCInterface, ensure_op, find_vout_for_address_from_txobj, find
|
||||
from basicswap.rpc import make_rpc_func
|
||||
from basicswap.chainparams import Coins
|
||||
from basicswap.interface.contrib.bch_test_framework.cashaddress import Address
|
||||
from basicswap.util.crypto import sha256
|
||||
from basicswap.util.crypto import hash160, sha256
|
||||
from basicswap.interface.contrib.bch_test_framework.script import (
|
||||
OP_TXINPUTCOUNT,
|
||||
OP_1,
|
||||
@@ -71,8 +71,13 @@ class BCHInterface(BTCInterface):
|
||||
def __init__(self, coin_settings, network, swap_client=None):
|
||||
super(BCHInterface, self).__init__(coin_settings, network, swap_client)
|
||||
# No multiwallet support
|
||||
self.swap_client = swap_client
|
||||
self.rpc_wallet = make_rpc_func(self._rpcport, self._rpcauth, host=self._rpc_host)
|
||||
|
||||
def has_segwit(self) -> bool:
|
||||
# bch does not have segwit, but we return true here to avoid extra checks in basicswap.py
|
||||
return True
|
||||
|
||||
def getExchangeName(self, exchange_name):
|
||||
return 'bch'
|
||||
|
||||
@@ -148,7 +153,7 @@ class BCHInterface(BTCInterface):
|
||||
return CScript([OP_HASH256, script_hash, OP_EQUAL])
|
||||
|
||||
def withdrawCoin(self, value: float, addr_to: str, subfee: bool):
|
||||
params = [addr_to, value, '', '', subfee, True, True]
|
||||
params = [addr_to, value, '', '', subfee, 0, False]
|
||||
return self.rpc_wallet('sendtoaddress', params)
|
||||
|
||||
def getSpendableBalance(self) -> int:
|
||||
@@ -321,16 +326,19 @@ class BCHInterface(BTCInterface):
|
||||
address.prefix = prefix
|
||||
return address.cash_address()
|
||||
|
||||
def encodeSharedAddress(self, Kbv, Kbs):
|
||||
return self.pkh_to_address(hash160(Kbs))
|
||||
|
||||
def addressToLockingBytecode(self, address: str) -> bytes:
|
||||
return b'\x76\xa9\x14' + bytes(Address.from_string(address).payload) + b'\x88\xac'
|
||||
|
||||
def getSpendableBalance(self) -> int:
|
||||
return self.make_int(self.rpc_wallet('getbalance', ["*", 1, False]))
|
||||
|
||||
def getScriptDest(self, script):
|
||||
return self.scriptToP2SH32LockingBytecode(script)
|
||||
|
||||
def scriptToP2SH32LockingBytecode(self, script: Union[bytes, str]) -> bytes:
|
||||
if isinstance(script, str):
|
||||
script = bytes.fromhex(script)
|
||||
|
||||
return CScript([
|
||||
OP_HASH256,
|
||||
sha256(sha256(script)),
|
||||
|
||||
@@ -210,7 +210,7 @@ class Address:
|
||||
|
||||
if address.upper() != address and address.lower() != address:
|
||||
raise ValueError(
|
||||
"Cash address contains uppercase and lowercase characters"
|
||||
"Cash address contains uppercase and lowercase characters: " + address
|
||||
)
|
||||
|
||||
address = address.lower()
|
||||
|
||||
Reference in New Issue
Block a user