Toolkit for Nano cryptocurrency client side offline implementations allowing you to build web- and mobile applications using Nano without compromising the user's keys by sending them out of their own device.
The toolkit supports creating and importing wallets and signing blocks on-device. Meaning that the user's keys should never be required to leave the device.
- Generate wallets with a BIP32 mnemonic phrase
- BIP39/44 private key derivation
- Mnemonic is compatible with the Ledger Nano implementation
- Import wallets with a mnemonic phrase or a seed
- Import wallets with the legacy Nano hex seed
- Sign send, receive and change representative blocks with a private key
- Runs in all web browsers and mobile frameworks built with Javascript
- Convert Nano units
- Sign any strings with the private key, for example using a password for the user created from the user ID.
- Validate addresses and mnemonic words
npm install nanocurrency-web
WARNING: do not use any of the keys or addresses listed below to send real assets! |
---|
import { wallet } from 'nanocurrency-web'
// Generates a new wallet with a mnemonic phrase, seed and an account
// You can also generate your own entropy for the mnemonic or set a seed password
// Notice, that losing the password will make the mnemonic phrase void
const wallet = wallet.generate(entropy?, password?)
// Import a wallet with the mnemonic phrase
const wallet = wallet.fromMnemonic(mnemonic, seedPassword?)
// Import a wallet with a seed
const wallet = wallet.fromSeed(seed)
// Import a wallet with a legacy hex seed
const wallet = wallet.fromLegacySeed(seed)
// Derive private keys for a seed, from and to are number indexes
const accounts = wallet.accounts(seed, from, to)
// Derive private keys for a legacy seed, from and to are number indexes
const accounts = wallet.legacyAccounts(seed, from, to)
// The returned wallet JSON format is as follows. The mnemonic phrase will be undefined when importing with a seed.
{
mnemonic: 'edge defense waste choose enrich upon flee junk siren film clown finish luggage leader kid quick brick print evidence swap drill paddle truly occur',
seed: '0dc285fde768f7ff29b66ce7252d56ed92fe003b605907f7a4f683c3dc8586d34a914d3c71fc099bb38ee4a59e5b081a3497b7a323e90cc68f67b5837690310c',
accounts: [
{
accountIndex: 0,
privateKey: '3be4fc2ef3f3b7374e6fc4fb6e7bb153f8a2998b3b3dab50853eabe128024143',
publicKey: '5b65b0e8173ee0802c2c3e6c9080d1a16b06de1176c938a924f58670904e82c4',
address: 'nano_1pu7p5n3ghq1i1p4rhmek41f5add1uh34xpb94nkbxe8g4a6x1p69emk8y1d'
}
]
}
import { block } from 'nanocurrency-web'
const privateKey = '781186FB9EF17DB6E3D1056550D9FAE5D5BBADA6A6BC370E4CBB938B1DC71DA3';
const data = {
// Your current balance in RAW
walletBalanceRaw: '18618869000000000000000000000000',
// Your address
toAddress: 'nano_3kyb49tqpt39ekc49kbej51ecsjqnimnzw1swxz4boix4ctm93w517umuiw8',
// From wallet info
representativeAddress: 'nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou',
// From wallet info
frontier: '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D',
// From the pending transaction
transactionHash: 'CBC911F57B6827649423C92C88C0C56637A4274FF019E77E24D61D12B5338783',
// From the pending transaction in RAW
amountRaw: '7000000000000000000000000000000',
// Generate the work server-side or with a DPOW service
work: 'c5cf86de24b24419',
}
// Returns a correctly formatted and signed block ready to be sent to the blockchain
const signedBlock = block.receive(data, privateKey)
import { block } from 'nanocurrency-web'
const privateKey = '781186FB9EF17DB6E3D1056550D9FAE5D5BBADA6A6BC370E4CBB938B1DC71DA3';
const data = {
// Current balance from wallet info
walletBalanceRaw: '5618869000000000000000000000000',
// Your wallet address
fromAddress: 'nano_1e5aqegc1jb7qe964u4adzmcezyo6o146zb8hm6dft8tkp79za3sxwjym5rx',
// The address to send to
toAddress: 'nano_1q3hqecaw15cjt7thbtxu3pbzr1eihtzzpzxguoc37bj1wc5ffoh7w74gi6p',
// From wallet info
representativeAddress: 'nano_1stofnrxuz3cai7ze75o174bpm7scwj9jn3nxsn8ntzg784jf1gzn1jjdkou',
// Previous block, from wallet info
frontier: '92BA74A7D6DC7557F3EDA95ADC6341D51AC777A0A6FF0688A5C492AB2B2CB40D',
// The amount to send in RAW
amountRaw: '2000000000000000000000000000000',
// Generate work on server-side or with a DPOW service
work: 'fbffed7c73b61367',
}
// Returns a correctly formatted and signed block ready to be sent to the blockchain
const signedBlock = block.send(data, privateKey)
import { block } from 'nanocurrency-web'
const privateKey = '781186FB9EF17DB6E3D1056550D9FAE5D5BBADA6A6BC370E4CBB938B1DC71DA3';
const data = {
// Your current balance, from account info
walletBalanceRaw: '3000000000000000000000000000000',
// Your wallet address
address: 'nano_3igf8hd4sjshoibbbkeitmgkp1o6ug4xads43j6e4gqkj5xk5o83j8ja9php',
// The new representative
representativeAddress: 'nano_1anrzcuwe64rwxzcco8dkhpyxpi8kd7zsjc1oeimpc3ppca4mrjtwnqposrs',
// Previous block, from account info
frontier: '128106287002E595F479ACD615C818117FCB3860EC112670557A2467386249D4',
// Generate work on the server side or with a DPOW service
work: '0000000000000000',
}
// Returns a correctly formatted and signed block ready to be sent to the blockchain
const signedBlock = block.representative(data, privateKey)
Supported unit values are RAW, NANO, MRAI, KRAI, RAW.
import { tools } from 'nanocurrency-web'
// Convert 1 Nano to RAW
const converted = tools.convert('1', 'NANO', 'RAW')
// Convert 1 RAW to Nano
const converted = tools.convert('1000000000000000000000000000000', 'RAW', 'NANO')
For example implementing client side login with the password being the user's e-mail signed with their private key. Make sure that you double check the signature on the back-end side with the public key.
import { tools } from 'nanocurrency-web'
const privateKey = '781186FB9EF17DB6E3D1056550D9FAE5D5BBADA6A6BC370E4CBB938B1DC71DA3'
const signed = tools.sign(privateKey, 'foo@bar.com')
import { tools } from 'nanocurrency-web'
// Validate Nano address
const valid = tools.validateAddress('nano_1pu7p5n3ghq1i1p4rhmek41f5add1uh34xpb94nkbxe8g4a6x1p69emk8y1d')
// Validate mnemonic words
const valid = tools.validateMnemonic('edge defense waste choose enrich upon flee junk siren film clown finish luggage leader kid quick brick print evidence swap drill paddle truly occur')
<script src="https://unpkg.com/nanocurrency-web@1.2.2" type="text/javascript"></script>
<script type="text/javascript">
NanocurrencyWeb.wallet.generate(...);
</script>
You are welcome to contribute to the module. To develop, use the following commands.
-
npm install
to install all the dependencies -
npm run build
to build the Typescript code -
npm run test
to run the tests
If this helped you in your endeavours and you feel like supporting the developer, feel free to donate some Nano:
nano_1wmcgzbqgbyyawsto6t37sc6y7pkekpctzp7n3ay6pcxcy717p5g79rpfj7e