2019-05-14 18:48:48 -04:00
|
|
|
"use strict";
|
2019-08-25 02:39:20 -04:00
|
|
|
import { Logger } from "@ethersproject/logger";
|
|
|
|
import { version } from "./_version";
|
|
|
|
const logger = new Logger(version);
|
2020-07-16 05:35:32 -04:00
|
|
|
;
|
|
|
|
function isRenetworkable(value) {
|
|
|
|
return (value && typeof (value.renetwork) === "function");
|
|
|
|
}
|
2019-05-14 18:48:48 -04:00
|
|
|
function ethDefaultProvider(network) {
|
2020-07-16 05:35:32 -04:00
|
|
|
const func = function (providers, options) {
|
2019-05-14 18:48:48 -04:00
|
|
|
if (options == null) {
|
|
|
|
options = {};
|
|
|
|
}
|
2019-11-20 18:57:38 +09:00
|
|
|
const providerList = [];
|
2022-03-09 02:56:08 -05:00
|
|
|
if (providers.InfuraProvider && options.infura !== "-") {
|
2019-05-14 18:48:48 -04:00
|
|
|
try {
|
|
|
|
providerList.push(new providers.InfuraProvider(network, options.infura));
|
|
|
|
}
|
|
|
|
catch (error) { }
|
|
|
|
}
|
2022-03-09 02:56:08 -05:00
|
|
|
if (providers.EtherscanProvider && options.etherscan !== "-") {
|
2019-05-14 18:48:48 -04:00
|
|
|
try {
|
2021-08-04 01:39:05 -03:00
|
|
|
providerList.push(new providers.EtherscanProvider(network, options.etherscan));
|
2019-05-14 18:48:48 -04:00
|
|
|
}
|
|
|
|
catch (error) { }
|
|
|
|
}
|
2022-03-09 02:56:08 -05:00
|
|
|
if (providers.AlchemyProvider && options.alchemy !== "-") {
|
2019-05-14 18:48:48 -04:00
|
|
|
try {
|
2021-05-19 00:05:36 -04:00
|
|
|
providerList.push(new providers.AlchemyProvider(network, options.alchemy));
|
2019-05-14 18:48:48 -04:00
|
|
|
}
|
|
|
|
catch (error) { }
|
|
|
|
}
|
2022-03-09 02:56:08 -05:00
|
|
|
if (providers.PocketProvider && options.pocket !== "-") {
|
2021-05-19 00:05:36 -04:00
|
|
|
// These networks are currently faulty on Pocket as their
|
2021-03-30 15:22:45 -04:00
|
|
|
// network does not handle the Berlin hardfork, which is
|
|
|
|
// live on these ones.
|
|
|
|
// @TODO: This goes away once Pocket has upgraded their nodes
|
2022-09-13 21:28:52 -04:00
|
|
|
const skip = ["goerli", "ropsten", "rinkeby", "sepolia"];
|
2021-02-01 15:56:47 -05:00
|
|
|
try {
|
2022-04-13 00:25:25 -04:00
|
|
|
const provider = new providers.PocketProvider(network, options.pocket);
|
2021-03-30 15:22:45 -04:00
|
|
|
if (provider.network && skip.indexOf(provider.network.name) === -1) {
|
|
|
|
providerList.push(provider);
|
|
|
|
}
|
2021-07-02 01:49:02 -04:00
|
|
|
}
|
|
|
|
catch (error) { }
|
2021-02-01 15:56:47 -05:00
|
|
|
}
|
2022-03-09 02:56:08 -05:00
|
|
|
if (providers.CloudflareProvider && options.cloudflare !== "-") {
|
2019-08-21 01:52:13 -04:00
|
|
|
try {
|
|
|
|
providerList.push(new providers.CloudflareProvider(network));
|
|
|
|
}
|
|
|
|
catch (error) { }
|
|
|
|
}
|
2022-03-19 02:59:38 -04:00
|
|
|
if (providers.AnkrProvider && options.ankr !== "-") {
|
|
|
|
try {
|
2022-06-17 14:56:33 -04:00
|
|
|
const skip = ["ropsten"];
|
|
|
|
const provider = new providers.AnkrProvider(network, options.ankr);
|
|
|
|
if (provider.network && skip.indexOf(provider.network.name) === -1) {
|
|
|
|
providerList.push(provider);
|
|
|
|
}
|
2022-03-19 02:59:38 -04:00
|
|
|
}
|
|
|
|
catch (error) { }
|
|
|
|
}
|
2024-02-23 22:30:55 -05:00
|
|
|
if (providers.QuickNodeProvider && options.quicknode !== "-") {
|
|
|
|
try {
|
|
|
|
providerList.push(new providers.QuickNodeProvider(network, options.quicknode));
|
|
|
|
}
|
|
|
|
catch (error) { }
|
|
|
|
}
|
2019-05-14 18:48:48 -04:00
|
|
|
if (providerList.length === 0) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if (providers.FallbackProvider) {
|
2020-02-26 10:06:48 +00:00
|
|
|
let quorum = 1;
|
2019-11-20 18:57:38 +09:00
|
|
|
if (options.quorum != null) {
|
|
|
|
quorum = options.quorum;
|
|
|
|
}
|
2020-02-26 10:06:48 +00:00
|
|
|
else if (network === "homestead") {
|
|
|
|
quorum = 2;
|
2019-11-20 18:57:38 +09:00
|
|
|
}
|
|
|
|
return new providers.FallbackProvider(providerList, quorum);
|
2019-05-14 18:48:48 -04:00
|
|
|
}
|
|
|
|
return providerList[0];
|
|
|
|
};
|
2020-07-16 05:35:32 -04:00
|
|
|
func.renetwork = function (network) {
|
|
|
|
return ethDefaultProvider(network);
|
|
|
|
};
|
|
|
|
return func;
|
2019-05-14 18:48:48 -04:00
|
|
|
}
|
|
|
|
function etcDefaultProvider(url, network) {
|
2020-07-16 05:35:32 -04:00
|
|
|
const func = function (providers, options) {
|
2019-05-14 18:48:48 -04:00
|
|
|
if (providers.JsonRpcProvider) {
|
|
|
|
return new providers.JsonRpcProvider(url, network);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
};
|
2020-07-16 05:35:32 -04:00
|
|
|
func.renetwork = function (network) {
|
|
|
|
return etcDefaultProvider(url, network);
|
|
|
|
};
|
|
|
|
return func;
|
2019-05-14 18:48:48 -04:00
|
|
|
}
|
2019-08-25 02:39:20 -04:00
|
|
|
const homestead = {
|
2019-05-14 18:48:48 -04:00
|
|
|
chainId: 1,
|
2020-01-29 21:43:56 -05:00
|
|
|
ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
2019-05-14 18:48:48 -04:00
|
|
|
name: "homestead",
|
|
|
|
_defaultProvider: ethDefaultProvider("homestead")
|
|
|
|
};
|
2019-08-25 02:39:20 -04:00
|
|
|
const ropsten = {
|
2019-05-14 18:48:48 -04:00
|
|
|
chainId: 3,
|
2020-01-29 21:43:56 -05:00
|
|
|
ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
2019-05-14 18:48:48 -04:00
|
|
|
name: "ropsten",
|
|
|
|
_defaultProvider: ethDefaultProvider("ropsten")
|
|
|
|
};
|
2020-01-09 03:32:50 -05:00
|
|
|
const classicMordor = {
|
|
|
|
chainId: 63,
|
|
|
|
name: "classicMordor",
|
|
|
|
_defaultProvider: etcDefaultProvider("https://www.ethercluster.com/mordor", "classicMordor")
|
|
|
|
};
|
2021-11-30 11:19:37 -05:00
|
|
|
// See: https://chainlist.org
|
2019-08-25 02:39:20 -04:00
|
|
|
const networks = {
|
2021-05-17 16:19:36 -04:00
|
|
|
unspecified: { chainId: 0, name: "unspecified" },
|
2019-05-14 18:48:48 -04:00
|
|
|
homestead: homestead,
|
|
|
|
mainnet: homestead,
|
2021-05-17 16:19:36 -04:00
|
|
|
morden: { chainId: 2, name: "morden" },
|
2019-05-14 18:48:48 -04:00
|
|
|
ropsten: ropsten,
|
|
|
|
testnet: ropsten,
|
|
|
|
rinkeby: {
|
|
|
|
chainId: 4,
|
2020-01-29 21:43:56 -05:00
|
|
|
ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
2019-05-14 18:48:48 -04:00
|
|
|
name: "rinkeby",
|
|
|
|
_defaultProvider: ethDefaultProvider("rinkeby")
|
|
|
|
},
|
|
|
|
kovan: {
|
|
|
|
chainId: 42,
|
|
|
|
name: "kovan",
|
|
|
|
_defaultProvider: ethDefaultProvider("kovan")
|
|
|
|
},
|
|
|
|
goerli: {
|
|
|
|
chainId: 5,
|
2020-01-29 21:43:56 -05:00
|
|
|
ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
|
2019-05-14 18:48:48 -04:00
|
|
|
name: "goerli",
|
|
|
|
_defaultProvider: ethDefaultProvider("goerli")
|
|
|
|
},
|
2022-01-06 03:53:52 -05:00
|
|
|
kintsugi: { chainId: 1337702, name: "kintsugi" },
|
2022-09-13 21:28:52 -04:00
|
|
|
sepolia: {
|
|
|
|
chainId: 11155111,
|
|
|
|
name: "sepolia",
|
|
|
|
_defaultProvider: ethDefaultProvider("sepolia")
|
|
|
|
},
|
2024-02-23 22:30:55 -05:00
|
|
|
holesky: {
|
|
|
|
chainId: 17000,
|
|
|
|
name: "holesky",
|
|
|
|
_defaultProvider: ethDefaultProvider("holesky")
|
|
|
|
},
|
2020-01-09 03:32:50 -05:00
|
|
|
// ETC (See: #351)
|
2019-05-14 18:48:48 -04:00
|
|
|
classic: {
|
|
|
|
chainId: 61,
|
|
|
|
name: "classic",
|
2021-05-17 16:19:36 -04:00
|
|
|
_defaultProvider: etcDefaultProvider("https:/\/www.ethercluster.com/etc", "classic")
|
2020-01-09 03:32:50 -05:00
|
|
|
},
|
2021-05-17 16:19:36 -04:00
|
|
|
classicMorden: { chainId: 62, name: "classicMorden" },
|
2020-01-09 03:32:50 -05:00
|
|
|
classicMordor: classicMordor,
|
|
|
|
classicTestnet: classicMordor,
|
|
|
|
classicKotti: {
|
|
|
|
chainId: 6,
|
|
|
|
name: "classicKotti",
|
2021-05-17 16:19:36 -04:00
|
|
|
_defaultProvider: etcDefaultProvider("https:/\/www.ethercluster.com/kotti", "classicKotti")
|
2020-01-09 03:32:50 -05:00
|
|
|
},
|
2021-05-17 16:19:36 -04:00
|
|
|
xdai: { chainId: 100, name: "xdai" },
|
2022-05-20 19:13:03 -04:00
|
|
|
matic: {
|
|
|
|
chainId: 137,
|
|
|
|
name: "matic",
|
|
|
|
_defaultProvider: ethDefaultProvider("matic")
|
|
|
|
},
|
2024-02-23 22:30:55 -05:00
|
|
|
maticmum: {
|
|
|
|
chainId: 80001,
|
|
|
|
name: "maticmum",
|
|
|
|
_defaultProvider: ethDefaultProvider("maticmum")
|
|
|
|
},
|
2022-05-20 19:13:03 -04:00
|
|
|
optimism: {
|
|
|
|
chainId: 10,
|
|
|
|
name: "optimism",
|
|
|
|
_defaultProvider: ethDefaultProvider("optimism")
|
|
|
|
},
|
2021-11-30 11:19:37 -05:00
|
|
|
"optimism-kovan": { chainId: 69, name: "optimism-kovan" },
|
|
|
|
"optimism-goerli": { chainId: 420, name: "optimism-goerli" },
|
2024-02-23 22:30:55 -05:00
|
|
|
"optimism-sepolia": { chainId: 11155420, name: "optimism-sepolia" },
|
2021-11-30 11:19:37 -05:00
|
|
|
arbitrum: { chainId: 42161, name: "arbitrum" },
|
|
|
|
"arbitrum-rinkeby": { chainId: 421611, name: "arbitrum-rinkeby" },
|
2022-08-18 14:48:39 -04:00
|
|
|
"arbitrum-goerli": { chainId: 421613, name: "arbitrum-goerli" },
|
2024-02-23 22:30:55 -05:00
|
|
|
"arbitrum-sepolia": { chainId: 421614, name: "arbitrum-sepolia" },
|
2021-05-17 16:19:36 -04:00
|
|
|
bnb: { chainId: 56, name: "bnb" },
|
|
|
|
bnbt: { chainId: 97, name: "bnbt" },
|
2019-05-14 18:48:48 -04:00
|
|
|
};
|
|
|
|
/**
|
|
|
|
* getNetwork
|
|
|
|
*
|
|
|
|
* Converts a named common networks or chain ID (network ID) to a Network
|
|
|
|
* and verifies a network is a valid Network..
|
|
|
|
*/
|
2019-08-25 02:39:20 -04:00
|
|
|
export function getNetwork(network) {
|
2019-05-14 18:48:48 -04:00
|
|
|
// No network (null)
|
|
|
|
if (network == null) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if (typeof (network) === "number") {
|
2019-11-20 18:57:38 +09:00
|
|
|
for (const name in networks) {
|
|
|
|
const standard = networks[name];
|
2019-08-25 02:39:20 -04:00
|
|
|
if (standard.chainId === network) {
|
2019-05-14 18:48:48 -04:00
|
|
|
return {
|
2019-08-25 02:39:20 -04:00
|
|
|
name: standard.name,
|
|
|
|
chainId: standard.chainId,
|
|
|
|
ensAddress: (standard.ensAddress || null),
|
|
|
|
_defaultProvider: (standard._defaultProvider || null)
|
2019-05-14 18:48:48 -04:00
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
chainId: network,
|
|
|
|
name: "unknown"
|
|
|
|
};
|
|
|
|
}
|
|
|
|
if (typeof (network) === "string") {
|
2019-11-20 18:57:38 +09:00
|
|
|
const standard = networks[network];
|
2019-08-25 02:39:20 -04:00
|
|
|
if (standard == null) {
|
2019-05-14 18:48:48 -04:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
return {
|
2019-08-25 02:39:20 -04:00
|
|
|
name: standard.name,
|
|
|
|
chainId: standard.chainId,
|
|
|
|
ensAddress: standard.ensAddress,
|
|
|
|
_defaultProvider: (standard._defaultProvider || null)
|
2019-05-14 18:48:48 -04:00
|
|
|
};
|
|
|
|
}
|
2019-11-20 18:57:38 +09:00
|
|
|
const standard = networks[network.name];
|
2019-05-14 18:48:48 -04:00
|
|
|
// Not a standard network; check that it is a valid network in general
|
|
|
|
if (!standard) {
|
|
|
|
if (typeof (network.chainId) !== "number") {
|
2019-08-02 02:10:58 -04:00
|
|
|
logger.throwArgumentError("invalid network chainId", "network", network);
|
2019-05-14 18:48:48 -04:00
|
|
|
}
|
|
|
|
return network;
|
|
|
|
}
|
|
|
|
// Make sure the chainId matches the expected network chainId (or is 0; disable EIP-155)
|
|
|
|
if (network.chainId !== 0 && network.chainId !== standard.chainId) {
|
2019-08-02 02:10:58 -04:00
|
|
|
logger.throwArgumentError("network chainId mismatch", "network", network);
|
2019-05-14 18:48:48 -04:00
|
|
|
}
|
2020-07-16 05:35:32 -04:00
|
|
|
// @TODO: In the next major version add an attach function to a defaultProvider
|
|
|
|
// class and move the _defaultProvider internal to this file (extend Network)
|
|
|
|
let defaultProvider = network._defaultProvider || null;
|
|
|
|
if (defaultProvider == null && standard._defaultProvider) {
|
|
|
|
if (isRenetworkable(standard._defaultProvider)) {
|
|
|
|
defaultProvider = standard._defaultProvider.renetwork(network);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
defaultProvider = standard._defaultProvider;
|
|
|
|
}
|
|
|
|
}
|
2019-05-14 18:48:48 -04:00
|
|
|
// Standard Network (allow overriding the ENS address)
|
|
|
|
return {
|
|
|
|
name: network.name,
|
|
|
|
chainId: standard.chainId,
|
|
|
|
ensAddress: (network.ensAddress || standard.ensAddress || null),
|
2020-07-16 05:35:32 -04:00
|
|
|
_defaultProvider: defaultProvider
|
2019-05-14 18:48:48 -04:00
|
|
|
};
|
|
|
|
}
|
2020-07-13 08:03:56 -04:00
|
|
|
//# sourceMappingURL=index.js.map
|