@chainlink/ccip-sdk 0.0.0 → 0.90.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 (319) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/dist/aptos/exec.d.ts +18 -0
  4. package/dist/aptos/exec.d.ts.map +1 -0
  5. package/dist/aptos/exec.js +55 -0
  6. package/dist/aptos/exec.js.map +1 -0
  7. package/dist/aptos/hasher.d.ts +11 -0
  8. package/dist/aptos/hasher.d.ts.map +1 -0
  9. package/dist/aptos/hasher.js +62 -0
  10. package/dist/aptos/hasher.js.map +1 -0
  11. package/dist/aptos/index.d.ts +92 -0
  12. package/dist/aptos/index.d.ts.map +1 -0
  13. package/dist/aptos/index.js +482 -0
  14. package/dist/aptos/index.js.map +1 -0
  15. package/dist/aptos/logs.d.ts +9 -0
  16. package/dist/aptos/logs.d.ts.map +1 -0
  17. package/dist/aptos/logs.js +167 -0
  18. package/dist/aptos/logs.js.map +1 -0
  19. package/dist/aptos/send.d.ts +11 -0
  20. package/dist/aptos/send.d.ts.map +1 -0
  21. package/dist/aptos/send.js +78 -0
  22. package/dist/aptos/send.js.map +1 -0
  23. package/dist/aptos/token.d.ts +4 -0
  24. package/dist/aptos/token.d.ts.map +1 -0
  25. package/dist/aptos/token.js +134 -0
  26. package/dist/aptos/token.js.map +1 -0
  27. package/dist/aptos/types.d.ts +78 -0
  28. package/dist/aptos/types.d.ts.map +1 -0
  29. package/dist/aptos/types.js +60 -0
  30. package/dist/aptos/types.js.map +1 -0
  31. package/dist/aptos/utils.d.ts +12 -0
  32. package/dist/aptos/utils.d.ts.map +1 -0
  33. package/dist/aptos/utils.js +15 -0
  34. package/dist/aptos/utils.js.map +1 -0
  35. package/dist/chain.d.ts +344 -0
  36. package/dist/chain.d.ts.map +1 -0
  37. package/dist/chain.js +41 -0
  38. package/dist/chain.js.map +1 -0
  39. package/dist/commits.d.ts +25 -0
  40. package/dist/commits.d.ts.map +1 -0
  41. package/dist/commits.js +29 -0
  42. package/dist/commits.js.map +1 -0
  43. package/dist/evm/abi/BurnMintERC677Token.d.ts +602 -0
  44. package/dist/evm/abi/BurnMintERC677Token.d.ts.map +1 -0
  45. package/dist/evm/abi/BurnMintERC677Token.js +488 -0
  46. package/dist/evm/abi/BurnMintERC677Token.js.map +1 -0
  47. package/dist/evm/abi/CommitStore_1_2.d.ts +688 -0
  48. package/dist/evm/abi/CommitStore_1_2.d.ts.map +1 -0
  49. package/dist/evm/abi/CommitStore_1_2.js +638 -0
  50. package/dist/evm/abi/CommitStore_1_2.js.map +1 -0
  51. package/dist/evm/abi/CommitStore_1_5.d.ts +708 -0
  52. package/dist/evm/abi/CommitStore_1_5.d.ts.map +1 -0
  53. package/dist/evm/abi/CommitStore_1_5.js +675 -0
  54. package/dist/evm/abi/CommitStore_1_5.js.map +1 -0
  55. package/dist/evm/abi/FeeQuoter_1_6.d.ts +1770 -0
  56. package/dist/evm/abi/FeeQuoter_1_6.d.ts.map +1 -0
  57. package/dist/evm/abi/FeeQuoter_1_6.js +1904 -0
  58. package/dist/evm/abi/FeeQuoter_1_6.js.map +1 -0
  59. package/dist/evm/abi/LockReleaseTokenPool_1_5.d.ts +1116 -0
  60. package/dist/evm/abi/LockReleaseTokenPool_1_5.d.ts.map +1 -0
  61. package/dist/evm/abi/LockReleaseTokenPool_1_5.js +1096 -0
  62. package/dist/evm/abi/LockReleaseTokenPool_1_5.js.map +1 -0
  63. package/dist/evm/abi/LockReleaseTokenPool_1_5_1.d.ts +1306 -0
  64. package/dist/evm/abi/LockReleaseTokenPool_1_5_1.d.ts.map +1 -0
  65. package/dist/evm/abi/LockReleaseTokenPool_1_5_1.js +1278 -0
  66. package/dist/evm/abi/LockReleaseTokenPool_1_5_1.js.map +1 -0
  67. package/dist/evm/abi/LockReleaseTokenPool_1_6_1.d.ts +1290 -0
  68. package/dist/evm/abi/LockReleaseTokenPool_1_6_1.d.ts.map +1 -0
  69. package/dist/evm/abi/LockReleaseTokenPool_1_6_1.js +1288 -0
  70. package/dist/evm/abi/LockReleaseTokenPool_1_6_1.js.map +1 -0
  71. package/dist/evm/abi/OffRamp_1_2.d.ts +1217 -0
  72. package/dist/evm/abi/OffRamp_1_2.d.ts.map +1 -0
  73. package/dist/evm/abi/OffRamp_1_2.js +1204 -0
  74. package/dist/evm/abi/OffRamp_1_2.js.map +1 -0
  75. package/dist/evm/abi/OffRamp_1_5.d.ts +1271 -0
  76. package/dist/evm/abi/OffRamp_1_5.d.ts.map +1 -0
  77. package/dist/evm/abi/OffRamp_1_5.js +1273 -0
  78. package/dist/evm/abi/OffRamp_1_5.js.map +1 -0
  79. package/dist/evm/abi/OffRamp_1_6.d.ts +1472 -0
  80. package/dist/evm/abi/OffRamp_1_6.d.ts.map +1 -0
  81. package/dist/evm/abi/OffRamp_1_6.js +1529 -0
  82. package/dist/evm/abi/OffRamp_1_6.js.map +1 -0
  83. package/dist/evm/abi/OnRamp_1_2.d.ts +1391 -0
  84. package/dist/evm/abi/OnRamp_1_2.d.ts.map +1 -0
  85. package/dist/evm/abi/OnRamp_1_2.js +1343 -0
  86. package/dist/evm/abi/OnRamp_1_2.js.map +1 -0
  87. package/dist/evm/abi/OnRamp_1_5.d.ts +1443 -0
  88. package/dist/evm/abi/OnRamp_1_5.d.ts.map +1 -0
  89. package/dist/evm/abi/OnRamp_1_5.js +1427 -0
  90. package/dist/evm/abi/OnRamp_1_5.js.map +1 -0
  91. package/dist/evm/abi/OnRamp_1_6.d.ts +796 -0
  92. package/dist/evm/abi/OnRamp_1_6.d.ts.map +1 -0
  93. package/dist/evm/abi/OnRamp_1_6.js +880 -0
  94. package/dist/evm/abi/OnRamp_1_6.js.map +1 -0
  95. package/dist/evm/abi/Router.d.ts +541 -0
  96. package/dist/evm/abi/Router.d.ts.map +1 -0
  97. package/dist/evm/abi/Router.js +508 -0
  98. package/dist/evm/abi/Router.js.map +1 -0
  99. package/dist/evm/abi/TokenAdminRegistry_1_5.d.ts +373 -0
  100. package/dist/evm/abi/TokenAdminRegistry_1_5.d.ts.map +1 -0
  101. package/dist/evm/abi/TokenAdminRegistry_1_5.js +333 -0
  102. package/dist/evm/abi/TokenAdminRegistry_1_5.js.map +1 -0
  103. package/dist/evm/const.d.ts +27 -0
  104. package/dist/evm/const.d.ts.map +1 -0
  105. package/dist/evm/const.js +63 -0
  106. package/dist/evm/const.js.map +1 -0
  107. package/dist/evm/errors.d.ts +36 -0
  108. package/dist/evm/errors.d.ts.map +1 -0
  109. package/dist/evm/errors.js +192 -0
  110. package/dist/evm/errors.js.map +1 -0
  111. package/dist/evm/hasher.d.ts +5 -0
  112. package/dist/evm/hasher.d.ts.map +1 -0
  113. package/dist/evm/hasher.js +116 -0
  114. package/dist/evm/hasher.js.map +1 -0
  115. package/dist/evm/index.d.ts +121 -0
  116. package/dist/evm/index.d.ts.map +1 -0
  117. package/dist/evm/index.js +904 -0
  118. package/dist/evm/index.js.map +1 -0
  119. package/dist/evm/messages.d.ts +35 -0
  120. package/dist/evm/messages.d.ts.map +1 -0
  121. package/dist/evm/messages.js +11 -0
  122. package/dist/evm/messages.js.map +1 -0
  123. package/dist/evm/offchain.d.ts +16 -0
  124. package/dist/evm/offchain.d.ts.map +1 -0
  125. package/dist/evm/offchain.js +142 -0
  126. package/dist/evm/offchain.js.map +1 -0
  127. package/dist/execution.d.ts +80 -0
  128. package/dist/execution.d.ts.map +1 -0
  129. package/dist/execution.js +91 -0
  130. package/dist/execution.js.map +1 -0
  131. package/dist/extra-args.d.ts +45 -0
  132. package/dist/extra-args.d.ts.map +1 -0
  133. package/dist/extra-args.js +44 -0
  134. package/dist/extra-args.js.map +1 -0
  135. package/dist/gas.d.ts +27 -0
  136. package/dist/gas.d.ts.map +1 -0
  137. package/dist/gas.js +80 -0
  138. package/dist/gas.js.map +1 -0
  139. package/dist/hasher/common.d.ts +12 -0
  140. package/dist/hasher/common.d.ts.map +1 -0
  141. package/dist/hasher/common.js +19 -0
  142. package/dist/hasher/common.js.map +1 -0
  143. package/dist/hasher/hasher.d.ts +4 -0
  144. package/dist/hasher/hasher.d.ts.map +1 -0
  145. package/dist/hasher/hasher.js +11 -0
  146. package/dist/hasher/hasher.js.map +1 -0
  147. package/dist/hasher/index.d.ts +4 -0
  148. package/dist/hasher/index.d.ts.map +1 -0
  149. package/dist/hasher/index.js +4 -0
  150. package/dist/hasher/index.js.map +1 -0
  151. package/dist/hasher/merklemulti.d.ts +58 -0
  152. package/dist/hasher/merklemulti.d.ts.map +1 -0
  153. package/dist/hasher/merklemulti.js +257 -0
  154. package/dist/hasher/merklemulti.js.map +1 -0
  155. package/dist/index.d.ts +13 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +13 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/offchain.d.ts +20 -0
  160. package/dist/offchain.d.ts.map +1 -0
  161. package/dist/offchain.js +59 -0
  162. package/dist/offchain.js.map +1 -0
  163. package/dist/requests.d.ts +48 -0
  164. package/dist/requests.d.ts.map +1 -0
  165. package/dist/requests.js +286 -0
  166. package/dist/requests.js.map +1 -0
  167. package/dist/selectors.d.ts +9 -0
  168. package/dist/selectors.d.ts.map +1 -0
  169. package/dist/selectors.js +1330 -0
  170. package/dist/selectors.js.map +1 -0
  171. package/dist/solana/cleanup.d.ts +15 -0
  172. package/dist/solana/cleanup.d.ts.map +1 -0
  173. package/dist/solana/cleanup.js +159 -0
  174. package/dist/solana/cleanup.js.map +1 -0
  175. package/dist/solana/exec.d.ts +15 -0
  176. package/dist/solana/exec.d.ts.map +1 -0
  177. package/dist/solana/exec.js +417 -0
  178. package/dist/solana/exec.js.map +1 -0
  179. package/dist/solana/hasher.d.ts +4 -0
  180. package/dist/solana/hasher.d.ts.map +1 -0
  181. package/dist/solana/hasher.js +81 -0
  182. package/dist/solana/hasher.js.map +1 -0
  183. package/dist/solana/idl/1.6.0/BASE_TOKEN_POOL.d.ts +866 -0
  184. package/dist/solana/idl/1.6.0/BASE_TOKEN_POOL.d.ts.map +1 -0
  185. package/dist/solana/idl/1.6.0/BASE_TOKEN_POOL.js +866 -0
  186. package/dist/solana/idl/1.6.0/BASE_TOKEN_POOL.js.map +1 -0
  187. package/dist/solana/idl/1.6.0/BURN_MINT_TOKEN_POOL.d.ts +949 -0
  188. package/dist/solana/idl/1.6.0/BURN_MINT_TOKEN_POOL.d.ts.map +1 -0
  189. package/dist/solana/idl/1.6.0/BURN_MINT_TOKEN_POOL.js +949 -0
  190. package/dist/solana/idl/1.6.0/BURN_MINT_TOKEN_POOL.js.map +1 -0
  191. package/dist/solana/idl/1.6.0/CCIP_CCTP_TOKEN_POOL.d.ts +1374 -0
  192. package/dist/solana/idl/1.6.0/CCIP_CCTP_TOKEN_POOL.d.ts.map +1 -0
  193. package/dist/solana/idl/1.6.0/CCIP_CCTP_TOKEN_POOL.js +1374 -0
  194. package/dist/solana/idl/1.6.0/CCIP_CCTP_TOKEN_POOL.js.map +1 -0
  195. package/dist/solana/idl/1.6.0/CCIP_COMMON.d.ts +104 -0
  196. package/dist/solana/idl/1.6.0/CCIP_COMMON.d.ts.map +1 -0
  197. package/dist/solana/idl/1.6.0/CCIP_COMMON.js +104 -0
  198. package/dist/solana/idl/1.6.0/CCIP_COMMON.js.map +1 -0
  199. package/dist/solana/idl/1.6.0/CCIP_OFFRAMP.d.ts +2746 -0
  200. package/dist/solana/idl/1.6.0/CCIP_OFFRAMP.d.ts.map +1 -0
  201. package/dist/solana/idl/1.6.0/CCIP_OFFRAMP.js +2746 -0
  202. package/dist/solana/idl/1.6.0/CCIP_OFFRAMP.js.map +1 -0
  203. package/dist/solana/idl/1.6.0/CCIP_ROUTER.d.ts +2332 -0
  204. package/dist/solana/idl/1.6.0/CCIP_ROUTER.d.ts.map +1 -0
  205. package/dist/solana/idl/1.6.0/CCIP_ROUTER.js +2332 -0
  206. package/dist/solana/idl/1.6.0/CCIP_ROUTER.js.map +1 -0
  207. package/dist/solana/index.d.ts +205 -0
  208. package/dist/solana/index.d.ts.map +1 -0
  209. package/dist/solana/index.js +1085 -0
  210. package/dist/solana/index.js.map +1 -0
  211. package/dist/solana/offchain.d.ts +31 -0
  212. package/dist/solana/offchain.d.ts.map +1 -0
  213. package/dist/solana/offchain.js +152 -0
  214. package/dist/solana/offchain.js.map +1 -0
  215. package/dist/solana/patchBorsh.d.ts +2 -0
  216. package/dist/solana/patchBorsh.d.ts.map +1 -0
  217. package/dist/solana/patchBorsh.js +60 -0
  218. package/dist/solana/patchBorsh.js.map +1 -0
  219. package/dist/solana/send.d.ts +14 -0
  220. package/dist/solana/send.d.ts.map +1 -0
  221. package/dist/solana/send.js +272 -0
  222. package/dist/solana/send.js.map +1 -0
  223. package/dist/solana/types.d.ts +4 -0
  224. package/dist/solana/types.d.ts.map +1 -0
  225. package/dist/solana/types.js +2 -0
  226. package/dist/solana/types.js.map +1 -0
  227. package/dist/solana/utils.d.ts +58 -0
  228. package/dist/solana/utils.d.ts.map +1 -0
  229. package/dist/solana/utils.js +211 -0
  230. package/dist/solana/utils.js.map +1 -0
  231. package/dist/sui/hasher.d.ts +12 -0
  232. package/dist/sui/hasher.d.ts.map +1 -0
  233. package/dist/sui/hasher.js +63 -0
  234. package/dist/sui/hasher.js.map +1 -0
  235. package/dist/sui/index.d.ts +72 -0
  236. package/dist/sui/index.d.ts.map +1 -0
  237. package/dist/sui/index.js +128 -0
  238. package/dist/sui/index.js.map +1 -0
  239. package/dist/sui/types.d.ts +17 -0
  240. package/dist/sui/types.d.ts.map +1 -0
  241. package/dist/sui/types.js +17 -0
  242. package/dist/sui/types.js.map +1 -0
  243. package/dist/supported-chains.d.ts +5 -0
  244. package/dist/supported-chains.d.ts.map +1 -0
  245. package/dist/supported-chains.js +3 -0
  246. package/dist/supported-chains.js.map +1 -0
  247. package/dist/types.d.ts +118 -0
  248. package/dist/types.d.ts.map +1 -0
  249. package/dist/types.js +11 -0
  250. package/dist/types.js.map +1 -0
  251. package/dist/utils.d.ts +117 -0
  252. package/dist/utils.d.ts.map +1 -0
  253. package/dist/utils.js +336 -0
  254. package/dist/utils.js.map +1 -0
  255. package/package.json +66 -8
  256. package/src/aptos/exec.ts +69 -0
  257. package/src/aptos/hasher.ts +92 -0
  258. package/src/aptos/index.ts +660 -0
  259. package/src/aptos/logs.ts +210 -0
  260. package/src/aptos/send.ts +120 -0
  261. package/src/aptos/token.ts +150 -0
  262. package/src/aptos/types.ts +85 -0
  263. package/src/aptos/utils.ts +24 -0
  264. package/src/chain.ts +398 -0
  265. package/src/commits.ts +44 -0
  266. package/src/evm/abi/BurnMintERC677Token.ts +487 -0
  267. package/src/evm/abi/CommitStore_1_2.ts +637 -0
  268. package/src/evm/abi/CommitStore_1_5.ts +674 -0
  269. package/src/evm/abi/FeeQuoter_1_6.ts +1903 -0
  270. package/src/evm/abi/LockReleaseTokenPool_1_5.ts +1095 -0
  271. package/src/evm/abi/LockReleaseTokenPool_1_5_1.ts +1277 -0
  272. package/src/evm/abi/LockReleaseTokenPool_1_6_1.ts +1287 -0
  273. package/src/evm/abi/OffRamp_1_2.ts +1203 -0
  274. package/src/evm/abi/OffRamp_1_5.ts +1272 -0
  275. package/src/evm/abi/OffRamp_1_6.ts +1528 -0
  276. package/src/evm/abi/OnRamp_1_2.ts +1342 -0
  277. package/src/evm/abi/OnRamp_1_5.ts +1426 -0
  278. package/src/evm/abi/OnRamp_1_6.ts +879 -0
  279. package/src/evm/abi/Router.ts +507 -0
  280. package/src/evm/abi/TokenAdminRegistry_1_5.ts +332 -0
  281. package/src/evm/const.ts +69 -0
  282. package/src/evm/errors.ts +212 -0
  283. package/src/evm/hasher.ts +166 -0
  284. package/src/evm/index.ts +1262 -0
  285. package/src/evm/messages.ts +73 -0
  286. package/src/evm/offchain.ts +189 -0
  287. package/src/execution.ts +131 -0
  288. package/src/extra-args.ts +71 -0
  289. package/src/gas.ts +135 -0
  290. package/src/hasher/common.ts +23 -0
  291. package/src/hasher/hasher.ts +12 -0
  292. package/src/hasher/index.ts +3 -0
  293. package/src/hasher/merklemulti.ts +309 -0
  294. package/src/index.ts +51 -0
  295. package/src/offchain.ts +86 -0
  296. package/src/requests.ts +339 -0
  297. package/src/selectors.ts +1340 -0
  298. package/src/solana/cleanup.ts +216 -0
  299. package/src/solana/exec.ts +645 -0
  300. package/src/solana/hasher.ts +104 -0
  301. package/src/solana/idl/1.6.0/BASE_TOKEN_POOL.ts +1734 -0
  302. package/src/solana/idl/1.6.0/BURN_MINT_TOKEN_POOL.ts +1900 -0
  303. package/src/solana/idl/1.6.0/CCIP_CCTP_TOKEN_POOL.ts +2750 -0
  304. package/src/solana/idl/1.6.0/CCIP_COMMON.ts +210 -0
  305. package/src/solana/idl/1.6.0/CCIP_OFFRAMP.ts +5494 -0
  306. package/src/solana/idl/1.6.0/CCIP_ROUTER.ts +4671 -0
  307. package/src/solana/index.ts +1454 -0
  308. package/src/solana/offchain.ts +209 -0
  309. package/src/solana/patchBorsh.ts +67 -0
  310. package/src/solana/send.ts +436 -0
  311. package/src/solana/types.ts +6 -0
  312. package/src/solana/utils.ts +272 -0
  313. package/src/sui/hasher.ts +90 -0
  314. package/src/sui/index.ts +198 -0
  315. package/src/sui/types.ts +22 -0
  316. package/src/supported-chains.ts +4 -0
  317. package/src/types.ts +153 -0
  318. package/src/utils.ts +405 -0
  319. package/tsconfig.json +18 -0
@@ -0,0 +1,660 @@
1
+ import util from 'util'
2
+
3
+ import {
4
+ Account,
5
+ Aptos,
6
+ AptosConfig,
7
+ Ed25519PrivateKey,
8
+ Network,
9
+ TransactionResponseType,
10
+ } from '@aptos-labs/ts-sdk'
11
+ import {
12
+ type BytesLike,
13
+ concat,
14
+ dataLength,
15
+ dataSlice,
16
+ decodeBase64,
17
+ getBytes,
18
+ hexlify,
19
+ isBytesLike,
20
+ isHexString,
21
+ zeroPadValue,
22
+ } from 'ethers'
23
+ import moize from 'moize'
24
+
25
+ import { ccipSend, getFee } from './send.ts'
26
+ import {
27
+ type ChainTransaction,
28
+ type LogFilter,
29
+ type TokenInfo,
30
+ type TokenPoolRemote,
31
+ Chain,
32
+ ChainFamily,
33
+ } from '../chain.ts'
34
+ import {
35
+ type EVMExtraArgsV2,
36
+ type ExtraArgs,
37
+ type SVMExtraArgsV1,
38
+ EVMExtraArgsV2Tag,
39
+ SVMExtraArgsV1Tag,
40
+ } from '../extra-args.ts'
41
+ import type { LeafHasher } from '../hasher/common.ts'
42
+ import { supportedChains } from '../supported-chains.ts'
43
+ import type {
44
+ AnyMessage,
45
+ CCIPMessage,
46
+ CCIPRequest,
47
+ CommitReport,
48
+ ExecutionReceipt,
49
+ ExecutionReport,
50
+ Lane,
51
+ Log_,
52
+ NetworkInfo,
53
+ OffchainTokenData,
54
+ } from '../types.ts'
55
+ import {
56
+ convertKeysToCamelCase,
57
+ decodeAddress,
58
+ decodeOnRampAddress,
59
+ getAddressBytes,
60
+ getDataBytes,
61
+ networkInfo,
62
+ parseTypeAndVersion,
63
+ } from '../utils.ts'
64
+ import { executeReport } from './exec.ts'
65
+ import { getAptosLeafHasher } from './hasher.ts'
66
+ import { getUserTxByVersion, getVersionTimestamp, streamAptosLogs } from './logs.ts'
67
+ import { getTokenInfo } from './token.ts'
68
+ import { type AptosAsyncAccount, EVMExtraArgsV2Codec, SVMExtraArgsV1Codec } from './types.ts'
69
+ import type { CCIPMessage_V1_6_EVM } from '../evm/messages.ts'
70
+ import { decodeMessage } from '../requests.ts'
71
+
72
+ export class AptosChain extends Chain<typeof ChainFamily.Aptos> {
73
+ static readonly family = ChainFamily.Aptos
74
+ static readonly decimals = 8
75
+
76
+ readonly network: NetworkInfo<typeof ChainFamily.Aptos>
77
+ readonly provider: Aptos
78
+
79
+ getTokenInfo: (token: string) => Promise<TokenInfo>
80
+ _getAccountModulesNames: (address: string) => Promise<string[]>
81
+
82
+ constructor(provider: Aptos, network: NetworkInfo) {
83
+ if (network.family !== ChainFamily.Aptos) {
84
+ throw new Error(`Invalid network family: ${network.family}, expected ${ChainFamily.Aptos}`)
85
+ }
86
+ super()
87
+
88
+ this.provider = provider
89
+ this.network = network
90
+ this.typeAndVersion = moize.default(this.typeAndVersion.bind(this), {
91
+ maxSize: 100,
92
+ maxArgs: 1,
93
+ maxAge: 60e3, // 1min
94
+ })
95
+ this.getTransaction = moize.default(this.getTransaction.bind(this), {
96
+ maxSize: 100,
97
+ maxArgs: 1,
98
+ })
99
+ this.getTokenForTokenPool = moize.default(this.getTokenForTokenPool.bind(this), {
100
+ maxSize: 100,
101
+ maxArgs: 1,
102
+ })
103
+ this.getTokenInfo = moize.default((token) => getTokenInfo(this.provider, token), {
104
+ maxSize: 100,
105
+ maxArgs: 1,
106
+ })
107
+
108
+ this._getAccountModulesNames = moize.default(
109
+ (address) =>
110
+ this.provider
111
+ .getAccountModules({ accountAddress: address })
112
+ .then((modules) => modules.map(({ abi }) => abi!.name)),
113
+ { maxSize: 100, maxArgs: 1 },
114
+ )
115
+ this.getWallet = moize.default(this.getWallet.bind(this), { maxSize: 1, maxArgs: 0 })
116
+ this.provider.getTransactionByVersion = moize.default(
117
+ this.provider.getTransactionByVersion.bind(this.provider),
118
+ {
119
+ maxSize: 100,
120
+ isPromise: true,
121
+ transformArgs: ([arg]) => [(arg as { ledgerVersion: number }).ledgerVersion],
122
+ },
123
+ )
124
+ }
125
+
126
+ static async fromProvider(provider: Aptos): Promise<AptosChain> {
127
+ return new AptosChain(provider, networkInfo(`aptos:${await provider.getChainId()}`))
128
+ }
129
+
130
+ static async fromAptosConfig(config: AptosConfig): Promise<AptosChain> {
131
+ const provider = new Aptos(config)
132
+ return this.fromProvider(provider)
133
+ }
134
+
135
+ static async fromUrl(url: string | Network, network?: Network): Promise<AptosChain> {
136
+ if (network) {
137
+ // pass
138
+ } else if (Object.values(Network).includes(url as Network)) network = url as Network
139
+ else if (url.includes('mainnet')) network = Network.MAINNET
140
+ else if (url.includes('testnet')) network = Network.TESTNET
141
+ else if (url.includes('local')) network = Network.LOCAL
142
+ else throw new Error(`Unknown Aptos network: ${url}`)
143
+ const config: AptosConfig = new AptosConfig({
144
+ network,
145
+ fullnode: url.includes('://') ? url : undefined,
146
+ // indexer: url.includes('://') ? `${url}/v1/graphql` : undefined,
147
+ })
148
+ return this.fromAptosConfig(config)
149
+ }
150
+
151
+ async destroy(): Promise<void> {
152
+ // Nothing to cleanup for Aptos implementation
153
+ }
154
+
155
+ async getBlockTimestamp(version: number | 'finalized'): Promise<number> {
156
+ return getVersionTimestamp(this.provider, version)
157
+ }
158
+
159
+ async getTransaction(hashOrVersion: string | number): Promise<ChainTransaction> {
160
+ let tx
161
+ if (isHexString(hashOrVersion, 32)) {
162
+ tx = await this.provider.getTransactionByHash({
163
+ transactionHash: hashOrVersion,
164
+ })
165
+ } else if (!isNaN(+hashOrVersion)) {
166
+ tx = await getUserTxByVersion(this.provider, +hashOrVersion)
167
+ } else {
168
+ throw new Error(`Invalid transaction hash or version: ${hashOrVersion}`)
169
+ }
170
+ if (tx.type !== TransactionResponseType.User) throw new Error('Invalid transaction type')
171
+
172
+ return {
173
+ chain: this,
174
+ hash: tx.hash,
175
+ blockNumber: +tx.version,
176
+ from: tx.sender,
177
+ timestamp: +tx.timestamp / 1e6,
178
+ logs: tx.events.map((event, index) => ({
179
+ address: event.type.slice(0, event.type.lastIndexOf('::')),
180
+ transactionHash: tx.hash,
181
+ index,
182
+ blockNumber: +tx.version, // we use version as Aptos' blockNumber, as blockHeight isn't very useful
183
+ data: event.data as Record<string, unknown>,
184
+ topics: [event.type.slice(event.type.lastIndexOf('::') + 2)],
185
+ })),
186
+ }
187
+ }
188
+
189
+ async *getLogs(opts: LogFilter & { versionAsHash?: boolean }): AsyncIterableIterator<Log_> {
190
+ yield* streamAptosLogs(this.provider, opts)
191
+ }
192
+
193
+ async typeAndVersion(
194
+ address: string,
195
+ ): Promise<
196
+ | [type_: string, version: string, typeAndVersion: string]
197
+ | [type_: string, version: string, typeAndVersion: string, suffix: string]
198
+ > {
199
+ const [typeAndVersion] = await this.provider.view<[string]>({
200
+ payload: {
201
+ function: `${address}::type_and_version` as `${string}::${string}::type_and_version`,
202
+ },
203
+ })
204
+
205
+ return parseTypeAndVersion(typeAndVersion)
206
+ }
207
+
208
+ getRouterForOnRamp(onRamp: string, _destChainSelector: bigint): Promise<string> {
209
+ // router is same package as onramp, changing only module
210
+ return Promise.resolve(onRamp.split('::')[0] + '::router')
211
+ }
212
+
213
+ getRouterForOffRamp(offRamp: string, _sourceChainSelector: bigint): Promise<string> {
214
+ return Promise.resolve(offRamp.split('::')[0] + '::router')
215
+ }
216
+
217
+ getNativeTokenForRouter(_router: string): Promise<string> {
218
+ return Promise.resolve('0xa')
219
+ }
220
+
221
+ getOffRampsForRouter(router: string, _sourceChainSelector: bigint): Promise<string[]> {
222
+ return Promise.resolve([router.split('::')[0] + '::offramp'])
223
+ }
224
+
225
+ getOnRampForRouter(router: string, _destChainSelector: bigint): Promise<string> {
226
+ return Promise.resolve(router.split('::')[0] + '::onramp')
227
+ }
228
+
229
+ async getOnRampForOffRamp(offRamp: string, sourceChainSelector: bigint): Promise<string> {
230
+ const [sourceChainConfig] = await this.provider.view<[{ on_ramp: string }]>({
231
+ payload: {
232
+ function:
233
+ `${offRamp.includes('::') ? offRamp : offRamp + '::offramp'}::get_source_chain_config` as `${string}::${string}::get_source_chain_config`,
234
+ functionArguments: [sourceChainSelector],
235
+ },
236
+ })
237
+ return decodeAddress(sourceChainConfig.on_ramp, networkInfo(sourceChainSelector).family)
238
+ }
239
+
240
+ getCommitStoreForOffRamp(offRamp: string): Promise<string> {
241
+ return Promise.resolve(offRamp.split('::')[0] + '::offramp')
242
+ }
243
+
244
+ async getTokenForTokenPool(tokenPool: string): Promise<string> {
245
+ const modulesNames = (await this._getAccountModulesNames(tokenPool))
246
+ .reverse()
247
+ .filter((name) => name.endsWith('token_pool'))
248
+ let firstErr
249
+ for (const name of modulesNames) {
250
+ try {
251
+ const res = await this.provider.view<[string]>({
252
+ payload: {
253
+ function: `${tokenPool}::${name}::get_token`,
254
+ },
255
+ })
256
+ return res[0]
257
+ } catch (err) {
258
+ firstErr ??= err as Error
259
+ }
260
+ }
261
+ throw firstErr ?? new Error(`Could not view 'get_token' in ${tokenPool}`)
262
+ }
263
+
264
+ async getTokenAdminRegistryFor(address: string): Promise<string> {
265
+ const registry = address.split('::')[0] + '::token_admin_registry'
266
+ const [type] = await this.typeAndVersion(registry)
267
+ if (type !== 'TokenAdminRegistry') {
268
+ throw new Error(`Expected ${registry} to have TokenAdminRegistry type, got=${type}`)
269
+ }
270
+ return registry
271
+ }
272
+
273
+ static getWallet(_opts: { wallet?: unknown } = {}): Promise<AptosAsyncAccount> {
274
+ return Promise.reject(new Error('TODO according to your environment'))
275
+ }
276
+
277
+ // cached
278
+ async getWallet(opts: { wallet?: unknown } = {}): Promise<AptosAsyncAccount> {
279
+ if (isBytesLike(opts.wallet)) {
280
+ return Account.fromPrivateKey({
281
+ privateKey: new Ed25519PrivateKey(opts.wallet, false),
282
+ })
283
+ }
284
+ return (this.constructor as typeof AptosChain).getWallet(opts)
285
+ }
286
+
287
+ async getWalletAddress(opts?: { wallet?: unknown }): Promise<string> {
288
+ return (await this.getWallet(opts)).accountAddress.toString()
289
+ }
290
+
291
+ // Static methods for decoding
292
+ static decodeMessage(log: {
293
+ data: BytesLike | Record<string, unknown>
294
+ }): CCIPMessage | undefined {
295
+ const { data } = log
296
+ if (
297
+ (typeof data !== 'string' || !data.startsWith('{')) &&
298
+ (typeof data !== 'object' || data == null || isBytesLike(data))
299
+ )
300
+ throw new Error(`invalid log data: ${util.inspect(log)}`)
301
+ // offload massaging to generic decodeJsonMessage
302
+ try {
303
+ return decodeMessage(data)
304
+ } catch (_) {
305
+ // return undefined
306
+ }
307
+ }
308
+
309
+ // decodes an Aptos-generated extraArgs, destinated *to* other chains (EVM, Solana, etc)
310
+ static decodeExtraArgs(
311
+ extraArgs: BytesLike,
312
+ ):
313
+ | (EVMExtraArgsV2 & { _tag: 'EVMExtraArgsV2' })
314
+ | (SVMExtraArgsV1 & { _tag: 'SVMExtraArgsV1' })
315
+ | undefined {
316
+ const data = getDataBytes(extraArgs),
317
+ tag = dataSlice(data, 0, 4)
318
+ switch (tag) {
319
+ case EVMExtraArgsV2Tag: {
320
+ const parsed = EVMExtraArgsV2Codec.parse(getBytes(dataSlice(data, 4)))
321
+ // Aptos serialization of EVMExtraArgsV2: 37 bytes total: 4 tag + 32 LE gasLimit + 1 allowOOOE
322
+ return {
323
+ _tag: 'EVMExtraArgsV2',
324
+ ...parsed,
325
+ gasLimit: BigInt(parsed.gasLimit),
326
+ }
327
+ }
328
+ case SVMExtraArgsV1Tag: {
329
+ const parsed = SVMExtraArgsV1Codec.parse(getBytes(dataSlice(data, 4)))
330
+ // Aptos serialization of SVMExtraArgsV1: 13 bytes total: 4 tag + 8 LE computeUnits
331
+ return {
332
+ _tag: 'SVMExtraArgsV1',
333
+ ...parsed,
334
+ computeUnits: BigInt(parsed.computeUnits),
335
+ accountIsWritableBitmap: BigInt(parsed.accountIsWritableBitmap),
336
+ tokenReceiver: decodeAddress(new Uint8Array(parsed.tokenReceiver), ChainFamily.Solana),
337
+ accounts: parsed.accounts.map((account) =>
338
+ decodeAddress(new Uint8Array(account), ChainFamily.Solana),
339
+ ),
340
+ }
341
+ }
342
+ }
343
+ }
344
+
345
+ // encodes extraArgs destinated *to other* chains (EVM, Solana, etc), using Aptos-specific encoding (i.e. *from* Aptos)
346
+ static encodeExtraArgs(extraArgs: ExtraArgs): string {
347
+ if ('gasLimit' in extraArgs && 'allowOutOfOrderExecution' in extraArgs)
348
+ return concat([EVMExtraArgsV2Tag, EVMExtraArgsV2Codec.serialize(extraArgs).toBytes()])
349
+ else if ('computeUnits' in extraArgs)
350
+ return concat([
351
+ SVMExtraArgsV1Tag,
352
+ SVMExtraArgsV1Codec.serialize({
353
+ ...extraArgs,
354
+ computeUnits: Number(extraArgs.computeUnits),
355
+ tokenReceiver: getAddressBytes(extraArgs.tokenReceiver),
356
+ accounts: extraArgs.accounts.map(getAddressBytes),
357
+ }).toBytes(),
358
+ ])
359
+ throw new Error('Aptos can only encode EVMExtraArgsV2 & SVMExtraArgsV1')
360
+ }
361
+
362
+ static decodeCommits({ data }: Pick<Log_, 'data'>, lane?: Lane): CommitReport[] | undefined {
363
+ if (!data || typeof data != 'object') throw new Error('invalid aptos log')
364
+ const data_ = data as { blessed_merkle_roots: unknown[]; unblessed_merkle_roots: unknown[] }
365
+ if (!data_.blessed_merkle_roots) return
366
+ let commits = (
367
+ convertKeysToCamelCase(
368
+ data_.blessed_merkle_roots.concat(data_.unblessed_merkle_roots),
369
+ (v) => (typeof v === 'string' && v.match(/^\d+$/) ? BigInt(v) : v),
370
+ ) as CommitReport[]
371
+ ).map((c) => ({
372
+ ...c,
373
+ onRampAddress: decodeOnRampAddress(
374
+ c.onRampAddress,
375
+ networkInfo(c.sourceChainSelector).family,
376
+ ),
377
+ }))
378
+ if (lane) {
379
+ commits = commits.filter(
380
+ (c) =>
381
+ c.sourceChainSelector === lane.sourceChainSelector && c.onRampAddress === lane.onRamp,
382
+ )
383
+ }
384
+ return commits
385
+ }
386
+
387
+ static decodeReceipt({ data }: Pick<Log_, 'data'>): ExecutionReceipt | undefined {
388
+ if (!data || typeof data != 'object') throw new Error('invalid aptos log')
389
+ const data_ = data as { message_id: string; state: number }
390
+ if (!data_.message_id || !data_.state) return
391
+ return convertKeysToCamelCase(data_, (v) =>
392
+ typeof v === 'string' && v.match(/^\d+$/) ? BigInt(v) : v,
393
+ ) as ExecutionReceipt
394
+ }
395
+
396
+ static getAddress(bytes: BytesLike): string {
397
+ let suffix = ''
398
+ if (typeof bytes === 'string' && !bytes.startsWith('0x')) {
399
+ bytes = decodeBase64(bytes)
400
+ } else if (typeof bytes === 'string') {
401
+ const idx = bytes.indexOf('::')
402
+ if (idx > 0) {
403
+ suffix = bytes.slice(idx)
404
+ bytes = bytes.slice(0, idx)
405
+ }
406
+ }
407
+ if (dataLength(bytes) > 32) throw new Error(`Invalid aptos address: "${hexlify(bytes)}"`)
408
+ return zeroPadValue(bytes, 32) + suffix
409
+ }
410
+
411
+ static getDestLeafHasher(lane: Lane): LeafHasher {
412
+ return getAptosLeafHasher(lane)
413
+ }
414
+
415
+ async getFee(router: string, destChainSelector: bigint, message: AnyMessage): Promise<bigint> {
416
+ return getFee(this.provider, router, destChainSelector, message)
417
+ }
418
+
419
+ async sendMessage(
420
+ router: string,
421
+ destChainSelector: bigint,
422
+ message: AnyMessage & { fee: bigint },
423
+ opts?: { wallet?: unknown; approveMax?: boolean },
424
+ ): Promise<ChainTransaction> {
425
+ const account = await this.getWallet(opts)
426
+
427
+ const hash = await ccipSend(this.provider, account, router, destChainSelector, message)
428
+
429
+ // Return the ChainTransaction by fetching it
430
+ return this.getTransaction(hash)
431
+ }
432
+
433
+ fetchOffchainTokenData(request: CCIPRequest): Promise<OffchainTokenData[]> {
434
+ // default offchain token data
435
+ return Promise.resolve(request.message.tokenAmounts.map(() => undefined))
436
+ }
437
+
438
+ async executeReport(
439
+ offRamp: string,
440
+ execReport: ExecutionReport,
441
+ opts?: { wallet?: unknown; gasLimit?: number },
442
+ ): Promise<ChainTransaction> {
443
+ const account = await this.getWallet(opts)
444
+
445
+ if (!('allowOutOfOrderExecution' in execReport.message && 'gasLimit' in execReport.message)) {
446
+ throw new Error('Aptos expects EVMExtraArgsV2 reports')
447
+ }
448
+
449
+ const hash = await executeReport(
450
+ this.provider,
451
+ account,
452
+ offRamp,
453
+ execReport as ExecutionReport<CCIPMessage_V1_6_EVM>,
454
+ opts,
455
+ )
456
+
457
+ return this.getTransaction(hash)
458
+ }
459
+
460
+ static parse(data: unknown) {
461
+ if (isBytesLike(data)) {
462
+ const parsedExtraArgs = this.decodeExtraArgs(data)
463
+ if (parsedExtraArgs) return parsedExtraArgs
464
+ }
465
+ }
466
+
467
+ async getSupportedTokens(address: string, opts?: { page?: number }): Promise<string[]> {
468
+ const res = []
469
+ let page,
470
+ nextKey = '0x0',
471
+ hasMore
472
+ do {
473
+ ;[page, nextKey, hasMore] = await this.provider.view<[string[], string, boolean]>({
474
+ payload: {
475
+ function:
476
+ `${address.split('::')[0] + '::token_admin_registry'}::get_all_configured_tokens` as `${string}::${string}::get_all_configured_tokens`,
477
+ functionArguments: [nextKey, (opts?.page ?? 1000) || Number.MAX_SAFE_INTEGER],
478
+ },
479
+ })
480
+ res.push(...page)
481
+ } while (hasMore)
482
+ return page
483
+ }
484
+
485
+ async getRegistryTokenConfig(
486
+ registry: string,
487
+ token: string,
488
+ ): Promise<{
489
+ administrator: string
490
+ pendingAdministrator?: string
491
+ tokenPool?: string
492
+ }> {
493
+ const [tokenPool, administrator, pendingAdministrator] = await this.provider.view<
494
+ [string, string, string]
495
+ >({
496
+ payload: {
497
+ function:
498
+ `${registry.includes('::') ? registry : registry + '::token_admin_registry'}::get_token_config` as `${string}::${string}::get_token_config`,
499
+ functionArguments: [token],
500
+ },
501
+ })
502
+ if (administrator.match(/^0x0*$/))
503
+ throw new Error(`Token=${token} not registered in registry=${registry}`)
504
+ return {
505
+ administrator,
506
+ ...(!pendingAdministrator.match(/^0x0*$/) && { pendingAdministrator }),
507
+ ...(!tokenPool.match(/^0x0*$/) && { tokenPool }),
508
+ }
509
+ }
510
+
511
+ async getTokenPoolConfigs(tokenPool: string): Promise<{
512
+ token: string
513
+ router: string
514
+ typeAndVersion?: string
515
+ }> {
516
+ const modulesNames = (await this._getAccountModulesNames(tokenPool))
517
+ .reverse()
518
+ .filter((name) => name.endsWith('token_pool'))
519
+ let firstErr
520
+ for (const name of modulesNames) {
521
+ try {
522
+ const [typeAndVersion, token, router] = await Promise.all([
523
+ this.typeAndVersion(`${tokenPool}::${name}`),
524
+ this.provider.view<[string]>({
525
+ payload: {
526
+ function: `${tokenPool}::${name}::get_token`,
527
+ functionArguments: [],
528
+ },
529
+ }),
530
+ this.provider.view<[string]>({
531
+ payload: {
532
+ function: `${tokenPool}::${name}::get_router`,
533
+ functionArguments: [],
534
+ },
535
+ }),
536
+ ])
537
+ return {
538
+ token: token[0],
539
+ router: router[0],
540
+ typeAndVersion: typeAndVersion[2],
541
+ }
542
+ } catch (err) {
543
+ firstErr ??= err as Error
544
+ }
545
+ }
546
+ throw firstErr ?? new Error(`Could not get tokenPool configs from ${tokenPool}`)
547
+ }
548
+
549
+ async getTokenPoolRemotes(
550
+ tokenPool: string,
551
+ remoteChainSelector?: bigint,
552
+ ): Promise<Record<string, TokenPoolRemote>> {
553
+ type RawRateLimiterState_ = {
554
+ capacity: string
555
+ is_enabled: boolean
556
+ last_updated: string
557
+ rate: string
558
+ tokens: string
559
+ }
560
+ const modulesNames = (await this._getAccountModulesNames(tokenPool))
561
+ .reverse()
562
+ .filter((name) => name.endsWith('token_pool'))
563
+ let firstErr
564
+ for (const name of modulesNames) {
565
+ try {
566
+ const [supportedChains] = remoteChainSelector
567
+ ? [[remoteChainSelector]]
568
+ : await this.provider.view<[string[]]>({
569
+ payload: {
570
+ function: `${tokenPool}::${name}::get_supported_chains`,
571
+ functionArguments: [],
572
+ },
573
+ })
574
+ return Object.fromEntries(
575
+ await Promise.all(
576
+ supportedChains.map(networkInfo).map(async (chain) => {
577
+ const remoteToken$ = this.provider.view<[BytesLike]>({
578
+ payload: {
579
+ function: `${tokenPool}::${name}::get_remote_token`,
580
+ functionArguments: [chain.chainSelector],
581
+ },
582
+ })
583
+ const remotePools$ = this.provider.view<[BytesLike[]]>({
584
+ payload: {
585
+ function: `${tokenPool}::${name}::get_remote_pools`,
586
+ functionArguments: [chain.chainSelector],
587
+ },
588
+ })
589
+ const inboundRateLimiterState$ = this.provider.view<[RawRateLimiterState_]>({
590
+ payload: {
591
+ function: `${tokenPool}::${name}::get_current_inbound_rate_limiter_state`,
592
+ functionArguments: [chain.chainSelector],
593
+ },
594
+ })
595
+ const outboundRateLimiterState$ = this.provider.view<[RawRateLimiterState_]>({
596
+ payload: {
597
+ function: `${tokenPool}::${name}::get_current_outbound_rate_limiter_state`,
598
+ functionArguments: [chain.chainSelector],
599
+ },
600
+ })
601
+ const [
602
+ [remoteToken],
603
+ [remotePools],
604
+ [inboundRateLimiterState],
605
+ [outboundRateLimiterState],
606
+ ] = await Promise.all([
607
+ remoteToken$,
608
+ remotePools$,
609
+ inboundRateLimiterState$,
610
+ outboundRateLimiterState$,
611
+ ])
612
+ return [
613
+ chain.name,
614
+ {
615
+ remoteToken: decodeAddress(remoteToken, chain.family),
616
+ remotePools: remotePools.map((pool) => decodeAddress(pool, chain.family)),
617
+ inboundRateLimiterState: inboundRateLimiterState.is_enabled
618
+ ? {
619
+ capacity: BigInt(inboundRateLimiterState.capacity),
620
+ lastUpdated: Number(inboundRateLimiterState.last_updated),
621
+ rate: BigInt(inboundRateLimiterState.rate),
622
+ tokens: BigInt(inboundRateLimiterState.tokens),
623
+ }
624
+ : null,
625
+ outboundRateLimiterState: outboundRateLimiterState.is_enabled
626
+ ? {
627
+ capacity: BigInt(outboundRateLimiterState.capacity),
628
+ lastUpdated: Number(outboundRateLimiterState.last_updated),
629
+ rate: BigInt(outboundRateLimiterState.rate),
630
+ tokens: BigInt(outboundRateLimiterState.tokens),
631
+ }
632
+ : null,
633
+ },
634
+ ] as const
635
+ }),
636
+ ),
637
+ )
638
+ } catch (err) {
639
+ firstErr ??= err as Error
640
+ }
641
+ }
642
+ throw firstErr ?? new Error(`Could not view 'get_remote_token' in ${tokenPool}`)
643
+ }
644
+
645
+ async listFeeTokens(router: string): Promise<Record<string, TokenInfo>> {
646
+ const [feeTokens] = await this.provider.view<[string[]]>({
647
+ payload: {
648
+ function:
649
+ `${router.split('::')[0] + '::fee_quoter'}::get_fee_tokens` as `${string}::${string}::get_fee_tokens`,
650
+ },
651
+ })
652
+ return Object.fromEntries(
653
+ await Promise.all(
654
+ feeTokens.map(async (token) => [token, await this.getTokenInfo(token)] as const),
655
+ ),
656
+ )
657
+ }
658
+ }
659
+
660
+ supportedChains[ChainFamily.Aptos] = AptosChain