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