test: fix tests to account for persistence
This commit is contained in:
parent
6022a703c6
commit
68a9eb693d
@ -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}")
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
|
@ -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'")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
// )
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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__':
|
||||||
|
@ -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__':
|
||||||
|
@ -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")
|
||||||
|
@ -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()
|
||||||
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user