2023-10-27 14:13:44 -04:00
|
|
|
import bdkpython as bdk
|
|
|
|
import unittest
|
2024-02-08 16:02:15 -05:00
|
|
|
import os
|
2023-10-27 14:13:44 -04:00
|
|
|
|
2024-05-10 10:51:07 -04:00
|
|
|
SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net"
|
|
|
|
TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud"
|
|
|
|
|
2024-02-08 16:02:15 -05:00
|
|
|
class LiveTxBuilderTest(unittest.TestCase):
|
|
|
|
|
|
|
|
def tearDown(self) -> None:
|
2024-05-28 09:36:20 -04:00
|
|
|
if os.path.exists("./bdk_persistence.sqlite"):
|
|
|
|
os.remove("./bdk_persistence.sqlite")
|
2023-10-27 14:13:44 -04:00
|
|
|
|
|
|
|
def test_tx_builder(self):
|
|
|
|
descriptor: bdk.Descriptor = bdk.Descriptor(
|
2024-05-21 10:30:48 -04:00
|
|
|
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
|
2024-05-10 10:51:07 -04:00
|
|
|
bdk.Network.SIGNET
|
2023-10-27 14:13:44 -04:00
|
|
|
)
|
2024-02-08 16:02:15 -05:00
|
|
|
wallet: bdk.Wallet = bdk.Wallet(
|
|
|
|
descriptor,
|
|
|
|
None,
|
2024-05-28 09:36:20 -04:00
|
|
|
"./bdk_persistence.sqlite",
|
2024-05-10 10:51:07 -04:00
|
|
|
bdk.Network.SIGNET
|
2024-02-08 16:02:15 -05:00
|
|
|
)
|
2024-05-10 10:51:07 -04:00
|
|
|
esplora_client: bdk.EsploraClient = bdk.EsploraClient(url = SIGNET_ESPLORA_URL)
|
2024-05-05 20:08:33 -04:00
|
|
|
full_scan_request: bdk.FullScanRequest = wallet.start_full_scan()
|
|
|
|
update = esplora_client.full_scan(
|
|
|
|
full_scan_request=full_scan_request,
|
|
|
|
stop_gap=10,
|
|
|
|
parallel_requests=1
|
2024-02-08 16:02:15 -05:00
|
|
|
)
|
|
|
|
wallet.apply_update(update)
|
2024-05-08 11:33:35 -04:00
|
|
|
wallet.commit()
|
2024-02-08 16:02:15 -05:00
|
|
|
|
2024-05-10 12:45:56 -04:00
|
|
|
self.assertGreater(
|
2024-05-11 14:30:15 -05:00
|
|
|
wallet.get_balance().total.to_sat(),
|
2024-05-10 12:45:56 -04:00
|
|
|
0,
|
2024-06-04 13:25:41 -04:00
|
|
|
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address} and try again."
|
2024-05-10 12:45:56 -04:00
|
|
|
)
|
2024-02-08 16:02:15 -05:00
|
|
|
|
|
|
|
recipient = bdk.Address(
|
2024-05-05 20:08:33 -04:00
|
|
|
address="tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989",
|
2024-05-10 10:51:07 -04:00
|
|
|
network=bdk.Network.SIGNET
|
2024-02-08 16:02:15 -05:00
|
|
|
)
|
|
|
|
|
2024-05-21 10:30:48 -04:00
|
|
|
psbt = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=bdk.Amount.from_sat(4200)).fee_rate(fee_rate=bdk.FeeRate.from_sat_per_vb(2)).finish(wallet)
|
2024-02-08 16:02:15 -05:00
|
|
|
|
|
|
|
self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi")
|
2023-10-27 14:13:44 -04:00
|
|
|
|
2023-12-14 12:19:01 -05:00
|
|
|
def complex_tx_builder(self):
|
|
|
|
descriptor: bdk.Descriptor = bdk.Descriptor(
|
2024-05-21 10:30:48 -04:00
|
|
|
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
|
2024-05-10 10:51:07 -04:00
|
|
|
bdk.Network.SIGNET
|
2023-12-14 12:19:01 -05:00
|
|
|
)
|
2024-02-08 16:02:15 -05:00
|
|
|
wallet: bdk.Wallet = bdk.Wallet(
|
|
|
|
descriptor,
|
2024-05-21 10:30:48 -04:00
|
|
|
None,
|
2024-05-28 09:36:20 -04:00
|
|
|
"./bdk_persistence.sqlite",
|
2024-05-10 10:51:07 -04:00
|
|
|
bdk.Network.SIGNET
|
2024-02-08 16:02:15 -05:00
|
|
|
)
|
2024-05-10 10:51:07 -04:00
|
|
|
esplora_client: bdk.EsploraClient = bdk.EsploraClient(url = SIGNET_ESPLORA_URL)
|
2024-05-05 20:08:33 -04:00
|
|
|
full_scan_request: bdk.FullScanRequest = wallet.start_full_scan()
|
|
|
|
update = esplora_client.full_scan(
|
|
|
|
full_scan_request=full_scan_request,
|
|
|
|
stop_gap=10,
|
|
|
|
parallel_requests=1
|
2024-02-08 16:02:15 -05:00
|
|
|
)
|
|
|
|
wallet.apply_update(update)
|
2024-05-08 11:33:35 -04:00
|
|
|
wallet.commit()
|
2024-02-08 16:02:15 -05:00
|
|
|
|
2024-05-10 12:45:56 -04:00
|
|
|
self.assertGreater(
|
2024-05-11 14:30:15 -05:00
|
|
|
wallet.get_balance().total.to_sat(),
|
2024-05-10 12:45:56 -04:00
|
|
|
0,
|
2024-06-04 13:25:41 -04:00
|
|
|
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address} and try again."
|
2024-05-10 12:45:56 -04:00
|
|
|
)
|
2024-02-08 16:02:15 -05:00
|
|
|
|
|
|
|
recipient1 = bdk.Address(
|
2024-05-05 20:08:33 -04:00
|
|
|
address="tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989",
|
2024-05-10 10:51:07 -04:00
|
|
|
network=bdk.Network.SIGNET
|
2024-02-08 16:02:15 -05:00
|
|
|
)
|
|
|
|
recipient2 = bdk.Address(
|
2024-05-05 20:08:33 -04:00
|
|
|
address="tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6",
|
2024-05-10 10:51:07 -04:00
|
|
|
network=bdk.Network.SIGNET
|
2024-02-08 16:02:15 -05:00
|
|
|
)
|
|
|
|
all_recipients = list(
|
|
|
|
bdk.ScriptAmount(recipient1.script_pubkey, 4200),
|
|
|
|
bdk.ScriptAmount(recipient2.script_pubkey, 4200)
|
|
|
|
)
|
|
|
|
|
2024-04-17 11:34:25 -04:00
|
|
|
psbt: bdk.Psbt = bdk.TxBuilder().set_recipients(all_recipients).fee_rate(fee_rate=bdk.FeeRate.from_sat_per_vb(2)).enable_rbf().finish(wallet)
|
2024-02-08 16:02:15 -05:00
|
|
|
wallet.sign(psbt)
|
|
|
|
|
|
|
|
self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi")
|
2023-12-14 12:19:01 -05:00
|
|
|
|
|
|
|
|
2023-10-27 14:13:44 -04:00
|
|
|
if __name__ == '__main__':
|
|
|
|
unittest.main()
|