alchemy-provider.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. "use strict";
  2. import { Network, Networkish } from "@ethersproject/networks";
  3. import { defineReadOnly } from "@ethersproject/properties";
  4. import { ConnectionInfo } from "@ethersproject/web";
  5. import { CommunityResourcable, showThrottleMessage } from "./formatter";
  6. import { WebSocketProvider } from "./websocket-provider";
  7. import { Logger } from "@ethersproject/logger";
  8. import { version } from "./_version";
  9. const logger = new Logger(version);
  10. import { UrlJsonRpcProvider } from "./url-json-rpc-provider";
  11. // This key was provided to ethers.js by Alchemy to be used by the
  12. // default provider, but it is recommended that for your own
  13. // production environments, that you acquire your own API key at:
  14. // https://dashboard.alchemyapi.io
  15. const defaultApiKey = "_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"
  16. export class AlchemyWebSocketProvider extends WebSocketProvider implements CommunityResourcable {
  17. readonly apiKey: string;
  18. constructor(network?: Networkish, apiKey?: any) {
  19. const provider = new AlchemyProvider(network, apiKey);
  20. const url = provider.connection.url.replace(/^http/i, "ws")
  21. .replace(".alchemyapi.", ".ws.alchemyapi.");
  22. super(url, provider.network);
  23. defineReadOnly(this, "apiKey", provider.apiKey);
  24. }
  25. isCommunityResource(): boolean {
  26. return (this.apiKey === defaultApiKey);
  27. }
  28. }
  29. export class AlchemyProvider extends UrlJsonRpcProvider {
  30. static getWebSocketProvider(network?: Networkish, apiKey?: any): AlchemyWebSocketProvider {
  31. return new AlchemyWebSocketProvider(network, apiKey);
  32. }
  33. static getApiKey(apiKey: any): any {
  34. if (apiKey == null) { return defaultApiKey; }
  35. if (apiKey && typeof(apiKey) !== "string") {
  36. logger.throwArgumentError("invalid apiKey", "apiKey", apiKey);
  37. }
  38. return apiKey;
  39. }
  40. static getUrl(network: Network, apiKey: string): ConnectionInfo {
  41. let host = null;
  42. switch (network.name) {
  43. case "homestead":
  44. host = "eth-mainnet.alchemyapi.io/v2/";
  45. break;
  46. case "ropsten":
  47. host = "eth-ropsten.alchemyapi.io/v2/";
  48. break;
  49. case "rinkeby":
  50. host = "eth-rinkeby.alchemyapi.io/v2/";
  51. break;
  52. case "goerli":
  53. host = "eth-goerli.alchemyapi.io/v2/";
  54. break;
  55. case "kovan":
  56. host = "eth-kovan.alchemyapi.io/v2/";
  57. break;
  58. case "matic":
  59. host = "polygon-mainnet.g.alchemy.com/v2/";
  60. break;
  61. case "maticmum":
  62. host = "polygon-mumbai.g.alchemy.com/v2/";
  63. break;
  64. case "arbitrum":
  65. host = "arb-mainnet.g.alchemy.com/v2/";
  66. break;
  67. case "arbitrum-rinkeby":
  68. host = "arb-rinkeby.g.alchemy.com/v2/";
  69. break;
  70. case "optimism":
  71. host = "opt-mainnet.g.alchemy.com/v2/";
  72. break;
  73. case "optimism-kovan":
  74. host = "opt-kovan.g.alchemy.com/v2/";
  75. break;
  76. default:
  77. logger.throwArgumentError("unsupported network", "network", arguments[0]);
  78. }
  79. return {
  80. allowGzip: true,
  81. url: ("https:/" + "/" + host + apiKey),
  82. throttleCallback: (attempt: number, url: string) => {
  83. if (apiKey === defaultApiKey) {
  84. showThrottleMessage();
  85. }
  86. return Promise.resolve(true);
  87. }
  88. };
  89. }
  90. isCommunityResource(): boolean {
  91. return (this.apiKey === defaultApiKey);
  92. }
  93. }