Fixed legacy parameters for Providers and added test cases.
This commit is contained in:
parent
4df288e244
commit
11f0434bdd
@ -14,18 +14,18 @@ var utils = (function() {
|
||||
function FallbackProvider(providers) {
|
||||
if (providers.length === 0) { throw new Error('no providers'); }
|
||||
|
||||
for (var i = 1; i < providers.length; i++) {
|
||||
if (providers[0].chainId !== providers[i].chainId) {
|
||||
throw new Error('incompatible providers - chainId mismatch');
|
||||
var network = {};
|
||||
['chainId', 'ensAddress', 'name', 'testnet'].forEach(function(key) {
|
||||
for (var i = 1; i < providers.length; i++) {
|
||||
if (providers[0][key] !== providers[i][key]) {
|
||||
throw new Error('incompatible providers - ' + key + ' mismatch');
|
||||
}
|
||||
}
|
||||
|
||||
if (providers[0].testnet !== providers[i].testnet) {
|
||||
throw new Error('incompatible providers - testnet mismatch');
|
||||
}
|
||||
}
|
||||
network[key] = providers[0][key];
|
||||
});
|
||||
|
||||
if (!(this instanceof FallbackProvider)) { throw new Error('missing new'); }
|
||||
Provider.call(this, providers[0].testnet, providers[0].chainId);
|
||||
Provider.call(this, network);
|
||||
|
||||
providers = providers.slice(0);
|
||||
Object.defineProperty(this, 'providers', {
|
||||
|
@ -12,15 +12,9 @@ var utils = (function() {
|
||||
function InfuraProvider(network, apiAccessToken) {
|
||||
if (!(this instanceof InfuraProvider)) { throw new Error('missing new'); }
|
||||
|
||||
// Legacy constructor (testnet, chainId, apiAccessToken)
|
||||
// Legacy constructor (testnet, apiAccessToken)
|
||||
// @TODO: Remove this in the next major release
|
||||
if (arguments.length === 3) {
|
||||
apiAccessToken = arguments[2];
|
||||
network = Provider._legacyConstructor(network, 2, arguments[0], arguments[1]);
|
||||
} else {
|
||||
apiAccessToken = null;
|
||||
network = Provider._legacyConstructor(network, arguments.length, arguments[0], arguments[1]);
|
||||
}
|
||||
network = Provider._legacyConstructor(network, 1, arguments[0]);
|
||||
|
||||
var host = null;
|
||||
switch(network.name) {
|
||||
|
@ -51,9 +51,30 @@ function getTransaction(transaction) {
|
||||
function JsonRpcProvider(url, network) {
|
||||
if (!(this instanceof JsonRpcProvider)) { throw new Error('missing new'); }
|
||||
|
||||
network = Provider._legacyConstructor(network, arguments.length - 1, arguments[1], arguments[2]);
|
||||
// Legacy Contructor (url, [ testnet, [ chainId ] ])
|
||||
// @TODO: Remove this in the next major version
|
||||
|
||||
Provider.call(this, network);
|
||||
var args = [];
|
||||
|
||||
// Legacy without a url
|
||||
if (typeof(url) !== 'string' || Provider.networks[url] != null) {
|
||||
// url => network
|
||||
args.push(url);
|
||||
|
||||
// network => chainId
|
||||
if (network != null) { args.push(network); }
|
||||
|
||||
url = null;
|
||||
|
||||
} else if (arguments.length === 2) {
|
||||
args.push(arguments[1]);
|
||||
|
||||
} else if (arguments.length === 3) {
|
||||
args.push(arguments[1]);
|
||||
args.push(arguments[2]);
|
||||
}
|
||||
|
||||
Provider.apply(this, args);
|
||||
|
||||
if (!url) { url = 'http://localhost:8545'; }
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "ethers-providers",
|
||||
"version": "2.1.8",
|
||||
"version": "2.1.9",
|
||||
"description": "Service provider for Ethereum wallet library.",
|
||||
"bugs": {
|
||||
"url": "http://github.com/ethers-io/ethers.js/issues",
|
||||
|
@ -3,7 +3,9 @@
|
||||
var assert = require('assert');
|
||||
|
||||
var providers = require('../providers');
|
||||
|
||||
var bigNumberify = require('../utils/bignumber').bigNumberify;
|
||||
var getAddress = require('../utils/address').getAddress;
|
||||
|
||||
var blockchainData = {
|
||||
homestead: {
|
||||
@ -310,7 +312,7 @@ function testProvider(providerName, networkName) {
|
||||
// - call
|
||||
// - getLogs
|
||||
//
|
||||
// Many of these are tested in run-providers, which uses nodeunit, but
|
||||
// Many of these are tLegacyParametersested in run-providers, which uses nodeunit, but
|
||||
// also creates a local private key which must then be funded to
|
||||
// execute the tests. I am working on a better test contract to deploy
|
||||
// to all the networks to help test these.
|
||||
@ -323,3 +325,270 @@ function testProvider(providerName, networkName) {
|
||||
});
|
||||
});
|
||||
|
||||
function getDefaults(network, extra) {
|
||||
var network = providers.networks[network];
|
||||
var result = {
|
||||
chainId: network.chainId,
|
||||
ensAddress: (network.ensAddress ? getAddress(network.ensAddress): null),
|
||||
name: network.name,
|
||||
testnet: (network.name !== 'homestead'),
|
||||
};
|
||||
for (var key in extra) {
|
||||
result[key] = extra[key];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
var LegacyParameters = [
|
||||
|
||||
// InfuraProvider
|
||||
{
|
||||
create: function() {
|
||||
return new providers.InfuraProvider();
|
||||
},
|
||||
name: 'InfuraProvider - defaults',
|
||||
properties: getDefaults('homestead', { apiAccessToken: null })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.InfuraProvider(false);
|
||||
},
|
||||
name: 'InfuraProvider - false',
|
||||
properties: getDefaults('homestead', { apiAccessToken: null })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.InfuraProvider('homestead');
|
||||
},
|
||||
name: 'InfuraProvider - homestead',
|
||||
properties: getDefaults('homestead', { apiAccessToken: null })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.InfuraProvider(false, 'abcdefg');
|
||||
},
|
||||
name: 'InfuraProvider - false + API token',
|
||||
properties: getDefaults('homestead', { apiAccessToken: 'abcdefg' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.InfuraProvider('homestead', 'abcdefg');
|
||||
},
|
||||
name: 'InfuraProvider - homestead + API token',
|
||||
properties: getDefaults('homestead', { apiAccessToken: 'abcdefg' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.InfuraProvider(true);
|
||||
},
|
||||
name: 'InfuraProvider - true',
|
||||
properties: getDefaults('ropsten', { apiAccessToken: null })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.InfuraProvider(true, 'abcdefg');
|
||||
},
|
||||
name: 'InfuraProvider - true + API token',
|
||||
properties: getDefaults('ropsten', { apiAccessToken: 'abcdefg' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.InfuraProvider('ropsten', 'abcdefg');
|
||||
},
|
||||
name: 'InfuraProvider - ropsten + API token',
|
||||
properties: getDefaults('ropsten', { apiAccessToken: 'abcdefg' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.InfuraProvider('rinkeby');
|
||||
},
|
||||
name: 'InfuraProvider - rinkeby',
|
||||
properties: getDefaults('rinkeby', { apiAccessToken: null })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.InfuraProvider('rinkeby', 'abcdefg');
|
||||
},
|
||||
name: 'InfuraProvider - rinkeby + API token',
|
||||
properties: getDefaults('rinkeby', { apiAccessToken: 'abcdefg' })
|
||||
},
|
||||
|
||||
// EtherscanProvider
|
||||
{
|
||||
create: function() {
|
||||
return new providers.EtherscanProvider();
|
||||
},
|
||||
name: 'EtherscanProvider - defaults',
|
||||
properties: getDefaults('homestead', { apiKey: null })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.EtherscanProvider(false);
|
||||
},
|
||||
name: 'EtherscanProvider - false',
|
||||
properties: getDefaults('homestead', { apiKey: null })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.EtherscanProvider('homestead');
|
||||
},
|
||||
name: 'EtherscanProvider - homestead',
|
||||
properties: getDefaults('homestead', { apiKey: null })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.EtherscanProvider(false, 'abcdefg');
|
||||
},
|
||||
name: 'EtherscanProvider - false + API token',
|
||||
properties: getDefaults('homestead', { apiKey: 'abcdefg' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.EtherscanProvider('homestead', 'abcdefg');
|
||||
},
|
||||
name: 'EtherscanProvider - homestead + API token',
|
||||
properties: getDefaults('homestead', { apiKey: 'abcdefg' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.EtherscanProvider(true);
|
||||
},
|
||||
name: 'EtherscanProvider - true',
|
||||
properties: getDefaults('ropsten', { apiKey: null })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.EtherscanProvider(true, 'abcdefg');
|
||||
},
|
||||
name: 'EtherscanProvider - true + API token',
|
||||
properties: getDefaults('ropsten', { apiKey: 'abcdefg' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.EtherscanProvider('ropsten', 'abcdefg');
|
||||
},
|
||||
name: 'EtherscanProvider - ropsten + API token',
|
||||
properties: getDefaults('ropsten', { apiKey: 'abcdefg' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.EtherscanProvider('rinkeby');
|
||||
},
|
||||
name: 'EtherscanProvider - rinkeby',
|
||||
properties: getDefaults('rinkeby', { apiKey: null })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.EtherscanProvider('rinkeby', 'abcdefg');
|
||||
},
|
||||
name: 'EtherscanProvider - rinkeby + API token',
|
||||
properties: getDefaults('rinkeby', { apiKey: 'abcdefg' })
|
||||
},
|
||||
|
||||
// JsonRpcProvider
|
||||
{
|
||||
create: function() {
|
||||
return new providers.JsonRpcProvider(undefined, 101);
|
||||
},
|
||||
name: 'JsonRpcProvider - undef + chainId',
|
||||
properties: getDefaults('homestead', { chainId: 101, url: 'http://localhost:8545' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.JsonRpcProvider('http://something', undefined, 101);
|
||||
},
|
||||
name: 'JsonRpcProvider - URL + undef + chainId',
|
||||
properties: getDefaults('homestead', { chainId: 101, url: 'http://something' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.JsonRpcProvider(false, 101);
|
||||
},
|
||||
name: 'JsonRpcProvider - false + chainId',
|
||||
properties: getDefaults('homestead', { chainId: 101, url: 'http://localhost:8545' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.JsonRpcProvider('http://something', false, 101);
|
||||
},
|
||||
name: 'JsonRpcProvider - URL + false + chainId',
|
||||
properties: getDefaults('homestead', { chainId: 101, url: 'http://something' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.JsonRpcProvider(true, 101);
|
||||
},
|
||||
name: 'JsonRpcProvider - true + chainId',
|
||||
properties: getDefaults('ropsten', { chainId: 101, url: 'http://localhost:8545' })
|
||||
},
|
||||
{
|
||||
create: function() {
|
||||
return new providers.JsonRpcProvider('http://something', true, 101);
|
||||
},
|
||||
name: 'JsonRpcProvider - URL + true + chainId',
|
||||
properties: getDefaults('ropsten', { chainId: 101, url: 'http://something' })
|
||||
},
|
||||
];
|
||||
|
||||
[true, false, 'default', 'homestead', 'ropsten', 'rinkeby', 'kovan'].forEach(function(networkName) {
|
||||
var defaultsName = networkName;
|
||||
if (networkName === false || networkName === 'default') {
|
||||
defaultsName = 'homestead';
|
||||
} else if (networkName === true) {
|
||||
defaultsName = 'ropsten';
|
||||
}
|
||||
|
||||
LegacyParameters.push({
|
||||
create: function() {
|
||||
if (networkName === 'default') {
|
||||
return providers.getDefaultProvider();
|
||||
}
|
||||
return providers.getDefaultProvider(networkName);
|
||||
},
|
||||
name: ('getDefaultProvider - ' + networkName),
|
||||
properties: getDefaults(defaultsName, { })
|
||||
});
|
||||
});
|
||||
|
||||
[true, false, 'default', 'homestead', 'ropsten', 'rinkeby', 'kovan'].forEach(function(networkName) {
|
||||
var defaultsName = networkName;
|
||||
if (networkName === false || networkName === 'default') {
|
||||
defaultsName = 'homestead';
|
||||
} else if (networkName === true) {
|
||||
defaultsName = 'ropsten';
|
||||
}
|
||||
|
||||
LegacyParameters.push({
|
||||
create: function() {
|
||||
if (networkName === 'default') {
|
||||
return new providers.JsonRpcProvider();
|
||||
}
|
||||
return new providers.JsonRpcProvider(networkName);
|
||||
},
|
||||
name: ('JsonRpcProvider - ' + networkName),
|
||||
properties: getDefaults(defaultsName, { url: 'http://localhost:8545' })
|
||||
});
|
||||
|
||||
LegacyParameters.push({
|
||||
create: function() {
|
||||
if (networkName === 'default') {
|
||||
return new providers.JsonRpcProvider('http://something');
|
||||
}
|
||||
return new providers.JsonRpcProvider('http://something', networkName);
|
||||
},
|
||||
name: ('JsonRpcProvider - URL + ' + networkName),
|
||||
properties: getDefaults(defaultsName, { url: 'http://something' })
|
||||
});
|
||||
});
|
||||
|
||||
describe('Test legacy provider arguments', function() {
|
||||
LegacyParameters.forEach(function(test) {
|
||||
it(('creates legacy - ' + test.name), function() {
|
||||
var provider = test.create();
|
||||
for (var key in test.properties) {
|
||||
assert.equal(provider[key], test.properties[key], ('provider equals ' + key));
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user