@hyperlane-xyz/sdk 1.0.0-beta0 → 1.0.0-beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/README.md +30 -3
  2. package/dist/HyperlaneApp.d.ts +13 -0
  3. package/dist/HyperlaneApp.d.ts.map +1 -0
  4. package/dist/HyperlaneApp.js +25 -0
  5. package/dist/HyperlaneApp.js.map +1 -0
  6. package/dist/consts/chainConnectionConfigs.d.ts +18 -0
  7. package/dist/consts/chainConnectionConfigs.d.ts.map +1 -0
  8. package/dist/consts/chainConnectionConfigs.js +33 -0
  9. package/dist/consts/chainConnectionConfigs.js.map +1 -0
  10. package/dist/consts/chainMetadata.d.ts +98 -0
  11. package/dist/consts/chainMetadata.d.ts.map +1 -0
  12. package/dist/consts/chainMetadata.js +529 -0
  13. package/dist/consts/chainMetadata.js.map +1 -0
  14. package/dist/consts/chains.d.ts +40 -0
  15. package/dist/consts/chains.d.ts.map +1 -0
  16. package/dist/consts/chains.js +66 -0
  17. package/dist/consts/chains.js.map +1 -0
  18. package/dist/consts/environments/index.d.ts +449 -0
  19. package/dist/consts/environments/index.d.ts.map +1 -0
  20. package/dist/consts/environments/index.js +22 -0
  21. package/dist/consts/environments/index.js.map +1 -0
  22. package/dist/consts/environments/mainnet.json +138 -0
  23. package/dist/consts/environments/test.json +44 -0
  24. package/dist/consts/environments/testnet2.json +138 -0
  25. package/dist/consts/environments/testnet3.json +114 -0
  26. package/dist/contracts.d.ts +18 -0
  27. package/dist/contracts.d.ts.map +1 -0
  28. package/dist/contracts.js +61 -0
  29. package/dist/contracts.js.map +1 -0
  30. package/dist/core/HyperlaneCore.d.ts +473 -0
  31. package/dist/core/HyperlaneCore.d.ts.map +1 -0
  32. package/dist/core/HyperlaneCore.js +122 -0
  33. package/dist/core/HyperlaneCore.js.map +1 -0
  34. package/dist/core/HyperlaneCore.test.d.ts +2 -0
  35. package/dist/core/HyperlaneCore.test.d.ts.map +1 -0
  36. package/dist/core/HyperlaneCore.test.js +27 -0
  37. package/dist/core/HyperlaneCore.test.js.map +1 -0
  38. package/dist/core/TestCoreApp.d.ts +21 -0
  39. package/dist/core/TestCoreApp.d.ts.map +1 -0
  40. package/dist/core/TestCoreApp.js +61 -0
  41. package/dist/core/TestCoreApp.js.map +1 -0
  42. package/dist/core/TestCoreDeployer.d.ts +13 -0
  43. package/dist/core/TestCoreDeployer.d.ts.map +1 -0
  44. package/dist/core/TestCoreDeployer.js +53 -0
  45. package/dist/core/TestCoreDeployer.js.map +1 -0
  46. package/dist/core/contracts.d.ts +21 -0
  47. package/dist/core/contracts.d.ts.map +1 -0
  48. package/dist/core/contracts.js +14 -0
  49. package/dist/core/contracts.js.map +1 -0
  50. package/dist/core/events.d.ts +8 -0
  51. package/dist/core/events.d.ts.map +1 -0
  52. package/dist/core/events.js +3 -0
  53. package/dist/core/events.js.map +1 -0
  54. package/dist/core/message.d.ts +146 -0
  55. package/dist/core/message.d.ts.map +1 -0
  56. package/dist/core/message.js +285 -0
  57. package/dist/core/message.js.map +1 -0
  58. package/dist/core/testHyperlaneDeploy.hardhat-test.d.ts +3 -0
  59. package/dist/core/testHyperlaneDeploy.hardhat-test.d.ts.map +1 -0
  60. package/dist/core/testHyperlaneDeploy.hardhat-test.js +66 -0
  61. package/dist/core/testHyperlaneDeploy.hardhat-test.js.map +1 -0
  62. package/dist/deploy/HyperlaneAppChecker.d.ts +22 -0
  63. package/dist/deploy/HyperlaneAppChecker.d.ts.map +1 -0
  64. package/dist/deploy/HyperlaneAppChecker.js +88 -0
  65. package/dist/deploy/HyperlaneAppChecker.js.map +1 -0
  66. package/dist/deploy/HyperlaneDeployer.d.ts +40 -0
  67. package/dist/deploy/HyperlaneDeployer.d.ts.map +1 -0
  68. package/dist/deploy/HyperlaneDeployer.js +212 -0
  69. package/dist/deploy/HyperlaneDeployer.js.map +1 -0
  70. package/dist/deploy/core/HyperlaneCoreChecker.d.ts +13 -0
  71. package/dist/deploy/core/HyperlaneCoreChecker.d.ts.map +1 -0
  72. package/dist/deploy/core/HyperlaneCoreChecker.js +122 -0
  73. package/dist/deploy/core/HyperlaneCoreChecker.js.map +1 -0
  74. package/dist/deploy/core/HyperlaneCoreDeployer.d.ts +30 -0
  75. package/dist/deploy/core/HyperlaneCoreDeployer.d.ts.map +1 -0
  76. package/dist/deploy/core/HyperlaneCoreDeployer.js +114 -0
  77. package/dist/deploy/core/HyperlaneCoreDeployer.js.map +1 -0
  78. package/dist/deploy/core/types.d.ts +51 -0
  79. package/dist/deploy/core/types.d.ts.map +1 -0
  80. package/dist/deploy/core/types.js +19 -0
  81. package/dist/deploy/core/types.js.map +1 -0
  82. package/dist/deploy/middleware/LiquidityLayerApp.d.ts +26 -0
  83. package/dist/deploy/middleware/LiquidityLayerApp.d.ts.map +1 -0
  84. package/dist/deploy/middleware/LiquidityLayerApp.js +115 -0
  85. package/dist/deploy/middleware/LiquidityLayerApp.js.map +1 -0
  86. package/dist/deploy/middleware/LiquidityLayerRouterDeployer.d.ts +33 -0
  87. package/dist/deploy/middleware/LiquidityLayerRouterDeployer.d.ts.map +1 -0
  88. package/dist/deploy/middleware/LiquidityLayerRouterDeployer.js +97 -0
  89. package/dist/deploy/middleware/LiquidityLayerRouterDeployer.js.map +1 -0
  90. package/dist/deploy/middleware/deploy.d.ts +21 -0
  91. package/dist/deploy/middleware/deploy.d.ts.map +1 -0
  92. package/dist/deploy/middleware/deploy.js +70 -0
  93. package/dist/deploy/middleware/deploy.js.map +1 -0
  94. package/dist/deploy/proxy.d.ts +18 -0
  95. package/dist/deploy/proxy.d.ts.map +1 -0
  96. package/dist/deploy/proxy.js +43 -0
  97. package/dist/deploy/proxy.js.map +1 -0
  98. package/dist/deploy/router/HyperlaneRouterChecker.d.ts +13 -0
  99. package/dist/deploy/router/HyperlaneRouterChecker.d.ts.map +1 -0
  100. package/dist/deploy/router/HyperlaneRouterChecker.js +44 -0
  101. package/dist/deploy/router/HyperlaneRouterChecker.js.map +1 -0
  102. package/dist/deploy/router/HyperlaneRouterDeployer.d.ts +13 -0
  103. package/dist/deploy/router/HyperlaneRouterDeployer.d.ts.map +1 -0
  104. package/dist/deploy/router/HyperlaneRouterDeployer.js +115 -0
  105. package/dist/deploy/router/HyperlaneRouterDeployer.js.map +1 -0
  106. package/dist/deploy/router/types.d.ts +7 -0
  107. package/dist/deploy/router/types.d.ts.map +1 -0
  108. package/dist/deploy/router/types.js +3 -0
  109. package/dist/deploy/router/types.js.map +1 -0
  110. package/dist/deploy/types.d.ts +23 -0
  111. package/dist/deploy/types.d.ts.map +1 -0
  112. package/dist/deploy/types.js +9 -0
  113. package/dist/deploy/types.js.map +1 -0
  114. package/dist/deploy/utils.d.ts +10 -0
  115. package/dist/deploy/utils.d.ts.map +1 -0
  116. package/dist/deploy/utils.js +38 -0
  117. package/dist/deploy/utils.js.map +1 -0
  118. package/dist/deploy/verify/ContractVerifier.d.ts +19 -0
  119. package/dist/deploy/verify/ContractVerifier.d.ts.map +1 -0
  120. package/dist/deploy/verify/ContractVerifier.js +137 -0
  121. package/dist/deploy/verify/ContractVerifier.js.map +1 -0
  122. package/dist/deploy/verify/types.d.ts +14 -0
  123. package/dist/deploy/verify/types.d.ts.map +1 -0
  124. package/dist/deploy/verify/types.js +3 -0
  125. package/dist/deploy/verify/types.js.map +1 -0
  126. package/dist/deploy/verify/utils.d.ts +6 -0
  127. package/dist/deploy/verify/utils.d.ts.map +1 -0
  128. package/dist/deploy/verify/utils.js +25 -0
  129. package/dist/deploy/verify/utils.js.map +1 -0
  130. package/dist/domains.d.ts +4 -0
  131. package/dist/domains.d.ts.map +1 -0
  132. package/dist/domains.js +12 -0
  133. package/dist/domains.js.map +1 -0
  134. package/dist/events.d.ts +25 -0
  135. package/dist/events.d.ts.map +1 -0
  136. package/dist/events.js +161 -0
  137. package/dist/events.js.map +1 -0
  138. package/dist/gas/calculator.d.ts +134 -0
  139. package/dist/gas/calculator.d.ts.map +1 -0
  140. package/dist/gas/calculator.js +240 -0
  141. package/dist/gas/calculator.js.map +1 -0
  142. package/dist/gas/calculator.test.d.ts +2 -0
  143. package/dist/gas/calculator.test.d.ts.map +1 -0
  144. package/dist/gas/calculator.test.js +208 -0
  145. package/dist/gas/calculator.test.js.map +1 -0
  146. package/dist/gas/token-prices.d.ts +34 -0
  147. package/dist/gas/token-prices.d.ts.map +1 -0
  148. package/dist/gas/token-prices.js +105 -0
  149. package/dist/gas/token-prices.js.map +1 -0
  150. package/dist/gas/token-prices.test.d.ts +2 -0
  151. package/dist/gas/token-prices.test.d.ts.map +1 -0
  152. package/dist/gas/token-prices.test.js +46 -0
  153. package/dist/gas/token-prices.test.js.map +1 -0
  154. package/dist/index.d.ts +46 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +140 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/middleware/accounts.hardhat-test.d.ts +2 -0
  159. package/dist/middleware/accounts.hardhat-test.d.ts.map +1 -0
  160. package/dist/middleware/accounts.hardhat-test.js +63 -0
  161. package/dist/middleware/accounts.hardhat-test.js.map +1 -0
  162. package/dist/middleware/liquidity-layer.hardhat-test.d.ts +2 -0
  163. package/dist/middleware/liquidity-layer.hardhat-test.d.ts.map +1 -0
  164. package/dist/middleware/liquidity-layer.hardhat-test.js +89 -0
  165. package/dist/middleware/liquidity-layer.hardhat-test.js.map +1 -0
  166. package/dist/middleware/queries.hardhat-test.d.ts +2 -0
  167. package/dist/middleware/queries.hardhat-test.d.ts.map +1 -0
  168. package/dist/middleware/queries.hardhat-test.js +69 -0
  169. package/dist/middleware/queries.hardhat-test.js.map +1 -0
  170. package/dist/middleware.d.ts +16 -0
  171. package/dist/middleware.d.ts.map +1 -0
  172. package/dist/middleware.js +15 -0
  173. package/dist/middleware.js.map +1 -0
  174. package/dist/providers/ChainConnection.d.ts +22 -0
  175. package/dist/providers/ChainConnection.d.ts.map +1 -0
  176. package/dist/providers/ChainConnection.js +66 -0
  177. package/dist/providers/ChainConnection.js.map +1 -0
  178. package/dist/providers/MultiProvider.d.ts +56 -0
  179. package/dist/providers/MultiProvider.d.ts.map +1 -0
  180. package/dist/providers/MultiProvider.js +111 -0
  181. package/dist/providers/MultiProvider.js.map +1 -0
  182. package/dist/providers/RetryProvider.d.ts +18 -0
  183. package/dist/providers/RetryProvider.d.ts.map +1 -0
  184. package/dist/providers/RetryProvider.js +49 -0
  185. package/dist/providers/RetryProvider.js.map +1 -0
  186. package/dist/proxy.d.ts +21 -0
  187. package/dist/proxy.d.ts.map +1 -0
  188. package/dist/proxy.js +30 -0
  189. package/dist/proxy.js.map +1 -0
  190. package/dist/router.d.ts +20 -0
  191. package/dist/router.d.ts.map +1 -0
  192. package/dist/router.js +3 -0
  193. package/dist/router.js.map +1 -0
  194. package/dist/test/envSubsetDeployer/app.d.ts +36 -0
  195. package/dist/test/envSubsetDeployer/app.d.ts.map +1 -0
  196. package/dist/test/envSubsetDeployer/app.js +77 -0
  197. package/dist/test/envSubsetDeployer/app.js.map +1 -0
  198. package/dist/test/envSubsetDeployer/check-single-chain.d.ts +2 -0
  199. package/dist/test/envSubsetDeployer/check-single-chain.d.ts.map +1 -0
  200. package/dist/test/envSubsetDeployer/check-single-chain.js +49 -0
  201. package/dist/test/envSubsetDeployer/check-single-chain.js.map +1 -0
  202. package/dist/test/envSubsetDeployer/deploy-single-chain.d.ts +2 -0
  203. package/dist/test/envSubsetDeployer/deploy-single-chain.d.ts.map +1 -0
  204. package/dist/test/envSubsetDeployer/deploy-single-chain.js +42 -0
  205. package/dist/test/envSubsetDeployer/deploy-single-chain.js.map +1 -0
  206. package/dist/test/envSubsetDeployer/deploy.hardhat-test.d.ts +2 -0
  207. package/dist/test/envSubsetDeployer/deploy.hardhat-test.d.ts.map +1 -0
  208. package/dist/test/envSubsetDeployer/deploy.hardhat-test.js +83 -0
  209. package/dist/test/envSubsetDeployer/deploy.hardhat-test.js.map +1 -0
  210. package/dist/test/envSubsetDeployer/utils.d.ts +7 -0
  211. package/dist/test/envSubsetDeployer/utils.d.ts.map +1 -0
  212. package/dist/test/envSubsetDeployer/utils.js +25 -0
  213. package/dist/test/envSubsetDeployer/utils.js.map +1 -0
  214. package/dist/test/testUtils.d.ts +31 -0
  215. package/dist/test/testUtils.d.ts.map +1 -0
  216. package/dist/test/testUtils.js +106 -0
  217. package/dist/test/testUtils.js.map +1 -0
  218. package/dist/types.d.ts +21 -0
  219. package/dist/types.d.ts.map +1 -0
  220. package/dist/types.js +3 -0
  221. package/dist/types.js.map +1 -0
  222. package/dist/utils/MultiGeneric.d.ts +27 -0
  223. package/dist/utils/MultiGeneric.d.ts.map +1 -0
  224. package/dist/utils/MultiGeneric.js +70 -0
  225. package/dist/utils/MultiGeneric.js.map +1 -0
  226. package/dist/utils/ids.d.ts +20 -0
  227. package/dist/utils/ids.d.ts.map +1 -0
  228. package/dist/utils/ids.js +47 -0
  229. package/dist/utils/ids.js.map +1 -0
  230. package/dist/utils/number.d.ts +32 -0
  231. package/dist/utils/number.d.ts.map +1 -0
  232. package/dist/utils/number.js +59 -0
  233. package/dist/utils/number.js.map +1 -0
  234. package/dist/utils/objects.d.ts +7 -0
  235. package/dist/utils/objects.d.ts.map +1 -0
  236. package/dist/utils/objects.js +29 -0
  237. package/dist/utils/objects.js.map +1 -0
  238. package/dist/utils/time.d.ts +8 -0
  239. package/dist/utils/time.d.ts.map +1 -0
  240. package/dist/utils/time.js +15 -0
  241. package/dist/utils/time.js.map +1 -0
  242. package/dist/utils/utils.test.d.ts +2 -0
  243. package/dist/utils/utils.test.d.ts.map +1 -0
  244. package/dist/utils/utils.test.js +41 -0
  245. package/dist/utils/utils.test.js.map +1 -0
  246. package/logos/black/arbitrum.svg +1 -0
  247. package/logos/black/avalanche.svg +1 -0
  248. package/logos/black/bsc.svg +1 -0
  249. package/logos/black/celo.svg +1 -0
  250. package/logos/black/ethereum.svg +8 -0
  251. package/logos/black/hyperlane.svg +1 -0
  252. package/logos/black/moonbeam.svg +3 -0
  253. package/logos/black/near.svg +1 -0
  254. package/logos/black/optimism.svg +1 -0
  255. package/logos/black/polygon.svg +1 -0
  256. package/logos/color/arbitrum.svg +1 -0
  257. package/logos/color/avalanche.svg +1 -0
  258. package/logos/color/bsc.svg +1 -0
  259. package/logos/color/celo.svg +1 -0
  260. package/logos/color/ethereum.svg +1 -0
  261. package/logos/color/hyperlane.svg +1 -0
  262. package/logos/color/moonbeam.svg +1 -0
  263. package/logos/color/optimism.svg +1 -0
  264. package/logos/color/polygon.svg +1 -0
  265. package/package.json +6 -4
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.InterchainGasCalculator = void 0;
16
+ const coingecko_api_1 = __importDefault(require("coingecko-api"));
17
+ const ethers_1 = require("ethers");
18
+ const utils_1 = require("@hyperlane-xyz/utils");
19
+ const chainMetadata_1 = require("../consts/chainMetadata");
20
+ const HyperlaneCore_1 = require("../core/HyperlaneCore");
21
+ const domains_1 = require("../domains");
22
+ const number_1 = require("../utils/number");
23
+ const token_prices_1 = require("./token-prices");
24
+ /**
25
+ * A note on arithmetic:
26
+ * The ethers.BigNumber implementation behaves very similar to Solidity's
27
+ * number handling by not supporting decimals. To avoid adding another big
28
+ * number implementation as a dependency, we use ethers.FixedNumber, a
29
+ * fixed point implementation intended to model how Solidity's half-supported
30
+ * fixed point numbers work, see https://docs.soliditylang.org/en/v0.8.13/types.html#fixed-point-numbers).
31
+ *
32
+ * Generally, ceiling is used rather than floor here to err on the side of over-
33
+ * estimating amounts.
34
+ */
35
+ // If a chain doesn't specify how many decimals their native token has, 18 is used.
36
+ const DEFAULT_TOKEN_DECIMALS = 18;
37
+ // Intrinsic gas for a transaction. Does not consider calldata costs or differences in
38
+ // intrinsic gas for different chains.
39
+ const GAS_INTRINSIC = 21000;
40
+ // The gas used to process a message when the quorum size is zero.
41
+ // Includes intrinsic gas and all other gas that does not scale with the
42
+ // quorum size. Excludes the cost of calling `recipient.handle()`.
43
+ // Derived by observing the amount of gas consumed for a quorum of 1 (~103000 gas),
44
+ // and subtracting the gas overhead per signature.
45
+ const GAS_OVERHEAD_BASE = 95000;
46
+ // The amount of gas used for each signature when a signed checkpoint
47
+ // is submitted for verification.
48
+ // Really observed to be about 8568, but rounding up for safety.
49
+ const GAS_OVERHEAD_PER_SIGNATURE = 9000;
50
+ /**
51
+ * Calculates interchain gas payments.
52
+ */
53
+ class InterchainGasCalculator {
54
+ constructor(multiProvider, core, config) {
55
+ var _a, _b;
56
+ this.multiProvider = multiProvider;
57
+ this.core = core;
58
+ if (config === null || config === void 0 ? void 0 : config.tokenPriceGetter) {
59
+ this.tokenPriceGetter = config.tokenPriceGetter;
60
+ }
61
+ else {
62
+ const coinGecko = new coingecko_api_1.default();
63
+ this.tokenPriceGetter = new token_prices_1.CoinGeckoTokenPriceGetter(coinGecko);
64
+ }
65
+ this.paymentEstimateMultiplier = ethers_1.FixedNumber.from((_a = config === null || config === void 0 ? void 0 : config.paymentEstimateMultiplier) !== null && _a !== void 0 ? _a : '1.25');
66
+ this.messageGasEstimateBuffer = ethers_1.BigNumber.from((_b = config === null || config === void 0 ? void 0 : config.messageGasEstimateBuffer) !== null && _b !== void 0 ? _b : 50000);
67
+ }
68
+ static fromEnvironment(env, multiProvider, config) {
69
+ const core = HyperlaneCore_1.HyperlaneCore.fromEnvironment(env, multiProvider);
70
+ return new InterchainGasCalculator(multiProvider, core, config);
71
+ }
72
+ /**
73
+ * Given an amount of gas to consume on the destination chain, calculates the
74
+ * estimated payment denominated in the native token of the origin chain.
75
+ * Considers the exchange rate between the native tokens of the origin and
76
+ * destination chains and the suggested gas price of the destination chain.
77
+ * @param origin The name of the origin chain.
78
+ * @param destination The name of the destination chain.
79
+ * @param gas The amount of gas to pay for on the destination chain.
80
+ * @returns An estimated amount of origin chain tokens to cover gas costs on the
81
+ * destination chain.
82
+ */
83
+ estimatePaymentForGas(origin, destination, gas) {
84
+ return __awaiter(this, void 0, void 0, function* () {
85
+ const destinationGasPrice = yield this.getGasPrice(destination);
86
+ const destinationGasCost = gas.mul(destinationGasPrice);
87
+ const originGasCost = yield this.convertBetweenTokens(destination, origin, destinationGasCost);
88
+ // Applies a multiplier
89
+ return (0, number_1.mulBigAndFixed)(originGasCost, this.paymentEstimateMultiplier, true);
90
+ });
91
+ }
92
+ /**
93
+ * Given an amount of gas the message's recipient `handle` function is expected
94
+ * to use, calculates the estimated payment denominated in the native
95
+ * token of the origin chain. Considers the exchange rate between the native
96
+ * tokens of the origin and destination chains, the suggested gas price on
97
+ * the destination chain, gas costs incurred by a relayer when submitting a signed
98
+ * checkpoint to the destination chain, and the overhead gas cost in Inbox of processing
99
+ * a message.
100
+ * @param origin The name of the origin chain.
101
+ * @param destination The name of the destination chain.
102
+ * @param handleGas The amount of gas the recipient `handle` function
103
+ * is estimated to use.
104
+ * @returns An estimated amount of origin chain tokens to cover gas costs of the
105
+ * message on the destination chain.
106
+ */
107
+ estimatePaymentForHandleGas(origin, destination, handleGas) {
108
+ return __awaiter(this, void 0, void 0, function* () {
109
+ const destinationGas = handleGas.add(yield this.estimateGasForProcess(origin, destination));
110
+ return this.estimatePaymentForGas(origin, destination, destinationGas);
111
+ });
112
+ }
113
+ /**
114
+ * Calculates the estimated payment to process the message on its destination chain,
115
+ * denominated in the native token of the origin chain. The gas used by the message's
116
+ * recipient handler function is estimated in an eth_estimateGas call to the
117
+ * destination chain, and is then used to calculate the payment using
118
+ * Currently made private as it does not work properly for Arbitrum.
119
+ * {@link estimatePaymentForHandleGasAmount}.
120
+ * @param message The parsed message to estimate payment for.
121
+ * @returns An estimated amount of origin chain tokens to cover gas costs of the
122
+ * message on the destination chain.
123
+ */
124
+ estimatePaymentForMessage(message) {
125
+ return __awaiter(this, void 0, void 0, function* () {
126
+ const handleGas = yield this.estimateGasForHandle(message);
127
+ return this.estimatePaymentForHandleGas(message.origin, message.destination, handleGas);
128
+ });
129
+ }
130
+ /**
131
+ * Using the exchange rates provided by tokenPriceGetter, returns the amount of
132
+ * `toChain` native tokens equivalent in value to the provided `fromAmount` of
133
+ * `fromChain` native tokens. Accounts for differences in the decimals of the tokens.
134
+ * @param fromChain The chain whose native token is being converted from.
135
+ * @param toChain The chain whose native token is being converted into.
136
+ * @param fromAmount The amount of `fromChain` native tokens to convert from.
137
+ * @returns The amount of `toChain` native tokens whose value is equivalent to
138
+ * `fromAmount` of `fromChain` native tokens.
139
+ */
140
+ convertBetweenTokens(fromChain, toChain, value) {
141
+ return __awaiter(this, void 0, void 0, function* () {
142
+ // Does not factor in differing token decimals.
143
+ const exchangeRate = yield this.tokenPriceGetter.getTokenExchangeRate(fromChain, toChain);
144
+ // 1/100th of a cent
145
+ const PRECISION = 1000;
146
+ return (0, number_1.convertDecimalValue)(value.mul(Math.round(exchangeRate * PRECISION)).div(PRECISION), this.tokenDecimals(fromChain), this.tokenDecimals(toChain));
147
+ });
148
+ }
149
+ /**
150
+ * Gets a suggested gas price for a chain.
151
+ * @param chainName The name of the chain to get the gas price for
152
+ * @returns The suggested gas price in wei on the destination chain.
153
+ */
154
+ getGasPrice(chain) {
155
+ return __awaiter(this, void 0, void 0, function* () {
156
+ const provider = this.multiProvider.getChainConnection(chain).provider;
157
+ if (provider == undefined) {
158
+ throw new Error(`Missing provider for ${chain}`);
159
+ }
160
+ return provider.getGasPrice();
161
+ });
162
+ }
163
+ /**
164
+ * Gets the number of decimals of the provided chain's native token.
165
+ * @param chain The chain.
166
+ * @returns The number of decimals of `chain`'s native token.
167
+ */
168
+ tokenDecimals(chain) {
169
+ var _a;
170
+ return (_a = chainMetadata_1.chainMetadata[chain].nativeToken.decimals) !== null && _a !== void 0 ? _a : DEFAULT_TOKEN_DECIMALS;
171
+ }
172
+ /**
173
+ * Estimates the amount of gas used by message's recipient `handle` function
174
+ * on its destination chain. This does not assume the Inbox of the destination
175
+ * chain has a checkpoint that the message is included in, and does not
176
+ * consider intrinsic gas or any "overhead" gas incurred by Inbox.process.
177
+ * The estimated gas returned is the sum of:
178
+ * 1. The estimated gas consumption of a direct call to the `handle`
179
+ * function of the recipient address using the correct parameters and
180
+ * setting the `from` address of the transaction to the address of the inbox.
181
+ * 2. A buffer to account for inaccuracies in the above estimation.
182
+ * @param message The message to estimate recipient `handle` gas usage for.
183
+ * @returns The estimated gas required by the message's recipient handle function
184
+ * on the destination chain.
185
+ */
186
+ estimateGasForHandle(message) {
187
+ return __awaiter(this, void 0, void 0, function* () {
188
+ const provider = this.multiProvider.getChainConnection(message.destination)
189
+ .provider;
190
+ const mailbox = this.core.getContracts(message.destination).mailbox
191
+ .contract;
192
+ const handlerInterface = new ethers_1.ethers.utils.Interface([
193
+ 'function handle(uint32,bytes32,bytes)',
194
+ ]);
195
+ // Estimates a direct call to the `handle` function of the recipient
196
+ // with the `from` address set to the inbox.
197
+ // This includes intrinsic gas.
198
+ const directHandleCallGas = yield provider.estimateGas({
199
+ to: utils_1.utils.bytes32ToAddress(message.recipient),
200
+ from: mailbox.address,
201
+ data: handlerInterface.encodeFunctionData('handle', [
202
+ chainMetadata_1.chainMetadata[message.origin].id,
203
+ utils_1.utils.addressToBytes32(message.sender),
204
+ message.body,
205
+ ]),
206
+ });
207
+ // Subtract intrinsic gas, which is included in directHandleCallGas.
208
+ // Note the "real" intrinsic gas will always be higher than this.intrinsicGas
209
+ // due to calldata costs, but this is desired because subtracting the lower bound
210
+ // this.intrinsicGas will result in a more generous final estimate.
211
+ return directHandleCallGas
212
+ .add(this.messageGasEstimateBuffer)
213
+ .sub(this.intrinsicGas());
214
+ });
215
+ }
216
+ /**
217
+ * @returns A generous estimation of the gas consumption of all process
218
+ * operations within Inbox.sol, including intrinsic gas. Does not include any gas
219
+ * consumed within a message's recipient `handle` function.
220
+ */
221
+ estimateGasForProcess(origin, destination) {
222
+ return __awaiter(this, void 0, void 0, function* () {
223
+ // TODO: Check the recipient module
224
+ const module = this.core.getContracts(destination).multisigIsm;
225
+ const threshold = yield module.threshold(domains_1.ChainNameToDomainId[origin]);
226
+ return ethers_1.BigNumber.from(threshold)
227
+ .mul(GAS_OVERHEAD_PER_SIGNATURE)
228
+ .add(GAS_OVERHEAD_BASE);
229
+ });
230
+ }
231
+ /**
232
+ * @returns The intrinsic gas of a basic transaction. Note this does not consider calldata
233
+ * costs or potentially different intrinsic gas costs for different chains.
234
+ */
235
+ intrinsicGas() {
236
+ return ethers_1.BigNumber.from(GAS_INTRINSIC);
237
+ }
238
+ }
239
+ exports.InterchainGasCalculator = InterchainGasCalculator;
240
+ //# sourceMappingURL=calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculator.js","sourceRoot":"","sources":["../../src/gas/calculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=calculator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculator.test.d.ts","sourceRoot":"","sources":["../../src/gas/calculator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const chai_1 = require("chai");
16
+ const ethers_1 = require("ethers");
17
+ const sinon_1 = __importDefault(require("sinon"));
18
+ const chains_1 = require("../consts/chains");
19
+ const HyperlaneCore_1 = require("../core/HyperlaneCore");
20
+ const MultiProvider_1 = require("../providers/MultiProvider");
21
+ const testUtils_1 = require("../test/testUtils");
22
+ const calculator_1 = require("./calculator");
23
+ const HANDLE_GAS = 100000;
24
+ const SUGGESTED_GAS_PRICE = 10;
25
+ const INBOX_PROCESS_OVERHEAD_GAS = 100000;
26
+ // Exposes protected methods so they can be stubbed.
27
+ class TestInterchainGasCalculator extends calculator_1.InterchainGasCalculator {
28
+ estimateGasForProcess(origin, destination) {
29
+ return super.estimateGasForProcess(origin, destination);
30
+ }
31
+ estimateGasForHandle(message) {
32
+ return super.estimateGasForHandle(message);
33
+ }
34
+ convertBetweenTokens(fromChain, toChain, fromAmount) {
35
+ return super.convertBetweenTokens(fromChain, toChain, fromAmount);
36
+ }
37
+ tokenDecimals(chain) {
38
+ return super.tokenDecimals(chain);
39
+ }
40
+ getGasPrice(chain) {
41
+ return super.getGasPrice(chain);
42
+ }
43
+ }
44
+ describe('InterchainGasCalculator', () => {
45
+ const provider = new testUtils_1.MockProvider();
46
+ // TODO: fix types to not require the <any> here.
47
+ // This is because InterchainGasCalculator isn't very strongly typed,
48
+ // which is because ParsedMessage isn't very strongly typed. This results
49
+ // in InterchainGasCalculator expecting a multiprovider with providers for
50
+ // every chain.
51
+ const multiProvider = new MultiProvider_1.MultiProvider({
52
+ test1: { provider },
53
+ test2: { provider },
54
+ test3: { provider },
55
+ });
56
+ const core = HyperlaneCore_1.HyperlaneCore.fromEnvironment('test', multiProvider);
57
+ const origin = chains_1.Chains.test1;
58
+ const destination = chains_1.Chains.test2;
59
+ let tokenPriceGetter;
60
+ let calculator;
61
+ beforeEach(() => {
62
+ tokenPriceGetter = new testUtils_1.MockTokenPriceGetter();
63
+ tokenPriceGetter.setTokenPrice(origin, 9.0909);
64
+ tokenPriceGetter.setTokenPrice(destination, 5.5);
65
+ calculator = new TestInterchainGasCalculator(multiProvider, core, {
66
+ tokenPriceGetter,
67
+ // A multiplier of 1 makes testing easier to reason about
68
+ paymentEstimateMultiplier: '1',
69
+ });
70
+ });
71
+ afterEach(() => {
72
+ sinon_1.default.restore();
73
+ provider.clearMethodResolveValues();
74
+ });
75
+ describe('estimatePaymentForGas', () => {
76
+ it('estimates origin token payment from a specified destination gas amount', () => __awaiter(void 0, void 0, void 0, function* () {
77
+ // Set destination gas price to 10 wei
78
+ provider.setMethodResolveValue('getGasPrice', ethers_1.BigNumber.from(SUGGESTED_GAS_PRICE));
79
+ const estimatedPayment = yield calculator.estimatePaymentForGas(origin, destination, ethers_1.BigNumber.from(HANDLE_GAS));
80
+ // 100k gas * 10 gas price * ($5.5 per destination token / $9.0909 per origin token)
81
+ (0, chai_1.expect)(estimatedPayment.toNumber()).to.equal(605000);
82
+ }));
83
+ });
84
+ describe('estimatePaymentForHandleGas', () => {
85
+ it('estimates origin token payment from a specified destination handle gas amount', () => __awaiter(void 0, void 0, void 0, function* () {
86
+ // Set destination gas price to 10 wei
87
+ provider.setMethodResolveValue('getGasPrice', ethers_1.BigNumber.from(SUGGESTED_GAS_PRICE));
88
+ // Stub the inbox process overhead gas
89
+ sinon_1.default
90
+ .stub(calculator, 'estimateGasForProcess')
91
+ .returns(Promise.resolve(ethers_1.BigNumber.from(INBOX_PROCESS_OVERHEAD_GAS)));
92
+ const estimatedPayment = yield calculator.estimatePaymentForHandleGas(origin, destination, ethers_1.BigNumber.from(HANDLE_GAS));
93
+ // (100_000 dest handler gas + 100_000 process overhead gas)
94
+ // * 10 gas price * ($5.5 per destination token / $9.0909 per origin token)
95
+ (0, chai_1.expect)(estimatedPayment.toNumber()).to.equal(1210000);
96
+ }));
97
+ });
98
+ /*
99
+ describe('estimatePaymentForMessage', () => {
100
+ it('estimates origin token payment from a specified message', async () => {
101
+ // Set destination gas price to 10 wei
102
+ provider.setMethodResolveValue(
103
+ 'getGasPrice',
104
+ BigNumber.from(SUGGESTED_GAS_PRICE),
105
+ );
106
+ // Set the estimated handle gas
107
+ sinon
108
+ .stub(calculator, 'estimateGasForHandle')
109
+ .returns(Promise.resolve(BigNumber.from(HANDLE_GAS)));
110
+ // Stub the inbox process overhead gas
111
+ sinon
112
+ .stub(calculator, 'estimateGasForProcess')
113
+ .returns(Promise.resolve(BigNumber.from(INBOX_PROCESS_OVERHEAD_GAS)));
114
+
115
+ const zeroAddressBytes32 = utils.addressToBytes32(
116
+ ethers.constants.AddressZero,
117
+ );
118
+ const message: ParsedMessage<TestChainNames, Chains.test2> = {
119
+ origin: origin,
120
+ sender: zeroAddressBytes32,
121
+ destination: destination,
122
+ recipient: zeroAddressBytes32,
123
+ body: '0x12345678',
124
+ };
125
+
126
+ const estimatedPayment = await calculator.estimatePaymentForMessage(
127
+ message,
128
+ );
129
+
130
+ // (100_000 dest handler gas + 100_000 process overhead gas)
131
+ // * 10 gas price * ($5.5 per destination token / $9.0909 per origin token)
132
+ expect(estimatedPayment.toNumber()).to.equal(1_210_000);
133
+ });
134
+ });
135
+ */
136
+ describe('convertBetweenTokens', () => {
137
+ const destinationWei = ethers_1.BigNumber.from('1000');
138
+ it('converts using the USD value of origin and destination native tokens', () => __awaiter(void 0, void 0, void 0, function* () {
139
+ const originWei = yield calculator.convertBetweenTokens(destination, origin, destinationWei);
140
+ // 1000 * (5.5 / 9.0909)
141
+ (0, chai_1.expect)(originWei.toNumber()).to.equal(605);
142
+ }));
143
+ it('considers when the origin token decimals > the destination token decimals', () => __awaiter(void 0, void 0, void 0, function* () {
144
+ calculator.tokenDecimals = (chain) => {
145
+ if (chain === origin) {
146
+ return 20;
147
+ }
148
+ return 18;
149
+ };
150
+ const originWei = yield calculator.convertBetweenTokens(destination, origin, destinationWei);
151
+ // 1000 * (5.5 / 9.0909) * 100
152
+ (0, chai_1.expect)(originWei.toNumber()).to.equal(60500);
153
+ }));
154
+ it('considers when the origin token decimals < the destination token decimals', () => __awaiter(void 0, void 0, void 0, function* () {
155
+ sinon_1.default
156
+ .stub(calculator, 'tokenDecimals')
157
+ .callsFake((chain) => {
158
+ if (chain === origin) {
159
+ return 16;
160
+ }
161
+ return 18;
162
+ });
163
+ const originWei = yield calculator.convertBetweenTokens(destination, origin, destinationWei);
164
+ // 1000 * (5.5 / 9.0909) / 100
165
+ (0, chai_1.expect)(originWei.toNumber()).to.equal(6);
166
+ }));
167
+ });
168
+ describe('getGasPrice', () => {
169
+ it('gets the gas price from the provider', () => __awaiter(void 0, void 0, void 0, function* () {
170
+ provider.setMethodResolveValue('getGasPrice', ethers_1.BigNumber.from(SUGGESTED_GAS_PRICE));
171
+ (0, chai_1.expect)((yield calculator.getGasPrice(destination)).toNumber()).to.equal(SUGGESTED_GAS_PRICE);
172
+ }));
173
+ });
174
+ describe('estimateGasForProcess', () => {
175
+ let threshold;
176
+ // Mock the return value of MultisigIsm.threshold
177
+ // to return `threshold`. Because the mocking involves a closure,
178
+ // changing `threshold` will change the return value of MultisigIsm.threshold.
179
+ before(() => {
180
+ const getContractsStub = sinon_1.default.stub(core, 'getContracts');
181
+ let thresholdStub;
182
+ getContractsStub.callsFake((chain) => {
183
+ // Get the "real" return value of getContracts.
184
+ const contracts = getContractsStub.wrappedMethod.bind(core)(chain);
185
+ // Ethers contracts are frozen using Object.freeze, so we make a copy
186
+ // of the object so we can stub `threshold`.
187
+ const multisigIsm = Object.assign({}, contracts.multisigIsm);
188
+ // Because we are stubbing vaidatorManager.threshold when core.getContracts gets called,
189
+ // we must ensure we don't try to stub more than once or sinon will complain.
190
+ if (!thresholdStub) {
191
+ thresholdStub = sinon_1.default
192
+ .stub(multisigIsm, 'threshold')
193
+ .callsFake(() => Promise.resolve(threshold));
194
+ contracts.multisigIsm = multisigIsm;
195
+ }
196
+ return contracts;
197
+ });
198
+ });
199
+ it('scales the gas cost with the quorum threshold', () => __awaiter(void 0, void 0, void 0, function* () {
200
+ threshold = 2;
201
+ const gasWithThresholdLow = yield calculator.estimateGasForProcess(origin, destination);
202
+ threshold = 3;
203
+ const gasWithThresholdHigh = yield calculator.estimateGasForProcess(origin, destination);
204
+ (0, chai_1.expect)(gasWithThresholdHigh.gt(gasWithThresholdLow)).to.be.true;
205
+ }));
206
+ });
207
+ });
208
+ //# sourceMappingURL=calculator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculator.test.js","sourceRoot":"","sources":["../../src/gas/calculator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import CoinGecko from 'coingecko-api';
2
+ import { ChainName } from '../types';
3
+ export interface TokenPriceGetter {
4
+ getTokenPrice(chain: ChainName): Promise<number>;
5
+ getTokenExchangeRate(base: ChainName, quote: ChainName): Promise<number>;
6
+ }
7
+ export declare type CoinGeckoInterface = Pick<CoinGecko, 'simple'>;
8
+ export declare type CoinGeckoSimpleInterface = CoinGecko['simple'];
9
+ export declare type CoinGeckoSimplePriceParams = Parameters<CoinGeckoSimpleInterface['price']>[0];
10
+ export declare type CoinGeckoResponse = ReturnType<CoinGeckoSimpleInterface['price']>;
11
+ declare type TokenPriceCacheEntry = {
12
+ price: number;
13
+ timestamp: Date;
14
+ };
15
+ declare class TokenPriceCache {
16
+ protected cache: Map<ChainName, TokenPriceCacheEntry>;
17
+ protected freshSeconds: number;
18
+ protected evictionSeconds: number;
19
+ constructor(freshSeconds?: number, evictionSeconds?: number);
20
+ put(chain: ChainName, price: number): void;
21
+ isFresh(chain: ChainName): boolean;
22
+ fetch(chain: ChainName): number;
23
+ }
24
+ export declare class CoinGeckoTokenPriceGetter implements TokenPriceGetter {
25
+ protected coinGecko: CoinGeckoInterface;
26
+ protected cache: TokenPriceCache;
27
+ constructor(coinGecko: CoinGeckoInterface, expirySeconds?: number);
28
+ getTokenPrice(chain: ChainName): Promise<number>;
29
+ getTokenExchangeRate(base: ChainName, quote: ChainName): Promise<number>;
30
+ private getTokenPrices;
31
+ private queryTokenPrices;
32
+ }
33
+ export {};
34
+ //# sourceMappingURL=token-prices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-prices.d.ts","sourceRoot":"","sources":["../../src/gas/token-prices.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,eAAe,CAAC;AAMtC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1E;AAED,oBAAY,kBAAkB,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC3D,oBAAY,wBAAwB,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC3D,oBAAY,0BAA0B,GAAG,UAAU,CACjD,wBAAwB,CAAC,OAAO,CAAC,CAClC,CAAC,CAAC,CAAC,CAAC;AACL,oBAAY,iBAAiB,GAAG,UAAU,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;AAE9E,aAAK,oBAAoB,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAEF,cAAM,eAAe;IACnB,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACtD,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC;gBAEtB,YAAY,SAAK,EAAE,eAAe,SAAc;IAM5D,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1C,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO;IAWlC,KAAK,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM;CAchC;AAED,qBAAa,yBAA0B,YAAW,gBAAgB;IAChE,SAAS,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACxC,SAAS,CAAC,KAAK,EAAE,eAAe,CAAC;gBAErB,SAAS,EAAE,kBAAkB,EAAE,aAAa,CAAC,EAAE,MAAM;IAK3D,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC;IAKhD,oBAAoB,CACxB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,MAAM,CAAC;YAKJ,cAAc;YA0Bd,gBAAgB;CAe/B"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CoinGeckoTokenPriceGetter = void 0;
13
+ const utils_1 = require("@hyperlane-xyz/utils");
14
+ const chainMetadata_1 = require("../consts/chainMetadata");
15
+ const chains_1 = require("../consts/chains");
16
+ class TokenPriceCache {
17
+ constructor(freshSeconds = 60, evictionSeconds = 3 * 60 * 60) {
18
+ this.cache = new Map();
19
+ this.freshSeconds = freshSeconds;
20
+ this.evictionSeconds = evictionSeconds;
21
+ }
22
+ put(chain, price) {
23
+ const now = new Date();
24
+ this.cache.set(chain, { timestamp: now, price });
25
+ }
26
+ isFresh(chain) {
27
+ const entry = this.cache.get(chain);
28
+ if (!entry)
29
+ return false;
30
+ const expiryTime = new Date(entry.timestamp.getTime() + 1000 * this.freshSeconds);
31
+ const now = new Date();
32
+ return now < expiryTime;
33
+ }
34
+ fetch(chain) {
35
+ const entry = this.cache.get(chain);
36
+ if (!entry) {
37
+ throw new Error(`no entry found for ${chain} in token price cache`);
38
+ }
39
+ const evictionTime = new Date(entry.timestamp.getTime() + 1000 * this.evictionSeconds);
40
+ const now = new Date();
41
+ if (now > evictionTime) {
42
+ throw new Error(`evicted entry found for ${chain} in token price cache`);
43
+ }
44
+ return entry.price;
45
+ }
46
+ }
47
+ class CoinGeckoTokenPriceGetter {
48
+ constructor(coinGecko, expirySeconds) {
49
+ this.coinGecko = coinGecko;
50
+ this.cache = new TokenPriceCache(expirySeconds);
51
+ }
52
+ getTokenPrice(chain) {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ const [price] = yield this.getTokenPrices([chain]);
55
+ return price;
56
+ });
57
+ }
58
+ getTokenExchangeRate(base, quote) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ const [basePrice, quotePrice] = yield this.getTokenPrices([base, quote]);
61
+ return basePrice / quotePrice;
62
+ });
63
+ }
64
+ getTokenPrices(chains) {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ const isMainnet = chains.map((c) => chains_1.Mainnets.includes(c));
67
+ const allMainnets = isMainnet.every((v) => v === true);
68
+ const allTestnets = isMainnet.every((v) => v === false);
69
+ if (allTestnets) {
70
+ // Testnet tokens are all artificially priced at 1.0 USD.
71
+ return chains.map(() => 1);
72
+ }
73
+ if (!allMainnets) {
74
+ throw new Error('Cannot mix testnets and mainnets when fetching token prices');
75
+ }
76
+ const toQuery = chains.filter((c) => !this.cache.isFresh(c));
77
+ if (toQuery.length > 0) {
78
+ try {
79
+ yield this.queryTokenPrices(toQuery);
80
+ }
81
+ catch (e) {
82
+ (0, utils_1.warn)('Failed to query token prices', e);
83
+ }
84
+ }
85
+ return chains.map((chain) => this.cache.fetch(chain));
86
+ });
87
+ }
88
+ queryTokenPrices(chains) {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ const currency = 'usd';
91
+ // The CoinGecko API expects, in some cases, IDs that do not match
92
+ // ChainNames.
93
+ const ids = chains.map((chain) => chainMetadata_1.chainMetadata[chain].gasCurrencyCoinGeckoId || chain);
94
+ const response = yield this.coinGecko.simple.price({
95
+ ids,
96
+ vs_currencies: [currency],
97
+ });
98
+ const prices = ids.map((id) => response.data[id][currency]);
99
+ // Update the cache with the newly fetched prices
100
+ chains.map((chain, i) => this.cache.put(chain, prices[i]));
101
+ });
102
+ }
103
+ }
104
+ exports.CoinGeckoTokenPriceGetter = CoinGeckoTokenPriceGetter;
105
+ //# sourceMappingURL=token-prices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-prices.js","sourceRoot":"","sources":["../../src/gas/token-prices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=token-prices.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-prices.test.d.ts","sourceRoot":"","sources":["../../src/gas/token-prices.test.ts"],"names":[],"mappings":""}