web3-zeus-provider
Version:
Reliable web3 provider that uses multiple RPC API connections and switches between them in case of failure
51 lines (43 loc) • 2.28 kB
JavaScript
const ProviderEngine = require("web3-provider-engine");
const FiltersSubprovider = require('web3-provider-engine/subproviders/filters.js');
const WalletSubprovider = require('web3-provider-engine/subproviders/wallet.js');
const ProviderSubprovider = require("web3-provider-engine/subproviders/provider.js");
const HookedWalletEthTxSubprovider = require("web3-provider-engine/subproviders/hooked-wallet-ethtx");
const EthereumjsWallet = require('ethereumjs-wallet');
const Web3 = require("web3");
const NonceSubprovider = require('web3-provider-engine/subproviders/nonce-tracker.js');
const RpcSubprovider = require("web3-provider-engine/subproviders/rpc.js");
function PrivateKeyProvider(privateKey, providerUrl) {
// this.wallet = EthereumjsWallet.fromPrivateKey(new Buffer(privateKey, "hex"));
// this.address = "0x" + this.wallet.getAddress().toString("hex");
this.engine = new ProviderEngine();
this.engine.addProvider(new FiltersSubprovider());
this.engine.addProvider(new NonceSubprovider());
// this.engine.addProvider(new WalletSubprovider(this.wallet, {}));
this.engine.addProvider(new HookedWalletEthTxSubprovider({
getAccounts: (cb) => {
cb(null, ["0x9D889b9c7cc90B7cD2324b3Bb514a2E2ec82aC4e"]);
},
getPrivateKey: (address, cb) => {
console.log("GetPK", address);
cb(null, Buffer.from("55572648561528C5964648FEB815211574A945B439318821602B8C60DF9FF40F", "hex"));
}
}));
// HACK: `sendAsync` was removed
// if (!Web3.providers.HttpProvider.prototype.sendAsync) {
// Web3.providers.HttpProvider.prototype.sendAsync = Web3.providers.HttpProvider.prototype.send
// }
// this.engine.addProvider(new ProviderSubprovider(new Web3.providers.HttpProvider(providerUrl)));
this.engine.addProvider(new RpcSubprovider({
rpcUrl: providerUrl,
}));
this.engine.start();
}
PrivateKeyProvider.prototype.sendAsync = function() {
console.log("sendAsync private-key-provider");
this.engine.sendAsync.apply(this.engine, arguments);
};
PrivateKeyProvider.prototype.send = function() {
return this.engine.send.apply(this.engine, arguments);
};
module.exports = PrivateKeyProvider;