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

refactor: restructure balance #415

Merged
merged 1 commit into from
Dec 6, 2023
Merged
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
Original file line number Diff line number Diff line change
@@ -14,9 +14,9 @@ class LiveTxBuilderTest {
val esploraClient = EsploraClient("https://mempool.space/testnet/api")
val update = esploraClient.scan(wallet, 10uL, 1uL)
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 psbt: PartiallySignedTransaction = TxBuilder()
Original file line number Diff line number Diff line change
@@ -12,14 +12,13 @@ class LiveWalletTest {
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()}")
println("Balance: ${wallet.getBalance().total}")
val balance: Balance = wallet.getBalance()
println("Balance: $balance")

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

@Test
@@ -30,10 +29,10 @@ class LiveWalletTest {
val update = esploraClient.scan(wallet, 10uL, 1uL)

wallet.applyUpdate(update)
println("Balance: ${wallet.getBalance().total()}")
println("Balance: ${wallet.getBalance().total}")
println("New address: ${wallet.getAddress(AddressIndex.New).address}")

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."
}

Original file line number Diff line number Diff line change
@@ -50,7 +50,7 @@ class OfflineWalletTest {

assertEquals(
expected = 0uL,
actual = wallet.getBalance().total()
actual = wallet.getBalance().total
)
}
}
14 changes: 7 additions & 7 deletions bdk-ffi/src/bdk.udl
Original file line number Diff line number Diff line change
@@ -49,18 +49,18 @@ enum ChangeSpendPolicy {
"ChangeForbidden"
};

interface Balance {
u64 immature();
dictionary Balance {
u64 immature;

u64 trusted_pending();
u64 trusted_pending;

u64 untrusted_pending();
u64 untrusted_pending;

u64 confirmed();
u64 confirmed;

u64 trusted_spendable();
u64 trusted_spendable;

u64 total();
u64 total;
};

dictionary AddressInfo {
58 changes: 22 additions & 36 deletions bdk-ffi/src/lib.rs
Original file line number Diff line number Diff line change
@@ -177,47 +177,33 @@ impl From<&BdkAddressIndex> for AddressIndex {
// }

pub struct Balance {
pub inner: BdkBalance,
// All coinbase outputs not yet matured
pub immature: u64,
/// Unconfirmed UTXOs generated by a wallet tx
pub trusted_pending: u64,
/// Unconfirmed UTXOs received from an external wallet
pub untrusted_pending: u64,
/// Confirmed and immediately spendable balance
pub confirmed: u64,
/// Get sum of trusted_pending and confirmed coins
pub trusted_spendable: u64,
/// Get the whole balance visible to the wallet
pub total: u64,
}

impl Balance {
/// All coinbase outputs not yet matured.
fn immature(&self) -> u64 {
self.inner.immature
}

/// Unconfirmed UTXOs generated by a wallet tx.
fn trusted_pending(&self) -> u64 {
self.inner.trusted_pending
}

/// Unconfirmed UTXOs received from an external wallet.
fn untrusted_pending(&self) -> u64 {
self.inner.untrusted_pending
}

/// Confirmed and immediately spendable balance.
fn confirmed(&self) -> u64 {
self.inner.confirmed
}

/// Get sum of trusted_pending and confirmed coins.
fn trusted_spendable(&self) -> u64 {
self.inner.trusted_spendable()
}

/// Get the whole balance visible to the wallet.
fn total(&self) -> u64 {
self.inner.total()
impl From<BdkBalance> for Balance {
fn from(bdk_balance: BdkBalance) -> Self {
Balance {
immature: bdk_balance.immature,
trusted_pending: bdk_balance.trusted_pending,
untrusted_pending: bdk_balance.untrusted_pending,
confirmed: bdk_balance.confirmed,
trusted_spendable: bdk_balance.trusted_spendable(),
total: bdk_balance.total(),
}
}
}

// impl From<BdkBalance> for Balance {
// fn from(bdk_balance: BdkBalance) -> Self {
// Balance { inner: bdk_balance }
// }
// }

// /// A transaction output, which defines new coins to be created from old ones.
// #[derive(Debug, Clone)]
// pub struct TxOut {
8 changes: 3 additions & 5 deletions bdk-ffi/src/wallet.rs
Original file line number Diff line number Diff line change
@@ -55,11 +55,9 @@ impl Wallet {
.into()
}

// TODO 16: Why is the Arc required here?
pub fn get_balance(&self) -> Arc<Balance> {
let bdk_balance = self.get_wallet().get_balance();
let balance = Balance { inner: bdk_balance };
Arc::new(balance)
pub fn get_balance(&self) -> Balance {
let bdk_balance: bdk::wallet::Balance = self.get_wallet().get_balance();
Balance::from(bdk_balance)
}

pub fn apply_update(&self, update: Arc<Update>) -> Result<(), BdkError> {
Original file line number Diff line number Diff line change
@@ -12,9 +12,9 @@ class LiveTxBuilderTest {
val esploraClient = EsploraClient("https://mempool.space/testnet/api")
val update = esploraClient.scan(wallet, 10uL, 1uL)
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 psbt: PartiallySignedTransaction = TxBuilder()
Original file line number Diff line number Diff line change
@@ -12,9 +12,9 @@ class LiveWalletTest {
// val esploraClient = EsploraClient("https://blockstream.info/testnet/api")
val update = esploraClient.scan(wallet, 10uL, 1uL)
wallet.applyUpdate(update)
println("Balance: ${wallet.getBalance().total()}")
println("Balance: ${wallet.getBalance().total}")

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

@Test
@@ -25,10 +25,10 @@ class LiveWalletTest {
val update = esploraClient.scan(wallet, 10uL, 1uL)

wallet.applyUpdate(update)
println("Balance: ${wallet.getBalance().total()}")
println("Balance: ${wallet.getBalance().total}")
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."
}

Original file line number Diff line number Diff line change
@@ -47,7 +47,7 @@ class OfflineWalletTest {

assertEquals(
expected = 0uL,
actual = wallet.getBalance().total()
actual = wallet.getBalance().total
)
}
}
2 changes: 1 addition & 1 deletion bdk-python/tests/test_live_tx_builder.py
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ def test_tx_builder(self):
)
wallet.apply_update(update)

self.assertGreater(wallet.get_balance().total(), 0)
self.assertGreater(wallet.get_balance().total, 0)

recipient = bdk.Address(
address = "tb1qrnfslnrve9uncz9pzpvf83k3ukz22ljgees989",
2 changes: 1 addition & 1 deletion bdk-python/tests/test_live_wallet.py
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ def test_synced_balance(self):
)
wallet.apply_update(update)

self.assertGreater(wallet.get_balance().total(), 0)
self.assertGreater(wallet.get_balance().total, 0)

def test_broadcast_transaction(self):
descriptor: bdk.Descriptor = bdk.Descriptor(
2 changes: 1 addition & 1 deletion bdk-python/tests/test_offline_wallet.py
Original file line number Diff line number Diff line change
@@ -28,7 +28,7 @@ def test_balance(self):
bdk.Network.TESTNET
)

self.assertEqual(wallet.get_balance().total(), 0)
self.assertEqual(wallet.get_balance().total, 0)

if __name__ == '__main__':
unittest.main()
Original file line number Diff line number Diff line change
@@ -20,7 +20,7 @@ final class LiveTxBuilderTests: XCTestCase {
)
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()
6 changes: 3 additions & 3 deletions bdk-swift/Tests/BitcoinDevKitTests/LiveWalletTests.swift
Original file line number Diff line number Diff line change
@@ -20,7 +20,7 @@ final class LiveWalletTests: XCTestCase {
)
try wallet.applyUpdate(update: update)

XCTAssertGreaterThan(wallet.getBalance().total(), UInt64(0))
XCTAssertGreaterThan(wallet.getBalance().total, UInt64(0))
}

func testBroadcastTransaction() throws {
@@ -41,9 +41,9 @@ final class LiveWalletTests: XCTestCase {
)
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
Original file line number Diff line number Diff line change
@@ -28,6 +28,6 @@ final class OfflineWalletTests: XCTestCase {
network: .testnet
)

XCTAssertEqual(wallet.getBalance().total(), 0)
XCTAssertEqual(wallet.getBalance().total, 0)
}
}