test: update tests for alpha 13 release

This commit is contained in:
thunderbiscuit 2024-06-24 10:15:46 -04:00
parent f66f8417cf
commit 3b89af5a6e
No known key found for this signature in database
GPG Key ID: 88253696EB836462
19 changed files with 245 additions and 251 deletions

View File

@ -13,8 +13,9 @@ private const val TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud"
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
class LiveTxBuilderTest { class LiveTxBuilderTest {
private val persistenceFilePath = InstrumentationRegistry private val persistenceFilePath = InstrumentationRegistry.getInstrumentation().targetContext.filesDir.path + "/bdk_persistence3.sqlite"
.getInstrumentation().targetContext.filesDir.path + "/bdk_persistence3.sqlite" private val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.SIGNET)
private val changeDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.SIGNET)
@AfterTest @AfterTest
fun cleanup() { fun cleanup() {
@ -26,16 +27,14 @@ class LiveTxBuilderTest {
@Test @Test
fun testTxBuilder() { fun testTxBuilder() {
val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.SIGNET) val wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
val wallet = Wallet(descriptor, null, persistenceFilePath, Network.SIGNET)
val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL) val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL)
val fullScanRequest: FullScanRequest = wallet.startFullScan() val fullScanRequest: FullScanRequest = wallet.startFullScan()
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL) val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit() println("Balance: ${wallet.balance().total.toSat()}")
println("Balance: ${wallet.getBalance().total.toSat()}")
assert(wallet.getBalance().total.toSat() > 0uL) { assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }
@ -51,17 +50,15 @@ class LiveTxBuilderTest {
@Test @Test
fun complexTxBuilder() { fun complexTxBuilder() {
val externalDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.SIGNET) val wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
val changeDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.SIGNET)
val wallet = Wallet(externalDescriptor, changeDescriptor, persistenceFilePath, Network.SIGNET)
val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL) val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL)
val fullScanRequest: FullScanRequest = wallet.startFullScan() val fullScanRequest: FullScanRequest = wallet.startFullScan()
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL) val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit()
println("Balance: ${wallet.getBalance().total.toSat()}")
assert(wallet.getBalance().total.toSat() > 0uL) { println("Balance: ${wallet.balance().total.toSat()}")
assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }

View File

@ -15,6 +15,8 @@ private const val TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud"
class LiveWalletTest { class LiveWalletTest {
private val persistenceFilePath = InstrumentationRegistry private val persistenceFilePath = InstrumentationRegistry
.getInstrumentation().targetContext.filesDir.path + "/bdk_persistence2.sqlite" .getInstrumentation().targetContext.filesDir.path + "/bdk_persistence2.sqlite"
private val descriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.SIGNET)
private val changeDescriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.SIGNET)
@AfterTest @AfterTest
fun cleanup() { fun cleanup() {
@ -26,18 +28,16 @@ class LiveWalletTest {
@Test @Test
fun testSyncedBalance() { fun testSyncedBalance() {
val descriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.SIGNET) val wallet: Wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
val wallet: Wallet = Wallet(descriptor, null, persistenceFilePath, Network.SIGNET)
val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL) val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL)
val fullScanRequest: FullScanRequest = wallet.startFullScan() val fullScanRequest: FullScanRequest = wallet.startFullScan()
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL) val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit() println("Balance: ${wallet.balance().total.toSat()}")
println("Balance: ${wallet.getBalance().total.toSat()}") val balance: Balance = wallet.balance()
val balance: Balance = wallet.getBalance()
println("Balance: $balance") println("Balance: $balance")
assert(wallet.getBalance().total.toSat() > 0uL) { assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }
@ -45,7 +45,7 @@ class LiveWalletTest {
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.transaction) val sentAndReceived = wallet.sentAndReceived(tx.transaction)
println("Transaction: ${tx.transaction.txid()}") println("Transaction: ${tx.transaction.computeTxid()}")
println("Sent ${sentAndReceived.sent}") println("Sent ${sentAndReceived.sent}")
println("Received ${sentAndReceived.received}") println("Received ${sentAndReceived.received}")
} }
@ -53,16 +53,14 @@ class LiveWalletTest {
@Test @Test
fun testBroadcastTransaction() { fun testBroadcastTransaction() {
val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.SIGNET) val wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
val wallet = Wallet(descriptor, null, persistenceFilePath, Network.SIGNET)
val esploraClient = EsploraClient(SIGNET_ESPLORA_URL) val esploraClient = EsploraClient(SIGNET_ESPLORA_URL)
val fullScanRequest: FullScanRequest = wallet.startFullScan() val fullScanRequest: FullScanRequest = wallet.startFullScan()
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL) val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit() println("Balance: ${wallet.balance().total.toSat()}")
println("Balance: ${wallet.getBalance().total.toSat()}")
assert(wallet.getBalance().total.toSat() > 0uL) { assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }
@ -80,10 +78,10 @@ class LiveWalletTest {
assertTrue(walletDidSign) assertTrue(walletDidSign)
val tx: Transaction = psbt.extractTx() val tx: Transaction = psbt.extractTx()
println("Txid is: ${tx.txid()}") println("Txid is: ${tx.computeTxid()}")
val txFee: ULong = wallet.calculateFee(tx) val txFee: Amount = wallet.calculateFee(tx)
println("Tx fee is: $txFee") println("Tx fee is: ${txFee.toSat()}")
val feeRate: FeeRate = wallet.calculateFeeRate(tx) val feeRate: FeeRate = wallet.calculateFeeRate(tx)
println("Tx fee rate is: ${feeRate.toSatPerVbCeil()} sat/vB") println("Tx fee rate is: ${feeRate.toSatPerVbCeil()} sat/vB")

View File

@ -14,6 +14,8 @@ import kotlin.test.AfterTest
class OfflineWalletTest { class OfflineWalletTest {
private val persistenceFilePath = InstrumentationRegistry private val persistenceFilePath = InstrumentationRegistry
.getInstrumentation().targetContext.filesDir.path + "/bdk_persistence1.sqlite" .getInstrumentation().targetContext.filesDir.path + "/bdk_persistence1.sqlite"
private val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
private val changeDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.TESTNET)
@AfterTest @AfterTest
fun cleanup() { fun cleanup() {
@ -34,14 +36,9 @@ class OfflineWalletTest {
@Test @Test
fun testNewAddress() { fun testNewAddress() {
val descriptor: Descriptor = Descriptor(
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
Network.TESTNET
)
val wallet: Wallet = Wallet( val wallet: Wallet = Wallet(
descriptor, descriptor,
null, changeDescriptor,
persistenceFilePath,
Network.TESTNET Network.TESTNET
) )
val addressInfo: AddressInfo = wallet.revealNextAddress(KeychainKind.EXTERNAL) val addressInfo: AddressInfo = wallet.revealNextAddress(KeychainKind.EXTERNAL)
@ -52,27 +49,22 @@ class OfflineWalletTest {
assertFalse(addressInfo.address.isValidForNetwork(Network.BITCOIN), "Address is valid for bitcoin network, but it shouldn't be") assertFalse(addressInfo.address.isValidForNetwork(Network.BITCOIN), "Address is valid for bitcoin network, but it shouldn't be")
assertEquals( assertEquals(
expected = "tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e", expected = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989",
actual = addressInfo.address.toString() actual = addressInfo.address.toString()
) )
} }
@Test @Test
fun testBalance() { fun testBalance() {
val descriptor: Descriptor = Descriptor(
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
Network.TESTNET
)
val wallet: Wallet = Wallet( val wallet: Wallet = Wallet(
descriptor, descriptor,
null, changeDescriptor,
persistenceFilePath,
Network.TESTNET Network.TESTNET
) )
assertEquals( assertEquals(
expected = 0uL, expected = 0uL,
actual = wallet.getBalance().total.toSat() actual = wallet.balance().total.toSat()
) )
} }
} }

View File

@ -5,21 +5,25 @@ import kotlin.test.Test
private const val SIGNET_ELECTRUM_URL = "ssl://mempool.space:60602" private const val SIGNET_ELECTRUM_URL = "ssl://mempool.space:60602"
class LiveElectrumClientTest { class LiveElectrumClientTest {
@Test private val descriptor: Descriptor = Descriptor(
fun testSyncedBalance() {
val descriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
Network.SIGNET Network.SIGNET
) )
val wallet: Wallet = Wallet.newNoPersist(descriptor, null, Network.SIGNET) private val changeDescriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
Network.SIGNET
)
@Test
fun testSyncedBalance() {
val wallet: Wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
val electrumClient: ElectrumClient = ElectrumClient(SIGNET_ELECTRUM_URL) val electrumClient: ElectrumClient = ElectrumClient(SIGNET_ELECTRUM_URL)
val fullScanRequest: FullScanRequest = wallet.startFullScan() val fullScanRequest: FullScanRequest = wallet.startFullScan()
val update = electrumClient.fullScan(fullScanRequest, 10uL, 10uL, false) val update = electrumClient.fullScan(fullScanRequest, 10uL, 10uL, false)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit() println("Balance: ${wallet.balance().total.toSat()}")
println("Balance: ${wallet.getBalance().total.toSat()}")
assert(wallet.getBalance().total.toSat() > 0uL) { assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }
@ -27,7 +31,7 @@ class LiveElectrumClientTest {
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.transaction) val sentAndReceived = wallet.sentAndReceived(tx.transaction)
println("Transaction: ${tx.transaction.txid()}") println("Transaction: ${tx.transaction.computeTxid()}")
println("Sent ${sentAndReceived.sent.toSat()}") println("Sent ${sentAndReceived.sent.toSat()}")
println("Received ${sentAndReceived.received.toSat()}") println("Received ${sentAndReceived.received.toSat()}")
} }

View File

@ -6,6 +6,14 @@ private const val SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net"
private const val TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud" private const val TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud"
class LiveMemoryWalletTest { class LiveMemoryWalletTest {
private val descriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
Network.SIGNET
)
private val changeDescriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
Network.SIGNET
)
@Test @Test
fun testSyncedBalance() { fun testSyncedBalance() {
@ -13,15 +21,14 @@ class LiveMemoryWalletTest {
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
Network.SIGNET Network.SIGNET
) )
val wallet: Wallet = Wallet.newNoPersist(descriptor, null, Network.SIGNET) val wallet: Wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL) val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL)
val fullScanRequest: FullScanRequest = wallet.startFullScan() val fullScanRequest: FullScanRequest = wallet.startFullScan()
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL) val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit() println("Balance: ${wallet.balance().total.toSat()}")
println("Balance: ${wallet.getBalance().total.toSat()}")
assert(wallet.getBalance().total.toSat() > 0uL) { assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }
@ -29,7 +36,7 @@ class LiveMemoryWalletTest {
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.transaction) val sentAndReceived = wallet.sentAndReceived(tx.transaction)
println("Transaction: ${tx.transaction.txid()}") println("Transaction: ${tx.transaction.computeTxid()}")
println("Sent ${sentAndReceived.sent.toSat()}") println("Sent ${sentAndReceived.sent.toSat()}")
println("Received ${sentAndReceived.received.toSat()}") println("Received ${sentAndReceived.received.toSat()}")
} }
@ -37,15 +44,7 @@ class LiveMemoryWalletTest {
@Test @Test
fun testScriptInspector() { fun testScriptInspector() {
val descriptor: Descriptor = Descriptor( val wallet: Wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
Network.SIGNET
)
val changeDescriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
Network.SIGNET
)
val wallet: Wallet = Wallet.newNoPersist(descriptor, changeDescriptor, Network.SIGNET)
val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL) val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL)
val scriptInspector: FullScriptInspector = FullScriptInspector() val scriptInspector: FullScriptInspector = FullScriptInspector()
@ -53,15 +52,12 @@ class LiveMemoryWalletTest {
val update = esploraClient.fullScan(fullScanRequest, 21uL, 1uL) val update = esploraClient.fullScan(fullScanRequest, 21uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit() println("Balance: ${wallet.balance().total.toSat()}")
println("Balance: ${wallet.getBalance().total.toSat()}")
assert(wallet.getBalance().total.toSat() > 0uL) { assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }
} }
} }
class FullScriptInspector: FullScanScriptInspector { class FullScriptInspector: FullScanScriptInspector {

View File

@ -6,27 +6,35 @@ private const val SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net"
private const val TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud" private const val TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud"
class LiveTransactionTests { class LiveTransactionTests {
private val descriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
Network.SIGNET
)
private val changeDescriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
Network.SIGNET
)
@Test @Test
fun testSyncedBalance() { fun testSyncedBalance() {
val descriptor: Descriptor = Descriptor( val descriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
Network.SIGNET Network.SIGNET
) )
val wallet: Wallet = Wallet.newNoPersist(descriptor, null, Network.SIGNET) val wallet: Wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL) val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL)
val fullScanRequest: FullScanRequest = wallet.startFullScan() val fullScanRequest: FullScanRequest = wallet.startFullScan()
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL) val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit() println("Wallet balance: ${wallet.balance().total.toSat()}")
println("Wallet balance: ${wallet.getBalance().total.toSat()}")
assert(wallet.getBalance().total.toSat() > 0uL) { assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }
val transaction: Transaction = wallet.transactions().first().transaction val transaction: Transaction = wallet.transactions().first().transaction
println("First transaction:") println("First transaction:")
println("Txid: ${transaction.txid()}") println("Txid: ${transaction.computeTxid()}")
println("Version: ${transaction.version()}") println("Version: ${transaction.version()}")
println("Total size: ${transaction.totalSize()}") println("Total size: ${transaction.totalSize()}")
println("Vsize: ${transaction.vsize()}") println("Vsize: ${transaction.vsize()}")

View File

@ -13,6 +13,14 @@ class LiveTxBuilderTest {
val currentDirectory = System.getProperty("user.dir") val currentDirectory = System.getProperty("user.dir")
"$currentDirectory/bdk_persistence.sqlite" "$currentDirectory/bdk_persistence.sqlite"
} }
private val descriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
Network.SIGNET
)
private val changeDescriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
Network.SIGNET
)
@AfterTest @AfterTest
fun cleanup() { fun cleanup() {
@ -25,15 +33,14 @@ class LiveTxBuilderTest {
@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(descriptor, null, persistenceFilePath, Network.SIGNET) val wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
val esploraClient = EsploraClient(SIGNET_ESPLORA_URL) val esploraClient = EsploraClient(SIGNET_ESPLORA_URL)
val fullScanRequest: FullScanRequest = wallet.startFullScan() val fullScanRequest: FullScanRequest = wallet.startFullScan()
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL) val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit() println("Balance: ${wallet.balance().total.toSat()}")
println("Balance: ${wallet.getBalance().total.toSat()}")
assert(wallet.getBalance().total.toSat() > 0uL) { assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }
@ -50,17 +57,14 @@ class LiveTxBuilderTest {
@Test @Test
fun complexTxBuilder() { fun complexTxBuilder() {
val externalDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET) val wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
val changeDescriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)", Network.TESTNET)
val wallet = Wallet(externalDescriptor, changeDescriptor, persistenceFilePath, Network.SIGNET)
val esploraClient = EsploraClient(SIGNET_ESPLORA_URL) val esploraClient = EsploraClient(SIGNET_ESPLORA_URL)
val fullScanRequest: FullScanRequest = wallet.startFullScan() val fullScanRequest: FullScanRequest = wallet.startFullScan()
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL) val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit() println("Balance: ${wallet.balance().total.toSat()}")
println("Balance: ${wallet.getBalance().total.toSat()}")
assert(wallet.getBalance().total.toSat() > 0uL) { assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }

View File

@ -13,6 +13,14 @@ class LiveWalletTest {
val currentDirectory = System.getProperty("user.dir") val currentDirectory = System.getProperty("user.dir")
"$currentDirectory/bdk_persistence.sqlite" "$currentDirectory/bdk_persistence.sqlite"
} }
private val descriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
Network.SIGNET
)
private val changeDescriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
Network.SIGNET
)
@AfterTest @AfterTest
fun cleanup() { fun cleanup() {
@ -24,16 +32,14 @@ class LiveWalletTest {
@Test @Test
fun testSyncedBalance() { fun testSyncedBalance() {
val descriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.SIGNET) val wallet: Wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
val wallet: Wallet = Wallet(descriptor, null, persistenceFilePath, Network.SIGNET)
val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL) val esploraClient: EsploraClient = EsploraClient(SIGNET_ESPLORA_URL)
val fullScanRequest: FullScanRequest = wallet.startFullScan() val fullScanRequest: FullScanRequest = wallet.startFullScan()
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL) val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit() println("Balance: ${wallet.balance().total.toSat()}")
println("Balance: ${wallet.getBalance().total.toSat()}")
assert(wallet.getBalance().total.toSat() > 0uL) { assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }
@ -41,7 +47,7 @@ class LiveWalletTest {
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.transaction) val sentAndReceived = wallet.sentAndReceived(tx.transaction)
println("Transaction: ${tx.transaction.txid()}") println("Transaction: ${tx.transaction.computeTxid()}")
println("Sent ${sentAndReceived.sent}") println("Sent ${sentAndReceived.sent}")
println("Received ${sentAndReceived.received}") println("Received ${sentAndReceived.received}")
} }
@ -50,15 +56,14 @@ class LiveWalletTest {
@Test @Test
fun testBroadcastTransaction() { fun testBroadcastTransaction() {
val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.SIGNET) val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.SIGNET)
val wallet: Wallet = Wallet(descriptor, null, persistenceFilePath, Network.SIGNET) val wallet: Wallet = Wallet(descriptor, changeDescriptor, Network.SIGNET)
val esploraClient = EsploraClient(SIGNET_ESPLORA_URL) val esploraClient = EsploraClient(SIGNET_ESPLORA_URL)
val fullScanRequest: FullScanRequest = wallet.startFullScan() val fullScanRequest: FullScanRequest = wallet.startFullScan()
val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL) val update = esploraClient.fullScan(fullScanRequest, 10uL, 1uL)
wallet.applyUpdate(update) wallet.applyUpdate(update)
wallet.commit() println("Balance: ${wallet.balance().total.toSat()}")
println("Balance: ${wallet.getBalance().total.toSat()}")
assert(wallet.getBalance().total.toSat() > 0uL) { assert(wallet.balance().total.toSat() > 0uL) {
"Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again." "Wallet balance must be greater than 0! Please send funds to ${wallet.revealNextAddress(KeychainKind.EXTERNAL).address} and try again."
} }
@ -76,9 +81,9 @@ class LiveWalletTest {
assertTrue(walletDidSign) assertTrue(walletDidSign)
val tx: Transaction = psbt.extractTx() val tx: Transaction = psbt.extractTx()
println("Txid is: ${tx.txid()}") println("Txid is: ${tx.computeTxid()}")
val txFee: ULong = wallet.calculateFee(tx) val txFee: Amount = 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)

View File

@ -12,6 +12,14 @@ class OfflineWalletTest {
val currentDirectory = System.getProperty("user.dir") val currentDirectory = System.getProperty("user.dir")
"$currentDirectory/bdk_persistence.sqlite" "$currentDirectory/bdk_persistence.sqlite"
} }
private val descriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
Network.TESTNET
)
private val changeDescriptor: Descriptor = Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
Network.TESTNET
)
@AfterTest @AfterTest
fun cleanup() { fun cleanup() {
@ -32,14 +40,9 @@ class OfflineWalletTest {
@Test @Test
fun testNewAddress() { fun testNewAddress() {
val descriptor: Descriptor = Descriptor(
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
Network.TESTNET
)
val wallet: Wallet = Wallet( val wallet: Wallet = Wallet(
descriptor, descriptor,
null, changeDescriptor,
persistenceFilePath,
Network.TESTNET Network.TESTNET
) )
val addressInfo: AddressInfo = wallet.revealNextAddress(KeychainKind.EXTERNAL) val addressInfo: AddressInfo = wallet.revealNextAddress(KeychainKind.EXTERNAL)
@ -50,27 +53,22 @@ class OfflineWalletTest {
assertFalse(addressInfo.address.isValidForNetwork(Network.BITCOIN), "Address is valid for bitcoin network, but it shouldn't be") assertFalse(addressInfo.address.isValidForNetwork(Network.BITCOIN), "Address is valid for bitcoin network, but it shouldn't be")
assertEquals( assertEquals(
expected = "tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e", expected = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989",
actual = addressInfo.address.toString() actual = addressInfo.address.toString()
) )
} }
@Test @Test
fun testBalance() { fun testBalance() {
val descriptor: Descriptor = Descriptor(
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
Network.TESTNET
)
val wallet: Wallet = Wallet( val wallet: Wallet = Wallet(
descriptor, descriptor,
null, changeDescriptor,
persistenceFilePath,
Network.TESTNET Network.TESTNET
) )
assertEquals( assertEquals(
expected = 0uL, expected = 0uL,
actual = wallet.getBalance().total.toSat() actual = wallet.balance().total.toSat()
) )
} }
} }

View File

@ -5,6 +5,15 @@ import os
SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net" SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net"
TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud" TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud"
descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
bdk.Network.TESTNET
)
change_descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
bdk.Network.TESTNET
)
class LiveTxBuilderTest(unittest.TestCase): class LiveTxBuilderTest(unittest.TestCase):
def tearDown(self) -> None: def tearDown(self) -> None:
@ -18,8 +27,7 @@ class LiveTxBuilderTest(unittest.TestCase):
) )
wallet: bdk.Wallet = bdk.Wallet( wallet: bdk.Wallet = bdk.Wallet(
descriptor, descriptor,
None, change_descriptor,
"./bdk_persistence.sqlite",
bdk.Network.SIGNET bdk.Network.SIGNET
) )
esplora_client: bdk.EsploraClient = bdk.EsploraClient(url = SIGNET_ESPLORA_URL) esplora_client: bdk.EsploraClient = bdk.EsploraClient(url = SIGNET_ESPLORA_URL)
@ -30,10 +38,9 @@ class LiveTxBuilderTest(unittest.TestCase):
parallel_requests=1 parallel_requests=1
) )
wallet.apply_update(update) wallet.apply_update(update)
wallet.commit()
self.assertGreater( self.assertGreater(
wallet.get_balance().total.to_sat(), wallet.balance().total.to_sat(),
0, 0,
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address} and try again." f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address} and try again."
) )
@ -48,14 +55,9 @@ class LiveTxBuilderTest(unittest.TestCase):
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(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
bdk.Network.SIGNET
)
wallet: bdk.Wallet = bdk.Wallet( wallet: bdk.Wallet = bdk.Wallet(
descriptor, descriptor,
None, change_descriptor,
"./bdk_persistence.sqlite",
bdk.Network.SIGNET bdk.Network.SIGNET
) )
esplora_client: bdk.EsploraClient = bdk.EsploraClient(url = SIGNET_ESPLORA_URL) esplora_client: bdk.EsploraClient = bdk.EsploraClient(url = SIGNET_ESPLORA_URL)
@ -66,10 +68,9 @@ class LiveTxBuilderTest(unittest.TestCase):
parallel_requests=1 parallel_requests=1
) )
wallet.apply_update(update) wallet.apply_update(update)
wallet.commit()
self.assertGreater( self.assertGreater(
wallet.get_balance().total.to_sat(), wallet.balance().total.to_sat(),
0, 0,
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address} and try again." f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address} and try again."
) )

View File

@ -5,6 +5,15 @@ import os
SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net" SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net"
TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud" TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud"
descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
bdk.Network.TESTNET
)
change_descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
bdk.Network.TESTNET
)
class LiveWalletTest(unittest.TestCase): class LiveWalletTest(unittest.TestCase):
def tearDown(self) -> None: def tearDown(self) -> None:
@ -12,14 +21,9 @@ class LiveWalletTest(unittest.TestCase):
os.remove("./bdk_persistence.sqlite") os.remove("./bdk_persistence.sqlite")
def test_synced_balance(self): def test_synced_balance(self):
descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
bdk.Network.SIGNET
)
wallet: bdk.Wallet = bdk.Wallet( wallet: bdk.Wallet = bdk.Wallet(
descriptor, descriptor,
None, change_descriptor,
"./bdk_persistence.sqlite",
bdk.Network.SIGNET bdk.Network.SIGNET
) )
esplora_client: bdk.EsploraClient = bdk.EsploraClient(url = SIGNET_ESPLORA_URL) esplora_client: bdk.EsploraClient = bdk.EsploraClient(url = SIGNET_ESPLORA_URL)
@ -30,10 +34,9 @@ class LiveWalletTest(unittest.TestCase):
parallel_requests=1 parallel_requests=1
) )
wallet.apply_update(update) wallet.apply_update(update)
wallet.commit()
self.assertGreater( self.assertGreater(
wallet.get_balance().total.to_sat(), wallet.balance().total.to_sat(),
0, 0,
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address} and try again." f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address} and try again."
) )
@ -42,20 +45,15 @@ class LiveWalletTest(unittest.TestCase):
transactions = wallet.transactions()[:3] transactions = wallet.transactions()[:3]
for tx in transactions: for tx in transactions:
sent_and_received = wallet.sent_and_received(tx.transaction) sent_and_received = wallet.sent_and_received(tx.transaction)
print(f"Transaction: {tx.transaction.txid()}") print(f"Transaction: {tx.transaction.compute_txid()}")
print(f"Sent {sent_and_received.sent.to_sat()}") print(f"Sent {sent_and_received.sent.to_sat()}")
print(f"Received {sent_and_received.received.to_sat()}") print(f"Received {sent_and_received.received.to_sat()}")
def test_broadcast_transaction(self): def test_broadcast_transaction(self):
descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
bdk.Network.SIGNET
)
wallet: bdk.Wallet = bdk.Wallet( wallet: bdk.Wallet = bdk.Wallet(
descriptor, descriptor,
None, change_descriptor,
"./bdk_persistence.sqlite",
bdk.Network.SIGNET bdk.Network.SIGNET
) )
esplora_client: bdk.EsploraClient = bdk.EsploraClient(url = SIGNET_ESPLORA_URL) esplora_client: bdk.EsploraClient = bdk.EsploraClient(url = SIGNET_ESPLORA_URL)
@ -66,10 +64,9 @@ class LiveWalletTest(unittest.TestCase):
parallel_requests=1 parallel_requests=1
) )
wallet.apply_update(update) wallet.apply_update(update)
wallet.commit()
self.assertGreater( self.assertGreater(
wallet.get_balance().total.to_sat(), wallet.balance().total.to_sat(),
0, 0,
f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address} and try again." f"Wallet balance must be greater than 0! Please send funds to {wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL).address} and try again."
) )
@ -85,9 +82,9 @@ class LiveWalletTest(unittest.TestCase):
walletDidSign = wallet.sign(psbt) walletDidSign = wallet.sign(psbt)
self.assertTrue(walletDidSign) self.assertTrue(walletDidSign)
tx = psbt.extract_tx() tx = psbt.extract_tx()
print(f"Transaction Id: {tx.txid()}") print(f"Transaction Id: {tx.compute_txid()}")
fee = wallet.calculate_fee(tx) fee = wallet.calculate_fee(tx)
print(f"Transaction Fee: {fee}") print(f"Transaction Fee: {fee.to_sat()}")
fee_rate = wallet.calculate_fee_rate(tx) fee_rate = wallet.calculate_fee_rate(tx)
print(f"Transaction Fee Rate: {fee_rate.to_sat_per_vb_ceil()} sat/vB") print(f"Transaction Fee Rate: {fee_rate.to_sat_per_vb_ceil()} sat/vB")

View File

@ -2,6 +2,15 @@ import bdkpython as bdk
import unittest import unittest
import os import os
descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
bdk.Network.TESTNET
)
change_descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
bdk.Network.TESTNET
)
class OfflineWalletTest(unittest.TestCase): class OfflineWalletTest(unittest.TestCase):
def tearDown(self) -> None: def tearDown(self) -> None:
@ -9,14 +18,9 @@ class OfflineWalletTest(unittest.TestCase):
os.remove("./bdk_persistence.sqlite") os.remove("./bdk_persistence.sqlite")
def test_new_address(self): def test_new_address(self):
descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
bdk.Network.TESTNET
)
wallet: Wallet = bdk.Wallet( wallet: Wallet = bdk.Wallet(
descriptor, descriptor,
None, change_descriptor,
"./bdk_persistence.sqlite",
bdk.Network.TESTNET bdk.Network.TESTNET
) )
address_info: bdk.AddressInfo = wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL) address_info: bdk.AddressInfo = wallet.reveal_next_address(bdk.KeychainKind.EXTERNAL)
@ -26,21 +30,16 @@ class OfflineWalletTest(unittest.TestCase):
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.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.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.__str__()) self.assertEqual("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", address_info.address.__str__())
def test_balance(self): def test_balance(self):
descriptor: bdk.Descriptor = bdk.Descriptor(
"wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
bdk.Network.TESTNET
)
wallet: bdk.Wallet = bdk.Wallet( wallet: bdk.Wallet = bdk.Wallet(
descriptor, descriptor,
None, change_descriptor,
"./bdk_persistence.sqlite",
bdk.Network.TESTNET bdk.Network.TESTNET
) )
self.assertEqual(wallet.get_balance().total.to_sat(), 0) self.assertEqual(wallet.balance().total.to_sat(), 0)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -2,17 +2,21 @@ import XCTest
@testable import BitcoinDevKit @testable import BitcoinDevKit
private let SIGNET_ELECTRUM_URL = "ssl://mempool.space:60602" private let SIGNET_ELECTRUM_URL = "ssl://mempool.space:60602"
private let descriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
private let changeDescriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
network: Network.signet
)
final class LiveElectrumClientTests: XCTestCase { final class LiveElectrumClientTests: XCTestCase {
func testSyncedBalance() throws { func testSyncedBalance() throws {
let descriptor = try Descriptor( let wallet = try Wallet(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
let wallet = try Wallet.newNoPersist(
descriptor: descriptor, descriptor: descriptor,
changeDescriptor: nil, changeDescriptor: changeDescriptor,
network: .signet network: Network.signet
) )
let electrumClient: ElectrumClient = try ElectrumClient(url: SIGNET_ELECTRUM_URL) let electrumClient: ElectrumClient = try ElectrumClient(url: SIGNET_ELECTRUM_URL)
let fullScanRequest: FullScanRequest = wallet.startFullScan() let fullScanRequest: FullScanRequest = wallet.startFullScan()
@ -23,11 +27,10 @@ final class LiveElectrumClientTests: XCTestCase {
fetchPrevTxouts: false fetchPrevTxouts: false
) )
try wallet.applyUpdate(update: update) try wallet.applyUpdate(update: update)
let _ = try wallet.commit() let address = wallet.revealNextAddress(keychain: KeychainKind.external).address
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address
XCTAssertGreaterThan( XCTAssertGreaterThan(
wallet.getBalance().total.toSat(), wallet.balance().total.toSat(),
UInt64(0), UInt64(0),
"Wallet must have positive balance, please send funds to \(address)" "Wallet must have positive balance, please send funds to \(address)"
) )
@ -36,7 +39,7 @@ final class LiveElectrumClientTests: XCTestCase {
let transactions = wallet.transactions().prefix(3) let transactions = wallet.transactions().prefix(3)
for tx in transactions { for tx in transactions {
let sentAndReceived = wallet.sentAndReceived(tx: tx.transaction) let sentAndReceived = wallet.sentAndReceived(tx: tx.transaction)
print("Transaction: \(tx.transaction.txid())") print("Transaction: \(tx.transaction.computeTxid())")
print("Sent \(sentAndReceived.sent.toSat())") print("Sent \(sentAndReceived.sent.toSat())")
print("Received \(sentAndReceived.received.toSat())") print("Received \(sentAndReceived.received.toSat())")
} }

View File

@ -3,17 +3,21 @@ import XCTest
private let SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net" private let SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net"
private let TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud" private let TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud"
private let descriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
private let changeDescriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
network: Network.signet
)
final class LiveMemoryWalletTests: XCTestCase { final class LiveMemoryWalletTests: XCTestCase {
func testSyncedBalance() throws { func testSyncedBalance() throws {
let descriptor = try Descriptor( let wallet = try Wallet(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
let wallet = try Wallet.newNoPersist(
descriptor: descriptor, descriptor: descriptor,
changeDescriptor: nil, changeDescriptor: changeDescriptor,
network: .signet network: .signet
) )
let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL) let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL)
@ -24,11 +28,10 @@ final class LiveMemoryWalletTests: XCTestCase {
parallelRequests: 1 parallelRequests: 1
) )
try wallet.applyUpdate(update: update) try wallet.applyUpdate(update: update)
let _ = try wallet.commit() let address = wallet.revealNextAddress(keychain: KeychainKind.external).address.description
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.description
XCTAssertGreaterThan( XCTAssertGreaterThan(
wallet.getBalance().total.toSat(), wallet.balance().total.toSat(),
UInt64(0), UInt64(0),
"Wallet must have positive balance, please send funds to \(address)" "Wallet must have positive balance, please send funds to \(address)"
) )
@ -37,22 +40,14 @@ final class LiveMemoryWalletTests: XCTestCase {
let transactions = wallet.transactions().prefix(3) let transactions = wallet.transactions().prefix(3)
for tx in transactions { for tx in transactions {
let sentAndReceived = wallet.sentAndReceived(tx: tx.transaction) let sentAndReceived = wallet.sentAndReceived(tx: tx.transaction)
print("Transaction: \(tx.transaction.txid())") print("Transaction: \(tx.transaction.computeTxid())")
print("Sent \(sentAndReceived.sent.toSat())") print("Sent \(sentAndReceived.sent.toSat())")
print("Received \(sentAndReceived.received.toSat())") print("Received \(sentAndReceived.received.toSat())")
} }
} }
func testScriptInspector() throws { func testScriptInspector() throws {
let descriptor = try Descriptor( let wallet = try Wallet(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
let changeDescriptor = try Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
network: Network.signet
)
let wallet = try Wallet.newNoPersist(
descriptor: descriptor, descriptor: descriptor,
changeDescriptor: changeDescriptor, changeDescriptor: changeDescriptor,
network: .signet network: .signet
@ -67,11 +62,10 @@ final class LiveMemoryWalletTests: XCTestCase {
parallelRequests: 1 parallelRequests: 1
) )
try wallet.applyUpdate(update: update) try wallet.applyUpdate(update: update)
let _ = try wallet.commit() let address = wallet.revealNextAddress(keychain: KeychainKind.external).address.description
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.description
XCTAssertGreaterThan( XCTAssertGreaterThan(
wallet.getBalance().total.toSat(), wallet.balance().total.toSat(),
UInt64(0), UInt64(0),
"Wallet must have positive balance, please send funds to \(address)" "Wallet must have positive balance, please send funds to \(address)"
) )

View File

@ -3,16 +3,20 @@ import XCTest
private let SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net" private let SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net"
private let TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud" private let TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud"
private let descriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
private let changeDescriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
network: Network.signet
)
final class LiveTransactionTests: XCTestCase { final class LiveTransactionTests: XCTestCase {
func testSyncedBalance() throws { func testSyncedBalance() throws {
let descriptor = try Descriptor( let wallet = try Wallet(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
let wallet = try Wallet.newNoPersist(
descriptor: descriptor, descriptor: descriptor,
changeDescriptor: nil, changeDescriptor: changeDescriptor,
network: .signet network: .signet
) )
let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL) let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL)
@ -23,11 +27,10 @@ final class LiveTransactionTests: XCTestCase {
parallelRequests: 1 parallelRequests: 1
) )
try wallet.applyUpdate(update: update) try wallet.applyUpdate(update: update)
let _ = try wallet.commit() let address = wallet.revealNextAddress(keychain: KeychainKind.external).address.description
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.description
XCTAssertGreaterThan( XCTAssertGreaterThan(
wallet.getBalance().total.toSat(), wallet.balance().total.toSat(),
UInt64(0), UInt64(0),
"Wallet must have positive balance, please send funds to \(address)" "Wallet must have positive balance, please send funds to \(address)"
) )
@ -37,7 +40,7 @@ final class LiveTransactionTests: XCTestCase {
return return
} }
print("First transaction:") print("First transaction:")
print("Txid: \(transaction.txid())") print("Txid: \(transaction.computeTxid())")
print("Version: \(transaction.version())") print("Version: \(transaction.version())")
print("Total size: \(transaction.totalSize())") print("Total size: \(transaction.totalSize())")
print("Vsize: \(transaction.vsize())") print("Vsize: \(transaction.vsize())")

View File

@ -3,6 +3,14 @@ import XCTest
private let SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net" private let SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net"
private let TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud" private let TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud"
private let descriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
private let changeDescriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
network: Network.signet
)
final class LiveTxBuilderTests: XCTestCase { final class LiveTxBuilderTests: XCTestCase {
var dbFilePath: URL! var dbFilePath: URL!
@ -27,14 +35,9 @@ final class LiveTxBuilderTests: XCTestCase {
} }
func testTxBuilder() throws { func testTxBuilder() throws {
let descriptor = try Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
let wallet = try Wallet( let wallet = try Wallet(
descriptor: descriptor, descriptor: descriptor,
changeDescriptor: nil, changeDescriptor: changeDescriptor,
persistenceBackendPath: dbFilePath.path,
network: .signet network: .signet
) )
let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL) let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL)
@ -45,11 +48,10 @@ final class LiveTxBuilderTests: XCTestCase {
parallelRequests: 1 parallelRequests: 1
) )
try wallet.applyUpdate(update: update) try wallet.applyUpdate(update: update)
let _ = try wallet.commit() let address = wallet.revealNextAddress(keychain: KeychainKind.external).address.description
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.description
XCTAssertGreaterThan( XCTAssertGreaterThan(
wallet.getBalance().total.toSat(), wallet.balance().total.toSat(),
UInt64(0), UInt64(0),
"Wallet must have positive balance, please send funds to \(address)" "Wallet must have positive balance, please send funds to \(address)"
) )
@ -76,7 +78,6 @@ final class LiveTxBuilderTests: XCTestCase {
let wallet = try Wallet( let wallet = try Wallet(
descriptor: descriptor, descriptor: descriptor,
changeDescriptor: changeDescriptor, changeDescriptor: changeDescriptor,
persistenceBackendPath: dbFilePath.path,
network: .signet network: .signet
) )
let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL) let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL)
@ -87,11 +88,10 @@ final class LiveTxBuilderTests: XCTestCase {
parallelRequests: 1 parallelRequests: 1
) )
try wallet.applyUpdate(update: update) try wallet.applyUpdate(update: update)
let _ = try wallet.commit() let address = wallet.revealNextAddress(keychain: KeychainKind.external).address.description
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.description
XCTAssertGreaterThan( XCTAssertGreaterThan(
wallet.getBalance().total.toSat(), wallet.balance().total.toSat(),
UInt64(0), UInt64(0),
"Wallet must have positive balance, please send funds to \(address)" "Wallet must have positive balance, please send funds to \(address)"
) )

View File

@ -3,6 +3,14 @@ import XCTest
private let SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net" private let SIGNET_ESPLORA_URL = "http://signet.bitcoindevkit.net"
private let TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud" private let TESTNET_ESPLORA_URL = "https://esplora.testnet.kuutamo.cloud"
private let descriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
private let changeDescriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
network: Network.signet
)
final class LiveWalletTests: XCTestCase { final class LiveWalletTests: XCTestCase {
var dbFilePath: URL! var dbFilePath: URL!
@ -27,14 +35,9 @@ final class LiveWalletTests: XCTestCase {
} }
func testSyncedBalance() throws { func testSyncedBalance() throws {
let descriptor = try Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
let wallet = try Wallet( let wallet = try Wallet(
descriptor: descriptor, descriptor: descriptor,
changeDescriptor: nil, changeDescriptor: changeDescriptor,
persistenceBackendPath: dbFilePath.path,
network: .signet network: .signet
) )
let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL) let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL)
@ -45,11 +48,10 @@ final class LiveWalletTests: XCTestCase {
parallelRequests: 1 parallelRequests: 1
) )
try wallet.applyUpdate(update: update) try wallet.applyUpdate(update: update)
let _ = try wallet.commit() let address = wallet.revealNextAddress(keychain: KeychainKind.external).address.description
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.description
XCTAssertGreaterThan( XCTAssertGreaterThan(
wallet.getBalance().total.toSat(), wallet.balance().total.toSat(),
UInt64(0), UInt64(0),
"Wallet must have positive balance, please send funds to \(address)" "Wallet must have positive balance, please send funds to \(address)"
) )
@ -58,21 +60,16 @@ final class LiveWalletTests: XCTestCase {
let transactions = wallet.transactions().prefix(3) let transactions = wallet.transactions().prefix(3)
for tx in transactions { for tx in transactions {
let sentAndReceived = wallet.sentAndReceived(tx: tx.transaction) let sentAndReceived = wallet.sentAndReceived(tx: tx.transaction)
print("Transaction: \(tx.transaction.txid())") print("Transaction: \(tx.transaction.computeTxid())")
print("Sent \(sentAndReceived.sent.toSat())") print("Sent \(sentAndReceived.sent.toSat())")
print("Received \(sentAndReceived.received.toSat())") print("Received \(sentAndReceived.received.toSat())")
} }
} }
func testBroadcastTransaction() throws { func testBroadcastTransaction() throws {
let descriptor = try Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
let wallet = try Wallet( let wallet = try Wallet(
descriptor: descriptor, descriptor: descriptor,
changeDescriptor: nil, changeDescriptor: changeDescriptor,
persistenceBackendPath: dbFilePath.path,
network: .signet network: .signet
) )
let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL) let esploraClient = EsploraClient(url: SIGNET_ESPLORA_URL)
@ -83,16 +80,15 @@ final class LiveWalletTests: XCTestCase {
parallelRequests: 1 parallelRequests: 1
) )
try wallet.applyUpdate(update: update) try wallet.applyUpdate(update: update)
let _ = try wallet.commit() let address = wallet.revealNextAddress(keychain: KeychainKind.external).address.description
let address = try wallet.revealNextAddress(keychain: KeychainKind.external).address.description
XCTAssertGreaterThan( XCTAssertGreaterThan(
wallet.getBalance().total.toSat(), wallet.balance().total.toSat(),
UInt64(0), UInt64(0),
"Wallet must have positive balance, please send funds to \(address)" "Wallet must have positive balance, please send funds to \(address)"
) )
print("Balance: \(wallet.getBalance().total)") print("Balance: \(wallet.balance().total)")
let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .signet) let recipient: Address = try Address(address: "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", network: .signet)
let psbt: Psbt = try let psbt: Psbt = try
@ -108,8 +104,8 @@ final class LiveWalletTests: XCTestCase {
XCTAssertTrue(walletDidSign, "Wallet did not sign transaction") XCTAssertTrue(walletDidSign, "Wallet did not sign transaction")
let tx: Transaction = try! psbt.extractTx() let tx: Transaction = try! psbt.extractTx()
print(tx.txid()) print(tx.computeTxid())
let fee: UInt64 = try wallet.calculateFee(tx: tx) let fee: Amount = try wallet.calculateFee(tx: tx)
print("Transaction Fee: \(fee)") print("Transaction Fee: \(fee)")
let feeRate: FeeRate = try wallet.calculateFeeRate(tx: tx) let feeRate: FeeRate = try wallet.calculateFeeRate(tx: tx)
print("Transaction Fee Rate: \(feeRate.toSatPerVbCeil()) sat/vB") print("Transaction Fee Rate: \(feeRate.toSatPerVbCeil()) sat/vB")

View File

@ -1,6 +1,15 @@
import XCTest import XCTest
@testable import BitcoinDevKit @testable import BitcoinDevKit
private let descriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)",
network: Network.signet
)
private let changeDescriptor = try! Descriptor(
descriptor: "wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/1/*)",
network: Network.signet
)
final class OfflineWalletTests: XCTestCase { final class OfflineWalletTests: XCTestCase {
var dbFilePath: URL! var dbFilePath: URL!
@ -24,17 +33,12 @@ final class OfflineWalletTests: XCTestCase {
} }
func testNewAddress() throws { func testNewAddress() throws {
let descriptor: Descriptor = try Descriptor(
descriptor: "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
network: Network.testnet
)
let wallet = try Wallet( let wallet = try Wallet(
descriptor: descriptor, descriptor: descriptor,
changeDescriptor: nil, changeDescriptor: changeDescriptor,
persistenceBackendPath: dbFilePath.path,
network: .testnet network: .testnet
) )
let addressInfo: AddressInfo = try wallet.revealNextAddress(keychain: KeychainKind.external) let addressInfo: AddressInfo = wallet.revealNextAddress(keychain: KeychainKind.external)
XCTAssertTrue(addressInfo.address.isValidForNetwork(network: Network.testnet), XCTAssertTrue(addressInfo.address.isValidForNetwork(network: Network.testnet),
"Address is not valid for testnet network") "Address is not valid for testnet network")
@ -45,21 +49,16 @@ final class OfflineWalletTests: XCTestCase {
XCTAssertFalse(addressInfo.address.isValidForNetwork(network: Network.bitcoin), XCTAssertFalse(addressInfo.address.isValidForNetwork(network: Network.bitcoin),
"Address is valid for bitcoin network, but it shouldn't be") "Address is valid for bitcoin network, but it shouldn't be")
XCTAssertEqual(addressInfo.address.description, "tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e") XCTAssertEqual(addressInfo.address.description, "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989")
} }
func testBalance() throws { func testBalance() throws {
let descriptor: Descriptor = try Descriptor(
descriptor: "wpkh([c258d2e4/84h/1h/0h]tpubDDYkZojQFQjht8Tm4jsS3iuEmKjTiEGjG6KnuFNKKJb5A6ZUCUZKdvLdSDWofKi4ToRCwb9poe1XdqfUnP4jaJjCB2Zwv11ZLgSbnZSNecE/0/*)",
network: Network.testnet
)
let wallet = try Wallet( let wallet = try Wallet(
descriptor: descriptor, descriptor: descriptor,
changeDescriptor: nil, changeDescriptor: changeDescriptor,
persistenceBackendPath: dbFilePath.path,
network: .testnet network: .testnet
) )
XCTAssertEqual(wallet.getBalance().total.toSat(), 0) XCTAssertEqual(wallet.balance().total.toSat(), 0)
} }
} }