This library is under rapid development and there may be frequent breaking changes. An audit is pending.
The Avalanche Wallet SDK is a TypeScript library for creating and managing non-custodial wallets on the Avalanche network.
It provides high-level methods to transact on Avalanche's X-Chain, P-Chain and C-Chain.
The wallet types are supported:
- Singleton Wallets
- Ledger Wallets
- Mnemonic Wallets
- XPUB Wallets
Using avalanche-wallet-sdk
, developers can:
- Receive and send tokens and NFTs.
- Transfer funds between chains
- Add a node to the validator set
- Delegate stake to a validator
- Create keystore files from wallet instances
- Get the transaction history of a wallet
- Mint NFTs on the X-Chain
Source code can be found in this library's Github repo.
npm install --save @avalabs/avalanche-wallet-sdk
yarn add @avalabs/avalanche-wallet-sdk
See here for Classes exposed by this library.
Every wallet instance will fire events to indicate changes in its state.
// Create a wallet instance
let myWallet = MnemonicWallet.create()
// Fired when the wallet starts using a new address
// Used only with HD wallets (Mnemonic, Ledger, and XPUB)
myWallet.on('addressChanged', (addresses)=>{
// Use the most recent addresses from the wallet
})
// Fired when X chain balance is updated
myWallet.on('balanceChangedX', (newBalance)=>{
// Recent X chain balance
})
// Fired when P chain AVAX balance is updated
myWallet.on('balanceChangedP', (newBalance)=>{
// Recent P chain AVAX balance
})
// Fired when C chain AVAX balance is updated
myWallet.on('balanceChangedC', (newBalance)=>{
// Recent C chain AVAX balance
})
import {MnemonicWallet, BN} from '@avalabs/avalanche-wallet-sdk'
let myWallet = MnemonicWallet.create()
// Mnemonic wallets need to find their HD index on startup
await myWallet.resetHdIndices()
// Update the UTXOs
await myWallet.updateUtxosX()
// Send 1 nAVAX
let to = "X-avax1r20dtfehaat9wev69ajzzfcwtll903vlcx50uh"
let amount = new BN(1)
let txID = await myWallet.sendAvax(to, amount)
By default the SDK is connected to the Avalanche Mainnet.
import { NetworkConstants, Network} from '@avalabs/avalanche-wallet-sdk';
// Set to Mainnet
Network.setNetwork(NetworkConstants.MainnetConfig)
// Set to Fuji Testnet
Network.setNetwork(NetworkConstants.TestnetConfig)
Token amounts are represented in their smallest divisible unit using BN.js. The Utils
namespace has helper functions to display BN numbers in a human readable way.
import {Utils} from '@avalabs/avalanche-wallet-sdk'
// On X-Chain and P-Chain AVAX has 9 decimals
let amtX = new BN(1234567000000)
Utils.bnToAvaxX(amtX) // 1,234.567
// On the C-Chain it has 18
let amtC = new BN(1234567000000000000000)
Utils.bnToAvaxC(amtC) // 1,234.567
Use the WebsocketProvider
class to update wallet balances in real time without polling.
import { Network, NetworkConstants } from 'avalanche-wallet-sdk';
// Create a websocket provider from the network currently used by the SDK
const provider = Network.WebsocketProvider.fromActiveNetwork()
// To track wallets and update their balances
provider.trackWallet(myWallet)
// To stop tracking wallets
// Make sure to call this to avoid memory leaks
provider.removeWallet(myWallet)
// To change provider network
provider.setNetwork(NetworkConstants.TestnetConfig) // connect to Fuji testnet
The SDK comes loaded with a set of ERC20 contracts. You can add additional contracts like this:
import { Assets } from '@avalabs/avalanche-wallet-sdk'
// Will try to fetch details about the ERC20 contract
try{
await Assets.addErc20Token('0x34B6C87bb59Eb37EFe35C8d594a234Cd8C654D50'); // Testnet DAI
}catch(e){
// Contract not found or not valid
}
// or from known data
let tokenData = {
chainId: 43114,
address: '0xbA7dEebBFC5fA1100Fb055a87773e1E99Cd3507a',
decimals: 18,
name: 'Dai Stablecoin',
symbol: 'DAI',
}
Assets.addErc20TokenFromData(tokenData)