@across-protocol/sdk 4.3.111-alpha.3 → 4.3.111
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/dist/cjs/addressAggregator/adapters/abstract.js +64 -50
- package/dist/cjs/addressAggregator/adapters/abstract.js.map +1 -1
- package/dist/cjs/addressAggregator/adapters/bybit.js +29 -16
- package/dist/cjs/addressAggregator/adapters/bybit.js.map +1 -1
- package/dist/cjs/addressAggregator/adapters/env.js +15 -11
- package/dist/cjs/addressAggregator/adapters/env.js.map +1 -1
- package/dist/cjs/addressAggregator/adapters/file.js +45 -32
- package/dist/cjs/addressAggregator/adapters/file.js.map +1 -1
- package/dist/cjs/addressAggregator/adapters/index.js +1 -1
- package/dist/cjs/addressAggregator/adapters/risklabs.js +36 -22
- package/dist/cjs/addressAggregator/adapters/risklabs.js.map +1 -1
- package/dist/cjs/addressAggregator/index.js +87 -57
- package/dist/cjs/addressAggregator/index.js.map +1 -1
- package/dist/cjs/apiClient/abstractClient.js +8 -9
- package/dist/cjs/apiClient/abstractClient.js.map +1 -1
- package/dist/cjs/apiClient/index.js +1 -1
- package/dist/cjs/apiClient/mockedClient.js +29 -23
- package/dist/cjs/apiClient/mockedClient.js.map +1 -1
- package/dist/cjs/apiClient/productionClient.js +103 -65
- package/dist/cjs/apiClient/productionClient.js.map +1 -1
- package/dist/cjs/arch/evm/BlockUtils.js +208 -122
- package/dist/cjs/arch/evm/BlockUtils.js.map +1 -1
- package/dist/cjs/arch/evm/MessageUtils.js +1 -1
- package/dist/cjs/arch/evm/MessageUtils.js.map +1 -1
- package/dist/cjs/arch/evm/SpokeUtils.js +288 -134
- package/dist/cjs/arch/evm/SpokeUtils.js.map +1 -1
- package/dist/cjs/arch/evm/index.js +1 -1
- package/dist/cjs/arch/evm/utils/index.js +1 -1
- package/dist/cjs/arch/evm/utils/wait.js +49 -38
- package/dist/cjs/arch/evm/utils/wait.js.map +1 -1
- package/dist/cjs/arch/index.js +1 -1
- package/dist/cjs/arch/svm/BlockUtils.js +158 -102
- package/dist/cjs/arch/svm/BlockUtils.js.map +1 -1
- package/dist/cjs/arch/svm/MessageUtils.js +2 -2
- package/dist/cjs/arch/svm/MessageUtils.js.map +1 -1
- package/dist/cjs/arch/svm/SpokeUtils.js +1147 -708
- package/dist/cjs/arch/svm/SpokeUtils.js.map +1 -1
- package/dist/cjs/arch/svm/encoders.js +1 -1
- package/dist/cjs/arch/svm/encoders.js.map +1 -1
- package/dist/cjs/arch/svm/eventsClient.js +236 -174
- package/dist/cjs/arch/svm/eventsClient.js.map +1 -1
- package/dist/cjs/arch/svm/index.js +1 -1
- package/dist/cjs/arch/svm/provider.js +3 -3
- package/dist/cjs/arch/svm/provider.js.map +1 -1
- package/dist/cjs/arch/svm/utils.js +355 -166
- package/dist/cjs/arch/svm/utils.js.map +1 -1
- package/dist/cjs/caching/Arweave/ArweaveClient.js +246 -168
- package/dist/cjs/caching/Arweave/ArweaveClient.js.map +1 -1
- package/dist/cjs/caching/Arweave/index.js +1 -1
- package/dist/cjs/caching/IPFS/PinataIPFSClient.js +49 -40
- package/dist/cjs/caching/IPFS/PinataIPFSClient.js.map +1 -1
- package/dist/cjs/caching/IPFS/index.js +1 -1
- package/dist/cjs/caching/Memory/MemoryCacheClient.js +18 -13
- package/dist/cjs/caching/Memory/MemoryCacheClient.js.map +1 -1
- package/dist/cjs/caching/Memory/index.js +1 -1
- package/dist/cjs/caching/index.js +1 -1
- package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js +381 -302
- package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js.map +1 -1
- package/dist/cjs/clients/AcrossConfigStoreClient/index.js +1 -1
- package/dist/cjs/clients/BaseAbstractClient.js +83 -58
- package/dist/cjs/clients/BaseAbstractClient.js.map +1 -1
- package/dist/cjs/clients/BundleDataClient/BundleDataClient.js +900 -709
- package/dist/cjs/clients/BundleDataClient/BundleDataClient.js.map +1 -1
- package/dist/cjs/clients/BundleDataClient/index.js +1 -1
- package/dist/cjs/clients/BundleDataClient/utils/DataworkerUtils.js +128 -95
- package/dist/cjs/clients/BundleDataClient/utils/DataworkerUtils.js.map +1 -1
- package/dist/cjs/clients/BundleDataClient/utils/FillUtils.js +53 -48
- package/dist/cjs/clients/BundleDataClient/utils/FillUtils.js.map +1 -1
- package/dist/cjs/clients/BundleDataClient/utils/MerkleTreeUtils.js +8 -10
- package/dist/cjs/clients/BundleDataClient/utils/MerkleTreeUtils.js.map +1 -1
- package/dist/cjs/clients/BundleDataClient/utils/PoolRebalanceUtils.js +90 -67
- package/dist/cjs/clients/BundleDataClient/utils/PoolRebalanceUtils.js.map +1 -1
- package/dist/cjs/clients/BundleDataClient/utils/SuperstructUtils.js +24 -46
- package/dist/cjs/clients/BundleDataClient/utils/SuperstructUtils.js.map +1 -1
- package/dist/cjs/clients/BundleDataClient/utils/index.js +1 -1
- package/dist/cjs/clients/HubPoolClient.js +708 -526
- package/dist/cjs/clients/HubPoolClient.js.map +1 -1
- package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.js +179 -133
- package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
- package/dist/cjs/clients/SpokePoolClient/SVMSpokePoolClient.js +183 -124
- package/dist/cjs/clients/SpokePoolClient/SVMSpokePoolClient.js.map +1 -1
- package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.js +389 -357
- package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.js.map +1 -1
- package/dist/cjs/clients/SpokePoolClient/SpokePoolClientManager.js +8 -9
- package/dist/cjs/clients/SpokePoolClient/SpokePoolClientManager.js.map +1 -1
- package/dist/cjs/clients/SpokePoolClient/index.js +3 -3
- package/dist/cjs/clients/SpokePoolClient/index.js.map +1 -1
- package/dist/cjs/clients/index.js +1 -1
- package/dist/cjs/clients/mocks/MockConfigStoreClient.js +67 -58
- package/dist/cjs/clients/mocks/MockConfigStoreClient.js.map +1 -1
- package/dist/cjs/clients/mocks/MockEvents.js +52 -47
- package/dist/cjs/clients/mocks/MockEvents.js.map +1 -1
- package/dist/cjs/clients/mocks/MockHubPoolClient.js +185 -142
- package/dist/cjs/clients/mocks/MockHubPoolClient.js.map +1 -1
- package/dist/cjs/clients/mocks/MockSpokePoolClient.js +192 -208
- package/dist/cjs/clients/mocks/MockSpokePoolClient.js.map +1 -1
- package/dist/cjs/clients/mocks/MockSvmCpiEventsClient.js +143 -140
- package/dist/cjs/clients/mocks/MockSvmCpiEventsClient.js.map +1 -1
- package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.js +73 -57
- package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.js.map +1 -1
- package/dist/cjs/clients/mocks/index.js +1 -1
- package/dist/cjs/coingecko/Coingecko.js +437 -285
- package/dist/cjs/coingecko/Coingecko.js.map +1 -1
- package/dist/cjs/coingecko/index.js +1 -1
- package/dist/cjs/constants.js +30 -23
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/contracts/acrossConfigStore.js +48 -27
- package/dist/cjs/contracts/acrossConfigStore.js.map +1 -1
- package/dist/cjs/contracts/hubPool.js +20 -36
- package/dist/cjs/contracts/hubPool.js.map +1 -1
- package/dist/cjs/contracts/index.js +1 -1
- package/dist/cjs/contracts/utils.js +8 -6
- package/dist/cjs/contracts/utils.js.map +1 -1
- package/dist/cjs/gasPriceOracle/adapters/arbitrum.js +16 -7
- package/dist/cjs/gasPriceOracle/adapters/arbitrum.js.map +1 -1
- package/dist/cjs/gasPriceOracle/adapters/ethereum.js +45 -26
- package/dist/cjs/gasPriceOracle/adapters/ethereum.js.map +1 -1
- package/dist/cjs/gasPriceOracle/adapters/linea-viem.js +28 -16
- package/dist/cjs/gasPriceOracle/adapters/linea-viem.js.map +1 -1
- package/dist/cjs/gasPriceOracle/adapters/polygon.js +112 -73
- package/dist/cjs/gasPriceOracle/adapters/polygon.js.map +1 -1
- package/dist/cjs/gasPriceOracle/adapters/solana.js +33 -20
- package/dist/cjs/gasPriceOracle/adapters/solana.js.map +1 -1
- package/dist/cjs/gasPriceOracle/oracle.js +104 -77
- package/dist/cjs/gasPriceOracle/oracle.js.map +1 -1
- package/dist/cjs/gasPriceOracle/types.js +3 -3
- package/dist/cjs/gasPriceOracle/types.js.map +1 -1
- package/dist/cjs/gasPriceOracle/util.js +8 -8
- package/dist/cjs/gasPriceOracle/util.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/interfaces/index.js +1 -1
- package/dist/cjs/lpFeeCalculator/index.js +1 -1
- package/dist/cjs/lpFeeCalculator/lpFeeCalculator.js +35 -33
- package/dist/cjs/lpFeeCalculator/lpFeeCalculator.js.map +1 -1
- package/dist/cjs/lpFeeCalculator/rateModel.js +9 -7
- package/dist/cjs/lpFeeCalculator/rateModel.js.map +1 -1
- package/dist/cjs/merkleDistributor/MerkleDistributor.js +18 -20
- package/dist/cjs/merkleDistributor/MerkleDistributor.js.map +1 -1
- package/dist/cjs/merkleDistributor/index.js +1 -1
- package/dist/cjs/merkleDistributor/model/index.js +1 -1
- package/dist/cjs/pool/TransactionManager.js +100 -45
- package/dist/cjs/pool/TransactionManager.js.map +1 -1
- package/dist/cjs/pool/index.js +1 -1
- package/dist/cjs/pool/poolClient.js +731 -464
- package/dist/cjs/pool/poolClient.js.map +1 -1
- package/dist/cjs/pool/uma/across/index.js +1 -1
- package/dist/cjs/pool/uma/across/transactionManager.js +100 -45
- package/dist/cjs/pool/uma/across/transactionManager.js.map +1 -1
- package/dist/cjs/pool/uma/clients/erc20/client.js +16 -18
- package/dist/cjs/pool/uma/clients/erc20/client.js.map +1 -1
- package/dist/cjs/pool/uma/clients/erc20/index.js +1 -1
- package/dist/cjs/pool/uma/clients/index.js +1 -1
- package/dist/cjs/pool/uma/index.js +1 -1
- package/dist/cjs/pool/uma/oracle/index.js +1 -1
- package/dist/cjs/pool/uma/oracle/utils.js +5 -4
- package/dist/cjs/pool/uma/oracle/utils.js.map +1 -1
- package/dist/cjs/pool/uma/utils.js +30 -11
- package/dist/cjs/pool/uma/utils.js.map +1 -1
- package/dist/cjs/priceClient/adapters/acrossApi.js +39 -22
- package/dist/cjs/priceClient/adapters/acrossApi.js.map +1 -1
- package/dist/cjs/priceClient/adapters/baseAdapter.js +73 -49
- package/dist/cjs/priceClient/adapters/baseAdapter.js.map +1 -1
- package/dist/cjs/priceClient/adapters/coingecko.js +61 -34
- package/dist/cjs/priceClient/adapters/coingecko.js.map +1 -1
- package/dist/cjs/priceClient/adapters/default.js +31 -16
- package/dist/cjs/priceClient/adapters/default.js.map +1 -1
- package/dist/cjs/priceClient/adapters/defiLlama.js +74 -40
- package/dist/cjs/priceClient/adapters/defiLlama.js.map +1 -1
- package/dist/cjs/priceClient/adapters/index.js +1 -1
- package/dist/cjs/priceClient/index.js +1 -1
- package/dist/cjs/priceClient/priceClient.js +159 -110
- package/dist/cjs/priceClient/priceClient.js.map +1 -1
- package/dist/cjs/providers/alchemy.js +19 -17
- package/dist/cjs/providers/alchemy.js.map +1 -1
- package/dist/cjs/providers/cachedProvider.js +129 -88
- package/dist/cjs/providers/cachedProvider.js.map +1 -1
- package/dist/cjs/providers/drpc.js +11 -9
- package/dist/cjs/providers/drpc.js.map +1 -1
- package/dist/cjs/providers/index.js +1 -1
- package/dist/cjs/providers/infura.js +12 -10
- package/dist/cjs/providers/infura.js.map +1 -1
- package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.js +15 -7
- package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.js.map +1 -1
- package/dist/cjs/providers/mocks/MockRateLimitedSolanaRpcFactory.js +14 -6
- package/dist/cjs/providers/mocks/MockRateLimitedSolanaRpcFactory.js.map +1 -1
- package/dist/cjs/providers/mocks/MockRetrySolanaRpcFactory.js +15 -7
- package/dist/cjs/providers/mocks/MockRetrySolanaRpcFactory.js.map +1 -1
- package/dist/cjs/providers/mocks/MockSolanaRpcFactory.js +66 -42
- package/dist/cjs/providers/mocks/MockSolanaRpcFactory.js.map +1 -1
- package/dist/cjs/providers/mocks/index.js +1 -1
- package/dist/cjs/providers/mocks/mockEthersProvider.js +31 -29
- package/dist/cjs/providers/mocks/mockEthersProvider.js.map +1 -1
- package/dist/cjs/providers/quicknode.js +21 -19
- package/dist/cjs/providers/quicknode.js.map +1 -1
- package/dist/cjs/providers/rateLimitedProvider.js +79 -64
- package/dist/cjs/providers/rateLimitedProvider.js.map +1 -1
- package/dist/cjs/providers/retryProvider.js +246 -163
- package/dist/cjs/providers/retryProvider.js.map +1 -1
- package/dist/cjs/providers/solana/baseRpcFactories.js +18 -14
- package/dist/cjs/providers/solana/baseRpcFactories.js.map +1 -1
- package/dist/cjs/providers/solana/cachedRpcFactory.js +112 -70
- package/dist/cjs/providers/solana/cachedRpcFactory.js.map +1 -1
- package/dist/cjs/providers/solana/defaultRpcFactory.js +15 -8
- package/dist/cjs/providers/solana/defaultRpcFactory.js.map +1 -1
- package/dist/cjs/providers/solana/index.js +1 -1
- package/dist/cjs/providers/solana/quorumFallbackRpcFactory.js +191 -135
- package/dist/cjs/providers/solana/quorumFallbackRpcFactory.js.map +1 -1
- package/dist/cjs/providers/solana/rateLimitedRpcFactory.js +90 -67
- package/dist/cjs/providers/solana/rateLimitedRpcFactory.js.map +1 -1
- package/dist/cjs/providers/solana/retryRpcFactory.js +79 -52
- package/dist/cjs/providers/solana/retryRpcFactory.js.map +1 -1
- package/dist/cjs/providers/solana/utils.js +2 -2
- package/dist/cjs/providers/solana/utils.js.map +1 -1
- package/dist/cjs/providers/speedProvider.js +53 -31
- package/dist/cjs/providers/speedProvider.js.map +1 -1
- package/dist/cjs/providers/types.js +1 -1
- package/dist/cjs/providers/types.js.map +1 -1
- package/dist/cjs/providers/utils.js +28 -26
- package/dist/cjs/providers/utils.js.map +1 -1
- package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.js +162 -108
- package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.js.map +1 -1
- package/dist/cjs/relayFeeCalculator/chain-queries/customGasToken.js +26 -14
- package/dist/cjs/relayFeeCalculator/chain-queries/customGasToken.js.map +1 -1
- package/dist/cjs/relayFeeCalculator/chain-queries/factory.js +29 -20
- package/dist/cjs/relayFeeCalculator/chain-queries/factory.js.map +1 -1
- package/dist/cjs/relayFeeCalculator/chain-queries/index.js +1 -1
- package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.js +137 -88
- package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -1
- package/dist/cjs/relayFeeCalculator/index.js +1 -1
- package/dist/cjs/relayFeeCalculator/relayFeeCalculator.js +297 -199
- package/dist/cjs/relayFeeCalculator/relayFeeCalculator.js.map +1 -1
- package/dist/cjs/typeguards/error.js +7 -5
- package/dist/cjs/typeguards/error.js.map +1 -1
- package/dist/cjs/typeguards/index.js +1 -1
- package/dist/cjs/utils/AddressUtils.js +144 -117
- package/dist/cjs/utils/AddressUtils.js.map +1 -1
- package/dist/cjs/utils/ArrayUtils.js +78 -21
- package/dist/cjs/utils/ArrayUtils.js.map +1 -1
- package/dist/cjs/utils/BigNumberUtils.js +10 -9
- package/dist/cjs/utils/BigNumberUtils.js.map +1 -1
- package/dist/cjs/utils/BlockExplorerUtils.js +30 -26
- package/dist/cjs/utils/BlockExplorerUtils.js.map +1 -1
- package/dist/cjs/utils/BlockFinder.js +5 -2
- package/dist/cjs/utils/BlockFinder.js.map +1 -1
- package/dist/cjs/utils/BlockUtils.js +41 -24
- package/dist/cjs/utils/BlockUtils.js.map +1 -1
- package/dist/cjs/utils/BundleUtils.js +24 -21
- package/dist/cjs/utils/BundleUtils.js.map +1 -1
- package/dist/cjs/utils/CCTPUtils.js +126 -62
- package/dist/cjs/utils/CCTPUtils.js.map +1 -1
- package/dist/cjs/utils/CachingUtils.js +42 -20
- package/dist/cjs/utils/CachingUtils.js.map +1 -1
- package/dist/cjs/utils/ContractUtils.js +5 -5
- package/dist/cjs/utils/ContractUtils.js.map +1 -1
- package/dist/cjs/utils/DepositUtils.js +99 -122
- package/dist/cjs/utils/DepositUtils.js.map +1 -1
- package/dist/cjs/utils/EventUtils.js +70 -49
- package/dist/cjs/utils/EventUtils.js.map +1 -1
- package/dist/cjs/utils/FormattingUtils.js +32 -26
- package/dist/cjs/utils/FormattingUtils.js.map +1 -1
- package/dist/cjs/utils/HyperLiquidUtils.js +23 -10
- package/dist/cjs/utils/HyperLiquidUtils.js.map +1 -1
- package/dist/cjs/utils/IPFSUtils.js +34 -16
- package/dist/cjs/utils/IPFSUtils.js.map +1 -1
- package/dist/cjs/utils/JSONUtils.js +6 -6
- package/dist/cjs/utils/JSONUtils.js.map +1 -1
- package/dist/cjs/utils/LogUtils.js +12 -10
- package/dist/cjs/utils/LogUtils.js.map +1 -1
- package/dist/cjs/utils/Multicall.js +115 -56
- package/dist/cjs/utils/Multicall.js.map +1 -1
- package/dist/cjs/utils/NetworkUtils.js +28 -12
- package/dist/cjs/utils/NetworkUtils.js.map +1 -1
- package/dist/cjs/utils/NumberUtils.js +3 -1
- package/dist/cjs/utils/NumberUtils.js.map +1 -1
- package/dist/cjs/utils/ObjectUtils.js +41 -27
- package/dist/cjs/utils/ObjectUtils.js.map +1 -1
- package/dist/cjs/utils/Profiler.js +83 -80
- package/dist/cjs/utils/Profiler.js.map +1 -1
- package/dist/cjs/utils/ReviverUtils.js +9 -5
- package/dist/cjs/utils/ReviverUtils.js.map +1 -1
- package/dist/cjs/utils/SpokeUtils.js +84 -84
- package/dist/cjs/utils/SpokeUtils.js.map +1 -1
- package/dist/cjs/utils/TokenUtils.js +64 -41
- package/dist/cjs/utils/TokenUtils.js.map +1 -1
- package/dist/cjs/utils/TypeGuards.js +1 -1
- package/dist/cjs/utils/TypeGuards.js.map +1 -1
- package/dist/cjs/utils/ValidatorUtils.js +7 -7
- package/dist/cjs/utils/ValidatorUtils.js.map +1 -1
- package/dist/cjs/utils/abi/contracts/index.js +1 -1
- package/dist/cjs/utils/abi/index.js +22 -12
- package/dist/cjs/utils/abi/index.js.map +1 -1
- package/dist/cjs/utils/abi/typechain/factories/Multicall3__factory.js +12 -9
- package/dist/cjs/utils/abi/typechain/factories/Multicall3__factory.js.map +1 -1
- package/dist/cjs/utils/abi/typechain/index.js +1 -1
- package/dist/cjs/utils/common.js +53 -40
- package/dist/cjs/utils/common.js.map +1 -1
- package/dist/cjs/utils/index.js +1 -1
- package/dist/esm/addressAggregator/adapters/abstract.js +64 -48
- package/dist/esm/addressAggregator/adapters/abstract.js.map +1 -1
- package/dist/esm/addressAggregator/adapters/bybit.js +29 -15
- package/dist/esm/addressAggregator/adapters/bybit.js.map +1 -1
- package/dist/esm/addressAggregator/adapters/env.js +14 -9
- package/dist/esm/addressAggregator/adapters/env.js.map +1 -1
- package/dist/esm/addressAggregator/adapters/file.js +43 -29
- package/dist/esm/addressAggregator/adapters/file.js.map +1 -1
- package/dist/esm/addressAggregator/adapters/risklabs.js +35 -20
- package/dist/esm/addressAggregator/adapters/risklabs.js.map +1 -1
- package/dist/esm/addressAggregator/index.js +83 -52
- package/dist/esm/addressAggregator/index.js.map +1 -1
- package/dist/esm/addressAggregator/types.js +1 -1
- package/dist/esm/addressAggregator/types.js.map +1 -1
- package/dist/esm/apiClient/abstractClient.js +9 -15
- package/dist/esm/apiClient/abstractClient.js.map +1 -1
- package/dist/esm/apiClient/mockedClient.js +26 -21
- package/dist/esm/apiClient/mockedClient.js.map +1 -1
- package/dist/esm/apiClient/productionClient.js +101 -61
- package/dist/esm/apiClient/productionClient.js.map +1 -1
- package/dist/esm/arch/evm/BlockUtils.js +217 -139
- package/dist/esm/arch/evm/BlockUtils.js.map +1 -1
- package/dist/esm/arch/evm/SpokeUtils.js +289 -146
- package/dist/esm/arch/evm/SpokeUtils.js.map +1 -1
- package/dist/esm/arch/evm/utils/wait.js +46 -34
- package/dist/esm/arch/evm/utils/wait.js.map +1 -1
- package/dist/esm/arch/svm/BlockUtils.js +166 -118
- package/dist/esm/arch/svm/BlockUtils.js.map +1 -1
- package/dist/esm/arch/svm/SpokeUtils.js +1150 -738
- package/dist/esm/arch/svm/SpokeUtils.js.map +1 -1
- package/dist/esm/arch/svm/constants.js +1 -1
- package/dist/esm/arch/svm/constants.js.map +1 -1
- package/dist/esm/arch/svm/eventsClient.js +232 -172
- package/dist/esm/arch/svm/eventsClient.js.map +1 -1
- package/dist/esm/arch/svm/provider.js +1 -1
- package/dist/esm/arch/svm/provider.js.map +1 -1
- package/dist/esm/arch/svm/utils.js +345 -155
- package/dist/esm/arch/svm/utils.js.map +1 -1
- package/dist/esm/caching/Arweave/ArweaveClient.js +256 -182
- package/dist/esm/caching/Arweave/ArweaveClient.js.map +1 -1
- package/dist/esm/caching/IPFS/PinataIPFSClient.js +48 -47
- package/dist/esm/caching/IPFS/PinataIPFSClient.js.map +1 -1
- package/dist/esm/caching/Memory/MemoryCacheClient.js +19 -13
- package/dist/esm/caching/Memory/MemoryCacheClient.js.map +1 -1
- package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js +408 -333
- package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js.map +1 -1
- package/dist/esm/clients/BaseAbstractClient.js +92 -66
- package/dist/esm/clients/BaseAbstractClient.js.map +1 -1
- package/dist/esm/clients/BundleDataClient/BundleDataClient.js +1054 -927
- package/dist/esm/clients/BundleDataClient/BundleDataClient.js.map +1 -1
- package/dist/esm/clients/BundleDataClient/utils/DataworkerUtils.js +131 -102
- package/dist/esm/clients/BundleDataClient/utils/DataworkerUtils.js.map +1 -1
- package/dist/esm/clients/BundleDataClient/utils/FillUtils.js +59 -57
- package/dist/esm/clients/BundleDataClient/utils/FillUtils.js.map +1 -1
- package/dist/esm/clients/BundleDataClient/utils/MerkleTreeUtils.js +5 -7
- package/dist/esm/clients/BundleDataClient/utils/MerkleTreeUtils.js.map +1 -1
- package/dist/esm/clients/BundleDataClient/utils/PoolRebalanceUtils.js +94 -75
- package/dist/esm/clients/BundleDataClient/utils/PoolRebalanceUtils.js.map +1 -1
- package/dist/esm/clients/BundleDataClient/utils/SuperstructUtils.js +23 -45
- package/dist/esm/clients/BundleDataClient/utils/SuperstructUtils.js.map +1 -1
- package/dist/esm/clients/HubPoolClient.js +740 -581
- package/dist/esm/clients/HubPoolClient.js.map +1 -1
- package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.js +178 -133
- package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
- package/dist/esm/clients/SpokePoolClient/SVMSpokePoolClient.js +183 -126
- package/dist/esm/clients/SpokePoolClient/SVMSpokePoolClient.js.map +1 -1
- package/dist/esm/clients/SpokePoolClient/SpokePoolClient.js +399 -372
- package/dist/esm/clients/SpokePoolClient/SpokePoolClient.js.map +1 -1
- package/dist/esm/clients/SpokePoolClient/SpokePoolClientManager.js +9 -9
- package/dist/esm/clients/SpokePoolClient/SpokePoolClientManager.js.map +1 -1
- package/dist/esm/clients/SpokePoolClient/index.js +2 -2
- package/dist/esm/clients/SpokePoolClient/index.js.map +1 -1
- package/dist/esm/clients/SpokePoolClient/types.js +2 -2
- package/dist/esm/clients/SpokePoolClient/types.js.map +1 -1
- package/dist/esm/clients/mocks/MockConfigStoreClient.js +64 -53
- package/dist/esm/clients/mocks/MockConfigStoreClient.js.map +1 -1
- package/dist/esm/clients/mocks/MockEvents.js +49 -42
- package/dist/esm/clients/mocks/MockEvents.js.map +1 -1
- package/dist/esm/clients/mocks/MockHubPoolClient.js +182 -138
- package/dist/esm/clients/mocks/MockHubPoolClient.js.map +1 -1
- package/dist/esm/clients/mocks/MockSpokePoolClient.js +188 -202
- package/dist/esm/clients/mocks/MockSpokePoolClient.js.map +1 -1
- package/dist/esm/clients/mocks/MockSvmCpiEventsClient.js +132 -127
- package/dist/esm/clients/mocks/MockSvmCpiEventsClient.js.map +1 -1
- package/dist/esm/clients/mocks/MockSvmSpokePoolClient.js +69 -53
- package/dist/esm/clients/mocks/MockSvmSpokePoolClient.js.map +1 -1
- package/dist/esm/coingecko/Coingecko.js +443 -298
- package/dist/esm/coingecko/Coingecko.js.map +1 -1
- package/dist/esm/constants.js +47 -40
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/contracts/acrossConfigStore.js +46 -24
- package/dist/esm/contracts/acrossConfigStore.js.map +1 -1
- package/dist/esm/contracts/hubPool.js +18 -34
- package/dist/esm/contracts/hubPool.js.map +1 -1
- package/dist/esm/contracts/utils.js +5 -3
- package/dist/esm/contracts/utils.js.map +1 -1
- package/dist/esm/gasPriceOracle/adapters/arbitrum.js +14 -6
- package/dist/esm/gasPriceOracle/adapters/arbitrum.js.map +1 -1
- package/dist/esm/gasPriceOracle/adapters/ethereum.js +42 -22
- package/dist/esm/gasPriceOracle/adapters/ethereum.js.map +1 -1
- package/dist/esm/gasPriceOracle/adapters/linea-viem.js +25 -13
- package/dist/esm/gasPriceOracle/adapters/linea-viem.js.map +1 -1
- package/dist/esm/gasPriceOracle/adapters/polygon.js +108 -72
- package/dist/esm/gasPriceOracle/adapters/polygon.js.map +1 -1
- package/dist/esm/gasPriceOracle/adapters/solana.js +31 -22
- package/dist/esm/gasPriceOracle/adapters/solana.js.map +1 -1
- package/dist/esm/gasPriceOracle/oracle.js +96 -70
- package/dist/esm/gasPriceOracle/oracle.js.map +1 -1
- package/dist/esm/gasPriceOracle/types.js +2 -2
- package/dist/esm/gasPriceOracle/types.js.map +1 -1
- package/dist/esm/gasPriceOracle/util.js +4 -4
- package/dist/esm/gasPriceOracle/util.js.map +1 -1
- package/dist/esm/lpFeeCalculator/lpFeeCalculator.js +33 -30
- package/dist/esm/lpFeeCalculator/lpFeeCalculator.js.map +1 -1
- package/dist/esm/lpFeeCalculator/rateModel.js +9 -7
- package/dist/esm/lpFeeCalculator/rateModel.js.map +1 -1
- package/dist/esm/merkleDistributor/MerkleDistributor.js +17 -18
- package/dist/esm/merkleDistributor/MerkleDistributor.js.map +1 -1
- package/dist/esm/pool/TransactionManager.js +100 -45
- package/dist/esm/pool/TransactionManager.js.map +1 -1
- package/dist/esm/pool/poolClient.js +740 -479
- package/dist/esm/pool/poolClient.js.map +1 -1
- package/dist/esm/pool/uma/across/constants.js +2 -2
- package/dist/esm/pool/uma/across/constants.js.map +1 -1
- package/dist/esm/pool/uma/across/transactionManager.js +100 -45
- package/dist/esm/pool/uma/across/transactionManager.js.map +1 -1
- package/dist/esm/pool/uma/clients/erc20/client.js +13 -15
- package/dist/esm/pool/uma/clients/erc20/client.js.map +1 -1
- package/dist/esm/pool/uma/oracle/utils.js +3 -2
- package/dist/esm/pool/uma/oracle/utils.js.map +1 -1
- package/dist/esm/pool/uma/utils.js +28 -9
- package/dist/esm/pool/uma/utils.js.map +1 -1
- package/dist/esm/priceClient/adapters/acrossApi.js +40 -21
- package/dist/esm/priceClient/adapters/acrossApi.js.map +1 -1
- package/dist/esm/priceClient/adapters/baseAdapter.js +72 -46
- package/dist/esm/priceClient/adapters/baseAdapter.js.map +1 -1
- package/dist/esm/priceClient/adapters/coingecko.js +61 -33
- package/dist/esm/priceClient/adapters/coingecko.js.map +1 -1
- package/dist/esm/priceClient/adapters/default.js +31 -15
- package/dist/esm/priceClient/adapters/default.js.map +1 -1
- package/dist/esm/priceClient/adapters/defiLlama.js +73 -38
- package/dist/esm/priceClient/adapters/defiLlama.js.map +1 -1
- package/dist/esm/priceClient/priceClient.js +158 -109
- package/dist/esm/priceClient/priceClient.js.map +1 -1
- package/dist/esm/providers/alchemy.js +18 -16
- package/dist/esm/providers/alchemy.js.map +1 -1
- package/dist/esm/providers/cachedProvider.js +134 -99
- package/dist/esm/providers/cachedProvider.js.map +1 -1
- package/dist/esm/providers/constants.js +3 -3
- package/dist/esm/providers/constants.js.map +1 -1
- package/dist/esm/providers/drpc.js +10 -8
- package/dist/esm/providers/drpc.js.map +1 -1
- package/dist/esm/providers/infura.js +11 -9
- package/dist/esm/providers/infura.js.map +1 -1
- package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.js +15 -6
- package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.js.map +1 -1
- package/dist/esm/providers/mocks/MockRateLimitedSolanaRpcFactory.js +14 -5
- package/dist/esm/providers/mocks/MockRateLimitedSolanaRpcFactory.js.map +1 -1
- package/dist/esm/providers/mocks/MockRetrySolanaRpcFactory.js +15 -6
- package/dist/esm/providers/mocks/MockRetrySolanaRpcFactory.js.map +1 -1
- package/dist/esm/providers/mocks/MockSolanaRpcFactory.js +66 -41
- package/dist/esm/providers/mocks/MockSolanaRpcFactory.js.map +1 -1
- package/dist/esm/providers/mocks/mockEthersProvider.js +30 -27
- package/dist/esm/providers/mocks/mockEthersProvider.js.map +1 -1
- package/dist/esm/providers/quicknode.js +20 -18
- package/dist/esm/providers/quicknode.js.map +1 -1
- package/dist/esm/providers/rateLimitedProvider.js +80 -68
- package/dist/esm/providers/rateLimitedProvider.js.map +1 -1
- package/dist/esm/providers/retryProvider.js +259 -186
- package/dist/esm/providers/retryProvider.js.map +1 -1
- package/dist/esm/providers/solana/baseRpcFactories.js +19 -13
- package/dist/esm/providers/solana/baseRpcFactories.js.map +1 -1
- package/dist/esm/providers/solana/cachedRpcFactory.js +112 -75
- package/dist/esm/providers/solana/cachedRpcFactory.js.map +1 -1
- package/dist/esm/providers/solana/defaultRpcFactory.js +14 -6
- package/dist/esm/providers/solana/defaultRpcFactory.js.map +1 -1
- package/dist/esm/providers/solana/quorumFallbackRpcFactory.js +202 -149
- package/dist/esm/providers/solana/quorumFallbackRpcFactory.js.map +1 -1
- package/dist/esm/providers/solana/rateLimitedRpcFactory.js +90 -70
- package/dist/esm/providers/solana/rateLimitedRpcFactory.js.map +1 -1
- package/dist/esm/providers/solana/retryRpcFactory.js +74 -50
- package/dist/esm/providers/solana/retryRpcFactory.js.map +1 -1
- package/dist/esm/providers/solana/utils.js +1 -1
- package/dist/esm/providers/solana/utils.js.map +1 -1
- package/dist/esm/providers/speedProvider.js +51 -28
- package/dist/esm/providers/speedProvider.js.map +1 -1
- package/dist/esm/providers/types.js +2 -2
- package/dist/esm/providers/types.js.map +1 -1
- package/dist/esm/providers/utils.js +20 -17
- package/dist/esm/providers/utils.js.map +1 -1
- package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.js +152 -98
- package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.js.map +1 -1
- package/dist/esm/relayFeeCalculator/chain-queries/customGasToken.js +26 -13
- package/dist/esm/relayFeeCalculator/chain-queries/customGasToken.js.map +1 -1
- package/dist/esm/relayFeeCalculator/chain-queries/factory.js +19 -9
- package/dist/esm/relayFeeCalculator/chain-queries/factory.js.map +1 -1
- package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js +128 -83
- package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -1
- package/dist/esm/relayFeeCalculator/relayFeeCalculator.js +299 -211
- package/dist/esm/relayFeeCalculator/relayFeeCalculator.js.map +1 -1
- package/dist/esm/typeguards/error.js +5 -3
- package/dist/esm/typeguards/error.js.map +1 -1
- package/dist/esm/utils/AddressUtils.js +147 -115
- package/dist/esm/utils/AddressUtils.js.map +1 -1
- package/dist/esm/utils/ArrayUtils.js +78 -21
- package/dist/esm/utils/ArrayUtils.js.map +1 -1
- package/dist/esm/utils/BigNumberUtils.js +12 -11
- package/dist/esm/utils/BigNumberUtils.js.map +1 -1
- package/dist/esm/utils/BlockExplorerUtils.js +23 -19
- package/dist/esm/utils/BlockExplorerUtils.js.map +1 -1
- package/dist/esm/utils/BlockFinder.js +6 -2
- package/dist/esm/utils/BlockFinder.js.map +1 -1
- package/dist/esm/utils/BlockUtils.js +40 -31
- package/dist/esm/utils/BlockUtils.js.map +1 -1
- package/dist/esm/utils/BundleUtils.js +24 -21
- package/dist/esm/utils/BundleUtils.js.map +1 -1
- package/dist/esm/utils/CCTPUtils.js +123 -62
- package/dist/esm/utils/CCTPUtils.js.map +1 -1
- package/dist/esm/utils/CachingUtils.js +38 -17
- package/dist/esm/utils/CachingUtils.js.map +1 -1
- package/dist/esm/utils/ContractUtils.js +3 -3
- package/dist/esm/utils/ContractUtils.js.map +1 -1
- package/dist/esm/utils/DepositUtils.js +98 -121
- package/dist/esm/utils/DepositUtils.js.map +1 -1
- package/dist/esm/utils/EventUtils.js +69 -52
- package/dist/esm/utils/EventUtils.js.map +1 -1
- package/dist/esm/utils/FormattingUtils.js +26 -20
- package/dist/esm/utils/FormattingUtils.js.map +1 -1
- package/dist/esm/utils/HyperLiquidUtils.js +22 -8
- package/dist/esm/utils/HyperLiquidUtils.js.map +1 -1
- package/dist/esm/utils/IPFSUtils.js +35 -16
- package/dist/esm/utils/IPFSUtils.js.map +1 -1
- package/dist/esm/utils/JSONUtils.js +4 -4
- package/dist/esm/utils/JSONUtils.js.map +1 -1
- package/dist/esm/utils/LogUtils.js +12 -8
- package/dist/esm/utils/LogUtils.js.map +1 -1
- package/dist/esm/utils/Multicall.js +110 -50
- package/dist/esm/utils/Multicall.js.map +1 -1
- package/dist/esm/utils/NetworkUtils.js +28 -12
- package/dist/esm/utils/NetworkUtils.js.map +1 -1
- package/dist/esm/utils/NumberUtils.js +3 -1
- package/dist/esm/utils/NumberUtils.js.map +1 -1
- package/dist/esm/utils/ObjectUtils.js +41 -27
- package/dist/esm/utils/ObjectUtils.js.map +1 -1
- package/dist/esm/utils/Profiler.js +82 -77
- package/dist/esm/utils/Profiler.js.map +1 -1
- package/dist/esm/utils/ReviverUtils.js +7 -3
- package/dist/esm/utils/ReviverUtils.js.map +1 -1
- package/dist/esm/utils/SpokeUtils.js +78 -83
- package/dist/esm/utils/SpokeUtils.js.map +1 -1
- package/dist/esm/utils/TokenUtils.js +57 -33
- package/dist/esm/utils/TokenUtils.js.map +1 -1
- package/dist/esm/utils/ValidatorUtils.js +4 -4
- package/dist/esm/utils/ValidatorUtils.js.map +1 -1
- package/dist/esm/utils/abi/index.js +20 -10
- package/dist/esm/utils/abi/index.js.map +1 -1
- package/dist/esm/utils/abi/typechain/factories/Multicall3__factory.js +12 -8
- package/dist/esm/utils/abi/typechain/factories/Multicall3__factory.js.map +1 -1
- package/dist/esm/utils/common.js +52 -38
- package/dist/esm/utils/common.js.map +1 -1
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/gasPriceOracle/oracle.d.ts.map +1 -1
- package/dist/types/utils/Multicall.d.ts.map +1 -1
- package/dist/types/utils/NetworkUtils.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/constants.ts +1 -0
- package/src/gasPriceOracle/oracle.ts +1 -0
- package/src/utils/Multicall.ts +1 -0
- package/src/utils/NetworkUtils.ts +8 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { __assign, __awaiter, __generator, __rest, __spreadArray } from "tslib";
|
|
1
2
|
import { MessageTransmitterClient, SvmSpokeClient, TokenMessengerMinterClient } from "@across-protocol/contracts";
|
|
2
3
|
import { decodeFillStatusAccount, fetchState } from "@across-protocol/contracts/dist/src/svm/clients/SvmSpoke";
|
|
3
4
|
import { decodeMessageHeader } from "@across-protocol/contracts/dist/src/svm/web3-v1";
|
|
@@ -17,63 +18,85 @@ import { getEmergencyDeleteRootBundleRootBundleId, getNearestSlotTime, isEmergen
|
|
|
17
18
|
* @note: Average Solana slot duration is about 400-500ms. We can be conservative
|
|
18
19
|
* and choose 400 to ensure that the most slots get included in our ranges
|
|
19
20
|
*/
|
|
20
|
-
export
|
|
21
|
+
export var SLOT_DURATION_MS = 400;
|
|
21
22
|
export function getSlot(provider, commitment, logger) {
|
|
22
23
|
return _callGetSlotWithRetry(provider, commitment, logger);
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
25
|
+
function _callGetSlotWithRetry(provider, commitment, logger) {
|
|
26
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
27
|
+
var err_1, code;
|
|
28
|
+
return __generator(this, function (_a) {
|
|
29
|
+
switch (_a.label) {
|
|
30
|
+
case 0:
|
|
31
|
+
_a.trys.push([0, 2, , 3]);
|
|
32
|
+
return [4 /*yield*/, provider.getSlot({ commitment: commitment }).send()];
|
|
33
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
34
|
+
case 2:
|
|
35
|
+
err_1 = _a.sent();
|
|
36
|
+
if (isSolanaError(err_1)) {
|
|
37
|
+
code = err_1.context.__code;
|
|
38
|
+
logger === null || logger === void 0 ? void 0 : logger.debug({
|
|
39
|
+
at: "_getSlotWithRetry",
|
|
40
|
+
message: "Caught error from getSlot()",
|
|
41
|
+
code: code,
|
|
42
|
+
commitment: commitment,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// TODO: Implement retry logic once we better understand how these errors look:
|
|
46
|
+
throw err_1;
|
|
47
|
+
case 3: return [2 /*return*/];
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
|
41
51
|
}
|
|
42
52
|
/**
|
|
43
53
|
* Retrieves the chain time at a particular slot.
|
|
44
54
|
*/
|
|
45
|
-
export function getTimestampForSlot(provider, slotNumber, maxRetries
|
|
55
|
+
export function getTimestampForSlot(provider, slotNumber, maxRetries, logger) {
|
|
56
|
+
if (maxRetries === void 0) { maxRetries = 2; }
|
|
46
57
|
return _callGetTimestampForSlotWithRetry(provider, slotNumber, 0, maxRetries, logger);
|
|
47
58
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
59
|
+
function _callGetTimestampForSlotWithRetry(provider, slotNumber, retryAttempt, maxRetries, logger) {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
61
|
+
var slot, _timestamp, err_2, at, code, message, timestamp;
|
|
62
|
+
return __generator(this, function (_a) {
|
|
63
|
+
switch (_a.label) {
|
|
64
|
+
case 0:
|
|
65
|
+
slot = slotNumber.toString();
|
|
66
|
+
_a.label = 1;
|
|
67
|
+
case 1:
|
|
68
|
+
_a.trys.push([1, 3, , 4]);
|
|
69
|
+
return [4 /*yield*/, provider.getBlockTime(slotNumber).send()];
|
|
70
|
+
case 2:
|
|
71
|
+
// @note: getBlockTime receives a slot number, not a block number.
|
|
72
|
+
_timestamp = _a.sent();
|
|
73
|
+
return [3 /*break*/, 4];
|
|
74
|
+
case 3:
|
|
75
|
+
err_2 = _a.sent();
|
|
76
|
+
if (!isSolanaError(err_2)) {
|
|
77
|
+
throw err_2;
|
|
78
|
+
}
|
|
79
|
+
at = "getTimestampForSlot";
|
|
80
|
+
code = err_2.context.__code;
|
|
81
|
+
switch (code) {
|
|
82
|
+
case SVM_SLOT_SKIPPED:
|
|
83
|
+
case SVM_LONG_TERM_STORAGE_SLOT_SKIPPED:
|
|
84
|
+
// No block available for this slot; caller must decide on how to handle this.
|
|
85
|
+
return [2 /*return*/, undefined];
|
|
86
|
+
default: {
|
|
87
|
+
message = "Caught error from getBlockTime()";
|
|
88
|
+
logger === null || logger === void 0 ? void 0 : logger.debug({ at: at, message: message, errorCode: code, slot: slot, retryAttempt: retryAttempt, maxRetries: maxRetries });
|
|
89
|
+
throw new Error("Unhandled SVM getBlockTime() error for slot ".concat(slot, ": ").concat(code), { cause: err_2 });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return [3 /*break*/, 4];
|
|
93
|
+
case 4:
|
|
94
|
+
timestamp = Number(_timestamp);
|
|
95
|
+
assert(!isDefined(_timestamp) || BigInt(timestamp) === _timestamp, "Unexpected block timestamp for SVM slot ".concat(slot, ": ").concat(_timestamp));
|
|
96
|
+
return [2 /*return*/, timestamp];
|
|
70
97
|
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
// _timestamp should be a BigInt or undefined. If not undefined, ensure that conversion to number does not truncate.
|
|
74
|
-
const timestamp = Number(_timestamp);
|
|
75
|
-
assert(!isDefined(_timestamp) || BigInt(timestamp) === _timestamp, `Unexpected block timestamp for SVM slot ${slot}: ${_timestamp}`);
|
|
76
|
-
return timestamp;
|
|
98
|
+
});
|
|
99
|
+
});
|
|
77
100
|
}
|
|
78
101
|
/**
|
|
79
102
|
* Returns the current fill deadline buffer.
|
|
@@ -81,9 +104,18 @@ async function _callGetTimestampForSlotWithRetry(provider, slotNumber, retryAtte
|
|
|
81
104
|
* @param statePda Spoke Pool's State PDA
|
|
82
105
|
* @returns fill deadline buffer
|
|
83
106
|
*/
|
|
84
|
-
export
|
|
85
|
-
|
|
86
|
-
|
|
107
|
+
export function getFillDeadline(provider, statePda) {
|
|
108
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
109
|
+
var state;
|
|
110
|
+
return __generator(this, function (_a) {
|
|
111
|
+
switch (_a.label) {
|
|
112
|
+
case 0: return [4 /*yield*/, fetchState(provider, statePda)];
|
|
113
|
+
case 1:
|
|
114
|
+
state = _a.sent();
|
|
115
|
+
return [2 /*return*/, state.data.fillDeadlineBuffer];
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
87
119
|
}
|
|
88
120
|
/**
|
|
89
121
|
* Finds the deposit id at a specific block number.
|
|
@@ -123,36 +155,46 @@ export function getDepositIdAtBlock(_contract, _blockTag) {
|
|
|
123
155
|
* @param secondsLookback - The number of seconds to look back for deposits (defaults to 2 days).
|
|
124
156
|
* @returns The deposit if found within the slot window, undefined otherwise
|
|
125
157
|
*/
|
|
126
|
-
export
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
158
|
+
export function findDeposit(eventClient_1, depositId_1, logger_1, slot_1) {
|
|
159
|
+
return __awaiter(this, arguments, void 0, function (eventClient, depositId, logger, slot, secondsLookback // 2 days
|
|
160
|
+
) {
|
|
161
|
+
var provider, opts, currentSlot, endSlot, slotsInElapsed, startSlot, depositEvent, txnIndex, logIndex, blockNumber, txnRef, rawData, _a, originChainId, deposit;
|
|
162
|
+
var _b;
|
|
163
|
+
if (secondsLookback === void 0) { secondsLookback = 2 * 24 * 60 * 60; }
|
|
164
|
+
return __generator(this, function (_c) {
|
|
165
|
+
switch (_c.label) {
|
|
166
|
+
case 0:
|
|
167
|
+
// We can only perform this search when we have a safe deposit ID.
|
|
168
|
+
if (isUnsafeDepositId(depositId)) {
|
|
169
|
+
throw new Error("Cannot binary search for depositId ".concat(depositId));
|
|
170
|
+
}
|
|
171
|
+
provider = eventClient.getRpc();
|
|
172
|
+
opts = undefined;
|
|
173
|
+
return [4 /*yield*/, getNearestSlotTime(provider, opts, logger)];
|
|
174
|
+
case 1:
|
|
175
|
+
currentSlot = (_c.sent()).slot;
|
|
176
|
+
endSlot = slot !== undefined ? BigInt(Math.min(Number(slot), Number(currentSlot))) : currentSlot;
|
|
177
|
+
slotsInElapsed = BigInt(Math.round((secondsLookback * 1000) / SLOT_DURATION_MS));
|
|
178
|
+
startSlot = endSlot - slotsInElapsed;
|
|
179
|
+
return [4 /*yield*/, eventClient.queryEvents("FundsDeposited", startSlot, endSlot)];
|
|
180
|
+
case 2:
|
|
181
|
+
depositEvent = (_b = (_c.sent())) === null || _b === void 0 ? void 0 : _b.find(function (event) {
|
|
182
|
+
return depositId.eq(event.data.depositId);
|
|
183
|
+
});
|
|
184
|
+
// If no deposit event is found, return undefined
|
|
185
|
+
if (!depositEvent) {
|
|
186
|
+
return [2 /*return*/, undefined];
|
|
187
|
+
}
|
|
188
|
+
txnIndex = 0;
|
|
189
|
+
logIndex = 0;
|
|
190
|
+
blockNumber = Number(depositEvent.slot);
|
|
191
|
+
txnRef = depositEvent.signature.toString();
|
|
192
|
+
rawData = unwrapEventData(depositEvent.data, ["depositId", "outputAmount"]);
|
|
193
|
+
_a = unpackDepositEvent(__assign(__assign({}, rawData), { blockNumber: blockNumber, txnRef: txnRef, txnIndex: txnIndex, logIndex: logIndex }), CHAIN_IDs.SOLANA), originChainId = _a.originChainId, deposit = __rest(_a, ["originChainId"]);
|
|
194
|
+
return [2 /*return*/, __assign({}, deposit)];
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
});
|
|
156
198
|
}
|
|
157
199
|
/**
|
|
158
200
|
* Resolves the fill status of a deposit at a specific slot or at the current confirmed one.
|
|
@@ -167,33 +209,44 @@ export async function findDeposit(eventClient, depositId, logger, slot, secondsL
|
|
|
167
209
|
* @param atHeight - (Optional) Specific slot number to query. Defaults to the latest confirmed slot.
|
|
168
210
|
* @returns The fill status for the deposit at the specified or current slot.
|
|
169
211
|
*/
|
|
170
|
-
export
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
212
|
+
export function relayFillStatus(programId, relayData, destinationChainId, svmEventsClient, logger, atHeight) {
|
|
213
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
214
|
+
var provider, fillStatusPda, toSlot, commitment, _a, fillStatusAccount, _b, currentSlot, timestamp, decodedAccountData;
|
|
215
|
+
return __generator(this, function (_c) {
|
|
216
|
+
switch (_c.label) {
|
|
217
|
+
case 0:
|
|
218
|
+
assert(chainIsSvm(destinationChainId), "Destination chain must be an SVM chain");
|
|
219
|
+
provider = svmEventsClient.getRpc();
|
|
220
|
+
return [4 /*yield*/, getFillStatusPda(programId, relayData, destinationChainId)];
|
|
221
|
+
case 1:
|
|
222
|
+
fillStatusPda = _c.sent();
|
|
223
|
+
toSlot = BigInt(atHeight !== null && atHeight !== void 0 ? atHeight : 0);
|
|
224
|
+
if (!(atHeight === undefined)) return [3 /*break*/, 3];
|
|
225
|
+
commitment = "confirmed";
|
|
226
|
+
return [4 /*yield*/, Promise.all([
|
|
227
|
+
fetchEncodedAccount(provider, fillStatusPda, { commitment: commitment }),
|
|
228
|
+
getNearestSlotTime(provider, { commitment: commitment }, logger),
|
|
229
|
+
])];
|
|
230
|
+
case 2:
|
|
231
|
+
_a = _c.sent(), fillStatusAccount = _a[0], _b = _a[1], currentSlot = _b.slot, timestamp = _b.timestamp;
|
|
232
|
+
toSlot = currentSlot;
|
|
233
|
+
// If the PDA exists, return the stored fill status
|
|
234
|
+
if (fillStatusAccount.exists) {
|
|
235
|
+
decodedAccountData = decodeFillStatusAccount(fillStatusAccount);
|
|
236
|
+
return [2 /*return*/, decodedAccountData.data.status];
|
|
237
|
+
}
|
|
238
|
+
// If the PDA doesn't exist and the deadline hasn't passed yet, the deposit must be unfilled,
|
|
239
|
+
// since PDAs can't be closed before the fill deadline.
|
|
240
|
+
else if (timestamp < relayData.fillDeadline) {
|
|
241
|
+
return [2 /*return*/, FillStatus.Unfilled];
|
|
242
|
+
}
|
|
243
|
+
_c.label = 3;
|
|
244
|
+
case 3:
|
|
245
|
+
// If status couldn't be determined from the PDA, or if a specific slot was requested, reconstruct from events.
|
|
246
|
+
return [2 /*return*/, resolveFillStatusFromPdaEvents(fillStatusPda, toSlot, svmEventsClient)];
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
});
|
|
197
250
|
}
|
|
198
251
|
/**
|
|
199
252
|
* Resolves fill statuses for multiple deposits at a specific or latest confirmed slot,
|
|
@@ -207,53 +260,92 @@ export async function relayFillStatus(programId, relayData, destinationChainId,
|
|
|
207
260
|
* @param atHeight (Optional) The slot number to query at. If omitted, queries the latest confirmed slot.
|
|
208
261
|
* @returns An array of fill statuses for the specified deposits at the requested slot (or at the current confirmed slot).
|
|
209
262
|
*/
|
|
210
|
-
export
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
263
|
+
export function fillStatusArray(programId, relayData, destinationChainId, svmEventsClient, logger, atHeight) {
|
|
264
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
265
|
+
var provider, chunkSize, chunkedRelayData, fillStatusPdas, fillStatuses, _a, missingStatuses, missingChunked, missingResults, opts, toSlot, _b, _i, missingChunked_1, chunk_1, chunkResults;
|
|
266
|
+
var _this = this;
|
|
267
|
+
return __generator(this, function (_c) {
|
|
268
|
+
switch (_c.label) {
|
|
269
|
+
case 0:
|
|
270
|
+
assert(chainIsSvm(destinationChainId), "Destination chain must be an SVM chain");
|
|
271
|
+
provider = svmEventsClient.getRpc();
|
|
272
|
+
chunkSize = 100;
|
|
273
|
+
chunkedRelayData = chunk(relayData, chunkSize);
|
|
274
|
+
return [4 /*yield*/, Promise.all(chunkedRelayData.map(function (relayDataChunk) {
|
|
275
|
+
return Promise.all(relayDataChunk.map(function (relayData) { return getFillStatusPda(programId, relayData, destinationChainId); }));
|
|
276
|
+
}))];
|
|
277
|
+
case 1:
|
|
278
|
+
fillStatusPdas = (_c.sent()).flat();
|
|
279
|
+
if (atHeight !== undefined && logger) {
|
|
280
|
+
logger.warn({
|
|
281
|
+
at: "SvmSpokeUtils#fillStatusArray",
|
|
282
|
+
message: "Querying specific slots for large arrays is slow. For current status, omit 'atHeight' param to use latest confirmed slot instead.",
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
if (!(atHeight === undefined)) return [3 /*break*/, 3];
|
|
286
|
+
return [4 /*yield*/, fetchBatchFillStatusFromPdaAccounts(provider, fillStatusPdas, relayData, logger)];
|
|
287
|
+
case 2:
|
|
288
|
+
_a = _c.sent();
|
|
289
|
+
return [3 /*break*/, 4];
|
|
290
|
+
case 3:
|
|
291
|
+
_a = new Array(relayData.length).fill(undefined);
|
|
292
|
+
_c.label = 4;
|
|
293
|
+
case 4:
|
|
294
|
+
fillStatuses = _a;
|
|
295
|
+
missingStatuses = fillStatuses.reduce(function (acc, status, index) {
|
|
296
|
+
if (status === undefined) {
|
|
297
|
+
acc.push(index);
|
|
298
|
+
}
|
|
299
|
+
return acc;
|
|
300
|
+
}, []);
|
|
301
|
+
missingChunked = chunk(missingStatuses, chunkSize);
|
|
302
|
+
missingResults = [];
|
|
303
|
+
opts = undefined;
|
|
304
|
+
if (!atHeight) return [3 /*break*/, 5];
|
|
305
|
+
_b = BigInt(atHeight);
|
|
306
|
+
return [3 /*break*/, 7];
|
|
307
|
+
case 5: return [4 /*yield*/, getNearestSlotTime(provider, opts, logger)];
|
|
308
|
+
case 6:
|
|
309
|
+
_b = (_c.sent()).slot;
|
|
310
|
+
_c.label = 7;
|
|
311
|
+
case 7:
|
|
312
|
+
toSlot = _b;
|
|
313
|
+
_i = 0, missingChunked_1 = missingChunked;
|
|
314
|
+
_c.label = 8;
|
|
315
|
+
case 8:
|
|
316
|
+
if (!(_i < missingChunked_1.length)) return [3 /*break*/, 11];
|
|
317
|
+
chunk_1 = missingChunked_1[_i];
|
|
318
|
+
return [4 /*yield*/, Promise.all(chunk_1.map(function (missingIndex) { return __awaiter(_this, void 0, void 0, function () {
|
|
319
|
+
var _a;
|
|
320
|
+
return __generator(this, function (_b) {
|
|
321
|
+
switch (_b.label) {
|
|
322
|
+
case 0:
|
|
323
|
+
_a = {
|
|
324
|
+
index: missingIndex
|
|
325
|
+
};
|
|
326
|
+
return [4 /*yield*/, resolveFillStatusFromPdaEvents(fillStatusPdas[missingIndex], toSlot, svmEventsClient)];
|
|
327
|
+
case 1: return [2 /*return*/, (_a.fillStatus = _b.sent(),
|
|
328
|
+
_a)];
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
}); }))];
|
|
332
|
+
case 9:
|
|
333
|
+
chunkResults = _c.sent();
|
|
334
|
+
missingResults.push.apply(missingResults, chunkResults);
|
|
335
|
+
_c.label = 10;
|
|
336
|
+
case 10:
|
|
337
|
+
_i++;
|
|
338
|
+
return [3 /*break*/, 8];
|
|
339
|
+
case 11:
|
|
340
|
+
// Fill in missing statuses back to the result array
|
|
341
|
+
missingResults.forEach(function (_a) {
|
|
342
|
+
var index = _a.index, fillStatus = _a.fillStatus;
|
|
343
|
+
fillStatuses[index] = fillStatus;
|
|
344
|
+
});
|
|
345
|
+
return [2 /*return*/, fillStatuses];
|
|
346
|
+
}
|
|
221
347
|
});
|
|
222
|
-
}
|
|
223
|
-
// If no specific slot is requested, try fetching current statuses from PDAs
|
|
224
|
-
// Otherwise, initialize all statuses as undefined
|
|
225
|
-
const fillStatuses = atHeight === undefined
|
|
226
|
-
? await fetchBatchFillStatusFromPdaAccounts(provider, fillStatusPdas, relayData, logger)
|
|
227
|
-
: new Array(relayData.length).fill(undefined);
|
|
228
|
-
// Collect indices of deposits that still need their status resolved
|
|
229
|
-
const missingStatuses = fillStatuses.reduce((acc, status, index) => {
|
|
230
|
-
if (status === undefined) {
|
|
231
|
-
acc.push(index);
|
|
232
|
-
}
|
|
233
|
-
return acc;
|
|
234
|
-
}, []);
|
|
235
|
-
// Chunk the missing deposits for batch processing
|
|
236
|
-
const missingChunked = chunk(missingStatuses, chunkSize);
|
|
237
|
-
const missingResults = [];
|
|
238
|
-
// Determine the toSlot to use for event reconstruction
|
|
239
|
-
const opts = undefined;
|
|
240
|
-
const toSlot = atHeight ? BigInt(atHeight) : (await getNearestSlotTime(provider, opts, logger)).slot;
|
|
241
|
-
// @note: This path is mostly used for deposits past their fill deadline.
|
|
242
|
-
// If it becomes a bottleneck, consider returning an "Unknown" status that can be handled downstream.
|
|
243
|
-
for (const chunk of missingChunked) {
|
|
244
|
-
const chunkResults = await Promise.all(chunk.map(async (missingIndex) => {
|
|
245
|
-
return {
|
|
246
|
-
index: missingIndex,
|
|
247
|
-
fillStatus: await resolveFillStatusFromPdaEvents(fillStatusPdas[missingIndex], toSlot, svmEventsClient),
|
|
248
|
-
};
|
|
249
|
-
}));
|
|
250
|
-
missingResults.push(...chunkResults);
|
|
251
|
-
}
|
|
252
|
-
// Fill in missing statuses back to the result array
|
|
253
|
-
missingResults.forEach(({ index, fillStatus }) => {
|
|
254
|
-
fillStatuses[index] = fillStatus;
|
|
255
348
|
});
|
|
256
|
-
return fillStatuses;
|
|
257
349
|
}
|
|
258
350
|
/**
|
|
259
351
|
* Finds the `FilledRelay` event for a given deposit within the provided slot range.
|
|
@@ -265,23 +357,43 @@ export async function fillStatusArray(programId, relayData, destinationChainId,
|
|
|
265
357
|
* @param toSlot (Optional) Ending slot to search. If not provided, the current confirmed slot will be used.
|
|
266
358
|
* @returns The fill event with block info, or `undefined` if not found.
|
|
267
359
|
*/
|
|
268
|
-
export
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
360
|
+
export function findFillEvent(relayData, destinationChainId, svmEventsClient, fromSlot, toSlot, logger) {
|
|
361
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
362
|
+
var opts, _a, _b, programId, fillStatusPda, fillEvents, rawEvent, rawFill, fill;
|
|
363
|
+
return __generator(this, function (_c) {
|
|
364
|
+
switch (_c.label) {
|
|
365
|
+
case 0:
|
|
366
|
+
assert(chainIsSvm(destinationChainId), "Destination chain must be an SVM chain");
|
|
367
|
+
opts = undefined;
|
|
368
|
+
if (!(toSlot !== null && toSlot !== void 0)) return [3 /*break*/, 1];
|
|
369
|
+
_a = toSlot;
|
|
370
|
+
return [3 /*break*/, 3];
|
|
371
|
+
case 1:
|
|
372
|
+
_b = Number;
|
|
373
|
+
return [4 /*yield*/, getNearestSlotTime(svmEventsClient.getRpc(), opts, logger)];
|
|
374
|
+
case 2:
|
|
375
|
+
_a = (toSlot = _b.apply(void 0, [(_c.sent()).slot]));
|
|
376
|
+
_c.label = 3;
|
|
377
|
+
case 3:
|
|
378
|
+
_a;
|
|
379
|
+
programId = svmEventsClient.getProgramAddress();
|
|
380
|
+
return [4 /*yield*/, getFillStatusPda(programId, relayData, destinationChainId)];
|
|
381
|
+
case 4:
|
|
382
|
+
fillStatusPda = _c.sent();
|
|
383
|
+
return [4 /*yield*/, svmEventsClient.queryDerivedAddressEvents(SVMEventNames.FilledRelay, fillStatusPda, BigInt(fromSlot), BigInt(toSlot), { limit: 10 })];
|
|
384
|
+
case 5:
|
|
385
|
+
fillEvents = _c.sent();
|
|
386
|
+
assert(fillEvents.length <= 1, "Expected at most one fill event for ".concat(fillStatusPda, ", got ").concat(fillEvents.length));
|
|
387
|
+
rawEvent = fillEvents[0];
|
|
388
|
+
if (!isDefined(rawEvent)) {
|
|
389
|
+
return [2 /*return*/];
|
|
390
|
+
}
|
|
391
|
+
rawFill = unwrapEventData(rawEvent.data, ["depositId", "inputAmount"]);
|
|
392
|
+
fill = unpackFillEvent(rawFill, destinationChainId);
|
|
393
|
+
return [2 /*return*/, fill];
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
});
|
|
285
397
|
}
|
|
286
398
|
/**
|
|
287
399
|
* @param spokePool Address (program ID) of the SvmSpoke.
|
|
@@ -290,35 +402,45 @@ export async function findFillEvent(relayData, destinationChainId, svmEventsClie
|
|
|
290
402
|
* @param repaymentChainId Optional repaymentChainId (defaults to destinationChainId).
|
|
291
403
|
* @returns An Ethers UnsignedTransaction instance.
|
|
292
404
|
*/
|
|
293
|
-
export
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
405
|
+
export function fillRelayInstruction(spokePool, relayData, signer, recipientTokenAccount, repaymentAddress, repaymentChainId) {
|
|
406
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
407
|
+
var program, messageHash, _relayDataHash, relayDataHash, relayer, _a, statePda, fillStatusPda, eventAuthority, delegatePda, relayerTokenAccount, svmRelayData;
|
|
408
|
+
return __generator(this, function (_b) {
|
|
409
|
+
switch (_b.label) {
|
|
410
|
+
case 0:
|
|
411
|
+
program = toAddress(spokePool);
|
|
412
|
+
assert(repaymentAddress.isValidOn(repaymentChainId), "Invalid repayment address for chain ".concat(repaymentChainId, ": ").concat(repaymentAddress.toNative(), "."));
|
|
413
|
+
messageHash = getMessageHash(relayData.message);
|
|
414
|
+
_relayDataHash = getRelayDataHash(__assign(__assign({}, relayData), { messageHash: messageHash }), relayData.destinationChainId);
|
|
415
|
+
relayDataHash = new Uint8Array(Buffer.from(_relayDataHash.slice(2), "hex"));
|
|
416
|
+
relayer = SvmAddress.from(signer.address);
|
|
417
|
+
return [4 /*yield*/, Promise.all([
|
|
418
|
+
getStatePda(program),
|
|
419
|
+
getFillStatusPda(program, relayData, relayData.destinationChainId),
|
|
420
|
+
getEventAuthority(program),
|
|
421
|
+
getFillRelayDelegatePda(relayDataHash, BigInt(repaymentChainId), signer.address, program),
|
|
422
|
+
getAssociatedTokenAddress(relayer, relayData.outputToken),
|
|
423
|
+
])];
|
|
424
|
+
case 1:
|
|
425
|
+
_a = _b.sent(), statePda = _a[0], fillStatusPda = _a[1], eventAuthority = _a[2], delegatePda = _a[3], relayerTokenAccount = _a[4];
|
|
426
|
+
svmRelayData = toSvmRelayData(relayData);
|
|
427
|
+
return [2 /*return*/, SvmSpokeClient.getFillRelayInstruction({
|
|
428
|
+
signer: signer,
|
|
429
|
+
state: statePda,
|
|
430
|
+
delegate: toAddress(SvmAddress.from(delegatePda.toString())),
|
|
431
|
+
mint: svmRelayData.outputToken,
|
|
432
|
+
relayerTokenAccount: relayerTokenAccount,
|
|
433
|
+
recipientTokenAccount: recipientTokenAccount,
|
|
434
|
+
fillStatus: fillStatusPda,
|
|
435
|
+
eventAuthority: eventAuthority,
|
|
436
|
+
program: program,
|
|
437
|
+
relayHash: relayDataHash,
|
|
438
|
+
relayData: some(svmRelayData),
|
|
439
|
+
repaymentChainId: some(BigInt(repaymentChainId)),
|
|
440
|
+
repaymentAddress: some(toAddress(repaymentAddress)),
|
|
441
|
+
})];
|
|
442
|
+
}
|
|
443
|
+
});
|
|
322
444
|
});
|
|
323
445
|
}
|
|
324
446
|
/**
|
|
@@ -342,56 +464,70 @@ export function createTokenAccountsInstruction(mint, relayer) {
|
|
|
342
464
|
* @param repaymentAddress Address to which repayment will go to on repaymentChainId
|
|
343
465
|
* @returns FillRelay transaction
|
|
344
466
|
*/
|
|
345
|
-
export
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
467
|
+
export function getFillRelayTx(spokePoolAddr, solanaClient, relayData, signer, repaymentChainId, repaymentAddress) {
|
|
468
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
469
|
+
var svmRelayData, program, messageHash, _relayDataHash, relayDataHash, _a, state, delegate, mintInfo, fillStatus, eventAuthority, _b, recipientAta, relayerAta, recipientAtaEncodedAccount, remainingAccounts, acrossPlusMessage_1, fillInput;
|
|
470
|
+
return __generator(this, function (_c) {
|
|
471
|
+
switch (_c.label) {
|
|
472
|
+
case 0:
|
|
473
|
+
svmRelayData = toSvmRelayData(relayData);
|
|
474
|
+
assert(repaymentAddress.isValidOn(repaymentChainId), "getFillRelayTx: repayment address ".concat(repaymentAddress, " not valid on chain ").concat(repaymentChainId, ")"));
|
|
475
|
+
program = toAddress(spokePoolAddr);
|
|
476
|
+
messageHash = getMessageHash(relayData.message);
|
|
477
|
+
_relayDataHash = getRelayDataHash(__assign(__assign({}, relayData), { messageHash: messageHash }), relayData.destinationChainId);
|
|
478
|
+
relayDataHash = new Uint8Array(Buffer.from(_relayDataHash.slice(2), "hex"));
|
|
479
|
+
return [4 /*yield*/, Promise.all([
|
|
480
|
+
getStatePda(program),
|
|
481
|
+
getFillRelayDelegatePda(relayDataHash, BigInt(repaymentChainId), toAddress(repaymentAddress), program),
|
|
482
|
+
getMintInfo(solanaClient, svmRelayData.outputToken),
|
|
483
|
+
getFillStatusPda(program, relayData, relayData.destinationChainId),
|
|
484
|
+
getEventAuthority(program),
|
|
485
|
+
])];
|
|
486
|
+
case 1:
|
|
487
|
+
_a = _c.sent(), state = _a[0], delegate = _a[1], mintInfo = _a[2], fillStatus = _a[3], eventAuthority = _a[4];
|
|
488
|
+
return [4 /*yield*/, Promise.all([
|
|
489
|
+
getAssociatedTokenAddress(relayData.recipient, relayData.outputToken, mintInfo.programAddress),
|
|
490
|
+
getAssociatedTokenAddress(SvmAddress.from(signer.address), relayData.outputToken, mintInfo.programAddress),
|
|
491
|
+
])];
|
|
492
|
+
case 2:
|
|
493
|
+
_b = _c.sent(), recipientAta = _b[0], relayerAta = _b[1];
|
|
494
|
+
return [4 /*yield*/, fetchEncodedAccount(solanaClient, recipientAta)];
|
|
495
|
+
case 3:
|
|
496
|
+
recipientAtaEncodedAccount = _c.sent();
|
|
497
|
+
remainingAccounts = [];
|
|
498
|
+
if (relayData.message !== "0x") {
|
|
499
|
+
acrossPlusMessage_1 = deserializeMessage(relayData.message);
|
|
500
|
+
// The first `remainingAccount` _must_ be the handler address.
|
|
501
|
+
// https://github.com/across-protocol/contracts/blob/3310f8dc716407a5f97ef5fd2eae63df83251f2f/programs/svm-spoke/src/utils/message_utils.rs#L36.
|
|
502
|
+
remainingAccounts.push(getAccountMeta(acrossPlusMessage_1.handler, true));
|
|
503
|
+
remainingAccounts.push.apply(remainingAccounts, acrossPlusMessage_1.accounts.map(function (account, idx) {
|
|
504
|
+
return getAccountMeta(account, idx < acrossPlusMessage_1.accounts.length - acrossPlusMessage_1.read_only_len);
|
|
505
|
+
}));
|
|
506
|
+
}
|
|
507
|
+
fillInput = {
|
|
508
|
+
signer: signer,
|
|
509
|
+
state: state,
|
|
510
|
+
delegate: delegate,
|
|
511
|
+
mint: svmRelayData.outputToken,
|
|
512
|
+
relayerTokenAccount: relayerAta,
|
|
513
|
+
recipientTokenAccount: recipientAta,
|
|
514
|
+
fillStatus: fillStatus,
|
|
515
|
+
tokenProgram: mintInfo.programAddress,
|
|
516
|
+
associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
|
|
517
|
+
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
518
|
+
eventAuthority: eventAuthority,
|
|
519
|
+
program: program,
|
|
520
|
+
relayHash: relayDataHash,
|
|
521
|
+
relayData: svmRelayData,
|
|
522
|
+
repaymentChainId: BigInt(repaymentChainId),
|
|
523
|
+
repaymentAddress: toAddress(repaymentAddress),
|
|
524
|
+
};
|
|
525
|
+
// Pass createRecipientAtaIfNeeded =true to the createFillInstruction function to create the recipient token account
|
|
526
|
+
// if it doesn't exist.
|
|
527
|
+
return [2 /*return*/, createFillInstruction(signer, solanaClient, fillInput, svmRelayData, mintInfo.data.decimals, !recipientAtaEncodedAccount.exists, remainingAccounts)];
|
|
528
|
+
}
|
|
529
|
+
});
|
|
530
|
+
});
|
|
395
531
|
}
|
|
396
532
|
/**
|
|
397
533
|
* Creates a fill instruction with an instruction params PDA as the relayData input.
|
|
@@ -403,55 +539,69 @@ export async function getFillRelayTx(spokePoolAddr, solanaClient, relayData, sig
|
|
|
403
539
|
* @param repaymentAddress Address to which repayment will go to on repaymentChainId
|
|
404
540
|
* @returns FillRelay transaction
|
|
405
541
|
*/
|
|
406
|
-
export
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
542
|
+
export function getIPFillRelayTx(spokePoolAddr, solanaClient, relayData, signer, repaymentChainId, repaymentAddress) {
|
|
543
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
544
|
+
var program, _relayDataHash, relayDataHash, _a, state, delegate, instructionParams, mint, mintInfo, _b, recipientAta, relayerAta, fillStatus, eventAuthority, remainingAccounts, acrossPlusMessage_2, fillInput;
|
|
545
|
+
return __generator(this, function (_c) {
|
|
546
|
+
switch (_c.label) {
|
|
547
|
+
case 0:
|
|
548
|
+
program = toAddress(spokePoolAddr);
|
|
549
|
+
_relayDataHash = getRelayDataHash(__assign(__assign({}, relayData), { messageHash: getMessageHash(relayData.message) }), relayData.destinationChainId);
|
|
550
|
+
relayDataHash = new Uint8Array(Buffer.from(_relayDataHash.slice(2), "hex"));
|
|
551
|
+
return [4 /*yield*/, Promise.all([
|
|
552
|
+
getStatePda(program),
|
|
553
|
+
getFillRelayDelegatePda(relayDataHash, BigInt(repaymentChainId), toAddress(repaymentAddress), program),
|
|
554
|
+
getInstructionParamsPda(program, signer.address),
|
|
555
|
+
])];
|
|
556
|
+
case 1:
|
|
557
|
+
_a = _c.sent(), state = _a[0], delegate = _a[1], instructionParams = _a[2];
|
|
558
|
+
mint = toAddress(relayData.outputToken);
|
|
559
|
+
return [4 /*yield*/, getMintInfo(solanaClient, mint)];
|
|
560
|
+
case 2:
|
|
561
|
+
mintInfo = _c.sent();
|
|
562
|
+
return [4 /*yield*/, Promise.all([
|
|
563
|
+
getAssociatedTokenAddress(relayData.recipient, relayData.outputToken, mintInfo.programAddress),
|
|
564
|
+
getAssociatedTokenAddress(SvmAddress.from(signer.address), relayData.outputToken, mintInfo.programAddress),
|
|
565
|
+
getFillStatusPda(program, relayData, relayData.destinationChainId),
|
|
566
|
+
getEventAuthority(program),
|
|
567
|
+
])];
|
|
568
|
+
case 3:
|
|
569
|
+
_b = _c.sent(), recipientAta = _b[0], relayerAta = _b[1], fillStatus = _b[2], eventAuthority = _b[3];
|
|
570
|
+
remainingAccounts = [];
|
|
571
|
+
if (relayData.message !== "0x") {
|
|
572
|
+
acrossPlusMessage_2 = deserializeMessage(relayData.message);
|
|
573
|
+
// The first `remainingAccount` _must_ be the handler address.
|
|
574
|
+
// https://github.com/across-protocol/contracts/blob/3310f8dc716407a5f97ef5fd2eae63df83251f2f/programs/svm-spoke/src/utils/message_utils.rs#L36.
|
|
575
|
+
remainingAccounts.push(getAccountMeta(acrossPlusMessage_2.handler, true));
|
|
576
|
+
remainingAccounts.push.apply(remainingAccounts, acrossPlusMessage_2.accounts.map(function (account, idx) {
|
|
577
|
+
return getAccountMeta(account, idx < acrossPlusMessage_2.accounts.length - acrossPlusMessage_2.read_only_len);
|
|
578
|
+
}));
|
|
579
|
+
}
|
|
580
|
+
fillInput = {
|
|
581
|
+
signer: signer,
|
|
582
|
+
state: state,
|
|
583
|
+
delegate: delegate,
|
|
584
|
+
mint: mint,
|
|
585
|
+
relayerTokenAccount: relayerAta,
|
|
586
|
+
recipientTokenAccount: recipientAta,
|
|
587
|
+
fillStatus: fillStatus,
|
|
588
|
+
tokenProgram: mintInfo.programAddress,
|
|
589
|
+
associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
|
|
590
|
+
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
591
|
+
eventAuthority: eventAuthority,
|
|
592
|
+
program: program,
|
|
593
|
+
instructionParams: instructionParams,
|
|
594
|
+
relayHash: relayDataHash,
|
|
595
|
+
relayData: null,
|
|
596
|
+
repaymentChainId: null,
|
|
597
|
+
repaymentAddress: null,
|
|
598
|
+
};
|
|
599
|
+
// Pass createRecipientAtaIfNeeded =true to the createFillInstruction function to create the recipient token account
|
|
600
|
+
// if it doesn't exist.
|
|
601
|
+
return [2 /*return*/, createFillInstruction(signer, solanaClient, fillInput, { outputAmount: relayData.outputAmount.toBigInt(), recipient: toAddress(relayData.recipient) }, mintInfo.data.decimals, true, remainingAccounts)];
|
|
602
|
+
}
|
|
603
|
+
});
|
|
604
|
+
});
|
|
455
605
|
}
|
|
456
606
|
/**
|
|
457
607
|
* Creates a fill instruction.
|
|
@@ -462,38 +612,60 @@ export async function getIPFillRelayTx(spokePoolAddr, solanaClient, relayData, s
|
|
|
462
612
|
* @param createRecipientAta - Whether to create a recipient token account.
|
|
463
613
|
* @returns The fill instruction.
|
|
464
614
|
*/
|
|
465
|
-
export
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
615
|
+
export var createFillInstruction = function (signer_1, solanaClient_1, fillInput_1, relayData_1, tokenDecimals_1) {
|
|
616
|
+
var args_1 = [];
|
|
617
|
+
for (var _i = 5; _i < arguments.length; _i++) {
|
|
618
|
+
args_1[_i - 5] = arguments[_i];
|
|
619
|
+
}
|
|
620
|
+
return __awaiter(void 0, __spreadArray([signer_1, solanaClient_1, fillInput_1, relayData_1, tokenDecimals_1], args_1, true), void 0, function (signer, solanaClient, fillInput, relayData, tokenDecimals, createRecipientAta, remainingAccounts) {
|
|
621
|
+
var mintInfo, approveIx, getCreateAssociatedTokenIx, createFillIx, _a;
|
|
622
|
+
var _b;
|
|
623
|
+
if (createRecipientAta === void 0) { createRecipientAta = false; }
|
|
624
|
+
if (remainingAccounts === void 0) { remainingAccounts = []; }
|
|
625
|
+
return __generator(this, function (_c) {
|
|
626
|
+
switch (_c.label) {
|
|
627
|
+
case 0: return [4 /*yield*/, getMintInfo(solanaClient, fillInput.mint)];
|
|
628
|
+
case 1:
|
|
629
|
+
mintInfo = _c.sent();
|
|
630
|
+
approveIx = getApproveCheckedInstruction({
|
|
631
|
+
source: fillInput.relayerTokenAccount,
|
|
632
|
+
mint: fillInput.mint,
|
|
633
|
+
delegate: fillInput.delegate,
|
|
634
|
+
owner: fillInput.signer,
|
|
635
|
+
amount: relayData.outputAmount,
|
|
636
|
+
decimals: tokenDecimals,
|
|
637
|
+
}, {
|
|
638
|
+
programAddress: mintInfo.programAddress,
|
|
639
|
+
});
|
|
640
|
+
getCreateAssociatedTokenIx = function () {
|
|
641
|
+
return getCreateAssociatedTokenInstruction({
|
|
642
|
+
payer: signer,
|
|
643
|
+
owner: relayData.recipient,
|
|
644
|
+
mint: fillInput.mint,
|
|
645
|
+
ata: fillInput.recipientTokenAccount,
|
|
646
|
+
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
647
|
+
tokenProgram: fillInput.tokenProgram,
|
|
648
|
+
});
|
|
649
|
+
};
|
|
650
|
+
createFillIx = SvmSpokeClient.getFillRelayInstruction(fillInput);
|
|
651
|
+
// Add remaining accounts.
|
|
652
|
+
(_b = createFillIx.accounts).push.apply(_b, remainingAccounts);
|
|
653
|
+
_a = pipe;
|
|
654
|
+
return [4 /*yield*/, createDefaultTransaction(solanaClient, signer)];
|
|
655
|
+
case 2: return [2 /*return*/, _a.apply(void 0, [_c.sent(), function (tx) { return (createRecipientAta ? appendTransactionMessageInstruction(getCreateAssociatedTokenIx(), tx) : tx); },
|
|
656
|
+
function (tx) { return appendTransactionMessageInstruction(approveIx, tx); },
|
|
657
|
+
function (tx) { return appendTransactionMessageInstruction(createFillIx, tx); }])];
|
|
658
|
+
}
|
|
659
|
+
});
|
|
484
660
|
});
|
|
485
|
-
const createFillIx = SvmSpokeClient.getFillRelayInstruction(fillInput);
|
|
486
|
-
// Add remaining accounts.
|
|
487
|
-
createFillIx.accounts.push(...remainingAccounts);
|
|
488
|
-
return pipe(await createDefaultTransaction(solanaClient, signer), (tx) => (createRecipientAta ? appendTransactionMessageInstruction(getCreateAssociatedTokenIx(), tx) : tx), (tx) => appendTransactionMessageInstruction(approveIx, tx), (tx) => appendTransactionMessageInstruction(createFillIx, tx));
|
|
489
661
|
};
|
|
490
662
|
export function deserializeMessage(_message) {
|
|
491
|
-
|
|
663
|
+
var message = new Uint8Array(Buffer.from(_message.startsWith("0x") ? _message.slice(2) : _message, "hex"));
|
|
492
664
|
// Add remaining accounts if the relayData has a non-empty message.
|
|
493
665
|
// @dev ! since in the context of creating a `fillRelayTx`, `relayData` must be defined.
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
666
|
+
var acrossPlusMessageDecoder = getAcrossPlusMessageDecoder();
|
|
667
|
+
var deserialized = acrossPlusMessageDecoder.decode(message);
|
|
668
|
+
var valueAmountMethod2 = extractValueAmount(message);
|
|
497
669
|
assert(deserialized.value_amount === valueAmountMethod2, "svm | deserializeMessage: Deserialization mismatch for value_amount");
|
|
498
670
|
return deserialized;
|
|
499
671
|
}
|
|
@@ -506,28 +678,51 @@ export function deserializeMessage(_message) {
|
|
|
506
678
|
* @param createVaultAtaIfNeeded - Whether to create a vault token account.
|
|
507
679
|
* @returns The deposit instruction.
|
|
508
680
|
*/
|
|
509
|
-
export
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
681
|
+
export var createDepositInstruction = function (signer_1, solanaClient_1, depositInput_1, tokenDecimals_1) {
|
|
682
|
+
var args_1 = [];
|
|
683
|
+
for (var _i = 4; _i < arguments.length; _i++) {
|
|
684
|
+
args_1[_i - 4] = arguments[_i];
|
|
685
|
+
}
|
|
686
|
+
return __awaiter(void 0, __spreadArray([signer_1, solanaClient_1, depositInput_1, tokenDecimals_1], args_1, true), void 0, function (signer, solanaClient, depositInput, tokenDecimals, createVaultAtaIfNeeded) {
|
|
687
|
+
var getCreateAssociatedTokenIdempotentIx, mintInfo, approveIx, depositIx, _a;
|
|
688
|
+
if (createVaultAtaIfNeeded === void 0) { createVaultAtaIfNeeded = true; }
|
|
689
|
+
return __generator(this, function (_b) {
|
|
690
|
+
switch (_b.label) {
|
|
691
|
+
case 0:
|
|
692
|
+
getCreateAssociatedTokenIdempotentIx = function () {
|
|
693
|
+
return getCreateAssociatedTokenIdempotentInstruction({
|
|
694
|
+
payer: signer,
|
|
695
|
+
owner: depositInput.state,
|
|
696
|
+
mint: depositInput.mint,
|
|
697
|
+
ata: depositInput.vault,
|
|
698
|
+
systemProgram: depositInput.systemProgram,
|
|
699
|
+
tokenProgram: depositInput.tokenProgram,
|
|
700
|
+
});
|
|
701
|
+
};
|
|
702
|
+
return [4 /*yield*/, getMintInfo(solanaClient, depositInput.mint)];
|
|
703
|
+
case 1:
|
|
704
|
+
mintInfo = _b.sent();
|
|
705
|
+
approveIx = getApproveCheckedInstruction({
|
|
706
|
+
source: depositInput.depositorTokenAccount,
|
|
707
|
+
mint: depositInput.mint,
|
|
708
|
+
delegate: depositInput.delegate,
|
|
709
|
+
owner: depositInput.depositor,
|
|
710
|
+
amount: depositInput.inputAmount,
|
|
711
|
+
decimals: tokenDecimals,
|
|
712
|
+
}, {
|
|
713
|
+
programAddress: mintInfo.programAddress,
|
|
714
|
+
});
|
|
715
|
+
depositIx = SvmSpokeClient.getDepositInstruction(depositInput);
|
|
716
|
+
_a = pipe;
|
|
717
|
+
return [4 /*yield*/, createDefaultTransaction(solanaClient, signer)];
|
|
718
|
+
case 2: return [2 /*return*/, _a.apply(void 0, [_b.sent(), function (tx) {
|
|
719
|
+
return createVaultAtaIfNeeded ? appendTransactionMessageInstruction(getCreateAssociatedTokenIdempotentIx(), tx) : tx;
|
|
720
|
+
},
|
|
721
|
+
function (tx) { return appendTransactionMessageInstruction(approveIx, tx); },
|
|
722
|
+
function (tx) { return appendTransactionMessageInstruction(depositIx, tx); }])];
|
|
723
|
+
}
|
|
724
|
+
});
|
|
528
725
|
});
|
|
529
|
-
const depositIx = SvmSpokeClient.getDepositInstruction(depositInput);
|
|
530
|
-
return pipe(await createDefaultTransaction(solanaClient, signer), (tx) => createVaultAtaIfNeeded ? appendTransactionMessageInstruction(getCreateAssociatedTokenIdempotentIx(), tx) : tx, (tx) => appendTransactionMessageInstruction(approveIx, tx), (tx) => appendTransactionMessageInstruction(depositIx, tx));
|
|
531
726
|
};
|
|
532
727
|
/**
|
|
533
728
|
* Creates a request slow fill instruction.
|
|
@@ -536,10 +731,20 @@ export const createDepositInstruction = async (signer, solanaClient, depositInpu
|
|
|
536
731
|
* @param requestSlowFillInput - The input arguments for the `requestSlowFill` instruction.
|
|
537
732
|
* @returns The request slow fill instruction.
|
|
538
733
|
*/
|
|
539
|
-
export
|
|
540
|
-
|
|
541
|
-
return
|
|
542
|
-
|
|
734
|
+
export var createRequestSlowFillInstruction = function (signer, solanaClient, requestSlowFillInput) { return __awaiter(void 0, void 0, void 0, function () {
|
|
735
|
+
var requestSlowFillIx, _a;
|
|
736
|
+
return __generator(this, function (_b) {
|
|
737
|
+
switch (_b.label) {
|
|
738
|
+
case 0:
|
|
739
|
+
requestSlowFillIx = SvmSpokeClient.getRequestSlowFillInstruction(requestSlowFillInput);
|
|
740
|
+
_a = pipe;
|
|
741
|
+
return [4 /*yield*/, createDefaultTransaction(solanaClient, signer)];
|
|
742
|
+
case 1: return [2 /*return*/, _a.apply(void 0, [_b.sent(), function (tx) {
|
|
743
|
+
return appendTransactionMessageInstruction(requestSlowFillIx, tx);
|
|
744
|
+
}])];
|
|
745
|
+
}
|
|
746
|
+
});
|
|
747
|
+
}); };
|
|
543
748
|
/**
|
|
544
749
|
* @notice Return the requestSlowFill transaction for a given deposit
|
|
545
750
|
* @param spokePoolAddr Address of the spoke pool we're trying to fill through
|
|
@@ -548,27 +753,37 @@ export const createRequestSlowFillInstruction = async (signer, solanaClient, req
|
|
|
548
753
|
* @param signer signer associated with the relayer creating a Fill.
|
|
549
754
|
* @returns requestSlowFill transaction
|
|
550
755
|
*/
|
|
551
|
-
export
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
756
|
+
export function getSlowFillRequestTx(spokePoolAddr, solanaClient, relayData, signer) {
|
|
757
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
758
|
+
var program, messageHash, relayDataHash, _a, state, fillStatus, eventAuthority, svmRelayData, requestSlowFillInput;
|
|
759
|
+
return __generator(this, function (_b) {
|
|
760
|
+
switch (_b.label) {
|
|
761
|
+
case 0:
|
|
762
|
+
program = toAddress(spokePoolAddr);
|
|
763
|
+
messageHash = getMessageHash(relayData.message);
|
|
764
|
+
relayDataHash = getRelayDataHash(__assign(__assign({}, relayData), { messageHash: messageHash }), relayData.destinationChainId);
|
|
765
|
+
return [4 /*yield*/, Promise.all([
|
|
766
|
+
getStatePda(program),
|
|
767
|
+
getFillStatusPda(program, relayData, relayData.destinationChainId),
|
|
768
|
+
getEventAuthority(program),
|
|
769
|
+
])];
|
|
770
|
+
case 1:
|
|
771
|
+
_a = _b.sent(), state = _a[0], fillStatus = _a[1], eventAuthority = _a[2];
|
|
772
|
+
svmRelayData = toSvmRelayData(relayData);
|
|
773
|
+
requestSlowFillInput = {
|
|
774
|
+
signer: signer,
|
|
775
|
+
state: state,
|
|
776
|
+
fillStatus: fillStatus,
|
|
777
|
+
eventAuthority: eventAuthority,
|
|
778
|
+
program: program,
|
|
779
|
+
relayHash: arrayify(relayDataHash),
|
|
780
|
+
relayData: svmRelayData,
|
|
781
|
+
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
782
|
+
};
|
|
783
|
+
return [2 /*return*/, createRequestSlowFillInstruction(signer, solanaClient, requestSlowFillInput)];
|
|
784
|
+
}
|
|
785
|
+
});
|
|
786
|
+
});
|
|
572
787
|
}
|
|
573
788
|
/**
|
|
574
789
|
* Creates a close fill PDA instruction.
|
|
@@ -577,71 +792,116 @@ export async function getSlowFillRequestTx(spokePoolAddr, solanaClient, relayDat
|
|
|
577
792
|
* @param fillStatusPda - The fill status PDA.
|
|
578
793
|
* @returns The close fill PDA instruction.
|
|
579
794
|
*/
|
|
580
|
-
export
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
795
|
+
export var createCloseFillPdaInstruction = function (signer, solanaClient, fillStatusPda) { return __awaiter(void 0, void 0, void 0, function () {
|
|
796
|
+
var closeFillPdaIx, _a, _b, _c;
|
|
797
|
+
var _d;
|
|
798
|
+
return __generator(this, function (_e) {
|
|
799
|
+
switch (_e.label) {
|
|
800
|
+
case 0:
|
|
801
|
+
_b = (_a = SvmSpokeClient).getCloseFillPdaInstruction;
|
|
802
|
+
_d = {
|
|
803
|
+
signer: signer
|
|
804
|
+
};
|
|
805
|
+
return [4 /*yield*/, getStatePda(SvmSpokeClient.SVM_SPOKE_PROGRAM_ADDRESS)];
|
|
806
|
+
case 1:
|
|
807
|
+
closeFillPdaIx = _b.apply(_a, [(_d.state = _e.sent(),
|
|
808
|
+
_d.fillStatus = fillStatusPda,
|
|
809
|
+
_d)]);
|
|
810
|
+
_c = pipe;
|
|
811
|
+
return [4 /*yield*/, createDefaultTransaction(solanaClient, signer)];
|
|
812
|
+
case 2: return [2 /*return*/, _c.apply(void 0, [_e.sent(), function (tx) {
|
|
813
|
+
return appendTransactionMessageInstruction(closeFillPdaIx, tx);
|
|
814
|
+
}])];
|
|
815
|
+
}
|
|
585
816
|
});
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
817
|
+
}); };
|
|
818
|
+
export var createReceiveMessageInstruction = function (signer, solanaClient, input, remainingAccounts) { return __awaiter(void 0, void 0, void 0, function () {
|
|
819
|
+
var receiveMessageIx, _a;
|
|
820
|
+
var _b;
|
|
821
|
+
return __generator(this, function (_c) {
|
|
822
|
+
switch (_c.label) {
|
|
823
|
+
case 0:
|
|
824
|
+
receiveMessageIx = MessageTransmitterClient.getReceiveMessageInstruction(input);
|
|
825
|
+
(_b = receiveMessageIx.accounts).push.apply(_b, remainingAccounts);
|
|
826
|
+
_a = pipe;
|
|
827
|
+
return [4 /*yield*/, createDefaultTransaction(solanaClient, signer)];
|
|
828
|
+
case 1: return [2 /*return*/, _a.apply(void 0, [_c.sent(), function (tx) {
|
|
829
|
+
return appendTransactionMessageInstruction(receiveMessageIx, tx);
|
|
830
|
+
}])];
|
|
831
|
+
}
|
|
832
|
+
});
|
|
833
|
+
}); };
|
|
834
|
+
export function getAssociatedTokenAddress(owner_1, mint_1) {
|
|
835
|
+
return __awaiter(this, arguments, void 0, function (owner, mint, tokenProgramId) {
|
|
836
|
+
var encoder, associatedToken;
|
|
837
|
+
if (tokenProgramId === void 0) { tokenProgramId = TOKEN_PROGRAM_ADDRESS; }
|
|
838
|
+
return __generator(this, function (_a) {
|
|
839
|
+
switch (_a.label) {
|
|
840
|
+
case 0:
|
|
841
|
+
encoder = getAddressEncoder();
|
|
842
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
843
|
+
programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
|
|
844
|
+
seeds: [encoder.encode(toAddress(owner)), encoder.encode(tokenProgramId), encoder.encode(toAddress(mint))],
|
|
845
|
+
})];
|
|
846
|
+
case 1:
|
|
847
|
+
associatedToken = (_a.sent())[0];
|
|
848
|
+
return [2 /*return*/, associatedToken];
|
|
849
|
+
}
|
|
850
|
+
});
|
|
598
851
|
});
|
|
599
|
-
return associatedToken;
|
|
600
852
|
}
|
|
601
853
|
export function getRelayDataHash(relayData, destinationChainId) {
|
|
602
854
|
assert(relayData.messageHash.startsWith("0x"), "Message hash must be a hex string");
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
855
|
+
var uint64Encoder = getU64Encoder();
|
|
856
|
+
var svmRelayData = toSvmRelayData(relayData);
|
|
857
|
+
var relayDataEncoder = SvmSpokeClient.getRelayDataEncoder();
|
|
858
|
+
var encodedRelayData = relayDataEncoder.encode(svmRelayData);
|
|
859
|
+
var encodedMessage = Buffer.from(relayData.message.slice(2), "hex");
|
|
860
|
+
var encodedMessageHash = Uint8Array.from(Buffer.from(relayData.messageHash.slice(2), "hex"));
|
|
609
861
|
// Reformat the encoded relay data the same way it is done in the SvmSpoke:
|
|
610
862
|
// https://github.com/across-protocol/contracts/blob/3310f8dc716407a5f97ef5fd2eae63df83251f2f/programs/svm-spoke/src/utils/merkle_proof_utils.rs#L5
|
|
611
863
|
// We want to use messageHash always so we can construct the relayDataHash just from the Fill.
|
|
612
864
|
// If we don't have a message, we can just pass an empty message here.
|
|
613
|
-
|
|
614
|
-
|
|
865
|
+
var messageOffset = encodedRelayData.length - 4 - encodedMessage.length;
|
|
866
|
+
var contentToHash = Buffer.concat([
|
|
615
867
|
encodedRelayData.slice(0, messageOffset),
|
|
616
868
|
encodedMessageHash,
|
|
617
869
|
Uint8Array.from(uint64Encoder.encode(BigInt(destinationChainId))),
|
|
618
870
|
]);
|
|
619
871
|
return keccak256(contentToHash);
|
|
620
872
|
}
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
873
|
+
function resolveFillStatusFromPdaEvents(fillStatusPda, toSlot, svmEventsClient) {
|
|
874
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
875
|
+
var eventsToQuery, relevantEvents, fillStatusEvent;
|
|
876
|
+
return __generator(this, function (_a) {
|
|
877
|
+
switch (_a.label) {
|
|
878
|
+
case 0:
|
|
879
|
+
eventsToQuery = [SVMEventNames.FilledRelay, SVMEventNames.RequestedSlowFill];
|
|
880
|
+
return [4 /*yield*/, Promise.all(eventsToQuery.map(function (eventName) {
|
|
881
|
+
// PDAs should have only a few events, requesting up to 10 should be enough.
|
|
882
|
+
return svmEventsClient.queryDerivedAddressEvents(eventName, fillStatusPda, undefined, toSlot, { limit: 10 });
|
|
883
|
+
}))];
|
|
884
|
+
case 1:
|
|
885
|
+
relevantEvents = (_a.sent()).flat();
|
|
886
|
+
if (relevantEvents.length === 0) {
|
|
887
|
+
// No fill or requested slow fill events found for this PDA
|
|
888
|
+
return [2 /*return*/, FillStatus.Unfilled];
|
|
889
|
+
}
|
|
890
|
+
// Sort events in ascending order of slot number
|
|
891
|
+
relevantEvents.sort(function (a, b) { return Number(a.slot - b.slot); });
|
|
892
|
+
fillStatusEvent = relevantEvents.pop();
|
|
893
|
+
switch (fillStatusEvent.name) {
|
|
894
|
+
case SVMEventNames.FilledRelay:
|
|
895
|
+
return [2 /*return*/, FillStatus.Filled];
|
|
896
|
+
case SVMEventNames.RequestedSlowFill:
|
|
897
|
+
return [2 /*return*/, FillStatus.RequestedSlowFill];
|
|
898
|
+
default:
|
|
899
|
+
throw new Error("Unexpected event name: ".concat(fillStatusEvent.name));
|
|
900
|
+
}
|
|
901
|
+
return [2 /*return*/];
|
|
902
|
+
}
|
|
903
|
+
});
|
|
904
|
+
});
|
|
645
905
|
}
|
|
646
906
|
/**
|
|
647
907
|
* Attempts to resolve the fill status for an array of deposits by reading their fillStatus PDAs.
|
|
@@ -656,28 +916,38 @@ async function resolveFillStatusFromPdaEvents(fillStatusPda, toSlot, svmEventsCl
|
|
|
656
916
|
* @param fillStatusPdas An array of fill status PDAs to retrieve the fill status for.
|
|
657
917
|
* @param relayData An array of relay data from which the fill status PDAs were derived.
|
|
658
918
|
*/
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
919
|
+
function fetchBatchFillStatusFromPdaAccounts(provider, fillStatusPdas, relayDataArray, logger) {
|
|
920
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
921
|
+
var chunkSize, commitment, _a, pdaAccounts, timestamp, fillStatuses;
|
|
922
|
+
return __generator(this, function (_b) {
|
|
923
|
+
switch (_b.label) {
|
|
924
|
+
case 0:
|
|
925
|
+
chunkSize = 100;
|
|
926
|
+
commitment = "confirmed";
|
|
927
|
+
return [4 /*yield*/, Promise.all([
|
|
928
|
+
Promise.all(chunk(fillStatusPdas, chunkSize).map(function (chunk) { return fetchEncodedAccounts(provider, chunk, { commitment: commitment }); })),
|
|
929
|
+
getNearestSlotTime(provider, { commitment: commitment }, logger),
|
|
930
|
+
])];
|
|
931
|
+
case 1:
|
|
932
|
+
_a = _b.sent(), pdaAccounts = _a[0], timestamp = _a[1].timestamp;
|
|
933
|
+
fillStatuses = pdaAccounts.flat().map(function (account, index) {
|
|
934
|
+
// If the PDA exists, we can fetch the status directly.
|
|
935
|
+
if (account.exists) {
|
|
936
|
+
var decodedAccount = decodeFillStatusAccount(account);
|
|
937
|
+
return decodedAccount.data.status;
|
|
938
|
+
}
|
|
939
|
+
// If the PDA doesn't exist and the deadline hasn't passed yet, the deposit must be unfilled,
|
|
940
|
+
// since PDAs can't be closed before the fill deadline.
|
|
941
|
+
if (timestamp < relayDataArray[index].fillDeadline) {
|
|
942
|
+
return FillStatus.Unfilled;
|
|
943
|
+
}
|
|
944
|
+
// If the PDA doesn't exist and the fill deadline has passed, then the status can't be determined and is set to undefined.
|
|
945
|
+
return undefined;
|
|
946
|
+
});
|
|
947
|
+
return [2 /*return*/, fillStatuses];
|
|
948
|
+
}
|
|
949
|
+
});
|
|
679
950
|
});
|
|
680
|
-
return fillStatuses;
|
|
681
951
|
}
|
|
682
952
|
/**
|
|
683
953
|
* Returns a set of instructions to execute to fill a relay via instruction params.
|
|
@@ -686,109 +956,149 @@ async function fetchBatchFillStatusFromPdaAccounts(provider, fillStatusPdas, rel
|
|
|
686
956
|
* @param signer The transaction signer and authority of the instruction params PDA.
|
|
687
957
|
* @param maxWriteSize The maximum fragment size to write to instruction params.
|
|
688
958
|
*/
|
|
689
|
-
export
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
959
|
+
export function getFillRelayViaInstructionParamsInstructions(spokePool_1, relayData_1, repaymentChainId_1, repaymentAddress_1, signer_1) {
|
|
960
|
+
return __awaiter(this, arguments, void 0, function (spokePool, relayData, repaymentChainId, repaymentAddress, signer, maxWriteSize) {
|
|
961
|
+
var instructionParams, relayDataEncoder, svmRelayData, encodedRelayData, initInstructionParamsIx, instructions, i, offset, offsetEnd, fragment, writeInstructionParamsIx;
|
|
962
|
+
if (maxWriteSize === void 0) { maxWriteSize = 450; }
|
|
963
|
+
return __generator(this, function (_a) {
|
|
964
|
+
switch (_a.label) {
|
|
965
|
+
case 0: return [4 /*yield*/, getInstructionParamsPda(spokePool, signer.address)];
|
|
966
|
+
case 1:
|
|
967
|
+
instructionParams = _a.sent();
|
|
968
|
+
relayDataEncoder = SvmSpokeClient.getFillRelayParamsEncoder();
|
|
969
|
+
svmRelayData = toSvmRelayData(relayData);
|
|
970
|
+
encodedRelayData = relayDataEncoder.encode({
|
|
971
|
+
relayData: svmRelayData,
|
|
972
|
+
repaymentChainId: repaymentChainId,
|
|
973
|
+
repaymentAddress: toAddress(repaymentAddress),
|
|
974
|
+
});
|
|
975
|
+
initInstructionParamsIx = SvmSpokeClient.getInitializeInstructionParamsInstruction({
|
|
976
|
+
signer: signer,
|
|
977
|
+
instructionParams: instructionParams,
|
|
978
|
+
totalSize: encodedRelayData.length,
|
|
979
|
+
});
|
|
980
|
+
instructions = [initInstructionParamsIx];
|
|
981
|
+
for (i = 0; i <= encodedRelayData.length / maxWriteSize; ++i) {
|
|
982
|
+
offset = i * maxWriteSize;
|
|
983
|
+
offsetEnd = Math.min(offset + maxWriteSize, encodedRelayData.length);
|
|
984
|
+
fragment = encodedRelayData.slice(offset, offsetEnd);
|
|
985
|
+
writeInstructionParamsIx = SvmSpokeClient.getWriteInstructionParamsFragmentInstruction({
|
|
986
|
+
signer: signer,
|
|
987
|
+
instructionParams: instructionParams,
|
|
988
|
+
offset: offset,
|
|
989
|
+
fragment: fragment,
|
|
990
|
+
});
|
|
991
|
+
instructions.push(writeInstructionParamsIx);
|
|
992
|
+
}
|
|
993
|
+
return [2 /*return*/, instructions];
|
|
994
|
+
}
|
|
713
995
|
});
|
|
714
|
-
|
|
715
|
-
}
|
|
716
|
-
return instructions;
|
|
996
|
+
});
|
|
717
997
|
}
|
|
718
998
|
/**
|
|
719
999
|
* Returns the delegate PDA for deposit.
|
|
720
1000
|
*/
|
|
721
|
-
export
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
1001
|
+
export function getDepositDelegatePda(depositData, programId) {
|
|
1002
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1003
|
+
var addrEnc, u64, u32, parts, seedHash, pda;
|
|
1004
|
+
return __generator(this, function (_a) {
|
|
1005
|
+
switch (_a.label) {
|
|
1006
|
+
case 0:
|
|
1007
|
+
addrEnc = getAddressEncoder();
|
|
1008
|
+
u64 = getU64Encoder();
|
|
1009
|
+
u32 = getU32Encoder();
|
|
1010
|
+
parts = [
|
|
1011
|
+
Uint8Array.from(addrEnc.encode(depositData.depositor)),
|
|
1012
|
+
Uint8Array.from(addrEnc.encode(depositData.recipient)),
|
|
1013
|
+
Uint8Array.from(addrEnc.encode(depositData.inputToken)),
|
|
1014
|
+
Uint8Array.from(addrEnc.encode(depositData.outputToken)),
|
|
1015
|
+
Uint8Array.from(u64.encode(depositData.inputAmount)),
|
|
1016
|
+
Uint8Array.from(depositData.outputAmount),
|
|
1017
|
+
Uint8Array.from(u64.encode(depositData.destinationChainId)),
|
|
1018
|
+
Uint8Array.from(addrEnc.encode(depositData.exclusiveRelayer)),
|
|
1019
|
+
Uint8Array.from(u32.encode(depositData.quoteTimestamp)),
|
|
1020
|
+
Uint8Array.from(u32.encode(depositData.fillDeadline)),
|
|
1021
|
+
Uint8Array.from(u32.encode(depositData.exclusivityParameter)),
|
|
1022
|
+
Uint8Array.from(u32.encode(BigInt(depositData.message.length))),
|
|
1023
|
+
depositData.message,
|
|
1024
|
+
];
|
|
1025
|
+
seedHash = Buffer.from(keccak256(Buffer.concat(parts)).slice(2), "hex");
|
|
1026
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1027
|
+
programAddress: programId,
|
|
1028
|
+
seeds: [Buffer.from("delegate"), seedHash],
|
|
1029
|
+
})];
|
|
1030
|
+
case 1:
|
|
1031
|
+
pda = (_a.sent())[0];
|
|
1032
|
+
return [2 /*return*/, pda];
|
|
1033
|
+
}
|
|
1034
|
+
});
|
|
744
1035
|
});
|
|
745
|
-
return pda;
|
|
746
1036
|
}
|
|
747
1037
|
/**
|
|
748
1038
|
* Returns the delegate PDA for depositNow.
|
|
749
1039
|
*/
|
|
750
|
-
export
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
1040
|
+
export function getDepositNowDelegatePda(depositData, programId) {
|
|
1041
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1042
|
+
var addrEnc, u64, u32, parts, seedHash, pda;
|
|
1043
|
+
return __generator(this, function (_a) {
|
|
1044
|
+
switch (_a.label) {
|
|
1045
|
+
case 0:
|
|
1046
|
+
addrEnc = getAddressEncoder();
|
|
1047
|
+
u64 = getU64Encoder();
|
|
1048
|
+
u32 = getU32Encoder();
|
|
1049
|
+
parts = [
|
|
1050
|
+
Uint8Array.from(addrEnc.encode(depositData.depositor)),
|
|
1051
|
+
Uint8Array.from(addrEnc.encode(depositData.recipient)),
|
|
1052
|
+
Uint8Array.from(addrEnc.encode(depositData.inputToken)),
|
|
1053
|
+
Uint8Array.from(addrEnc.encode(depositData.outputToken)),
|
|
1054
|
+
Uint8Array.from(u64.encode(depositData.inputAmount)),
|
|
1055
|
+
Uint8Array.from(depositData.outputAmount),
|
|
1056
|
+
Uint8Array.from(u64.encode(depositData.destinationChainId)),
|
|
1057
|
+
Uint8Array.from(addrEnc.encode(depositData.exclusiveRelayer)),
|
|
1058
|
+
Uint8Array.from(u32.encode(depositData.fillDeadlineOffset)),
|
|
1059
|
+
Uint8Array.from(u32.encode(depositData.exclusivityPeriod)),
|
|
1060
|
+
Uint8Array.from(u32.encode(BigInt(depositData.message.length))),
|
|
1061
|
+
depositData.message,
|
|
1062
|
+
];
|
|
1063
|
+
seedHash = Buffer.from(keccak256(Buffer.concat(parts)).slice(2), "hex");
|
|
1064
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1065
|
+
programAddress: programId,
|
|
1066
|
+
seeds: [Buffer.from("delegate"), seedHash],
|
|
1067
|
+
})];
|
|
1068
|
+
case 1:
|
|
1069
|
+
pda = (_a.sent())[0];
|
|
1070
|
+
return [2 /*return*/, pda];
|
|
1071
|
+
}
|
|
1072
|
+
});
|
|
772
1073
|
});
|
|
773
|
-
return pda;
|
|
774
1074
|
}
|
|
775
1075
|
/**
|
|
776
1076
|
* Returns the fill-delegate PDA for fillRelay.
|
|
777
1077
|
*/
|
|
778
|
-
export
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
1078
|
+
export function getFillRelayDelegatePda(relayHash, repaymentChainId, repaymentAddress, programId) {
|
|
1079
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1080
|
+
var addrEnc, u64, parts, seedHash, pda;
|
|
1081
|
+
return __generator(this, function (_a) {
|
|
1082
|
+
switch (_a.label) {
|
|
1083
|
+
case 0:
|
|
1084
|
+
addrEnc = getAddressEncoder();
|
|
1085
|
+
u64 = getU64Encoder();
|
|
1086
|
+
parts = [
|
|
1087
|
+
relayHash,
|
|
1088
|
+
Uint8Array.from(u64.encode(repaymentChainId)),
|
|
1089
|
+
Uint8Array.from(addrEnc.encode(repaymentAddress)),
|
|
1090
|
+
];
|
|
1091
|
+
seedHash = Buffer.from(keccak256(Buffer.concat(parts)).slice(2), "hex");
|
|
1092
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1093
|
+
programAddress: programId,
|
|
1094
|
+
seeds: [Buffer.from("delegate"), seedHash],
|
|
1095
|
+
})];
|
|
1096
|
+
case 1:
|
|
1097
|
+
pda = (_a.sent())[0];
|
|
1098
|
+
return [2 /*return*/, pda];
|
|
1099
|
+
}
|
|
1100
|
+
});
|
|
790
1101
|
});
|
|
791
|
-
return pda;
|
|
792
1102
|
}
|
|
793
1103
|
/**
|
|
794
1104
|
* Checks if a CCTP message has been processed.
|
|
@@ -801,67 +1111,91 @@ export async function getFillRelayDelegatePda(relayHash, repaymentChainId, repay
|
|
|
801
1111
|
* the error handling would have to account for the asynchronous opening/closing of PDAs, which is better handled downstream,
|
|
802
1112
|
* where the caller of this function has more context.
|
|
803
1113
|
*/
|
|
804
|
-
export
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
1114
|
+
export var hasCCTPV1MessageBeenProcessed = function (solanaClient, signer, nonce, sourceDomain, latestBlockhash) { return __awaiter(void 0, void 0, void 0, function () {
|
|
1115
|
+
var noncePda, isNonceUsedIx, parserFunction;
|
|
1116
|
+
return __generator(this, function (_a) {
|
|
1117
|
+
switch (_a.label) {
|
|
1118
|
+
case 0: return [4 /*yield*/, getCCTPNoncePda(solanaClient, signer, nonce, sourceDomain)];
|
|
1119
|
+
case 1:
|
|
1120
|
+
noncePda = _a.sent();
|
|
1121
|
+
isNonceUsedIx = MessageTransmitterClient.getIsNonceUsedInstruction({
|
|
1122
|
+
nonce: nonce,
|
|
1123
|
+
usedNonces: noncePda,
|
|
1124
|
+
});
|
|
1125
|
+
parserFunction = function (buf) {
|
|
1126
|
+
if (buf.length != 1) {
|
|
1127
|
+
throw new Error("Invalid buffer length for isNonceUsedIx");
|
|
1128
|
+
}
|
|
1129
|
+
return Boolean(buf[0]);
|
|
1130
|
+
};
|
|
1131
|
+
return [4 /*yield*/, simulateAndDecode(solanaClient, isNonceUsedIx, signer, parserFunction, latestBlockhash)];
|
|
1132
|
+
case 2: return [2 /*return*/, _a.sent()];
|
|
813
1133
|
}
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
return await simulateAndDecode(solanaClient, isNonceUsedIx, signer, parserFunction, latestBlockhash);
|
|
817
|
-
};
|
|
1134
|
+
});
|
|
1135
|
+
}); };
|
|
818
1136
|
/**
|
|
819
1137
|
* Returns the account metas for a tokenless message.
|
|
820
1138
|
* @returns The account metas for a tokenless message.
|
|
821
1139
|
*/
|
|
822
|
-
export
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
1140
|
+
export function getAccountMetasForTokenlessMessage(solanaClient, signer, messageBytes) {
|
|
1141
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1142
|
+
var messageHex, messageHeader, programAddress, statePda, selfAuthority, eventAuthority, base, rootBundleId, rootBundle, rootBundleId, rootBundle;
|
|
1143
|
+
return __generator(this, function (_a) {
|
|
1144
|
+
switch (_a.label) {
|
|
1145
|
+
case 0:
|
|
1146
|
+
messageHex = messageBytes.slice(2);
|
|
1147
|
+
messageHeader = decodeMessageHeader(Buffer.from(messageHex, "hex"));
|
|
1148
|
+
programAddress = SvmSpokeClient.SVM_SPOKE_PROGRAM_ADDRESS;
|
|
1149
|
+
return [4 /*yield*/, getStatePda(programAddress)];
|
|
1150
|
+
case 1:
|
|
1151
|
+
statePda = _a.sent();
|
|
1152
|
+
return [4 /*yield*/, getSelfAuthority()];
|
|
1153
|
+
case 2:
|
|
1154
|
+
selfAuthority = _a.sent();
|
|
1155
|
+
return [4 /*yield*/, getEventAuthority(programAddress)];
|
|
1156
|
+
case 3:
|
|
1157
|
+
eventAuthority = _a.sent();
|
|
1158
|
+
base = [
|
|
1159
|
+
{ address: statePda, role: AccountRole.READONLY },
|
|
1160
|
+
{ address: selfAuthority, role: AccountRole.READONLY },
|
|
1161
|
+
{ address: programAddress, role: AccountRole.READONLY },
|
|
1162
|
+
];
|
|
1163
|
+
if (!isRelayRootBundleMessageBody(messageHeader.messageBody)) return [3 /*break*/, 6];
|
|
1164
|
+
return [4 /*yield*/, SvmSpokeClient.fetchState(solanaClient, statePda)];
|
|
1165
|
+
case 4:
|
|
1166
|
+
rootBundleId = (_a.sent()).data.rootBundleId;
|
|
1167
|
+
return [4 /*yield*/, getRootBundlePda(programAddress, rootBundleId)];
|
|
1168
|
+
case 5:
|
|
1169
|
+
rootBundle = _a.sent();
|
|
1170
|
+
return [2 /*return*/, __spreadArray(__spreadArray([], base, true), [
|
|
1171
|
+
{ address: signer.address, role: AccountRole.WRITABLE },
|
|
1172
|
+
{ address: statePda, role: AccountRole.WRITABLE },
|
|
1173
|
+
{ address: rootBundle, role: AccountRole.WRITABLE },
|
|
1174
|
+
{ address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY },
|
|
1175
|
+
{ address: eventAuthority, role: AccountRole.READONLY },
|
|
1176
|
+
{ address: programAddress, role: AccountRole.READONLY },
|
|
1177
|
+
], false)];
|
|
1178
|
+
case 6:
|
|
1179
|
+
if (!isEmergencyDeleteRootBundleMessageBody(messageHeader.messageBody)) return [3 /*break*/, 8];
|
|
1180
|
+
rootBundleId = getEmergencyDeleteRootBundleRootBundleId(messageHeader.messageBody);
|
|
1181
|
+
return [4 /*yield*/, getRootBundlePda(programAddress, rootBundleId)];
|
|
1182
|
+
case 7:
|
|
1183
|
+
rootBundle = _a.sent();
|
|
1184
|
+
return [2 /*return*/, __spreadArray(__spreadArray([], base, true), [
|
|
1185
|
+
{ address: signer.address, role: AccountRole.READONLY },
|
|
1186
|
+
{ address: statePda, role: AccountRole.READONLY },
|
|
1187
|
+
{ address: rootBundle, role: AccountRole.WRITABLE },
|
|
1188
|
+
{ address: eventAuthority, role: AccountRole.READONLY },
|
|
1189
|
+
{ address: programAddress, role: AccountRole.READONLY },
|
|
1190
|
+
], false)];
|
|
1191
|
+
case 8: return [2 /*return*/, __spreadArray(__spreadArray([], base, true), [
|
|
1192
|
+
{ address: statePda, role: AccountRole.WRITABLE },
|
|
1193
|
+
{ address: eventAuthority, role: AccountRole.READONLY },
|
|
1194
|
+
{ address: programAddress, role: AccountRole.READONLY },
|
|
1195
|
+
], false)];
|
|
1196
|
+
}
|
|
1197
|
+
});
|
|
1198
|
+
});
|
|
865
1199
|
}
|
|
866
1200
|
/**
|
|
867
1201
|
* Returns the required PDAs for a deposit message.
|
|
@@ -870,47 +1204,57 @@ export async function getAccountMetasForTokenlessMessage(solanaClient, signer, m
|
|
|
870
1204
|
* @param tokenMessengerMinter The token messenger minter address.
|
|
871
1205
|
* @param messageTransmitterAddress The message transmitter address.
|
|
872
1206
|
*/
|
|
873
|
-
export
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
1207
|
+
export function getCCTPDepositAccounts(hubChainId, cctpDestinationDomainId, tokenMessengerMinterAddress, messageTransmitterAddress) {
|
|
1208
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1209
|
+
var l2Usdc, _a, tokenMessenger, tokenMinter, localToken, cctpEventAuthority, remoteTokenMessenger, tokenMessengerMinterSenderAuthority, messageTransmitter;
|
|
1210
|
+
return __generator(this, function (_b) {
|
|
1211
|
+
switch (_b.label) {
|
|
1212
|
+
case 0:
|
|
1213
|
+
l2Usdc = SvmAddress.from(TOKEN_SYMBOLS_MAP.USDC.addresses[chainIsProd(hubChainId) ? CHAIN_IDs.SOLANA : CHAIN_IDs.SOLANA_DEVNET]);
|
|
1214
|
+
return [4 /*yield*/, Promise.all([
|
|
1215
|
+
getProgramDerivedAddress({
|
|
1216
|
+
programAddress: tokenMessengerMinterAddress,
|
|
1217
|
+
seeds: ["token_messenger"],
|
|
1218
|
+
}),
|
|
1219
|
+
getProgramDerivedAddress({
|
|
1220
|
+
programAddress: tokenMessengerMinterAddress,
|
|
1221
|
+
seeds: ["token_minter"],
|
|
1222
|
+
}),
|
|
1223
|
+
getProgramDerivedAddress({
|
|
1224
|
+
programAddress: tokenMessengerMinterAddress,
|
|
1225
|
+
seeds: ["local_token", bs58.decode(l2Usdc.toBase58())],
|
|
1226
|
+
}),
|
|
1227
|
+
getProgramDerivedAddress({
|
|
1228
|
+
programAddress: tokenMessengerMinterAddress,
|
|
1229
|
+
seeds: ["__event_authority"],
|
|
1230
|
+
}),
|
|
1231
|
+
getProgramDerivedAddress({
|
|
1232
|
+
programAddress: tokenMessengerMinterAddress,
|
|
1233
|
+
seeds: ["remote_token_messenger", String(cctpDestinationDomainId)],
|
|
1234
|
+
}),
|
|
1235
|
+
getProgramDerivedAddress({
|
|
1236
|
+
programAddress: tokenMessengerMinterAddress,
|
|
1237
|
+
seeds: ["sender_authority"],
|
|
1238
|
+
}),
|
|
1239
|
+
getProgramDerivedAddress({
|
|
1240
|
+
programAddress: messageTransmitterAddress,
|
|
1241
|
+
seeds: ["message_transmitter"],
|
|
1242
|
+
}),
|
|
1243
|
+
])];
|
|
1244
|
+
case 1:
|
|
1245
|
+
_a = _b.sent(), tokenMessenger = _a[0][0], tokenMinter = _a[1][0], localToken = _a[2][0], cctpEventAuthority = _a[3][0], remoteTokenMessenger = _a[4][0], tokenMessengerMinterSenderAuthority = _a[5][0], messageTransmitter = _a[6][0];
|
|
1246
|
+
return [2 /*return*/, {
|
|
1247
|
+
tokenMessenger: tokenMessenger,
|
|
1248
|
+
tokenMinter: tokenMinter,
|
|
1249
|
+
localToken: localToken,
|
|
1250
|
+
cctpEventAuthority: cctpEventAuthority,
|
|
1251
|
+
remoteTokenMessenger: remoteTokenMessenger,
|
|
1252
|
+
tokenMessengerMinterSenderAuthority: tokenMessengerMinterSenderAuthority,
|
|
1253
|
+
messageTransmitter: messageTransmitter,
|
|
1254
|
+
}];
|
|
1255
|
+
}
|
|
1256
|
+
});
|
|
1257
|
+
});
|
|
914
1258
|
}
|
|
915
1259
|
/**
|
|
916
1260
|
* Returns the account metas for a deposit message.
|
|
@@ -920,54 +1264,75 @@ export async function getCCTPDepositAccounts(hubChainId, cctpDestinationDomainId
|
|
|
920
1264
|
* @param recipientAta The ATA of the recipient address.
|
|
921
1265
|
* @returns The account metas for a deposit message.
|
|
922
1266
|
*/
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
1267
|
+
function getAccountMetasForDepositMessage(message, hubChainId, tokenMessengerMinter, recipientAta) {
|
|
1268
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1269
|
+
var l1Usdc, l2Usdc, tokenMessengerPda, tokenMinterPda, localTokenPda, tokenMessengerEventAuthorityPda, custodyTokenAccountPda, tokenPairPda, remoteTokenMessengerPda;
|
|
1270
|
+
return __generator(this, function (_a) {
|
|
1271
|
+
switch (_a.label) {
|
|
1272
|
+
case 0:
|
|
1273
|
+
l1Usdc = EvmAddress.from(TOKEN_SYMBOLS_MAP.USDC.addresses[hubChainId]);
|
|
1274
|
+
l2Usdc = SvmAddress.from(TOKEN_SYMBOLS_MAP.USDC.addresses[chainIsProd(hubChainId) ? CHAIN_IDs.SOLANA : CHAIN_IDs.SOLANA_DEVNET]);
|
|
1275
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1276
|
+
programAddress: tokenMessengerMinter,
|
|
1277
|
+
seeds: ["token_messenger"],
|
|
1278
|
+
})];
|
|
1279
|
+
case 1:
|
|
1280
|
+
tokenMessengerPda = (_a.sent())[0];
|
|
1281
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1282
|
+
programAddress: tokenMessengerMinter,
|
|
1283
|
+
seeds: ["token_minter"],
|
|
1284
|
+
})];
|
|
1285
|
+
case 2:
|
|
1286
|
+
tokenMinterPda = (_a.sent())[0];
|
|
1287
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1288
|
+
programAddress: tokenMessengerMinter,
|
|
1289
|
+
seeds: ["local_token", bs58.decode(l2Usdc.toBase58())],
|
|
1290
|
+
})];
|
|
1291
|
+
case 3:
|
|
1292
|
+
localTokenPda = (_a.sent())[0];
|
|
1293
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1294
|
+
programAddress: tokenMessengerMinter,
|
|
1295
|
+
seeds: ["__event_authority"],
|
|
1296
|
+
})];
|
|
1297
|
+
case 4:
|
|
1298
|
+
tokenMessengerEventAuthorityPda = (_a.sent())[0];
|
|
1299
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1300
|
+
programAddress: tokenMessengerMinter,
|
|
1301
|
+
seeds: ["custody", bs58.decode(l2Usdc.toBase58())],
|
|
1302
|
+
})];
|
|
1303
|
+
case 5:
|
|
1304
|
+
custodyTokenAccountPda = (_a.sent())[0];
|
|
1305
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1306
|
+
programAddress: tokenMessengerMinter,
|
|
1307
|
+
seeds: [
|
|
1308
|
+
new Uint8Array(Buffer.from("token_pair")),
|
|
1309
|
+
new Uint8Array(Buffer.from(String(message.sourceDomain))),
|
|
1310
|
+
new Uint8Array(Buffer.from(l1Usdc.toBytes32().slice(2), "hex")),
|
|
1311
|
+
],
|
|
1312
|
+
})];
|
|
1313
|
+
case 6:
|
|
1314
|
+
tokenPairPda = (_a.sent())[0];
|
|
1315
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1316
|
+
programAddress: tokenMessengerMinter,
|
|
1317
|
+
seeds: ["remote_token_messenger", String(message.sourceDomain)],
|
|
1318
|
+
})];
|
|
1319
|
+
case 7:
|
|
1320
|
+
remoteTokenMessengerPda = (_a.sent())[0];
|
|
1321
|
+
return [2 /*return*/, [
|
|
1322
|
+
{ address: tokenMessengerPda, role: AccountRole.READONLY },
|
|
1323
|
+
{ address: remoteTokenMessengerPda, role: AccountRole.READONLY },
|
|
1324
|
+
{ address: tokenMinterPda, role: AccountRole.WRITABLE },
|
|
1325
|
+
{ address: localTokenPda, role: AccountRole.WRITABLE },
|
|
1326
|
+
{ address: tokenPairPda, role: AccountRole.READONLY },
|
|
1327
|
+
{ address: toAddress(recipientAta), role: AccountRole.WRITABLE },
|
|
1328
|
+
{ address: custodyTokenAccountPda, role: AccountRole.WRITABLE },
|
|
1329
|
+
{ address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY },
|
|
1330
|
+
{ address: tokenMessengerEventAuthorityPda, role: AccountRole.READONLY },
|
|
1331
|
+
{ address: tokenMessengerMinter, role: AccountRole.READONLY },
|
|
1332
|
+
]];
|
|
1333
|
+
}
|
|
1334
|
+
});
|
|
958
1335
|
});
|
|
959
|
-
return [
|
|
960
|
-
{ address: tokenMessengerPda, role: AccountRole.READONLY },
|
|
961
|
-
{ address: remoteTokenMessengerPda, role: AccountRole.READONLY },
|
|
962
|
-
{ address: tokenMinterPda, role: AccountRole.WRITABLE },
|
|
963
|
-
{ address: localTokenPda, role: AccountRole.WRITABLE },
|
|
964
|
-
{ address: tokenPairPda, role: AccountRole.READONLY },
|
|
965
|
-
{ address: toAddress(recipientAta), role: AccountRole.WRITABLE },
|
|
966
|
-
{ address: custodyTokenAccountPda, role: AccountRole.WRITABLE },
|
|
967
|
-
{ address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY },
|
|
968
|
-
{ address: tokenMessengerEventAuthorityPda, role: AccountRole.READONLY },
|
|
969
|
-
{ address: tokenMessengerMinter, role: AccountRole.READONLY },
|
|
970
|
-
];
|
|
971
1336
|
}
|
|
972
1337
|
/**
|
|
973
1338
|
* Returns the CCTP v1 receive message transaction.
|
|
@@ -978,45 +1343,66 @@ async function getAccountMetasForDepositMessage(message, hubChainId, tokenMessen
|
|
|
978
1343
|
* @param recipientAta The ATA of the recipient address (used for token finalizations only).
|
|
979
1344
|
* @returns The CCTP v1 receive message transaction.
|
|
980
1345
|
*/
|
|
981
|
-
export
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
1346
|
+
export function getCCTPV1ReceiveMessageTx(solanaClient, signer, message, hubChainId, recipientAta) {
|
|
1347
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1348
|
+
var messageTransmitterPda, eventAuthorityPda, cctpMessageReceiver, authorityPda, usedNonces, accountMetas, _a, messageBytes, input;
|
|
1349
|
+
return __generator(this, function (_b) {
|
|
1350
|
+
switch (_b.label) {
|
|
1351
|
+
case 0: return [4 /*yield*/, getProgramDerivedAddress({
|
|
1352
|
+
programAddress: MessageTransmitterClient.MESSAGE_TRANSMITTER_PROGRAM_ADDRESS,
|
|
1353
|
+
seeds: ["message_transmitter"],
|
|
1354
|
+
})];
|
|
1355
|
+
case 1:
|
|
1356
|
+
messageTransmitterPda = (_b.sent())[0];
|
|
1357
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1358
|
+
programAddress: MessageTransmitterClient.MESSAGE_TRANSMITTER_PROGRAM_ADDRESS,
|
|
1359
|
+
seeds: ["__event_authority"],
|
|
1360
|
+
})];
|
|
1361
|
+
case 2:
|
|
1362
|
+
eventAuthorityPda = (_b.sent())[0];
|
|
1363
|
+
cctpMessageReceiver = isDepositForBurnEvent(message)
|
|
1364
|
+
? TokenMessengerMinterClient.TOKEN_MESSENGER_MINTER_PROGRAM_ADDRESS
|
|
1365
|
+
: SvmSpokeClient.SVM_SPOKE_PROGRAM_ADDRESS;
|
|
1366
|
+
return [4 /*yield*/, getProgramDerivedAddress({
|
|
1367
|
+
programAddress: MessageTransmitterClient.MESSAGE_TRANSMITTER_PROGRAM_ADDRESS,
|
|
1368
|
+
seeds: ["message_transmitter_authority", bs58.decode(cctpMessageReceiver)],
|
|
1369
|
+
})];
|
|
1370
|
+
case 3:
|
|
1371
|
+
authorityPda = (_b.sent())[0];
|
|
1372
|
+
return [4 /*yield*/, getCCTPNoncePda(solanaClient, signer, message.nonce, message.sourceDomain)];
|
|
1373
|
+
case 4:
|
|
1374
|
+
usedNonces = _b.sent();
|
|
1375
|
+
if (!isDepositForBurnEvent(message)) return [3 /*break*/, 6];
|
|
1376
|
+
return [4 /*yield*/, getAccountMetasForDepositMessage(message, hubChainId, TokenMessengerMinterClient.TOKEN_MESSENGER_MINTER_PROGRAM_ADDRESS, recipientAta)];
|
|
1377
|
+
case 5:
|
|
1378
|
+
_a = _b.sent();
|
|
1379
|
+
return [3 /*break*/, 8];
|
|
1380
|
+
case 6: return [4 /*yield*/, getAccountMetasForTokenlessMessage(solanaClient, signer, message.messageBytes)];
|
|
1381
|
+
case 7:
|
|
1382
|
+
_a = _b.sent();
|
|
1383
|
+
_b.label = 8;
|
|
1384
|
+
case 8:
|
|
1385
|
+
accountMetas = _a;
|
|
1386
|
+
messageBytes = message.messageBytes.startsWith("0x")
|
|
1387
|
+
? Buffer.from(message.messageBytes.slice(2), "hex")
|
|
1388
|
+
: Buffer.from(message.messageBytes, "hex");
|
|
1389
|
+
input = {
|
|
1390
|
+
program: MessageTransmitterClient.MESSAGE_TRANSMITTER_PROGRAM_ADDRESS,
|
|
1391
|
+
payer: signer,
|
|
1392
|
+
caller: signer,
|
|
1393
|
+
authorityPda: authorityPda,
|
|
1394
|
+
messageTransmitter: messageTransmitterPda,
|
|
1395
|
+
eventAuthority: eventAuthorityPda,
|
|
1396
|
+
usedNonces: usedNonces,
|
|
1397
|
+
receiver: cctpMessageReceiver,
|
|
1398
|
+
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
1399
|
+
message: messageBytes,
|
|
1400
|
+
attestation: Buffer.from(message.attestation.slice(2), "hex"),
|
|
1401
|
+
};
|
|
1402
|
+
return [2 /*return*/, createReceiveMessageInstruction(signer, solanaClient, input, accountMetas)];
|
|
1403
|
+
}
|
|
1404
|
+
});
|
|
996
1405
|
});
|
|
997
|
-
// Notice: message.nonce is only valid for v1 messages
|
|
998
|
-
const usedNonces = await getCCTPNoncePda(solanaClient, signer, message.nonce, message.sourceDomain);
|
|
999
|
-
// Notice: for Svm tokenless messages, we currently only support very specific finalizations: Hub -> Spoke relayRootBundle calls
|
|
1000
|
-
const accountMetas = isDepositForBurnEvent(message)
|
|
1001
|
-
? await getAccountMetasForDepositMessage(message, hubChainId, TokenMessengerMinterClient.TOKEN_MESSENGER_MINTER_PROGRAM_ADDRESS, recipientAta)
|
|
1002
|
-
: await getAccountMetasForTokenlessMessage(solanaClient, signer, message.messageBytes);
|
|
1003
|
-
const messageBytes = message.messageBytes.startsWith("0x")
|
|
1004
|
-
? Buffer.from(message.messageBytes.slice(2), "hex")
|
|
1005
|
-
: Buffer.from(message.messageBytes, "hex");
|
|
1006
|
-
const input = {
|
|
1007
|
-
program: MessageTransmitterClient.MESSAGE_TRANSMITTER_PROGRAM_ADDRESS,
|
|
1008
|
-
payer: signer,
|
|
1009
|
-
caller: signer,
|
|
1010
|
-
authorityPda,
|
|
1011
|
-
messageTransmitter: messageTransmitterPda,
|
|
1012
|
-
eventAuthority: eventAuthorityPda,
|
|
1013
|
-
usedNonces,
|
|
1014
|
-
receiver: cctpMessageReceiver,
|
|
1015
|
-
systemProgram: SYSTEM_PROGRAM_ADDRESS,
|
|
1016
|
-
message: messageBytes,
|
|
1017
|
-
attestation: Buffer.from(message.attestation.slice(2), "hex"),
|
|
1018
|
-
};
|
|
1019
|
-
return createReceiveMessageInstruction(signer, solanaClient, input, accountMetas);
|
|
1020
1406
|
}
|
|
1021
1407
|
/**
|
|
1022
1408
|
* Finalizes CCTP deposits and messages on Solana.
|
|
@@ -1029,31 +1415,57 @@ export async function getCCTPV1ReceiveMessageTx(solanaClient, signer, message, h
|
|
|
1029
1415
|
* @param hubChainId The chain ID of the hub.
|
|
1030
1416
|
* @returns A list of executed transaction signatures.
|
|
1031
1417
|
*/
|
|
1032
|
-
export function finalizeCCTPV1Messages(solanaClient, attestedMessages, signer, recipientAta, simulate
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1418
|
+
export function finalizeCCTPV1Messages(solanaClient, attestedMessages, signer, recipientAta, simulate, hubChainId) {
|
|
1419
|
+
var _this = this;
|
|
1420
|
+
if (simulate === void 0) { simulate = false; }
|
|
1421
|
+
if (hubChainId === void 0) { hubChainId = 1; }
|
|
1422
|
+
return mapAsync(attestedMessages, function (message) { return __awaiter(_this, void 0, void 0, function () {
|
|
1423
|
+
var receiveMessageIx, result, _a, _b, _c, signedTransaction, signature, encodedTransaction;
|
|
1424
|
+
return __generator(this, function (_d) {
|
|
1425
|
+
switch (_d.label) {
|
|
1426
|
+
case 0: return [4 /*yield*/, getCCTPV1ReceiveMessageTx(solanaClient, signer, message, hubChainId, recipientAta)];
|
|
1427
|
+
case 1:
|
|
1428
|
+
receiveMessageIx = _d.sent();
|
|
1429
|
+
if (!simulate) return [3 /*break*/, 4];
|
|
1430
|
+
_b = (_a = solanaClient)
|
|
1431
|
+
.simulateTransaction;
|
|
1432
|
+
_c = getBase64EncodedWireTransaction;
|
|
1433
|
+
return [4 /*yield*/, signTransactionMessageWithSigners(receiveMessageIx)];
|
|
1434
|
+
case 2: return [4 /*yield*/, _b.apply(_a, [_c.apply(void 0, [_d.sent()]),
|
|
1435
|
+
{
|
|
1436
|
+
encoding: "base64",
|
|
1437
|
+
}])
|
|
1438
|
+
.send()];
|
|
1439
|
+
case 3:
|
|
1440
|
+
result = _d.sent();
|
|
1441
|
+
if (result.value.err) {
|
|
1442
|
+
throw new Error(result.value.err.toString());
|
|
1443
|
+
}
|
|
1444
|
+
return [2 /*return*/, ""];
|
|
1445
|
+
case 4: return [4 /*yield*/, signTransactionMessageWithSigners(receiveMessageIx)];
|
|
1446
|
+
case 5:
|
|
1447
|
+
signedTransaction = _d.sent();
|
|
1448
|
+
signature = getSignatureFromTransaction(signedTransaction);
|
|
1449
|
+
encodedTransaction = getBase64EncodedWireTransaction(signedTransaction);
|
|
1450
|
+
return [4 /*yield*/, solanaClient
|
|
1451
|
+
.sendTransaction(encodedTransaction, { preflightCommitment: "confirmed", encoding: "base64" })
|
|
1452
|
+
.send()];
|
|
1453
|
+
case 6:
|
|
1454
|
+
_d.sent();
|
|
1455
|
+
return [2 /*return*/, signature];
|
|
1043
1456
|
}
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
const signedTransaction = await signTransactionMessageWithSigners(receiveMessageIx);
|
|
1047
|
-
const signature = getSignatureFromTransaction(signedTransaction);
|
|
1048
|
-
const encodedTransaction = getBase64EncodedWireTransaction(signedTransaction);
|
|
1049
|
-
await solanaClient
|
|
1050
|
-
.sendTransaction(encodedTransaction, { preflightCommitment: "confirmed", encoding: "base64" })
|
|
1051
|
-
.send();
|
|
1052
|
-
return signature;
|
|
1053
|
-
});
|
|
1457
|
+
});
|
|
1458
|
+
}); });
|
|
1054
1459
|
}
|
|
1055
|
-
export
|
|
1056
|
-
return
|
|
1460
|
+
export function getMintInfo(solanaClient, mint, config) {
|
|
1461
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
1462
|
+
return __generator(this, function (_a) {
|
|
1463
|
+
switch (_a.label) {
|
|
1464
|
+
case 0: return [4 /*yield*/, fetchMint(solanaClient, mint, config)];
|
|
1465
|
+
case 1: return [2 /*return*/, _a.sent()];
|
|
1466
|
+
}
|
|
1467
|
+
});
|
|
1468
|
+
});
|
|
1057
1469
|
}
|
|
1058
1470
|
// Extracts value_amount from the AcrossPlusMessage bytes. This serves as a 2nd method of deserializing the value, as
|
|
1059
1471
|
// a way to protect us against potential bugs in the deserialization logic.
|
|
@@ -1067,19 +1479,19 @@ function extractValueAmount(acrossPlusMessageBytes) {
|
|
|
1067
1479
|
// pub accounts: Vec<Pubkey>,
|
|
1068
1480
|
// pub handler_message: Vec<u8>,
|
|
1069
1481
|
// }
|
|
1070
|
-
|
|
1071
|
-
|
|
1482
|
+
var VALUE_OFFSET = 32 + 1; // 33
|
|
1483
|
+
var VALUE_END = VALUE_OFFSET + 8; // 41
|
|
1072
1484
|
if (acrossPlusMessageBytes.length < VALUE_END) {
|
|
1073
|
-
throw new Error(
|
|
1485
|
+
throw new Error("svm | extractValueAmount: Message too short, need at least ".concat(VALUE_END, " bytes, got ").concat(acrossPlusMessageBytes.length));
|
|
1074
1486
|
}
|
|
1075
1487
|
return readU64LEExact(acrossPlusMessageBytes.subarray(VALUE_OFFSET, VALUE_END));
|
|
1076
1488
|
}
|
|
1077
1489
|
// Reads exactly 8 bytes as a little-endian u64 and returns bigint
|
|
1078
1490
|
function readU64LEExact(bytes) {
|
|
1079
1491
|
if (bytes.length !== 8) {
|
|
1080
|
-
throw new Error(
|
|
1492
|
+
throw new Error("readU64LEExact expected 8 bytes, received ".concat(bytes.length));
|
|
1081
1493
|
}
|
|
1082
|
-
|
|
1494
|
+
var view = new DataView(bytes.buffer, bytes.byteOffset, 8);
|
|
1083
1495
|
return view.getBigUint64(0, true); // little-endian
|
|
1084
1496
|
}
|
|
1085
1497
|
//# sourceMappingURL=SpokeUtils.js.map
|