@across-protocol/sdk 4.1.63 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/arch/evm/BlockUtils.d.ts +15 -0
- package/dist/cjs/arch/evm/BlockUtils.js +218 -0
- package/dist/cjs/arch/evm/BlockUtils.js.map +1 -0
- package/dist/cjs/arch/evm/SpokeUtils.d.ts +1 -1
- package/dist/cjs/arch/evm/SpokeUtils.js +6 -5
- package/dist/cjs/arch/evm/SpokeUtils.js.map +1 -1
- package/dist/cjs/arch/evm/index.d.ts +1 -0
- package/dist/cjs/arch/evm/index.js +1 -0
- package/dist/cjs/arch/evm/index.js.map +1 -1
- package/dist/cjs/arch/svm/SpokeUtils.d.ts +20 -0
- package/dist/cjs/arch/svm/SpokeUtils.js +449 -0
- package/dist/cjs/arch/svm/SpokeUtils.js.map +1 -0
- package/dist/cjs/arch/svm/constants.d.ts +2 -0
- package/dist/cjs/arch/svm/constants.js +7 -0
- package/dist/cjs/arch/svm/constants.js.map +1 -0
- package/dist/cjs/arch/svm/eventsClient.d.ts +26 -0
- package/dist/cjs/arch/svm/eventsClient.js +253 -0
- package/dist/cjs/arch/svm/eventsClient.js.map +1 -0
- package/dist/cjs/arch/svm/index.d.ts +5 -1
- package/dist/cjs/arch/svm/index.js +6 -2
- package/dist/cjs/arch/svm/index.js.map +1 -1
- package/dist/cjs/{svm → arch/svm}/types.d.ts +9 -4
- package/dist/cjs/arch/svm/types.js.map +1 -0
- package/dist/cjs/arch/svm/utils.d.ts +18 -0
- package/dist/cjs/arch/svm/utils.js +212 -0
- package/dist/cjs/arch/svm/utils.js.map +1 -0
- package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts +1 -1
- package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js +7 -7
- package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js.map +1 -1
- package/dist/cjs/clients/BaseAbstractClient.d.ts +6 -5
- package/dist/cjs/clients/BaseAbstractClient.js +30 -19
- package/dist/cjs/clients/BaseAbstractClient.js.map +1 -1
- package/dist/cjs/clients/BundleDataClient/BundleDataClient.js +15 -11
- package/dist/cjs/clients/BundleDataClient/BundleDataClient.js.map +1 -1
- package/dist/cjs/clients/BundleDataClient/utils/PoolRebalanceUtils.js +1 -1
- package/dist/cjs/clients/BundleDataClient/utils/PoolRebalanceUtils.js.map +1 -1
- package/dist/cjs/clients/BundleDataClient/utils/SuperstructUtils.d.ts +114 -114
- package/dist/cjs/clients/HubPoolClient.d.ts +4 -3
- package/dist/cjs/clients/HubPoolClient.js +18 -17
- package/dist/cjs/clients/HubPoolClient.js.map +1 -1
- package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.d.ts +3 -3
- package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.js +23 -20
- package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
- package/dist/cjs/clients/SpokePoolClient/SVMSpokePoolClient.d.ts +23 -0
- package/dist/cjs/clients/SpokePoolClient/SVMSpokePoolClient.js +172 -0
- package/dist/cjs/clients/SpokePoolClient/SVMSpokePoolClient.js.map +1 -0
- package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.d.ts +5 -5
- package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.js +54 -57
- package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.js.map +1 -1
- package/dist/cjs/clients/SpokePoolClient/index.d.ts +3 -0
- package/dist/cjs/clients/SpokePoolClient/index.js +8 -1
- package/dist/cjs/clients/SpokePoolClient/index.js.map +1 -1
- package/dist/cjs/clients/index.d.ts +1 -1
- package/dist/cjs/clients/index.js +2 -1
- package/dist/cjs/clients/index.js.map +1 -1
- package/dist/cjs/clients/mocks/MockConfigStoreClient.d.ts +1 -1
- package/dist/cjs/clients/mocks/MockConfigStoreClient.js +2 -2
- package/dist/cjs/clients/mocks/MockConfigStoreClient.js.map +1 -1
- package/dist/cjs/clients/mocks/MockHubPoolClient.js +2 -2
- package/dist/cjs/clients/mocks/MockHubPoolClient.js.map +1 -1
- package/dist/cjs/clients/mocks/MockSpokePoolClient.js +7 -4
- package/dist/cjs/clients/mocks/MockSpokePoolClient.js.map +1 -1
- package/dist/cjs/clients/mocks/MockSvmCpiEventsClient.d.ts +33 -0
- package/dist/cjs/clients/mocks/MockSvmCpiEventsClient.js +184 -0
- package/dist/cjs/clients/mocks/MockSvmCpiEventsClient.js.map +1 -0
- package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.d.ts +30 -0
- package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.js +90 -0
- package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.js.map +1 -0
- package/dist/cjs/clients/mocks/index.d.ts +2 -0
- package/dist/cjs/clients/mocks/index.js +2 -0
- package/dist/cjs/clients/mocks/index.js.map +1 -1
- package/dist/cjs/constants.d.ts +1 -0
- package/dist/cjs/constants.js +2 -1
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/gasPriceOracle/adapters/arbitrum.d.ts +2 -2
- package/dist/cjs/gasPriceOracle/adapters/arbitrum.js.map +1 -1
- package/dist/cjs/gasPriceOracle/adapters/ethereum.d.ts +4 -4
- package/dist/cjs/gasPriceOracle/adapters/ethereum.js.map +1 -1
- package/dist/cjs/gasPriceOracle/adapters/linea-viem.js +3 -2
- package/dist/cjs/gasPriceOracle/adapters/linea-viem.js.map +1 -1
- package/dist/cjs/gasPriceOracle/adapters/polygon.d.ts +3 -3
- package/dist/cjs/gasPriceOracle/adapters/solana.d.ts +4 -0
- package/dist/cjs/gasPriceOracle/adapters/solana.js +43 -0
- package/dist/cjs/gasPriceOracle/adapters/solana.js.map +1 -0
- package/dist/cjs/gasPriceOracle/index.d.ts +1 -1
- package/dist/cjs/gasPriceOracle/oracle.d.ts +4 -3
- package/dist/cjs/gasPriceOracle/oracle.js +16 -9
- package/dist/cjs/gasPriceOracle/oracle.js.map +1 -1
- package/dist/cjs/gasPriceOracle/types.d.ts +6 -1
- package/dist/cjs/index.d.ts +0 -1
- package/dist/cjs/index.js +1 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interfaces/SpokePool.d.ts +13 -0
- package/dist/cjs/interfaces/SpokePool.js.map +1 -1
- package/dist/cjs/providers/index.d.ts +1 -1
- package/dist/cjs/providers/index.js +1 -2
- package/dist/cjs/providers/index.js.map +1 -1
- package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.d.ts +5 -0
- package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.js +21 -0
- package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.js.map +1 -0
- package/dist/cjs/providers/mocks/MockRateLimitedSolanaRpcFactory.d.ts +5 -0
- package/dist/cjs/providers/mocks/MockRateLimitedSolanaRpcFactory.js +20 -0
- package/dist/cjs/providers/mocks/MockRateLimitedSolanaRpcFactory.js.map +1 -0
- package/dist/cjs/providers/mocks/MockSolanaRpcFactory.d.ts +13 -0
- package/dist/cjs/providers/mocks/MockSolanaRpcFactory.js +76 -0
- package/dist/cjs/providers/mocks/MockSolanaRpcFactory.js.map +1 -0
- package/dist/cjs/providers/mocks/index.d.ts +4 -0
- package/dist/cjs/providers/mocks/index.js +8 -0
- package/dist/cjs/providers/mocks/index.js.map +1 -0
- package/dist/cjs/providers/{mockProvider.js → mocks/mockEthersProvider.js} +2 -2
- package/dist/cjs/providers/mocks/mockEthersProvider.js.map +1 -0
- package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.d.ts +1 -1
- package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.js +10 -8
- package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.js.map +1 -1
- package/dist/cjs/relayFeeCalculator/chain-queries/factory.d.ts +4 -2
- package/dist/cjs/relayFeeCalculator/chain-queries/factory.js +8 -2
- package/dist/cjs/relayFeeCalculator/chain-queries/factory.js.map +1 -1
- package/dist/cjs/relayFeeCalculator/chain-queries/index.d.ts +1 -0
- package/dist/cjs/relayFeeCalculator/chain-queries/index.js +1 -0
- package/dist/cjs/relayFeeCalculator/chain-queries/index.js.map +1 -1
- package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.d.ts +37 -0
- package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.js +171 -0
- package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -0
- package/dist/cjs/relayFeeCalculator/relayFeeCalculator.d.ts +2 -0
- package/dist/cjs/relayFeeCalculator/relayFeeCalculator.js +9 -3
- package/dist/cjs/relayFeeCalculator/relayFeeCalculator.js.map +1 -1
- package/dist/cjs/utils/AddressUtils.d.ts +9 -3
- package/dist/cjs/utils/AddressUtils.js +36 -6
- package/dist/cjs/utils/AddressUtils.js.map +1 -1
- package/dist/cjs/utils/ArrayUtils.d.ts +1 -0
- package/dist/cjs/utils/ArrayUtils.js +6 -1
- package/dist/cjs/utils/ArrayUtils.js.map +1 -1
- package/dist/cjs/utils/BlockFinder.d.ts +22 -0
- package/dist/cjs/utils/BlockFinder.js +10 -0
- package/dist/cjs/utils/BlockFinder.js.map +1 -0
- package/dist/cjs/utils/BlockUtils.d.ts +2 -27
- package/dist/cjs/utils/BlockUtils.js +2 -208
- package/dist/cjs/utils/BlockUtils.js.map +1 -1
- package/dist/cjs/utils/EventUtils.d.ts +4 -4
- package/dist/cjs/utils/EventUtils.js +7 -4
- package/dist/cjs/utils/EventUtils.js.map +1 -1
- package/dist/cjs/utils/JSONUtils.js +3 -0
- package/dist/cjs/utils/JSONUtils.js.map +1 -1
- package/dist/cjs/utils/NumberUtils.d.ts +1 -0
- package/dist/cjs/utils/NumberUtils.js +7 -1
- package/dist/cjs/utils/NumberUtils.js.map +1 -1
- package/dist/cjs/utils/SpokeUtils.js +5 -0
- package/dist/cjs/utils/SpokeUtils.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +1 -0
- package/dist/cjs/utils/index.js +1 -0
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/esm/arch/evm/BlockUtils.d.ts +24 -0
- package/dist/esm/arch/evm/BlockUtils.js +250 -0
- package/dist/esm/arch/evm/BlockUtils.js.map +1 -0
- package/dist/esm/arch/evm/SpokeUtils.d.ts +1 -1
- package/dist/esm/arch/evm/SpokeUtils.js +6 -5
- package/dist/esm/arch/evm/SpokeUtils.js.map +1 -1
- package/dist/esm/arch/evm/index.d.ts +1 -0
- package/dist/esm/arch/evm/index.js +1 -0
- package/dist/esm/arch/evm/index.js.map +1 -1
- package/dist/esm/arch/svm/SpokeUtils.d.ts +122 -0
- package/dist/esm/arch/svm/SpokeUtils.js +566 -0
- package/dist/esm/arch/svm/SpokeUtils.js.map +1 -0
- package/dist/esm/arch/svm/constants.d.ts +2 -0
- package/dist/esm/arch/svm/constants.js +3 -0
- package/dist/esm/arch/svm/constants.js.map +1 -0
- package/dist/esm/arch/svm/eventsClient.d.ts +87 -0
- package/dist/esm/arch/svm/eventsClient.js +316 -0
- package/dist/esm/arch/svm/eventsClient.js.map +1 -0
- package/dist/esm/arch/svm/index.d.ts +5 -1
- package/dist/esm/arch/svm/index.js +5 -1
- package/dist/esm/arch/svm/index.js.map +1 -1
- package/dist/esm/{svm → arch/svm}/types.d.ts +9 -4
- package/dist/esm/arch/svm/types.js.map +1 -0
- package/dist/esm/arch/svm/utils.d.ts +63 -0
- package/dist/esm/arch/svm/utils.js +258 -0
- package/dist/esm/arch/svm/utils.js.map +1 -0
- package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts +1 -1
- package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js +7 -7
- package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js.map +1 -1
- package/dist/esm/clients/BaseAbstractClient.d.ts +6 -5
- package/dist/esm/clients/BaseAbstractClient.js +30 -19
- package/dist/esm/clients/BaseAbstractClient.js.map +1 -1
- package/dist/esm/clients/BundleDataClient/BundleDataClient.js +17 -14
- package/dist/esm/clients/BundleDataClient/BundleDataClient.js.map +1 -1
- package/dist/esm/clients/BundleDataClient/utils/PoolRebalanceUtils.js +1 -1
- package/dist/esm/clients/BundleDataClient/utils/PoolRebalanceUtils.js.map +1 -1
- package/dist/esm/clients/BundleDataClient/utils/SuperstructUtils.d.ts +114 -114
- package/dist/esm/clients/HubPoolClient.d.ts +4 -3
- package/dist/esm/clients/HubPoolClient.js +19 -18
- package/dist/esm/clients/HubPoolClient.js.map +1 -1
- package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.d.ts +3 -3
- package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.js +23 -20
- package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
- package/dist/esm/clients/SpokePoolClient/SVMSpokePoolClient.d.ts +66 -0
- package/dist/esm/clients/SpokePoolClient/SVMSpokePoolClient.js +225 -0
- package/dist/esm/clients/SpokePoolClient/SVMSpokePoolClient.js.map +1 -0
- package/dist/esm/clients/SpokePoolClient/SpokePoolClient.d.ts +7 -7
- package/dist/esm/clients/SpokePoolClient/SpokePoolClient.js +57 -59
- package/dist/esm/clients/SpokePoolClient/SpokePoolClient.js.map +1 -1
- package/dist/esm/clients/SpokePoolClient/index.d.ts +8 -0
- package/dist/esm/clients/SpokePoolClient/index.js +10 -0
- package/dist/esm/clients/SpokePoolClient/index.js.map +1 -1
- package/dist/esm/clients/index.d.ts +1 -1
- package/dist/esm/clients/index.js +1 -1
- package/dist/esm/clients/index.js.map +1 -1
- package/dist/esm/clients/mocks/MockConfigStoreClient.d.ts +1 -1
- package/dist/esm/clients/mocks/MockConfigStoreClient.js +2 -2
- package/dist/esm/clients/mocks/MockConfigStoreClient.js.map +1 -1
- package/dist/esm/clients/mocks/MockHubPoolClient.js +2 -2
- package/dist/esm/clients/mocks/MockHubPoolClient.js.map +1 -1
- package/dist/esm/clients/mocks/MockSpokePoolClient.js +8 -5
- package/dist/esm/clients/mocks/MockSpokePoolClient.js.map +1 -1
- package/dist/esm/clients/mocks/MockSvmCpiEventsClient.d.ts +33 -0
- package/dist/esm/clients/mocks/MockSvmCpiEventsClient.js +183 -0
- package/dist/esm/clients/mocks/MockSvmCpiEventsClient.js.map +1 -0
- package/dist/esm/clients/mocks/MockSvmSpokePoolClient.d.ts +30 -0
- package/dist/esm/clients/mocks/MockSvmSpokePoolClient.js +89 -0
- package/dist/esm/clients/mocks/MockSvmSpokePoolClient.js.map +1 -0
- package/dist/esm/clients/mocks/index.d.ts +2 -0
- package/dist/esm/clients/mocks/index.js +2 -0
- package/dist/esm/clients/mocks/index.js.map +1 -1
- package/dist/esm/constants.d.ts +1 -0
- package/dist/esm/constants.js +1 -0
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/gasPriceOracle/adapters/arbitrum.d.ts +2 -2
- package/dist/esm/gasPriceOracle/adapters/arbitrum.js.map +1 -1
- package/dist/esm/gasPriceOracle/adapters/ethereum.d.ts +4 -4
- package/dist/esm/gasPriceOracle/adapters/ethereum.js.map +1 -1
- package/dist/esm/gasPriceOracle/adapters/linea-viem.js +3 -2
- package/dist/esm/gasPriceOracle/adapters/linea-viem.js.map +1 -1
- package/dist/esm/gasPriceOracle/adapters/polygon.d.ts +4 -4
- package/dist/esm/gasPriceOracle/adapters/polygon.js +1 -1
- package/dist/esm/gasPriceOracle/adapters/solana.d.ts +8 -0
- package/dist/esm/gasPriceOracle/adapters/solana.js +43 -0
- package/dist/esm/gasPriceOracle/adapters/solana.js.map +1 -0
- package/dist/esm/gasPriceOracle/index.d.ts +1 -1
- package/dist/esm/gasPriceOracle/oracle.d.ts +4 -3
- package/dist/esm/gasPriceOracle/oracle.js +18 -9
- package/dist/esm/gasPriceOracle/oracle.js.map +1 -1
- package/dist/esm/gasPriceOracle/types.d.ts +6 -1
- package/dist/esm/index.d.ts +0 -1
- package/dist/esm/index.js +0 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interfaces/SpokePool.d.ts +13 -0
- package/dist/esm/interfaces/SpokePool.js.map +1 -1
- package/dist/esm/providers/index.d.ts +1 -1
- package/dist/esm/providers/index.js +1 -2
- package/dist/esm/providers/index.js.map +1 -1
- package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.d.ts +5 -0
- package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.js +19 -0
- package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.js.map +1 -0
- package/dist/esm/providers/mocks/MockRateLimitedSolanaRpcFactory.d.ts +5 -0
- package/dist/esm/providers/mocks/MockRateLimitedSolanaRpcFactory.js +18 -0
- package/dist/esm/providers/mocks/MockRateLimitedSolanaRpcFactory.js.map +1 -0
- package/dist/esm/providers/mocks/MockSolanaRpcFactory.d.ts +13 -0
- package/dist/esm/providers/mocks/MockSolanaRpcFactory.js +74 -0
- package/dist/esm/providers/mocks/MockSolanaRpcFactory.js.map +1 -0
- package/dist/esm/providers/mocks/index.d.ts +4 -0
- package/dist/esm/providers/mocks/index.js +5 -0
- package/dist/esm/providers/mocks/index.js.map +1 -0
- package/dist/esm/providers/{mockProvider.js → mocks/mockEthersProvider.js} +2 -2
- package/dist/esm/providers/mocks/mockEthersProvider.js.map +1 -0
- package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.d.ts +1 -1
- package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.js +10 -8
- package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.js.map +1 -1
- package/dist/esm/relayFeeCalculator/chain-queries/factory.d.ts +4 -2
- package/dist/esm/relayFeeCalculator/chain-queries/factory.js +11 -5
- package/dist/esm/relayFeeCalculator/chain-queries/factory.js.map +1 -1
- package/dist/esm/relayFeeCalculator/chain-queries/index.d.ts +1 -0
- package/dist/esm/relayFeeCalculator/chain-queries/index.js +1 -0
- package/dist/esm/relayFeeCalculator/chain-queries/index.js.map +1 -1
- package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.d.ts +84 -0
- package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js +216 -0
- package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -0
- package/dist/esm/relayFeeCalculator/relayFeeCalculator.d.ts +12 -1
- package/dist/esm/relayFeeCalculator/relayFeeCalculator.js +9 -4
- package/dist/esm/relayFeeCalculator/relayFeeCalculator.js.map +1 -1
- package/dist/esm/utils/AddressUtils.d.ts +9 -3
- package/dist/esm/utils/AddressUtils.js +41 -6
- package/dist/esm/utils/AddressUtils.js.map +1 -1
- package/dist/esm/utils/ArrayUtils.d.ts +6 -0
- package/dist/esm/utils/ArrayUtils.js +9 -0
- package/dist/esm/utils/ArrayUtils.js.map +1 -1
- package/dist/esm/utils/BlockFinder.d.ts +22 -0
- package/dist/esm/utils/BlockFinder.js +7 -0
- package/dist/esm/utils/BlockFinder.js.map +1 -0
- package/dist/esm/utils/BlockUtils.d.ts +2 -36
- package/dist/esm/utils/BlockUtils.js +2 -243
- package/dist/esm/utils/BlockUtils.js.map +1 -1
- package/dist/esm/utils/EventUtils.d.ts +4 -4
- package/dist/esm/utils/EventUtils.js +7 -4
- package/dist/esm/utils/EventUtils.js.map +1 -1
- package/dist/esm/utils/JSONUtils.js +3 -0
- package/dist/esm/utils/JSONUtils.js.map +1 -1
- package/dist/esm/utils/NumberUtils.d.ts +7 -0
- package/dist/esm/utils/NumberUtils.js +11 -0
- package/dist/esm/utils/NumberUtils.js.map +1 -1
- package/dist/esm/utils/SpokeUtils.js +5 -0
- package/dist/esm/utils/SpokeUtils.js.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -0
- package/dist/esm/utils/index.js +1 -0
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/types/arch/evm/BlockUtils.d.ts +25 -0
- package/dist/types/arch/evm/BlockUtils.d.ts.map +1 -0
- package/dist/types/arch/evm/SpokeUtils.d.ts +1 -1
- package/dist/types/arch/evm/SpokeUtils.d.ts.map +1 -1
- package/dist/types/arch/evm/index.d.ts +1 -0
- package/dist/types/arch/evm/index.d.ts.map +1 -1
- package/dist/types/arch/svm/SpokeUtils.d.ts +123 -0
- package/dist/types/arch/svm/SpokeUtils.d.ts.map +1 -0
- package/dist/types/arch/svm/constants.d.ts +3 -0
- package/dist/types/arch/svm/constants.d.ts.map +1 -0
- package/dist/types/arch/svm/eventsClient.d.ts +88 -0
- package/dist/types/arch/svm/eventsClient.d.ts.map +1 -0
- package/dist/types/arch/svm/index.d.ts +5 -1
- package/dist/types/arch/svm/index.d.ts.map +1 -1
- package/dist/types/{svm → arch/svm}/types.d.ts +9 -4
- package/dist/types/arch/svm/types.d.ts.map +1 -0
- package/dist/types/arch/svm/utils.d.ts +64 -0
- package/dist/types/arch/svm/utils.d.ts.map +1 -0
- package/dist/types/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts +1 -1
- package/dist/types/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts.map +1 -1
- package/dist/types/clients/BaseAbstractClient.d.ts +6 -5
- package/dist/types/clients/BaseAbstractClient.d.ts.map +1 -1
- package/dist/types/clients/BundleDataClient/BundleDataClient.d.ts.map +1 -1
- package/dist/types/clients/BundleDataClient/utils/SuperstructUtils.d.ts +114 -114
- package/dist/types/clients/HubPoolClient.d.ts +4 -3
- package/dist/types/clients/HubPoolClient.d.ts.map +1 -1
- package/dist/types/clients/SpokePoolClient/EVMSpokePoolClient.d.ts +3 -3
- package/dist/types/clients/SpokePoolClient/EVMSpokePoolClient.d.ts.map +1 -1
- package/dist/types/clients/SpokePoolClient/SVMSpokePoolClient.d.ts +67 -0
- package/dist/types/clients/SpokePoolClient/SVMSpokePoolClient.d.ts.map +1 -0
- package/dist/types/clients/SpokePoolClient/SpokePoolClient.d.ts +7 -7
- package/dist/types/clients/SpokePoolClient/SpokePoolClient.d.ts.map +1 -1
- package/dist/types/clients/SpokePoolClient/index.d.ts +8 -0
- package/dist/types/clients/SpokePoolClient/index.d.ts.map +1 -1
- package/dist/types/clients/index.d.ts +1 -1
- package/dist/types/clients/index.d.ts.map +1 -1
- package/dist/types/clients/mocks/MockConfigStoreClient.d.ts +1 -1
- package/dist/types/clients/mocks/MockConfigStoreClient.d.ts.map +1 -1
- package/dist/types/clients/mocks/MockSpokePoolClient.d.ts.map +1 -1
- package/dist/types/clients/mocks/MockSvmCpiEventsClient.d.ts +34 -0
- package/dist/types/clients/mocks/MockSvmCpiEventsClient.d.ts.map +1 -0
- package/dist/types/clients/mocks/MockSvmSpokePoolClient.d.ts +31 -0
- package/dist/types/clients/mocks/MockSvmSpokePoolClient.d.ts.map +1 -0
- package/dist/types/clients/mocks/index.d.ts +2 -0
- package/dist/types/clients/mocks/index.d.ts.map +1 -1
- package/dist/types/constants.d.ts +1 -0
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/gasPriceOracle/adapters/arbitrum.d.ts +2 -2
- package/dist/types/gasPriceOracle/adapters/arbitrum.d.ts.map +1 -1
- package/dist/types/gasPriceOracle/adapters/ethereum.d.ts +4 -4
- package/dist/types/gasPriceOracle/adapters/ethereum.d.ts.map +1 -1
- package/dist/types/gasPriceOracle/adapters/linea-viem.d.ts.map +1 -1
- package/dist/types/gasPriceOracle/adapters/polygon.d.ts +4 -4
- package/dist/types/gasPriceOracle/adapters/polygon.d.ts.map +1 -1
- package/dist/types/gasPriceOracle/adapters/solana.d.ts +9 -0
- package/dist/types/gasPriceOracle/adapters/solana.d.ts.map +1 -0
- package/dist/types/gasPriceOracle/index.d.ts +1 -1
- package/dist/types/gasPriceOracle/index.d.ts.map +1 -1
- package/dist/types/gasPriceOracle/oracle.d.ts +4 -3
- package/dist/types/gasPriceOracle/oracle.d.ts.map +1 -1
- package/dist/types/gasPriceOracle/types.d.ts +6 -1
- package/dist/types/gasPriceOracle/types.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/interfaces/SpokePool.d.ts +13 -0
- package/dist/types/interfaces/SpokePool.d.ts.map +1 -1
- package/dist/types/providers/index.d.ts +1 -1
- package/dist/types/providers/index.d.ts.map +1 -1
- package/dist/types/providers/mocks/MockCachedSolanaRpcFactory.d.ts +6 -0
- package/dist/types/providers/mocks/MockCachedSolanaRpcFactory.d.ts.map +1 -0
- package/dist/types/providers/mocks/MockRateLimitedSolanaRpcFactory.d.ts +6 -0
- package/dist/types/providers/mocks/MockRateLimitedSolanaRpcFactory.d.ts.map +1 -0
- package/dist/types/providers/mocks/MockSolanaRpcFactory.d.ts +14 -0
- package/dist/types/providers/mocks/MockSolanaRpcFactory.d.ts.map +1 -0
- package/dist/types/providers/mocks/index.d.ts +5 -0
- package/dist/types/providers/mocks/index.d.ts.map +1 -0
- package/dist/types/providers/{mockProvider.d.ts → mocks/mockEthersProvider.d.ts} +1 -1
- package/dist/types/providers/mocks/mockEthersProvider.d.ts.map +1 -0
- package/dist/types/relayFeeCalculator/chain-queries/baseQuery.d.ts +1 -1
- package/dist/types/relayFeeCalculator/chain-queries/baseQuery.d.ts.map +1 -1
- package/dist/types/relayFeeCalculator/chain-queries/factory.d.ts +4 -2
- package/dist/types/relayFeeCalculator/chain-queries/factory.d.ts.map +1 -1
- package/dist/types/relayFeeCalculator/chain-queries/index.d.ts +1 -0
- package/dist/types/relayFeeCalculator/chain-queries/index.d.ts.map +1 -1
- package/dist/types/relayFeeCalculator/chain-queries/svmQuery.d.ts +85 -0
- package/dist/types/relayFeeCalculator/chain-queries/svmQuery.d.ts.map +1 -0
- package/dist/types/relayFeeCalculator/relayFeeCalculator.d.ts +12 -1
- package/dist/types/relayFeeCalculator/relayFeeCalculator.d.ts.map +1 -1
- package/dist/types/utils/AddressUtils.d.ts +9 -3
- package/dist/types/utils/AddressUtils.d.ts.map +1 -1
- package/dist/types/utils/ArrayUtils.d.ts +6 -0
- package/dist/types/utils/ArrayUtils.d.ts.map +1 -1
- package/dist/types/utils/BlockFinder.d.ts +23 -0
- package/dist/types/utils/BlockFinder.d.ts.map +1 -0
- package/dist/types/utils/BlockUtils.d.ts +2 -36
- package/dist/types/utils/BlockUtils.d.ts.map +1 -1
- package/dist/types/utils/EventUtils.d.ts +4 -4
- package/dist/types/utils/EventUtils.d.ts.map +1 -1
- package/dist/types/utils/JSONUtils.d.ts.map +1 -1
- package/dist/types/utils/NumberUtils.d.ts +7 -0
- package/dist/types/utils/NumberUtils.d.ts.map +1 -1
- package/dist/types/utils/SpokeUtils.d.ts.map +1 -1
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/index.d.ts.map +1 -1
- package/package.json +3 -1
- package/src/arch/evm/BlockUtils.ts +209 -0
- package/src/arch/evm/SpokeUtils.ts +5 -5
- package/src/arch/evm/index.ts +1 -0
- package/src/arch/svm/SpokeUtils.ts +581 -0
- package/src/arch/svm/constants.ts +2 -0
- package/src/arch/svm/eventsClient.ts +342 -0
- package/src/arch/svm/index.ts +5 -1
- package/src/{svm → arch/svm}/types.ts +21 -4
- package/src/arch/svm/utils.ts +233 -0
- package/src/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.ts +7 -7
- package/src/clients/BaseAbstractClient.ts +20 -13
- package/src/clients/BundleDataClient/BundleDataClient.ts +28 -19
- package/src/clients/BundleDataClient/utils/PoolRebalanceUtils.ts +1 -1
- package/src/clients/HubPoolClient.ts +19 -19
- package/src/clients/SpokePoolClient/EVMSpokePoolClient.ts +23 -21
- package/src/clients/SpokePoolClient/SVMSpokePoolClient.ts +268 -0
- package/src/clients/SpokePoolClient/SpokePoolClient.ts +50 -59
- package/src/clients/SpokePoolClient/index.ts +11 -0
- package/src/clients/index.ts +1 -1
- package/src/clients/mocks/MockConfigStoreClient.ts +2 -2
- package/src/clients/mocks/MockHubPoolClient.ts +2 -2
- package/src/clients/mocks/MockSpokePoolClient.ts +9 -4
- package/src/clients/mocks/MockSvmCpiEventsClient.ts +226 -0
- package/src/clients/mocks/MockSvmSpokePoolClient.ts +119 -0
- package/src/clients/mocks/index.ts +2 -0
- package/src/constants.ts +1 -0
- package/src/gasPriceOracle/adapters/arbitrum.ts +5 -2
- package/src/gasPriceOracle/adapters/ethereum.ts +7 -4
- package/src/gasPriceOracle/adapters/linea-viem.ts +3 -1
- package/src/gasPriceOracle/adapters/polygon.ts +6 -6
- package/src/gasPriceOracle/adapters/solana.ts +45 -0
- package/src/gasPriceOracle/index.ts +1 -1
- package/src/gasPriceOracle/oracle.ts +20 -4
- package/src/gasPriceOracle/types.ts +7 -1
- package/src/index.ts +0 -1
- package/src/interfaces/SpokePool.ts +14 -0
- package/src/providers/index.ts +1 -1
- package/src/providers/mocks/MockCachedSolanaRpcFactory.ts +15 -0
- package/src/providers/mocks/MockRateLimitedSolanaRpcFactory.ts +14 -0
- package/src/providers/mocks/MockSolanaRpcFactory.ts +55 -0
- package/src/providers/mocks/index.ts +4 -0
- package/src/providers/{mockProvider.ts → mocks/mockEthersProvider.ts} +1 -1
- package/src/relayFeeCalculator/chain-queries/baseQuery.ts +11 -9
- package/src/relayFeeCalculator/chain-queries/factory.ts +24 -8
- package/src/relayFeeCalculator/chain-queries/index.ts +1 -0
- package/src/relayFeeCalculator/chain-queries/svmQuery.ts +225 -0
- package/src/relayFeeCalculator/relayFeeCalculator.ts +15 -3
- package/src/utils/AddressUtils.ts +49 -6
- package/src/utils/ArrayUtils.ts +12 -0
- package/src/utils/BlockFinder.ts +26 -0
- package/src/utils/BlockUtils.ts +5 -215
- package/src/utils/EventUtils.ts +11 -11
- package/src/utils/JSONUtils.ts +2 -0
- package/src/utils/NumberUtils.ts +10 -0
- package/src/utils/SpokeUtils.ts +7 -3
- package/src/utils/index.ts +1 -0
- package/dist/cjs/providers/mockProvider.js.map +0 -1
- package/dist/cjs/svm/eventsClient.d.ts +0 -15
- package/dist/cjs/svm/eventsClient.js +0 -157
- package/dist/cjs/svm/eventsClient.js.map +0 -1
- package/dist/cjs/svm/index.d.ts +0 -3
- package/dist/cjs/svm/index.js +0 -8
- package/dist/cjs/svm/index.js.map +0 -1
- package/dist/cjs/svm/types.js.map +0 -1
- package/dist/cjs/svm/utils/events.d.ts +0 -8
- package/dist/cjs/svm/utils/events.js +0 -47
- package/dist/cjs/svm/utils/events.js.map +0 -1
- package/dist/cjs/svm/utils/helpers.d.ts +0 -2
- package/dist/cjs/svm/utils/helpers.js +0 -19
- package/dist/cjs/svm/utils/helpers.js.map +0 -1
- package/dist/cjs/svm/utils/index.d.ts +0 -1
- package/dist/cjs/svm/utils/index.js +0 -5
- package/dist/cjs/svm/utils/index.js.map +0 -1
- package/dist/esm/providers/mockProvider.js.map +0 -1
- package/dist/esm/svm/eventsClient.d.ts +0 -51
- package/dist/esm/svm/eventsClient.js +0 -195
- package/dist/esm/svm/eventsClient.js.map +0 -1
- package/dist/esm/svm/index.d.ts +0 -3
- package/dist/esm/svm/index.js +0 -5
- package/dist/esm/svm/index.js.map +0 -1
- package/dist/esm/svm/types.js.map +0 -1
- package/dist/esm/svm/utils/events.d.ts +0 -17
- package/dist/esm/svm/utils/events.js +0 -55
- package/dist/esm/svm/utils/events.js.map +0 -1
- package/dist/esm/svm/utils/helpers.d.ts +0 -5
- package/dist/esm/svm/utils/helpers.js +0 -18
- package/dist/esm/svm/utils/helpers.js.map +0 -1
- package/dist/esm/svm/utils/index.d.ts +0 -1
- package/dist/esm/svm/utils/index.js +0 -2
- package/dist/esm/svm/utils/index.js.map +0 -1
- package/dist/types/providers/mockProvider.d.ts.map +0 -1
- package/dist/types/svm/eventsClient.d.ts +0 -52
- package/dist/types/svm/eventsClient.d.ts.map +0 -1
- package/dist/types/svm/index.d.ts +0 -4
- package/dist/types/svm/index.d.ts.map +0 -1
- package/dist/types/svm/types.d.ts.map +0 -1
- package/dist/types/svm/utils/events.d.ts +0 -18
- package/dist/types/svm/utils/events.d.ts.map +0 -1
- package/dist/types/svm/utils/helpers.d.ts +0 -6
- package/dist/types/svm/utils/helpers.d.ts.map +0 -1
- package/dist/types/svm/utils/index.d.ts +0 -2
- package/dist/types/svm/utils/index.d.ts.map +0 -1
- package/src/svm/eventsClient.ts +0 -199
- package/src/svm/index.ts +0 -3
- package/src/svm/utils/events.ts +0 -58
- package/src/svm/utils/helpers.ts +0 -9
- package/src/svm/utils/index.ts +0 -1
- /package/dist/cjs/{svm → arch/svm}/types.js +0 -0
- /package/dist/cjs/providers/{mockProvider.d.ts → mocks/mockEthersProvider.d.ts} +0 -0
- /package/dist/esm/{svm → arch/svm}/types.js +0 -0
- /package/dist/esm/providers/{mockProvider.d.ts → mocks/mockEthersProvider.d.ts} +0 -0
package/src/utils/BlockUtils.ts
CHANGED
|
@@ -1,219 +1,9 @@
|
|
|
1
|
-
import assert from "assert";
|
|
2
|
-
import type { Block, Provider } from "@ethersproject/abstract-provider";
|
|
3
|
-
import { clamp, sortedIndexBy } from "lodash";
|
|
4
|
-
import { chainIsOPStack, getNetworkName } from "./NetworkUtils";
|
|
5
1
|
import { isDefined } from "./TypeGuards";
|
|
6
2
|
import { getCurrentTime } from "./TimeUtils";
|
|
7
3
|
import { CachingMechanismInterface } from "../interfaces";
|
|
8
4
|
import { shouldCache } from "./CachingUtils";
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
type Opts = {
|
|
12
|
-
highBlock?: number;
|
|
13
|
-
highBlockOffset?: number;
|
|
14
|
-
blockRange?: number;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
type BlockTimeAverage = {
|
|
18
|
-
average: number;
|
|
19
|
-
blockRange: number;
|
|
20
|
-
timestamp: number;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
// Archive requests typically commence at 128 blocks past the head of the chain.
|
|
24
|
-
// Round down to 120 blocks to avoid slipping into archive territory.
|
|
25
|
-
const defaultBlockRange = 120;
|
|
26
|
-
|
|
27
|
-
// Default offset to the high block number. This is subtracted from the block number of the high block
|
|
28
|
-
// when it is queried from the network, rather than having been specified by the caller. This is useful
|
|
29
|
-
// since the supplied Provider instance may be backed by multiple RPC providers, which can lead to some
|
|
30
|
-
// providers running slower than others and taking time to synchronise on the latest block.
|
|
31
|
-
const defaultHighBlockOffset = 10;
|
|
32
|
-
|
|
33
|
-
// Retain computations for 15 minutes.
|
|
34
|
-
const cacheTTL = 60 * 15;
|
|
35
|
-
const now = getCurrentTime(); // Seed the cache with initial values.
|
|
36
|
-
const blockTimes: { [chainId: number]: BlockTimeAverage } = {
|
|
37
|
-
[CHAIN_IDs.INK]: { average: 1, timestamp: now, blockRange: 1 },
|
|
38
|
-
[CHAIN_IDs.LINEA]: { average: 3, timestamp: now, blockRange: 1 },
|
|
39
|
-
[CHAIN_IDs.MAINNET]: { average: 12.5, timestamp: now, blockRange: 1 },
|
|
40
|
-
[CHAIN_IDs.OPTIMISM]: { average: 2, timestamp: now, blockRange: 1 },
|
|
41
|
-
[CHAIN_IDs.UNICHAIN]: { average: 1, timestamp: now, blockRange: 1 },
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* @description Compute the average block time over a block range.
|
|
46
|
-
* @returns Average number of seconds per block.
|
|
47
|
-
*/
|
|
48
|
-
export async function averageBlockTime(
|
|
49
|
-
provider: Provider,
|
|
50
|
-
{ highBlock, highBlockOffset, blockRange }: Opts = {}
|
|
51
|
-
): Promise<Pick<BlockTimeAverage, "average" | "blockRange">> {
|
|
52
|
-
// Does not block for StaticJsonRpcProvider.
|
|
53
|
-
const { chainId } = await provider.getNetwork();
|
|
54
|
-
|
|
55
|
-
// OP stack chains inherit Optimism block times, but can be overridden.
|
|
56
|
-
const cache = blockTimes[chainId] ?? (chainIsOPStack(chainId) ? blockTimes[CHAIN_IDs.OPTIMISM] : undefined);
|
|
57
|
-
|
|
58
|
-
const now = getCurrentTime();
|
|
59
|
-
if (isDefined(cache) && now < cache.timestamp + cacheTTL) {
|
|
60
|
-
return { average: cache.average, blockRange: cache.blockRange };
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// If the caller was not specific about highBlock, resolve it via the RPC provider. Subtract an offset
|
|
64
|
-
// to account for various RPC provider sync issues that might occur when querting the latest block.
|
|
65
|
-
if (!isDefined(highBlock)) {
|
|
66
|
-
highBlock = await provider.getBlockNumber();
|
|
67
|
-
highBlock -= highBlockOffset ?? defaultHighBlockOffset;
|
|
68
|
-
}
|
|
69
|
-
blockRange ??= defaultBlockRange;
|
|
70
|
-
|
|
71
|
-
const earliestBlockNumber = highBlock - blockRange;
|
|
72
|
-
const [firstBlock, lastBlock] = await Promise.all([
|
|
73
|
-
provider.getBlock(earliestBlockNumber),
|
|
74
|
-
provider.getBlock(highBlock),
|
|
75
|
-
]);
|
|
76
|
-
[firstBlock, lastBlock].forEach((block: Block | undefined) => {
|
|
77
|
-
if (!isDefined(block?.timestamp)) {
|
|
78
|
-
const network = getNetworkName(chainId);
|
|
79
|
-
const blockNumber = block === firstBlock ? earliestBlockNumber : highBlock;
|
|
80
|
-
throw new Error(`BlockFinder: Failed to fetch block ${blockNumber} on ${network}`);
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
const average = (lastBlock.timestamp - firstBlock.timestamp) / blockRange;
|
|
85
|
-
blockTimes[chainId] = { timestamp: now, average, blockRange };
|
|
86
|
-
|
|
87
|
-
return { average, blockRange };
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
async function estimateBlocksElapsed(seconds: number, cushionPercentage = 0.0, provider: Provider): Promise<number> {
|
|
91
|
-
const cushionMultiplier = cushionPercentage + 1.0;
|
|
92
|
-
const { average } = await averageBlockTime(provider);
|
|
93
|
-
return Math.floor((seconds * cushionMultiplier) / average);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export type BlockFinderHints = {
|
|
97
|
-
lowBlock?: number;
|
|
98
|
-
highBlock?: number;
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
export class BlockFinder {
|
|
102
|
-
constructor(
|
|
103
|
-
private readonly provider: Provider,
|
|
104
|
-
private readonly blocks: Block[] = []
|
|
105
|
-
) {}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* @notice Gets the latest block whose timestamp is <= the provided timestamp.
|
|
109
|
-
* @param number Timestamp timestamp to search.
|
|
110
|
-
* @param hints Optional low and high block to bound the search space.
|
|
111
|
-
*/
|
|
112
|
-
public async getBlockForTimestamp(timestamp: number | string, hints: BlockFinderHints = {}): Promise<Block> {
|
|
113
|
-
timestamp = Number(timestamp);
|
|
114
|
-
assert(timestamp !== undefined && timestamp !== null, "timestamp must be provided");
|
|
115
|
-
// If the last block we have stored is too early, grab the latest block.
|
|
116
|
-
if (this.blocks.length === 0 || this.blocks[this.blocks.length - 1].timestamp < timestamp) {
|
|
117
|
-
const block = await this.getLatestBlock();
|
|
118
|
-
if (timestamp >= block.timestamp) return block;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Prime the BlockFinder cache with any supplied hints.
|
|
122
|
-
// If the hint is accurate, then this will bypass the subsequent estimation.
|
|
123
|
-
await Promise.all(
|
|
124
|
-
Object.values(hints)
|
|
125
|
-
.filter((blockNumber) => isDefined(blockNumber))
|
|
126
|
-
.map((blockNumber) => this.getBlock(blockNumber))
|
|
127
|
-
);
|
|
128
|
-
|
|
129
|
-
// Check the first block. If it's greater than our timestamp, we need to find an earlier block.
|
|
130
|
-
if (this.blocks[0].timestamp > timestamp) {
|
|
131
|
-
const initialBlock = this.blocks[0];
|
|
132
|
-
// We use a 2x cushion to reduce the number of iterations in the following loop and increase the chance
|
|
133
|
-
// that the first block we find sets a floor for the target timestamp. The loop converges on the correct block
|
|
134
|
-
// slower than the following incremental search performed by `findBlock`, so we want to minimize the number of
|
|
135
|
-
// loop iterations in favor of searching more blocks over the `findBlock` search.
|
|
136
|
-
const cushion = 1;
|
|
137
|
-
const incrementDistance = Math.max(
|
|
138
|
-
// Ensure the increment block distance is _at least_ a single block to prevent an infinite loop.
|
|
139
|
-
await estimateBlocksElapsed(initialBlock.timestamp - timestamp, cushion, this.provider),
|
|
140
|
-
1
|
|
141
|
-
);
|
|
142
|
-
|
|
143
|
-
// Search backwards by a constant increment until we find a block before the timestamp or hit block 0.
|
|
144
|
-
for (let multiplier = 1; ; multiplier++) {
|
|
145
|
-
const distance = multiplier * incrementDistance;
|
|
146
|
-
const blockNumber = Math.max(0, initialBlock.number - distance);
|
|
147
|
-
const block = await this.getBlock(blockNumber);
|
|
148
|
-
if (block.timestamp <= timestamp) break; // Found an earlier block.
|
|
149
|
-
assert(blockNumber > 0, "timestamp is before block 0"); // Block 0 was not earlier than this timestamp. The row.
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Find the index where the block would be inserted and use that as the end block (since it is >= the timestamp).
|
|
154
|
-
const index = sortedIndexBy(this.blocks, { timestamp } as Block, "timestamp");
|
|
155
|
-
return this.findBlock(this.blocks[index - 1], this.blocks[index], timestamp);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Grabs the most recent block and caches it.
|
|
159
|
-
private async getLatestBlock() {
|
|
160
|
-
const block = await this.provider.getBlock("latest");
|
|
161
|
-
const index = sortedIndexBy(this.blocks, block, "number");
|
|
162
|
-
if (this.blocks[index]?.number !== block.number) this.blocks.splice(index, 0, block);
|
|
163
|
-
return this.blocks[index];
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Grabs the block for a particular number and caches it.
|
|
167
|
-
private async getBlock(number: number) {
|
|
168
|
-
let index = sortedIndexBy(this.blocks, { number } as Block, "number");
|
|
169
|
-
if (this.blocks[index]?.number === number) return this.blocks[index]; // Return early if block already exists.
|
|
170
|
-
const block = await this.provider.getBlock(number);
|
|
171
|
-
|
|
172
|
-
// Recompute the index after the async call since the state of this.blocks could have changed!
|
|
173
|
-
index = sortedIndexBy(this.blocks, { number } as Block, "number");
|
|
174
|
-
|
|
175
|
-
// Rerun this check to avoid duplicate insertion.
|
|
176
|
-
if (this.blocks[index]?.number === number) return this.blocks[index];
|
|
177
|
-
this.blocks.splice(index, 0, block); // A simple insert at index.
|
|
178
|
-
return block;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Return the latest block, between startBlock and endBlock, whose timestamp is <= timestamp.
|
|
182
|
-
// Effectively, this is an interpolation search algorithm to minimize block requests.
|
|
183
|
-
// Note: startBlock and endBlock _must_ be different blocks.
|
|
184
|
-
private async findBlock(_startBlock: Block, _endBlock: Block, timestamp: number): Promise<Block> {
|
|
185
|
-
const [startBlock, endBlock] = [_startBlock, _endBlock];
|
|
186
|
-
// In the case of equality, the endBlock is expected to be passed as the one whose timestamp === the requested
|
|
187
|
-
// timestamp.
|
|
188
|
-
if (endBlock.timestamp === timestamp) return endBlock;
|
|
189
|
-
|
|
190
|
-
// If there's no equality, but the blocks are adjacent, return the startBlock, since we want the returned block's
|
|
191
|
-
// timestamp to be <= the requested timestamp.
|
|
192
|
-
if (endBlock.number === startBlock.number + 1) return startBlock;
|
|
193
|
-
|
|
194
|
-
assert(endBlock.number !== startBlock.number, "startBlock cannot equal endBlock");
|
|
195
|
-
assert(
|
|
196
|
-
timestamp < endBlock.timestamp && timestamp > startBlock.timestamp,
|
|
197
|
-
"timestamp not in between start and end blocks"
|
|
198
|
-
);
|
|
199
|
-
|
|
200
|
-
// Interpolating the timestamp we're searching for to block numbers.
|
|
201
|
-
const totalTimeDifference = endBlock.timestamp - startBlock.timestamp;
|
|
202
|
-
const totalBlockDistance = endBlock.number - startBlock.number;
|
|
203
|
-
const blockPercentile = (timestamp - startBlock.timestamp) / totalTimeDifference;
|
|
204
|
-
const estimatedBlock = startBlock.number + Math.round(blockPercentile * totalBlockDistance);
|
|
205
|
-
|
|
206
|
-
// Clamp ensures the estimated block is strictly greater than the start block and strictly less than the end block.
|
|
207
|
-
const newBlock = await this.getBlock(clamp(estimatedBlock, startBlock.number + 1, endBlock.number - 1));
|
|
208
|
-
|
|
209
|
-
// Depending on whether the new block is below or above the timestamp, narrow the search space accordingly.
|
|
210
|
-
if (newBlock.timestamp < timestamp) {
|
|
211
|
-
return this.findBlock(newBlock, endBlock, timestamp);
|
|
212
|
-
} else {
|
|
213
|
-
return this.findBlock(startBlock, newBlock, timestamp);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
5
|
+
import { BlockFinderHints, BlockFinder, Block } from "./BlockFinder";
|
|
6
|
+
import { DEFAULT_CACHING_SAFE_LAG } from "../constants";
|
|
217
7
|
|
|
218
8
|
/**
|
|
219
9
|
* @notice Get the block number for a given timestamp fresh from on-chain data if not found in redis cache.
|
|
@@ -224,16 +14,16 @@ export class BlockFinder {
|
|
|
224
14
|
* or loading from cache. This is useful for testing primarily.
|
|
225
15
|
* @returns Block number for the requested timestamp.
|
|
226
16
|
*/
|
|
227
|
-
export async function getCachedBlockForTimestamp(
|
|
17
|
+
export async function getCachedBlockForTimestamp<TBlock extends Block>(
|
|
228
18
|
chainId: number,
|
|
229
19
|
timestamp: number,
|
|
230
|
-
blockFinder: BlockFinder
|
|
20
|
+
blockFinder: BlockFinder<TBlock>,
|
|
231
21
|
cache?: CachingMechanismInterface,
|
|
232
22
|
hints?: BlockFinderHints
|
|
233
23
|
): Promise<number> {
|
|
234
24
|
// Resolve a convenience function to directly compute what we're
|
|
235
25
|
// looking for.
|
|
236
|
-
const resolver = async () => (await blockFinder.getBlockForTimestamp(timestamp, hints)).number;
|
|
26
|
+
const resolver = async () => (await blockFinder.getBlockForTimestamp(timestamp, hints || {})).number;
|
|
237
27
|
|
|
238
28
|
// If no redis client, then request block from blockFinder.
|
|
239
29
|
if (!isDefined(cache)) {
|
package/src/utils/EventUtils.ts
CHANGED
|
@@ -99,9 +99,9 @@ export function spreadEvent(args: Result | Record<string, unknown>): { [key: str
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
export interface EventSearchConfig {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
102
|
+
from: number;
|
|
103
|
+
to: number;
|
|
104
|
+
maxLookBack?: number;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
export const eventToLog = (event: Event): Log => ({ ...event, event: event.event!, args: spreadEvent(event.args!) });
|
|
@@ -113,8 +113,8 @@ export async function paginatedEventQuery(
|
|
|
113
113
|
retryCount = 0
|
|
114
114
|
): Promise<Log[]> {
|
|
115
115
|
// If the max block look back is set to 0 then we dont need to do any pagination and can query over the whole range.
|
|
116
|
-
if (searchConfig.
|
|
117
|
-
const events = await contract.queryFilter(filter, searchConfig.
|
|
116
|
+
if (searchConfig.maxLookBack === 0) {
|
|
117
|
+
const events = await contract.queryFilter(filter, searchConfig.from, searchConfig.to);
|
|
118
118
|
return events.map(eventToLog);
|
|
119
119
|
}
|
|
120
120
|
|
|
@@ -132,7 +132,7 @@ export async function paginatedEventQuery(
|
|
|
132
132
|
)
|
|
133
133
|
.flat()
|
|
134
134
|
// Filter events by block number because ranges can include blocks that are outside the range specified for caching reasons.
|
|
135
|
-
.filter((event) => event.blockNumber >= searchConfig.
|
|
135
|
+
.filter((event) => event.blockNumber >= searchConfig.from && event.blockNumber <= searchConfig.to)
|
|
136
136
|
.map(eventToLog)
|
|
137
137
|
);
|
|
138
138
|
} catch (error) {
|
|
@@ -159,11 +159,11 @@ export async function paginatedEventQuery(
|
|
|
159
159
|
* input range, but can include blocks outside of the desired range, so results should be filtered. Results
|
|
160
160
|
* are ordered from smallest to largest.
|
|
161
161
|
*/
|
|
162
|
-
export function getPaginatedBlockRanges({
|
|
163
|
-
fromBlock
|
|
164
|
-
toBlock
|
|
165
|
-
maxBlockLookBack
|
|
166
|
-
|
|
162
|
+
export function getPaginatedBlockRanges({ from, to, maxLookBack }: EventSearchConfig): [number, number][] {
|
|
163
|
+
const fromBlock = from;
|
|
164
|
+
const toBlock = to;
|
|
165
|
+
const maxBlockLookBack = maxLookBack;
|
|
166
|
+
|
|
167
167
|
// If the maxBlockLookBack is undefined, we can look back as far as we like. Just return the entire range.
|
|
168
168
|
if (maxBlockLookBack === undefined) {
|
|
169
169
|
return [[fromBlock, toBlock]];
|
package/src/utils/JSONUtils.ts
CHANGED
|
@@ -33,6 +33,8 @@ export function stringifyJSONWithNumericString(obj: unknown): string {
|
|
|
33
33
|
return JSON.stringify(obj, (_key, value) => {
|
|
34
34
|
if (typeof value === "object" && value !== null && value.type === "BigNumber") {
|
|
35
35
|
return BigNumber.from(value).toString();
|
|
36
|
+
} else if (typeof value === "bigint" && value !== null) {
|
|
37
|
+
return value.toString();
|
|
36
38
|
}
|
|
37
39
|
return value;
|
|
38
40
|
});
|
package/src/utils/NumberUtils.ts
CHANGED
|
@@ -15,3 +15,13 @@ export function isInteger(value: unknown): value is number {
|
|
|
15
15
|
export function isPositiveInteger(value: unknown): value is number {
|
|
16
16
|
return isInteger(value) && value > 0;
|
|
17
17
|
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Returns a random integer between min (inclusive) and max (exclusive).
|
|
21
|
+
* @param min The minimum value (inclusive).
|
|
22
|
+
* @param max The maximum value (exclusive). Defaults to 1000000.
|
|
23
|
+
* @returns A random integer between min and max.
|
|
24
|
+
*/
|
|
25
|
+
export function getRandomInt(min: number = 0, max: number = 1000000) {
|
|
26
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
27
|
+
}
|
package/src/utils/SpokeUtils.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { encodeAbiParameters, keccak256 } from "viem";
|
|
1
|
+
import { encodeAbiParameters, Hex, keccak256 } from "viem";
|
|
2
2
|
import { MAX_SAFE_DEPOSIT_ID, ZERO_ADDRESS, ZERO_BYTES } from "../constants";
|
|
3
3
|
import { Deposit, RelayData } from "../interfaces";
|
|
4
4
|
import { toBytes32 } from "./AddressUtils";
|
|
5
5
|
import { BigNumber } from "./BigNumberUtils";
|
|
6
6
|
import { isMessageEmpty } from "./DepositUtils";
|
|
7
|
+
import { chainIsSvm } from "./NetworkUtils";
|
|
8
|
+
import { svm } from "../arch";
|
|
7
9
|
|
|
8
10
|
/**
|
|
9
11
|
* Produce the RelayData for a Deposit.
|
|
@@ -63,7 +65,9 @@ export function getRelayDataHash(relayData: RelayData, destinationChainId: numbe
|
|
|
63
65
|
outputToken: toBytes32(relayData.outputToken),
|
|
64
66
|
exclusiveRelayer: toBytes32(relayData.exclusiveRelayer),
|
|
65
67
|
};
|
|
66
|
-
|
|
68
|
+
if (chainIsSvm(destinationChainId)) {
|
|
69
|
+
return svm.getRelayDataHash(_relayData, destinationChainId);
|
|
70
|
+
}
|
|
67
71
|
return keccak256(encodeAbiParameters(abi, [_relayData, destinationChainId]));
|
|
68
72
|
}
|
|
69
73
|
|
|
@@ -87,5 +91,5 @@ export function isZeroAddress(address: string): boolean {
|
|
|
87
91
|
}
|
|
88
92
|
|
|
89
93
|
export function getMessageHash(message: string): string {
|
|
90
|
-
return isMessageEmpty(message) ? ZERO_BYTES : keccak256(message as
|
|
94
|
+
return isMessageEmpty(message) ? ZERO_BYTES : keccak256(message as Hex);
|
|
91
95
|
}
|
package/src/utils/index.ts
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mockProvider.js","sourceRoot":"","sources":["../../../src/providers/mockProvider.ts"],"names":[],"mappings":";;;;AAAA,iCAA8C;AAE9C,0DAAiD;AAMjD;IAAoC,0CAA+B;IAGjE,wBACW,oBAA+B,EAC/B,uBAAkC,EAClC,cAAkB;QAAlB,+BAAA,EAAA,kBAAkB;QAH7B,YAKE,kBAAM,SAAS,EAAE,cAAc,CAAC,SACjC;QALU,0BAAoB,GAApB,oBAAoB,CAAW;QAC/B,6BAAuB,GAAvB,uBAAuB,CAAW;QAClC,oBAAc,GAAd,cAAc,CAAI;QALrB,kBAAY,GAA4C,EAAE,CAAC;;IAQnE,CAAC;IAED,iCAAQ,GAAR,UAAS,oBAAoE;QAC3E,IAAM,SAAS,GAAU;YACvB,YAAY,EAAE,EAAE;YAChB,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,GAAG;YACV,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,uBAAM;YACnB,SAAS,EAAE,CAAC;YACZ,QAAQ,EAAE,uBAAM;YAChB,OAAO,EAAE,uBAAM;YACf,aAAa,EAAE,IAAI,CAAC,oBAAoB;YACxC,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI;SAChB,CAAC;QACF,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC;IAGD,6BAAI,GAAJ,UAAK,MAAc,EAAE,OAAmB;QACtC,QAAQ,MAAM,EAAE;YACd,KAAK,0BAA0B;gBAC7B,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACvD;gBACE,MAAM,IAAI,KAAK,CAAC,+CAAwC,MAAM,CAAE,CAAC,CAAC;SACrE;IACH,CAAC;IAED,mCAAU,GAAV;QACE,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,iBAAiB,EAAE,IAAI,CAAC,oBAAoB;YAC5C,oBAAoB,EAAE,IAAI,CAAC,uBAAuB;YAElD,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;IACL,CAAC;IAED,uCAAc,GAAd,UAAe,IAAY;QACzB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,oCAAW,GAAX;QACE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,mCAAU,GAAV;QACE,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,IAAI,CAAC,cAAc;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,wCAAe,GAAf,UAAgB,IAAY,EAAE,WAAgC;QAC5D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;IACxC,CAAC;IACH,qBAAC;AAAD,CAAC,AApED,CAAoC,kBAAS,CAAC,qBAAqB,GAoElE;AApEY,wCAAc"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import web3, { GetSignaturesForAddressApi, RpcTransport } from "@solana/kit";
|
|
2
|
-
import { EventData, EventName, EventWithData } from "./types";
|
|
3
|
-
type GetSignaturesForAddressConfig = Parameters<GetSignaturesForAddressApi["getSignaturesForAddress"]>[1];
|
|
4
|
-
export declare class SvmSpokeEventsClient {
|
|
5
|
-
private rpc;
|
|
6
|
-
private svmSpokeAddress;
|
|
7
|
-
private svmSpokeEventAuthority;
|
|
8
|
-
private constructor();
|
|
9
|
-
static create(rpc: web3.Rpc<web3.SolanaRpcApiFromTransport<RpcTransport>>): Promise<SvmSpokeEventsClient>;
|
|
10
|
-
queryEvents<T extends EventData>(eventName: EventName, fromSlot?: bigint, toSlot?: bigint, options?: GetSignaturesForAddressConfig): Promise<EventWithData<T>[]>;
|
|
11
|
-
private queryAllEvents;
|
|
12
|
-
private readEventsFromSignature;
|
|
13
|
-
private processEventFromTx;
|
|
14
|
-
}
|
|
15
|
-
export {};
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SvmSpokeEventsClient = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var contracts_1 = require("@across-protocol/contracts");
|
|
6
|
-
var web3_v1_1 = require("@across-protocol/contracts/dist/src/svm/web3-v1");
|
|
7
|
-
var kit_1 = tslib_1.__importDefault(require("@solana/kit"));
|
|
8
|
-
var utils_1 = require("../utils");
|
|
9
|
-
var events_1 = require("./utils/events");
|
|
10
|
-
var helpers_1 = require("./utils/helpers");
|
|
11
|
-
var SvmSpokeEventsClient = (function () {
|
|
12
|
-
function SvmSpokeEventsClient(rpc, svmSpokeAddress, eventAuthority) {
|
|
13
|
-
this.rpc = rpc;
|
|
14
|
-
this.svmSpokeAddress = svmSpokeAddress;
|
|
15
|
-
this.svmSpokeEventAuthority = eventAuthority;
|
|
16
|
-
}
|
|
17
|
-
SvmSpokeEventsClient.create = function (rpc) {
|
|
18
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
19
|
-
var isTestnet, programId, svmSpokeAddress, svmSpokeEventAuthority;
|
|
20
|
-
return tslib_1.__generator(this, function (_a) {
|
|
21
|
-
switch (_a.label) {
|
|
22
|
-
case 0: return [4, (0, helpers_1.isDevnet)(rpc)];
|
|
23
|
-
case 1:
|
|
24
|
-
isTestnet = _a.sent();
|
|
25
|
-
programId = (0, contracts_1.getDeployedAddress)("SvmSpoke", (0, web3_v1_1.getSolanaChainId)(isTestnet ? "devnet" : "mainnet").toString());
|
|
26
|
-
if (!programId)
|
|
27
|
-
throw new Error("Program not found");
|
|
28
|
-
svmSpokeAddress = kit_1.default.address(programId);
|
|
29
|
-
return [4, kit_1.default.getProgramDerivedAddress({
|
|
30
|
-
programAddress: svmSpokeAddress,
|
|
31
|
-
seeds: ["__event_authority"],
|
|
32
|
-
})];
|
|
33
|
-
case 2:
|
|
34
|
-
svmSpokeEventAuthority = (_a.sent())[0];
|
|
35
|
-
return [2, new SvmSpokeEventsClient(rpc, svmSpokeAddress, svmSpokeEventAuthority)];
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
};
|
|
40
|
-
SvmSpokeEventsClient.prototype.queryEvents = function (eventName, fromSlot, toSlot, options) {
|
|
41
|
-
if (options === void 0) { options = { limit: 1000, commitment: "confirmed" }; }
|
|
42
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
43
|
-
var events;
|
|
44
|
-
return tslib_1.__generator(this, function (_a) {
|
|
45
|
-
switch (_a.label) {
|
|
46
|
-
case 0: return [4, this.queryAllEvents(fromSlot, toSlot, options)];
|
|
47
|
-
case 1:
|
|
48
|
-
events = _a.sent();
|
|
49
|
-
return [2, events.filter(function (event) { return event.name === eventName; })];
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
};
|
|
54
|
-
SvmSpokeEventsClient.prototype.queryAllEvents = function (fromSlot, toSlot, options) {
|
|
55
|
-
if (options === void 0) { options = { limit: 1000, commitment: "confirmed" }; }
|
|
56
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
57
|
-
var allSignatures, hasMoreSignatures, currentOptions, signatures, filteredSignatures, eventsWithSlots;
|
|
58
|
-
var _this = this;
|
|
59
|
-
return tslib_1.__generator(this, function (_a) {
|
|
60
|
-
switch (_a.label) {
|
|
61
|
-
case 0:
|
|
62
|
-
allSignatures = [];
|
|
63
|
-
hasMoreSignatures = true;
|
|
64
|
-
currentOptions = options;
|
|
65
|
-
_a.label = 1;
|
|
66
|
-
case 1:
|
|
67
|
-
if (!hasMoreSignatures) return [3, 3];
|
|
68
|
-
return [4, this.rpc
|
|
69
|
-
.getSignaturesForAddress(this.svmSpokeAddress, currentOptions)
|
|
70
|
-
.send()];
|
|
71
|
-
case 2:
|
|
72
|
-
signatures = _a.sent();
|
|
73
|
-
allSignatures.push.apply(allSignatures, signatures);
|
|
74
|
-
if (signatures.length > 0) {
|
|
75
|
-
currentOptions = tslib_1.__assign(tslib_1.__assign({}, currentOptions), { before: signatures[signatures.length - 1].signature });
|
|
76
|
-
}
|
|
77
|
-
if (fromSlot && allSignatures.length > 0 && allSignatures[allSignatures.length - 1].slot < fromSlot) {
|
|
78
|
-
hasMoreSignatures = false;
|
|
79
|
-
}
|
|
80
|
-
hasMoreSignatures = Boolean(hasMoreSignatures && currentOptions.limit && signatures.length === currentOptions.limit);
|
|
81
|
-
return [3, 1];
|
|
82
|
-
case 3:
|
|
83
|
-
filteredSignatures = allSignatures.filter(function (signatureTransaction) {
|
|
84
|
-
if (fromSlot && signatureTransaction.slot < fromSlot)
|
|
85
|
-
return false;
|
|
86
|
-
if (toSlot && signatureTransaction.slot > toSlot)
|
|
87
|
-
return false;
|
|
88
|
-
return true;
|
|
89
|
-
});
|
|
90
|
-
return [4, Promise.all(filteredSignatures.map(function (signatureTransaction) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
91
|
-
var events;
|
|
92
|
-
return tslib_1.__generator(this, function (_a) {
|
|
93
|
-
switch (_a.label) {
|
|
94
|
-
case 0: return [4, this.readEventsFromSignature(signatureTransaction.signature, options.commitment)];
|
|
95
|
-
case 1:
|
|
96
|
-
events = _a.sent();
|
|
97
|
-
return [2, events.map(function (event) { return (tslib_1.__assign(tslib_1.__assign({}, event), { confirmationStatus: signatureTransaction.confirmationStatus, blockTime: signatureTransaction.blockTime, signature: signatureTransaction.signature, slot: signatureTransaction.slot })); })];
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
}); }))];
|
|
101
|
-
case 4:
|
|
102
|
-
eventsWithSlots = _a.sent();
|
|
103
|
-
return [2, eventsWithSlots.flat()];
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
};
|
|
108
|
-
SvmSpokeEventsClient.prototype.readEventsFromSignature = function (txSignature, commitment) {
|
|
109
|
-
if (commitment === void 0) { commitment = "confirmed"; }
|
|
110
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
111
|
-
var txResult;
|
|
112
|
-
return tslib_1.__generator(this, function (_a) {
|
|
113
|
-
switch (_a.label) {
|
|
114
|
-
case 0: return [4, this.rpc
|
|
115
|
-
.getTransaction(txSignature, { commitment: commitment, maxSupportedTransactionVersion: 0 })
|
|
116
|
-
.send()];
|
|
117
|
-
case 1:
|
|
118
|
-
txResult = _a.sent();
|
|
119
|
-
if (txResult === null)
|
|
120
|
-
return [2, []];
|
|
121
|
-
return [2, this.processEventFromTx(txResult)];
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
};
|
|
126
|
-
SvmSpokeEventsClient.prototype.processEventFromTx = function (txResult) {
|
|
127
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
128
|
-
if (!txResult)
|
|
129
|
-
return [];
|
|
130
|
-
var events = [];
|
|
131
|
-
var accountKeys = txResult.transaction.message.accountKeys;
|
|
132
|
-
var messageAccountKeys = tslib_1.__spreadArray([], accountKeys, true);
|
|
133
|
-
messageAccountKeys.push.apply(messageAccountKeys, ((_c = (_b = (_a = txResult === null || txResult === void 0 ? void 0 : txResult.meta) === null || _a === void 0 ? void 0 : _a.loadedAddresses) === null || _b === void 0 ? void 0 : _b.writable) !== null && _c !== void 0 ? _c : []));
|
|
134
|
-
messageAccountKeys.push.apply(messageAccountKeys, ((_f = (_e = (_d = txResult === null || txResult === void 0 ? void 0 : txResult.meta) === null || _d === void 0 ? void 0 : _d.loadedAddresses) === null || _e === void 0 ? void 0 : _e.readonly) !== null && _f !== void 0 ? _f : []));
|
|
135
|
-
for (var _i = 0, _j = (_h = (_g = txResult.meta) === null || _g === void 0 ? void 0 : _g.innerInstructions) !== null && _h !== void 0 ? _h : []; _i < _j.length; _i++) {
|
|
136
|
-
var ixBlock = _j[_i];
|
|
137
|
-
for (var _k = 0, _l = ixBlock.instructions; _k < _l.length; _k++) {
|
|
138
|
-
var ix = _l[_k];
|
|
139
|
-
var ixProgramId = messageAccountKeys[ix.programIdIndex];
|
|
140
|
-
var singleIxAccount = ix.accounts.length === 1 ? messageAccountKeys[ix.accounts[0]] : undefined;
|
|
141
|
-
if (ixProgramId !== undefined &&
|
|
142
|
-
singleIxAccount !== undefined &&
|
|
143
|
-
this.svmSpokeAddress === ixProgramId &&
|
|
144
|
-
this.svmSpokeEventAuthority === singleIxAccount) {
|
|
145
|
-
var ixData = utils_1.bs58.decode(ix.data);
|
|
146
|
-
var eventData = Buffer.from(ixData.slice(8)).toString("base64");
|
|
147
|
-
var _m = (0, events_1.decodeEvent)(contracts_1.SvmSpokeIdl, eventData), name_1 = _m.name, data = _m.data;
|
|
148
|
-
events.push({ program: this.svmSpokeAddress, name: name_1, data: data });
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return events;
|
|
153
|
-
};
|
|
154
|
-
return SvmSpokeEventsClient;
|
|
155
|
-
}());
|
|
156
|
-
exports.SvmSpokeEventsClient = SvmSpokeEventsClient;
|
|
157
|
-
//# sourceMappingURL=eventsClient.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"eventsClient.js","sourceRoot":"","sources":["../../../src/svm/eventsClient.ts"],"names":[],"mappings":";;;;AAAA,wDAA6E;AAC7E,2EAAmF;AACnF,4DAOqB;AACrB,kCAAgC;AAEhC,yCAA6C;AAC7C,2CAA2C;AAe3C;IAQE,8BACE,GAA2D,EAC3D,eAAwB,EACxB,cAAuB;QAEvB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,sBAAsB,GAAG,cAAc,CAAC;IAC/C,CAAC;IAKmB,2BAAM,GAA1B,UACE,GAA2D;;;;;4BAEzC,WAAM,IAAA,kBAAQ,EAAC,GAAG,CAAC,EAAA;;wBAA/B,SAAS,GAAG,SAAmB;wBAC/B,SAAS,GAAG,IAAA,8BAAkB,EAAC,UAAU,EAAE,IAAA,0BAAgB,EAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;wBAChH,IAAI,CAAC,SAAS;4BAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;wBAC/C,eAAe,GAAG,aAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;wBACf,WAAM,aAAI,CAAC,wBAAwB,CAAC;gCACnE,cAAc,EAAE,eAAe;gCAC/B,KAAK,EAAE,CAAC,mBAAmB,CAAC;6BAC7B,CAAC,EAAA;;wBAHK,sBAAsB,GAAI,CAAA,SAG/B,CAAA,GAH2B;wBAI7B,WAAO,IAAI,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,sBAAsB,CAAC,EAAC;;;;KAC/E;IAWY,0CAAW,GAAxB,UACE,SAAoB,EACpB,QAAiB,EACjB,MAAe,EACf,OAAiF;QAAjF,wBAAA,EAAA,YAA2C,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE;;;;;4BAElE,WAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAA;;wBAA7D,MAAM,GAAG,SAAoD;wBACnE,WAAO,MAAM,CAAC,MAAM,CAAC,UAAC,KAAK,IAAK,OAAA,KAAK,CAAC,IAAI,KAAK,SAAS,EAAxB,CAAwB,CAAuB,EAAC;;;;KACjF;IAUa,6CAAc,GAA5B,UACE,QAAiB,EACjB,MAAe,EACf,OAAiF;QAAjF,wBAAA,EAAA,YAA2C,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE;;;;;;;wBAE3E,aAAa,GAAyC,EAAE,CAAC;wBAC3D,iBAAiB,GAAG,IAAI,CAAC;wBACzB,cAAc,GAAG,OAAO,CAAC;;;6BAEtB,iBAAiB;wBACiC,WAAM,IAAI,CAAC,GAAG;iCAClE,uBAAuB,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC;iCAC7D,IAAI,EAAE,EAAA;;wBAFH,UAAU,GAAuC,SAE9C;wBAET,aAAa,CAAC,IAAI,OAAlB,aAAa,EAAS,UAAU,EAAE;wBAGlC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;4BACzB,cAAc,yCAAQ,cAAc,KAAE,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,GAAE,CAAC;yBAC7F;wBAED,IAAI,QAAQ,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,QAAQ,EAAE;4BACnG,iBAAiB,GAAG,KAAK,CAAC;yBAC3B;wBAED,iBAAiB,GAAG,OAAO,CACzB,iBAAiB,IAAI,cAAc,CAAC,KAAK,IAAI,UAAU,CAAC,MAAM,KAAK,cAAc,CAAC,KAAK,CACxF,CAAC;;;wBAGE,kBAAkB,GAAG,aAAa,CAAC,MAAM,CAAC,UAAC,oBAAoB;4BACnE,IAAI,QAAQ,IAAI,oBAAoB,CAAC,IAAI,GAAG,QAAQ;gCAAE,OAAO,KAAK,CAAC;4BACnE,IAAI,MAAM,IAAI,oBAAoB,CAAC,IAAI,GAAG,MAAM;gCAAE,OAAO,KAAK,CAAC;4BAC/D,OAAO,IAAI,CAAC;wBACd,CAAC,CAAC,CAAC;wBAGqB,WAAM,OAAO,CAAC,GAAG,CACvC,kBAAkB,CAAC,GAAG,CAAC,UAAO,oBAAoB;;;;gDACjC,WAAM,IAAI,CAAC,uBAAuB,CAAC,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,EAAA;;4CAA/F,MAAM,GAAG,SAAsF;4CACrG,WAAO,MAAM,CAAC,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,uCACxB,KAAK,KACR,kBAAkB,EAAE,oBAAoB,CAAC,kBAAkB,EAC3D,SAAS,EAAE,oBAAoB,CAAC,SAAS,EACzC,SAAS,EAAE,oBAAoB,CAAC,SAAS,EACzC,IAAI,EAAE,oBAAoB,CAAC,IAAI,IAC/B,EAN2B,CAM3B,CAAC,EAAC;;;iCACL,CAAC,CACH,EAAA;;wBAXK,eAAe,GAAG,SAWvB;wBACD,WAAO,eAAe,CAAC,IAAI,EAAE,EAAC;;;;KAC/B;IASa,sDAAuB,GAArC,UAAsC,WAAsB,EAAE,UAAoC;QAApC,2BAAA,EAAA,wBAAoC;;;;;4BAC/E,WAAM,IAAI,CAAC,GAAG;6BAC5B,cAAc,CAAC,WAAW,EAAE,EAAE,UAAU,YAAA,EAAE,8BAA8B,EAAE,CAAC,EAAE,CAAC;6BAC9E,IAAI,EAAE,EAAA;;wBAFH,QAAQ,GAAG,SAER;wBAET,IAAI,QAAQ,KAAK,IAAI;4BAAE,WAAO,EAAE,EAAC;wBACjC,WAAO,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,EAAC;;;;KAC1C;IAQO,iDAAkB,GAA1B,UACE,QAAkC;;QAElC,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QACzB,IAAM,MAAM,GAA6D,EAAE,CAAC;QAE5E,IAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC;QAC7D,IAAM,kBAAkB,6BAAO,WAAW,OAAC,CAAC;QAG5C,kBAAkB,CAAC,IAAI,OAAvB,kBAAkB,EAAS,CAAC,MAAA,MAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,0CAAE,eAAe,0CAAE,QAAQ,mCAAI,EAAE,CAAC,EAAE;QAC9E,kBAAkB,CAAC,IAAI,OAAvB,kBAAkB,EAAS,CAAC,MAAA,MAAA,MAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,IAAI,0CAAE,eAAe,0CAAE,QAAQ,mCAAI,EAAE,CAAC,EAAE;QAE9E,KAAsB,UAAsC,EAAtC,WAAA,MAAA,QAAQ,CAAC,IAAI,0CAAE,iBAAiB,mCAAI,EAAE,EAAtC,cAAsC,EAAtC,IAAsC,EAAE;YAAzD,IAAM,OAAO,SAAA;YAChB,KAAiB,UAAoB,EAApB,KAAA,OAAO,CAAC,YAAY,EAApB,cAAoB,EAApB,IAAoB,EAAE;gBAAlC,IAAM,EAAE,SAAA;gBACX,IAAM,WAAW,GAAG,kBAAkB,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;gBAC1D,IAAM,eAAe,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClG,IACE,WAAW,KAAK,SAAS;oBACzB,eAAe,KAAK,SAAS;oBAC7B,IAAI,CAAC,eAAe,KAAK,WAAW;oBACpC,IAAI,CAAC,sBAAsB,KAAK,eAAe,EAC/C;oBACA,IAAM,MAAM,GAAG,YAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;oBAEpC,IAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAC5D,IAAA,KAAiB,IAAA,oBAAW,EAAC,uBAAW,EAAE,SAAS,CAAC,EAAlD,MAAI,UAAA,EAAE,IAAI,UAAwC,CAAC;oBAC3D,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,QAAA,EAAE,IAAI,MAAA,EAAE,CAAC,CAAC;iBAC5D;aACF;SACF;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IACH,2BAAC;AAAD,CAAC,AA1KD,IA0KC;AA1KY,oDAAoB"}
|
package/dist/cjs/svm/index.d.ts
DELETED
package/dist/cjs/svm/index.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.utils = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
tslib_1.__exportStar(require("./eventsClient"), exports);
|
|
6
|
-
tslib_1.__exportStar(require("./types"), exports);
|
|
7
|
-
exports.utils = tslib_1.__importStar(require("./utils"));
|
|
8
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/svm/index.ts"],"names":[],"mappings":";;;;AAAA,yDAA+B;AAC/B,kDAAwB;AACxB,yDAAiC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/svm/types.ts"],"names":[],"mappings":";;;AAmBA,IAAY,aAeX;AAfD,WAAY,aAAa;IACvB,4CAA2B,CAAA;IAC3B,kDAAiC,CAAA;IACjC,4DAA2C,CAAA;IAC3C,wDAAuC,CAAA;IACvC,wEAAuD,CAAA;IACvD,sDAAqC,CAAA;IACrC,kDAAiC,CAAA;IACjC,4CAA2B,CAAA;IAC3B,oDAAmC,CAAA;IACnC,0EAAyD,CAAA;IACzD,wDAAuC,CAAA;IACvC,8DAA6C,CAAA;IAC7C,gDAA+B,CAAA;IAC/B,8DAA6C,CAAA;AAC/C,CAAC,EAfW,aAAa,6BAAb,aAAa,QAexB"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Idl } from "@coral-xyz/anchor";
|
|
2
|
-
import { EventName, EventData } from "../types";
|
|
3
|
-
export declare function parseEventData(eventData: any): any;
|
|
4
|
-
export declare function decodeEvent(idl: Idl, rawEvent: string): {
|
|
5
|
-
data: EventData;
|
|
6
|
-
name: EventName;
|
|
7
|
-
};
|
|
8
|
-
export declare function getEventName(rawName: string): EventName;
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getEventName = exports.decodeEvent = exports.parseEventData = void 0;
|
|
4
|
-
var anchor_1 = require("@coral-xyz/anchor");
|
|
5
|
-
var kit_1 = require("@solana/kit");
|
|
6
|
-
var types_1 = require("../types");
|
|
7
|
-
function parseEventData(eventData) {
|
|
8
|
-
if (!eventData)
|
|
9
|
-
return eventData;
|
|
10
|
-
if (Array.isArray(eventData)) {
|
|
11
|
-
return eventData.map(parseEventData);
|
|
12
|
-
}
|
|
13
|
-
if (typeof eventData === "object") {
|
|
14
|
-
if (eventData.constructor.name === "PublicKey") {
|
|
15
|
-
return (0, kit_1.address)(eventData.toString());
|
|
16
|
-
}
|
|
17
|
-
if (anchor_1.BN.isBN(eventData)) {
|
|
18
|
-
return BigInt(eventData.toString());
|
|
19
|
-
}
|
|
20
|
-
return Object.fromEntries(Object.entries(eventData).map(function (_a) {
|
|
21
|
-
var key = _a[0], value = _a[1];
|
|
22
|
-
return [snakeToCamel(key), parseEventData(value)];
|
|
23
|
-
}));
|
|
24
|
-
}
|
|
25
|
-
return eventData;
|
|
26
|
-
}
|
|
27
|
-
exports.parseEventData = parseEventData;
|
|
28
|
-
function decodeEvent(idl, rawEvent) {
|
|
29
|
-
var event = new anchor_1.BorshEventCoder(idl).decode(rawEvent);
|
|
30
|
-
if (!event)
|
|
31
|
-
throw new Error("Malformed rawEvent for IDL ".concat(idl.address, ": ").concat(rawEvent));
|
|
32
|
-
return {
|
|
33
|
-
name: getEventName(event.name),
|
|
34
|
-
data: parseEventData(event.data),
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
exports.decodeEvent = decodeEvent;
|
|
38
|
-
function snakeToCamel(s) {
|
|
39
|
-
return s.replace(/(_\w)/g, function (match) { return match[1].toUpperCase(); });
|
|
40
|
-
}
|
|
41
|
-
function getEventName(rawName) {
|
|
42
|
-
if (Object.values(types_1.SVMEventNames).some(function (name) { return rawName.includes(name); }))
|
|
43
|
-
return rawName;
|
|
44
|
-
throw new Error("Unknown event name: ".concat(rawName));
|
|
45
|
-
}
|
|
46
|
-
exports.getEventName = getEventName;
|
|
47
|
-
//# sourceMappingURL=events.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../src/svm/utils/events.ts"],"names":[],"mappings":";;;AAAA,4CAA6D;AAC7D,mCAAsC;AACtC,kCAA+D;AAM/D,SAAgB,cAAc,CAAC,SAAc;IAC3C,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QAC5B,OAAO,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;KACtC;IAED,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;QACjC,IAAI,SAAS,CAAC,WAAW,CAAC,IAAI,KAAK,WAAW,EAAE;YAC9C,OAAO,IAAA,aAAO,EAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;SACtC;QACD,IAAI,WAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACtB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;SACrC;QAGD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,UAAC,EAAY;gBAAX,GAAG,QAAA,EAAE,KAAK,QAAA;YAAM,OAAA,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;QAA1C,CAA0C,CAAC,CAC5F,CAAC;KACH;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAtBD,wCAsBC;AAKD,SAAgB,WAAW,CAAC,GAAQ,EAAE,QAAgB;IACpD,IAAM,KAAK,GAAG,IAAI,wBAAe,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,qCAA8B,GAAG,CAAC,OAAO,eAAK,QAAQ,CAAE,CAAC,CAAC;IACtF,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;QAC9B,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC;KACjC,CAAC;AACJ,CAAC;AAPD,kCAOC;AAKD,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAC,KAAK,IAAK,OAAA,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAtB,CAAsB,CAAC,CAAC;AAChE,CAAC;AAKD,SAAgB,YAAY,CAAC,OAAe;IAC1C,IAAI,MAAM,CAAC,MAAM,CAAC,qBAAa,CAAC,CAAC,IAAI,CAAC,UAAC,IAAI,IAAK,OAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAtB,CAAsB,CAAC;QAAE,OAAO,OAAoB,CAAC;IACrG,MAAM,IAAI,KAAK,CAAC,8BAAuB,OAAO,CAAE,CAAC,CAAC;AACpD,CAAC;AAHD,oCAGC"}
|