@across-protocol/sdk 4.3.136 → 4.3.137-alpha.0

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 (245) hide show
  1. package/dist/cjs/src/arch/evm/UpgradeUtils.d.ts +2 -0
  2. package/dist/cjs/src/arch/evm/UpgradeUtils.js +33 -0
  3. package/dist/cjs/src/arch/evm/UpgradeUtils.js.map +1 -0
  4. package/dist/cjs/src/arch/evm/index.d.ts +1 -0
  5. package/dist/cjs/src/arch/evm/index.js +1 -0
  6. package/dist/cjs/src/arch/evm/index.js.map +1 -1
  7. package/dist/cjs/src/arch/index.d.ts +1 -0
  8. package/dist/cjs/src/arch/index.js +2 -1
  9. package/dist/cjs/src/arch/index.js.map +1 -1
  10. package/dist/cjs/src/arch/tvm/BlockUtils.d.ts +1 -0
  11. package/dist/cjs/src/arch/tvm/BlockUtils.js +7 -0
  12. package/dist/cjs/src/arch/tvm/BlockUtils.js.map +1 -0
  13. package/dist/cjs/src/arch/tvm/MessageUtils.d.ts +1 -0
  14. package/dist/cjs/src/arch/tvm/MessageUtils.js +5 -0
  15. package/dist/cjs/src/arch/tvm/MessageUtils.js.map +1 -0
  16. package/dist/cjs/src/arch/tvm/ResourceUtils.d.ts +14 -0
  17. package/dist/cjs/src/arch/tvm/ResourceUtils.js +69 -0
  18. package/dist/cjs/src/arch/tvm/ResourceUtils.js.map +1 -0
  19. package/dist/cjs/src/arch/tvm/SpokeUtils.d.ts +12 -0
  20. package/dist/cjs/src/arch/tvm/SpokeUtils.js +207 -0
  21. package/dist/cjs/src/arch/tvm/SpokeUtils.js.map +1 -0
  22. package/dist/cjs/src/arch/tvm/TransactionUtils.d.ts +7 -0
  23. package/dist/cjs/src/arch/tvm/TransactionUtils.js +43 -0
  24. package/dist/cjs/src/arch/tvm/TransactionUtils.js.map +1 -0
  25. package/dist/cjs/src/arch/tvm/index.d.ts +6 -0
  26. package/dist/cjs/src/arch/tvm/index.js +10 -0
  27. package/dist/cjs/src/arch/tvm/index.js.map +1 -0
  28. package/dist/cjs/src/arch/tvm/types.d.ts +2 -0
  29. package/dist/cjs/src/arch/tvm/types.js +3 -0
  30. package/dist/cjs/src/arch/tvm/types.js.map +1 -0
  31. package/dist/cjs/src/arch/tvm/utils/address.d.ts +3 -0
  32. package/dist/cjs/src/arch/tvm/utils/address.js +17 -0
  33. package/dist/cjs/src/arch/tvm/utils/address.js.map +1 -0
  34. package/dist/cjs/src/arch/tvm/utils/index.d.ts +2 -0
  35. package/dist/cjs/src/arch/tvm/utils/index.js +6 -0
  36. package/dist/cjs/src/arch/tvm/utils/index.js.map +1 -0
  37. package/dist/cjs/src/arch/tvm/utils/wait.d.ts +1 -0
  38. package/dist/cjs/src/arch/tvm/utils/wait.js +5 -0
  39. package/dist/cjs/src/arch/tvm/utils/wait.js.map +1 -0
  40. package/dist/cjs/src/clients/SpokePoolClient/EVMSpokePoolClient.d.ts +9 -2
  41. package/dist/cjs/src/clients/SpokePoolClient/EVMSpokePoolClient.js +33 -12
  42. package/dist/cjs/src/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
  43. package/dist/cjs/src/clients/SpokePoolClient/TVMSpokePoolClient.d.ts +11 -0
  44. package/dist/cjs/src/clients/SpokePoolClient/TVMSpokePoolClient.js +47 -0
  45. package/dist/cjs/src/clients/SpokePoolClient/TVMSpokePoolClient.js.map +1 -0
  46. package/dist/cjs/src/clients/SpokePoolClient/index.d.ts +3 -0
  47. package/dist/cjs/src/clients/SpokePoolClient/index.js +7 -1
  48. package/dist/cjs/src/clients/SpokePoolClient/index.js.map +1 -1
  49. package/dist/cjs/src/clients/SpokePoolClient/types.d.ts +1 -0
  50. package/dist/cjs/src/clients/SpokePoolClient/types.js +2 -1
  51. package/dist/cjs/src/clients/SpokePoolClient/types.js.map +1 -1
  52. package/dist/cjs/src/gasPriceOracle/adapters/tron.d.ts +4 -0
  53. package/dist/cjs/src/gasPriceOracle/adapters/tron.js +58 -0
  54. package/dist/cjs/src/gasPriceOracle/adapters/tron.js.map +1 -0
  55. package/dist/cjs/src/gasPriceOracle/index.d.ts +1 -1
  56. package/dist/cjs/src/gasPriceOracle/oracle.d.ts +3 -1
  57. package/dist/cjs/src/gasPriceOracle/oracle.js +15 -10
  58. package/dist/cjs/src/gasPriceOracle/oracle.js.map +1 -1
  59. package/dist/cjs/src/gasPriceOracle/types.d.ts +6 -1
  60. package/dist/cjs/src/gasPriceOracle/types.js +5 -0
  61. package/dist/cjs/src/gasPriceOracle/types.js.map +1 -1
  62. package/dist/cjs/src/relayFeeCalculator/chain-queries/factory.d.ts +81 -152
  63. package/dist/cjs/src/relayFeeCalculator/chain-queries/factory.js +5 -0
  64. package/dist/cjs/src/relayFeeCalculator/chain-queries/factory.js.map +1 -1
  65. package/dist/cjs/src/relayFeeCalculator/chain-queries/index.d.ts +1 -0
  66. package/dist/cjs/src/relayFeeCalculator/chain-queries/index.js +1 -0
  67. package/dist/cjs/src/relayFeeCalculator/chain-queries/index.js.map +1 -1
  68. package/dist/cjs/src/relayFeeCalculator/chain-queries/tvmQuery.d.ts +16 -0
  69. package/dist/cjs/src/relayFeeCalculator/chain-queries/tvmQuery.js +52 -0
  70. package/dist/cjs/src/relayFeeCalculator/chain-queries/tvmQuery.js.map +1 -0
  71. package/dist/cjs/src/relayFeeCalculator/relayFeeCalculator.d.ts +77 -150
  72. package/dist/cjs/src/utils/Multicall.js +1 -0
  73. package/dist/cjs/src/utils/Multicall.js.map +1 -1
  74. package/dist/cjs/src/utils/NetworkUtils.d.ts +1 -0
  75. package/dist/cjs/src/utils/NetworkUtils.js +9 -3
  76. package/dist/cjs/src/utils/NetworkUtils.js.map +1 -1
  77. package/dist/cjs/src/utils/TokenUtils.d.ts +154 -300
  78. package/dist/cjs/src/utils/TypeGuards.d.ts +3 -1
  79. package/dist/cjs/src/utils/TypeGuards.js +5 -0
  80. package/dist/cjs/src/utils/TypeGuards.js.map +1 -1
  81. package/dist/esm/src/arch/evm/UpgradeUtils.d.ts +9 -0
  82. package/dist/esm/src/arch/evm/UpgradeUtils.js +37 -0
  83. package/dist/esm/src/arch/evm/UpgradeUtils.js.map +1 -0
  84. package/dist/esm/src/arch/evm/index.d.ts +1 -0
  85. package/dist/esm/src/arch/evm/index.js +1 -0
  86. package/dist/esm/src/arch/evm/index.js.map +1 -1
  87. package/dist/esm/src/arch/index.d.ts +1 -0
  88. package/dist/esm/src/arch/index.js +2 -0
  89. package/dist/esm/src/arch/index.js.map +1 -1
  90. package/dist/esm/src/arch/tvm/BlockUtils.d.ts +1 -0
  91. package/dist/esm/src/arch/tvm/BlockUtils.js +2 -0
  92. package/dist/esm/src/arch/tvm/BlockUtils.js.map +1 -0
  93. package/dist/esm/src/arch/tvm/MessageUtils.d.ts +1 -0
  94. package/dist/esm/src/arch/tvm/MessageUtils.js +2 -0
  95. package/dist/esm/src/arch/tvm/MessageUtils.js.map +1 -0
  96. package/dist/esm/src/arch/tvm/ResourceUtils.d.ts +32 -0
  97. package/dist/esm/src/arch/tvm/ResourceUtils.js +88 -0
  98. package/dist/esm/src/arch/tvm/ResourceUtils.js.map +1 -0
  99. package/dist/esm/src/arch/tvm/SpokeUtils.d.ts +48 -0
  100. package/dist/esm/src/arch/tvm/SpokeUtils.js +237 -0
  101. package/dist/esm/src/arch/tvm/SpokeUtils.js.map +1 -0
  102. package/dist/esm/src/arch/tvm/TransactionUtils.d.ts +20 -0
  103. package/dist/esm/src/arch/tvm/TransactionUtils.js +55 -0
  104. package/dist/esm/src/arch/tvm/TransactionUtils.js.map +1 -0
  105. package/dist/esm/src/arch/tvm/index.d.ts +6 -0
  106. package/dist/esm/src/arch/tvm/index.js +7 -0
  107. package/dist/esm/src/arch/tvm/index.js.map +1 -0
  108. package/dist/esm/src/arch/tvm/types.d.ts +2 -0
  109. package/dist/esm/src/arch/tvm/types.js +2 -0
  110. package/dist/esm/src/arch/tvm/types.js.map +1 -0
  111. package/dist/esm/src/arch/tvm/utils/address.d.ts +18 -0
  112. package/dist/esm/src/arch/tvm/utils/address.js +31 -0
  113. package/dist/esm/src/arch/tvm/utils/address.js.map +1 -0
  114. package/dist/esm/src/arch/tvm/utils/index.d.ts +2 -0
  115. package/dist/esm/src/arch/tvm/utils/index.js +3 -0
  116. package/dist/esm/src/arch/tvm/utils/index.js.map +1 -0
  117. package/dist/esm/src/arch/tvm/utils/wait.d.ts +1 -0
  118. package/dist/esm/src/arch/tvm/utils/wait.js +2 -0
  119. package/dist/esm/src/arch/tvm/utils/wait.js.map +1 -0
  120. package/dist/esm/src/clients/SpokePoolClient/EVMSpokePoolClient.d.ts +20 -2
  121. package/dist/esm/src/clients/SpokePoolClient/EVMSpokePoolClient.js +44 -12
  122. package/dist/esm/src/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
  123. package/dist/esm/src/clients/SpokePoolClient/TVMSpokePoolClient.d.ts +32 -0
  124. package/dist/esm/src/clients/SpokePoolClient/TVMSpokePoolClient.js +66 -0
  125. package/dist/esm/src/clients/SpokePoolClient/TVMSpokePoolClient.js.map +1 -0
  126. package/dist/esm/src/clients/SpokePoolClient/index.d.ts +8 -0
  127. package/dist/esm/src/clients/SpokePoolClient/index.js +10 -1
  128. package/dist/esm/src/clients/SpokePoolClient/index.js.map +1 -1
  129. package/dist/esm/src/clients/SpokePoolClient/types.d.ts +1 -0
  130. package/dist/esm/src/clients/SpokePoolClient/types.js +1 -0
  131. package/dist/esm/src/clients/SpokePoolClient/types.js.map +1 -1
  132. package/dist/esm/src/gasPriceOracle/adapters/tron.d.ts +10 -0
  133. package/dist/esm/src/gasPriceOracle/adapters/tron.js +68 -0
  134. package/dist/esm/src/gasPriceOracle/adapters/tron.js.map +1 -0
  135. package/dist/esm/src/gasPriceOracle/index.d.ts +1 -1
  136. package/dist/esm/src/gasPriceOracle/oracle.d.ts +3 -1
  137. package/dist/esm/src/gasPriceOracle/oracle.js +17 -11
  138. package/dist/esm/src/gasPriceOracle/oracle.js.map +1 -1
  139. package/dist/esm/src/gasPriceOracle/types.d.ts +6 -1
  140. package/dist/esm/src/gasPriceOracle/types.js +4 -0
  141. package/dist/esm/src/gasPriceOracle/types.js.map +1 -1
  142. package/dist/esm/src/relayFeeCalculator/chain-queries/factory.d.ts +81 -152
  143. package/dist/esm/src/relayFeeCalculator/chain-queries/factory.js +6 -1
  144. package/dist/esm/src/relayFeeCalculator/chain-queries/factory.js.map +1 -1
  145. package/dist/esm/src/relayFeeCalculator/chain-queries/index.d.ts +1 -0
  146. package/dist/esm/src/relayFeeCalculator/chain-queries/index.js +1 -0
  147. package/dist/esm/src/relayFeeCalculator/chain-queries/index.js.map +1 -1
  148. package/dist/esm/src/relayFeeCalculator/chain-queries/tvmQuery.d.ts +32 -0
  149. package/dist/esm/src/relayFeeCalculator/chain-queries/tvmQuery.js +65 -0
  150. package/dist/esm/src/relayFeeCalculator/chain-queries/tvmQuery.js.map +1 -0
  151. package/dist/esm/src/relayFeeCalculator/relayFeeCalculator.d.ts +77 -150
  152. package/dist/esm/src/utils/Multicall.js +1 -0
  153. package/dist/esm/src/utils/Multicall.js.map +1 -1
  154. package/dist/esm/src/utils/NetworkUtils.d.ts +6 -0
  155. package/dist/esm/src/utils/NetworkUtils.js +13 -3
  156. package/dist/esm/src/utils/NetworkUtils.js.map +1 -1
  157. package/dist/esm/src/utils/TokenUtils.d.ts +154 -300
  158. package/dist/esm/src/utils/TypeGuards.d.ts +3 -1
  159. package/dist/esm/src/utils/TypeGuards.js +4 -0
  160. package/dist/esm/src/utils/TypeGuards.js.map +1 -1
  161. package/dist/types/src/arch/evm/UpgradeUtils.d.ts +10 -0
  162. package/dist/types/src/arch/evm/UpgradeUtils.d.ts.map +1 -0
  163. package/dist/types/src/arch/evm/index.d.ts +1 -0
  164. package/dist/types/src/arch/evm/index.d.ts.map +1 -1
  165. package/dist/types/src/arch/index.d.ts +1 -0
  166. package/dist/types/src/arch/index.d.ts.map +1 -1
  167. package/dist/types/src/arch/tvm/BlockUtils.d.ts +2 -0
  168. package/dist/types/src/arch/tvm/BlockUtils.d.ts.map +1 -0
  169. package/dist/types/src/arch/tvm/MessageUtils.d.ts +2 -0
  170. package/dist/types/src/arch/tvm/MessageUtils.d.ts.map +1 -0
  171. package/dist/types/src/arch/tvm/ResourceUtils.d.ts +33 -0
  172. package/dist/types/src/arch/tvm/ResourceUtils.d.ts.map +1 -0
  173. package/dist/types/src/arch/tvm/SpokeUtils.d.ts +49 -0
  174. package/dist/types/src/arch/tvm/SpokeUtils.d.ts.map +1 -0
  175. package/dist/types/src/arch/tvm/TransactionUtils.d.ts +21 -0
  176. package/dist/types/src/arch/tvm/TransactionUtils.d.ts.map +1 -0
  177. package/dist/types/src/arch/tvm/index.d.ts +7 -0
  178. package/dist/types/src/arch/tvm/index.d.ts.map +1 -0
  179. package/dist/types/src/arch/tvm/types.d.ts +3 -0
  180. package/dist/types/src/arch/tvm/types.d.ts.map +1 -0
  181. package/dist/types/src/arch/tvm/utils/address.d.ts +19 -0
  182. package/dist/types/src/arch/tvm/utils/address.d.ts.map +1 -0
  183. package/dist/types/src/arch/tvm/utils/index.d.ts +3 -0
  184. package/dist/types/src/arch/tvm/utils/index.d.ts.map +1 -0
  185. package/dist/types/src/arch/tvm/utils/wait.d.ts +2 -0
  186. package/dist/types/src/arch/tvm/utils/wait.d.ts.map +1 -0
  187. package/dist/types/src/clients/SpokePoolClient/EVMSpokePoolClient.d.ts +20 -2
  188. package/dist/types/src/clients/SpokePoolClient/EVMSpokePoolClient.d.ts.map +1 -1
  189. package/dist/types/src/clients/SpokePoolClient/TVMSpokePoolClient.d.ts +33 -0
  190. package/dist/types/src/clients/SpokePoolClient/TVMSpokePoolClient.d.ts.map +1 -0
  191. package/dist/types/src/clients/SpokePoolClient/index.d.ts +8 -0
  192. package/dist/types/src/clients/SpokePoolClient/index.d.ts.map +1 -1
  193. package/dist/types/src/clients/SpokePoolClient/types.d.ts +1 -0
  194. package/dist/types/src/clients/SpokePoolClient/types.d.ts.map +1 -1
  195. package/dist/types/src/gasPriceOracle/adapters/tron.d.ts +11 -0
  196. package/dist/types/src/gasPriceOracle/adapters/tron.d.ts.map +1 -0
  197. package/dist/types/src/gasPriceOracle/index.d.ts +1 -1
  198. package/dist/types/src/gasPriceOracle/index.d.ts.map +1 -1
  199. package/dist/types/src/gasPriceOracle/oracle.d.ts +3 -1
  200. package/dist/types/src/gasPriceOracle/oracle.d.ts.map +1 -1
  201. package/dist/types/src/gasPriceOracle/types.d.ts +6 -1
  202. package/dist/types/src/gasPriceOracle/types.d.ts.map +1 -1
  203. package/dist/types/src/relayFeeCalculator/chain-queries/factory.d.ts +81 -152
  204. package/dist/types/src/relayFeeCalculator/chain-queries/factory.d.ts.map +1 -1
  205. package/dist/types/src/relayFeeCalculator/chain-queries/index.d.ts +1 -0
  206. package/dist/types/src/relayFeeCalculator/chain-queries/index.d.ts.map +1 -1
  207. package/dist/types/src/relayFeeCalculator/chain-queries/tvmQuery.d.ts +33 -0
  208. package/dist/types/src/relayFeeCalculator/chain-queries/tvmQuery.d.ts.map +1 -0
  209. package/dist/types/src/relayFeeCalculator/relayFeeCalculator.d.ts +77 -150
  210. package/dist/types/src/relayFeeCalculator/relayFeeCalculator.d.ts.map +1 -1
  211. package/dist/types/src/utils/Multicall.d.ts.map +1 -1
  212. package/dist/types/src/utils/NetworkUtils.d.ts +6 -0
  213. package/dist/types/src/utils/NetworkUtils.d.ts.map +1 -1
  214. package/dist/types/src/utils/TokenUtils.d.ts +154 -300
  215. package/dist/types/src/utils/TokenUtils.d.ts.map +1 -1
  216. package/dist/types/src/utils/TypeGuards.d.ts +3 -1
  217. package/dist/types/src/utils/TypeGuards.d.ts.map +1 -1
  218. package/package.json +3 -2
  219. package/src/arch/evm/UpgradeUtils.ts +18 -0
  220. package/src/arch/evm/index.ts +1 -0
  221. package/src/arch/index.ts +1 -0
  222. package/src/arch/tvm/BlockUtils.ts +1 -0
  223. package/src/arch/tvm/MessageUtils.ts +1 -0
  224. package/src/arch/tvm/ResourceUtils.ts +92 -0
  225. package/src/arch/tvm/SpokeUtils.ts +225 -0
  226. package/src/arch/tvm/TransactionUtils.ts +62 -0
  227. package/src/arch/tvm/index.ts +6 -0
  228. package/src/arch/tvm/types.ts +2 -0
  229. package/src/arch/tvm/utils/address.ts +33 -0
  230. package/src/arch/tvm/utils/index.ts +2 -0
  231. package/src/arch/tvm/utils/wait.ts +1 -0
  232. package/src/clients/SpokePoolClient/EVMSpokePoolClient.ts +44 -18
  233. package/src/clients/SpokePoolClient/TVMSpokePoolClient.ts +65 -0
  234. package/src/clients/SpokePoolClient/index.ts +12 -1
  235. package/src/clients/SpokePoolClient/types.ts +1 -0
  236. package/src/gasPriceOracle/adapters/tron.ts +50 -0
  237. package/src/gasPriceOracle/index.ts +1 -1
  238. package/src/gasPriceOracle/oracle.ts +23 -3
  239. package/src/gasPriceOracle/types.ts +11 -1
  240. package/src/relayFeeCalculator/chain-queries/factory.ts +18 -3
  241. package/src/relayFeeCalculator/chain-queries/index.ts +1 -0
  242. package/src/relayFeeCalculator/chain-queries/tvmQuery.ts +88 -0
  243. package/src/utils/Multicall.ts +1 -0
  244. package/src/utils/NetworkUtils.ts +13 -3
  245. package/src/utils/TypeGuards.ts +6 -1
@@ -0,0 +1,65 @@
1
+ import {
2
+ findDepositBlock,
3
+ getMaxFillDeadlineInRange as getMaxFillDeadline,
4
+ getTimeAt as _getTimeAt,
5
+ relayFillStatus,
6
+ } from "../../arch/tvm";
7
+ import { FillStatus, RelayData } from "../../interfaces";
8
+ import { BigNumber } from "../../utils";
9
+ import { EVMSpokePoolClient } from "./EVMSpokePoolClient";
10
+ import { TVM_SPOKE_POOL_CLIENT_TYPE } from "./types";
11
+
12
+ /**
13
+ * A TVM-specific SpokePoolClient for TRON.
14
+ *
15
+ * TRON is EVM-compatible for reads and event queries, but diverges in three areas:
16
+ * 1. No historical `eth_call` — only "latest" blockTag is accepted.
17
+ * 2. No `eth_sendRawTransaction` — TRON uses Protobuf-encoded transactions via TronWeb.
18
+ * 3. Energy/bandwidth fee model instead of gas.
19
+ *
20
+ * This client extends EVMSpokePoolClient, overriding only the methods affected by (1).
21
+ * Transaction submission (2) and fee estimation (3) are handled by the arch/tvm utilities.
22
+ */
23
+ export class TVMSpokePoolClient extends EVMSpokePoolClient {
24
+ // @ts-expect-error: Narrowing the base class literal type from "EVM" to "TVM".
25
+ override readonly type = TVM_SPOKE_POOL_CLIENT_TYPE;
26
+
27
+ public override relayFillStatus(relayData: RelayData, atHeight?: number): Promise<FillStatus> {
28
+ return relayFillStatus(this.spokePool, relayData, atHeight, this.chainId);
29
+ }
30
+
31
+ public override getMaxFillDeadlineInRange(startBlock: number, endBlock: number): Promise<number> {
32
+ return getMaxFillDeadline(this.spokePool, startBlock, endBlock);
33
+ }
34
+
35
+ public override getTimeAt(blockNumber: number): Promise<number> {
36
+ return _getTimeAt(this.spokePool, blockNumber);
37
+ }
38
+
39
+ /**
40
+ * Override to use TVM's event-based findDepositBlock
41
+ * instead of EVM's binary-search over historical numberOfDeposits().
42
+ */
43
+ protected override _findDepositBlock(
44
+ depositId: BigNumber,
45
+ lowBlock: number,
46
+ highBlock?: number
47
+ ): Promise<number | undefined> {
48
+ return findDepositBlock(this.spokePool, depositId, lowBlock, highBlock);
49
+ }
50
+
51
+ /**
52
+ * Override to avoid historical eth_call for getCurrentTime.
53
+ * TRON does not support eth_call with historical blockTags, so we
54
+ * use the block timestamp from provider.getBlock() instead of
55
+ * SpokePool.getCurrentTime({ blockTag }).
56
+ */
57
+ protected override async _getCurrentTime(blockNumber: number): Promise<number> {
58
+ const block = await this.spokePool.provider.getBlock(blockNumber);
59
+ const currentTime = block.timestamp;
60
+ if (currentTime < this.currentTime) {
61
+ throw new Error(`TVMSpokePoolClient::update: currentTime: ${currentTime} < ${this.currentTime}`);
62
+ }
63
+ return currentTime;
64
+ }
65
+ }
@@ -1,11 +1,13 @@
1
1
  import { EVMSpokePoolClient } from "./EVMSpokePoolClient";
2
2
  import { SVMSpokePoolClient } from "./SVMSpokePoolClient";
3
+ import { TVMSpokePoolClient } from "./TVMSpokePoolClient";
3
4
  import { SpokePoolClient } from "./SpokePoolClient";
4
- import { EVM_SPOKE_POOL_CLIENT_TYPE, SVM_SPOKE_POOL_CLIENT_TYPE } from "./types";
5
+ import { EVM_SPOKE_POOL_CLIENT_TYPE, SVM_SPOKE_POOL_CLIENT_TYPE, TVM_SPOKE_POOL_CLIENT_TYPE } from "./types";
5
6
 
6
7
  export { EVMSpokePoolClient } from "./EVMSpokePoolClient";
7
8
  export { SpokePoolClient, SpokePoolUpdate } from "./SpokePoolClient";
8
9
  export { SVMSpokePoolClient } from "./SVMSpokePoolClient";
10
+ export { TVMSpokePoolClient } from "./TVMSpokePoolClient";
9
11
  export { SpokePoolManager } from "./SpokePoolClientManager";
10
12
 
11
13
  /**
@@ -27,3 +29,12 @@ export function isSVMSpokePoolClient(spokePoolClient: SpokePoolClient): spokePoo
27
29
  // @TODO: Should we handle the case where spokePoolClient is undefined?
28
30
  return spokePoolClient?.type === SVM_SPOKE_POOL_CLIENT_TYPE;
29
31
  }
32
+
33
+ /**
34
+ * Checks if a SpokePoolClient is a TVMSpokePoolClient.
35
+ * @param spokePoolClient The SpokePoolClient to check.
36
+ * @returns True if the SpokePoolClient is a TVMSpokePoolClient, false otherwise.
37
+ */
38
+ export function isTVMSpokePoolClient(spokePoolClient: SpokePoolClient): spokePoolClient is TVMSpokePoolClient {
39
+ return spokePoolClient?.type === TVM_SPOKE_POOL_CLIENT_TYPE;
40
+ }
@@ -1,2 +1,3 @@
1
1
  export const EVM_SPOKE_POOL_CLIENT_TYPE = "EVM";
2
2
  export const SVM_SPOKE_POOL_CLIENT_TYPE = "SVM";
3
+ export const TVM_SPOKE_POOL_CLIENT_TYPE = "TVM";
@@ -0,0 +1,50 @@
1
+ import { TronWeb } from "tronweb";
2
+ import { toBN } from "../../utils";
3
+ import { TvmGasPriceEstimate } from "../types";
4
+ import { GasPriceEstimateOptions } from "../oracle";
5
+
6
+ /**
7
+ * @notice Returns energy and bandwidth prices for the TRON network.
8
+ * @param provider A TronWeb instance.
9
+ * @param _opts Gas price estimate options (unused, kept for interface consistency).
10
+ * @returns TvmGasPriceEstimate with energyPrice and bandwidthPrice in SUN per unit.
11
+ */
12
+ export async function gasPrices(provider: TronWeb, _opts: GasPriceEstimateOptions): Promise<TvmGasPriceEstimate> {
13
+ const [energyPrice, bandwidthPrice] = await Promise.all([getEnergyPrice(provider), getBandwidthPrice(provider)]);
14
+
15
+ return {
16
+ energyPrice: toBN(energyPrice),
17
+ bandwidthPrice: toBN(bandwidthPrice),
18
+ };
19
+ }
20
+
21
+ /**
22
+ * Query the current energy price in SUN per unit of energy.
23
+ * Parses the last entry from the comma-separated "timestamp:price" string.
24
+ */
25
+ async function getEnergyPrice(tronWeb: TronWeb): Promise<number> {
26
+ const pricesStr = await tronWeb.trx.getEnergyPrices();
27
+ const entries = pricesStr.split(",");
28
+ const lastEntry = entries[entries.length - 1];
29
+ const price = Number(lastEntry.split(":")[1]);
30
+
31
+ if (!Number.isFinite(price) || price <= 0) {
32
+ throw new Error(`getEnergyPrice: unexpected energy price: ${lastEntry}`);
33
+ }
34
+
35
+ return price;
36
+ }
37
+
38
+ /**
39
+ * Query the current bandwidth price (getTransactionFee) from chain parameters.
40
+ */
41
+ async function getBandwidthPrice(tronWeb: TronWeb): Promise<number> {
42
+ const params = await tronWeb.trx.getChainParameters();
43
+ const entry = params.find((p: { key: string; value: number }) => p.key === "getTransactionFee");
44
+
45
+ if (!entry) {
46
+ throw new Error("getBandwidthPrice: getTransactionFee not found in chain parameters");
47
+ }
48
+
49
+ return entry.value;
50
+ }
@@ -1,2 +1,2 @@
1
1
  export { getGasPriceEstimate, GasPriceEstimateOptions } from "./oracle";
2
- export { GasPriceEstimate, EvmGasPriceEstimate, SvmGasPriceEstimate } from "./types";
2
+ export { GasPriceEstimate, EvmGasPriceEstimate, SvmGasPriceEstimate, TvmGasPriceEstimate } from "./types";
@@ -2,15 +2,17 @@ import assert from "assert";
2
2
  import { Transport } from "viem";
3
3
  import { providers } from "ethers";
4
4
  import { CHAIN_IDs } from "../constants";
5
- import { BigNumber, fixedPointAdjustment, isEvmProvider, toBNWei, isDefined } from "../utils";
5
+ import { BigNumber, fixedPointAdjustment, isEvmProvider, isTvmProvider, toBNWei, isDefined } from "../utils";
6
6
  import { SVMProvider as SolanaProvider } from "../arch/svm";
7
- import { EvmGasPriceEstimate, GasPriceEstimate, SvmGasPriceEstimate } from "./types";
7
+ import { TronWeb } from "tronweb";
8
+ import { EvmGasPriceEstimate, GasPriceEstimate, SvmGasPriceEstimate, TvmGasPriceEstimate } from "./types";
8
9
  import { getPublicClient } from "./util";
9
10
  import * as arbitrum from "./adapters/arbitrum";
10
11
  import * as ethereum from "./adapters/ethereum";
11
12
  import * as polygon from "./adapters/polygon";
12
13
  import * as lineaViem from "./adapters/linea-viem";
13
14
  import * as solana from "./adapters/solana";
15
+ import * as tron from "./adapters/tron";
14
16
  import { EvmProvider } from "../arch/evm/types";
15
17
 
16
18
  export interface GasPriceEstimateOptions {
@@ -56,6 +58,12 @@ export async function getGasPriceEstimate(
56
58
  opts?: Partial<GasPriceEstimateOptions>
57
59
  ): Promise<SvmGasPriceEstimate>;
58
60
 
61
+ // Overload For TVM providers
62
+ export async function getGasPriceEstimate(
63
+ provider: TronWeb,
64
+ opts?: Partial<GasPriceEstimateOptions>
65
+ ): Promise<TvmGasPriceEstimate>;
66
+
59
67
  /**
60
68
  * Provide an estimate for the current gas price for a particular chain.
61
69
  * @param provider A valid ethers provider.
@@ -63,12 +71,24 @@ export async function getGasPriceEstimate(
63
71
  * @returns An object of type GasPriceEstimate.
64
72
  */
65
73
  export async function getGasPriceEstimate(
66
- provider: EvmProvider | SolanaProvider,
74
+ provider: EvmProvider | SolanaProvider | TronWeb,
67
75
  opts: Partial<GasPriceEstimateOptions> = {}
68
76
  ): Promise<GasPriceEstimate> {
69
77
  const baseFeeMultiplier = opts.baseFeeMultiplier ?? toBNWei("1");
70
78
  const priorityFeeMultiplier = opts.priorityFeeMultiplier ?? toBNWei("1");
71
79
 
80
+ // Exit here if we need to estimate on TRON.
81
+ if (isTvmProvider(provider)) {
82
+ const optsWithDefaults: GasPriceEstimateOptions = {
83
+ ...GAS_PRICE_ESTIMATE_DEFAULTS,
84
+ baseFeeMultiplier,
85
+ priorityFeeMultiplier,
86
+ ...opts,
87
+ chainId: opts.chainId ?? CHAIN_IDs.TRON,
88
+ };
89
+ return tron.gasPrices(provider, optsWithDefaults);
90
+ }
91
+
72
92
  // Exit here if we need to estimate on Solana.
73
93
  if (!isEvmProvider(provider)) {
74
94
  const optsWithDefaults: GasPriceEstimateOptions = {
@@ -2,7 +2,7 @@ import { type Chain, type Transport, PublicClient, FeeValuesEIP1559 } from "viem
2
2
  import { BigNumber, bnZero, isDefined } from "../utils";
3
3
 
4
4
  export type InternalGasPriceEstimate = FeeValuesEIP1559;
5
- export type GasPriceEstimate = EvmGasPriceEstimate | SvmGasPriceEstimate;
5
+ export type GasPriceEstimate = EvmGasPriceEstimate | SvmGasPriceEstimate | TvmGasPriceEstimate;
6
6
 
7
7
  export type EvmGasPriceEstimate = {
8
8
  maxFeePerGas: BigNumber;
@@ -14,6 +14,11 @@ export type SvmGasPriceEstimate = {
14
14
  microLamportsPerComputeUnit: BigNumber;
15
15
  };
16
16
 
17
+ export type TvmGasPriceEstimate = {
18
+ energyPrice: BigNumber;
19
+ bandwidthPrice: BigNumber;
20
+ };
21
+
17
22
  export interface GasPriceFeed {
18
23
  (provider: PublicClient<Transport, Chain>, chainId: number): Promise<InternalGasPriceEstimate>;
19
24
  }
@@ -35,3 +40,8 @@ export function isSVMGasPrice(gasPrice: GasPriceEstimate): gasPrice is SvmGasPri
35
40
  const { baseFee, microLamportsPerComputeUnit } = gasPrice as SvmGasPriceEstimate;
36
41
  return isDefined(baseFee) && isDefined(microLamportsPerComputeUnit);
37
42
  }
43
+
44
+ export function isTVMGasPrice(gasPrice: GasPriceEstimate): gasPrice is TvmGasPriceEstimate {
45
+ const { energyPrice, bandwidthPrice } = gasPrice as TvmGasPriceEstimate;
46
+ return isDefined(energyPrice) && isDefined(bandwidthPrice);
47
+ }
@@ -3,13 +3,15 @@ import { CHAIN_IDs, TOKEN_SYMBOLS_MAP } from "@across-protocol/constants";
3
3
  import { getDeployedAddress } from "@across-protocol/contracts";
4
4
  import { asL2Provider } from "@eth-optimism/sdk";
5
5
  import { providers } from "ethers";
6
+ import { TronWeb } from "tronweb";
6
7
  import { CUSTOM_GAS_TOKENS } from "../../constants";
7
- import { chainIsEvm, chainIsOPStack, isDefined, chainIsSvm, SvmAddress } from "../../utils";
8
+ import { chainIsEvm, chainIsOPStack, isDefined, chainIsSvm, chainIsTvm, SvmAddress } from "../../utils";
8
9
  import { QueryBase } from "./baseQuery";
9
10
  import { SVMProvider as svmProvider } from "../../arch/svm";
10
11
  import { DEFAULT_LOGGER, getDefaultRelayer, Logger } from "../relayFeeCalculator";
11
12
  import { CustomGasTokenQueries } from "./customGasToken";
12
13
  import { SvmQuery } from "./svmQuery";
14
+ import { TvmQuery } from "./tvmQuery";
13
15
 
14
16
  /**
15
17
  * Some chains have a fixed gas price that is applied to the gas estimates. We should override
@@ -22,14 +24,14 @@ const fixedGasPrice = {
22
24
  export class QueryBase__factory {
23
25
  static create(
24
26
  chainId: number,
25
- provider: providers.Provider | svmProvider,
27
+ provider: providers.Provider | svmProvider | TronWeb,
26
28
  symbolMapping = TOKEN_SYMBOLS_MAP,
27
29
  spokePoolAddress = getDeployedAddress("SpokePool", chainId),
28
30
  relayerAddress = getDefaultRelayer(chainId),
29
31
  coingeckoProApiKey?: string,
30
32
  logger: Logger = DEFAULT_LOGGER,
31
33
  coingeckoBaseCurrency = "eth"
32
- ): QueryBase | SvmQuery {
34
+ ): QueryBase | SvmQuery | TvmQuery {
33
35
  assert(isDefined(spokePoolAddress));
34
36
 
35
37
  const customGasTokenSymbol = CUSTOM_GAS_TOKENS[chainId];
@@ -62,6 +64,19 @@ export class QueryBase__factory {
62
64
  coingeckoBaseCurrency
63
65
  );
64
66
  }
67
+ if (chainIsTvm(chainId)) {
68
+ assert(relayerAddress.isEVM());
69
+ return new TvmQuery(
70
+ provider as TronWeb,
71
+ symbolMapping,
72
+ spokePoolAddress,
73
+ relayerAddress,
74
+ logger,
75
+ coingeckoProApiKey,
76
+ fixedGasPrice[chainId],
77
+ coingeckoBaseCurrency
78
+ );
79
+ }
65
80
 
66
81
  // For OPStack chains, we need to wrap the provider in an L2Provider
67
82
  provider = chainIsOPStack(chainId)
@@ -2,3 +2,4 @@ export * from "./baseQuery";
2
2
  export * from "./factory";
3
3
  export * from "./customGasToken";
4
4
  export * from "./svmQuery";
5
+ export * from "./tvmQuery";
@@ -0,0 +1,88 @@
1
+ import assert from "assert";
2
+ import { PopulatedTransaction, providers, VoidSigner } from "ethers";
3
+ import { TronWeb } from "tronweb";
4
+ import { getGasPriceEstimate, GasPriceEstimateOptions } from "../../gasPriceOracle";
5
+ import { TvmGasPriceEstimate } from "../../gasPriceOracle/types";
6
+ import { RelayData } from "../../interfaces";
7
+ import { Address, BigNumber, BigNumberish, bnZero, EvmAddress, TransactionCostEstimate } from "../../utils";
8
+ import { arch } from "../..";
9
+ import { Logger } from "../relayFeeCalculator";
10
+ import { QueryBase, SymbolMappingType } from "./baseQuery";
11
+
12
+ /**
13
+ * A TVM-specific query implementation for TRON.
14
+ *
15
+ * TRON's JSON-RPC is EVM-compatible for reads and gas estimation, so this
16
+ * class extends QueryBase and overrides only the gas price oracle dispatch
17
+ * to use TronWeb (energy/bandwidth pricing) instead of the EVM oracle.
18
+ *
19
+ * The ethers provider is derived from the TronWeb instance's fullNode URL.
20
+ */
21
+ export class TvmQuery extends QueryBase {
22
+ readonly tronWeb: TronWeb;
23
+
24
+ constructor(
25
+ tronWeb: TronWeb,
26
+ symbolMapping: SymbolMappingType,
27
+ spokePoolAddress: string,
28
+ simulatedRelayerAddress: EvmAddress,
29
+ logger: Logger,
30
+ coingeckoProApiKey?: string,
31
+ fixedGasPrice?: BigNumberish,
32
+ coingeckoBaseCurrency: string = "eth"
33
+ ) {
34
+ const provider = new providers.StaticJsonRpcProvider(tronWeb.fullNode.host);
35
+ super(
36
+ provider,
37
+ symbolMapping,
38
+ spokePoolAddress,
39
+ simulatedRelayerAddress,
40
+ logger,
41
+ coingeckoProApiKey,
42
+ fixedGasPrice,
43
+ coingeckoBaseCurrency
44
+ );
45
+ this.tronWeb = tronWeb;
46
+ }
47
+
48
+ /**
49
+ * Estimate the gas cost of a transaction using TVM energy pricing.
50
+ *
51
+ * Gas units (energy) are estimated via the ethers provider (TRON's JSON-RPC
52
+ * returns energy units for eth_estimateGas). The energy price is queried
53
+ * from TronWeb's gas price oracle.
54
+ */
55
+ override async estimateGas(
56
+ unsignedTx: PopulatedTransaction,
57
+ senderAddress: Address,
58
+ provider: providers.Provider,
59
+ options: Partial<
60
+ GasPriceEstimateOptions & {
61
+ gasPrice: BigNumberish;
62
+ gasUnits: BigNumberish;
63
+ }
64
+ > = {}
65
+ ): Promise<TransactionCostEstimate> {
66
+ const { gasPrice: _gasPrice, gasUnits } = options;
67
+
68
+ const voidSigner = new VoidSigner(senderAddress.toEvmAddress(), provider);
69
+
70
+ const [nativeGasCost, gasPriceEstimate] = await Promise.all([
71
+ gasUnits ? Promise.resolve(BigNumber.from(gasUnits)) : voidSigner.estimateGas(unsignedTx),
72
+ _gasPrice
73
+ ? Promise.resolve({ energyPrice: BigNumber.from(_gasPrice.toString()), bandwidthPrice: bnZero })
74
+ : getGasPriceEstimate(this.tronWeb),
75
+ ]);
76
+
77
+ assert(nativeGasCost.gt(bnZero), "Gas cost should not be 0");
78
+
79
+ const gasPrice = (gasPriceEstimate as TvmGasPriceEstimate).energyPrice;
80
+ const tokenGasCost = nativeGasCost.mul(gasPrice);
81
+
82
+ return { nativeGasCost, tokenGasCost, gasPrice };
83
+ }
84
+
85
+ override getAuxiliaryNativeTokenCost(deposit: RelayData): BigNumber {
86
+ return arch.tvm.getAuxiliaryNativeTokenCost(deposit);
87
+ }
88
+ }
@@ -21,6 +21,7 @@ const MULTICALL_DEPLOYER = "0x05f32B3cC3888453ff71B01135B34FF8e41263F2";
21
21
 
22
22
  const NON_DETERMINISTIC_MULTICALL_ADDRESSES = {
23
23
  [CHAIN_IDs.LENS]: "0x6b6dEa4D80e3077D076733A04c48F63c3BA49320",
24
+ [CHAIN_IDs.TRON]: "0x32a4f47a74a6810bd0bf861cabab99656a75de9e", // @todo: Base58?
24
25
  [CHAIN_IDs.ZK_SYNC]: "0xF9cda624FBC7e059355ce98a31693d299FACd963",
25
26
  [CHAIN_IDs.LENS_SEPOLIA]: "0x8A44EDE8a6843a997bC0Cc4659e4dB1Da8f91116",
26
27
  };
@@ -134,6 +134,15 @@ export function chainIsSvm(chainId: number): boolean {
134
134
  return PUBLIC_NETWORKS[chainId]?.family === ChainFamily.SVM;
135
135
  }
136
136
 
137
+ /**
138
+ * Determines whether a chain ID runs on a TVM-like execution layer (e.g. TRON).
139
+ * @param chainId Chain ID to evaluate.
140
+ * @returns True if chain corresponding to chainId has a TVM-like execution layer.
141
+ */
142
+ export function chainIsTvm(chainId: number): boolean {
143
+ return PUBLIC_NETWORKS[chainId]?.family === ChainFamily.TVM;
144
+ }
145
+
137
146
  /**
138
147
  * Determines whether a chain ID has a native gas token.
139
148
  * @param chainId Chain ID to evaluate.
@@ -166,13 +175,14 @@ export function chainIsOFTEnabled(chainId: number): boolean {
166
175
  // This is backwards vs. CCTP logic because Across support for OFTs is limited vs. OFT deployments.
167
176
  const oftEnabled = [
168
177
  CHAIN_IDs.ARBITRUM,
169
- CHAIN_IDs.POLYGON,
170
178
  CHAIN_IDs.HYPEREVM,
179
+ CHAIN_IDs.INK,
180
+ CHAIN_IDs.MEGAETH,
171
181
  CHAIN_IDs.MONAD,
172
182
  CHAIN_IDs.PLASMA,
173
- CHAIN_IDs.MEGAETH,
183
+ CHAIN_IDs.POLYGON,
184
+ CHAIN_IDs.TRON, // tbd!!!
174
185
  CHAIN_IDs.UNICHAIN,
175
- CHAIN_IDs.INK,
176
186
  ];
177
187
  return oftEnabled.includes(chainId) && PRODUCTION_NETWORKS[chainId]?.oftEid !== OFT_NO_EID;
178
188
  }
@@ -1,6 +1,7 @@
1
1
  import { SVMProvider } from "../arch/svm/types";
2
2
  import { EvmProvider } from "../arch/evm/types";
3
3
  import { providers } from "ethers";
4
+ import { TronWeb } from "tronweb";
4
5
 
5
6
  export function isPromiseFulfilled<T>(
6
7
  promiseSettledResult: PromiseSettledResult<T>
@@ -18,6 +19,10 @@ export function isDefined<T>(input: T | null | undefined): input is T {
18
19
  return input !== null && input !== undefined;
19
20
  }
20
21
 
21
- export function isEvmProvider(provider: EvmProvider | SVMProvider): provider is EvmProvider {
22
+ export function isTvmProvider(provider: EvmProvider | SVMProvider | TronWeb): provider is TronWeb {
23
+ return typeof (provider as TronWeb)?.trx?.getEnergyPrices === "function";
24
+ }
25
+
26
+ export function isEvmProvider(provider: EvmProvider | SVMProvider | TronWeb): provider is EvmProvider {
22
27
  return provider instanceof providers.Provider;
23
28
  }