A lightweight wallet implementation. At the moment it supports key creation and conversion between various formats.
It is complemented by the following packages:
- expansejs-tx to sign transactions
- expansejs-icap to manipulate ICAP addresses
- store.js to use browser storage
- be lightweight
- work in a browser
- use a single, maintained version of crypto library (and that should be in line with
- support import/export between various wallet formats
- support BIP32 HD keys
Features not supported:
- signing transactions
- managing storage (neither in node.js or the browser)
generate([icap])- create an instance based on a new random key (setting
icapto true will generate an address suitable for the
ICAP Direct mode)
generateVanityAddress(pattern)- create an instance where the address is valid against the supplied pattern (this will be very slow)
fromPrivateKey(input)- create an instance based on a raw private key
fromExtendedPrivateKey(input)- create an instance based on a BIP32 extended private key (xprv)
fromPublicKey(input, [nonStrict])- create an instance based on a public key (certain methods will not be available)
fromExtendedPublicKey(input)- create an instance based on a BIP32 extended public key (xpub)
fromV1(input, password)- import a wallet (Version 1 of the Ethereum wallet format)
fromV3(input, password, [nonStrict])- import a wallet (Version 3 of the Ethereum wallet format). Set
nonStricttrue to accept files with mixed-caps.
fromEthSale(input, password)- import an Ethereum Pre Sale wallet
For the V1, V3 and EthSale formats the input is a JSON serialized string. All these formats require a password.
fromPublicKey() only accepts uncompressed Ethereum-style public keys, unless the
nonStrict flag is set to true.
getPrivateKey()- return the private key
getPublicKey()- return the public key
getAddress()- return the address
getChecksumAddressString()- return the address with checksum
getV3Filename([timestamp])- return the suggested filename for V3 keystores
toV3(password, [options])- return the wallet as a JSON string (Version 3 of the Ethereum wallet format)
All of the above instance methods return a Buffer or JSON. Use the
String suffixed versions for a string output, such as
getPublicKey() only returns uncompressed Ethereum-style public keys.
Importing various third party wallets is possible through the
var thirdparty = require('expansejs-wallet/thirdparty')
fromEtherCamp(passphrase)- import a brain wallet used by Ether.Camp
fromEtherWallet(input, password)- import a wallet generated by EtherWallet
fromKryptoKit(seed)- import a wallet from a KryptoKit seed
fromQuorumWallet(passphrase, userid)- import a brain wallet used by Quorum Wallet
HD Wallet API
To use BIP32 HD wallets, first include the
var hdkey = require('expansejs-wallet/hdkey')
fromMasterSeed(seed)- create an instance based on a seed
fromExtendedKey(key)- create an instance based on a BIP32 extended private or public key
For the seed we suggest to use bip39 to create one from a BIP39 mnemonic.
privateExtendedKey()- return a BIP32 extended private key (xprv)
publicExtendedKey()- return a BIP32 extended public key (xpub)
derivePath(path)- derive a node based on a path (e.g. m/44'/0'/0/1)
deriveChild(index)- derive a node based on a child index
getWallet()- return a
Walletinstance as seen above
The Wallet can be easily plugged into provider-engine to provide signing:
const WalletSubprovider =<engine>
Note it only supports the basic wallet. With a HD Wallet, call
options is an optional object hash, where all the serialization parameters can be fine tuned:
- uuid - UUID. One is randomly generated.
- salt - Random salt for the
kdf. Size must match the requirements of the KDF (key derivation function). Random number generated via
crypto.getRandomBytesif nothing is supplied.
- iv - Initialization vector for the
cipher. Size must match the requirements of the cipher. Random number generated via
crypto.getRandomBytesif nothing is supplied.
- kdf - The key derivation function, see below.
- dklen - Derived key length. For certain
ciphersettings, this must match the block sizes of those.
- cipher - The cipher to use. Names must match those of supported by
Depending on the
kdf selected, the following options are available too.
c- Number of iterations. Defaults to 262144.
prf- The only supported (and default) value is
hmac-sha256. So no point changing it.
n- Iteration count. Defaults to 262144.
r- Block size for the underlying hash. Defaults to 8.
p- Parallelization factor. Defaults to 1.
The following settings are favoured by the Go Ethereum implementation and we default to the same:
Copyright (C) 2016 Alex Beregszaszi