Targeting Flutter apps, the Cardano Wallet SDK is a high-level Dart library for managing cryptocurrency accounts & executing transactions on the blockchain.
APACHE-2.0 License
Flutter SDK for building Cardano blockchain mobile apps in Flutter using the Dart programming language.
To see the SDK in action, both a pure Dart example and multi-platform Flutter example are incuded in this distribution. You can also visit the live Flutter Demonstration Wallet hosted on google cloud.
This library is currently under development and is not yet production quality. It is being developed on a part-time basis with an evolving schedule based on funding and developer resources. To date it has been funded by a series of modest Project Catalyst grants. The current schedule is:
This is an ambitious project, requiring much ongoing maintenance, development and community support. If you'd like to see this project succeed, please support us by voting for the Flutter SDK in Fund 9. Proposals will be published in June 2022 and voting will be in August 2022.
If you'd like to can contribute directly, the Flutter SDK has a dedicated wallet:
addr1qx90lkpwhpwu42jnw00w483krjyfvhhpgk97hdfw9nz3xqaqg6dycrrc4qw0l5fsvfgx95gnqmrfxhgrfy8afsxxje5qgplx9r
Released versions and installation details can be found on pub.dev.
Although Dart is an imperative language, the framework uses functional idioms whenever possible. In particular, the majority of the classes are immutible and rather than creating side effects by throwing exceptions, the Result class is used. The WalletBuilder's build method provides a concrete example, returning either a wallet instance or error message if issues arise:
Result<Wallet, String> result = walletBuilder.build();
result.when(
ok: (wallet) => print("Success: ${wallet.walletName}"),
err: (message) => print("Error: $message"),
);
Create a wallet builder for the testnet using a BlockFrost key.
final walletBuilder = WalletBuilder()
..network = Networks.testnet
..testnetAdapterKey = blockfrostKey;
Create a read-only wallet using a staking address.
var address = ShelleyAddress.fromBech32('stake_test1uqvwl7a...');
final walletBuilder = WalletBuilder()
..network = Networks.testnet
..testnetAdapterKey = blockfrostKey
..stakeAddress = address;
Result<ReadOnlyWallet, String> result = await walletBuilder.readOnlyBuildAndSync();
result.when(
ok: (wallet) => print("${wallet.walletName}: ${wallet.balance}"),
err: (message) => print("Error: $message"),
);
Restore existing wallet using 24 word mnemonic.
List<String> mnemonic = 'rude stadium move gallery receive just...'.split(' ');
final walletBuilder = WalletBuilder()
..network = Networks.testnet
..testnetAdapterKey = blockfrostKey
..mnemonic = mnemonic;
Result<Wallet, String> result = await walletBuilder.buildAndSync();
if (result.isOk()) {
var wallet = result.unwrap();
print("${wallet.walletName}: ${wallet.balance}");
}
Update existing wallet.
final walletBuilder = WalletBuilder()
..network = Networks.testnet
..testnetAdapterKey = blockfrostKey
..mnemonic = mnemonic;
Result<Wallet, String> result = walletBuilder.build();
Wallet wallet = result.unwrap();
Coin oldBalance = wallet.balance;
var result2 = await wallet.update();
result2.when(
ok: (_) => print("old:$oldBalance lovelace, new: ${wallet.balance} lovelace"),
err: (message) => print("Error: $message"),
);
Create a new 24 word mnemonic.
List<String> mnemonic = WalletBuilder.generateNewMnemonic();
print("mnemonic: ${mnemonic.join(' ')}");
List transaction history.
wallet.transactions.forEach((tx) => print(tx));
List addresses.
wallet.addresses.forEach((addr) => print(addr.toBech32()));
List currency balances.
final formatter = AdaFormattter.compactCurrency();
wallet.currencies.forEach((assetId, balance) {
final isAda = assetId == lovelaceHex;
print("$assetId: ${isAda ? formatter.format(balance) : balance}");
});
List staking rewards.
wallet.stakeAccounts.forEach((acct) {
acct.rewards.forEach((reward) {
print("epoch: ${reward.epoch}, ${reward.amount} ADA");
});
});
Access root private and public key pair.
Bip32KeyPair pair = wallet.rootKeyPair;
print("${pair.signingKey}, ${pair.verifyKey}");
Access staking address.
print(wallet.account.stakeAddress));
First unused change address.
print(wallet.firstUnusedChangeAddress));
First unused spend address.
print(wallet.firstUnusedSpendAddress));
Send 3 ADA to Bob.
var bobsAddress = parseAddress('addr1qyy6...');
final Result<ShelleyTransaction, String> result = await wallet.sendAda(
toAddress: bobsAddress,
lovelace: 3 * 1000000,
);
if (result.isOk()) {
final tx = result.unwrap();
print("ADA sent. Fee: ${tx.body.fee} lovelace");
}
Several of the integration tests (suffixed with '_itest.dart') require a BlockFrost key to run. Installation steps are as follows:
echo "your-project-id" > ../blockfrost_project_id.txt
Now you can include the integration tests:
dart test -P itest
Copyright 2021 Richard Easterling SPDX-License-Identifier: Apache-2.0