@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,210 @@
1
+ import {
2
+ type Aptos,
3
+ type Event as AptosEvent,
4
+ type UserTransactionResponse,
5
+ TransactionResponseType,
6
+ getAptosFullNode,
7
+ } from '@aptos-labs/ts-sdk'
8
+ import moize from 'moize'
9
+
10
+ import type { LogFilter } from '../chain.ts'
11
+ import type { Log_ } from '../types.ts'
12
+
13
+ const eventToHandler = {
14
+ CCIPMessageSent: 'OnRampState/ccip_message_sent_events',
15
+ CommitReportAccepted: 'OffRampState/commit_report_accepted_events',
16
+ ExecutionStateChanged: 'OffRampState/execution_state_changed_events',
17
+ } as const
18
+
19
+ export async function getUserTxByVersion(
20
+ provider: Aptos,
21
+ version: number,
22
+ ): Promise<UserTransactionResponse> {
23
+ const tx = await provider.getTransactionByVersion({
24
+ ledgerVersion: version,
25
+ })
26
+ if (tx.type !== TransactionResponseType.User)
27
+ throw new Error(`Unexpected transaction type="${tx.type}"`)
28
+ return tx
29
+ }
30
+
31
+ export async function getVersionTimestamp(
32
+ provider: Aptos,
33
+ version: number | 'finalized',
34
+ ): Promise<number> {
35
+ if (version === 'finalized') {
36
+ const info = await provider.getLedgerInfo()
37
+ const tx = await provider.getTransactionByVersion({
38
+ ledgerVersion: +info.ledger_version,
39
+ })
40
+ return +(tx as UserTransactionResponse).timestamp / 1e6
41
+ }
42
+ const tx = await getUserTxByVersion(provider, version)
43
+ return +tx.timestamp / 1e6
44
+ }
45
+
46
+ type ResEvent = AptosEvent & { version: string }
47
+
48
+ /**
49
+ * Binary search to find the first element that does NOT satisfy a condition.
50
+ * Assumes the first element satisfies the condition, and elements after it may or may not.
51
+ * @param low - The starting index (inclusive, must satisfy condition)
52
+ * @param high - The ending index (inclusive)
53
+ * @param predicate - Function that returns true when condition is met
54
+ * @returns The first index where predicate returns false, or high + 1 if all elements satisfy the condition
55
+ */
56
+ async function binarySearchFirst(
57
+ low: number,
58
+ high: number,
59
+ predicate: (index: number) => Promise<boolean>,
60
+ ): Promise<number> {
61
+ let result = high + 1
62
+ while (low <= high) {
63
+ const mid = Math.floor((low + high) / 2)
64
+ if (await predicate(mid)) {
65
+ low = mid + 1
66
+ } else {
67
+ result = mid
68
+ high = mid - 1
69
+ }
70
+ }
71
+ return result
72
+ }
73
+
74
+ async function* fetchEventsForward(
75
+ provider: Aptos,
76
+ opts: LogFilter,
77
+ eventHandlerField: string,
78
+ stateAddr: string,
79
+ limit = 100,
80
+ ): AsyncGenerator<ResEvent> {
81
+ const fetchBatch = moize.default(
82
+ async (start?: number) => {
83
+ const { data }: { data: ResEvent[] } = await getAptosFullNode({
84
+ aptosConfig: provider.config,
85
+ originMethod: 'getEventsByEventHandle',
86
+ path: `accounts/${stateAddr}/events/${opts.address}::${eventHandlerField}`,
87
+ params: { start, limit },
88
+ })
89
+ if (!start) fetchBatch.set([+data[0].sequence_number], data)
90
+ return data
91
+ },
92
+ { maxArgs: 1, maxSize: 100 },
93
+ )
94
+
95
+ const initialBatch = await fetchBatch()
96
+ if (!initialBatch.length) return
97
+ const end = +initialBatch[initialBatch.length - 1].sequence_number
98
+
99
+ let start
100
+ if (
101
+ (!opts.startBlock || opts.startBlock < +initialBatch[0].version) &&
102
+ (!opts.startTime ||
103
+ opts.startTime < (await getVersionTimestamp(provider, +initialBatch[0].version)))
104
+ ) {
105
+ const i = await binarySearchFirst(0, Math.floor(end / limit) - 1, async (i) => {
106
+ const batch = await fetchBatch(end - (i + 1) * limit + 1)
107
+ const firstTimestamp = await getVersionTimestamp(provider, +batch[0].version)
108
+ return firstTimestamp > opts.startTime!
109
+ })
110
+ start = end - (i + 1) * limit + 1
111
+ } else {
112
+ start = end - limit + 1
113
+ }
114
+
115
+ let first = true
116
+ for (; start < end; start += limit) {
117
+ const data = await fetchBatch(start)
118
+ if (
119
+ first &&
120
+ opts.startTime &&
121
+ (await getVersionTimestamp(provider, +data[0].version)) < opts.startTime
122
+ ) {
123
+ // the first batch may have some head which is not in the range
124
+ const actualStart = await binarySearchFirst(0, data.length - 1, async (i) => {
125
+ const timestamp = await getVersionTimestamp(provider, +data[i].version)
126
+ return timestamp < opts.startTime!
127
+ })
128
+ data.splice(0, actualStart - 1)
129
+ }
130
+ first = false
131
+ for (const ev of data) {
132
+ if (opts.startBlock && +ev.version < opts.startBlock) continue
133
+ if (opts.endBlock && +ev.version > opts.endBlock) return
134
+ yield ev
135
+ }
136
+ }
137
+ }
138
+
139
+ async function* fetchEventsBackward(
140
+ provider: Aptos,
141
+ opts: LogFilter,
142
+ eventHandlerField: string,
143
+ stateAddr: string,
144
+ limit = 100,
145
+ ): AsyncGenerator<ResEvent> {
146
+ let start
147
+ let cont = true
148
+ do {
149
+ const { data } = await getAptosFullNode<object, ResEvent[]>({
150
+ aptosConfig: provider.config,
151
+ originMethod: 'getEventsByEventHandle',
152
+ path: `accounts/${stateAddr}/events/${opts.address}::${eventHandlerField}`,
153
+ params: { start, limit },
154
+ })
155
+
156
+ if (!data.length) break
157
+ else if (start === 1) cont = false
158
+ else start = Math.max(+data[0].sequence_number - limit, 1)
159
+
160
+ for (const ev of data.reverse()) {
161
+ if (opts.endBlock && +ev.version > opts.endBlock) continue
162
+ if (+ev.sequence_number <= 1) cont = false
163
+ yield ev
164
+ }
165
+ } while (cont)
166
+ }
167
+
168
+ export async function* streamAptosLogs(
169
+ provider: Aptos,
170
+ opts: LogFilter & { versionAsHash?: boolean },
171
+ ): AsyncGenerator<Log_> {
172
+ const limit = 100
173
+ if (!opts.address || !opts.address.includes('::'))
174
+ throw new Error('address with module is required')
175
+ if (opts.topics?.length !== 1 || typeof opts.topics[0] !== 'string')
176
+ throw new Error('single string topic required')
177
+ let eventHandlerField = opts.topics[0]
178
+ if (!eventHandlerField.includes('/')) {
179
+ eventHandlerField = (eventToHandler as Record<string, string>)[eventHandlerField]
180
+ if (!eventHandlerField) throw new Error(`Unknown topic event handler="${opts.topics[0]}"`)
181
+ }
182
+ const [stateAddr] = await provider.view<[string]>({
183
+ payload: {
184
+ function: `${opts.address}::get_state_address` as `0x${string}::${string}::get_state_address`,
185
+ },
186
+ })
187
+
188
+ let eventsIter
189
+ if (opts.startBlock || opts.startTime) {
190
+ eventsIter = fetchEventsForward(provider, opts, eventHandlerField, stateAddr, limit)
191
+ } else {
192
+ // backwards, just paginate down to lowest sequence number
193
+ eventsIter = fetchEventsBackward(provider, opts, eventHandlerField, stateAddr, limit)
194
+ }
195
+
196
+ let topics
197
+ for await (const ev of eventsIter) {
198
+ topics ??= [ev.type.slice(ev.type.lastIndexOf('::') + 2)]
199
+ yield {
200
+ address: opts.address,
201
+ topics,
202
+ index: +ev.sequence_number,
203
+ blockNumber: +ev.version,
204
+ transactionHash: opts?.versionAsHash
205
+ ? `${ev.version}`
206
+ : (await getUserTxByVersion(provider, +ev.version)).hash,
207
+ data: ev.data as Record<string, unknown>,
208
+ }
209
+ }
210
+ }
@@ -0,0 +1,120 @@
1
+ import type { Aptos } from '@aptos-labs/ts-sdk'
2
+ import { getBytes, zeroPadValue } from 'ethers'
3
+
4
+ import { ChainFamily } from '../chain.ts'
5
+ import { encodeExtraArgs } from '../extra-args.ts'
6
+ import type { AnyMessage } from '../types.ts'
7
+ import { getDataBytes } from '../utils.ts'
8
+ import type { AptosAsyncAccount } from './types.ts'
9
+
10
+ export const DEFAULT_FEE_TOKEN = '0xa'
11
+
12
+ function messageArgs(
13
+ destChainSelector: bigint,
14
+ message: AnyMessage,
15
+ ): [
16
+ destChainSelector: bigint,
17
+ receiver: Uint8Array,
18
+ data: Uint8Array,
19
+ tokenAddresses: string[],
20
+ tokenAmounts: string[],
21
+ tokenStoreAddresses: string[],
22
+ feeToken: string,
23
+ feeTokenStore: string,
24
+ encodedExtraArgs: Uint8Array,
25
+ ] {
26
+ // Prepare the message structure for the view call
27
+ const receiver = getBytes(zeroPadValue(getDataBytes(message.receiver), 32))
28
+ const data = getDataBytes(message.data)
29
+
30
+ // Get the native token to use as fee token if not specified
31
+ const feeToken = message.feeToken || DEFAULT_FEE_TOKEN
32
+ const feeTokenStore = '0x0' // auto-fetch primary store
33
+
34
+ // Split token amounts into separate arrays for Aptos Move
35
+ const tokenAddresses = (message.tokenAmounts ?? []).map((ta) => ta.token)
36
+ const tokenAmounts = (message.tokenAmounts ?? []).map((ta) => ta.amount.toString())
37
+ const tokenStoreAddresses = tokenAddresses.map(() => '0x0')
38
+
39
+ // Encode extraArgs for the router
40
+ const encodedExtraArgs = getBytes(encodeExtraArgs(message.extraArgs, ChainFamily.Aptos))
41
+
42
+ return [
43
+ destChainSelector,
44
+ receiver,
45
+ data,
46
+ tokenAddresses,
47
+ tokenAmounts,
48
+ tokenStoreAddresses,
49
+ feeToken,
50
+ feeTokenStore,
51
+ encodedExtraArgs,
52
+ ]
53
+ }
54
+
55
+ export async function getFee(
56
+ provider: Aptos,
57
+ router: string,
58
+ destChainSelector: bigint,
59
+ message: AnyMessage,
60
+ ): Promise<bigint> {
61
+ // Call the get_fee view function on the router
62
+ // Signature: get_fee(dest_chain_selector, receiver, data, token_addresses, token_amounts,
63
+ // token_store_addresses, fee_token, fee_token_store, extra_args)
64
+ const [fee] = await provider.view<[string]>({
65
+ payload: {
66
+ function:
67
+ `${router.includes('::') ? router : router + '::router'}::get_fee` as `${string}::${string}::get_fee`,
68
+ functionArguments: messageArgs(destChainSelector, message),
69
+ },
70
+ })
71
+
72
+ return BigInt(fee)
73
+ }
74
+
75
+ export async function ccipSend(
76
+ provider: Aptos,
77
+ account: AptosAsyncAccount,
78
+ router: string,
79
+ destChainSelector: bigint,
80
+ message: AnyMessage & { fee: bigint },
81
+ _opts?: { approveMax?: boolean },
82
+ ): Promise<string> {
83
+ // Build and submit the transaction
84
+ // Call ccip_send entry function with signature:
85
+ // public entry fun ccip_send(
86
+ // caller: &signer,
87
+ // dest_chain_selector: u64,
88
+ // receiver: vector<u8>,
89
+ // data: vector<u8>,
90
+ // token_addresses: vector<address>,
91
+ // token_amounts: vector<u64>,
92
+ // token_store_addresses: vector<address>,
93
+ // fee_token: address,
94
+ // fee_token_store: address,
95
+ // extra_args: vector<u8>
96
+ // )
97
+ const transaction = await provider.transaction.build.simple({
98
+ sender: account.accountAddress,
99
+ data: {
100
+ function:
101
+ `${router.includes('::') ? router : router + '::router'}::ccip_send` as `${string}::${string}::${string}`,
102
+ functionArguments: messageArgs(destChainSelector, message),
103
+ },
104
+ })
105
+
106
+ // Sign and submit the transaction
107
+ const signed = await account.signTransactionWithAuthenticator(transaction)
108
+ const pendingTxn = await provider.transaction.submit.simple({
109
+ transaction,
110
+ senderAuthenticator: signed,
111
+ })
112
+
113
+ // Wait for the transaction to be confirmed
114
+ const { hash } = await provider.waitForTransaction({
115
+ transactionHash: pendingTxn.hash,
116
+ })
117
+
118
+ // Return the transaction hash
119
+ return hash
120
+ }
@@ -0,0 +1,150 @@
1
+ import type { Aptos } from '@aptos-labs/ts-sdk'
2
+
3
+ import type { TokenInfo } from '../chain.ts'
4
+
5
+ export async function getTokenInfo(provider: Aptos, token: string): Promise<TokenInfo> {
6
+ let lastErr: Error | undefined
7
+
8
+ // First, try to get info from Fungible Asset metadata resource
9
+ try {
10
+ const resources = await provider.getAccountResources({ accountAddress: token })
11
+ const metadataResource = resources.find((r) => r.type === '0x1::fungible_asset::Metadata')
12
+
13
+ if (metadataResource?.data) {
14
+ const metadata = metadataResource.data as {
15
+ name?: string
16
+ symbol?: string
17
+ decimals?: number
18
+ }
19
+ if (metadata.symbol !== undefined && metadata.decimals !== undefined) {
20
+ return {
21
+ name: metadata.name,
22
+ symbol: metadata.symbol,
23
+ decimals: metadata.decimals,
24
+ }
25
+ }
26
+ }
27
+ } catch (err) {
28
+ lastErr = err as Error
29
+ }
30
+
31
+ // Try to get info using standard coin functions with type arguments
32
+ try {
33
+ const symbolRes = await provider.view({
34
+ payload: {
35
+ function: '0x1::coin::symbol',
36
+ typeArguments: [token],
37
+ },
38
+ })
39
+
40
+ const decimalsRes = await provider.view({
41
+ payload: {
42
+ function: '0x1::coin::decimals',
43
+ typeArguments: [token],
44
+ },
45
+ })
46
+
47
+ let name: string | undefined
48
+ try {
49
+ const nameRes = await provider.view({
50
+ payload: {
51
+ function: '0x1::coin::name',
52
+ typeArguments: [token],
53
+ },
54
+ })
55
+ name = nameRes[0] as string
56
+ } catch {
57
+ // name function not available, continue without it
58
+ }
59
+
60
+ return {
61
+ name,
62
+ symbol: symbolRes[0] as string,
63
+ decimals: decimalsRes[0] as number,
64
+ }
65
+ } catch (err) {
66
+ lastErr = err as Error
67
+ }
68
+
69
+ // Try to get symbol and decimals from token module functions (legacy approach)
70
+ const modules = await provider.getAccountModules({ accountAddress: token })
71
+ const moduleNames = modules
72
+ .map(({ abi }) => abi!.name)
73
+ .filter((name) => name.includes('coin') || name.includes('token'))
74
+
75
+ for (const moduleName of moduleNames) {
76
+ try {
77
+ const symbolRes = await provider.view({
78
+ payload: {
79
+ function: `${token}::${moduleName}::symbol`,
80
+ },
81
+ })
82
+
83
+ const decimalsRes = await provider.view({
84
+ payload: {
85
+ function: `${token}::${moduleName}::decimals`,
86
+ },
87
+ })
88
+
89
+ let name: string | undefined
90
+ try {
91
+ const nameRes = await provider.view({
92
+ payload: {
93
+ function: `${token}::${moduleName}::name`,
94
+ },
95
+ })
96
+ name = nameRes[0] as string
97
+ } catch {
98
+ // name function not available, continue without it
99
+ }
100
+
101
+ return {
102
+ name,
103
+ symbol: symbolRes[0] as string,
104
+ decimals: decimalsRes[0] as number,
105
+ }
106
+ } catch (err) {
107
+ lastErr = err as Error
108
+ }
109
+ }
110
+
111
+ // Fallback: try common coin module patterns
112
+ const commonPatterns = ['coin', 'token', 'fungible_asset']
113
+ for (const pattern of commonPatterns) {
114
+ try {
115
+ const symbolRes = await provider.view({
116
+ payload: {
117
+ function: `${token}::${pattern}::symbol`,
118
+ },
119
+ })
120
+
121
+ const decimalsRes = await provider.view({
122
+ payload: {
123
+ function: `${token}::${pattern}::decimals`,
124
+ },
125
+ })
126
+
127
+ let name: string | undefined
128
+ try {
129
+ const nameRes = await provider.view({
130
+ payload: {
131
+ function: `${token}::${pattern}::name`,
132
+ },
133
+ })
134
+ name = nameRes[0] as string
135
+ } catch {
136
+ // name function not available, continue without it
137
+ }
138
+
139
+ return {
140
+ name,
141
+ symbol: symbolRes[0] as string,
142
+ decimals: decimalsRes[0] as number,
143
+ }
144
+ } catch (err) {
145
+ lastErr = err as Error
146
+ }
147
+ }
148
+
149
+ throw lastErr ?? new Error(`Could not view token info for ${token}`)
150
+ }
@@ -0,0 +1,85 @@
1
+ import type {
2
+ AccountAddress,
3
+ AccountAuthenticator,
4
+ AccountPublicKey,
5
+ AnyRawTransaction,
6
+ } from '@aptos-labs/ts-sdk'
7
+ import { bcs } from '@mysten/bcs'
8
+ import { getBytes } from 'ethers'
9
+
10
+ import type { CCIPMessage_V1_6_EVM } from '../evm/messages.ts'
11
+ import type { ExecutionReport } from '../types.ts'
12
+ import { getAddressBytes } from '../utils.ts'
13
+
14
+ // Aptos Account is synchronous; this specialisation adds async signTransactionWithAuthenticator
15
+ export type AptosAsyncAccount = {
16
+ publicKey: AccountPublicKey
17
+ accountAddress: AccountAddress
18
+ signTransactionWithAuthenticator: (
19
+ transaction: AnyRawTransaction,
20
+ ) => Promise<AccountAuthenticator> | AccountAuthenticator
21
+ }
22
+
23
+ export const EVMExtraArgsV2Codec = bcs.struct('EVMExtraArgsV2', {
24
+ gasLimit: bcs.u256(),
25
+ allowOutOfOrderExecution: bcs.bool(),
26
+ })
27
+
28
+ export const SVMExtraArgsV1Codec = bcs.struct('SVMExtraArgsV1', {
29
+ computeUnits: bcs.u32(),
30
+ accountIsWritableBitmap: bcs.u64(),
31
+ allowOutOfOrderExecution: bcs.bool(),
32
+ tokenReceiver: bcs.vector(bcs.u8()),
33
+ accounts: bcs.vector(bcs.vector(bcs.u8())),
34
+ })
35
+
36
+ export const ExecutionReportCodec = bcs.struct('ExecutionReport', {
37
+ sourceChainSelector: bcs.u64(),
38
+ messageId: bcs.fixedArray(32, bcs.u8()),
39
+ headerSourceChainSelector: bcs.u64(),
40
+ destChainSelector: bcs.u64(),
41
+ sequenceNumber: bcs.u64(),
42
+ nonce: bcs.u64(),
43
+ sender: bcs.vector(bcs.u8()),
44
+ data: bcs.vector(bcs.u8()),
45
+ receiver: bcs.fixedArray(32, bcs.u8()),
46
+ gasLimit: bcs.u256(),
47
+ tokenAmounts: bcs.vector(
48
+ bcs.struct('TokenAmounts', {
49
+ sourcePoolAddress: bcs.vector(bcs.u8()),
50
+ destTokenAddress: bcs.fixedArray(32, bcs.u8()),
51
+ destGasAmount: bcs.u32(),
52
+ extraData: bcs.vector(bcs.u8()),
53
+ amount: bcs.u256(),
54
+ }),
55
+ ),
56
+ offchainTokenData: bcs.vector(bcs.vector(bcs.u8())),
57
+ proofs: bcs.vector(bcs.fixedArray(32, bcs.u8())),
58
+ })
59
+
60
+ export function serializeExecutionReport(
61
+ execReport: ExecutionReport<CCIPMessage_V1_6_EVM>,
62
+ ): Uint8Array {
63
+ const message = execReport.message
64
+ return ExecutionReportCodec.serialize({
65
+ sourceChainSelector: message.header.sourceChainSelector,
66
+ messageId: getBytes(message.header.messageId),
67
+ headerSourceChainSelector: message.header.sourceChainSelector,
68
+ destChainSelector: message.header.destChainSelector,
69
+ sequenceNumber: message.header.sequenceNumber,
70
+ nonce: message.header.nonce,
71
+ sender: getAddressBytes(message.sender),
72
+ data: getBytes(message.data),
73
+ receiver: getAddressBytes(message.receiver),
74
+ gasLimit: message.gasLimit,
75
+ tokenAmounts: message.tokenAmounts.map((ta) => ({
76
+ sourcePoolAddress: getAddressBytes(ta.sourcePoolAddress),
77
+ destTokenAddress: getAddressBytes(ta.destTokenAddress),
78
+ destGasAmount: Number(ta.destGasAmount),
79
+ extraData: getBytes(ta.extraData),
80
+ amount: ta.amount,
81
+ })),
82
+ offchainTokenData: execReport.offchainTokenData.map(() => []),
83
+ proofs: execReport.proofs.map((p) => getBytes(p)),
84
+ }).toBytes()
85
+ }
@@ -0,0 +1,24 @@
1
+ import {
2
+ type BigNumberish,
3
+ type BytesLike,
4
+ concat,
5
+ dataLength,
6
+ toBeHex,
7
+ zeroPadBytes,
8
+ } from 'ethers'
9
+
10
+ /**
11
+ * Encodes a numeric value as a 32-byte hex string.
12
+ * @param value Numeric value to encode.
13
+ * @returns 32-byte hex string representation of the value.
14
+ */
15
+ export const encodeNumber = (value: BigNumberish): string => toBeHex(value, 32)
16
+
17
+ /**
18
+ * Encodes dynamic bytes without the struct offset prefix.
19
+ */
20
+ export const encodeRawBytes = (value: BytesLike): string =>
21
+ concat([
22
+ encodeNumber(dataLength(value)),
23
+ zeroPadBytes(value, Math.ceil(dataLength(value) / 32) * 32),
24
+ ])