forked from trufflesuite/truffle-hdwallet-provider
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathindex.js
94 lines (81 loc) · 3.36 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
var bip39 = require("bip39");
var hdkey = require('ethereumjs-wallet/hdkey');
var ProviderEngine = require("web3-provider-engine");
var FiltersSubprovider = require('web3-provider-engine/subproviders/filters.js');
var HookedSubprovider = require('web3-provider-engine/subproviders/hooked-wallet.js');
var Web3Subprovider = require("web3-provider-engine/subproviders/web3.js");
var Web3 = require("web3");
var Transaction = require('ethereumjs-tx');
function HDWalletProvider(mnemonic, provider_url, address_index=0, num_addresses=1) {
this.mnemonic = mnemonic;
this.hdwallet = hdkey.fromMasterSeed(bip39.mnemonicToSeed(mnemonic));
this.wallet_hdpath = "m/44'/60'/0'/0/";
this.wallets = {};
this.addresses = [];
this.addressesToDispose = [];
for (let i = address_index; i < address_index + num_addresses; i++){
var wallet = this.hdwallet.derivePath(this.wallet_hdpath + i).getWallet();
var addr = '0x' + wallet.getAddress().toString('hex');
this.addresses.push(addr);
this.wallets[addr] = wallet;
}
const tmp_accounts = this.addresses;
const tmp_wallets = this.wallets;
const addressesToDispose = this.addressesToDispose;
const dispose = function(address) {
const indexA = addressesToDispose.indexOf(address);
const indexB = tmp_accounts.indexOf(address);
if (indexA === -1) {
return;
}
addressesToDispose.splice(indexA, 1);
tmp_accounts.splice(indexB, 1);
delete tmp_wallets[address];
}
this.engine = new ProviderEngine();
this.engine.addProvider(new HookedSubprovider({
getAccounts: function(cb) { cb(null, tmp_accounts) },
getPrivateKey: function(address, cb) {
if (!tmp_wallets[address]) { return cb('Account not found'); }
else { cb(null, tmp_wallets[address].getPrivateKey().toString('hex')); }
},
signTransaction: function(txParams, cb) {
let pkey;
if (tmp_wallets[txParams.from]) { pkey = tmp_wallets[txParams.from].getPrivateKey(); }
else { cb('Account not found'); }
var tx = new Transaction(txParams);
tx.sign(pkey);
var rawTx = '0x' + tx.serialize().toString('hex');
dispose(txParams.from);
cb(null, rawTx);
}
}));
this.engine.addProvider(new FiltersSubprovider());
this.engine.addProvider(new Web3Subprovider(new Web3.providers.HttpProvider(provider_url)));
this.engine.start(); // Required by the provider engine.
};
HDWalletProvider.prototype.unlock = function(mnemonic, index) {
const hdwallet = hdkey.fromMasterSeed(bip39.mnemonicToSeed(mnemonic));
const wallet = hdwallet.derivePath(this.wallet_hdpath + index).getWallet();
const address = '0x' + wallet.getAddress().toString('hex');
this.addresses.push(address);
this.wallets[address] = wallet;
this.addressesToDispose.push(address)
};
HDWalletProvider.prototype.sendAsync = function() {
this.engine.sendAsync.apply(this.engine, arguments);
};
HDWalletProvider.prototype.send = function() {
return this.engine.send.apply(this.engine, arguments);
};
// returns the address of the given address_index, first checking the cache
HDWalletProvider.prototype.getAddress = function(idx) {
console.log('getting addresses', this.addresses[0], idx)
if (!idx) { return this.addresses[0]; }
else { return this.addresses[idx]; }
}
// returns the addresses cache
HDWalletProvider.prototype.getAddresses = function() {
return this.addresses;
}
module.exports = HDWalletProvider;