Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add TxBuilder, Script, Transaction, and PartiallySignedTransaction #406

Merged
merged 3 commits into from
Nov 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions .github/workflows/test-android.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,12 @@ jobs:
- name: "Build Android library"
run: |
cd bdk-android
./gradlew buildAndroidLib
./gradlew buildAndroidLib --console=plain

# There are currently no unit tests for bdk-android and the integration tests require the macOS image
# which is not working with the older NDK version we are using, so for now we just make sure that the library builds.
# - name: "Run Android unit tests"
# There are currently no unit tests for bdk-android (see the tests in bdk-jvm instead) and the
# integration tests require the macOS image which is not working with the older NDK version we
# are using, so for now we just make sure that the library builds and omit the connectedTest
# - name: "Run Android connected tests"
# run: |
# cd bdk-android
# ./gradlew test --console=rich
# ./gradlew connectedAndroidTest --console=plain
2 changes: 1 addition & 1 deletion .github/workflows/test-jvm.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,4 @@ jobs:
- name: "Run JVM tests"
run: |
cd bdk-jvm
./gradlew test
./gradlew test -P excludeConnectedTests
8 changes: 4 additions & 4 deletions .github/workflows/test-python.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ jobs:
run: ${PYBIN}/pip install ./dist/*.whl

- name: "Run tests"
run: ${PYBIN}/python -m unittest tests/test_bdk.py --verbose
run: ${PYBIN}/python -m unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose

- name: "Upload artifact test"
uses: actions/upload-artifact@v3
Expand Down Expand Up @@ -97,7 +97,7 @@ jobs:
# - name: "Install wheel and run tests"
# run: |
# pip3 install ./dist/*.whl
# python3 -m unittest tests/test_bdk.py --verbose
# python3 -m unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose

- name: "Upload artifact test"
uses: actions/upload-artifact@v3
Expand Down Expand Up @@ -138,7 +138,7 @@ jobs:
run: pip3 install ./dist/*.whl

- name: "Run tests"
run: python3 -m unittest tests/test_bdk.py --verbose
run: python3 -m unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose

- name: "Upload artifact test"
uses: actions/upload-artifact@v3
Expand Down Expand Up @@ -186,4 +186,4 @@ jobs:
shell: powershell

- name: "Run tests"
run: python -m unittest tests/test_bdk.py --verbose
run: python -m unittest discover --start "./tests/" --pattern "test_offline_*.py" --verbose
2 changes: 1 addition & 1 deletion .github/workflows/test-swift.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,4 @@ jobs:

- name: "Run Swift tests"
working-directory: bdk-swift
run: swift test
run: swift test --skip LiveWalletTests --skip LiveTxBuilderTests
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package org.bitcoindevkit

import org.junit.Test
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith
import kotlin.test.assertTrue

@RunWith(AndroidJUnit4::class)
class LiveTxBuilderTest {
@Test
fun testTxBuilder() {
val descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
val wallet = Wallet.newNoPersist(descriptor, null, Network.TESTNET)
val esploraClient = EsploraClient("https://mempool.space/testnet/api")
val update = esploraClient.scan(wallet, 10uL, 1uL)
wallet.applyUpdate(update)
println("Balance: ${wallet.getBalance().total()}")

assert(wallet.getBalance().total() > 0uL)

val recipient: Address = Address("tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989", Network.TESTNET)
val psbt: PartiallySignedTransaction = TxBuilder()
.addRecipient(recipient.scriptPubkey(), 4200uL)
.feeRate(2.0f)
.finish(wallet)

println(psbt.serialize())
assertTrue(psbt.serialize().startsWith("cHNi"), "PSBT should start with 'cHNi'")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.bitcoindevkit

import org.junit.Test
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class LiveWalletTest {
@Test
fun testSyncedBalance() {
val descriptor: Descriptor = Descriptor("wpkh(tprv8ZgxMBicQKsPf2qfrEygW6fdYseJDDrVnDv26PH5BHdvSuG6ecCbHqLVof9yZcMoM31z9ur3tTYbSnr1WBqbGX97CbXcmp5H6qeMpyvx35B/84h/1h/0h/0/*)", Network.TESTNET)
val wallet: Wallet = Wallet.newNoPersist(descriptor, null, Network.TESTNET)
val esploraClient: EsploraClient = EsploraClient("https://mempool.space/testnet/api")
// val esploraClient = EsploraClient("https://blockstream.info/testnet/api")
val update = esploraClient.scan(wallet, 10uL, 1uL)
wallet.applyUpdate(update)
println("Balance: ${wallet.getBalance().total()}")
thunderbiscuit marked this conversation as resolved.
Show resolved Hide resolved

assert(wallet.getBalance().total() > 0uL)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.bitcoindevkit

import kotlin.test.Test
import kotlin.test.assertTrue
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class OfflineDescriptorTest {
@Test
fun testDescriptorBip86() {
val mnemonic: Mnemonic = Mnemonic.fromString("space echo position wrist orient erupt relief museum myself grain wisdom tumble")
val descriptorSecretKey: DescriptorSecretKey = DescriptorSecretKey(Network.TESTNET, mnemonic, null)
val descriptor: Descriptor = Descriptor.newBip86(descriptorSecretKey, KeychainKind.EXTERNAL, Network.TESTNET)

assertEquals(
expected = "tr([be1eec8f/86'/1'/0']tpubDCTtszwSxPx3tATqDrsSyqScPNnUChwQAVAkanuDUCJQESGBbkt68nXXKRDifYSDbeMa2Xg2euKbXaU3YphvGWftDE7ozRKPriT6vAo3xsc/0/*)#m7puekcx",
actual = descriptor.asString()
)
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
package org.bitcoindevkit

import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith

/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class WalletTest {

class OfflineWalletTest {
@Test
fun testDescriptorBip86() {
val mnemonic: Mnemonic = Mnemonic(WordCount.WORDS12)
Expand All @@ -36,7 +30,10 @@ class WalletTest {
)
val addressInfo: AddressInfo = wallet.getAddress(AddressIndex.New)

assertEquals("tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e", addressInfo.address.asString())
assertEquals(
expected = "tb1qzg4mckdh50nwdm9hkzq06528rsu73hjxxzem3e",
actual = addressInfo.address.asString()
)
}

@Test
Expand All @@ -51,7 +48,9 @@ class WalletTest {
Network.TESTNET
)

assertEquals(0uL, wallet.getBalance().total())
assertEquals(
expected = 0uL,
actual = wallet.getBalance().total()
)
}

}
}
47 changes: 46 additions & 1 deletion bdk-ffi/src/bdk.udl
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
namespace bdk {};

// ------------------------------------------------------------------------
// bdk crate
// bdk crate - root module
// ------------------------------------------------------------------------

enum KeychainKind {
Expand Down Expand Up @@ -76,16 +76,31 @@ interface Wallet {

AddressInfo get_address(AddressIndex address_index);

AddressInfo get_internal_address(AddressIndex address_index);

Network network();

Balance get_balance();

boolean is_mine(Script script);

[Throws=BdkError]
void apply_update(Update update);
};

interface Update {};

interface TxBuilder {
constructor();

TxBuilder add_recipient(Script script, u64 amount);

TxBuilder fee_rate(float sat_per_vbyte);

[Throws=BdkError]
PartiallySignedTransaction finish([ByRef] Wallet wallet);
};

// ------------------------------------------------------------------------
// bdk crate - descriptor module
// ------------------------------------------------------------------------
Expand Down Expand Up @@ -214,7 +229,37 @@ interface Address {

Network network();

Script script_pubkey();

string to_qr_uri();

string as_string();
};

interface Transaction {
[Throws=BdkError]
constructor(sequence<u8> transaction_bytes);

string txid();

u64 size();

u64 vsize();

boolean is_coin_base();

boolean is_explicitly_rbf();

boolean is_lock_time_enabled();

i32 version();
};

interface PartiallySignedTransaction {
[Throws=BdkError]
constructor(string psbt_base64);

string serialize();

Transaction extract_tx();
};
Loading
Loading