@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
package/dist/utils.js ADDED
@@ -0,0 +1,336 @@
1
+ import util from 'util';
2
+ import bs58 from 'bs58';
3
+ import { decodeBase64, getBytes, isBytesLike, toBeHex, toBigInt, } from 'ethers';
4
+ import moize from 'moize';
5
+ import { ChainFamily } from "./chain.js";
6
+ import SELECTORS from "./selectors.js";
7
+ import { supportedChains } from "./supported-chains.js";
8
+ /**
9
+ * Returns *some* block number with timestamp prior to `timestamp`
10
+ *
11
+ * @param getBlockTimestamp - function to get block timestamp
12
+ * @param recentBlockNumber - a block guaranteed to be after `timestamp` (e.g. latest)
13
+ * @param timestamp - target timestamp
14
+ * @param precision - returned blockNumber should be within this many blocks before timestamp
15
+ * @returns blockNumber of a block at provider which is close but before target timestamp
16
+ **/
17
+ export async function getSomeBlockNumberBefore(getBlockTimestamp, recentBlockNumber, timestamp, precision = 10) {
18
+ let beforeBlockNumber = Math.max(1, recentBlockNumber - precision * 1000);
19
+ let beforeTimestamp = await getBlockTimestamp(beforeBlockNumber);
20
+ const now = Math.trunc(Date.now() / 1000);
21
+ let estimatedBlockTime = (now - beforeTimestamp) / (recentBlockNumber - beforeBlockNumber), afterBlockNumber = recentBlockNumber, afterTimestamp = now;
22
+ // first, go back looking for a block prior to our target timestamp
23
+ for (let iter = 0; beforeBlockNumber > 1 && beforeTimestamp > timestamp; iter++) {
24
+ afterBlockNumber = beforeBlockNumber;
25
+ afterTimestamp = beforeTimestamp;
26
+ beforeBlockNumber = Math.max(1, Math.trunc(beforeBlockNumber - (beforeTimestamp - timestamp) / estimatedBlockTime) -
27
+ 10 ** iter);
28
+ beforeTimestamp = await getBlockTimestamp(beforeBlockNumber);
29
+ estimatedBlockTime = (now - beforeTimestamp) / (recentBlockNumber - beforeBlockNumber);
30
+ }
31
+ if (beforeTimestamp > timestamp) {
32
+ throw new Error(`Could not find a block prior to timestamp=${timestamp}`);
33
+ }
34
+ // now, bin-search based on timestamp proportions, looking for
35
+ // a block at most N estimated blockTimes from our target timestamp
36
+ while (timestamp - beforeTimestamp >= 1 && afterBlockNumber - beforeBlockNumber > precision) {
37
+ const prop = (timestamp - beforeTimestamp) / (afterTimestamp - beforeTimestamp);
38
+ const delta = prop > 0.5
39
+ ? Math.floor(prop * (afterBlockNumber - beforeBlockNumber))
40
+ : Math.ceil(prop * (afterBlockNumber - beforeBlockNumber));
41
+ let pivot = beforeBlockNumber + delta;
42
+ if (pivot === afterBlockNumber) {
43
+ pivot--;
44
+ }
45
+ const pivotTimestamp = await getBlockTimestamp(pivot);
46
+ if (pivotTimestamp > timestamp) {
47
+ afterBlockNumber = pivot;
48
+ afterTimestamp = pivotTimestamp;
49
+ }
50
+ else {
51
+ beforeBlockNumber = pivot;
52
+ beforeTimestamp = pivotTimestamp;
53
+ }
54
+ console.debug('getSomeBlockNumberBefore: searching block before', {
55
+ beforeBlockNumber,
56
+ beforeTimestamp,
57
+ pivot,
58
+ pivotTimestamp,
59
+ afterBlockNumber,
60
+ afterTimestamp,
61
+ estimatedBlockTime,
62
+ timestamp,
63
+ diffNumber: afterBlockNumber - beforeBlockNumber,
64
+ });
65
+ }
66
+ return beforeBlockNumber;
67
+ }
68
+ // memoized so we always output the same object for a given chainId
69
+ const networkInfoFromChainId = moize.default((chainId) => {
70
+ const sel = SELECTORS[chainId];
71
+ if (!sel?.name)
72
+ throw new Error(`Chain not found: ${chainId}`);
73
+ return {
74
+ chainId: isNaN(+chainId) ? chainId : +chainId,
75
+ chainSelector: sel.selector,
76
+ name: sel.name,
77
+ family: sel.family,
78
+ isTestnet: !sel.name.includes('-mainnet'),
79
+ };
80
+ });
81
+ /**
82
+ * Converts a chain selector, chain ID, or chain name to complete network information
83
+ *
84
+ * @param selectorOrIdOrName - Can be:
85
+ * - Chain selector as bigint or numeric string
86
+ * - Chain ID as number, bigint or string (EVM: "1", Aptos: "aptos:1", Solana: genesisHash)
87
+ * - Chain name as string ("ethereum-mainnet")
88
+ * @returns Complete NetworkInfo object
89
+ */
90
+ export const networkInfo = moize.default(function networkInfo_(selectorOrIdOrName) {
91
+ let chainId;
92
+ if (typeof selectorOrIdOrName === 'number') {
93
+ chainId = selectorOrIdOrName;
94
+ }
95
+ else if (typeof selectorOrIdOrName === 'string' && selectorOrIdOrName.match(/^\d+$/)) {
96
+ selectorOrIdOrName = BigInt(selectorOrIdOrName);
97
+ }
98
+ if (typeof selectorOrIdOrName === 'bigint') {
99
+ // maybe we got a number deserialized as bigint
100
+ if (selectorOrIdOrName.toString() in SELECTORS) {
101
+ chainId = Number(selectorOrIdOrName);
102
+ }
103
+ else {
104
+ for (const id in SELECTORS) {
105
+ if (SELECTORS[id].selector === selectorOrIdOrName) {
106
+ chainId = id;
107
+ break;
108
+ }
109
+ }
110
+ if (!chainId)
111
+ throw new Error(`Selector not found: ${selectorOrIdOrName}`);
112
+ }
113
+ }
114
+ else if (typeof selectorOrIdOrName === 'string') {
115
+ if (selectorOrIdOrName.includes('-')) {
116
+ for (const id in SELECTORS) {
117
+ if (SELECTORS[id].name === selectorOrIdOrName) {
118
+ chainId = id;
119
+ break;
120
+ }
121
+ }
122
+ }
123
+ chainId ??= selectorOrIdOrName;
124
+ }
125
+ return networkInfoFromChainId(chainId);
126
+ });
127
+ const BLOCK_RANGE = 10_000;
128
+ /**
129
+ * Generates exclusive block ranges [fromBlock, toBlock]
130
+ * If startBlock is given, moves forward from there (up to latestBlock),
131
+ * Otherwise, moves backwards down to genesis (you probably want to break/return before that)
132
+ **/
133
+ export function* blockRangeGenerator(params) {
134
+ const stepSize = params.page ?? BLOCK_RANGE;
135
+ if ('singleBlock' in params) {
136
+ yield { fromBlock: params.singleBlock, toBlock: params.singleBlock };
137
+ }
138
+ else if ('startBlock' in params && params.startBlock) {
139
+ for (let fromBlock = params.startBlock; fromBlock < params.endBlock; fromBlock += stepSize) {
140
+ yield {
141
+ fromBlock,
142
+ toBlock: Math.min(params.endBlock, fromBlock + stepSize - 1),
143
+ progress: `${Math.trunc(((fromBlock - params.startBlock) / (params.endBlock - params.startBlock)) * 10000) / 100}%`,
144
+ };
145
+ }
146
+ }
147
+ else {
148
+ for (let toBlock = params.endBlock; toBlock > 1; toBlock -= stepSize) {
149
+ yield {
150
+ fromBlock: Math.max(1, toBlock - stepSize + 1),
151
+ toBlock,
152
+ };
153
+ }
154
+ }
155
+ }
156
+ export function bigIntReplacer(_key, value) {
157
+ if (typeof value === 'bigint') {
158
+ return value.toString();
159
+ }
160
+ return value;
161
+ }
162
+ export function bigIntReviver(_key, value) {
163
+ if (typeof value === 'string' && /^\d+$/.test(value)) {
164
+ return BigInt(value);
165
+ }
166
+ return value;
167
+ }
168
+ /**
169
+ * Decode address from a 32-byte hex string
170
+ **/
171
+ export function decodeAddress(address, family = ChainFamily.EVM) {
172
+ const chain = supportedChains[family];
173
+ if (!chain)
174
+ throw new Error(`Unsupported chain family: ${family}`);
175
+ return chain.getAddress(getAddressBytes(address));
176
+ }
177
+ /**
178
+ * Version of decodeAddress which is aware of custom cross-chain OnRamp formats
179
+ **/
180
+ export function decodeOnRampAddress(address, family = ChainFamily.EVM) {
181
+ let decoded = decodeAddress(address, family);
182
+ if (family === ChainFamily.Aptos)
183
+ decoded += '::onramp';
184
+ return decoded;
185
+ }
186
+ export function leToBigInt(data) {
187
+ if (Array.isArray(data))
188
+ data = new Uint8Array(data);
189
+ return toBigInt(getBytes(data).reverse());
190
+ }
191
+ export function toLeArray(value, width) {
192
+ return getBytes(toBeHex(value, width)).reverse();
193
+ }
194
+ export function isBase64(data) {
195
+ return (typeof data === 'string' &&
196
+ /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/.test(data));
197
+ }
198
+ export function getDataBytes(data) {
199
+ if (Array.isArray(data)) {
200
+ return new Uint8Array(data);
201
+ }
202
+ if (isBytesLike(data)) {
203
+ return getBytes(data);
204
+ }
205
+ else if (isBase64(data)) {
206
+ return decodeBase64(data);
207
+ }
208
+ else {
209
+ throw new Error(`Unsupported data format: ${util.inspect(data)}`);
210
+ }
211
+ }
212
+ export function getAddressBytes(address) {
213
+ let bytes;
214
+ if (isBytesLike(address)) {
215
+ bytes = getBytes(address);
216
+ }
217
+ else {
218
+ bytes = bs58.decode(address);
219
+ }
220
+ if (bytes.length > 20) {
221
+ if (bytes.slice(0, bytes.length - 20).every((b) => b === 0) &&
222
+ bytes.slice(-20).some((b) => b !== 0)) {
223
+ bytes = bytes.slice(-20);
224
+ }
225
+ }
226
+ return bytes;
227
+ }
228
+ /**
229
+ * Converts snake_case strings to camelCase
230
+ */
231
+ export function snakeToCamel(str) {
232
+ return str.replace(/_([a-zA-Z])/g, (_, letter) => letter.toUpperCase());
233
+ }
234
+ /**
235
+ * Recursively converts all snake_case keys in an object to camelCase
236
+ * Only converts keys that actually have snake_case format
237
+ */
238
+ export function convertKeysToCamelCase(obj, mapValues, key) {
239
+ if (Array.isArray(obj)) {
240
+ return obj.map((v) => convertKeysToCamelCase(v, mapValues, key));
241
+ }
242
+ if (obj == null || typeof obj !== 'object')
243
+ return mapValues ? mapValues(obj, key) : obj;
244
+ const record = obj;
245
+ const converted = {};
246
+ for (const [name, value] of Object.entries(record)) {
247
+ const camelKey = snakeToCamel(name);
248
+ converted[camelKey] = convertKeysToCamelCase(value, mapValues, camelKey);
249
+ }
250
+ return converted;
251
+ }
252
+ export const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
253
+ export function parseTypeAndVersion(typeAndVersion) {
254
+ const match = typeAndVersion.match(/^(\w.+\S)\s+v?(\d+\.\d+(?:\.\d+)?)([^\d.].*)?$/);
255
+ if (!match)
256
+ throw new Error(`Invalid typeAndVersion: "${typeAndVersion}", len=${typeAndVersion.length}, hex=0x${Buffer.from(typeAndVersion).toString('hex')}`);
257
+ const [_, typeRaw, version] = match;
258
+ // some string normalization
259
+ const type = typeRaw
260
+ .replaceAll(/-(\w)/g, (_, w) => w.toUpperCase()) // kebabToPascal
261
+ .replace(/ccip/gi, 'CCIP')
262
+ .replace(/(o)(n|ff)(ramp)\b/gi, (_, o, n, ramp) => `${o.toUpperCase()}${n.toLowerCase()}${ramp.charAt(0).toUpperCase()}${ramp.slice(1).toLowerCase()}`); // ccipOfframp -> CCIPOffRamp
263
+ if (!match[3])
264
+ return [type, version, typeAndVersion];
265
+ else
266
+ return [type, version, typeAndVersion, match[3]];
267
+ }
268
+ export function createRateLimitedFetch({ maxRequests = Number(process.env['RL_MAX_REQUESTS'] || 2), windowMs = Number(process.env['RL_WINDOW_MS'] || 10000), maxRetries = Number(process.env['RL_MAX_RETRIES'] || 5), } = {}) {
269
+ // Custom fetch implementation with retry logic and rate limiting
270
+ // Per-instance state
271
+ const requestQueue = [];
272
+ const isRateLimited = () => {
273
+ const now = Date.now();
274
+ // Remove old requests outside the window
275
+ while (requestQueue.length > 0 && now - requestQueue[0].timestamp > windowMs) {
276
+ requestQueue.shift();
277
+ }
278
+ return requestQueue.length >= maxRequests;
279
+ };
280
+ const waitForRateLimit = async () => {
281
+ while (isRateLimited()) {
282
+ const oldestRequest = requestQueue[0];
283
+ const waitTime = windowMs - (Date.now() - oldestRequest.timestamp);
284
+ if (waitTime > 0) {
285
+ await sleep(waitTime + 100); // Add small buffer
286
+ }
287
+ }
288
+ };
289
+ const recordRequest = () => {
290
+ requestQueue.push({ timestamp: Date.now() });
291
+ };
292
+ const isRateLimitError = (error) => {
293
+ if (error instanceof Error) {
294
+ return !!error.message.match(/\b(429\b|rate.?limit)/i);
295
+ }
296
+ return false;
297
+ };
298
+ return async (input, init) => {
299
+ let lastError = null;
300
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
301
+ try {
302
+ // Wait for rate limit before making request
303
+ await waitForRateLimit();
304
+ recordRequest();
305
+ // console.debug('__fetching', input, init?.body)
306
+ const response = await fetch(input, init);
307
+ // If response is successful, return it
308
+ if (response.ok) {
309
+ console.debug('fetched', input, response.status, init?.body);
310
+ return response;
311
+ }
312
+ // For 429 responses, throw an error to trigger retry
313
+ if (response.status === 429) {
314
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
315
+ }
316
+ // For other non-2xx responses, don't retry
317
+ console.debug('fetch non-retryable error', input, response.status, init?.body);
318
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
319
+ }
320
+ catch (error) {
321
+ console.debug('fetch errored', attempt, error, input, init?.body);
322
+ lastError = error instanceof Error ? error : new Error(String(error));
323
+ // Only retry on rate limit errors
324
+ if (!isRateLimitError(lastError)) {
325
+ throw lastError;
326
+ }
327
+ // Don't retry on the last attempt
328
+ if (attempt >= maxRetries) {
329
+ break;
330
+ }
331
+ }
332
+ }
333
+ throw lastError || new Error('Request failed after all retries');
334
+ };
335
+ }
336
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,67 @@
1
1
  {
2
- "name": "@chainlink/ccip-sdk",
3
- "version": "0.0.0",
4
- "main": "",
5
- "author": "",
6
- "license": "ISC",
7
- "repository": "git://github.com/smartcontractkit/ccip-tools-ts.git",
8
- "description": ""
9
- }
2
+ "name": "@chainlink/ccip-sdk",
3
+ "version": "0.90.0",
4
+ "description": "SDK/Library to interact with CCIP",
5
+ "author": "Chainlink devs",
6
+ "license": "MIT",
7
+ "repository": "git://github.com/smartcontractkit/ccip-tools-ts.git",
8
+ "type": "module",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./src/*": "./src/*"
15
+ },
16
+ "scripts": {
17
+ "test": "node --test",
18
+ "lint": "prettier --check ./src && eslint ./src",
19
+ "lint:fix": "prettier --write ./src && eslint --fix ./src",
20
+ "typecheck": "tsc --noEmit",
21
+ "check": "npm run lint && npm run typecheck",
22
+ "build": "npm run clean && tsc -p ./tsconfig.build.json",
23
+ "clean": "rm -rfv ./dist",
24
+ "prepare": "npm run build"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "src",
29
+ "tsconfig.json",
30
+ "!**/*.test.*",
31
+ "!**/__tests__",
32
+ "!**/__mocks__"
33
+ ],
34
+ "devDependencies": {
35
+ "@eslint/js": "^9.39.1",
36
+ "@types/bn.js": "^5.2.0",
37
+ "@types/node": "24.10.1",
38
+ "@types/yargs": "17.0.35",
39
+ "eslint": "^9.39.1",
40
+ "eslint-config-prettier": "10.1.8",
41
+ "eslint-import-resolver-typescript": "4.4.4",
42
+ "eslint-plugin-import": "^2.32.0",
43
+ "eslint-plugin-prettier": "^5.5.4",
44
+ "ethers-abitype": "1.0.3",
45
+ "prettier": "^3.7.1",
46
+ "typescript": "5.9.3",
47
+ "typescript-eslint": "8.47.0"
48
+ },
49
+ "dependencies": {
50
+ "@aptos-labs/ts-sdk": "^5.1.5",
51
+ "@coral-xyz/anchor": "^0.29.0",
52
+ "@mysten/bcs": "^1.9.2",
53
+ "@mysten/sui": "^1.45.0",
54
+ "@solana/spl-token": "0.4.14",
55
+ "@solana/web3.js": "^1.98.4",
56
+ "abitype": "1.2.0",
57
+ "bn.js": "^5.2.2",
58
+ "borsh": "^2.0.0",
59
+ "bs58": "^6.0.0",
60
+ "ethers": "6.15.0",
61
+ "moize": "^6.1.6",
62
+ "yaml": "2.8.1"
63
+ },
64
+ "overrides": {
65
+ "axios": "^1.13.2"
66
+ }
67
+ }
@@ -0,0 +1,69 @@
1
+ import type { Aptos } from '@aptos-labs/ts-sdk'
2
+
3
+ import type { ExecutionReport } from '../types.ts'
4
+ import { type AptosAsyncAccount, serializeExecutionReport } from './types.ts'
5
+ import type { CCIPMessage_V1_6_EVM } from '../evm/messages.ts'
6
+
7
+ /**
8
+ * Executes as single message report in offramp
9
+ *
10
+ * @param provider - Aptos provider instance
11
+ * @param account - async Account
12
+ * @param offRamp - Offramp contract address (with or without `::offramp` suffix)
13
+ * @param execReport - Aptos uses EVMExtraArgsV2, so same message as EVM v1.6
14
+ * @param opts - options like gasLimit override
15
+ * @returns exec txHash
16
+ */
17
+ export async function executeReport(
18
+ provider: Aptos,
19
+ account: AptosAsyncAccount,
20
+ offRamp: string,
21
+ execReport: ExecutionReport<CCIPMessage_V1_6_EVM>,
22
+ opts?: { gasLimit?: number },
23
+ ) {
24
+ // Prepare proofs as byte arrays
25
+ const serialized = serializeExecutionReport(execReport)
26
+
27
+ // Build the transaction to call manually_execute
28
+ // The function signature should be something like:
29
+ // public entry fun manually_execute(
30
+ // caller: &signer,
31
+ // merkle_root: vector<u8>,
32
+ // proofs: vector<vector<u8>>,
33
+ // proof_flag_bits: u256,
34
+ // message_id: vector<u8>,
35
+ // source_chain_selector: u64,
36
+ // dest_chain_selector: u64,
37
+ // sequence_number: u64,
38
+ // nonce: u64,
39
+ // sender: vector<u8>,
40
+ // receiver: vector<u8>,
41
+ // data: vector<u8>,
42
+ // token_addresses: vector<address>,
43
+ // token_amounts: vector<u256>,
44
+ // offchain_token_data: vector<vector<u8>>,
45
+ // gas_limit: u256
46
+ // )
47
+ const transaction = await provider.transaction.build.simple({
48
+ sender: account.accountAddress,
49
+ data: {
50
+ function:
51
+ `${offRamp.includes('::') ? offRamp : offRamp + '::offramp'}::manually_execute` as `${string}::${string}::${string}`,
52
+ functionArguments: [serialized],
53
+ },
54
+ options: { maxGasAmount: opts?.gasLimit },
55
+ })
56
+
57
+ // Sign and submit the transaction
58
+ const signed = await account.signTransactionWithAuthenticator(transaction)
59
+ const pendingTxn = await provider.transaction.submit.simple({
60
+ transaction,
61
+ senderAuthenticator: signed,
62
+ })
63
+
64
+ // Wait for the transaction to be confirmed
65
+ const { hash } = await provider.waitForTransaction({
66
+ transactionHash: pendingTxn.hash,
67
+ })
68
+ return hash
69
+ }
@@ -0,0 +1,92 @@
1
+ import { concat, id, keccak256, zeroPadValue } from 'ethers'
2
+
3
+ import { decodeExtraArgs } from '../extra-args.ts'
4
+ import { type LeafHasher, LEAF_DOMAIN_SEPARATOR } from '../hasher/common.ts'
5
+ import { type CCIPMessage, type CCIPMessage_V1_6, CCIPVersion } from '../types.ts'
6
+ import { getAddressBytes, networkInfo } from '../utils.ts'
7
+ import { encodeNumber, encodeRawBytes } from './utils.ts'
8
+
9
+ export function getAptosLeafHasher<V extends CCIPVersion = CCIPVersion>({
10
+ sourceChainSelector,
11
+ destChainSelector,
12
+ onRamp,
13
+ version,
14
+ }: {
15
+ sourceChainSelector: bigint
16
+ destChainSelector: bigint
17
+ onRamp: string
18
+ version: V
19
+ }): LeafHasher<V> {
20
+ let metadataHash: string
21
+ switch (version) {
22
+ case CCIPVersion.V1_6:
23
+ metadataHash = hashAptosMetadata(sourceChainSelector, destChainSelector, onRamp)
24
+ return ((message: CCIPMessage<typeof CCIPVersion.V1_6>): string =>
25
+ hashV16AptosMessage(message, metadataHash)) as LeafHasher<V>
26
+ default:
27
+ throw new Error(`Unsupported hasher version for Aptos: ${version as string}`)
28
+ }
29
+ }
30
+
31
+ export function hashV16AptosMessage(
32
+ message: CCIPMessage_V1_6 | CCIPMessage<typeof CCIPVersion.V1_6>,
33
+ metadataHash: string,
34
+ ): string {
35
+ let gasLimit
36
+ if (!('gasLimit' in message)) {
37
+ const parsedArgs = decodeExtraArgs(
38
+ message.extraArgs,
39
+ networkInfo(message.header.sourceChainSelector).family,
40
+ )
41
+ if (!parsedArgs || !('gasLimit' in parsedArgs))
42
+ throw new Error('Invalid extraArgs, not EVMExtraArgsV1|2')
43
+ gasLimit = parsedArgs.gasLimit
44
+ } else {
45
+ gasLimit = message.gasLimit
46
+ }
47
+
48
+ const innerHash = concat([
49
+ message.header.messageId,
50
+ zeroPadValue(message.receiver, 32),
51
+ encodeNumber(message.header.sequenceNumber),
52
+ encodeNumber(gasLimit), // Aptos as dest uses EVMExtraArgs
53
+ encodeNumber(message.header.nonce),
54
+ ])
55
+
56
+ const tokenHash = concat([
57
+ encodeNumber(message.tokenAmounts.length),
58
+ ...message.tokenAmounts.map((token) =>
59
+ concat([
60
+ encodeRawBytes(getAddressBytes(token.sourcePoolAddress)),
61
+ zeroPadValue(token.destTokenAddress, 32),
62
+ encodeNumber(token.destGasAmount),
63
+ encodeRawBytes(token.extraData),
64
+ encodeNumber(token.amount),
65
+ ]),
66
+ ),
67
+ ])
68
+
69
+ const outerHash = concat([
70
+ zeroPadValue(LEAF_DOMAIN_SEPARATOR, 32),
71
+ metadataHash,
72
+ keccak256(innerHash),
73
+ keccak256(getAddressBytes(message.sender)),
74
+ keccak256(message.data),
75
+ keccak256(tokenHash),
76
+ ])
77
+
78
+ return keccak256(outerHash)
79
+ }
80
+
81
+ export const hashAptosMetadata = (
82
+ sourceChainSelector: bigint,
83
+ destChainSelector: bigint,
84
+ onRamp: string,
85
+ ): string => {
86
+ const versionHash = id('Any2AptosMessageHashV1')
87
+ const encodedSource = encodeNumber(sourceChainSelector)
88
+ const encodedDest = encodeNumber(destChainSelector)
89
+ const onrampHash = keccak256(onRamp)
90
+
91
+ return keccak256(concat([versionHash, encodedSource, encodedDest, onrampHash]))
92
+ }