Skip to content

Commit bbc6e1a

Browse files
test: add tests for more advanced txbuilder operations
1 parent 252bcaa commit bbc6e1a

File tree

6 files changed

+148
-4
lines changed

6 files changed

+148
-4
lines changed

bdk-android/lib/src/androidTest/kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,34 @@ class LiveTxBuilderTest {
2727
println(psbt.serialize())
2828
assertTrue(psbt.serialize().startsWith("cHNi"), "PSBT should start with 'cHNi'")
2929
}
30+
31+
@Test
32+
fun complexTxBuilder() {
33+
val externalDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
34+
val changeDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.TESTNET)
35+
val wallet = Wallet.newNoPersist(externalDescriptor, changeDescriptor, Network.TESTNET)
36+
val esploraClient = EsploraClient("https://mempool.space/testnet/api")
37+
val update = esploraClient.scan(wallet, 10uL, 1uL)
38+
wallet.applyUpdate(update)
39+
println("Balance: ${wallet.getBalance().total}")
40+
41+
assert(wallet.getBalance().total > 0uL)
42+
43+
val recipient1: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET)
44+
val recipient2: Address = Address("tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", Network.TESTNET)
45+
val allRecipients: List<ScriptAmount> = listOf(
46+
ScriptAmount(recipient1.scriptPubkey(), 4200uL),
47+
ScriptAmount(recipient2.scriptPubkey(), 4200uL),
48+
)
49+
50+
val psbt: PartiallySignedTransaction = TxBuilder()
51+
.setRecipients(allRecipients)
52+
.feeRate(4.0f)
53+
.changePolicy(ChangeSpendPolicy.CHANGE_FORBIDDEN)
54+
.enableRbf()
55+
.finish(wallet)
56+
57+
wallet.sign(psbt)
58+
assertTrue(psbt.serialize().startsWith("cHNi"), "PSBT should start with 'cHNi'")
59+
}
3060
}

bdk-ffi/src/bdk.udl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ interface TxBuilder {
118118

119119
TxBuilder add_recipient(Script script, u64 amount);
120120

121-
TxBuilder set_recipients(sequence<ScriptAmount> script_amount);
121+
TxBuilder set_recipients(sequence<ScriptAmount> recipients);
122122

123123
TxBuilder add_unspendable(OutPoint unspendable);
124124

bdk-jvm/lib/src/test/kotlin/org/bitcoindevkit/LiveTxBuilderTest.kt

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.bitcoindevkit
22

33
import kotlin.test.Test
4-
import kotlin.test.assertEquals
54
import kotlin.test.assertTrue
65

76
class LiveTxBuilderTest {
@@ -26,4 +25,34 @@ class LiveTxBuilderTest {
2625

2726
assertTrue(psbt.serialize().startsWith("cHNi"), "PSBT should start with 'cHNi'")
2827
}
28+
29+
@Test
30+
fun complexTxBuilder() {
31+
val externalDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
32+
val changeDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.TESTNET)
33+
val wallet = Wallet.newNoPersist(externalDescriptor, changeDescriptor, Network.TESTNET)
34+
val esploraClient = EsploraClient("https://mempool.space/testnet/api")
35+
val update = esploraClient.scan(wallet, 10uL, 1uL)
36+
wallet.applyUpdate(update)
37+
println("Balance: ${wallet.getBalance().total}")
38+
39+
assert(wallet.getBalance().total > 0uL)
40+
41+
val recipient1: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET)
42+
val recipient2: Address = Address("tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", Network.TESTNET)
43+
val allRecipients: List<ScriptAmount> = listOf(
44+
ScriptAmount(recipient1.scriptPubkey(), 4200uL),
45+
ScriptAmount(recipient2.scriptPubkey(), 4200uL),
46+
)
47+
48+
val psbt: PartiallySignedTransaction = TxBuilder()
49+
.setRecipients(allRecipients)
50+
.feeRate(4.0f)
51+
.changePolicy(ChangeSpendPolicy.CHANGE_FORBIDDEN)
52+
.enableRbf()
53+
.finish(wallet)
54+
55+
wallet.sign(psbt)
56+
assertTrue(psbt.serialize().startsWith("cHNi"), "PSBT should start with 'cHNi'")
57+
}
2958
}

bdk-python/tests/test_live_tx_builder.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,48 @@ def test_tx_builder(self):
3333

3434
self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi")
3535

36-
36+
def complex_tx_builder(self):
37+
descriptor: bdk.Descriptor = bdk.Descriptor(
38+
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
39+
bdk.Network.TESTNET
40+
)
41+
change_descriptor: bdk.Descriptor = bdk.Descriptor(
42+
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)",
43+
bdk.Network.TESTNET
44+
)
45+
wallet: bdk.Wallet = bdk.Wallet.new_no_persist(
46+
descriptor,
47+
change_descriptor,
48+
bdk.Network.TESTNET
49+
)
50+
esploraClient: bdk.EsploraClient = bdk.EsploraClient(url = "https://mempool.space/testnet/api")
51+
update = esploraClient.scan(
52+
wallet = wallet,
53+
stop_gap = 10,
54+
parallel_requests = 1
55+
)
56+
wallet.apply_update(update)
57+
58+
self.assertGreater(wallet.get_balance().total, 0)
59+
60+
recipient1 = bdk.Address(
61+
address = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989",
62+
network = bdk.Network.TESTNET
63+
)
64+
recipient2 = bdk.Address(
65+
address = "tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6",
66+
network = bdk.Network.TESTNET
67+
)
68+
all_recipients = list(
69+
bdk.ScriptAmount(recipient1.script_pubkey, 4200),
70+
bdk.ScriptAmount(recipient2.script_pubkey, 4200)
71+
)
72+
73+
psbt: bdk.PartiallySignedTransaction = bdk.TxBuilder().set_recipients(all_recipients).fee_rate(4.0).change_policy(bdk.ChangeSpendPolicy.CHANGE_FORBIDDEN).enable_rbf().finish(wallet)
74+
wallet.sign(psbt)
75+
76+
self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi")
77+
78+
3779
if __name__ == '__main__':
3880
unittest.main()

bdk-python/tests/test_live_wallet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def test_broadcast_transaction(self):
4141
)
4242
wallet.apply_update(update)
4343

44-
self.assertGreater(wallet.get_balance().total(), 0)
44+
self.assertGreater(wallet.get_balance().total, 0)
4545

4646
recipient = bdk.Address(
4747
address = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989",

bdk-swift/Tests/BitcoinDevKitTests/LiveTxBuilderTests.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,47 @@ final class LiveTxBuilderTests: XCTestCase {
3131
print(psbt.serialize())
3232
XCTAssertTrue(psbt.serialize().hasPrefix("cHNi"), "PSBT should start with cHNI")
3333
}
34+
35+
func testComplexTxBuilder() throws {
36+
let descriptor = try Descriptor(
37+
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
38+
network: Network.testnet
39+
)
40+
let changeDescriptor = try Descriptor(
41+
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
42+
network: Network.testnet
43+
)
44+
let wallet = try Wallet.newNoPersist(
45+
descriptor: descriptor,
46+
changeDescriptor: changeDescriptor,
47+
network: .testnet
48+
)
49+
let esploraClient = EsploraClient(url: "https://mempool.space/testnet/api")
50+
let update = try esploraClient.scan(
51+
wallet: wallet,
52+
stopGap: 10,
53+
parallelRequests: 1
54+
)
55+
try wallet.applyUpdate(update: update)
56+
57+
XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0), "Wallet must have positive balance, please add funds")
58+
59+
let recipient1: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .testnet)
60+
let recipient2: Address = try Address(address: "tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", network: .testnet)
61+
let allRecipients: [ScriptAmount] = [
62+
ScriptAmount(script: recipient1.scriptPubkey(), amount: 4200),
63+
ScriptAmount(script: recipient2.scriptPubkey(), amount: 4200)
64+
]
65+
66+
let psbt: PartiallySignedTransaction = try TxBuilder()
67+
.setRecipients(recipients: allRecipients)
68+
.feeRate(satPerVbyte: 4.0)
69+
.changePolicy(changePolicy: ChangeSpendPolicy.changeForbidden)
70+
.enableRbf()
71+
.finish(wallet: wallet)
72+
73+
try! wallet.sign(psbt: psbt)
74+
75+
XCTAssertTrue(psbt.serialize().hasPrefix("cHNi"), "PSBT should start with cHNI")
76+
}
3477
}

0 commit comments

Comments
 (0)