A Topl specific on-ramp for cryptography needs especially for Flutter
Topl Bip Library
Library for building Topl blockchain wallet mobile apps in Flutter. Please read the documentation for more information.
About
This project is a Topl blockchain on-ramp for Flutter/Dart mobile app developers. Currently a work in progress.
It will power the live Ribn wallet currently in active development.
Current Features
- CIP-1852 HD Wallet Compatibility
- Topl Specific BIP32 Deterministic Key Generator
- BIP39 Compatible for Mnemonic Phrases
- BIP32-ED25519 Extended Keys (used for signing transactions)
- Key Generator tool utilizing PBKDF2 (for additional security around mnemonics)
Features In Active Development
- create, broadcast and track transactions and fees
- sign and validate messages
- manage private and public keys
- list, create, update or remove wallets
Planned Features
- utilities for staking accounts
- custom asset transactions
- smart contracts
BIP32 Usage
import 'package:bip_topl/bip_topl.dart';
import 'package:pinenacl/x25519.dart';
void main() {
const coder = HexCoder.instance;
const derivator = Bip32Ed25519KeyDerivation.instance;
const keyPair = {
'xprv':
'c0b712f4c0e2df68d0054112efb081a7fdf8a3ca920994bf555c40e4c249354993f774ae91005da8c69b2c4c59fa80d741ecea6722262a6b4576d259cf60ef30c05763f0b510942627d0c8b414358841a19748ec43e1135d2f0c4d81583188e1',
'xpub':
'906d68169c8bbfc3f0cd901461c4c824e9ab7cdbaf38b7b6bd66e54da0411109c05763f0b510942627d0c8b414358841a19748ec43e1135d2f0c4d81583188e1'
};
const address_ix = 0;
// generate master public and private key from encoded keyPair
final masterPrivateKey =
Bip32SigningKey.decode(keyPair['xprv']!, coder: coder);
final masterPublicKey = Bip32VerifyKey.decode(keyPair['xpub']!, coder: coder);
print(Base58Encoder.instance.encode(masterPrivateKey
.rawKey)); //4rUU8Ee5K6h663ByMBLRjXgs9GYsFsTiUFujbfSvDpKjFuEfErc9QFfs4F1fej5jJ6gwavr2zU66c6ASagaqyZcb
print(Base58Encoder.instance.encode(
masterPublicKey.rawKey)); //AinUA7J1kBiyvDZ8nPL8BoCE9PBxPjKzUfoyhpXAGTXn
//BIP-44 path: m / purpose' / coin_type' / account_ix' / change_chain / address_ix
//You can iterate through a CIP-1852 path by deriving based on each index at a time. For this example, we will only use one idx.
final derivedPrv = derivator.ckdPriv(masterPrivateKey, address_ix);
final derivedPub = derivator.ckdPub(masterPublicKey, address_ix);
print(Base58Encoder.instance.encode(derivedPrv
.rawKey)); //2JAppvWBAgmd7B6s1XDcNPrxtSfT5MCcnhuVxeNKLYHyyqa3U9FE6BD85QPVtn6iWAisSq2WKyvbZFzmEA1rYbMP
print(Base58Encoder.instance.encode(
derivedPub.rawKey)); //AGj1p3atP5m2UVxXrBBtmniWQyV4HZGkVesii922zwj6
}
BIP39 Usage
// BIP39 Mnemonics
// Can be used to generate the root key of a given HDTree, an address, or simply convert bits to mnemonic for human friendly value
// For more details about the protocol, see
// [Bitcoin Improvement Proposal 39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)
import 'dart:math';
import 'package:bip_topl/bip_topl.dart';
void main() {
const mnemonic =
'legal winner thank year wave sausage worth useful legal winner thank yellow';
// mnemonic to entropy
final entropy = mnemonicToEntropy(mnemonic, 'english');
print(entropy); // 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f
// mnemonic to seedHex
// accepts an optional passphrase to strengthen the security of the mnemonic
final seedHex = mnemonicToSeedHex(mnemonic, passphrase: 'TREZOR');
print(
seedHex); //2e8905819b8723fe2c1d161860e5ee1830318dbf49a83bd451cfb8440c28bd6fa457fe1296106559a3c80937a1c1069be3a3a5bd381ee6260e8d9739fce1f607
//entropy to mnemonic
final code = entropyToMnemonic(entropy);
print(
code); //legal winner thank year wave sausage worth useful legal winner thank yellow
// validate Mnemonic
final validation = validateMnemonic(code, 'english');
print(validation); // true
// generateMnemonic with 15 words
final words = generateMnemonic(Random.secure(), strength: 160);
print(words); // should be random 15 word mnemonic
}