index.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. "use strict";
  2. import { Logger } from "@ethersproject/logger";
  3. import { version } from "./_version";
  4. const logger = new Logger(version);
  5. ;
  6. function isRenetworkable(value) {
  7. return (value && typeof (value.renetwork) === "function");
  8. }
  9. function ethDefaultProvider(network) {
  10. const func = function (providers, options) {
  11. if (options == null) {
  12. options = {};
  13. }
  14. const providerList = [];
  15. if (providers.InfuraProvider && options.infura !== "-") {
  16. try {
  17. providerList.push(new providers.InfuraProvider(network, options.infura));
  18. }
  19. catch (error) { }
  20. }
  21. if (providers.EtherscanProvider && options.etherscan !== "-") {
  22. try {
  23. providerList.push(new providers.EtherscanProvider(network, options.etherscan));
  24. }
  25. catch (error) { }
  26. }
  27. if (providers.AlchemyProvider && options.alchemy !== "-") {
  28. try {
  29. providerList.push(new providers.AlchemyProvider(network, options.alchemy));
  30. }
  31. catch (error) { }
  32. }
  33. if (providers.PocketProvider && options.pocket !== "-") {
  34. // These networks are currently faulty on Pocket as their
  35. // network does not handle the Berlin hardfork, which is
  36. // live on these ones.
  37. // @TODO: This goes away once Pocket has upgraded their nodes
  38. const skip = ["goerli", "ropsten", "rinkeby"];
  39. try {
  40. const provider = new providers.PocketProvider(network);
  41. if (provider.network && skip.indexOf(provider.network.name) === -1) {
  42. providerList.push(provider);
  43. }
  44. }
  45. catch (error) { }
  46. }
  47. if (providers.CloudflareProvider && options.cloudflare !== "-") {
  48. try {
  49. providerList.push(new providers.CloudflareProvider(network));
  50. }
  51. catch (error) { }
  52. }
  53. if (providerList.length === 0) {
  54. return null;
  55. }
  56. if (providers.FallbackProvider) {
  57. let quorum = 1;
  58. if (options.quorum != null) {
  59. quorum = options.quorum;
  60. }
  61. else if (network === "homestead") {
  62. quorum = 2;
  63. }
  64. return new providers.FallbackProvider(providerList, quorum);
  65. }
  66. return providerList[0];
  67. };
  68. func.renetwork = function (network) {
  69. return ethDefaultProvider(network);
  70. };
  71. return func;
  72. }
  73. function etcDefaultProvider(url, network) {
  74. const func = function (providers, options) {
  75. if (providers.JsonRpcProvider) {
  76. return new providers.JsonRpcProvider(url, network);
  77. }
  78. return null;
  79. };
  80. func.renetwork = function (network) {
  81. return etcDefaultProvider(url, network);
  82. };
  83. return func;
  84. }
  85. const homestead = {
  86. chainId: 1,
  87. ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
  88. name: "homestead",
  89. _defaultProvider: ethDefaultProvider("homestead")
  90. };
  91. const ropsten = {
  92. chainId: 3,
  93. ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
  94. name: "ropsten",
  95. _defaultProvider: ethDefaultProvider("ropsten")
  96. };
  97. const classicMordor = {
  98. chainId: 63,
  99. name: "classicMordor",
  100. _defaultProvider: etcDefaultProvider("https://www.ethercluster.com/mordor", "classicMordor")
  101. };
  102. // See: https://chainlist.org
  103. const networks = {
  104. unspecified: { chainId: 0, name: "unspecified" },
  105. homestead: homestead,
  106. mainnet: homestead,
  107. morden: { chainId: 2, name: "morden" },
  108. ropsten: ropsten,
  109. testnet: ropsten,
  110. rinkeby: {
  111. chainId: 4,
  112. ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
  113. name: "rinkeby",
  114. _defaultProvider: ethDefaultProvider("rinkeby")
  115. },
  116. kovan: {
  117. chainId: 42,
  118. name: "kovan",
  119. _defaultProvider: ethDefaultProvider("kovan")
  120. },
  121. goerli: {
  122. chainId: 5,
  123. ensAddress: "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
  124. name: "goerli",
  125. _defaultProvider: ethDefaultProvider("goerli")
  126. },
  127. kintsugi: { chainId: 1337702, name: "kintsugi" },
  128. // ETC (See: #351)
  129. classic: {
  130. chainId: 61,
  131. name: "classic",
  132. _defaultProvider: etcDefaultProvider("https:/\/www.ethercluster.com/etc", "classic")
  133. },
  134. classicMorden: { chainId: 62, name: "classicMorden" },
  135. classicMordor: classicMordor,
  136. classicTestnet: classicMordor,
  137. classicKotti: {
  138. chainId: 6,
  139. name: "classicKotti",
  140. _defaultProvider: etcDefaultProvider("https:/\/www.ethercluster.com/kotti", "classicKotti")
  141. },
  142. xdai: { chainId: 100, name: "xdai" },
  143. matic: { chainId: 137, name: "matic" },
  144. maticmum: { chainId: 80001, name: "maticmum" },
  145. optimism: { chainId: 10, name: "optimism" },
  146. "optimism-kovan": { chainId: 69, name: "optimism-kovan" },
  147. "optimism-goerli": { chainId: 420, name: "optimism-goerli" },
  148. arbitrum: { chainId: 42161, name: "arbitrum" },
  149. "arbitrum-rinkeby": { chainId: 421611, name: "arbitrum-rinkeby" },
  150. bnb: { chainId: 56, name: "bnb" },
  151. bnbt: { chainId: 97, name: "bnbt" },
  152. };
  153. /**
  154. * getNetwork
  155. *
  156. * Converts a named common networks or chain ID (network ID) to a Network
  157. * and verifies a network is a valid Network..
  158. */
  159. export function getNetwork(network) {
  160. // No network (null)
  161. if (network == null) {
  162. return null;
  163. }
  164. if (typeof (network) === "number") {
  165. for (const name in networks) {
  166. const standard = networks[name];
  167. if (standard.chainId === network) {
  168. return {
  169. name: standard.name,
  170. chainId: standard.chainId,
  171. ensAddress: (standard.ensAddress || null),
  172. _defaultProvider: (standard._defaultProvider || null)
  173. };
  174. }
  175. }
  176. return {
  177. chainId: network,
  178. name: "unknown"
  179. };
  180. }
  181. if (typeof (network) === "string") {
  182. const standard = networks[network];
  183. if (standard == null) {
  184. return null;
  185. }
  186. return {
  187. name: standard.name,
  188. chainId: standard.chainId,
  189. ensAddress: standard.ensAddress,
  190. _defaultProvider: (standard._defaultProvider || null)
  191. };
  192. }
  193. const standard = networks[network.name];
  194. // Not a standard network; check that it is a valid network in general
  195. if (!standard) {
  196. if (typeof (network.chainId) !== "number") {
  197. logger.throwArgumentError("invalid network chainId", "network", network);
  198. }
  199. return network;
  200. }
  201. // Make sure the chainId matches the expected network chainId (or is 0; disable EIP-155)
  202. if (network.chainId !== 0 && network.chainId !== standard.chainId) {
  203. logger.throwArgumentError("network chainId mismatch", "network", network);
  204. }
  205. // @TODO: In the next major version add an attach function to a defaultProvider
  206. // class and move the _defaultProvider internal to this file (extend Network)
  207. let defaultProvider = network._defaultProvider || null;
  208. if (defaultProvider == null && standard._defaultProvider) {
  209. if (isRenetworkable(standard._defaultProvider)) {
  210. defaultProvider = standard._defaultProvider.renetwork(network);
  211. }
  212. else {
  213. defaultProvider = standard._defaultProvider;
  214. }
  215. }
  216. // Standard Network (allow overriding the ENS address)
  217. return {
  218. name: network.name,
  219. chainId: standard.chainId,
  220. ensAddress: (network.ensAddress || standard.ensAddress || null),
  221. _defaultProvider: defaultProvider
  222. };
  223. }
  224. //# sourceMappingURL=index.js.map