@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
|
@@ -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
|
+
])
|