fix, firo: add createUTXO, fix tests

This commit is contained in:
tecnovert
2026-03-18 11:57:32 +02:00
parent 569f4290d0
commit 8d150f0ea8
2 changed files with 41 additions and 14 deletions

View File

@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2022-2023 tecnovert # Copyright (c) 2022-2023 tecnovert
# Copyright (c) 2024-2025 The Basicswap developers # Copyright (c) 2024-2026 The Basicswap developers
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php. # file LICENSE or http://www.opensource.org/licenses/mit-license.php.
@@ -136,6 +136,19 @@ class FIROInterface(BTCInterface):
rv["spark_immature"] = 0 rv["spark_immature"] = 0
return rv return rv
def createUTXO(self, value_sats: int):
# Create a new address and send value_sats to it
spendable_balance = self.getSpendableBalance()
if spendable_balance < value_sats:
raise ValueError("Balance too low")
address = self.getNewAddress(self._use_segwit, "create_utxo")
return (
self.withdrawCoin(self.format_amount(value_sats), "plain", address, False),
address,
)
def withdrawCoin(self, value, type_from: str, addr_to: str, subfee: bool) -> str: def withdrawCoin(self, value, type_from: str, addr_to: str, subfee: bool) -> str:
"""Withdraw coins, supporting both transparent and Spark transactions. """Withdraw coins, supporting both transparent and Spark transactions.

View File

@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Copyright (c) 2022-2023 tecnovert # Copyright (c) 2022-2023 tecnovert
# Copyright (c) 2024 The Basicswap developers # Copyright (c) 2024-2026 The Basicswap developers
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php. # file LICENSE or http://www.opensource.org/licenses/mit-license.php.
@@ -199,7 +199,7 @@ class Test(BaseTest):
0, "getnewaddress", ["mining_addr"], base_rpc_port=FIRO_BASE_RPC_PORT 0, "getnewaddress", ["mining_addr"], base_rpc_port=FIRO_BASE_RPC_PORT
) )
# cls.firo_addr = callnoderpc(0, 'addwitnessaddress', [cls.firo_addr], base_rpc_port=FIRO_BASE_RPC_PORT) # cls.firo_addr = callnoderpc(0, 'addwitnessaddress', [cls.firo_addr], base_rpc_port=FIRO_BASE_RPC_PORT)
logging.info("Mining %d Firo blocks to %s", num_blocks, cls.firo_addr) logging.info(f"Mining {num_blocks} Firo blocks to {cls.firo_addr}")
callnoderpc( callnoderpc(
0, 0,
"generatetoaddress", "generatetoaddress",
@@ -230,7 +230,7 @@ class Test(BaseTest):
0, "getblockcount", base_rpc_port=FIRO_BASE_RPC_PORT 0, "getblockcount", base_rpc_port=FIRO_BASE_RPC_PORT
) )
num_blocks = 1352 - chain_height # Activate CTLV (bip65) num_blocks = 1352 - chain_height # Activate CTLV (bip65)
logging.info("Mining %d Firo blocks to %s", num_blocks, cls.firo_addr) logging.info(f"Mining {num_blocks} Firo blocks to {cls.firo_addr}")
callnoderpc( callnoderpc(
0, 0,
"generatetoaddress", "generatetoaddress",
@@ -286,7 +286,7 @@ class Test(BaseTest):
self.callnoderpc("generatetoaddress", [num_blocks, self.firo_addr]) self.callnoderpc("generatetoaddress", [num_blocks, self.firo_addr])
def test_001_firo(self): def test_001_firo(self):
logging.info("---------- Test {} segwit".format(self.test_coin_from.name)) logging.info(f"---------- Test {self.test_coin_from.name} segwit")
""" """
Segwit is not currently enabled: Segwit is not currently enabled:
@@ -339,7 +339,7 @@ class Test(BaseTest):
assert txid_with_scriptsig == tx_signed_decoded["txid"] assert txid_with_scriptsig == tx_signed_decoded["txid"]
def test_007_hdwallet(self): def test_007_hdwallet(self):
logging.info("---------- Test {} hdwallet".format(self.test_coin_from.name)) logging.info(f"---------- Test {self.test_coin_from.name} hdwallet")
swap_client = self.swap_clients[0] swap_client = self.swap_clients[0]
# Run initialiseWallet to set 'main_wallet_seedid_' # Run initialiseWallet to set 'main_wallet_seedid_'
@@ -349,7 +349,7 @@ class Test(BaseTest):
assert swap_client.checkWalletSeed(self.test_coin_from) is True assert swap_client.checkWalletSeed(self.test_coin_from) is True
def test_008_gettxout(self): def test_008_gettxout(self):
logging.info("---------- Test {} gettxout".format(self.test_coin_from.name)) logging.info(f"---------- Test {self.test_coin_from.name} gettxout")
swap_client = self.swap_clients[0] swap_client = self.swap_clients[0]
@@ -428,7 +428,7 @@ class Test(BaseTest):
assert amount_proved >= require_amount assert amount_proved >= require_amount
def test_08_wallet(self): def test_08_wallet(self):
logging.info("---------- Test {} wallet".format(self.test_coin_from.name)) logging.info(f"---------- Test {self.test_coin_from.name} wallet")
logging.info("Test withdrawal") logging.info("Test withdrawal")
addr = self.callnoderpc( addr = self.callnoderpc(
@@ -447,7 +447,7 @@ class Test(BaseTest):
} }
json_rv = read_json_api( json_rv = read_json_api(
TEST_HTTP_PORT + 0, TEST_HTTP_PORT + 0,
"wallets/{}/withdraw".format(self.test_coin_from.name.lower()), f"wallets/{self.test_coin_from.name.lower()}/withdraw",
post_json, post_json,
) )
assert len(json_rv["txid"]) == 64 assert len(json_rv["txid"]) == 64
@@ -458,7 +458,7 @@ class Test(BaseTest):
} }
json_rv = read_json_api( json_rv = read_json_api(
TEST_HTTP_PORT + 0, TEST_HTTP_PORT + 0,
"wallets/{}/createutxo".format(self.test_coin_from.name.lower()), f"wallets/{self.test_coin_from.name.lower()}/createutxo",
post_json, post_json,
) )
assert len(json_rv["txid"]) == 64 assert len(json_rv["txid"]) == 64
@@ -473,6 +473,14 @@ class Test(BaseTest):
ci_from = swap_clients[0].ci(coin_from) ci_from = swap_clients[0].ci(coin_from)
ci_to = swap_clients[1].ci(coin_to) ci_to = swap_clients[1].ci(coin_to)
id_bidder: int = 1
self.prepare_balance(
coin_to,
100.0,
1800 + id_bidder,
1801 if coin_to in (Coins.XMR,) else 1800,
)
swap_value = ci_from.make_int(random.uniform(0.2, 20.0), r=1) swap_value = ci_from.make_int(random.uniform(0.2, 20.0), r=1)
rate_swap = ci_to.make_int(random.uniform(0.2, 20.0), r=1) rate_swap = ci_to.make_int(random.uniform(0.2, 20.0), r=1)
offer_id = swap_clients[0].postOffer( offer_id = swap_clients[0].postOffer(
@@ -506,9 +514,7 @@ class Test(BaseTest):
coin_from = Coins.BTC coin_from = Coins.BTC
coin_to = Coins.FIRO coin_to = Coins.FIRO
logging.info( logging.info(
"---------- Test {} to {} follower recovers coin b lock tx".format( f"---------- Test {coin_from.name} to {coin_to.name} follower recovers coin b lock tx"
coin_from.name, coin_to.name
)
) )
swap_clients = self.swap_clients swap_clients = self.swap_clients
@@ -568,6 +574,14 @@ class Test(BaseTest):
coin_from, coin_to, swap_value, rate_swap, swap_value, swap_type coin_from, coin_to, swap_value, rate_swap, swap_value, swap_type
) )
id_bidder: int = 1
self.prepare_balance(
coin_to,
100.0,
1800 + id_bidder,
1801 if coin_to in (Coins.XMR,) else 1800,
)
wait_for_offer(test_delay_event, swap_clients[1], offer_id) wait_for_offer(test_delay_event, swap_clients[1], offer_id)
offer = swap_clients[1].getOffer(offer_id) offer = swap_clients[1].getOffer(offer_id)
bid_id = swap_clients[1].postBid(offer_id, offer.amount_from) bid_id = swap_clients[1].postBid(offer_id, offer.amount_from)
@@ -592,7 +606,7 @@ class Test(BaseTest):
) )
def test_101_full_swap(self): def test_101_full_swap(self):
logging.info("---------- Test {} to XMR".format(self.test_coin_from.name)) logging.info(f"---------- Test {self.test_coin_from.name} to XMR")
if not self.test_xmr: if not self.test_xmr:
logging.warning("Skipping test") logging.warning("Skipping test")
return return