HD Wallet
A basic toolkit for Cryptocurrency wallet in Dart. This package is used to generate and manage the Hierarchical Deterministic (HD) Wallet application. Forked from https://github.com/CrystalNetwork/hd_wallet
Features
You can easily use this package to develop crypto wallets through the Dart language. The goal of this fork is to support a growing list of coin types. Please submit a pull request if you would like to contribute.
Getting started
Use this package as a library
Depend on it
Run this command:
With Dart:
dart pub add flutter_hd_wallet
With Flutter:
flutter pub add flutter_hd_wallet
This will add a line like this to your package's pubspec.yaml (and run an implicit dart pub get
):
dependencies:
flutter_hd_wallet: ^latest
Alternatively, your editor might support dart pub get or flutter pub get. Check the docs for your editor to learn more.
Import it
Now in your Dart code, you can use:
import 'package:flutter_hd_wallet/flutter_hd_wallet.dart';
Usage
Short and useful examples for package users. Longer examples
is in /example
folder.
Bip39
Generate mnemonice:
// default mnemonic is 12 english words,
final m = BIP39();
debugPrint("words: ${m.mnemonic}");
debugPrint("seed: ${m.seed}");
Bip32
Forked from bip32-dart and improve some flaws.
BIP32 node = BIP32.fromBase58(
'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi');
final nodePrvk = HEX.encode(node.privateKey as List<int>);
debugPrint("nodePrvk: $nodePrvk");
// => e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35
BIP32 nodeNeutered = node.neutered();
debugPrint("isNeutered: ${nodeNeutered.isNeutered()}");
// => true
debugPrint(HEX.encode(nodeNeutered.publicKey));
// => 0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2
debugPrint(nodeNeutered.toBase58());
// => xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8
BIP32 child = node.derivePath('m/0/0');
debugPrint(child.toBase58());
// => xprv9ww7sMFLzJMzur2oEQDB642fbsMS4q6JRraMVTrM9bTWBq7NDS8ZpmsKVB4YF3mZecqax1fjnsPF19xnsJNfRp4RSyexacULXMKowSACTRc
debugPrint(HEX.encode(child.privateKey as List<int>));
// => f26cf12f89ab91aeeb8d7324a22e8ba080829db15c9245414b073a8c342322aa
BIP32 childNeutered = child.neutered();
debugPrint("childNeutered isNeutered: ${childNeutered.isNeutered()}");
// => true
debugPrint(HEX.encode(childNeutered.publicKey));
// => 02756de182c5dd4b717ea87e693006da62dbb3cddaa4a5cad2ed1f5bbab755f0f5
BIP32 nodeFromSeed = BIP32.fromSeed(
Uint8List.fromList(HEX.decode("000102030405060708090a0b0c0d0e0f")));
debugPrint(nodeFromSeed.toBase58());
// => xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi
BIP32 nodeFromPub = BIP32.fromBase58(
"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8");
debugPrint(nodeFromPub.toBase58());
// => xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8
Bip44
const coin = 60;
const account = 0;
const change = 0;
const index = 1024;
final node = BIP44.fromSeed(
"87fbb2c47e6cb3a8c5dc0eb9c6b86ac6d78c19a3a62ee6e3b59cb92fda2c9a58df77a691f450645f78ec98584edf9c7b4c25f2e414fc9f39e97ba6788f5311a0",
coinType: coin);
debugPrint(node.privateKeyHex());
// => 126b43a322b80d0f18bbdef0fd455fe680d78b7c038b243a5b5d40e331b032d7
debugPrint(node.privateKeyHex());
// => 02b6f32dde6031f55787fbf9d861c233526b53c56e30c854ebd61fc6ed681fc91d
debugPrint(node.privateKeyHex(hardened: true));
// => 07590f06719e5b561b2323568a668ac21c4ca327a28960534ef0b392148fa180
debugPrint(node.publicKeyHex(hardened: true));
// => 03e6dd25138127138140a0af34d214c9f006e2d6d475eed3fac0c2659ff2c1eacf
debugPrint(node.privateKeyHex(account: account, change: change, index: index));
// => f033d0f338838555d2842a33e21cbf59a49a3537cd494bff7ada534cbc118243
debugPrint(node.publicKeyHex(account: account, change: change, index: index));
// => 02d3464e4d0504a6eed97299e85975fdf5be29cb1d1c49f6d217113bc7d77181b2
debugPrint(node.privateKeyHex(
account: account, change: change, index: index, hardened: true));
// => 155105f81999676268d15ba007aff2f8f391d7f21df2c9a50b39fd58f62de546
debugPrint(node.publicKeyHex(
account: account, change: change, index: index, hardened: true));
// => 03e6859749a3b614748046b820fb3f3496d1116734e3e2acb67bf25f6a91fb6cc9
debugPrint(node.address(index: 1));
// => 0x2071fC489F9998d8C6674176655F18D73AFa5Aaa
debugPrint(node.address(index: 2, hardened: true));
// => 0x487d87C2aCC6272Aad9CdF2cCb98cC06a4e989ae
Additional information
If you have any problems or bugs in use, please contact us.