test: fix tests to account for persistence

This commit is contained in:
thunderbiscuit 2024-02-08 16:02:15 -05:00
parent 6022a703c6
commit 68a9eb693d
No known key found for this signature in database
GPG Key ID: 88253696EB836462
14 changed files with 565 additions and 418 deletions

View File

@ -1,17 +1,31 @@
package org.bitcoindevkit package org.bitcoindevkit
import org.junit.Test
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import java.io.File
import kotlin.test.AfterTest
import kotlin.test.assertTrue import kotlin.test.assertTrue
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class LiveTxBuilderTest { class LiveTxBuilderTest {
private val persistenceFilePath = InstrumentationRegistry
.getInstrumentation().targetContext.filesDir.path + "/bdk_persistence.db"
@AfterTest
fun cleanup() {
val file = File(persistenceFilePath)
if (file.exists()) {
file.delete()
}
}
@Test @Test
fun testTxBuilder() { fun testTxBuilder() {
val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET) val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
val wallet = Wallet.newNoPersist(descriptor, null, Network.TESTNET) val wallet = Wallet(descriptor, null, persistenceFilePath, Network.TESTNET)
val esploraClient = EsploraClient("https://mempool.space/testnet/api") val esploraClient = EsploraClient("https://esplora.testnet.kuutamo.cloud/")
val update = esploraClient.fullScan(wallet, 10uL, 1uL) val update = esploraClient.fullScan(wallet, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
println("Balance: ${wallet.getBalance().total}") println("Balance: ${wallet.getBalance().total}")
@ -32,8 +46,8 @@ class LiveTxBuilderTest {
fun complexTxBuilder() { fun complexTxBuilder() {
val externalDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET) val externalDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
val changeDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.TESTNET) val changeDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.TESTNET)
val wallet = Wallet.newNoPersist(externalDescriptor, changeDescriptor, Network.TESTNET) val wallet = Wallet(externalDescriptor, changeDescriptor, persistenceFilePath, Network.TESTNET)
val esploraClient = EsploraClient("https://mempool.space/testnet/api") val esploraClient = EsploraClient("https://esplora.testnet.kuutamo.cloud/")
val update = esploraClient.fullScan(wallet, 10uL, 1uL) val update = esploraClient.fullScan(wallet, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
println("Balance: ${wallet.getBalance().total}") println("Balance: ${wallet.getBalance().total}")

View File

@ -2,16 +2,30 @@ package org.bitcoindevkit
import org.junit.Test import org.junit.Test
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.runner.RunWith import org.junit.runner.RunWith
import java.io.File
import kotlin.test.AfterTest
import kotlin.test.assertTrue import kotlin.test.assertTrue
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class LiveWalletTest { class LiveWalletTest {
private val persistenceFilePath = InstrumentationRegistry
.getInstrumentation().targetContext.filesDir.path + "/bdk_persistence.db"
@AfterTest
fun cleanup() {
val file = File(persistenceFilePath)
if (file.exists()) {
file.delete()
}
}
@Test @Test
fun testSyncedBalance() { fun testSyncedBalance() {
val descriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET) val descriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
val wallet: Wallet = Wallet.newNoPersist(descriptor, null, Network.TESTNET) val wallet: Wallet = Wallet(descriptor, null, persistenceFilePath, Network.TESTNET)
val esploraClient: EsploraClient = EsploraClient("https://mempool.space/testnet/api") val esploraClient: EsploraClient = EsploraClient("https://esplora.testnet.kuutamo.cloud/")
val update = esploraClient.fullScan(wallet, 10uL, 1uL) val update = esploraClient.fullScan(wallet, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
println("Balance: ${wallet.getBalance().total}") println("Balance: ${wallet.getBalance().total}")
@ -33,8 +47,8 @@ class LiveWalletTest {
@Test @Test
fun testBroadcastTransaction() { fun testBroadcastTransaction() {
val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET) val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
val wallet = Wallet.newNoPersist(descriptor, null, Network.TESTNET) val wallet = Wallet(descriptor, null, persistenceFilePath, Network.TESTNET)
val esploraClient = EsploraClient("https://mempool.space/testnet/api") val esploraClient = EsploraClient("https://esplora.testnet.kuutamo.cloud/")
val update = esploraClient.fullScan(wallet, 10uL, 1uL) val update = esploraClient.fullScan(wallet, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)

View File

@ -5,10 +5,24 @@ import kotlin.test.assertEquals
import kotlin.test.assertTrue import kotlin.test.assertTrue
import kotlin.test.assertFalse import kotlin.test.assertFalse
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.runner.RunWith import org.junit.runner.RunWith
import java.io.File
import kotlin.test.AfterTest
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class OfflineWalletTest { class OfflineWalletTest {
private val persistenceFilePath = InstrumentationRegistry
.getInstrumentation().targetContext.filesDir.path + "/bdk_persistence.db"
@AfterTest
fun cleanup() {
val file = File(persistenceFilePath)
if (file.exists()) {
file.delete()
}
}
@Test @Test
fun testDescriptorBip86() { fun testDescriptorBip86() {
val mnemonic: Mnemonic = Mnemonic(WordCount.WORDS12) val mnemonic: Mnemonic = Mnemonic(WordCount.WORDS12)
@ -24,9 +38,10 @@ class OfflineWalletTest {
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)", "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
Network.TESTNET Network.TESTNET
) )
val wallet: Wallet = Wallet.newNoPersist( val wallet: Wallet = Wallet(
descriptor, descriptor,
null, null,
persistenceFilePath,
Network.TESTNET Network.TESTNET
) )
val addressInfo: AddressInfo = wallet.getAddress(AddressIndex.New) val addressInfo: AddressInfo = wallet.getAddress(AddressIndex.New)
@ -48,9 +63,10 @@ class OfflineWalletTest {
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)", "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
Network.TESTNET Network.TESTNET
) )
val wallet: Wallet = Wallet.newNoPersist( val wallet: Wallet = Wallet(
descriptor, descriptor,
null, null,
persistenceFilePath,
Network.TESTNET Network.TESTNET
) )

View File

@ -61,8 +61,10 @@ dependencies {
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7")
implementation("net.java.dev.jna:jna:5.14.0") implementation("net.java.dev.jna:jna:5.14.0")
api("org.slf4j:slf4j-api:1.7.30") api("org.slf4j:slf4j-api:1.7.30")
testImplementation("junit:junit:4.13.2")
testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.8.2") // testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.1")
// testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.1")
// testRuntimeOnly("org.junit.vintage:junit-vintage-engine:5.8.2")
testImplementation("ch.qos.logback:logback-classic:1.2.3") testImplementation("ch.qos.logback:logback-classic:1.2.3")
testImplementation("ch.qos.logback:logback-core:1.2.3") testImplementation("ch.qos.logback:logback-core:1.2.3")
} }

View File

@ -1,61 +1,73 @@
package org.bitcoindevkit package org.bitcoindevkit
import kotlin.test.Ignore import java.io.File
import kotlin.test.AfterTest
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertTrue import kotlin.test.assertTrue
class LiveTxBuilderTest { class LiveTxBuilderTest {
@Ignore("The Esplora client's fullScan method requires a Wallet instead of a WalletNoPersist.") private val persistenceFilePath = run {
val currentDirectory = System.getProperty("user.dir")
"$currentDirectory/bdk_persistence.db"
}
@AfterTest
fun cleanup() {
val file = File(persistenceFilePath)
if (file.exists()) {
file.delete()
}
}
@Test @Test
fun testTxBuilder() { fun testTxBuilder() {
val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET) val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
// val wallet = WalletNoPersist(descriptor, null, Network.TESTNET) val wallet = Wallet(descriptor, null, persistenceFilePath, Network.TESTNET)
val esploraClient = EsploraClient("https://mempool.space/testnet/api") val esploraClient = EsploraClient("https://esplora.testnet.kuutamo.cloud/")
// val update = esploraClient.fullScan(wallet, 10uL, 1uL) val update = esploraClient.fullScan(wallet, 10uL, 1uL)
// wallet.applyUpdate(update) wallet.applyUpdate(update)
// println("Balance: ${wallet.getBalance().total}") println("Balance: ${wallet.getBalance().total}")
//
// assert(wallet.getBalance().total > 0uL) assert(wallet.getBalance().total > 0uL)
//
// val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET) val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET)
// val psbt: PartiallySignedTransaction = TxBuilder() val psbt: PartiallySignedTransaction = TxBuilder()
// .addRecipient(recipient.scriptPubkey(), 4200uL) .addRecipient(recipient.scriptPubkey(), 4200uL)
// .feeRate(FeeRate.fromSatPerVb(2.0f)) .feeRate(FeeRate.fromSatPerVb(2.0f))
// .finish(wallet) .finish(wallet)
//
// println(psbt.serialize()) println(psbt.serialize())
//
// assertTrue(psbt.serialize().startsWith("cHNi"), "PSBT should start with 'cHNi'") assertTrue(psbt.serialize().startsWith("cHNi"), "PSBT should start with 'cHNi'")
} }
@Ignore("The Esplora client's fullScan method requires a Wallet instead of a WalletNoPersist.")
@Test @Test
fun complexTxBuilder() { fun complexTxBuilder() {
val externalDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET) val externalDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
val changeDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.TESTNET) val changeDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.TESTNET)
// val wallet = WalletNoPersist(externalDescriptor, changeDescriptor, Network.TESTNET) val wallet = Wallet(externalDescriptor, changeDescriptor, persistenceFilePath, Network.TESTNET)
// val esploraClient = EsploraClient("https://mempool.space/testnet/api") val esploraClient = EsploraClient("https://esplora.testnet.kuutamo.cloud/")
// val update = esploraClient.fullScan(wallet, 10uL, 1uL) val update = esploraClient.fullScan(wallet, 10uL, 1uL)
// wallet.applyUpdate(update) wallet.applyUpdate(update)
// println("Balance: ${wallet.getBalance().total}") println("Balance: ${wallet.getBalance().total}")
//
// assert(wallet.getBalance().total > 0uL) assert(wallet.getBalance().total > 0uL)
//
// val recipient1: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET) val recipient1: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET)
// val recipient2: Address = Address("tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", Network.TESTNET) val recipient2: Address = Address("tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", Network.TESTNET)
// val allRecipients: List<ScriptAmount> = listOf( val allRecipients: List<ScriptAmount> = listOf(
// ScriptAmount(recipient1.scriptPubkey(), 4200uL), ScriptAmount(recipient1.scriptPubkey(), 4200uL),
// ScriptAmount(recipient2.scriptPubkey(), 4200uL), ScriptAmount(recipient2.scriptPubkey(), 4200uL),
// ) )
//
// val psbt: PartiallySignedTransaction = TxBuilder() val psbt: PartiallySignedTransaction = TxBuilder()
// .setRecipients(allRecipients) .setRecipients(allRecipients)
// .feeRate(FeeRate.fromSatPerVb(4.0f)) .feeRate(FeeRate.fromSatPerVb(4.0f))
// .changePolicy(ChangeSpendPolicy.CHANGE_FORBIDDEN) .changePolicy(ChangeSpendPolicy.CHANGE_FORBIDDEN)
// .enableRbf() .enableRbf()
// .finish(wallet) .finish(wallet)
//
// wallet.sign(psbt) wallet.sign(psbt)
// assertTrue(psbt.serialize().startsWith("cHNi"), "PSBT should start with 'cHNi'") assertTrue(psbt.serialize().startsWith("cHNi"), "PSBT should start with 'cHNi'")
} }
} }

View File

@ -1,71 +1,84 @@
package org.bitcoindevkit package org.bitcoindevkit
import kotlin.test.Ignore import java.io.File
import kotlin.test.AfterTest
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertTrue import kotlin.test.assertTrue
class LiveWalletTest { class LiveWalletTest {
@Ignore("The Esplora client's fullScan method requires a Wallet instead of a WalletNoPersist.") private val persistenceFilePath = run {
val currentDirectory = System.getProperty("user.dir")
"$currentDirectory/bdk_persistence.db"
}
@AfterTest
fun cleanup() {
val file = File(persistenceFilePath)
if (file.exists()) {
file.delete()
}
}
@Test @Test
fun testSyncedBalance() { fun testSyncedBalance() {
val descriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET) val descriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
// val wallet: WalletNoPersist = WalletNoPersist(descriptor, null, Network.TESTNET) val wallet: Wallet = Wallet(descriptor, null, persistenceFilePath, Network.TESTNET)
val esploraClient: EsploraClient = EsploraClient("https://mempool.space/testnet/api") val esploraClient: EsploraClient = EsploraClient("https://esplora.testnet.kuutamo.cloud/")
// val esploraClient: EsploraClient = EsploraClient("https://mempool.space/testnet/api")
// val esploraClient = EsploraClient("https://blockstream.info/testnet/api") // val esploraClient = EsploraClient("https://blockstream.info/testnet/api")
// val update = esploraClient.fullScan(wallet, 10uL, 1uL) val update = esploraClient.fullScan(wallet, 10uL, 1uL)
// wallet.applyUpdate(update) wallet.applyUpdate(update)
// println("Balance: ${wallet.getBalance().total}") println("Balance: ${wallet.getBalance().total}")
//
// assert(wallet.getBalance().total > 0uL) assert(wallet.getBalance().total > 0uL)
//
// println("Transactions count: ${wallet.transactions().count()}") println("Transactions count: ${wallet.transactions().count()}")
// val transactions = wallet.transactions().take(3) val transactions = wallet.transactions().take(3)
// for (tx in transactions) { for (tx in transactions) {
// val sentAndReceived = wallet.sentAndReceived(tx) val sentAndReceived = wallet.sentAndReceived(tx)
// println("Transaction: ${tx.txid()}") println("Transaction: ${tx.txid()}")
// println("Sent ${sentAndReceived.sent}") println("Sent ${sentAndReceived.sent}")
// println("Received ${sentAndReceived.received}") println("Received ${sentAndReceived.received}")
// } }
} }
@Ignore("The Esplora client's fullScan method requires a Wallet instead of a WalletNoPersist.")
@Test @Test
fun testBroadcastTransaction() { fun testBroadcastTransaction() {
val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET) val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
// val wallet = WalletNoPersist(descriptor, null, Network.TESTNET) val wallet: Wallet = Wallet(descriptor, null, persistenceFilePath, Network.TESTNET)
val esploraClient = EsploraClient("https://mempool.space/testnet/api") val esploraClient = EsploraClient("https://esplora.testnet.kuutamo.cloud/")
// val update = esploraClient.fullScan(wallet, 10uL, 1uL) val update = esploraClient.fullScan(wallet, 10uL, 1uL)
//
// wallet.applyUpdate(update) wallet.applyUpdate(update)
// println("Balance: ${wallet.getBalance().total}") println("Balance: ${wallet.getBalance().total}")
// println("New address: ${wallet.getAddress(AddressIndex.New).address.asString()}") println("New address: ${wallet.getAddress(AddressIndex.New).address.asString()}")
//
// assert(wallet.getBalance().total > 0uL) { assert(wallet.getBalance().total > 0uL) {
// "Wallet balance must be greater than 0! Please send funds to ${wallet.getAddress(AddressIndex.New).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.getAddress(AddressIndex.New).address} and try again."
// } }
//
// val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET) val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET)
//
// val psbt: PartiallySignedTransaction = TxBuilder() val psbt: PartiallySignedTransaction = TxBuilder()
// .addRecipient(recipient.scriptPubkey(), 4200uL) .addRecipient(recipient.scriptPubkey(), 4200uL)
// .feeRate(FeeRate.fromSatPerVb(2.0f)) .feeRate(FeeRate.fromSatPerVb(2.0f))
// .finish(wallet) .finish(wallet)
//
// println(psbt.serialize()) println(psbt.serialize())
// assertTrue(psbt.serialize().startsWith("cHNi"), "PSBT should start with 'cHNi'") assertTrue(psbt.serialize().startsWith("cHNi"), "PSBT should start with 'cHNi'")
//
// val walletDidSign = wallet.sign(psbt) val walletDidSign = wallet.sign(psbt)
// assertTrue(walletDidSign) assertTrue(walletDidSign)
//
// val tx: Transaction = psbt.extractTx() val tx: Transaction = psbt.extractTx()
// println("Txid is: ${tx.txid()}") println("Txid is: ${tx.txid()}")
//
// val txFee: ULong = wallet.calculateFee(tx) val txFee: ULong = wallet.calculateFee(tx)
// println("Tx fee is: ${txFee}") println("Tx fee is: ${txFee}")
//
// val feeRate: FeeRate = wallet.calculateFeeRate(tx) val feeRate: FeeRate = wallet.calculateFeeRate(tx)
// println("Tx fee rate is: ${feeRate.asSatPerVb()} sat/vB") println("Tx fee rate is: ${feeRate.asSatPerVb()} sat/vB")
//
// esploraClient.broadcast(tx) esploraClient.broadcast(tx)
} }
} }

View File

@ -1,11 +1,26 @@
package org.bitcoindevkit package org.bitcoindevkit
import java.io.File
import kotlin.test.AfterTest
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertTrue import kotlin.test.assertTrue
import kotlin.test.assertFalse import kotlin.test.assertFalse
class OfflineWalletTest { class OfflineWalletTest {
private val persistenceFilePath = run {
val currentDirectory = System.getProperty("user.dir")
"$currentDirectory/bdk_persistence.db"
}
@AfterTest
fun cleanup() {
val file = File(persistenceFilePath)
if (file.exists()) {
file.delete()
}
}
@Test @Test
fun testDescriptorBip86() { fun testDescriptorBip86() {
val mnemonic: Mnemonic = Mnemonic(WordCount.WORDS12) val mnemonic: Mnemonic = Mnemonic(WordCount.WORDS12)
@ -21,22 +36,23 @@ class OfflineWalletTest {
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)", "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
Network.TESTNET Network.TESTNET
) )
// val wallet: Wallet = WalletNoPersist( val wallet: Wallet = Wallet(
// descriptor, descriptor,
// null, null,
// Network.TESTNET persistenceFilePath,
// ) Network.TESTNET
// val addressInfo: AddressInfo = wallet.getAddress(AddressIndex.New) )
// val addressInfo: AddressInfo = wallet.getAddress(AddressIndex.New)
// assertTrue(addressInfo.address.isValidForNetwork(Network.TESTNET), "Address is not valid for testnet network")
// assertTrue(addressInfo.address.isValidForNetwork(Network.SIGNET), "Address is not valid for signet network") assertTrue(addressInfo.address.isValidForNetwork(Network.TESTNET), "Address is not valid for testnet network")
// assertFalse(addressInfo.address.isValidForNetwork(Network.REGTEST), "Address is valid for regtest network, but it shouldn't be") assertTrue(addressInfo.address.isValidForNetwork(Network.SIGNET), "Address is not valid for signet network")
// assertFalse(addressInfo.address.isValidForNetwork(Network.BITCOIN), "Address is valid for bitcoin network, but it shouldn't be") assertFalse(addressInfo.address.isValidForNetwork(Network.REGTEST), "Address is valid for regtest network, but it shouldn't be")
// assertFalse(addressInfo.address.isValidForNetwork(Network.BITCOIN), "Address is valid for bitcoin network, but it shouldn't be")
// assertEquals(
// expected = "tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e", assertEquals(
// actual = addressInfo.address.asString() expected = "tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e",
// ) actual = addressInfo.address.asString()
)
} }
@Test @Test
@ -45,15 +61,16 @@ class OfflineWalletTest {
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)", "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
Network.TESTNET Network.TESTNET
) )
// val wallet: WalletNoPersist = WalletNoPersist( val wallet: Wallet = Wallet(
// descriptor, descriptor,
// null, null,
// Network.TESTNET persistenceFilePath,
// ) Network.TESTNET
)
// assertEquals( assertEquals(
// expected = 0uL, expected = 0uL,
// actual = wallet.getBalance().total actual = wallet.getBalance().total
// ) )
} }
} }

View File

@ -1,37 +1,42 @@
import bdkpython as bdk import bdkpython as bdk
import unittest import unittest
import os
class TestLiveTxBuilder(unittest.TestCase): class LiveTxBuilderTest(unittest.TestCase):
def tearDown(self) -> None:
if os.path.exists("./bdk_persistence.db"):
os.remove("./bdk_persistence.db")
def test_tx_builder(self): def test_tx_builder(self):
descriptor: bdk.Descriptor = bdk.Descriptor( descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)", "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
bdk.Network.TESTNET bdk.Network.TESTNET
) )
# wallet: bdk.Wallet = bdk.Wallet.new_no_persist( wallet: bdk.Wallet = bdk.Wallet(
# descriptor, descriptor,
# None, None,
# bdk.Network.TESTNET "./bdk_persistence.db",
# ) bdk.Network.TESTNET
# esploraClient: bdk.EsploraClient = bdk.EsploraClient(url = "https://mempool.space/testnet/api") )
# update = esploraClient.full_scan( esploraClient: bdk.EsploraClient = bdk.EsploraClient(url = "https://esplora.testnet.kuutamo.cloud/")
# wallet = wallet, update = esploraClient.full_scan(
# stop_gap = 10, wallet = wallet,
# parallel_requests = 1 stop_gap = 10,
# ) parallel_requests = 1
# wallet.apply_update(update) )
# wallet.apply_update(update)
# self.assertGreater(wallet.get_balance().total, 0)
# self.assertGreater(wallet.get_balance().total, 0)
# recipient = bdk.Address(
# address = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", recipient = bdk.Address(
# network = bdk.Network.TESTNET address = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989",
# ) network = bdk.Network.TESTNET
# )
# psbt = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=4200).fee_rate(fee_rate=bdk.FeeRate.from_sat_per_vb(2.0)).finish(wallet)
# # print(psbt.serialize()) psbt = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=4200).fee_rate(fee_rate=bdk.FeeRate.from_sat_per_vb(2.0)).finish(wallet)
#
# self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi") self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi")
def complex_tx_builder(self): def complex_tx_builder(self):
descriptor: bdk.Descriptor = bdk.Descriptor( descriptor: bdk.Descriptor = bdk.Descriptor(
@ -42,38 +47,39 @@ class TestLiveTxBuilder(unittest.TestCase):
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)", "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/1/*)",
bdk.Network.TESTNET bdk.Network.TESTNET
) )
# wallet: bdk.Wallet = bdk.Wallet.new_no_persist( wallet: bdk.Wallet = bdk.Wallet(
# descriptor, descriptor,
# change_descriptor, change_descriptor,
# bdk.Network.TESTNET "./bdk_persistence.db",
# ) bdk.Network.TESTNET
# esploraClient: bdk.EsploraClient = bdk.EsploraClient(url = "https://mempool.space/testnet/api") )
# update = esploraClient.full_scan( esploraClient: bdk.EsploraClient = bdk.EsploraClient(url = "https://esplora.testnet.kuutamo.cloud/")
# wallet = wallet, update = esploraClient.full_scan(
# stop_gap = 10, wallet = wallet,
# parallel_requests = 1 stop_gap = 10,
# ) parallel_requests = 1
# wallet.apply_update(update) )
# wallet.apply_update(update)
# self.assertGreater(wallet.get_balance().total, 0)
# self.assertGreater(wallet.get_balance().total, 0)
# recipient1 = bdk.Address(
# address = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", recipient1 = bdk.Address(
# network = bdk.Network.TESTNET address = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989",
# ) network = bdk.Network.TESTNET
# recipient2 = bdk.Address( )
# address = "tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", recipient2 = bdk.Address(
# network = bdk.Network.TESTNET address = "tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6",
# ) network = bdk.Network.TESTNET
# all_recipients = list( )
# bdk.ScriptAmount(recipient1.script_pubkey, 4200), all_recipients = list(
# bdk.ScriptAmount(recipient2.script_pubkey, 4200) bdk.ScriptAmount(recipient1.script_pubkey, 4200),
# ) bdk.ScriptAmount(recipient2.script_pubkey, 4200)
# )
# psbt: bdk.PartiallySignedTransaction = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=4200).fee_rate(fee_rate=bdk.FeeRate.from_sat_per_vb(2.0)).finish(wallet)
# wallet.sign(psbt) psbt: bdk.PartiallySignedTransaction = bdk.TxBuilder().set_recipients(all_recipients).fee_rate(fee_rate=bdk.FeeRate.from_sat_per_vb(2.0)).enable_rbf().finish(wallet)
# wallet.sign(psbt)
# self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi")
self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi")
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -1,35 +1,41 @@
import bdkpython as bdk import bdkpython as bdk
import unittest import unittest
import os
class TestLiveWallet(unittest.TestCase): class LiveWalletTest(unittest.TestCase):
def tearDown(self) -> None:
if os.path.exists("./bdk_persistence.db"):
os.remove("./bdk_persistence.db")
def test_synced_balance(self): def test_synced_balance(self):
descriptor: bdk.Descriptor = bdk.Descriptor( descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
bdk.Network.TESTNET bdk.Network.TESTNET
) )
# wallet: bdk.Wallet = bdk.Wallet.new_no_persist( wallet: bdk.Wallet = bdk.Wallet(
# descriptor, descriptor,
# None, None,
# bdk.Network.TESTNET "./bdk_persistence.db",
# ) bdk.Network.TESTNET
# esploraClient: bdk.EsploraClient = bdk.EsploraClient(url = "https://mempool.space/testnet/api") )
# update = esploraClient.full_scan( esploraClient: bdk.EsploraClient = bdk.EsploraClient(url = "https://esplora.testnet.kuutamo.cloud/")
# wallet = wallet, update = esploraClient.full_scan(
# stop_gap = 10, wallet = wallet,
# parallel_requests = 1 stop_gap = 10,
# ) parallel_requests = 1
# wallet.apply_update(update) )
# wallet.apply_update(update)
# self.assertGreater(wallet.get_balance().total, 0)
# self.assertGreater(wallet.get_balance().total, 0)
# print(f"Transactions count: {len(wallet.transactions())}")
# transactions = wallet.transactions()[:3] print(f"Transactions count: {len(wallet.transactions())}")
# for tx in transactions: transactions = wallet.transactions()[:3]
# sent_and_received = wallet.sent_and_received(tx) for tx in transactions:
# print(f"Transaction: {tx.txid()}") sent_and_received = wallet.sent_and_received(tx)
# print(f"Sent {sent_and_received.sent}") print(f"Transaction: {tx.txid()}")
# print(f"Received {sent_and_received.received}") print(f"Sent {sent_and_received.sent}")
print(f"Received {sent_and_received.received}")
def test_broadcast_transaction(self): def test_broadcast_transaction(self):
@ -37,40 +43,41 @@ class TestLiveWallet(unittest.TestCase):
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
bdk.Network.TESTNET bdk.Network.TESTNET
) )
# wallet: bdk.Wallet = bdk.Wallet.new_no_persist( wallet: bdk.Wallet = bdk.Wallet(
# descriptor, descriptor,
# None, None,
# bdk.Network.TESTNET "./bdk_persistence.db",
# ) bdk.Network.TESTNET
# esploraClient: bdk.EsploraClient = bdk.EsploraClient(url = "https://mempool.space/testnet/api") )
# update = esploraClient.full_scan( esploraClient: bdk.EsploraClient = bdk.EsploraClient(url = "https://esplora.testnet.kuutamo.cloud/")
# wallet = wallet, update = esploraClient.full_scan(
# stop_gap = 10, wallet = wallet,
# parallel_requests = 1 stop_gap = 10,
# ) parallel_requests = 1
# wallet.apply_update(update) )
# wallet.apply_update(update)
# self.assertGreater(wallet.get_balance().total, 0)
# self.assertGreater(wallet.get_balance().total, 0)
# recipient = bdk.Address(
# address = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", recipient = bdk.Address(
# network = bdk.Network.TESTNET address = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989",
# ) network = bdk.Network.TESTNET
# )
# psbt = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=4200).fee_rate(fee_rate=bdk.FeeRate.from_sat_per_vb(2.0)).finish(wallet)
# # print(psbt.serialize()) psbt = bdk.TxBuilder().add_recipient(script=recipient.script_pubkey(), amount=4200).fee_rate(fee_rate=bdk.FeeRate.from_sat_per_vb(2.0)).finish(wallet)
# self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi") # print(psbt.serialize())
# self.assertTrue(psbt.serialize().startswith("cHNi"), "The PSBT should start with cHNi")
# walletDidSign = wallet.sign(psbt)
# self.assertTrue(walletDidSign) walletDidSign = wallet.sign(psbt)
# tx = psbt.extract_tx() self.assertTrue(walletDidSign)
# print(f"Transaction Id: {tx.txid}") tx = psbt.extract_tx()
# fee = wallet.calculate_fee(tx) print(f"Transaction Id: {tx.txid()}")
# print(f"Transaction Fee: {fee}") fee = wallet.calculate_fee(tx)
# fee_rate = wallet.calculate_fee_rate(tx) print(f"Transaction Fee: {fee}")
# print(f"Transaction Fee Rate: {fee_rate.as_sat_per_vb()} sat/vB") fee_rate = wallet.calculate_fee_rate(tx)
# print(f"Transaction Fee Rate: {fee_rate.as_sat_per_vb()} sat/vB")
# esploraClient.broadcast(tx)
esploraClient.broadcast(tx)
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -1,7 +1,7 @@
import bdkpython as bdk import bdkpython as bdk
import unittest import unittest
class TestSimpleWallet(unittest.TestCase): class OfflineDescriptorTest(unittest.TestCase):
def test_descriptor_bip86(self): def test_descriptor_bip86(self):
mnemonic: bdk.Mnemonic = bdk.Mnemonic.from_string("space echo position wrist orient erupt relief museum myself grain wisdom tumble") mnemonic: bdk.Mnemonic = bdk.Mnemonic.from_string("space echo position wrist orient erupt relief museum myself grain wisdom tumble")

View File

@ -1,39 +1,46 @@
import bdkpython as bdk import bdkpython as bdk
import unittest import unittest
import os
class TestSimpleWallet(unittest.TestCase): class OfflineWalletTest(unittest.TestCase):
def tearDown(self) -> None:
if os.path.exists("./bdk_persistence.db"):
os.remove("./bdk_persistence.db")
def test_new_address(self): def test_new_address(self):
descriptor: bdk.Descriptor = bdk.Descriptor( descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)", "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
bdk.Network.TESTNET bdk.Network.TESTNET
) )
# wallet: Wallet = bdk.Wallet.new_no_persist( wallet: Wallet = bdk.Wallet(
# descriptor, descriptor,
# None, None,
# bdk.Network.TESTNET "./bdk_persistence.db",
# ) bdk.Network.TESTNET
# address_info: bdk.AddressInfo = wallet.get_address(bdk.AddressIndex.NEW()) )
# address_info: bdk.AddressInfo = wallet.get_address(bdk.AddressIndex.NEW())
# self.assertTrue(address_info.address.is_valid_for_network(bdk.Network.TESTNET), "Address is not valid for testnet network")
# self.assertTrue(address_info.address.is_valid_for_network(bdk.Network.SIGNET), "Address is not valid for signet network") self.assertTrue(address_info.address.is_valid_for_network(bdk.Network.TESTNET), "Address is not valid for testnet network")
# self.assertFalse(address_info.address.is_valid_for_network(bdk.Network.REGTEST), "Address is valid for regtest network, but it shouldn't be") self.assertTrue(address_info.address.is_valid_for_network(bdk.Network.SIGNET), "Address is not valid for signet network")
# self.assertFalse(address_info.address.is_valid_for_network(bdk.Network.BITCOIN), "Address is valid for bitcoin network, but it shouldn't be") self.assertFalse(address_info.address.is_valid_for_network(bdk.Network.REGTEST), "Address is valid for regtest network, but it shouldn't be")
# self.assertFalse(address_info.address.is_valid_for_network(bdk.Network.BITCOIN), "Address is valid for bitcoin network, but it shouldn't be")
# self.assertEqual("tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e", address_info.address.as_string())
# self.assertEqual("tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e", address_info.address.as_string())
# def test_balance(self):
# descriptor: bdk.Descriptor = bdk.Descriptor( def test_balance(self):
# "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)", descriptor: bdk.Descriptor = bdk.Descriptor(
# bdk.Network.TESTNET "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
# ) bdk.Network.TESTNET
# wallet: bdk.Wallet = bdk.Wallet.new_no_persist( )
# descriptor, wallet: bdk.Wallet = bdk.Wallet(
# None, descriptor,
# bdk.Network.TESTNET None,
# ) "./bdk_persistence.db",
# bdk.Network.TESTNET
# self.assertEqual(wallet.get_balance().total, 0) )
self.assertEqual(wallet.get_balance().total, 0)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -2,34 +2,46 @@ import XCTest
@testable import BitcoinDevKit @testable import BitcoinDevKit
final class LiveTxBuilderTests: XCTestCase { final class LiveTxBuilderTests: XCTestCase {
override func tearDownWithError() throws {
let fileManager = FileManager.default
let dbFileName = "bdk_persistence.db"
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
let dbFilePath: URL = documentDirectory.appendingPathComponent(dbFileName)
if fileManager.fileExists(atPath: dbFilePath.path) {
try fileManager.removeItem(at: dbFilePath)
}
}
func testTxBuilder() throws { func testTxBuilder() throws {
let descriptor = try Descriptor( let descriptor = try Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.testnet network: Network.testnet
) )
// let wallet = try Wallet.newNoPersist( let wallet = try Wallet(
// descriptor: descriptor, descriptor: descriptor,
// changeDescriptor: nil, changeDescriptor: nil,
// network: .testnet persistenceBackendPath: "bdk_persistence.db",
// ) network: .testnet
// let esploraClient = EsploraClient(url: "https://mempool.space/testnet/api") )
// let update = try esploraClient.fullScan( let esploraClient = EsploraClient(url: "https://esplora.testnet.kuutamo.cloud/")
// wallet: wallet, let update = try esploraClient.fullScan(
// stopGap: 10, wallet: wallet,
// parallelRequests: 1 stopGap: 10,
// ) parallelRequests: 1
// try wallet.applyUpdate(update: update) )
// try wallet.applyUpdate(update: update)
// XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0), "Wallet must have positive balance, please add funds")
// XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0), "Wallet must have positive balance, please add funds")
// let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .testnet)
// let psbt: PartiallySignedTransaction = try TxBuilder() let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .testnet)
// .addRecipient(script: recipient.scriptPubkey(), amount: 4200) let psbt: PartiallySignedTransaction = try TxBuilder()
// .feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 2.0)) .addRecipient(script: recipient.scriptPubkey(), amount: 4200)
// .finish(wallet: wallet) .feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 2.0))
// .finish(wallet: wallet)
// print(psbt.serialize())
// XCTAssertTrue(psbt.serialize().hasPrefix("cHNi"), "PSBT should start with cHNI") print(psbt.serialize())
XCTAssertTrue(psbt.serialize().hasPrefix("cHNi"), "PSBT should start with cHNI")
} }
func testComplexTxBuilder() throws { func testComplexTxBuilder() throws {
@ -41,37 +53,38 @@ final class LiveTxBuilderTests: XCTestCase {
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
network: Network.testnet network: Network.testnet
) )
// let wallet = try Wallet.newNoPersist( let wallet = try Wallet(
// descriptor: descriptor, descriptor: descriptor,
// changeDescriptor: changeDescriptor, changeDescriptor: changeDescriptor,
// network: .testnet persistenceBackendPath: "bdk_persistence.db",
// ) network: .testnet
// let esploraClient = EsploraClient(url: "https://mempool.space/testnet/api") )
// let update = try esploraClient.fullScan( let esploraClient = EsploraClient(url: "https://esplora.testnet.kuutamo.cloud/")
// wallet: wallet, let update = try esploraClient.fullScan(
// stopGap: 10, wallet: wallet,
// parallelRequests: 1 stopGap: 10,
// ) parallelRequests: 1
// try wallet.applyUpdate(update: update) )
// try wallet.applyUpdate(update: update)
// XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0), "Wallet must have positive balance, please add funds")
// XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0), "Wallet must have positive balance, please add funds")
// let recipient1: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .testnet)
// let recipient2: Address = try Address(address: "tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", network: .testnet) let recipient1: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .testnet)
// let allRecipients: [ScriptAmount] = [ let recipient2: Address = try Address(address: "tb1qw2c3lxufxqe2x9s4rdzh65tpf4d7fssjgh8nv6", network: .testnet)
// ScriptAmount(script: recipient1.scriptPubkey(), amount: 4200), let allRecipients: [ScriptAmount] = [
// ScriptAmount(script: recipient2.scriptPubkey(), amount: 4200) ScriptAmount(script: recipient1.scriptPubkey(), amount: 4200),
// ] ScriptAmount(script: recipient2.scriptPubkey(), amount: 4200)
// ]
// let psbt: PartiallySignedTransaction = try TxBuilder()
// .setRecipients(recipients: allRecipients) let psbt: PartiallySignedTransaction = try TxBuilder()
// .feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 4.0)) .setRecipients(recipients: allRecipients)
// .changePolicy(changePolicy: ChangeSpendPolicy.changeForbidden) .feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 4.0))
// .enableRbf() .changePolicy(changePolicy: ChangeSpendPolicy.changeForbidden)
// .finish(wallet: wallet) .enableRbf()
// .finish(wallet: wallet)
// try! wallet.sign(psbt: psbt)
// try! wallet.sign(psbt: psbt)
// XCTAssertTrue(psbt.serialize().hasPrefix("cHNi"), "PSBT should start with cHNI")
XCTAssertTrue(psbt.serialize().hasPrefix("cHNi"), "PSBT should start with cHNI")
} }
} }

View File

@ -2,34 +2,46 @@ import XCTest
@testable import BitcoinDevKit @testable import BitcoinDevKit
final class LiveWalletTests: XCTestCase { final class LiveWalletTests: XCTestCase {
override func tearDownWithError() throws {
let fileManager = FileManager.default
let dbFileName = "bdk_persistence.db"
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
let dbFilePath: URL = documentDirectory.appendingPathComponent(dbFileName)
if fileManager.fileExists(atPath: dbFilePath.path) {
try fileManager.removeItem(at: dbFilePath)
}
}
func testSyncedBalance() throws { func testSyncedBalance() throws {
let descriptor = try Descriptor( let descriptor = try Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.testnet network: Network.testnet
) )
// let wallet = try Wallet.newNoPersist( let wallet = try Wallet(
// descriptor: descriptor, descriptor: descriptor,
// changeDescriptor: nil, changeDescriptor: nil,
// network: .testnet persistenceBackendPath: "bdk_persistence.db",
// ) network: .testnet
// let esploraClient = EsploraClient(url: "https://mempool.space/testnet/api") )
// let update = try esploraClient.fullScan( let esploraClient = EsploraClient(url: "https://esplora.testnet.kuutamo.cloud/")
// wallet: wallet, let update = try esploraClient.fullScan(
// stopGap: 10, wallet: wallet,
// parallelRequests: 1 stopGap: 10,
// ) parallelRequests: 1
// try wallet.applyUpdate(update: update) )
// try wallet.applyUpdate(update: update)
// XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0))
// XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0))
// print("Transactions count: \(wallet.transactions().count)")
// let transactions = wallet.transactions().prefix(3) print("Transactions count: \(wallet.transactions().count)")
// for tx in transactions { let transactions = wallet.transactions().prefix(3)
// let sentAndReceived = wallet.sentAndReceived(tx: tx) for tx in transactions {
// print("Transaction: \(tx.txid())") let sentAndReceived = wallet.sentAndReceived(tx: tx)
// print("Sent \(sentAndReceived.sent)") print("Transaction: \(tx.txid())")
// print("Received \(sentAndReceived.received)") print("Sent \(sentAndReceived.sent)")
// } print("Received \(sentAndReceived.received)")
}
} }
func testBroadcastTransaction() throws { func testBroadcastTransaction() throws {
@ -37,43 +49,44 @@ final class LiveWalletTests: XCTestCase {
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.testnet network: Network.testnet
) )
// let wallet = try Wallet.newNoPersist( let wallet = try Wallet(
// descriptor: descriptor, descriptor: descriptor,
// changeDescriptor: nil, changeDescriptor: nil,
// network: .testnet persistenceBackendPath: "bdk_persistence.db",
// ) network: .testnet
// let esploraClient = EsploraClient(url: "https://mempool.space/testnet/api") )
// let update = try esploraClient.fullScan( let esploraClient = EsploraClient(url: "https://esplora.testnet.kuutamo.cloud/")
// wallet: wallet, let update = try esploraClient.fullScan(
// stopGap: 10, wallet: wallet,
// parallelRequests: 1 stopGap: 10,
// ) parallelRequests: 1
// try wallet.applyUpdate(update: update) )
// try wallet.applyUpdate(update: update)
// XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0), "Wallet must have positive balance, please add funds")
// XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0), "Wallet must have positive balance, please add funds")
// print("Balance: \(wallet.getBalance().total)")
// print("Balance: \(wallet.getBalance().total)")
// let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .testnet)
// let psbt: PartiallySignedTransaction = try let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .testnet)
// TxBuilder() let psbt: PartiallySignedTransaction = try
// .addRecipient(script: recipient.scriptPubkey(), amount: 4200) TxBuilder()
// .feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 2.0)) .addRecipient(script: recipient.scriptPubkey(), amount: 4200)
// .finish(wallet: wallet) .feeRate(feeRate: FeeRate.fromSatPerVb(satPerVb: 2.0))
// .finish(wallet: wallet)
// print(psbt.serialize())
// XCTAssertTrue(psbt.serialize().hasPrefix("cHNi"), "PSBT should start with cHNI") print(psbt.serialize())
// XCTAssertTrue(psbt.serialize().hasPrefix("cHNi"), "PSBT should start with cHNI")
// let walletDidSign: Bool = try wallet.sign(psbt: psbt)
// XCTAssertTrue(walletDidSign, "Wallet did not sign transaction") let walletDidSign: Bool = try wallet.sign(psbt: psbt)
// XCTAssertTrue(walletDidSign, "Wallet did not sign transaction")
// let tx: Transaction = psbt.extractTx()
// print(tx.txid()) let tx: Transaction = psbt.extractTx()
// let fee: UInt64 = try wallet.calculateFee(tx: tx) print(tx.txid())
// print("Transaction Fee: \(fee)") let fee: UInt64 = try wallet.calculateFee(tx: tx)
// let feeRate: FeeRate = try wallet.calculateFeeRate(tx: tx) print("Transaction Fee: \(fee)")
// print("Transaction Fee Rate: \(feeRate.asSatPerVb()) sat/vB") let feeRate: FeeRate = try wallet.calculateFeeRate(tx: tx)
// print("Transaction Fee Rate: \(feeRate.asSatPerVb()) sat/vB")
// try esploraClient.broadcast(transaction: tx)
try esploraClient.broadcast(transaction: tx)
} }
} }

View File

@ -2,28 +2,40 @@ import XCTest
@testable import BitcoinDevKit @testable import BitcoinDevKit
final class OfflineWalletTests: XCTestCase { final class OfflineWalletTests: XCTestCase {
override func tearDownWithError() throws {
let fileManager = FileManager.default
let dbFileName = "bdk_persistence.db"
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
let dbFilePath: URL = documentDirectory.appendingPathComponent(dbFileName)
if fileManager.fileExists(atPath: dbFilePath.path) {
try fileManager.removeItem(at: dbFilePath)
}
}
func testNewAddress() throws { func testNewAddress() throws {
let descriptor: Descriptor = try Descriptor( let descriptor: Descriptor = try Descriptor(
descriptor: "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)", descriptor: "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
network: Network.testnet network: Network.testnet
) )
// let wallet: Wallet = try Wallet.newNoPersist( let wallet: Wallet = try Wallet(
// descriptor: descriptor, descriptor: descriptor,
// changeDescriptor: nil, changeDescriptor: nil,
// network: .testnet persistenceBackendPath: "bdk_persistence.db",
// ) network: .testnet
// let addressInfo: AddressInfo = wallet.getAddress(addressIndex: AddressIndex.new) )
// let addressInfo: AddressInfo = wallet.getAddress(addressIndex: AddressIndex.new)
// XCTAssertTrue(addressInfo.address.isValidForNetwork(network: Network.testnet),
// "Address is not valid for testnet network") XCTAssertTrue(addressInfo.address.isValidForNetwork(network: Network.testnet),
// XCTAssertTrue(addressInfo.address.isValidForNetwork(network: Network.signet), "Address is not valid for testnet network")
// "Address is not valid for signet network") XCTAssertTrue(addressInfo.address.isValidForNetwork(network: Network.signet),
// XCTAssertFalse(addressInfo.address.isValidForNetwork(network: Network.regtest), "Address is not valid for signet network")
// "Address is valid for regtest network, but it shouldn't be") XCTAssertFalse(addressInfo.address.isValidForNetwork(network: Network.regtest),
// XCTAssertFalse(addressInfo.address.isValidForNetwork(network: Network.bitcoin), "Address is valid for regtest network, but it shouldn't be")
// "Address is valid for bitcoin network, but it shouldn't be") XCTAssertFalse(addressInfo.address.isValidForNetwork(network: Network.bitcoin),
// "Address is valid for bitcoin network, but it shouldn't be")
// XCTAssertEqual(addressInfo.address.asString(), "tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e")
XCTAssertEqual(addressInfo.address.asString(), "tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e")
} }
func testBalance() throws { func testBalance() throws {
@ -31,12 +43,13 @@ final class OfflineWalletTests: XCTestCase {
descriptor: "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)", descriptor: "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
network: Network.testnet network: Network.testnet
) )
// let wallet: Wallet = try Wallet.newNoPersist( let wallet: Wallet = try Wallet(
// descriptor: descriptor, descriptor: descriptor,
// changeDescriptor: nil, changeDescriptor: nil,
// network: .testnet persistenceBackendPath: "bdk_persistence.db",
// ) network: .testnet
// )
// XCTAssertEqual(wallet.getBalance().total, 0)
XCTAssertEqual(wallet.getBalance().total, 0)
} }
} }