UNPKG

web3-hdwallet-provider

Version:

HD Wallet-enabled Web3 provider, forked from truffle-hdwallet-provider

146 lines (126 loc) 5.18 kB
const Ganache = require("ganache-core"); const assert = require("assert"); const WalletProvider = require("../index.js"); const EthUtil = require("ethereumjs-util"); describe("HD Wallet Provider", function() { const mnemonic = "ill song party come kid carry calm captain state purse weather ozone"; const Web3 = require("web3"); const web3 = new Web3(); const port = 18545; let server; let provider; before(done => { server = Ganache.server({ mnemonic }); server.listen(port, done); }); after(done => { setTimeout(() => server.close(done), 100); }); afterEach(() => { web3.setProvider(null); provider.engine.stop(); }); it("provides for a mnemonic", function(done) { const truffleDevAccounts = [ "0x8517156cbdf189a1531b808d1069efc46af49e01", "0x4374f12c29383ef13443424ec9896278ba223f76", "0xb956c983a0b02f4f369aca692890e503f7a5a6e1", "0x1d6353fa8519271fc4ac6f058abe62c5769823c2", "0x129fa6eaf6309edf90c5a21d50d928dc8e832120", "0x4b8c50b81075b47d22b19d1b34fa8ef9f08b9fbc", "0x2ff6fa306c8c35dd5ee62c6b9e12f70ccb76e00a", "0x5d9588c28b8c540b81a4497ca484c8f07d7b8622", "0x6a0f980c564a7a9b95479229a0bd55a8151d5365", "0x005d725c9305a11cf5abeea195f3d21a749d6a25" ]; provider = new WalletProvider(mnemonic, `http://localhost:${port}`, 0, 10); assert.deepEqual(provider.getAddresses(), truffleDevAccounts); web3.setProvider(provider); web3.eth.getBlockNumber((err, number) => { assert(number === 0); done(); }); }); it("throws on invalid mnemonic", function(done) { try { provider = new WalletProvider( "takoyaki is delicious", "http://localhost:8545", 0, 1 ); assert.fail("Should throw on invalid mnemonic"); } catch (e) { assert.equal(e.message, "Mnemonic invalid or undefined"); done(); } }); it("provides for a private key", function(done) { const privateKey = "3f841bf589fdf83a521e55d51afddc34fa65351161eead24f064855fc29c9580"; //random valid private key generated with ethkey provider = new WalletProvider(privateKey, `http://localhost:${port}`); web3.setProvider(provider); const addresses = provider.getAddresses(); assert.equal(addresses[0], "0xc515db5834d8f110eee96c3036854dbf1d87de2b"); addresses.forEach(address => { assert(EthUtil.isValidAddress(address), "invalid address"); }); web3.eth.getBlockNumber((err, number) => { assert(number === 0); done(); }); }); it("provides for an array of private keys", function(done) { const privateKeys = [ "3f841bf589fdf83a521e55d51afddc34fa65351161eead24f064855fc29c9580", "9549f39decea7b7504e15572b2c6a72766df0281cea22bd1a3bc87166b1ca290" ]; const privateKeysByAddress = { "0xc515db5834d8f110eee96c3036854dbf1d87de2b": "3f841bf589fdf83a521e55d51afddc34fa65351161eead24f064855fc29c9580", "0xbd3366a0e5d2fb52691e3e08fabe136b0d4e5929": "9549f39decea7b7504e15572b2c6a72766df0281cea22bd1a3bc87166b1ca290" }; provider = new WalletProvider( privateKeys, `http://localhost:${port}`, 0, privateKeys.length ); //pass in num_addresses to load full array web3.setProvider(provider); const addresses = provider.getAddresses(); assert.equal( addresses.length, privateKeys.length, "incorrect number of wallets derived" ); addresses.forEach(address => { assert(EthUtil.isValidAddress(address), "invalid address"); const privateKey = Buffer.from(privateKeysByAddress[address], "hex"); const expectedAddress = `0x${EthUtil.privateToAddress( privateKey ).toString("hex")}`; assert.equal( address, expectedAddress, "incorrect address for private key" ); }); web3.eth.getBlockNumber((err, number) => { assert(number === 0); done(); }); }); it("should handle signTypedData", function(done) { provider = new WalletProvider(mnemonic, `http://localhost:${port}`, 0, 10); provider.sendAsync({ jsonrpc: "2.0", method: "eth_signTypedData", params: ["0x4374F12c29383eF13443424EC9896278Ba223F76", {"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"},{"name":"salt","type":"bytes32"}],"Grant":[{"name":"customer","type":"address"},{"name":"amount","type":"uint256"}]},"domain":{"name":"EtherPhoneBooth.GrantAllowance","version":"1","chainId":5777,"verifyingContract":"0xd5a8ea43e5BD67bF99dA56DcEe2A2325cDE7bB3c","salt":"0xb225c57bf2111d6955b97ef0f55525b5a400dc909a5506e34b102e193dd53406"},"primaryType":"Grant","message":{"customer":"0x4374F12c29383eF13443424EC9896278Ba223F76","amount":"100000000000000000"}}] }, (err, result) => { if (err) return done(err); assert.equal(result.result, "0x56b13c676dbabd14493e1a58cf9f38f1e914dc0abc555641ab7db4de03e587045a6641a2b137db4baf2a3a0e9f37a24fef9bf2dbe645b62601e9a6a7d77d404f1b"); done(); }); }); });