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