@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.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/dist/aptos/exec.d.ts +18 -0
- package/dist/aptos/exec.d.ts.map +1 -0
- package/dist/aptos/exec.js +55 -0
- package/dist/aptos/exec.js.map +1 -0
- package/dist/aptos/hasher.d.ts +11 -0
- package/dist/aptos/hasher.d.ts.map +1 -0
- package/dist/aptos/hasher.js +62 -0
- package/dist/aptos/hasher.js.map +1 -0
- package/dist/aptos/index.d.ts +92 -0
- package/dist/aptos/index.d.ts.map +1 -0
- package/dist/aptos/index.js +482 -0
- package/dist/aptos/index.js.map +1 -0
- package/dist/aptos/logs.d.ts +9 -0
- package/dist/aptos/logs.d.ts.map +1 -0
- package/dist/aptos/logs.js +167 -0
- package/dist/aptos/logs.js.map +1 -0
- package/dist/aptos/send.d.ts +11 -0
- package/dist/aptos/send.d.ts.map +1 -0
- package/dist/aptos/send.js +78 -0
- package/dist/aptos/send.js.map +1 -0
- package/dist/aptos/token.d.ts +4 -0
- package/dist/aptos/token.d.ts.map +1 -0
- package/dist/aptos/token.js +134 -0
- package/dist/aptos/token.js.map +1 -0
- package/dist/aptos/types.d.ts +78 -0
- package/dist/aptos/types.d.ts.map +1 -0
- package/dist/aptos/types.js +60 -0
- package/dist/aptos/types.js.map +1 -0
- package/dist/aptos/utils.d.ts +12 -0
- package/dist/aptos/utils.d.ts.map +1 -0
- package/dist/aptos/utils.js +15 -0
- package/dist/aptos/utils.js.map +1 -0
- package/dist/chain.d.ts +344 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +41 -0
- package/dist/chain.js.map +1 -0
- package/dist/commits.d.ts +25 -0
- package/dist/commits.d.ts.map +1 -0
- package/dist/commits.js +29 -0
- package/dist/commits.js.map +1 -0
- package/dist/evm/abi/BurnMintERC677Token.d.ts +602 -0
- package/dist/evm/abi/BurnMintERC677Token.d.ts.map +1 -0
- package/dist/evm/abi/BurnMintERC677Token.js +488 -0
- package/dist/evm/abi/BurnMintERC677Token.js.map +1 -0
- package/dist/evm/abi/CommitStore_1_2.d.ts +688 -0
- package/dist/evm/abi/CommitStore_1_2.d.ts.map +1 -0
- package/dist/evm/abi/CommitStore_1_2.js +638 -0
- package/dist/evm/abi/CommitStore_1_2.js.map +1 -0
- package/dist/evm/abi/CommitStore_1_5.d.ts +708 -0
- package/dist/evm/abi/CommitStore_1_5.d.ts.map +1 -0
- package/dist/evm/abi/CommitStore_1_5.js +675 -0
- package/dist/evm/abi/CommitStore_1_5.js.map +1 -0
- package/dist/evm/abi/FeeQuoter_1_6.d.ts +1770 -0
- package/dist/evm/abi/FeeQuoter_1_6.d.ts.map +1 -0
- package/dist/evm/abi/FeeQuoter_1_6.js +1904 -0
- package/dist/evm/abi/FeeQuoter_1_6.js.map +1 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_5.d.ts +1116 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_5.d.ts.map +1 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_5.js +1096 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_5.js.map +1 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_5_1.d.ts +1306 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_5_1.d.ts.map +1 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_5_1.js +1278 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_5_1.js.map +1 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_6_1.d.ts +1290 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_6_1.d.ts.map +1 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_6_1.js +1288 -0
- package/dist/evm/abi/LockReleaseTokenPool_1_6_1.js.map +1 -0
- package/dist/evm/abi/OffRamp_1_2.d.ts +1217 -0
- package/dist/evm/abi/OffRamp_1_2.d.ts.map +1 -0
- package/dist/evm/abi/OffRamp_1_2.js +1204 -0
- package/dist/evm/abi/OffRamp_1_2.js.map +1 -0
- package/dist/evm/abi/OffRamp_1_5.d.ts +1271 -0
- package/dist/evm/abi/OffRamp_1_5.d.ts.map +1 -0
- package/dist/evm/abi/OffRamp_1_5.js +1273 -0
- package/dist/evm/abi/OffRamp_1_5.js.map +1 -0
- package/dist/evm/abi/OffRamp_1_6.d.ts +1472 -0
- package/dist/evm/abi/OffRamp_1_6.d.ts.map +1 -0
- package/dist/evm/abi/OffRamp_1_6.js +1529 -0
- package/dist/evm/abi/OffRamp_1_6.js.map +1 -0
- package/dist/evm/abi/OnRamp_1_2.d.ts +1391 -0
- package/dist/evm/abi/OnRamp_1_2.d.ts.map +1 -0
- package/dist/evm/abi/OnRamp_1_2.js +1343 -0
- package/dist/evm/abi/OnRamp_1_2.js.map +1 -0
- package/dist/evm/abi/OnRamp_1_5.d.ts +1443 -0
- package/dist/evm/abi/OnRamp_1_5.d.ts.map +1 -0
- package/dist/evm/abi/OnRamp_1_5.js +1427 -0
- package/dist/evm/abi/OnRamp_1_5.js.map +1 -0
- package/dist/evm/abi/OnRamp_1_6.d.ts +796 -0
- package/dist/evm/abi/OnRamp_1_6.d.ts.map +1 -0
- package/dist/evm/abi/OnRamp_1_6.js +880 -0
- package/dist/evm/abi/OnRamp_1_6.js.map +1 -0
- package/dist/evm/abi/Router.d.ts +541 -0
- package/dist/evm/abi/Router.d.ts.map +1 -0
- package/dist/evm/abi/Router.js +508 -0
- package/dist/evm/abi/Router.js.map +1 -0
- package/dist/evm/abi/TokenAdminRegistry_1_5.d.ts +373 -0
- package/dist/evm/abi/TokenAdminRegistry_1_5.d.ts.map +1 -0
- package/dist/evm/abi/TokenAdminRegistry_1_5.js +333 -0
- package/dist/evm/abi/TokenAdminRegistry_1_5.js.map +1 -0
- package/dist/evm/const.d.ts +27 -0
- package/dist/evm/const.d.ts.map +1 -0
- package/dist/evm/const.js +63 -0
- package/dist/evm/const.js.map +1 -0
- package/dist/evm/errors.d.ts +36 -0
- package/dist/evm/errors.d.ts.map +1 -0
- package/dist/evm/errors.js +192 -0
- package/dist/evm/errors.js.map +1 -0
- package/dist/evm/hasher.d.ts +5 -0
- package/dist/evm/hasher.d.ts.map +1 -0
- package/dist/evm/hasher.js +116 -0
- package/dist/evm/hasher.js.map +1 -0
- package/dist/evm/index.d.ts +121 -0
- package/dist/evm/index.d.ts.map +1 -0
- package/dist/evm/index.js +904 -0
- package/dist/evm/index.js.map +1 -0
- package/dist/evm/messages.d.ts +35 -0
- package/dist/evm/messages.d.ts.map +1 -0
- package/dist/evm/messages.js +11 -0
- package/dist/evm/messages.js.map +1 -0
- package/dist/evm/offchain.d.ts +16 -0
- package/dist/evm/offchain.d.ts.map +1 -0
- package/dist/evm/offchain.js +142 -0
- package/dist/evm/offchain.js.map +1 -0
- package/dist/execution.d.ts +80 -0
- package/dist/execution.d.ts.map +1 -0
- package/dist/execution.js +91 -0
- package/dist/execution.js.map +1 -0
- package/dist/extra-args.d.ts +45 -0
- package/dist/extra-args.d.ts.map +1 -0
- package/dist/extra-args.js +44 -0
- package/dist/extra-args.js.map +1 -0
- package/dist/gas.d.ts +27 -0
- package/dist/gas.d.ts.map +1 -0
- package/dist/gas.js +80 -0
- package/dist/gas.js.map +1 -0
- package/dist/hasher/common.d.ts +12 -0
- package/dist/hasher/common.d.ts.map +1 -0
- package/dist/hasher/common.js +19 -0
- package/dist/hasher/common.js.map +1 -0
- package/dist/hasher/hasher.d.ts +4 -0
- package/dist/hasher/hasher.d.ts.map +1 -0
- package/dist/hasher/hasher.js +11 -0
- package/dist/hasher/hasher.js.map +1 -0
- package/dist/hasher/index.d.ts +4 -0
- package/dist/hasher/index.d.ts.map +1 -0
- package/dist/hasher/index.js +4 -0
- package/dist/hasher/index.js.map +1 -0
- package/dist/hasher/merklemulti.d.ts +58 -0
- package/dist/hasher/merklemulti.d.ts.map +1 -0
- package/dist/hasher/merklemulti.js +257 -0
- package/dist/hasher/merklemulti.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/offchain.d.ts +20 -0
- package/dist/offchain.d.ts.map +1 -0
- package/dist/offchain.js +59 -0
- package/dist/offchain.js.map +1 -0
- package/dist/requests.d.ts +48 -0
- package/dist/requests.d.ts.map +1 -0
- package/dist/requests.js +286 -0
- package/dist/requests.js.map +1 -0
- package/dist/selectors.d.ts +9 -0
- package/dist/selectors.d.ts.map +1 -0
- package/dist/selectors.js +1330 -0
- package/dist/selectors.js.map +1 -0
- package/dist/solana/cleanup.d.ts +15 -0
- package/dist/solana/cleanup.d.ts.map +1 -0
- package/dist/solana/cleanup.js +159 -0
- package/dist/solana/cleanup.js.map +1 -0
- package/dist/solana/exec.d.ts +15 -0
- package/dist/solana/exec.d.ts.map +1 -0
- package/dist/solana/exec.js +417 -0
- package/dist/solana/exec.js.map +1 -0
- package/dist/solana/hasher.d.ts +4 -0
- package/dist/solana/hasher.d.ts.map +1 -0
- package/dist/solana/hasher.js +81 -0
- package/dist/solana/hasher.js.map +1 -0
- package/dist/solana/idl/1.6.0/BASE_TOKEN_POOL.d.ts +866 -0
- package/dist/solana/idl/1.6.0/BASE_TOKEN_POOL.d.ts.map +1 -0
- package/dist/solana/idl/1.6.0/BASE_TOKEN_POOL.js +866 -0
- package/dist/solana/idl/1.6.0/BASE_TOKEN_POOL.js.map +1 -0
- package/dist/solana/idl/1.6.0/BURN_MINT_TOKEN_POOL.d.ts +949 -0
- package/dist/solana/idl/1.6.0/BURN_MINT_TOKEN_POOL.d.ts.map +1 -0
- package/dist/solana/idl/1.6.0/BURN_MINT_TOKEN_POOL.js +949 -0
- package/dist/solana/idl/1.6.0/BURN_MINT_TOKEN_POOL.js.map +1 -0
- package/dist/solana/idl/1.6.0/CCIP_CCTP_TOKEN_POOL.d.ts +1374 -0
- package/dist/solana/idl/1.6.0/CCIP_CCTP_TOKEN_POOL.d.ts.map +1 -0
- package/dist/solana/idl/1.6.0/CCIP_CCTP_TOKEN_POOL.js +1374 -0
- package/dist/solana/idl/1.6.0/CCIP_CCTP_TOKEN_POOL.js.map +1 -0
- package/dist/solana/idl/1.6.0/CCIP_COMMON.d.ts +104 -0
- package/dist/solana/idl/1.6.0/CCIP_COMMON.d.ts.map +1 -0
- package/dist/solana/idl/1.6.0/CCIP_COMMON.js +104 -0
- package/dist/solana/idl/1.6.0/CCIP_COMMON.js.map +1 -0
- package/dist/solana/idl/1.6.0/CCIP_OFFRAMP.d.ts +2746 -0
- package/dist/solana/idl/1.6.0/CCIP_OFFRAMP.d.ts.map +1 -0
- package/dist/solana/idl/1.6.0/CCIP_OFFRAMP.js +2746 -0
- package/dist/solana/idl/1.6.0/CCIP_OFFRAMP.js.map +1 -0
- package/dist/solana/idl/1.6.0/CCIP_ROUTER.d.ts +2332 -0
- package/dist/solana/idl/1.6.0/CCIP_ROUTER.d.ts.map +1 -0
- package/dist/solana/idl/1.6.0/CCIP_ROUTER.js +2332 -0
- package/dist/solana/idl/1.6.0/CCIP_ROUTER.js.map +1 -0
- package/dist/solana/index.d.ts +205 -0
- package/dist/solana/index.d.ts.map +1 -0
- package/dist/solana/index.js +1085 -0
- package/dist/solana/index.js.map +1 -0
- package/dist/solana/offchain.d.ts +31 -0
- package/dist/solana/offchain.d.ts.map +1 -0
- package/dist/solana/offchain.js +152 -0
- package/dist/solana/offchain.js.map +1 -0
- package/dist/solana/patchBorsh.d.ts +2 -0
- package/dist/solana/patchBorsh.d.ts.map +1 -0
- package/dist/solana/patchBorsh.js +60 -0
- package/dist/solana/patchBorsh.js.map +1 -0
- package/dist/solana/send.d.ts +14 -0
- package/dist/solana/send.d.ts.map +1 -0
- package/dist/solana/send.js +272 -0
- package/dist/solana/send.js.map +1 -0
- package/dist/solana/types.d.ts +4 -0
- package/dist/solana/types.d.ts.map +1 -0
- package/dist/solana/types.js +2 -0
- package/dist/solana/types.js.map +1 -0
- package/dist/solana/utils.d.ts +58 -0
- package/dist/solana/utils.d.ts.map +1 -0
- package/dist/solana/utils.js +211 -0
- package/dist/solana/utils.js.map +1 -0
- package/dist/sui/hasher.d.ts +12 -0
- package/dist/sui/hasher.d.ts.map +1 -0
- package/dist/sui/hasher.js +63 -0
- package/dist/sui/hasher.js.map +1 -0
- package/dist/sui/index.d.ts +72 -0
- package/dist/sui/index.d.ts.map +1 -0
- package/dist/sui/index.js +128 -0
- package/dist/sui/index.js.map +1 -0
- package/dist/sui/types.d.ts +17 -0
- package/dist/sui/types.d.ts.map +1 -0
- package/dist/sui/types.js +17 -0
- package/dist/sui/types.js.map +1 -0
- package/dist/supported-chains.d.ts +5 -0
- package/dist/supported-chains.d.ts.map +1 -0
- package/dist/supported-chains.js +3 -0
- package/dist/supported-chains.js.map +1 -0
- package/dist/types.d.ts +118 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +117 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +336 -0
- package/dist/utils.js.map +1 -0
- package/package.json +66 -8
- package/src/aptos/exec.ts +69 -0
- package/src/aptos/hasher.ts +92 -0
- package/src/aptos/index.ts +660 -0
- package/src/aptos/logs.ts +210 -0
- package/src/aptos/send.ts +120 -0
- package/src/aptos/token.ts +150 -0
- package/src/aptos/types.ts +85 -0
- package/src/aptos/utils.ts +24 -0
- package/src/chain.ts +398 -0
- package/src/commits.ts +44 -0
- package/src/evm/abi/BurnMintERC677Token.ts +487 -0
- package/src/evm/abi/CommitStore_1_2.ts +637 -0
- package/src/evm/abi/CommitStore_1_5.ts +674 -0
- package/src/evm/abi/FeeQuoter_1_6.ts +1903 -0
- package/src/evm/abi/LockReleaseTokenPool_1_5.ts +1095 -0
- package/src/evm/abi/LockReleaseTokenPool_1_5_1.ts +1277 -0
- package/src/evm/abi/LockReleaseTokenPool_1_6_1.ts +1287 -0
- package/src/evm/abi/OffRamp_1_2.ts +1203 -0
- package/src/evm/abi/OffRamp_1_5.ts +1272 -0
- package/src/evm/abi/OffRamp_1_6.ts +1528 -0
- package/src/evm/abi/OnRamp_1_2.ts +1342 -0
- package/src/evm/abi/OnRamp_1_5.ts +1426 -0
- package/src/evm/abi/OnRamp_1_6.ts +879 -0
- package/src/evm/abi/Router.ts +507 -0
- package/src/evm/abi/TokenAdminRegistry_1_5.ts +332 -0
- package/src/evm/const.ts +69 -0
- package/src/evm/errors.ts +212 -0
- package/src/evm/hasher.ts +166 -0
- package/src/evm/index.ts +1262 -0
- package/src/evm/messages.ts +73 -0
- package/src/evm/offchain.ts +189 -0
- package/src/execution.ts +131 -0
- package/src/extra-args.ts +71 -0
- package/src/gas.ts +135 -0
- package/src/hasher/common.ts +23 -0
- package/src/hasher/hasher.ts +12 -0
- package/src/hasher/index.ts +3 -0
- package/src/hasher/merklemulti.ts +309 -0
- package/src/index.ts +51 -0
- package/src/offchain.ts +86 -0
- package/src/requests.ts +339 -0
- package/src/selectors.ts +1340 -0
- package/src/solana/cleanup.ts +216 -0
- package/src/solana/exec.ts +645 -0
- package/src/solana/hasher.ts +104 -0
- package/src/solana/idl/1.6.0/BASE_TOKEN_POOL.ts +1734 -0
- package/src/solana/idl/1.6.0/BURN_MINT_TOKEN_POOL.ts +1900 -0
- package/src/solana/idl/1.6.0/CCIP_CCTP_TOKEN_POOL.ts +2750 -0
- package/src/solana/idl/1.6.0/CCIP_COMMON.ts +210 -0
- package/src/solana/idl/1.6.0/CCIP_OFFRAMP.ts +5494 -0
- package/src/solana/idl/1.6.0/CCIP_ROUTER.ts +4671 -0
- package/src/solana/index.ts +1454 -0
- package/src/solana/offchain.ts +209 -0
- package/src/solana/patchBorsh.ts +67 -0
- package/src/solana/send.ts +436 -0
- package/src/solana/types.ts +6 -0
- package/src/solana/utils.ts +272 -0
- package/src/sui/hasher.ts +90 -0
- package/src/sui/index.ts +198 -0
- package/src/sui/types.ts +22 -0
- package/src/supported-chains.ts +4 -0
- package/src/types.ts +153 -0
- package/src/utils.ts +405 -0
- 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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
+
}
|