@across-protocol/sdk 4.3.111-alpha.4 → 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.
Files changed (566) hide show
  1. package/dist/cjs/addressAggregator/adapters/abstract.js +64 -50
  2. package/dist/cjs/addressAggregator/adapters/abstract.js.map +1 -1
  3. package/dist/cjs/addressAggregator/adapters/bybit.js +29 -16
  4. package/dist/cjs/addressAggregator/adapters/bybit.js.map +1 -1
  5. package/dist/cjs/addressAggregator/adapters/env.js +15 -11
  6. package/dist/cjs/addressAggregator/adapters/env.js.map +1 -1
  7. package/dist/cjs/addressAggregator/adapters/file.js +45 -32
  8. package/dist/cjs/addressAggregator/adapters/file.js.map +1 -1
  9. package/dist/cjs/addressAggregator/adapters/index.js +1 -1
  10. package/dist/cjs/addressAggregator/adapters/risklabs.js +36 -22
  11. package/dist/cjs/addressAggregator/adapters/risklabs.js.map +1 -1
  12. package/dist/cjs/addressAggregator/index.js +87 -57
  13. package/dist/cjs/addressAggregator/index.js.map +1 -1
  14. package/dist/cjs/apiClient/abstractClient.js +8 -9
  15. package/dist/cjs/apiClient/abstractClient.js.map +1 -1
  16. package/dist/cjs/apiClient/index.js +1 -1
  17. package/dist/cjs/apiClient/mockedClient.js +29 -23
  18. package/dist/cjs/apiClient/mockedClient.js.map +1 -1
  19. package/dist/cjs/apiClient/productionClient.js +103 -65
  20. package/dist/cjs/apiClient/productionClient.js.map +1 -1
  21. package/dist/cjs/arch/evm/BlockUtils.js +208 -122
  22. package/dist/cjs/arch/evm/BlockUtils.js.map +1 -1
  23. package/dist/cjs/arch/evm/MessageUtils.js +1 -1
  24. package/dist/cjs/arch/evm/MessageUtils.js.map +1 -1
  25. package/dist/cjs/arch/evm/SpokeUtils.js +288 -134
  26. package/dist/cjs/arch/evm/SpokeUtils.js.map +1 -1
  27. package/dist/cjs/arch/evm/index.js +1 -1
  28. package/dist/cjs/arch/evm/utils/index.js +1 -1
  29. package/dist/cjs/arch/evm/utils/wait.js +49 -38
  30. package/dist/cjs/arch/evm/utils/wait.js.map +1 -1
  31. package/dist/cjs/arch/index.js +1 -1
  32. package/dist/cjs/arch/svm/BlockUtils.js +158 -102
  33. package/dist/cjs/arch/svm/BlockUtils.js.map +1 -1
  34. package/dist/cjs/arch/svm/MessageUtils.js +2 -2
  35. package/dist/cjs/arch/svm/MessageUtils.js.map +1 -1
  36. package/dist/cjs/arch/svm/SpokeUtils.js +1147 -708
  37. package/dist/cjs/arch/svm/SpokeUtils.js.map +1 -1
  38. package/dist/cjs/arch/svm/encoders.js +1 -1
  39. package/dist/cjs/arch/svm/encoders.js.map +1 -1
  40. package/dist/cjs/arch/svm/eventsClient.js +236 -174
  41. package/dist/cjs/arch/svm/eventsClient.js.map +1 -1
  42. package/dist/cjs/arch/svm/index.js +1 -1
  43. package/dist/cjs/arch/svm/provider.js +3 -3
  44. package/dist/cjs/arch/svm/provider.js.map +1 -1
  45. package/dist/cjs/arch/svm/utils.js +355 -166
  46. package/dist/cjs/arch/svm/utils.js.map +1 -1
  47. package/dist/cjs/caching/Arweave/ArweaveClient.js +246 -168
  48. package/dist/cjs/caching/Arweave/ArweaveClient.js.map +1 -1
  49. package/dist/cjs/caching/Arweave/index.js +1 -1
  50. package/dist/cjs/caching/IPFS/PinataIPFSClient.js +49 -40
  51. package/dist/cjs/caching/IPFS/PinataIPFSClient.js.map +1 -1
  52. package/dist/cjs/caching/IPFS/index.js +1 -1
  53. package/dist/cjs/caching/Memory/MemoryCacheClient.js +18 -13
  54. package/dist/cjs/caching/Memory/MemoryCacheClient.js.map +1 -1
  55. package/dist/cjs/caching/Memory/index.js +1 -1
  56. package/dist/cjs/caching/index.js +1 -1
  57. package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js +381 -302
  58. package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js.map +1 -1
  59. package/dist/cjs/clients/AcrossConfigStoreClient/index.js +1 -1
  60. package/dist/cjs/clients/BaseAbstractClient.js +83 -58
  61. package/dist/cjs/clients/BaseAbstractClient.js.map +1 -1
  62. package/dist/cjs/clients/BundleDataClient/BundleDataClient.js +900 -709
  63. package/dist/cjs/clients/BundleDataClient/BundleDataClient.js.map +1 -1
  64. package/dist/cjs/clients/BundleDataClient/index.js +1 -1
  65. package/dist/cjs/clients/BundleDataClient/utils/DataworkerUtils.js +128 -95
  66. package/dist/cjs/clients/BundleDataClient/utils/DataworkerUtils.js.map +1 -1
  67. package/dist/cjs/clients/BundleDataClient/utils/FillUtils.js +53 -48
  68. package/dist/cjs/clients/BundleDataClient/utils/FillUtils.js.map +1 -1
  69. package/dist/cjs/clients/BundleDataClient/utils/MerkleTreeUtils.js +8 -10
  70. package/dist/cjs/clients/BundleDataClient/utils/MerkleTreeUtils.js.map +1 -1
  71. package/dist/cjs/clients/BundleDataClient/utils/PoolRebalanceUtils.js +90 -67
  72. package/dist/cjs/clients/BundleDataClient/utils/PoolRebalanceUtils.js.map +1 -1
  73. package/dist/cjs/clients/BundleDataClient/utils/SuperstructUtils.js +24 -46
  74. package/dist/cjs/clients/BundleDataClient/utils/SuperstructUtils.js.map +1 -1
  75. package/dist/cjs/clients/BundleDataClient/utils/index.js +1 -1
  76. package/dist/cjs/clients/HubPoolClient.js +708 -526
  77. package/dist/cjs/clients/HubPoolClient.js.map +1 -1
  78. package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.js +179 -133
  79. package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
  80. package/dist/cjs/clients/SpokePoolClient/SVMSpokePoolClient.js +183 -124
  81. package/dist/cjs/clients/SpokePoolClient/SVMSpokePoolClient.js.map +1 -1
  82. package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.js +389 -357
  83. package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.js.map +1 -1
  84. package/dist/cjs/clients/SpokePoolClient/SpokePoolClientManager.js +8 -9
  85. package/dist/cjs/clients/SpokePoolClient/SpokePoolClientManager.js.map +1 -1
  86. package/dist/cjs/clients/SpokePoolClient/index.js +3 -3
  87. package/dist/cjs/clients/SpokePoolClient/index.js.map +1 -1
  88. package/dist/cjs/clients/index.js +1 -1
  89. package/dist/cjs/clients/mocks/MockConfigStoreClient.js +67 -58
  90. package/dist/cjs/clients/mocks/MockConfigStoreClient.js.map +1 -1
  91. package/dist/cjs/clients/mocks/MockEvents.js +52 -47
  92. package/dist/cjs/clients/mocks/MockEvents.js.map +1 -1
  93. package/dist/cjs/clients/mocks/MockHubPoolClient.js +185 -142
  94. package/dist/cjs/clients/mocks/MockHubPoolClient.js.map +1 -1
  95. package/dist/cjs/clients/mocks/MockSpokePoolClient.js +192 -208
  96. package/dist/cjs/clients/mocks/MockSpokePoolClient.js.map +1 -1
  97. package/dist/cjs/clients/mocks/MockSvmCpiEventsClient.js +143 -140
  98. package/dist/cjs/clients/mocks/MockSvmCpiEventsClient.js.map +1 -1
  99. package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.js +73 -57
  100. package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.js.map +1 -1
  101. package/dist/cjs/clients/mocks/index.js +1 -1
  102. package/dist/cjs/coingecko/Coingecko.js +437 -285
  103. package/dist/cjs/coingecko/Coingecko.js.map +1 -1
  104. package/dist/cjs/coingecko/index.js +1 -1
  105. package/dist/cjs/constants.js +30 -23
  106. package/dist/cjs/constants.js.map +1 -1
  107. package/dist/cjs/contracts/acrossConfigStore.js +48 -27
  108. package/dist/cjs/contracts/acrossConfigStore.js.map +1 -1
  109. package/dist/cjs/contracts/hubPool.js +20 -36
  110. package/dist/cjs/contracts/hubPool.js.map +1 -1
  111. package/dist/cjs/contracts/index.js +1 -1
  112. package/dist/cjs/contracts/utils.js +8 -6
  113. package/dist/cjs/contracts/utils.js.map +1 -1
  114. package/dist/cjs/gasPriceOracle/adapters/arbitrum.js +16 -7
  115. package/dist/cjs/gasPriceOracle/adapters/arbitrum.js.map +1 -1
  116. package/dist/cjs/gasPriceOracle/adapters/ethereum.js +45 -26
  117. package/dist/cjs/gasPriceOracle/adapters/ethereum.js.map +1 -1
  118. package/dist/cjs/gasPriceOracle/adapters/linea-viem.js +28 -16
  119. package/dist/cjs/gasPriceOracle/adapters/linea-viem.js.map +1 -1
  120. package/dist/cjs/gasPriceOracle/adapters/polygon.js +112 -73
  121. package/dist/cjs/gasPriceOracle/adapters/polygon.js.map +1 -1
  122. package/dist/cjs/gasPriceOracle/adapters/solana.js +33 -20
  123. package/dist/cjs/gasPriceOracle/adapters/solana.js.map +1 -1
  124. package/dist/cjs/gasPriceOracle/oracle.js +104 -77
  125. package/dist/cjs/gasPriceOracle/oracle.js.map +1 -1
  126. package/dist/cjs/gasPriceOracle/types.js +3 -3
  127. package/dist/cjs/gasPriceOracle/types.js.map +1 -1
  128. package/dist/cjs/gasPriceOracle/util.js +8 -8
  129. package/dist/cjs/gasPriceOracle/util.js.map +1 -1
  130. package/dist/cjs/index.js +1 -1
  131. package/dist/cjs/interfaces/index.js +1 -1
  132. package/dist/cjs/lpFeeCalculator/index.js +1 -1
  133. package/dist/cjs/lpFeeCalculator/lpFeeCalculator.js +35 -33
  134. package/dist/cjs/lpFeeCalculator/lpFeeCalculator.js.map +1 -1
  135. package/dist/cjs/lpFeeCalculator/rateModel.js +9 -7
  136. package/dist/cjs/lpFeeCalculator/rateModel.js.map +1 -1
  137. package/dist/cjs/merkleDistributor/MerkleDistributor.js +18 -20
  138. package/dist/cjs/merkleDistributor/MerkleDistributor.js.map +1 -1
  139. package/dist/cjs/merkleDistributor/index.js +1 -1
  140. package/dist/cjs/merkleDistributor/model/index.js +1 -1
  141. package/dist/cjs/pool/TransactionManager.js +100 -45
  142. package/dist/cjs/pool/TransactionManager.js.map +1 -1
  143. package/dist/cjs/pool/index.js +1 -1
  144. package/dist/cjs/pool/poolClient.js +731 -464
  145. package/dist/cjs/pool/poolClient.js.map +1 -1
  146. package/dist/cjs/pool/uma/across/index.js +1 -1
  147. package/dist/cjs/pool/uma/across/transactionManager.js +100 -45
  148. package/dist/cjs/pool/uma/across/transactionManager.js.map +1 -1
  149. package/dist/cjs/pool/uma/clients/erc20/client.js +16 -18
  150. package/dist/cjs/pool/uma/clients/erc20/client.js.map +1 -1
  151. package/dist/cjs/pool/uma/clients/erc20/index.js +1 -1
  152. package/dist/cjs/pool/uma/clients/index.js +1 -1
  153. package/dist/cjs/pool/uma/index.js +1 -1
  154. package/dist/cjs/pool/uma/oracle/index.js +1 -1
  155. package/dist/cjs/pool/uma/oracle/utils.js +5 -4
  156. package/dist/cjs/pool/uma/oracle/utils.js.map +1 -1
  157. package/dist/cjs/pool/uma/utils.js +30 -11
  158. package/dist/cjs/pool/uma/utils.js.map +1 -1
  159. package/dist/cjs/priceClient/adapters/acrossApi.js +39 -22
  160. package/dist/cjs/priceClient/adapters/acrossApi.js.map +1 -1
  161. package/dist/cjs/priceClient/adapters/baseAdapter.js +73 -49
  162. package/dist/cjs/priceClient/adapters/baseAdapter.js.map +1 -1
  163. package/dist/cjs/priceClient/adapters/coingecko.js +61 -34
  164. package/dist/cjs/priceClient/adapters/coingecko.js.map +1 -1
  165. package/dist/cjs/priceClient/adapters/default.js +31 -16
  166. package/dist/cjs/priceClient/adapters/default.js.map +1 -1
  167. package/dist/cjs/priceClient/adapters/defiLlama.js +74 -40
  168. package/dist/cjs/priceClient/adapters/defiLlama.js.map +1 -1
  169. package/dist/cjs/priceClient/adapters/index.js +1 -1
  170. package/dist/cjs/priceClient/index.js +1 -1
  171. package/dist/cjs/priceClient/priceClient.js +159 -110
  172. package/dist/cjs/priceClient/priceClient.js.map +1 -1
  173. package/dist/cjs/providers/alchemy.js +19 -17
  174. package/dist/cjs/providers/alchemy.js.map +1 -1
  175. package/dist/cjs/providers/cachedProvider.js +129 -88
  176. package/dist/cjs/providers/cachedProvider.js.map +1 -1
  177. package/dist/cjs/providers/drpc.js +11 -9
  178. package/dist/cjs/providers/drpc.js.map +1 -1
  179. package/dist/cjs/providers/index.js +1 -1
  180. package/dist/cjs/providers/infura.js +12 -10
  181. package/dist/cjs/providers/infura.js.map +1 -1
  182. package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.js +15 -7
  183. package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.js.map +1 -1
  184. package/dist/cjs/providers/mocks/MockRateLimitedSolanaRpcFactory.js +14 -6
  185. package/dist/cjs/providers/mocks/MockRateLimitedSolanaRpcFactory.js.map +1 -1
  186. package/dist/cjs/providers/mocks/MockRetrySolanaRpcFactory.js +15 -7
  187. package/dist/cjs/providers/mocks/MockRetrySolanaRpcFactory.js.map +1 -1
  188. package/dist/cjs/providers/mocks/MockSolanaRpcFactory.js +66 -42
  189. package/dist/cjs/providers/mocks/MockSolanaRpcFactory.js.map +1 -1
  190. package/dist/cjs/providers/mocks/index.js +1 -1
  191. package/dist/cjs/providers/mocks/mockEthersProvider.js +31 -29
  192. package/dist/cjs/providers/mocks/mockEthersProvider.js.map +1 -1
  193. package/dist/cjs/providers/quicknode.js +21 -19
  194. package/dist/cjs/providers/quicknode.js.map +1 -1
  195. package/dist/cjs/providers/rateLimitedProvider.js +79 -64
  196. package/dist/cjs/providers/rateLimitedProvider.js.map +1 -1
  197. package/dist/cjs/providers/retryProvider.js +246 -163
  198. package/dist/cjs/providers/retryProvider.js.map +1 -1
  199. package/dist/cjs/providers/solana/baseRpcFactories.js +18 -14
  200. package/dist/cjs/providers/solana/baseRpcFactories.js.map +1 -1
  201. package/dist/cjs/providers/solana/cachedRpcFactory.js +112 -70
  202. package/dist/cjs/providers/solana/cachedRpcFactory.js.map +1 -1
  203. package/dist/cjs/providers/solana/defaultRpcFactory.js +15 -8
  204. package/dist/cjs/providers/solana/defaultRpcFactory.js.map +1 -1
  205. package/dist/cjs/providers/solana/index.js +1 -1
  206. package/dist/cjs/providers/solana/quorumFallbackRpcFactory.js +191 -135
  207. package/dist/cjs/providers/solana/quorumFallbackRpcFactory.js.map +1 -1
  208. package/dist/cjs/providers/solana/rateLimitedRpcFactory.js +90 -67
  209. package/dist/cjs/providers/solana/rateLimitedRpcFactory.js.map +1 -1
  210. package/dist/cjs/providers/solana/retryRpcFactory.js +79 -52
  211. package/dist/cjs/providers/solana/retryRpcFactory.js.map +1 -1
  212. package/dist/cjs/providers/solana/utils.js +2 -2
  213. package/dist/cjs/providers/solana/utils.js.map +1 -1
  214. package/dist/cjs/providers/speedProvider.js +53 -31
  215. package/dist/cjs/providers/speedProvider.js.map +1 -1
  216. package/dist/cjs/providers/types.js +1 -1
  217. package/dist/cjs/providers/types.js.map +1 -1
  218. package/dist/cjs/providers/utils.js +28 -26
  219. package/dist/cjs/providers/utils.js.map +1 -1
  220. package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.js +162 -108
  221. package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.js.map +1 -1
  222. package/dist/cjs/relayFeeCalculator/chain-queries/customGasToken.js +26 -14
  223. package/dist/cjs/relayFeeCalculator/chain-queries/customGasToken.js.map +1 -1
  224. package/dist/cjs/relayFeeCalculator/chain-queries/factory.js +29 -20
  225. package/dist/cjs/relayFeeCalculator/chain-queries/factory.js.map +1 -1
  226. package/dist/cjs/relayFeeCalculator/chain-queries/index.js +1 -1
  227. package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.js +137 -88
  228. package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -1
  229. package/dist/cjs/relayFeeCalculator/index.js +1 -1
  230. package/dist/cjs/relayFeeCalculator/relayFeeCalculator.js +297 -199
  231. package/dist/cjs/relayFeeCalculator/relayFeeCalculator.js.map +1 -1
  232. package/dist/cjs/typeguards/error.js +7 -5
  233. package/dist/cjs/typeguards/error.js.map +1 -1
  234. package/dist/cjs/typeguards/index.js +1 -1
  235. package/dist/cjs/utils/AddressUtils.js +144 -117
  236. package/dist/cjs/utils/AddressUtils.js.map +1 -1
  237. package/dist/cjs/utils/ArrayUtils.js +78 -21
  238. package/dist/cjs/utils/ArrayUtils.js.map +1 -1
  239. package/dist/cjs/utils/BigNumberUtils.js +10 -9
  240. package/dist/cjs/utils/BigNumberUtils.js.map +1 -1
  241. package/dist/cjs/utils/BlockExplorerUtils.js +30 -26
  242. package/dist/cjs/utils/BlockExplorerUtils.js.map +1 -1
  243. package/dist/cjs/utils/BlockFinder.js +5 -2
  244. package/dist/cjs/utils/BlockFinder.js.map +1 -1
  245. package/dist/cjs/utils/BlockUtils.js +41 -24
  246. package/dist/cjs/utils/BlockUtils.js.map +1 -1
  247. package/dist/cjs/utils/BundleUtils.js +24 -21
  248. package/dist/cjs/utils/BundleUtils.js.map +1 -1
  249. package/dist/cjs/utils/CCTPUtils.js +126 -62
  250. package/dist/cjs/utils/CCTPUtils.js.map +1 -1
  251. package/dist/cjs/utils/CachingUtils.js +42 -20
  252. package/dist/cjs/utils/CachingUtils.js.map +1 -1
  253. package/dist/cjs/utils/ContractUtils.js +5 -5
  254. package/dist/cjs/utils/ContractUtils.js.map +1 -1
  255. package/dist/cjs/utils/DepositUtils.js +99 -122
  256. package/dist/cjs/utils/DepositUtils.js.map +1 -1
  257. package/dist/cjs/utils/EventUtils.js +70 -49
  258. package/dist/cjs/utils/EventUtils.js.map +1 -1
  259. package/dist/cjs/utils/FormattingUtils.js +32 -26
  260. package/dist/cjs/utils/FormattingUtils.js.map +1 -1
  261. package/dist/cjs/utils/HyperLiquidUtils.js +23 -10
  262. package/dist/cjs/utils/HyperLiquidUtils.js.map +1 -1
  263. package/dist/cjs/utils/IPFSUtils.js +34 -16
  264. package/dist/cjs/utils/IPFSUtils.js.map +1 -1
  265. package/dist/cjs/utils/JSONUtils.js +6 -6
  266. package/dist/cjs/utils/JSONUtils.js.map +1 -1
  267. package/dist/cjs/utils/LogUtils.js +12 -10
  268. package/dist/cjs/utils/LogUtils.js.map +1 -1
  269. package/dist/cjs/utils/Multicall.js +115 -56
  270. package/dist/cjs/utils/Multicall.js.map +1 -1
  271. package/dist/cjs/utils/NetworkUtils.js +28 -12
  272. package/dist/cjs/utils/NetworkUtils.js.map +1 -1
  273. package/dist/cjs/utils/NumberUtils.js +3 -1
  274. package/dist/cjs/utils/NumberUtils.js.map +1 -1
  275. package/dist/cjs/utils/ObjectUtils.js +41 -27
  276. package/dist/cjs/utils/ObjectUtils.js.map +1 -1
  277. package/dist/cjs/utils/Profiler.js +83 -80
  278. package/dist/cjs/utils/Profiler.js.map +1 -1
  279. package/dist/cjs/utils/ReviverUtils.js +9 -5
  280. package/dist/cjs/utils/ReviverUtils.js.map +1 -1
  281. package/dist/cjs/utils/SpokeUtils.js +84 -84
  282. package/dist/cjs/utils/SpokeUtils.js.map +1 -1
  283. package/dist/cjs/utils/TokenUtils.js +64 -41
  284. package/dist/cjs/utils/TokenUtils.js.map +1 -1
  285. package/dist/cjs/utils/TypeGuards.js +1 -1
  286. package/dist/cjs/utils/TypeGuards.js.map +1 -1
  287. package/dist/cjs/utils/ValidatorUtils.js +7 -7
  288. package/dist/cjs/utils/ValidatorUtils.js.map +1 -1
  289. package/dist/cjs/utils/abi/contracts/index.js +1 -1
  290. package/dist/cjs/utils/abi/index.js +22 -12
  291. package/dist/cjs/utils/abi/index.js.map +1 -1
  292. package/dist/cjs/utils/abi/typechain/factories/Multicall3__factory.js +12 -9
  293. package/dist/cjs/utils/abi/typechain/factories/Multicall3__factory.js.map +1 -1
  294. package/dist/cjs/utils/abi/typechain/index.js +1 -1
  295. package/dist/cjs/utils/common.js +53 -40
  296. package/dist/cjs/utils/common.js.map +1 -1
  297. package/dist/cjs/utils/index.js +1 -1
  298. package/dist/esm/addressAggregator/adapters/abstract.js +64 -48
  299. package/dist/esm/addressAggregator/adapters/abstract.js.map +1 -1
  300. package/dist/esm/addressAggregator/adapters/bybit.js +29 -15
  301. package/dist/esm/addressAggregator/adapters/bybit.js.map +1 -1
  302. package/dist/esm/addressAggregator/adapters/env.js +14 -9
  303. package/dist/esm/addressAggregator/adapters/env.js.map +1 -1
  304. package/dist/esm/addressAggregator/adapters/file.js +43 -29
  305. package/dist/esm/addressAggregator/adapters/file.js.map +1 -1
  306. package/dist/esm/addressAggregator/adapters/risklabs.js +35 -20
  307. package/dist/esm/addressAggregator/adapters/risklabs.js.map +1 -1
  308. package/dist/esm/addressAggregator/index.js +83 -52
  309. package/dist/esm/addressAggregator/index.js.map +1 -1
  310. package/dist/esm/addressAggregator/types.js +1 -1
  311. package/dist/esm/addressAggregator/types.js.map +1 -1
  312. package/dist/esm/apiClient/abstractClient.js +9 -15
  313. package/dist/esm/apiClient/abstractClient.js.map +1 -1
  314. package/dist/esm/apiClient/mockedClient.js +26 -21
  315. package/dist/esm/apiClient/mockedClient.js.map +1 -1
  316. package/dist/esm/apiClient/productionClient.js +101 -61
  317. package/dist/esm/apiClient/productionClient.js.map +1 -1
  318. package/dist/esm/arch/evm/BlockUtils.js +217 -139
  319. package/dist/esm/arch/evm/BlockUtils.js.map +1 -1
  320. package/dist/esm/arch/evm/SpokeUtils.js +289 -146
  321. package/dist/esm/arch/evm/SpokeUtils.js.map +1 -1
  322. package/dist/esm/arch/evm/utils/wait.js +46 -34
  323. package/dist/esm/arch/evm/utils/wait.js.map +1 -1
  324. package/dist/esm/arch/svm/BlockUtils.js +166 -118
  325. package/dist/esm/arch/svm/BlockUtils.js.map +1 -1
  326. package/dist/esm/arch/svm/SpokeUtils.js +1150 -738
  327. package/dist/esm/arch/svm/SpokeUtils.js.map +1 -1
  328. package/dist/esm/arch/svm/constants.js +1 -1
  329. package/dist/esm/arch/svm/constants.js.map +1 -1
  330. package/dist/esm/arch/svm/eventsClient.js +232 -172
  331. package/dist/esm/arch/svm/eventsClient.js.map +1 -1
  332. package/dist/esm/arch/svm/provider.js +1 -1
  333. package/dist/esm/arch/svm/provider.js.map +1 -1
  334. package/dist/esm/arch/svm/utils.js +345 -155
  335. package/dist/esm/arch/svm/utils.js.map +1 -1
  336. package/dist/esm/caching/Arweave/ArweaveClient.js +256 -182
  337. package/dist/esm/caching/Arweave/ArweaveClient.js.map +1 -1
  338. package/dist/esm/caching/IPFS/PinataIPFSClient.js +48 -47
  339. package/dist/esm/caching/IPFS/PinataIPFSClient.js.map +1 -1
  340. package/dist/esm/caching/Memory/MemoryCacheClient.js +19 -13
  341. package/dist/esm/caching/Memory/MemoryCacheClient.js.map +1 -1
  342. package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js +408 -333
  343. package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js.map +1 -1
  344. package/dist/esm/clients/BaseAbstractClient.js +92 -66
  345. package/dist/esm/clients/BaseAbstractClient.js.map +1 -1
  346. package/dist/esm/clients/BundleDataClient/BundleDataClient.js +1054 -927
  347. package/dist/esm/clients/BundleDataClient/BundleDataClient.js.map +1 -1
  348. package/dist/esm/clients/BundleDataClient/utils/DataworkerUtils.js +131 -102
  349. package/dist/esm/clients/BundleDataClient/utils/DataworkerUtils.js.map +1 -1
  350. package/dist/esm/clients/BundleDataClient/utils/FillUtils.js +59 -57
  351. package/dist/esm/clients/BundleDataClient/utils/FillUtils.js.map +1 -1
  352. package/dist/esm/clients/BundleDataClient/utils/MerkleTreeUtils.js +5 -7
  353. package/dist/esm/clients/BundleDataClient/utils/MerkleTreeUtils.js.map +1 -1
  354. package/dist/esm/clients/BundleDataClient/utils/PoolRebalanceUtils.js +94 -75
  355. package/dist/esm/clients/BundleDataClient/utils/PoolRebalanceUtils.js.map +1 -1
  356. package/dist/esm/clients/BundleDataClient/utils/SuperstructUtils.js +23 -45
  357. package/dist/esm/clients/BundleDataClient/utils/SuperstructUtils.js.map +1 -1
  358. package/dist/esm/clients/HubPoolClient.js +740 -581
  359. package/dist/esm/clients/HubPoolClient.js.map +1 -1
  360. package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.js +178 -133
  361. package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
  362. package/dist/esm/clients/SpokePoolClient/SVMSpokePoolClient.js +183 -126
  363. package/dist/esm/clients/SpokePoolClient/SVMSpokePoolClient.js.map +1 -1
  364. package/dist/esm/clients/SpokePoolClient/SpokePoolClient.js +399 -372
  365. package/dist/esm/clients/SpokePoolClient/SpokePoolClient.js.map +1 -1
  366. package/dist/esm/clients/SpokePoolClient/SpokePoolClientManager.js +9 -9
  367. package/dist/esm/clients/SpokePoolClient/SpokePoolClientManager.js.map +1 -1
  368. package/dist/esm/clients/SpokePoolClient/index.js +2 -2
  369. package/dist/esm/clients/SpokePoolClient/index.js.map +1 -1
  370. package/dist/esm/clients/SpokePoolClient/types.js +2 -2
  371. package/dist/esm/clients/SpokePoolClient/types.js.map +1 -1
  372. package/dist/esm/clients/mocks/MockConfigStoreClient.js +64 -53
  373. package/dist/esm/clients/mocks/MockConfigStoreClient.js.map +1 -1
  374. package/dist/esm/clients/mocks/MockEvents.js +49 -42
  375. package/dist/esm/clients/mocks/MockEvents.js.map +1 -1
  376. package/dist/esm/clients/mocks/MockHubPoolClient.js +182 -138
  377. package/dist/esm/clients/mocks/MockHubPoolClient.js.map +1 -1
  378. package/dist/esm/clients/mocks/MockSpokePoolClient.js +188 -202
  379. package/dist/esm/clients/mocks/MockSpokePoolClient.js.map +1 -1
  380. package/dist/esm/clients/mocks/MockSvmCpiEventsClient.js +132 -127
  381. package/dist/esm/clients/mocks/MockSvmCpiEventsClient.js.map +1 -1
  382. package/dist/esm/clients/mocks/MockSvmSpokePoolClient.js +69 -53
  383. package/dist/esm/clients/mocks/MockSvmSpokePoolClient.js.map +1 -1
  384. package/dist/esm/coingecko/Coingecko.js +443 -298
  385. package/dist/esm/coingecko/Coingecko.js.map +1 -1
  386. package/dist/esm/constants.js +47 -40
  387. package/dist/esm/constants.js.map +1 -1
  388. package/dist/esm/contracts/acrossConfigStore.js +46 -24
  389. package/dist/esm/contracts/acrossConfigStore.js.map +1 -1
  390. package/dist/esm/contracts/hubPool.js +18 -34
  391. package/dist/esm/contracts/hubPool.js.map +1 -1
  392. package/dist/esm/contracts/utils.js +5 -3
  393. package/dist/esm/contracts/utils.js.map +1 -1
  394. package/dist/esm/gasPriceOracle/adapters/arbitrum.js +14 -6
  395. package/dist/esm/gasPriceOracle/adapters/arbitrum.js.map +1 -1
  396. package/dist/esm/gasPriceOracle/adapters/ethereum.js +42 -22
  397. package/dist/esm/gasPriceOracle/adapters/ethereum.js.map +1 -1
  398. package/dist/esm/gasPriceOracle/adapters/linea-viem.js +25 -13
  399. package/dist/esm/gasPriceOracle/adapters/linea-viem.js.map +1 -1
  400. package/dist/esm/gasPriceOracle/adapters/polygon.js +108 -72
  401. package/dist/esm/gasPriceOracle/adapters/polygon.js.map +1 -1
  402. package/dist/esm/gasPriceOracle/adapters/solana.js +31 -22
  403. package/dist/esm/gasPriceOracle/adapters/solana.js.map +1 -1
  404. package/dist/esm/gasPriceOracle/oracle.js +96 -70
  405. package/dist/esm/gasPriceOracle/oracle.js.map +1 -1
  406. package/dist/esm/gasPriceOracle/types.js +2 -2
  407. package/dist/esm/gasPriceOracle/types.js.map +1 -1
  408. package/dist/esm/gasPriceOracle/util.js +4 -4
  409. package/dist/esm/gasPriceOracle/util.js.map +1 -1
  410. package/dist/esm/lpFeeCalculator/lpFeeCalculator.js +33 -30
  411. package/dist/esm/lpFeeCalculator/lpFeeCalculator.js.map +1 -1
  412. package/dist/esm/lpFeeCalculator/rateModel.js +9 -7
  413. package/dist/esm/lpFeeCalculator/rateModel.js.map +1 -1
  414. package/dist/esm/merkleDistributor/MerkleDistributor.js +17 -18
  415. package/dist/esm/merkleDistributor/MerkleDistributor.js.map +1 -1
  416. package/dist/esm/pool/TransactionManager.js +100 -45
  417. package/dist/esm/pool/TransactionManager.js.map +1 -1
  418. package/dist/esm/pool/poolClient.js +740 -479
  419. package/dist/esm/pool/poolClient.js.map +1 -1
  420. package/dist/esm/pool/uma/across/constants.js +2 -2
  421. package/dist/esm/pool/uma/across/constants.js.map +1 -1
  422. package/dist/esm/pool/uma/across/transactionManager.js +100 -45
  423. package/dist/esm/pool/uma/across/transactionManager.js.map +1 -1
  424. package/dist/esm/pool/uma/clients/erc20/client.js +13 -15
  425. package/dist/esm/pool/uma/clients/erc20/client.js.map +1 -1
  426. package/dist/esm/pool/uma/oracle/utils.js +3 -2
  427. package/dist/esm/pool/uma/oracle/utils.js.map +1 -1
  428. package/dist/esm/pool/uma/utils.js +28 -9
  429. package/dist/esm/pool/uma/utils.js.map +1 -1
  430. package/dist/esm/priceClient/adapters/acrossApi.js +40 -21
  431. package/dist/esm/priceClient/adapters/acrossApi.js.map +1 -1
  432. package/dist/esm/priceClient/adapters/baseAdapter.js +72 -46
  433. package/dist/esm/priceClient/adapters/baseAdapter.js.map +1 -1
  434. package/dist/esm/priceClient/adapters/coingecko.js +61 -33
  435. package/dist/esm/priceClient/adapters/coingecko.js.map +1 -1
  436. package/dist/esm/priceClient/adapters/default.js +31 -15
  437. package/dist/esm/priceClient/adapters/default.js.map +1 -1
  438. package/dist/esm/priceClient/adapters/defiLlama.js +73 -38
  439. package/dist/esm/priceClient/adapters/defiLlama.js.map +1 -1
  440. package/dist/esm/priceClient/priceClient.js +158 -109
  441. package/dist/esm/priceClient/priceClient.js.map +1 -1
  442. package/dist/esm/providers/alchemy.js +18 -16
  443. package/dist/esm/providers/alchemy.js.map +1 -1
  444. package/dist/esm/providers/cachedProvider.js +134 -99
  445. package/dist/esm/providers/cachedProvider.js.map +1 -1
  446. package/dist/esm/providers/constants.js +3 -3
  447. package/dist/esm/providers/constants.js.map +1 -1
  448. package/dist/esm/providers/drpc.js +10 -8
  449. package/dist/esm/providers/drpc.js.map +1 -1
  450. package/dist/esm/providers/infura.js +11 -9
  451. package/dist/esm/providers/infura.js.map +1 -1
  452. package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.js +15 -6
  453. package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.js.map +1 -1
  454. package/dist/esm/providers/mocks/MockRateLimitedSolanaRpcFactory.js +14 -5
  455. package/dist/esm/providers/mocks/MockRateLimitedSolanaRpcFactory.js.map +1 -1
  456. package/dist/esm/providers/mocks/MockRetrySolanaRpcFactory.js +15 -6
  457. package/dist/esm/providers/mocks/MockRetrySolanaRpcFactory.js.map +1 -1
  458. package/dist/esm/providers/mocks/MockSolanaRpcFactory.js +66 -41
  459. package/dist/esm/providers/mocks/MockSolanaRpcFactory.js.map +1 -1
  460. package/dist/esm/providers/mocks/mockEthersProvider.js +30 -27
  461. package/dist/esm/providers/mocks/mockEthersProvider.js.map +1 -1
  462. package/dist/esm/providers/quicknode.js +20 -18
  463. package/dist/esm/providers/quicknode.js.map +1 -1
  464. package/dist/esm/providers/rateLimitedProvider.js +80 -68
  465. package/dist/esm/providers/rateLimitedProvider.js.map +1 -1
  466. package/dist/esm/providers/retryProvider.js +259 -186
  467. package/dist/esm/providers/retryProvider.js.map +1 -1
  468. package/dist/esm/providers/solana/baseRpcFactories.js +19 -13
  469. package/dist/esm/providers/solana/baseRpcFactories.js.map +1 -1
  470. package/dist/esm/providers/solana/cachedRpcFactory.js +112 -75
  471. package/dist/esm/providers/solana/cachedRpcFactory.js.map +1 -1
  472. package/dist/esm/providers/solana/defaultRpcFactory.js +14 -6
  473. package/dist/esm/providers/solana/defaultRpcFactory.js.map +1 -1
  474. package/dist/esm/providers/solana/quorumFallbackRpcFactory.js +202 -149
  475. package/dist/esm/providers/solana/quorumFallbackRpcFactory.js.map +1 -1
  476. package/dist/esm/providers/solana/rateLimitedRpcFactory.js +90 -70
  477. package/dist/esm/providers/solana/rateLimitedRpcFactory.js.map +1 -1
  478. package/dist/esm/providers/solana/retryRpcFactory.js +74 -50
  479. package/dist/esm/providers/solana/retryRpcFactory.js.map +1 -1
  480. package/dist/esm/providers/solana/utils.js +1 -1
  481. package/dist/esm/providers/solana/utils.js.map +1 -1
  482. package/dist/esm/providers/speedProvider.js +51 -28
  483. package/dist/esm/providers/speedProvider.js.map +1 -1
  484. package/dist/esm/providers/types.js +2 -2
  485. package/dist/esm/providers/types.js.map +1 -1
  486. package/dist/esm/providers/utils.js +20 -17
  487. package/dist/esm/providers/utils.js.map +1 -1
  488. package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.js +152 -98
  489. package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.js.map +1 -1
  490. package/dist/esm/relayFeeCalculator/chain-queries/customGasToken.js +26 -13
  491. package/dist/esm/relayFeeCalculator/chain-queries/customGasToken.js.map +1 -1
  492. package/dist/esm/relayFeeCalculator/chain-queries/factory.js +19 -9
  493. package/dist/esm/relayFeeCalculator/chain-queries/factory.js.map +1 -1
  494. package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js +128 -83
  495. package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -1
  496. package/dist/esm/relayFeeCalculator/relayFeeCalculator.js +299 -211
  497. package/dist/esm/relayFeeCalculator/relayFeeCalculator.js.map +1 -1
  498. package/dist/esm/typeguards/error.js +5 -3
  499. package/dist/esm/typeguards/error.js.map +1 -1
  500. package/dist/esm/utils/AddressUtils.js +147 -115
  501. package/dist/esm/utils/AddressUtils.js.map +1 -1
  502. package/dist/esm/utils/ArrayUtils.js +78 -21
  503. package/dist/esm/utils/ArrayUtils.js.map +1 -1
  504. package/dist/esm/utils/BigNumberUtils.js +12 -11
  505. package/dist/esm/utils/BigNumberUtils.js.map +1 -1
  506. package/dist/esm/utils/BlockExplorerUtils.js +23 -19
  507. package/dist/esm/utils/BlockExplorerUtils.js.map +1 -1
  508. package/dist/esm/utils/BlockFinder.js +6 -2
  509. package/dist/esm/utils/BlockFinder.js.map +1 -1
  510. package/dist/esm/utils/BlockUtils.js +40 -31
  511. package/dist/esm/utils/BlockUtils.js.map +1 -1
  512. package/dist/esm/utils/BundleUtils.js +24 -21
  513. package/dist/esm/utils/BundleUtils.js.map +1 -1
  514. package/dist/esm/utils/CCTPUtils.js +123 -62
  515. package/dist/esm/utils/CCTPUtils.js.map +1 -1
  516. package/dist/esm/utils/CachingUtils.js +38 -17
  517. package/dist/esm/utils/CachingUtils.js.map +1 -1
  518. package/dist/esm/utils/ContractUtils.js +3 -3
  519. package/dist/esm/utils/ContractUtils.js.map +1 -1
  520. package/dist/esm/utils/DepositUtils.js +98 -121
  521. package/dist/esm/utils/DepositUtils.js.map +1 -1
  522. package/dist/esm/utils/EventUtils.js +69 -52
  523. package/dist/esm/utils/EventUtils.js.map +1 -1
  524. package/dist/esm/utils/FormattingUtils.js +26 -20
  525. package/dist/esm/utils/FormattingUtils.js.map +1 -1
  526. package/dist/esm/utils/HyperLiquidUtils.js +22 -8
  527. package/dist/esm/utils/HyperLiquidUtils.js.map +1 -1
  528. package/dist/esm/utils/IPFSUtils.js +35 -16
  529. package/dist/esm/utils/IPFSUtils.js.map +1 -1
  530. package/dist/esm/utils/JSONUtils.js +4 -4
  531. package/dist/esm/utils/JSONUtils.js.map +1 -1
  532. package/dist/esm/utils/LogUtils.js +12 -8
  533. package/dist/esm/utils/LogUtils.js.map +1 -1
  534. package/dist/esm/utils/Multicall.js +110 -50
  535. package/dist/esm/utils/Multicall.js.map +1 -1
  536. package/dist/esm/utils/NetworkUtils.js +28 -12
  537. package/dist/esm/utils/NetworkUtils.js.map +1 -1
  538. package/dist/esm/utils/NumberUtils.js +3 -1
  539. package/dist/esm/utils/NumberUtils.js.map +1 -1
  540. package/dist/esm/utils/ObjectUtils.js +41 -27
  541. package/dist/esm/utils/ObjectUtils.js.map +1 -1
  542. package/dist/esm/utils/Profiler.js +82 -77
  543. package/dist/esm/utils/Profiler.js.map +1 -1
  544. package/dist/esm/utils/ReviverUtils.js +7 -3
  545. package/dist/esm/utils/ReviverUtils.js.map +1 -1
  546. package/dist/esm/utils/SpokeUtils.js +78 -83
  547. package/dist/esm/utils/SpokeUtils.js.map +1 -1
  548. package/dist/esm/utils/TokenUtils.js +57 -33
  549. package/dist/esm/utils/TokenUtils.js.map +1 -1
  550. package/dist/esm/utils/ValidatorUtils.js +4 -4
  551. package/dist/esm/utils/ValidatorUtils.js.map +1 -1
  552. package/dist/esm/utils/abi/index.js +20 -10
  553. package/dist/esm/utils/abi/index.js.map +1 -1
  554. package/dist/esm/utils/abi/typechain/factories/Multicall3__factory.js +12 -8
  555. package/dist/esm/utils/abi/typechain/factories/Multicall3__factory.js.map +1 -1
  556. package/dist/esm/utils/common.js +52 -38
  557. package/dist/esm/utils/common.js.map +1 -1
  558. package/dist/types/constants.d.ts.map +1 -1
  559. package/dist/types/gasPriceOracle/oracle.d.ts.map +1 -1
  560. package/dist/types/utils/Multicall.d.ts.map +1 -1
  561. package/dist/types/utils/NetworkUtils.d.ts.map +1 -1
  562. package/package.json +3 -3
  563. package/src/constants.ts +1 -0
  564. package/src/gasPriceOracle/oracle.ts +1 -0
  565. package/src/utils/Multicall.ts +1 -0
  566. 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 const SLOT_DURATION_MS = 400;
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
- async function _callGetSlotWithRetry(provider, commitment, logger) {
25
- try {
26
- return await provider.getSlot({ commitment }).send();
27
- }
28
- catch (err) {
29
- if (isSolanaError(err)) {
30
- const { __code: code } = err.context;
31
- logger?.debug({
32
- at: "_getSlotWithRetry",
33
- message: "Caught error from getSlot()",
34
- code,
35
- commitment,
36
- });
37
- }
38
- // TODO: Implement retry logic once we better understand how these errors look:
39
- throw err;
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 = 2, logger) {
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
- async function _callGetTimestampForSlotWithRetry(provider, slotNumber, retryAttempt, maxRetries, logger) {
49
- const slot = slotNumber.toString();
50
- let _timestamp;
51
- try {
52
- // @note: getBlockTime receives a slot number, not a block number.
53
- _timestamp = await provider.getBlockTime(slotNumber).send();
54
- }
55
- catch (err) {
56
- if (!isSolanaError(err)) {
57
- throw err;
58
- }
59
- const at = "getTimestampForSlot";
60
- const { __code: code } = err.context;
61
- switch (code) {
62
- case SVM_SLOT_SKIPPED:
63
- case SVM_LONG_TERM_STORAGE_SLOT_SKIPPED:
64
- // No block available for this slot; caller must decide on how to handle this.
65
- return undefined;
66
- default: {
67
- const message = "Caught error from getBlockTime()";
68
- logger?.debug({ at, message, errorCode: code, slot, retryAttempt, maxRetries });
69
- throw new Error(`Unhandled SVM getBlockTime() error for slot ${slot}: ${code}`, { cause: err });
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 async function getFillDeadline(provider, statePda) {
85
- const state = await fetchState(provider, statePda);
86
- return state.data.fillDeadlineBuffer;
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 async function findDeposit(eventClient, depositId, logger, slot, secondsLookback = 2 * 24 * 60 * 60 // 2 days
127
- ) {
128
- // We can only perform this search when we have a safe deposit ID.
129
- if (isUnsafeDepositId(depositId)) {
130
- throw new Error(`Cannot binary search for depositId ${depositId}`);
131
- }
132
- const provider = eventClient.getRpc();
133
- const opts = undefined;
134
- const { slot: currentSlot } = await getNearestSlotTime(provider, opts, logger);
135
- // If no slot is provided, use the current slot
136
- // If a slot is provided, ensure it's not in the future
137
- const endSlot = slot !== undefined ? BigInt(Math.min(Number(slot), Number(currentSlot))) : currentSlot;
138
- // Calculate start slot (approximately secondsLookback seconds earlier)
139
- const slotsInElapsed = BigInt(Math.round((secondsLookback * 1000) / SLOT_DURATION_MS));
140
- const startSlot = endSlot - slotsInElapsed;
141
- // Query for the deposit events with this limited slot range. Filter by deposit id.
142
- const depositEvent = (await eventClient.queryEvents("FundsDeposited", startSlot, endSlot))?.find((event) => depositId.eq(event.data.depositId));
143
- // If no deposit event is found, return undefined
144
- if (!depositEvent) {
145
- return undefined;
146
- }
147
- const txnIndex = 0;
148
- const logIndex = 0;
149
- const blockNumber = Number(depositEvent.slot);
150
- const txnRef = depositEvent.signature.toString();
151
- const rawData = unwrapEventData(depositEvent.data, ["depositId", "outputAmount"]);
152
- const { originChainId, ...deposit } = unpackDepositEvent({ ...rawData, blockNumber, txnRef, txnIndex, logIndex }, CHAIN_IDs.SOLANA);
153
- return {
154
- ...deposit,
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 async function relayFillStatus(programId, relayData, destinationChainId, svmEventsClient, logger, atHeight) {
171
- assert(chainIsSvm(destinationChainId), "Destination chain must be an SVM chain");
172
- const provider = svmEventsClient.getRpc();
173
- // Get fill status PDA using relayData
174
- const fillStatusPda = await getFillStatusPda(programId, relayData, destinationChainId);
175
- let toSlot = BigInt(atHeight ?? 0);
176
- // If no specific slot is requested, try fetching the current status from the PDA
177
- if (atHeight === undefined) {
178
- const commitment = "confirmed";
179
- const [fillStatusAccount, { slot: currentSlot, timestamp }] = await Promise.all([
180
- fetchEncodedAccount(provider, fillStatusPda, { commitment }),
181
- getNearestSlotTime(provider, { commitment }, logger),
182
- ]);
183
- toSlot = currentSlot;
184
- // If the PDA exists, return the stored fill status
185
- if (fillStatusAccount.exists) {
186
- const decodedAccountData = decodeFillStatusAccount(fillStatusAccount);
187
- return decodedAccountData.data.status;
188
- }
189
- // If the PDA doesn't exist and the deadline hasn't passed yet, the deposit must be unfilled,
190
- // since PDAs can't be closed before the fill deadline.
191
- else if (timestamp < relayData.fillDeadline) {
192
- return FillStatus.Unfilled;
193
- }
194
- }
195
- // If status couldn't be determined from the PDA, or if a specific slot was requested, reconstruct from events.
196
- return resolveFillStatusFromPdaEvents(fillStatusPda, toSlot, svmEventsClient);
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 async function fillStatusArray(programId, relayData, destinationChainId, svmEventsClient, logger, atHeight) {
211
- assert(chainIsSvm(destinationChainId), "Destination chain must be an SVM chain");
212
- const provider = svmEventsClient.getRpc();
213
- const chunkSize = 100;
214
- const chunkedRelayData = chunk(relayData, chunkSize);
215
- // Get all PDAs
216
- const fillStatusPdas = (await Promise.all(chunkedRelayData.map((relayDataChunk) => Promise.all(relayDataChunk.map((relayData) => getFillStatusPda(programId, relayData, destinationChainId)))))).flat();
217
- if (atHeight !== undefined && logger) {
218
- logger.warn({
219
- at: "SvmSpokeUtils#fillStatusArray",
220
- message: "Querying specific slots for large arrays is slow. For current status, omit 'atHeight' param to use latest confirmed slot instead.",
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 async function findFillEvent(relayData, destinationChainId, svmEventsClient, fromSlot, toSlot, logger) {
269
- assert(chainIsSvm(destinationChainId), "Destination chain must be an SVM chain");
270
- const opts = undefined;
271
- toSlot ??= Number((await getNearestSlotTime(svmEventsClient.getRpc(), opts, logger)).slot);
272
- // Get fillStatus PDA using relayData
273
- const programId = svmEventsClient.getProgramAddress();
274
- const fillStatusPda = await getFillStatusPda(programId, relayData, destinationChainId);
275
- // Get fill events from fillStatus PDA
276
- const fillEvents = await svmEventsClient.queryDerivedAddressEvents(SVMEventNames.FilledRelay, fillStatusPda, BigInt(fromSlot), BigInt(toSlot), { limit: 10 });
277
- assert(fillEvents.length <= 1, `Expected at most one fill event for ${fillStatusPda}, got ${fillEvents.length}`);
278
- const [rawEvent] = fillEvents;
279
- if (!isDefined(rawEvent)) {
280
- return;
281
- }
282
- const rawFill = unwrapEventData(rawEvent.data, ["depositId", "inputAmount"]);
283
- const fill = unpackFillEvent(rawFill, destinationChainId);
284
- return fill;
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 async function fillRelayInstruction(spokePool, relayData, signer, recipientTokenAccount, repaymentAddress, repaymentChainId) {
294
- const program = toAddress(spokePool);
295
- assert(repaymentAddress.isValidOn(repaymentChainId), `Invalid repayment address for chain ${repaymentChainId}: ${repaymentAddress.toNative()}.`);
296
- const messageHash = getMessageHash(relayData.message);
297
- const _relayDataHash = getRelayDataHash({ ...relayData, messageHash }, relayData.destinationChainId);
298
- const relayDataHash = new Uint8Array(Buffer.from(_relayDataHash.slice(2), "hex"));
299
- const relayer = SvmAddress.from(signer.address);
300
- const [statePda, fillStatusPda, eventAuthority, delegatePda, relayerTokenAccount] = await Promise.all([
301
- getStatePda(program),
302
- getFillStatusPda(program, relayData, relayData.destinationChainId),
303
- getEventAuthority(program),
304
- getFillRelayDelegatePda(relayDataHash, BigInt(repaymentChainId), signer.address, program),
305
- getAssociatedTokenAddress(relayer, relayData.outputToken),
306
- ]);
307
- const svmRelayData = toSvmRelayData(relayData);
308
- return SvmSpokeClient.getFillRelayInstruction({
309
- signer,
310
- state: statePda,
311
- delegate: toAddress(SvmAddress.from(delegatePda.toString())),
312
- mint: svmRelayData.outputToken,
313
- relayerTokenAccount: relayerTokenAccount,
314
- recipientTokenAccount: recipientTokenAccount,
315
- fillStatus: fillStatusPda,
316
- eventAuthority,
317
- program,
318
- relayHash: relayDataHash,
319
- relayData: some(svmRelayData),
320
- repaymentChainId: some(BigInt(repaymentChainId)),
321
- repaymentAddress: some(toAddress(repaymentAddress)),
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 async function getFillRelayTx(spokePoolAddr, solanaClient, relayData, signer, repaymentChainId, repaymentAddress) {
346
- const svmRelayData = toSvmRelayData(relayData);
347
- assert(repaymentAddress.isValidOn(repaymentChainId), `getFillRelayTx: repayment address ${repaymentAddress} not valid on chain ${repaymentChainId})`);
348
- const program = toAddress(spokePoolAddr);
349
- const messageHash = getMessageHash(relayData.message);
350
- const _relayDataHash = getRelayDataHash({ ...relayData, messageHash }, relayData.destinationChainId);
351
- const relayDataHash = new Uint8Array(Buffer.from(_relayDataHash.slice(2), "hex"));
352
- const [state, delegate, mintInfo, fillStatus, eventAuthority] = await Promise.all([
353
- getStatePda(program),
354
- getFillRelayDelegatePda(relayDataHash, BigInt(repaymentChainId), toAddress(repaymentAddress), program),
355
- getMintInfo(solanaClient, svmRelayData.outputToken),
356
- getFillStatusPda(program, relayData, relayData.destinationChainId),
357
- getEventAuthority(program),
358
- ]);
359
- const [recipientAta, relayerAta] = await Promise.all([
360
- getAssociatedTokenAddress(relayData.recipient, relayData.outputToken, mintInfo.programAddress),
361
- getAssociatedTokenAddress(SvmAddress.from(signer.address), relayData.outputToken, mintInfo.programAddress),
362
- ]);
363
- const recipientAtaEncodedAccount = await fetchEncodedAccount(solanaClient, recipientAta);
364
- // Add remaining accounts if the relayData has a non-empty message.
365
- // @dev ! since in the context of creating a `fillRelayTx`, `relayData` must be defined.
366
- const remainingAccounts = [];
367
- if (relayData.message !== "0x") {
368
- const acrossPlusMessage = deserializeMessage(relayData.message);
369
- // The first `remainingAccount` _must_ be the handler address.
370
- // https://github.com/across-protocol/contracts/blob/3310f8dc716407a5f97ef5fd2eae63df83251f2f/programs/svm-spoke/src/utils/message_utils.rs#L36.
371
- remainingAccounts.push(getAccountMeta(acrossPlusMessage.handler, true));
372
- remainingAccounts.push(...acrossPlusMessage.accounts.map((account, idx) => getAccountMeta(account, idx < acrossPlusMessage.accounts.length - acrossPlusMessage.read_only_len)));
373
- }
374
- const fillInput = {
375
- signer: signer,
376
- state,
377
- delegate,
378
- mint: svmRelayData.outputToken,
379
- relayerTokenAccount: relayerAta,
380
- recipientTokenAccount: recipientAta,
381
- fillStatus,
382
- tokenProgram: mintInfo.programAddress,
383
- associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
384
- systemProgram: SYSTEM_PROGRAM_ADDRESS,
385
- eventAuthority,
386
- program,
387
- relayHash: relayDataHash,
388
- relayData: svmRelayData,
389
- repaymentChainId: BigInt(repaymentChainId),
390
- repaymentAddress: toAddress(repaymentAddress),
391
- };
392
- // Pass createRecipientAtaIfNeeded =true to the createFillInstruction function to create the recipient token account
393
- // if it doesn't exist.
394
- return createFillInstruction(signer, solanaClient, fillInput, svmRelayData, mintInfo.data.decimals, !recipientAtaEncodedAccount.exists, remainingAccounts);
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 async function getIPFillRelayTx(spokePoolAddr, solanaClient, relayData, signer, repaymentChainId, repaymentAddress) {
407
- const program = toAddress(spokePoolAddr);
408
- const _relayDataHash = getRelayDataHash({ ...relayData, messageHash: getMessageHash(relayData.message) }, relayData.destinationChainId);
409
- const relayDataHash = new Uint8Array(Buffer.from(_relayDataHash.slice(2), "hex"));
410
- const [state, delegate, instructionParams] = await Promise.all([
411
- getStatePda(program),
412
- getFillRelayDelegatePda(relayDataHash, BigInt(repaymentChainId), toAddress(repaymentAddress), program),
413
- getInstructionParamsPda(program, signer.address),
414
- ]);
415
- const mint = toAddress(relayData.outputToken);
416
- const mintInfo = await getMintInfo(solanaClient, mint);
417
- const [recipientAta, relayerAta, fillStatus, eventAuthority] = await Promise.all([
418
- getAssociatedTokenAddress(relayData.recipient, relayData.outputToken, mintInfo.programAddress),
419
- getAssociatedTokenAddress(SvmAddress.from(signer.address), relayData.outputToken, mintInfo.programAddress),
420
- getFillStatusPda(program, relayData, relayData.destinationChainId),
421
- getEventAuthority(program),
422
- ]);
423
- // Add remaining accounts if the relayData has a non-empty message.
424
- // @dev ! since in the context of creating a `fillRelayTx`, `relayData` must be defined.
425
- const remainingAccounts = [];
426
- if (relayData.message !== "0x") {
427
- const acrossPlusMessage = deserializeMessage(relayData.message);
428
- // The first `remainingAccount` _must_ be the handler address.
429
- // https://github.com/across-protocol/contracts/blob/3310f8dc716407a5f97ef5fd2eae63df83251f2f/programs/svm-spoke/src/utils/message_utils.rs#L36.
430
- remainingAccounts.push(getAccountMeta(acrossPlusMessage.handler, true));
431
- remainingAccounts.push(...acrossPlusMessage.accounts.map((account, idx) => getAccountMeta(account, idx < acrossPlusMessage.accounts.length - acrossPlusMessage.read_only_len)));
432
- }
433
- const fillInput = {
434
- signer: signer,
435
- state,
436
- delegate,
437
- mint,
438
- relayerTokenAccount: relayerAta,
439
- recipientTokenAccount: recipientAta,
440
- fillStatus,
441
- tokenProgram: mintInfo.programAddress,
442
- associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
443
- systemProgram: SYSTEM_PROGRAM_ADDRESS,
444
- eventAuthority,
445
- program,
446
- instructionParams,
447
- relayHash: relayDataHash,
448
- relayData: null,
449
- repaymentChainId: null,
450
- repaymentAddress: null,
451
- };
452
- // Pass createRecipientAtaIfNeeded =true to the createFillInstruction function to create the recipient token account
453
- // if it doesn't exist.
454
- return createFillInstruction(signer, solanaClient, fillInput, { outputAmount: relayData.outputAmount.toBigInt(), recipient: toAddress(relayData.recipient) }, mintInfo.data.decimals, true, remainingAccounts);
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 const createFillInstruction = async (signer, solanaClient, fillInput, relayData, tokenDecimals, createRecipientAta = false, remainingAccounts = []) => {
466
- const mintInfo = await getMintInfo(solanaClient, fillInput.mint);
467
- const approveIx = getApproveCheckedInstruction({
468
- source: fillInput.relayerTokenAccount,
469
- mint: fillInput.mint,
470
- delegate: fillInput.delegate,
471
- owner: fillInput.signer,
472
- amount: relayData.outputAmount,
473
- decimals: tokenDecimals,
474
- }, {
475
- programAddress: mintInfo.programAddress,
476
- });
477
- const getCreateAssociatedTokenIx = () => getCreateAssociatedTokenInstruction({
478
- payer: signer,
479
- owner: relayData.recipient,
480
- mint: fillInput.mint,
481
- ata: fillInput.recipientTokenAccount,
482
- systemProgram: SYSTEM_PROGRAM_ADDRESS,
483
- tokenProgram: fillInput.tokenProgram,
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
- const message = new Uint8Array(Buffer.from(_message.startsWith("0x") ? _message.slice(2) : _message, "hex"));
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
- const acrossPlusMessageDecoder = getAcrossPlusMessageDecoder();
495
- const deserialized = acrossPlusMessageDecoder.decode(message);
496
- const valueAmountMethod2 = extractValueAmount(message);
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 const createDepositInstruction = async (signer, solanaClient, depositInput, tokenDecimals, createVaultAtaIfNeeded = true) => {
510
- const getCreateAssociatedTokenIdempotentIx = () => getCreateAssociatedTokenIdempotentInstruction({
511
- payer: signer,
512
- owner: depositInput.state,
513
- mint: depositInput.mint,
514
- ata: depositInput.vault,
515
- systemProgram: depositInput.systemProgram,
516
- tokenProgram: depositInput.tokenProgram,
517
- });
518
- const mintInfo = await getMintInfo(solanaClient, depositInput.mint);
519
- const approveIx = getApproveCheckedInstruction({
520
- source: depositInput.depositorTokenAccount,
521
- mint: depositInput.mint,
522
- delegate: depositInput.delegate,
523
- owner: depositInput.depositor,
524
- amount: depositInput.inputAmount,
525
- decimals: tokenDecimals,
526
- }, {
527
- programAddress: mintInfo.programAddress,
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 const createRequestSlowFillInstruction = async (signer, solanaClient, requestSlowFillInput) => {
540
- const requestSlowFillIx = SvmSpokeClient.getRequestSlowFillInstruction(requestSlowFillInput);
541
- return pipe(await createDefaultTransaction(solanaClient, signer), (tx) => appendTransactionMessageInstruction(requestSlowFillIx, tx));
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 async function getSlowFillRequestTx(spokePoolAddr, solanaClient, relayData, signer) {
552
- const program = toAddress(spokePoolAddr);
553
- const messageHash = getMessageHash(relayData.message);
554
- const relayDataHash = getRelayDataHash({ ...relayData, messageHash }, relayData.destinationChainId);
555
- const [state, fillStatus, eventAuthority] = await Promise.all([
556
- getStatePda(program),
557
- getFillStatusPda(program, relayData, relayData.destinationChainId),
558
- getEventAuthority(program),
559
- ]);
560
- const svmRelayData = toSvmRelayData(relayData);
561
- const requestSlowFillInput = {
562
- signer,
563
- state,
564
- fillStatus,
565
- eventAuthority,
566
- program,
567
- relayHash: arrayify(relayDataHash),
568
- relayData: svmRelayData,
569
- systemProgram: SYSTEM_PROGRAM_ADDRESS,
570
- };
571
- return createRequestSlowFillInstruction(signer, solanaClient, requestSlowFillInput);
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 const createCloseFillPdaInstruction = async (signer, solanaClient, fillStatusPda) => {
581
- const closeFillPdaIx = SvmSpokeClient.getCloseFillPdaInstruction({
582
- signer,
583
- state: await getStatePda(SvmSpokeClient.SVM_SPOKE_PROGRAM_ADDRESS),
584
- fillStatus: fillStatusPda,
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
- return pipe(await createDefaultTransaction(solanaClient, signer), (tx) => appendTransactionMessageInstruction(closeFillPdaIx, tx));
587
- };
588
- export const createReceiveMessageInstruction = async (signer, solanaClient, input, remainingAccounts) => {
589
- const receiveMessageIx = MessageTransmitterClient.getReceiveMessageInstruction(input);
590
- receiveMessageIx.accounts.push(...remainingAccounts);
591
- return pipe(await createDefaultTransaction(solanaClient, signer), (tx) => appendTransactionMessageInstruction(receiveMessageIx, tx));
592
- };
593
- export async function getAssociatedTokenAddress(owner, mint, tokenProgramId = TOKEN_PROGRAM_ADDRESS) {
594
- const encoder = getAddressEncoder();
595
- const [associatedToken] = await getProgramDerivedAddress({
596
- programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
597
- seeds: [encoder.encode(toAddress(owner)), encoder.encode(tokenProgramId), encoder.encode(toAddress(mint))],
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
- const uint64Encoder = getU64Encoder();
604
- const svmRelayData = toSvmRelayData(relayData);
605
- const relayDataEncoder = SvmSpokeClient.getRelayDataEncoder();
606
- const encodedRelayData = relayDataEncoder.encode(svmRelayData);
607
- const encodedMessage = Buffer.from(relayData.message.slice(2), "hex");
608
- const encodedMessageHash = Uint8Array.from(Buffer.from(relayData.messageHash.slice(2), "hex"));
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
- const messageOffset = encodedRelayData.length - 4 - encodedMessage.length;
614
- const contentToHash = Buffer.concat([
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
- async function resolveFillStatusFromPdaEvents(fillStatusPda, toSlot, svmEventsClient) {
622
- // Get fill and requested slow fill events from fillStatus PDA
623
- const eventsToQuery = [SVMEventNames.FilledRelay, SVMEventNames.RequestedSlowFill];
624
- const relevantEvents = (await Promise.all(eventsToQuery.map((eventName) =>
625
- // PDAs should have only a few events, requesting up to 10 should be enough.
626
- svmEventsClient.queryDerivedAddressEvents(eventName, fillStatusPda, undefined, toSlot, { limit: 10 })))).flat();
627
- if (relevantEvents.length === 0) {
628
- // No fill or requested slow fill events found for this PDA
629
- return FillStatus.Unfilled;
630
- }
631
- // Sort events in ascending order of slot number
632
- relevantEvents.sort((a, b) => Number(a.slot - b.slot));
633
- // At this point we have an ordered array of only fill and requested slow fill events and
634
- // since it's not possible to submit a slow fill request once a fill has been submitted,
635
- // we can use the last event in the list to determine the fill status at the requested slot.
636
- const fillStatusEvent = relevantEvents.pop();
637
- switch (fillStatusEvent.name) {
638
- case SVMEventNames.FilledRelay:
639
- return FillStatus.Filled;
640
- case SVMEventNames.RequestedSlowFill:
641
- return FillStatus.RequestedSlowFill;
642
- default:
643
- throw new Error(`Unexpected event name: ${fillStatusEvent.name}`);
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
- async function fetchBatchFillStatusFromPdaAccounts(provider, fillStatusPdas, relayDataArray, logger) {
660
- const chunkSize = 100; // SVM method getMultipleAccounts allows a max of 100 addresses per request
661
- const commitment = "confirmed";
662
- const [pdaAccounts, { timestamp }] = await Promise.all([
663
- Promise.all(chunk(fillStatusPdas, chunkSize).map((chunk) => fetchEncodedAccounts(provider, chunk, { commitment }))),
664
- getNearestSlotTime(provider, { commitment }, logger),
665
- ]);
666
- const fillStatuses = pdaAccounts.flat().map((account, index) => {
667
- // If the PDA exists, we can fetch the status directly.
668
- if (account.exists) {
669
- const decodedAccount = decodeFillStatusAccount(account);
670
- return decodedAccount.data.status;
671
- }
672
- // If the PDA doesn't exist and the deadline hasn't passed yet, the deposit must be unfilled,
673
- // since PDAs can't be closed before the fill deadline.
674
- if (timestamp < relayDataArray[index].fillDeadline) {
675
- return FillStatus.Unfilled;
676
- }
677
- // If the PDA doesn't exist and the fill deadline has passed, then the status can't be determined and is set to undefined.
678
- return undefined;
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 async function getFillRelayViaInstructionParamsInstructions(spokePool, relayData, repaymentChainId, repaymentAddress, signer, maxWriteSize = 450) {
690
- const instructionParams = await getInstructionParamsPda(spokePool, signer.address);
691
- const relayDataEncoder = SvmSpokeClient.getFillRelayParamsEncoder();
692
- const svmRelayData = toSvmRelayData(relayData);
693
- const encodedRelayData = relayDataEncoder.encode({
694
- relayData: svmRelayData,
695
- repaymentChainId,
696
- repaymentAddress: toAddress(repaymentAddress),
697
- });
698
- const initInstructionParamsIx = SvmSpokeClient.getInitializeInstructionParamsInstruction({
699
- signer,
700
- instructionParams,
701
- totalSize: encodedRelayData.length,
702
- });
703
- const instructions = [initInstructionParamsIx];
704
- for (let i = 0; i <= encodedRelayData.length / maxWriteSize; ++i) {
705
- const offset = i * maxWriteSize;
706
- const offsetEnd = Math.min(offset + maxWriteSize, encodedRelayData.length);
707
- const fragment = encodedRelayData.slice(offset, offsetEnd);
708
- const writeInstructionParamsIx = SvmSpokeClient.getWriteInstructionParamsFragmentInstruction({
709
- signer,
710
- instructionParams,
711
- offset,
712
- fragment,
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
- instructions.push(writeInstructionParamsIx);
715
- }
716
- return instructions;
996
+ });
717
997
  }
718
998
  /**
719
999
  * Returns the delegate PDA for deposit.
720
1000
  */
721
- export async function getDepositDelegatePda(depositData, programId) {
722
- const addrEnc = getAddressEncoder();
723
- const u64 = getU64Encoder();
724
- const u32 = getU32Encoder();
725
- const parts = [
726
- Uint8Array.from(addrEnc.encode(depositData.depositor)),
727
- Uint8Array.from(addrEnc.encode(depositData.recipient)),
728
- Uint8Array.from(addrEnc.encode(depositData.inputToken)),
729
- Uint8Array.from(addrEnc.encode(depositData.outputToken)),
730
- Uint8Array.from(u64.encode(depositData.inputAmount)),
731
- Uint8Array.from(depositData.outputAmount),
732
- Uint8Array.from(u64.encode(depositData.destinationChainId)),
733
- Uint8Array.from(addrEnc.encode(depositData.exclusiveRelayer)),
734
- Uint8Array.from(u32.encode(depositData.quoteTimestamp)),
735
- Uint8Array.from(u32.encode(depositData.fillDeadline)),
736
- Uint8Array.from(u32.encode(depositData.exclusivityParameter)),
737
- Uint8Array.from(u32.encode(BigInt(depositData.message.length))),
738
- depositData.message,
739
- ];
740
- const seedHash = Buffer.from(keccak256(Buffer.concat(parts)).slice(2), "hex");
741
- const [pda] = await getProgramDerivedAddress({
742
- programAddress: programId,
743
- seeds: [Buffer.from("delegate"), seedHash],
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 async function getDepositNowDelegatePda(depositData, programId) {
751
- const addrEnc = getAddressEncoder();
752
- const u64 = getU64Encoder();
753
- const u32 = getU32Encoder();
754
- const parts = [
755
- Uint8Array.from(addrEnc.encode(depositData.depositor)),
756
- Uint8Array.from(addrEnc.encode(depositData.recipient)),
757
- Uint8Array.from(addrEnc.encode(depositData.inputToken)),
758
- Uint8Array.from(addrEnc.encode(depositData.outputToken)),
759
- Uint8Array.from(u64.encode(depositData.inputAmount)),
760
- Uint8Array.from(depositData.outputAmount),
761
- Uint8Array.from(u64.encode(depositData.destinationChainId)),
762
- Uint8Array.from(addrEnc.encode(depositData.exclusiveRelayer)),
763
- Uint8Array.from(u32.encode(depositData.fillDeadlineOffset)),
764
- Uint8Array.from(u32.encode(depositData.exclusivityPeriod)),
765
- Uint8Array.from(u32.encode(BigInt(depositData.message.length))),
766
- depositData.message,
767
- ];
768
- const seedHash = Buffer.from(keccak256(Buffer.concat(parts)).slice(2), "hex");
769
- const [pda] = await getProgramDerivedAddress({
770
- programAddress: programId,
771
- seeds: [Buffer.from("delegate"), seedHash],
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 async function getFillRelayDelegatePda(relayHash, repaymentChainId, repaymentAddress, programId) {
779
- const addrEnc = getAddressEncoder();
780
- const u64 = getU64Encoder();
781
- const parts = [
782
- relayHash,
783
- Uint8Array.from(u64.encode(repaymentChainId)),
784
- Uint8Array.from(addrEnc.encode(repaymentAddress)),
785
- ];
786
- const seedHash = Buffer.from(keccak256(Buffer.concat(parts)).slice(2), "hex");
787
- const [pda] = await getProgramDerivedAddress({
788
- programAddress: programId,
789
- seeds: [Buffer.from("delegate"), seedHash],
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 const hasCCTPV1MessageBeenProcessed = async (solanaClient, signer, nonce, sourceDomain, latestBlockhash) => {
805
- const noncePda = await getCCTPNoncePda(solanaClient, signer, nonce, sourceDomain);
806
- const isNonceUsedIx = MessageTransmitterClient.getIsNonceUsedInstruction({
807
- nonce: nonce,
808
- usedNonces: noncePda,
809
- });
810
- const parserFunction = (buf) => {
811
- if (buf.length != 1) {
812
- throw new Error("Invalid buffer length for isNonceUsedIx");
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
- return Boolean(buf[0]);
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 async function getAccountMetasForTokenlessMessage(solanaClient, signer, messageBytes) {
823
- const messageHex = messageBytes.slice(2);
824
- const messageHeader = decodeMessageHeader(Buffer.from(messageHex, "hex"));
825
- const programAddress = SvmSpokeClient.SVM_SPOKE_PROGRAM_ADDRESS;
826
- const statePda = await getStatePda(programAddress);
827
- const selfAuthority = await getSelfAuthority();
828
- const eventAuthority = await getEventAuthority(programAddress);
829
- const base = [
830
- { address: statePda, role: AccountRole.READONLY },
831
- { address: selfAuthority, role: AccountRole.READONLY },
832
- { address: programAddress, role: AccountRole.READONLY },
833
- ];
834
- if (isRelayRootBundleMessageBody(messageHeader.messageBody)) {
835
- const { data: { rootBundleId }, } = await SvmSpokeClient.fetchState(solanaClient, statePda);
836
- const rootBundle = await getRootBundlePda(programAddress, rootBundleId);
837
- return [
838
- ...base,
839
- { address: signer.address, role: AccountRole.WRITABLE },
840
- { address: statePda, role: AccountRole.WRITABLE },
841
- { address: rootBundle, role: AccountRole.WRITABLE },
842
- { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY },
843
- { address: eventAuthority, role: AccountRole.READONLY },
844
- { address: programAddress, role: AccountRole.READONLY },
845
- ];
846
- }
847
- if (isEmergencyDeleteRootBundleMessageBody(messageHeader.messageBody)) {
848
- const rootBundleId = getEmergencyDeleteRootBundleRootBundleId(messageHeader.messageBody);
849
- const rootBundle = await getRootBundlePda(programAddress, rootBundleId);
850
- return [
851
- ...base,
852
- { address: signer.address, role: AccountRole.READONLY },
853
- { address: statePda, role: AccountRole.READONLY },
854
- { address: rootBundle, role: AccountRole.WRITABLE },
855
- { address: eventAuthority, role: AccountRole.READONLY },
856
- { address: programAddress, role: AccountRole.READONLY },
857
- ];
858
- }
859
- return [
860
- ...base,
861
- { address: statePda, role: AccountRole.WRITABLE },
862
- { address: eventAuthority, role: AccountRole.READONLY },
863
- { address: programAddress, role: AccountRole.READONLY },
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 async function getCCTPDepositAccounts(hubChainId, cctpDestinationDomainId, tokenMessengerMinterAddress, messageTransmitterAddress) {
874
- const l2Usdc = SvmAddress.from(TOKEN_SYMBOLS_MAP.USDC.addresses[chainIsProd(hubChainId) ? CHAIN_IDs.SOLANA : CHAIN_IDs.SOLANA_DEVNET]);
875
- const [[tokenMessenger], [tokenMinter], [localToken], [cctpEventAuthority], [remoteTokenMessenger], [tokenMessengerMinterSenderAuthority], [messageTransmitter],] = await Promise.all([
876
- getProgramDerivedAddress({
877
- programAddress: tokenMessengerMinterAddress,
878
- seeds: ["token_messenger"],
879
- }),
880
- getProgramDerivedAddress({
881
- programAddress: tokenMessengerMinterAddress,
882
- seeds: ["token_minter"],
883
- }),
884
- getProgramDerivedAddress({
885
- programAddress: tokenMessengerMinterAddress,
886
- seeds: ["local_token", bs58.decode(l2Usdc.toBase58())],
887
- }),
888
- getProgramDerivedAddress({
889
- programAddress: tokenMessengerMinterAddress,
890
- seeds: ["__event_authority"],
891
- }),
892
- getProgramDerivedAddress({
893
- programAddress: tokenMessengerMinterAddress,
894
- seeds: ["remote_token_messenger", String(cctpDestinationDomainId)],
895
- }),
896
- getProgramDerivedAddress({
897
- programAddress: tokenMessengerMinterAddress,
898
- seeds: ["sender_authority"],
899
- }),
900
- getProgramDerivedAddress({
901
- programAddress: messageTransmitterAddress,
902
- seeds: ["message_transmitter"],
903
- }),
904
- ]);
905
- return {
906
- tokenMessenger,
907
- tokenMinter,
908
- localToken,
909
- cctpEventAuthority,
910
- remoteTokenMessenger,
911
- tokenMessengerMinterSenderAuthority,
912
- messageTransmitter,
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
- async function getAccountMetasForDepositMessage(message, hubChainId, tokenMessengerMinter, recipientAta) {
924
- const l1Usdc = EvmAddress.from(TOKEN_SYMBOLS_MAP.USDC.addresses[hubChainId]);
925
- const l2Usdc = SvmAddress.from(TOKEN_SYMBOLS_MAP.USDC.addresses[chainIsProd(hubChainId) ? CHAIN_IDs.SOLANA : CHAIN_IDs.SOLANA_DEVNET]);
926
- const [tokenMessengerPda] = await getProgramDerivedAddress({
927
- programAddress: tokenMessengerMinter,
928
- seeds: ["token_messenger"],
929
- });
930
- const [tokenMinterPda] = await getProgramDerivedAddress({
931
- programAddress: tokenMessengerMinter,
932
- seeds: ["token_minter"],
933
- });
934
- const [localTokenPda] = await getProgramDerivedAddress({
935
- programAddress: tokenMessengerMinter,
936
- seeds: ["local_token", bs58.decode(l2Usdc.toBase58())],
937
- });
938
- const [tokenMessengerEventAuthorityPda] = await getProgramDerivedAddress({
939
- programAddress: tokenMessengerMinter,
940
- seeds: ["__event_authority"],
941
- });
942
- const [custodyTokenAccountPda] = await getProgramDerivedAddress({
943
- programAddress: tokenMessengerMinter,
944
- seeds: ["custody", bs58.decode(l2Usdc.toBase58())],
945
- });
946
- // Define accounts dependent on deposit information.
947
- const [tokenPairPda] = await getProgramDerivedAddress({
948
- programAddress: tokenMessengerMinter,
949
- seeds: [
950
- new Uint8Array(Buffer.from("token_pair")),
951
- new Uint8Array(Buffer.from(String(message.sourceDomain))),
952
- new Uint8Array(Buffer.from(l1Usdc.toBytes32().slice(2), "hex")),
953
- ],
954
- });
955
- const [remoteTokenMessengerPda] = await getProgramDerivedAddress({
956
- programAddress: tokenMessengerMinter,
957
- seeds: ["remote_token_messenger", String(message.sourceDomain)],
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 async function getCCTPV1ReceiveMessageTx(solanaClient, signer, message, hubChainId, recipientAta) {
982
- const [messageTransmitterPda] = await getProgramDerivedAddress({
983
- programAddress: MessageTransmitterClient.MESSAGE_TRANSMITTER_PROGRAM_ADDRESS,
984
- seeds: ["message_transmitter"],
985
- });
986
- const [eventAuthorityPda] = await getProgramDerivedAddress({
987
- programAddress: MessageTransmitterClient.MESSAGE_TRANSMITTER_PROGRAM_ADDRESS,
988
- seeds: ["__event_authority"],
989
- });
990
- const cctpMessageReceiver = isDepositForBurnEvent(message)
991
- ? TokenMessengerMinterClient.TOKEN_MESSENGER_MINTER_PROGRAM_ADDRESS
992
- : SvmSpokeClient.SVM_SPOKE_PROGRAM_ADDRESS;
993
- const [authorityPda] = await getProgramDerivedAddress({
994
- programAddress: MessageTransmitterClient.MESSAGE_TRANSMITTER_PROGRAM_ADDRESS,
995
- seeds: ["message_transmitter_authority", bs58.decode(cctpMessageReceiver)],
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 = false, hubChainId = 1) {
1033
- return mapAsync(attestedMessages, async (message) => {
1034
- const receiveMessageIx = await getCCTPV1ReceiveMessageTx(solanaClient, signer, message, hubChainId, recipientAta);
1035
- if (simulate) {
1036
- const result = await solanaClient
1037
- .simulateTransaction(getBase64EncodedWireTransaction(await signTransactionMessageWithSigners(receiveMessageIx)), {
1038
- encoding: "base64",
1039
- })
1040
- .send();
1041
- if (result.value.err) {
1042
- throw new Error(result.value.err.toString());
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
- return "";
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 async function getMintInfo(solanaClient, mint, config) {
1056
- return await fetchMint(solanaClient, mint, config);
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
- const VALUE_OFFSET = 32 + 1; // 33
1071
- const VALUE_END = VALUE_OFFSET + 8; // 41
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(`svm | extractValueAmount: Message too short, need at least ${VALUE_END} bytes, got ${acrossPlusMessageBytes.length}`);
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(`readU64LEExact expected 8 bytes, received ${bytes.length}`);
1492
+ throw new Error("readU64LEExact expected 8 bytes, received ".concat(bytes.length));
1081
1493
  }
1082
- const view = new DataView(bytes.buffer, bytes.byteOffset, 8);
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