Simple Nano Wallet
Simple nano wallet with in memory key managment. Originally made by Nanswap Nodes, rewritten in typescript and added some features. Rewritten by nx2
Core Features
- Easily send and receive nano with local signature
- Use your own node or any node provider
- Auto receive blocks of wallet accounts with websocket
- Receive blocks (manually)
- Create wallet from seed or from random entropy
- Create derived accounts
- Suppport custom prefix & decimal for custom network such as Banano or DogeNano
New Features
- TypeScript support & refactored code
- Allow multiple nodes for RPC & Work servers for failover
Installation
Using npm
npm install simple-nano-wallet
Using yarn
yarn add simple-nano-wallet
Usage:
Create new wallet
import { randomBytes } from 'crypto';
import { Wallet } from 'simple-nano-wallet';
const seed = randomBytes(32).toString('hex').toUpperCase();
// initialize wallet
const wallet = new Wallet({
rpcUrls: 'http://127.0.0.1:7076', // if you have multiple nodes, you can provide an array of nodes
workUrls: ['http://127.0.0.1:7076', 'https://fallback-node.com'], // multiple nodes for failover, singular node passed as string is also valid
wsUrl: `ws://127.0.0.1:7078`,
defaultRep: "nano_1banexkcfuieufzxksfrxqf6xy8e57ry1zdtq9yn7jntzhpwu4pg4hajojmq",
seed,
});
// Generate 10 derived accounts
wallet.createAccounts(10)
console.log(wallet.accounts)
// ["nano_3g5hpb4kwqgakt4cx11ftq6xztx1matfhgkmhunj3sx4f4s3nwb6hfi3nts1", ... ]
Auto Receive
By default, when a websocket is provided, receivable blocks for all wallet accounts will be processed automatically.
To disable this feature, set autoReceive
to false when initializing the wallet.
Manually Receive
// receive receivable block for an account
const hash = "A1B2C3D4E5F6..."
const amount = wallet.tools.megaToRaw(0.001)
await wallet.receiveFunds("nano_3g5hpb4kwqgakt4cx11ftq6xztx1matfhgkmhunj3sx4f4s3nwb6hfi3nts1", { hash, amount })
Send
// send 0.001 nano from nano_3g5hp... to nano_3g5hp...
const hash = await wallet.sendFunds({
source: "nano_3g5hpb4kwqgakt4cx11ftq6xztx1matfhgkmhunj3sx4f4s3nwb6hfi3nts1", // IMPORTANT: must be in wallet.accounts.
destination: "nano_3g5hpb4kwqgakt4cx11ftq6xztx1matfhgkmhunj3sx4f4s3nwb6hfi3nts1",
amount: wallet.tools.megaToRaw(0.001),
})
console.log(hash)
// "A1B2C3D4E5F6..."
Custom networks
const headerAuth = { // custom header for authentification
"nodes-api-key": process.env.NODES_API_KEY
}
// DogeNano Wallet
const walletXDG = new Wallet({
rpcUrls: 'https://nodes.nanswap.com/XDG',
workUrls: 'https://nodes.nanswap.com/XDG',
wsUrl: `wss://nodes.nanswap.com/ws/?ticker=XDG&api=${process.env.NODES_API_KEY}`,
seed: seedXDG,
defaultRep: "xdg_1e4ecrhmcws6kwiegw8dsbq5jstq7gqj7fspjmgiu11q55s6xnsnp3t9jqxf",
addressPrefix: 'xdg_',
decimalPlaces: 26,
customHeaders: headerAuth,
subscribeAll: false,
})
// Banano Wallet
const walletBAN = new Wallet({
rpcUrls: 'https://nodes.nanswap.com/BAN',
workUrls: 'https://nodes.nanswap.com/BAN',
wsUrl: `wss://nodes.nanswap.com/ws/?ticker=BAN&api=${process.env.NODES_API_KEY}`,
seed: seedBAN,
defaultRep: "ban_1banexkcfuieufzxksfrxqf6xy8e57ry1zdtq9yn7jntzhpwu4pg4hajojmq",
addressPrefix: 'ban_',
decimalPlaces: 29,
customHeaders: headerAuth,
subscribeAll: false,
})
Despite the rewrite, this lib is still intended for small project (<5000 accounts), for a more scablable system, it is recommended to use a database to store the accounts keys.