Skip to content
Open
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
14 changes: 7 additions & 7 deletions bdk_demo/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -101,24 +101,24 @@ class _MyHomePageState extends State<MyHomePage> {
_error != null
? Icons.error_outline
: _networkName != null
? Icons.check_circle
: Icons.network_check,
? Icons.check_circle
: Icons.network_check,
size: 80,
color: _error != null
? Colors.red
: _networkName != null
? Colors.green
: Colors.grey,
? Colors.green
: Colors.grey,
),
const SizedBox(height: 20),
const Text('BDK bindings status', style: TextStyle(fontSize: 20)),
if (_networkName != null) ...[
Text(
'Network: $_networkName',
style: Theme.of(context).textTheme.headlineMedium?.copyWith(
color: Colors.orange,
fontWeight: FontWeight.bold,
),
color: Colors.orange,
fontWeight: FontWeight.bold,
),
),
if (_descriptorSnippet != null)
Padding(
Expand Down
34 changes: 23 additions & 11 deletions examples/network_example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,33 +16,45 @@ void main() {

// 2. Turn the mnemonic into descriptor keys for external/change paths.
final rootKey = DescriptorSecretKey(network, mnemonic, null);
final externalDescriptor =
Descriptor.newBip84(rootKey, KeychainKind.external_, network);
final changeDescriptor =
Descriptor.newBip84(rootKey, KeychainKind.internal, network);
final externalDescriptor = Descriptor.newBip84(
rootKey,
KeychainKind.external_,
network,
);
final changeDescriptor = Descriptor.newBip84(
rootKey,
KeychainKind.internal,
network,
);

stdout
..writeln('\nExternal descriptor:\n $externalDescriptor')
..writeln('Change descriptor:\n $changeDescriptor');

// 3. Spin up an in-memory wallet using the descriptors.
final persister = Persister.newInMemory();
final wallet =
Wallet(externalDescriptor, changeDescriptor, network, persister, 25);
final wallet = Wallet(
externalDescriptor,
changeDescriptor,
network,
persister,
25,
);
stdout.writeln('\nWallet ready on ${wallet.network()}');

// 4. Hand out the next receive address and persist the staged change.
final receive = wallet.revealNextAddress(KeychainKind.external_);
stdout.writeln(
'Next receive address (#${receive.index}): ${receive.address.toString()}');
'Next receive address (#${receive.index}): ${receive.address.toString()}',
);
final persisted = wallet.persist(persister);
stdout.writeln('Persisted staged wallet changes: $persisted');

// 5. Try a quick Electrum sync to fetch history/balances.
ElectrumClient? client;
try {
stdout.writeln('\nSyncing via Electrum (blockstream.info)…');
final client =
ElectrumClient('ssl://electrum.blockstream.info:60002', null);
client = ElectrumClient('ssl://electrum.blockstream.info:60002', null);
final syncRequest = wallet.startSyncWithRevealedSpks().build();
final update = client.sync_(syncRequest, 100, true);

Expand All @@ -52,13 +64,13 @@ void main() {
final balance = wallet.balance();
stdout.writeln('Confirmed balance: ${balance.confirmed.toSat()} sats');
stdout.writeln('Total balance: ${balance.total.toSat()} sats');

client.dispose();
} catch (error) {
stdout.writeln(
'Electrum sync failed: $error\n'
'Ensure TLS-enabled Electrum access is available, or skip this step.',
);
} finally {
client?.dispose();
}

// 6. Clean up FFI handles explicitly so long-lived examples don’t leak.
Expand Down
50 changes: 10 additions & 40 deletions test/descriptor_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,49 +6,19 @@ import 'test_constants.dart';
void main() {
group('Descriptor construction', () {
test('creates extended WPKH descriptors across networks', () {
expect(
() => buildBip84Descriptor(Network.regtest),
returnsNormally,
);
expect(
() => buildBip84Descriptor(Network.testnet),
returnsNormally,
);
expect(
() => buildBip84Descriptor(Network.testnet4),
returnsNormally,
);
expect(
() => buildBip84Descriptor(Network.signet),
returnsNormally,
);
expect(
() => buildMainnetBip84Descriptor(),
returnsNormally,
);
expect(() => buildBip84Descriptor(Network.regtest), returnsNormally);
expect(() => buildBip84Descriptor(Network.testnet), returnsNormally);
expect(() => buildBip84Descriptor(Network.testnet4), returnsNormally);
expect(() => buildBip84Descriptor(Network.signet), returnsNormally);
expect(() => buildMainnetBip84Descriptor(), returnsNormally);
});

test('creates extended TR descriptors across networks', () {
expect(
() => buildBip86Descriptor(Network.regtest),
returnsNormally,
);
expect(
() => buildBip86Descriptor(Network.testnet),
returnsNormally,
);
expect(
() => buildBip86Descriptor(Network.testnet4),
returnsNormally,
);
expect(
() => buildBip86Descriptor(Network.signet),
returnsNormally,
);
expect(
() => buildMainnetBip86Descriptor(),
returnsNormally,
);
expect(() => buildBip86Descriptor(Network.regtest), returnsNormally);
expect(() => buildBip86Descriptor(Network.testnet), returnsNormally);
expect(() => buildBip86Descriptor(Network.testnet4), returnsNormally);
expect(() => buildBip86Descriptor(Network.signet), returnsNormally);
expect(() => buildMainnetBip86Descriptor(), returnsNormally);
});

test('creates non-extended descriptors for all networks', () {
Expand Down
4 changes: 3 additions & 1 deletion test/offline_persistence_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@ void main() {
final wallet = Wallet.load(
buildDescriptor(persistencePublicDescriptorString, Network.signet),
buildDescriptor(
persistencePublicChangeDescriptorString, Network.signet),
persistencePublicChangeDescriptorString,
Network.signet,
),
persister,
defaultLookahead,
);
Expand Down
24 changes: 16 additions & 8 deletions test/offline_wallet_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@ import 'test_constants.dart';
void main() {
group('Offline wallet', () {
test('revealNextAddress yields expected address on multiple networks', () {
final descriptor =
buildDescriptor(offlineDescriptorString, Network.signet);
final changeDescriptor =
buildDescriptor(offlineChangeDescriptorString, Network.signet);
final descriptor = buildDescriptor(
offlineDescriptorString,
Network.signet,
);
final changeDescriptor = buildDescriptor(
offlineChangeDescriptorString,
Network.signet,
);
final persister = Persister.newInMemory();
final wallet = Wallet(
descriptor,
Expand All @@ -34,10 +38,14 @@ void main() {
});

test('new wallet starts with zero balance', () {
final descriptor =
buildDescriptor(offlineDescriptorString, Network.signet);
final changeDescriptor =
buildDescriptor(offlineChangeDescriptorString, Network.signet);
final descriptor = buildDescriptor(
offlineDescriptorString,
Network.signet,
);
final changeDescriptor = buildDescriptor(
offlineChangeDescriptorString,
Network.signet,
);
final persister = Persister.newInMemory();
final wallet = Wallet(
descriptor,
Expand Down
24 changes: 8 additions & 16 deletions test/test_constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,25 +37,17 @@ const expectedPersistedAddress = "tb1qan3lldunh37ma6c0afeywgjyjgnyc8uz975zl2";
Descriptor buildDescriptor(String descriptor, Network network) =>
Descriptor(descriptor, network);

Descriptor buildBip84Descriptor(Network network) => Descriptor(
"wpkh($testExtendedPrivKey/$bip84TestReceivePath/*)",
network,
);
Descriptor buildBip84Descriptor(Network network) =>
Descriptor("wpkh($testExtendedPrivKey/$bip84TestReceivePath/*)", network);

Descriptor buildBip84ChangeDescriptor(Network network) => Descriptor(
"wpkh($testExtendedPrivKey/$bip84TestChangePath/*)",
network,
);
Descriptor buildBip84ChangeDescriptor(Network network) =>
Descriptor("wpkh($testExtendedPrivKey/$bip84TestChangePath/*)", network);

Descriptor buildBip86Descriptor(Network network) => Descriptor(
"tr($testExtendedPrivKey/$bip86TestReceivePath/*)",
network,
);
Descriptor buildBip86Descriptor(Network network) =>
Descriptor("tr($testExtendedPrivKey/$bip86TestReceivePath/*)", network);

Descriptor buildBip86ChangeDescriptor(Network network) => Descriptor(
"tr($testExtendedPrivKey/$bip86TestChangePath/*)",
network,
);
Descriptor buildBip86ChangeDescriptor(Network network) =>
Descriptor("tr($testExtendedPrivKey/$bip86TestChangePath/*)", network);

Descriptor buildMainnetBip84Descriptor() => Descriptor(
"wpkh($mainnetExtendedPrivKey/$bip84MainnetReceivePath/*)",
Expand Down
37 changes: 19 additions & 18 deletions test/wallet_behavior_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -33,23 +33,24 @@ void main() {
});

test(
'single-descriptor wallet returns identical external/internal addresses',
() {
final persister = Persister.newInMemory();
final wallet = Wallet.createSingle(
buildBip84Descriptor(Network.testnet),
Network.testnet,
persister,
defaultLookahead,
);

final externalAddress = wallet.peekAddress(KeychainKind.external_, 0);
final internalAddress = wallet.peekAddress(KeychainKind.internal, 0);

expect(
externalAddress.address.scriptPubkey().toBytes(),
orderedEquals(internalAddress.address.scriptPubkey().toBytes()),
);
});
'single-descriptor wallet returns identical external/internal addresses',
() {
final persister = Persister.newInMemory();
final wallet = Wallet.createSingle(
buildBip84Descriptor(Network.testnet),
Network.testnet,
persister,
defaultLookahead,
);

final externalAddress = wallet.peekAddress(KeychainKind.external_, 0);
final internalAddress = wallet.peekAddress(KeychainKind.internal, 0);

expect(
externalAddress.address.scriptPubkey().toBytes(),
orderedEquals(internalAddress.address.scriptPubkey().toBytes()),
);
},
);
});
}
11 changes: 3 additions & 8 deletions test/wallet_creation_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@ import 'package:test/test.dart';

import 'test_constants.dart';

Wallet _createWallet(
Descriptor descriptor,
Descriptor changeDescriptor,
) {
Wallet _createWallet(Descriptor descriptor, Descriptor changeDescriptor) {
final persister = Persister.newInMemory();
return Wallet(
descriptor,
Expand Down Expand Up @@ -77,10 +74,8 @@ void main() {

test('fails for private multipath descriptor', () {
expect(
() => buildDescriptor(
privateMultipathDescriptorString,
Network.testnet,
),
() =>
buildDescriptor(privateMultipathDescriptorString, Network.testnet),
throwsA(isA<DescriptorException>()),
);
});
Expand Down
Loading