provider-quicknode.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /**
  2. * [[link-quicknode]] provides a third-party service for connecting to
  3. * various blockchains over JSON-RPC.
  4. *
  5. * **Supported Networks**
  6. *
  7. * - Ethereum Mainnet (``mainnet``)
  8. * - Goerli Testnet (``goerli``)
  9. * - Sepolia Testnet (``sepolia``)
  10. * - Holesky Testnet (``holesky``)
  11. * - Arbitrum (``arbitrum``)
  12. * - Arbitrum Goerli Testnet (``arbitrum-goerli``)
  13. * - Arbitrum Sepolia Testnet (``arbitrum-sepolia``)
  14. * - Base Mainnet (``base``);
  15. * - Base Goerli Testnet (``base-goerli``);
  16. * - Base Sepolia Testnet (``base-sepolia``);
  17. * - BNB Smart Chain Mainnet (``bnb``)
  18. * - BNB Smart Chain Testnet (``bnbt``)
  19. * - Optimism (``optimism``)
  20. * - Optimism Goerli Testnet (``optimism-goerli``)
  21. * - Optimism Sepolia Testnet (``optimism-sepolia``)
  22. * - Polygon (``matic``)
  23. * - Polygon Mumbai Testnet (``matic-mumbai``)
  24. *
  25. * @_subsection: api/providers/thirdparty:QuickNode [providers-quicknode]
  26. */
  27. import {
  28. defineProperties, FetchRequest, assertArgument
  29. } from "../utils/index.js";
  30. import { showThrottleMessage } from "./community.js";
  31. import { Network } from "./network.js";
  32. import { JsonRpcProvider } from "./provider-jsonrpc.js";
  33. import type { AbstractProvider } from "./abstract-provider.js";
  34. import type { CommunityResourcable } from "./community.js";
  35. import type { Networkish } from "./network.js";
  36. const defaultToken = "919b412a057b5e9c9b6dce193c5a60242d6efadb";
  37. function getHost(name: string): string {
  38. switch(name) {
  39. case "mainnet":
  40. return "ethers.quiknode.pro";
  41. case "goerli":
  42. return "ethers.ethereum-goerli.quiknode.pro";
  43. case "sepolia":
  44. return "ethers.ethereum-sepolia.quiknode.pro";
  45. case "holesky":
  46. return "ethers.ethereum-holesky.quiknode.pro";
  47. case "arbitrum":
  48. return "ethers.arbitrum-mainnet.quiknode.pro";
  49. case "arbitrum-goerli":
  50. return "ethers.arbitrum-goerli.quiknode.pro";
  51. case "arbitrum-sepolia":
  52. return "ethers.arbitrum-sepolia.quiknode.pro";
  53. case "base":
  54. return "ethers.base-mainnet.quiknode.pro";
  55. case "base-goerli":
  56. return "ethers.base-goerli.quiknode.pro";
  57. case "base-spolia":
  58. return "ethers.base-sepolia.quiknode.pro";
  59. case "bnb":
  60. return "ethers.bsc.quiknode.pro";
  61. case "bnbt":
  62. return "ethers.bsc-testnet.quiknode.pro";
  63. case "matic":
  64. return "ethers.matic.quiknode.pro";
  65. case "matic-mumbai":
  66. return "ethers.matic-testnet.quiknode.pro";
  67. case "optimism":
  68. return "ethers.optimism.quiknode.pro";
  69. case "optimism-goerli":
  70. return "ethers.optimism-goerli.quiknode.pro";
  71. case "optimism-sepolia":
  72. return "ethers.optimism-sepolia.quiknode.pro";
  73. case "xdai":
  74. return "ethers.xdai.quiknode.pro";
  75. }
  76. assertArgument(false, "unsupported network", "network", name);
  77. }
  78. /*
  79. @TODO:
  80. These networks are not currently present in the Network
  81. default included networks. Research them and ensure they
  82. are EVM compatible and work with ethers
  83. http://ethers.matic-amoy.quiknode.pro
  84. http://ethers.avalanche-mainnet.quiknode.pro
  85. http://ethers.avalanche-testnet.quiknode.pro
  86. http://ethers.blast-sepolia.quiknode.pro
  87. http://ethers.celo-mainnet.quiknode.pro
  88. http://ethers.fantom.quiknode.pro
  89. http://ethers.imx-demo.quiknode.pro
  90. http://ethers.imx-mainnet.quiknode.pro
  91. http://ethers.imx-testnet.quiknode.pro
  92. http://ethers.near-mainnet.quiknode.pro
  93. http://ethers.near-testnet.quiknode.pro
  94. http://ethers.nova-mainnet.quiknode.pro
  95. http://ethers.scroll-mainnet.quiknode.pro
  96. http://ethers.scroll-testnet.quiknode.pro
  97. http://ethers.tron-mainnet.quiknode.pro
  98. http://ethers.zkevm-mainnet.quiknode.pro
  99. http://ethers.zkevm-testnet.quiknode.pro
  100. http://ethers.zksync-mainnet.quiknode.pro
  101. http://ethers.zksync-testnet.quiknode.pro
  102. */
  103. /**
  104. * The **QuickNodeProvider** connects to the [[link-quicknode]]
  105. * JSON-RPC end-points.
  106. *
  107. * By default, a highly-throttled API token is used, which is
  108. * appropriate for quick prototypes and simple scripts. To
  109. * gain access to an increased rate-limit, it is highly
  110. * recommended to [sign up here](link-quicknode).
  111. */
  112. export class QuickNodeProvider extends JsonRpcProvider implements CommunityResourcable {
  113. /**
  114. * The API token.
  115. */
  116. readonly token!: string;
  117. /**
  118. * Creates a new **QuickNodeProvider**.
  119. */
  120. constructor(_network?: Networkish, token?: null | string) {
  121. if (_network == null) { _network = "mainnet"; }
  122. const network = Network.from(_network);
  123. if (token == null) { token = defaultToken; }
  124. const request = QuickNodeProvider.getRequest(network, token);
  125. super(request, network, { staticNetwork: network });
  126. defineProperties<QuickNodeProvider>(this, { token });
  127. }
  128. _getProvider(chainId: number): AbstractProvider {
  129. try {
  130. return new QuickNodeProvider(chainId, this.token);
  131. } catch (error) { }
  132. return super._getProvider(chainId);
  133. }
  134. isCommunityResource(): boolean {
  135. return (this.token === defaultToken);
  136. }
  137. /**
  138. * Returns a new request prepared for %%network%% and the
  139. * %%token%%.
  140. */
  141. static getRequest(network: Network, token?: null | string): FetchRequest {
  142. if (token == null) { token = defaultToken; }
  143. const request = new FetchRequest(`https:/\/${ getHost(network.name) }/${ token }`);
  144. request.allowGzip = true;
  145. //if (projectSecret) { request.setCredentials("", projectSecret); }
  146. if (token === defaultToken) {
  147. request.retryFunc = async (request, response, attempt) => {
  148. showThrottleMessage("QuickNodeProvider");
  149. return true;
  150. };
  151. }
  152. return request;
  153. }
  154. }