-
Notifications
You must be signed in to change notification settings - Fork 57
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #248 from thanhson1085/master
update hdpath
- Loading branch information
Showing
8 changed files
with
230 additions
and
116 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
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 NonceSubProvider = require('web3-provider-engine/subproviders/nonce-tracker.js') | ||
var HookedSubprovider = require('web3-provider-engine/subproviders/hooked-wallet.js') | ||
var ProviderSubprovider = require('web3-provider-engine/subproviders/provider.js') | ||
var Web3 = require('web3') | ||
var Transaction = require('ethereumjs-tx') | ||
|
||
// This line shares nonce state across multiple provider instances. Necessary | ||
// because within truffle the wallet is repeatedly newed if it's declared in the config within a | ||
// function, resetting nonce from tx to tx. An instance can opt out | ||
// of this behavior by passing `shareNonce=false` to the constructor. | ||
// See issue #65 for more | ||
var singletonNonceSubProvider = new NonceSubProvider() | ||
|
||
/* eslint-disable */ | ||
|
||
function HDWalletProvider ( | ||
mnemonic, | ||
provider_url, | ||
address_index = 0, | ||
num_addresses = 1, | ||
shareNonce = true | ||
) { | ||
this.mnemonic = mnemonic | ||
this.hdwallet = hdkey.fromMasterSeed(bip39.mnemonicToSeed(mnemonic)) | ||
this.wallet_hdpath = "m/44'/889'/0'/0/" | ||
this.wallets = {} | ||
this.addresses = [] | ||
|
||
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 | ||
|
||
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') | ||
cb(null, rawTx) | ||
} | ||
})); | ||
|
||
(!shareNonce) | ||
? this.engine.addProvider(new NonceSubProvider()) | ||
: this.engine.addProvider(singletonNonceSubProvider) | ||
|
||
this.engine.addProvider(new FiltersSubprovider()) | ||
this.engine.addProvider(new ProviderSubprovider(new Web3.providers.HttpProvider(provider_url))) | ||
this.engine.start() // Required by the provider engine. | ||
}; | ||
|
||
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 | ||
} | ||
/* eslint-enable */ | ||
|
||
module.exports = { HDWalletProvider } |
Oops, something went wrong.