@across-protocol/sdk 4.1.63 → 4.2.1

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 (536) hide show
  1. package/dist/cjs/arch/evm/BlockUtils.d.ts +15 -0
  2. package/dist/cjs/arch/evm/BlockUtils.js +218 -0
  3. package/dist/cjs/arch/evm/BlockUtils.js.map +1 -0
  4. package/dist/cjs/arch/evm/SpokeUtils.d.ts +1 -1
  5. package/dist/cjs/arch/evm/SpokeUtils.js +6 -5
  6. package/dist/cjs/arch/evm/SpokeUtils.js.map +1 -1
  7. package/dist/cjs/arch/evm/index.d.ts +1 -0
  8. package/dist/cjs/arch/evm/index.js +1 -0
  9. package/dist/cjs/arch/evm/index.js.map +1 -1
  10. package/dist/cjs/arch/svm/SpokeUtils.d.ts +20 -0
  11. package/dist/cjs/arch/svm/SpokeUtils.js +449 -0
  12. package/dist/cjs/arch/svm/SpokeUtils.js.map +1 -0
  13. package/dist/cjs/arch/svm/constants.d.ts +2 -0
  14. package/dist/cjs/arch/svm/constants.js +7 -0
  15. package/dist/cjs/arch/svm/constants.js.map +1 -0
  16. package/dist/cjs/arch/svm/eventsClient.d.ts +26 -0
  17. package/dist/cjs/arch/svm/eventsClient.js +253 -0
  18. package/dist/cjs/arch/svm/eventsClient.js.map +1 -0
  19. package/dist/cjs/arch/svm/index.d.ts +5 -1
  20. package/dist/cjs/arch/svm/index.js +6 -2
  21. package/dist/cjs/arch/svm/index.js.map +1 -1
  22. package/dist/cjs/{svm → arch/svm}/types.d.ts +9 -4
  23. package/dist/cjs/arch/svm/types.js.map +1 -0
  24. package/dist/cjs/arch/svm/utils.d.ts +18 -0
  25. package/dist/cjs/arch/svm/utils.js +212 -0
  26. package/dist/cjs/arch/svm/utils.js.map +1 -0
  27. package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts +1 -1
  28. package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js +7 -7
  29. package/dist/cjs/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js.map +1 -1
  30. package/dist/cjs/clients/BaseAbstractClient.d.ts +6 -5
  31. package/dist/cjs/clients/BaseAbstractClient.js +30 -19
  32. package/dist/cjs/clients/BaseAbstractClient.js.map +1 -1
  33. package/dist/cjs/clients/BundleDataClient/BundleDataClient.js +15 -11
  34. package/dist/cjs/clients/BundleDataClient/BundleDataClient.js.map +1 -1
  35. package/dist/cjs/clients/BundleDataClient/utils/PoolRebalanceUtils.js +1 -1
  36. package/dist/cjs/clients/BundleDataClient/utils/PoolRebalanceUtils.js.map +1 -1
  37. package/dist/cjs/clients/BundleDataClient/utils/SuperstructUtils.d.ts +114 -114
  38. package/dist/cjs/clients/HubPoolClient.d.ts +4 -3
  39. package/dist/cjs/clients/HubPoolClient.js +18 -17
  40. package/dist/cjs/clients/HubPoolClient.js.map +1 -1
  41. package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.d.ts +3 -3
  42. package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.js +23 -20
  43. package/dist/cjs/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
  44. package/dist/cjs/clients/SpokePoolClient/SVMSpokePoolClient.d.ts +23 -0
  45. package/dist/cjs/clients/SpokePoolClient/SVMSpokePoolClient.js +172 -0
  46. package/dist/cjs/clients/SpokePoolClient/SVMSpokePoolClient.js.map +1 -0
  47. package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.d.ts +5 -5
  48. package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.js +54 -57
  49. package/dist/cjs/clients/SpokePoolClient/SpokePoolClient.js.map +1 -1
  50. package/dist/cjs/clients/SpokePoolClient/index.d.ts +3 -0
  51. package/dist/cjs/clients/SpokePoolClient/index.js +8 -1
  52. package/dist/cjs/clients/SpokePoolClient/index.js.map +1 -1
  53. package/dist/cjs/clients/index.d.ts +1 -1
  54. package/dist/cjs/clients/index.js +2 -1
  55. package/dist/cjs/clients/index.js.map +1 -1
  56. package/dist/cjs/clients/mocks/MockConfigStoreClient.d.ts +1 -1
  57. package/dist/cjs/clients/mocks/MockConfigStoreClient.js +2 -2
  58. package/dist/cjs/clients/mocks/MockConfigStoreClient.js.map +1 -1
  59. package/dist/cjs/clients/mocks/MockHubPoolClient.js +2 -2
  60. package/dist/cjs/clients/mocks/MockHubPoolClient.js.map +1 -1
  61. package/dist/cjs/clients/mocks/MockSpokePoolClient.js +7 -4
  62. package/dist/cjs/clients/mocks/MockSpokePoolClient.js.map +1 -1
  63. package/dist/cjs/clients/mocks/MockSvmCpiEventsClient.d.ts +33 -0
  64. package/dist/cjs/clients/mocks/MockSvmCpiEventsClient.js +184 -0
  65. package/dist/cjs/clients/mocks/MockSvmCpiEventsClient.js.map +1 -0
  66. package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.d.ts +30 -0
  67. package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.js +90 -0
  68. package/dist/cjs/clients/mocks/MockSvmSpokePoolClient.js.map +1 -0
  69. package/dist/cjs/clients/mocks/index.d.ts +2 -0
  70. package/dist/cjs/clients/mocks/index.js +2 -0
  71. package/dist/cjs/clients/mocks/index.js.map +1 -1
  72. package/dist/cjs/coingecko/Coingecko.d.ts +3 -2
  73. package/dist/cjs/coingecko/Coingecko.js +11 -3
  74. package/dist/cjs/coingecko/Coingecko.js.map +1 -1
  75. package/dist/cjs/constants.d.ts +1 -0
  76. package/dist/cjs/constants.js +2 -1
  77. package/dist/cjs/constants.js.map +1 -1
  78. package/dist/cjs/gasPriceOracle/adapters/arbitrum.d.ts +2 -2
  79. package/dist/cjs/gasPriceOracle/adapters/arbitrum.js.map +1 -1
  80. package/dist/cjs/gasPriceOracle/adapters/ethereum.d.ts +4 -4
  81. package/dist/cjs/gasPriceOracle/adapters/ethereum.js.map +1 -1
  82. package/dist/cjs/gasPriceOracle/adapters/linea-viem.js +3 -2
  83. package/dist/cjs/gasPriceOracle/adapters/linea-viem.js.map +1 -1
  84. package/dist/cjs/gasPriceOracle/adapters/polygon.d.ts +3 -3
  85. package/dist/cjs/gasPriceOracle/adapters/solana.d.ts +4 -0
  86. package/dist/cjs/gasPriceOracle/adapters/solana.js +43 -0
  87. package/dist/cjs/gasPriceOracle/adapters/solana.js.map +1 -0
  88. package/dist/cjs/gasPriceOracle/index.d.ts +1 -1
  89. package/dist/cjs/gasPriceOracle/oracle.d.ts +4 -3
  90. package/dist/cjs/gasPriceOracle/oracle.js +16 -9
  91. package/dist/cjs/gasPriceOracle/oracle.js.map +1 -1
  92. package/dist/cjs/gasPriceOracle/types.d.ts +6 -1
  93. package/dist/cjs/index.d.ts +0 -1
  94. package/dist/cjs/index.js +1 -2
  95. package/dist/cjs/index.js.map +1 -1
  96. package/dist/cjs/interfaces/SpokePool.d.ts +13 -0
  97. package/dist/cjs/interfaces/SpokePool.js.map +1 -1
  98. package/dist/cjs/providers/index.d.ts +1 -1
  99. package/dist/cjs/providers/index.js +1 -2
  100. package/dist/cjs/providers/index.js.map +1 -1
  101. package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.d.ts +5 -0
  102. package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.js +21 -0
  103. package/dist/cjs/providers/mocks/MockCachedSolanaRpcFactory.js.map +1 -0
  104. package/dist/cjs/providers/mocks/MockRateLimitedSolanaRpcFactory.d.ts +5 -0
  105. package/dist/cjs/providers/mocks/MockRateLimitedSolanaRpcFactory.js +20 -0
  106. package/dist/cjs/providers/mocks/MockRateLimitedSolanaRpcFactory.js.map +1 -0
  107. package/dist/cjs/providers/mocks/MockSolanaRpcFactory.d.ts +13 -0
  108. package/dist/cjs/providers/mocks/MockSolanaRpcFactory.js +76 -0
  109. package/dist/cjs/providers/mocks/MockSolanaRpcFactory.js.map +1 -0
  110. package/dist/cjs/providers/mocks/index.d.ts +4 -0
  111. package/dist/cjs/providers/mocks/index.js +8 -0
  112. package/dist/cjs/providers/mocks/index.js.map +1 -0
  113. package/dist/cjs/providers/{mockProvider.js → mocks/mockEthersProvider.js} +2 -2
  114. package/dist/cjs/providers/mocks/mockEthersProvider.js.map +1 -0
  115. package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.d.ts +1 -1
  116. package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.js +10 -8
  117. package/dist/cjs/relayFeeCalculator/chain-queries/baseQuery.js.map +1 -1
  118. package/dist/cjs/relayFeeCalculator/chain-queries/factory.d.ts +4 -2
  119. package/dist/cjs/relayFeeCalculator/chain-queries/factory.js +8 -2
  120. package/dist/cjs/relayFeeCalculator/chain-queries/factory.js.map +1 -1
  121. package/dist/cjs/relayFeeCalculator/chain-queries/index.d.ts +1 -0
  122. package/dist/cjs/relayFeeCalculator/chain-queries/index.js +1 -0
  123. package/dist/cjs/relayFeeCalculator/chain-queries/index.js.map +1 -1
  124. package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.d.ts +37 -0
  125. package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.js +171 -0
  126. package/dist/cjs/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -0
  127. package/dist/cjs/relayFeeCalculator/relayFeeCalculator.d.ts +2 -0
  128. package/dist/cjs/relayFeeCalculator/relayFeeCalculator.js +9 -3
  129. package/dist/cjs/relayFeeCalculator/relayFeeCalculator.js.map +1 -1
  130. package/dist/cjs/utils/AddressUtils.d.ts +9 -3
  131. package/dist/cjs/utils/AddressUtils.js +36 -6
  132. package/dist/cjs/utils/AddressUtils.js.map +1 -1
  133. package/dist/cjs/utils/ArrayUtils.d.ts +1 -0
  134. package/dist/cjs/utils/ArrayUtils.js +6 -1
  135. package/dist/cjs/utils/ArrayUtils.js.map +1 -1
  136. package/dist/cjs/utils/BlockFinder.d.ts +22 -0
  137. package/dist/cjs/utils/BlockFinder.js +10 -0
  138. package/dist/cjs/utils/BlockFinder.js.map +1 -0
  139. package/dist/cjs/utils/BlockUtils.d.ts +2 -27
  140. package/dist/cjs/utils/BlockUtils.js +2 -208
  141. package/dist/cjs/utils/BlockUtils.js.map +1 -1
  142. package/dist/cjs/utils/EventUtils.d.ts +4 -4
  143. package/dist/cjs/utils/EventUtils.js +7 -4
  144. package/dist/cjs/utils/EventUtils.js.map +1 -1
  145. package/dist/cjs/utils/JSONUtils.js +3 -0
  146. package/dist/cjs/utils/JSONUtils.js.map +1 -1
  147. package/dist/cjs/utils/NumberUtils.d.ts +1 -0
  148. package/dist/cjs/utils/NumberUtils.js +7 -1
  149. package/dist/cjs/utils/NumberUtils.js.map +1 -1
  150. package/dist/cjs/utils/SpokeUtils.js +5 -0
  151. package/dist/cjs/utils/SpokeUtils.js.map +1 -1
  152. package/dist/cjs/utils/TokenUtils.js +4 -1
  153. package/dist/cjs/utils/TokenUtils.js.map +1 -1
  154. package/dist/cjs/utils/index.d.ts +1 -0
  155. package/dist/cjs/utils/index.js +1 -0
  156. package/dist/cjs/utils/index.js.map +1 -1
  157. package/dist/esm/arch/evm/BlockUtils.d.ts +24 -0
  158. package/dist/esm/arch/evm/BlockUtils.js +250 -0
  159. package/dist/esm/arch/evm/BlockUtils.js.map +1 -0
  160. package/dist/esm/arch/evm/SpokeUtils.d.ts +1 -1
  161. package/dist/esm/arch/evm/SpokeUtils.js +6 -5
  162. package/dist/esm/arch/evm/SpokeUtils.js.map +1 -1
  163. package/dist/esm/arch/evm/index.d.ts +1 -0
  164. package/dist/esm/arch/evm/index.js +1 -0
  165. package/dist/esm/arch/evm/index.js.map +1 -1
  166. package/dist/esm/arch/svm/SpokeUtils.d.ts +122 -0
  167. package/dist/esm/arch/svm/SpokeUtils.js +566 -0
  168. package/dist/esm/arch/svm/SpokeUtils.js.map +1 -0
  169. package/dist/esm/arch/svm/constants.d.ts +2 -0
  170. package/dist/esm/arch/svm/constants.js +3 -0
  171. package/dist/esm/arch/svm/constants.js.map +1 -0
  172. package/dist/esm/arch/svm/eventsClient.d.ts +87 -0
  173. package/dist/esm/arch/svm/eventsClient.js +316 -0
  174. package/dist/esm/arch/svm/eventsClient.js.map +1 -0
  175. package/dist/esm/arch/svm/index.d.ts +5 -1
  176. package/dist/esm/arch/svm/index.js +5 -1
  177. package/dist/esm/arch/svm/index.js.map +1 -1
  178. package/dist/esm/{svm → arch/svm}/types.d.ts +9 -4
  179. package/dist/esm/arch/svm/types.js.map +1 -0
  180. package/dist/esm/arch/svm/utils.d.ts +63 -0
  181. package/dist/esm/arch/svm/utils.js +258 -0
  182. package/dist/esm/arch/svm/utils.js.map +1 -0
  183. package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts +1 -1
  184. package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js +7 -7
  185. package/dist/esm/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.js.map +1 -1
  186. package/dist/esm/clients/BaseAbstractClient.d.ts +6 -5
  187. package/dist/esm/clients/BaseAbstractClient.js +30 -19
  188. package/dist/esm/clients/BaseAbstractClient.js.map +1 -1
  189. package/dist/esm/clients/BundleDataClient/BundleDataClient.js +17 -14
  190. package/dist/esm/clients/BundleDataClient/BundleDataClient.js.map +1 -1
  191. package/dist/esm/clients/BundleDataClient/utils/PoolRebalanceUtils.js +1 -1
  192. package/dist/esm/clients/BundleDataClient/utils/PoolRebalanceUtils.js.map +1 -1
  193. package/dist/esm/clients/BundleDataClient/utils/SuperstructUtils.d.ts +114 -114
  194. package/dist/esm/clients/HubPoolClient.d.ts +4 -3
  195. package/dist/esm/clients/HubPoolClient.js +19 -18
  196. package/dist/esm/clients/HubPoolClient.js.map +1 -1
  197. package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.d.ts +3 -3
  198. package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.js +23 -20
  199. package/dist/esm/clients/SpokePoolClient/EVMSpokePoolClient.js.map +1 -1
  200. package/dist/esm/clients/SpokePoolClient/SVMSpokePoolClient.d.ts +66 -0
  201. package/dist/esm/clients/SpokePoolClient/SVMSpokePoolClient.js +225 -0
  202. package/dist/esm/clients/SpokePoolClient/SVMSpokePoolClient.js.map +1 -0
  203. package/dist/esm/clients/SpokePoolClient/SpokePoolClient.d.ts +7 -7
  204. package/dist/esm/clients/SpokePoolClient/SpokePoolClient.js +57 -59
  205. package/dist/esm/clients/SpokePoolClient/SpokePoolClient.js.map +1 -1
  206. package/dist/esm/clients/SpokePoolClient/index.d.ts +8 -0
  207. package/dist/esm/clients/SpokePoolClient/index.js +10 -0
  208. package/dist/esm/clients/SpokePoolClient/index.js.map +1 -1
  209. package/dist/esm/clients/index.d.ts +1 -1
  210. package/dist/esm/clients/index.js +1 -1
  211. package/dist/esm/clients/index.js.map +1 -1
  212. package/dist/esm/clients/mocks/MockConfigStoreClient.d.ts +1 -1
  213. package/dist/esm/clients/mocks/MockConfigStoreClient.js +2 -2
  214. package/dist/esm/clients/mocks/MockConfigStoreClient.js.map +1 -1
  215. package/dist/esm/clients/mocks/MockHubPoolClient.js +2 -2
  216. package/dist/esm/clients/mocks/MockHubPoolClient.js.map +1 -1
  217. package/dist/esm/clients/mocks/MockSpokePoolClient.js +8 -5
  218. package/dist/esm/clients/mocks/MockSpokePoolClient.js.map +1 -1
  219. package/dist/esm/clients/mocks/MockSvmCpiEventsClient.d.ts +33 -0
  220. package/dist/esm/clients/mocks/MockSvmCpiEventsClient.js +183 -0
  221. package/dist/esm/clients/mocks/MockSvmCpiEventsClient.js.map +1 -0
  222. package/dist/esm/clients/mocks/MockSvmSpokePoolClient.d.ts +30 -0
  223. package/dist/esm/clients/mocks/MockSvmSpokePoolClient.js +89 -0
  224. package/dist/esm/clients/mocks/MockSvmSpokePoolClient.js.map +1 -0
  225. package/dist/esm/clients/mocks/index.d.ts +2 -0
  226. package/dist/esm/clients/mocks/index.js +2 -0
  227. package/dist/esm/clients/mocks/index.js.map +1 -1
  228. package/dist/esm/coingecko/Coingecko.d.ts +3 -2
  229. package/dist/esm/coingecko/Coingecko.js +12 -3
  230. package/dist/esm/coingecko/Coingecko.js.map +1 -1
  231. package/dist/esm/constants.d.ts +1 -0
  232. package/dist/esm/constants.js +1 -0
  233. package/dist/esm/constants.js.map +1 -1
  234. package/dist/esm/gasPriceOracle/adapters/arbitrum.d.ts +2 -2
  235. package/dist/esm/gasPriceOracle/adapters/arbitrum.js.map +1 -1
  236. package/dist/esm/gasPriceOracle/adapters/ethereum.d.ts +4 -4
  237. package/dist/esm/gasPriceOracle/adapters/ethereum.js.map +1 -1
  238. package/dist/esm/gasPriceOracle/adapters/linea-viem.js +3 -2
  239. package/dist/esm/gasPriceOracle/adapters/linea-viem.js.map +1 -1
  240. package/dist/esm/gasPriceOracle/adapters/polygon.d.ts +4 -4
  241. package/dist/esm/gasPriceOracle/adapters/polygon.js +1 -1
  242. package/dist/esm/gasPriceOracle/adapters/solana.d.ts +8 -0
  243. package/dist/esm/gasPriceOracle/adapters/solana.js +43 -0
  244. package/dist/esm/gasPriceOracle/adapters/solana.js.map +1 -0
  245. package/dist/esm/gasPriceOracle/index.d.ts +1 -1
  246. package/dist/esm/gasPriceOracle/oracle.d.ts +4 -3
  247. package/dist/esm/gasPriceOracle/oracle.js +18 -9
  248. package/dist/esm/gasPriceOracle/oracle.js.map +1 -1
  249. package/dist/esm/gasPriceOracle/types.d.ts +6 -1
  250. package/dist/esm/index.d.ts +0 -1
  251. package/dist/esm/index.js +0 -2
  252. package/dist/esm/index.js.map +1 -1
  253. package/dist/esm/interfaces/SpokePool.d.ts +13 -0
  254. package/dist/esm/interfaces/SpokePool.js.map +1 -1
  255. package/dist/esm/providers/index.d.ts +1 -1
  256. package/dist/esm/providers/index.js +1 -2
  257. package/dist/esm/providers/index.js.map +1 -1
  258. package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.d.ts +5 -0
  259. package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.js +19 -0
  260. package/dist/esm/providers/mocks/MockCachedSolanaRpcFactory.js.map +1 -0
  261. package/dist/esm/providers/mocks/MockRateLimitedSolanaRpcFactory.d.ts +5 -0
  262. package/dist/esm/providers/mocks/MockRateLimitedSolanaRpcFactory.js +18 -0
  263. package/dist/esm/providers/mocks/MockRateLimitedSolanaRpcFactory.js.map +1 -0
  264. package/dist/esm/providers/mocks/MockSolanaRpcFactory.d.ts +13 -0
  265. package/dist/esm/providers/mocks/MockSolanaRpcFactory.js +74 -0
  266. package/dist/esm/providers/mocks/MockSolanaRpcFactory.js.map +1 -0
  267. package/dist/esm/providers/mocks/index.d.ts +4 -0
  268. package/dist/esm/providers/mocks/index.js +5 -0
  269. package/dist/esm/providers/mocks/index.js.map +1 -0
  270. package/dist/esm/providers/{mockProvider.js → mocks/mockEthersProvider.js} +2 -2
  271. package/dist/esm/providers/mocks/mockEthersProvider.js.map +1 -0
  272. package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.d.ts +1 -1
  273. package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.js +10 -8
  274. package/dist/esm/relayFeeCalculator/chain-queries/baseQuery.js.map +1 -1
  275. package/dist/esm/relayFeeCalculator/chain-queries/factory.d.ts +4 -2
  276. package/dist/esm/relayFeeCalculator/chain-queries/factory.js +11 -5
  277. package/dist/esm/relayFeeCalculator/chain-queries/factory.js.map +1 -1
  278. package/dist/esm/relayFeeCalculator/chain-queries/index.d.ts +1 -0
  279. package/dist/esm/relayFeeCalculator/chain-queries/index.js +1 -0
  280. package/dist/esm/relayFeeCalculator/chain-queries/index.js.map +1 -1
  281. package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.d.ts +84 -0
  282. package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js +216 -0
  283. package/dist/esm/relayFeeCalculator/chain-queries/svmQuery.js.map +1 -0
  284. package/dist/esm/relayFeeCalculator/relayFeeCalculator.d.ts +12 -1
  285. package/dist/esm/relayFeeCalculator/relayFeeCalculator.js +9 -4
  286. package/dist/esm/relayFeeCalculator/relayFeeCalculator.js.map +1 -1
  287. package/dist/esm/utils/AddressUtils.d.ts +9 -3
  288. package/dist/esm/utils/AddressUtils.js +41 -6
  289. package/dist/esm/utils/AddressUtils.js.map +1 -1
  290. package/dist/esm/utils/ArrayUtils.d.ts +6 -0
  291. package/dist/esm/utils/ArrayUtils.js +9 -0
  292. package/dist/esm/utils/ArrayUtils.js.map +1 -1
  293. package/dist/esm/utils/BlockFinder.d.ts +22 -0
  294. package/dist/esm/utils/BlockFinder.js +7 -0
  295. package/dist/esm/utils/BlockFinder.js.map +1 -0
  296. package/dist/esm/utils/BlockUtils.d.ts +2 -36
  297. package/dist/esm/utils/BlockUtils.js +2 -243
  298. package/dist/esm/utils/BlockUtils.js.map +1 -1
  299. package/dist/esm/utils/EventUtils.d.ts +4 -4
  300. package/dist/esm/utils/EventUtils.js +7 -4
  301. package/dist/esm/utils/EventUtils.js.map +1 -1
  302. package/dist/esm/utils/JSONUtils.js +3 -0
  303. package/dist/esm/utils/JSONUtils.js.map +1 -1
  304. package/dist/esm/utils/NumberUtils.d.ts +7 -0
  305. package/dist/esm/utils/NumberUtils.js +11 -0
  306. package/dist/esm/utils/NumberUtils.js.map +1 -1
  307. package/dist/esm/utils/SpokeUtils.js +5 -0
  308. package/dist/esm/utils/SpokeUtils.js.map +1 -1
  309. package/dist/esm/utils/TokenUtils.d.ts +12 -0
  310. package/dist/esm/utils/TokenUtils.js +6 -3
  311. package/dist/esm/utils/TokenUtils.js.map +1 -1
  312. package/dist/esm/utils/index.d.ts +1 -0
  313. package/dist/esm/utils/index.js +1 -0
  314. package/dist/esm/utils/index.js.map +1 -1
  315. package/dist/types/arch/evm/BlockUtils.d.ts +25 -0
  316. package/dist/types/arch/evm/BlockUtils.d.ts.map +1 -0
  317. package/dist/types/arch/evm/SpokeUtils.d.ts +1 -1
  318. package/dist/types/arch/evm/SpokeUtils.d.ts.map +1 -1
  319. package/dist/types/arch/evm/index.d.ts +1 -0
  320. package/dist/types/arch/evm/index.d.ts.map +1 -1
  321. package/dist/types/arch/svm/SpokeUtils.d.ts +123 -0
  322. package/dist/types/arch/svm/SpokeUtils.d.ts.map +1 -0
  323. package/dist/types/arch/svm/constants.d.ts +3 -0
  324. package/dist/types/arch/svm/constants.d.ts.map +1 -0
  325. package/dist/types/arch/svm/eventsClient.d.ts +88 -0
  326. package/dist/types/arch/svm/eventsClient.d.ts.map +1 -0
  327. package/dist/types/arch/svm/index.d.ts +5 -1
  328. package/dist/types/arch/svm/index.d.ts.map +1 -1
  329. package/dist/types/{svm → arch/svm}/types.d.ts +9 -4
  330. package/dist/types/arch/svm/types.d.ts.map +1 -0
  331. package/dist/types/arch/svm/utils.d.ts +64 -0
  332. package/dist/types/arch/svm/utils.d.ts.map +1 -0
  333. package/dist/types/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts +1 -1
  334. package/dist/types/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.d.ts.map +1 -1
  335. package/dist/types/clients/BaseAbstractClient.d.ts +6 -5
  336. package/dist/types/clients/BaseAbstractClient.d.ts.map +1 -1
  337. package/dist/types/clients/BundleDataClient/BundleDataClient.d.ts.map +1 -1
  338. package/dist/types/clients/BundleDataClient/utils/SuperstructUtils.d.ts +114 -114
  339. package/dist/types/clients/HubPoolClient.d.ts +4 -3
  340. package/dist/types/clients/HubPoolClient.d.ts.map +1 -1
  341. package/dist/types/clients/SpokePoolClient/EVMSpokePoolClient.d.ts +3 -3
  342. package/dist/types/clients/SpokePoolClient/EVMSpokePoolClient.d.ts.map +1 -1
  343. package/dist/types/clients/SpokePoolClient/SVMSpokePoolClient.d.ts +67 -0
  344. package/dist/types/clients/SpokePoolClient/SVMSpokePoolClient.d.ts.map +1 -0
  345. package/dist/types/clients/SpokePoolClient/SpokePoolClient.d.ts +7 -7
  346. package/dist/types/clients/SpokePoolClient/SpokePoolClient.d.ts.map +1 -1
  347. package/dist/types/clients/SpokePoolClient/index.d.ts +8 -0
  348. package/dist/types/clients/SpokePoolClient/index.d.ts.map +1 -1
  349. package/dist/types/clients/index.d.ts +1 -1
  350. package/dist/types/clients/index.d.ts.map +1 -1
  351. package/dist/types/clients/mocks/MockConfigStoreClient.d.ts +1 -1
  352. package/dist/types/clients/mocks/MockConfigStoreClient.d.ts.map +1 -1
  353. package/dist/types/clients/mocks/MockSpokePoolClient.d.ts.map +1 -1
  354. package/dist/types/clients/mocks/MockSvmCpiEventsClient.d.ts +34 -0
  355. package/dist/types/clients/mocks/MockSvmCpiEventsClient.d.ts.map +1 -0
  356. package/dist/types/clients/mocks/MockSvmSpokePoolClient.d.ts +31 -0
  357. package/dist/types/clients/mocks/MockSvmSpokePoolClient.d.ts.map +1 -0
  358. package/dist/types/clients/mocks/index.d.ts +2 -0
  359. package/dist/types/clients/mocks/index.d.ts.map +1 -1
  360. package/dist/types/coingecko/Coingecko.d.ts +3 -2
  361. package/dist/types/coingecko/Coingecko.d.ts.map +1 -1
  362. package/dist/types/constants.d.ts +1 -0
  363. package/dist/types/constants.d.ts.map +1 -1
  364. package/dist/types/gasPriceOracle/adapters/arbitrum.d.ts +2 -2
  365. package/dist/types/gasPriceOracle/adapters/arbitrum.d.ts.map +1 -1
  366. package/dist/types/gasPriceOracle/adapters/ethereum.d.ts +4 -4
  367. package/dist/types/gasPriceOracle/adapters/ethereum.d.ts.map +1 -1
  368. package/dist/types/gasPriceOracle/adapters/linea-viem.d.ts.map +1 -1
  369. package/dist/types/gasPriceOracle/adapters/polygon.d.ts +4 -4
  370. package/dist/types/gasPriceOracle/adapters/polygon.d.ts.map +1 -1
  371. package/dist/types/gasPriceOracle/adapters/solana.d.ts +9 -0
  372. package/dist/types/gasPriceOracle/adapters/solana.d.ts.map +1 -0
  373. package/dist/types/gasPriceOracle/index.d.ts +1 -1
  374. package/dist/types/gasPriceOracle/index.d.ts.map +1 -1
  375. package/dist/types/gasPriceOracle/oracle.d.ts +4 -3
  376. package/dist/types/gasPriceOracle/oracle.d.ts.map +1 -1
  377. package/dist/types/gasPriceOracle/types.d.ts +6 -1
  378. package/dist/types/gasPriceOracle/types.d.ts.map +1 -1
  379. package/dist/types/index.d.ts +0 -1
  380. package/dist/types/index.d.ts.map +1 -1
  381. package/dist/types/interfaces/SpokePool.d.ts +13 -0
  382. package/dist/types/interfaces/SpokePool.d.ts.map +1 -1
  383. package/dist/types/providers/index.d.ts +1 -1
  384. package/dist/types/providers/index.d.ts.map +1 -1
  385. package/dist/types/providers/mocks/MockCachedSolanaRpcFactory.d.ts +6 -0
  386. package/dist/types/providers/mocks/MockCachedSolanaRpcFactory.d.ts.map +1 -0
  387. package/dist/types/providers/mocks/MockRateLimitedSolanaRpcFactory.d.ts +6 -0
  388. package/dist/types/providers/mocks/MockRateLimitedSolanaRpcFactory.d.ts.map +1 -0
  389. package/dist/types/providers/mocks/MockSolanaRpcFactory.d.ts +14 -0
  390. package/dist/types/providers/mocks/MockSolanaRpcFactory.d.ts.map +1 -0
  391. package/dist/types/providers/mocks/index.d.ts +5 -0
  392. package/dist/types/providers/mocks/index.d.ts.map +1 -0
  393. package/dist/types/providers/{mockProvider.d.ts → mocks/mockEthersProvider.d.ts} +1 -1
  394. package/dist/types/providers/mocks/mockEthersProvider.d.ts.map +1 -0
  395. package/dist/types/relayFeeCalculator/chain-queries/baseQuery.d.ts +1 -1
  396. package/dist/types/relayFeeCalculator/chain-queries/baseQuery.d.ts.map +1 -1
  397. package/dist/types/relayFeeCalculator/chain-queries/factory.d.ts +4 -2
  398. package/dist/types/relayFeeCalculator/chain-queries/factory.d.ts.map +1 -1
  399. package/dist/types/relayFeeCalculator/chain-queries/index.d.ts +1 -0
  400. package/dist/types/relayFeeCalculator/chain-queries/index.d.ts.map +1 -1
  401. package/dist/types/relayFeeCalculator/chain-queries/svmQuery.d.ts +85 -0
  402. package/dist/types/relayFeeCalculator/chain-queries/svmQuery.d.ts.map +1 -0
  403. package/dist/types/relayFeeCalculator/relayFeeCalculator.d.ts +12 -1
  404. package/dist/types/relayFeeCalculator/relayFeeCalculator.d.ts.map +1 -1
  405. package/dist/types/utils/AddressUtils.d.ts +9 -3
  406. package/dist/types/utils/AddressUtils.d.ts.map +1 -1
  407. package/dist/types/utils/ArrayUtils.d.ts +6 -0
  408. package/dist/types/utils/ArrayUtils.d.ts.map +1 -1
  409. package/dist/types/utils/BlockFinder.d.ts +23 -0
  410. package/dist/types/utils/BlockFinder.d.ts.map +1 -0
  411. package/dist/types/utils/BlockUtils.d.ts +2 -36
  412. package/dist/types/utils/BlockUtils.d.ts.map +1 -1
  413. package/dist/types/utils/EventUtils.d.ts +4 -4
  414. package/dist/types/utils/EventUtils.d.ts.map +1 -1
  415. package/dist/types/utils/JSONUtils.d.ts.map +1 -1
  416. package/dist/types/utils/NumberUtils.d.ts +7 -0
  417. package/dist/types/utils/NumberUtils.d.ts.map +1 -1
  418. package/dist/types/utils/SpokeUtils.d.ts.map +1 -1
  419. package/dist/types/utils/TokenUtils.d.ts +12 -0
  420. package/dist/types/utils/TokenUtils.d.ts.map +1 -1
  421. package/dist/types/utils/index.d.ts +1 -0
  422. package/dist/types/utils/index.d.ts.map +1 -1
  423. package/package.json +3 -1
  424. package/src/arch/evm/BlockUtils.ts +209 -0
  425. package/src/arch/evm/SpokeUtils.ts +5 -5
  426. package/src/arch/evm/index.ts +1 -0
  427. package/src/arch/svm/SpokeUtils.ts +581 -0
  428. package/src/arch/svm/constants.ts +2 -0
  429. package/src/arch/svm/eventsClient.ts +342 -0
  430. package/src/arch/svm/index.ts +5 -1
  431. package/src/{svm → arch/svm}/types.ts +21 -4
  432. package/src/arch/svm/utils.ts +233 -0
  433. package/src/clients/AcrossConfigStoreClient/AcrossConfigStoreClient.ts +7 -7
  434. package/src/clients/BaseAbstractClient.ts +20 -13
  435. package/src/clients/BundleDataClient/BundleDataClient.ts +28 -19
  436. package/src/clients/BundleDataClient/utils/PoolRebalanceUtils.ts +1 -1
  437. package/src/clients/HubPoolClient.ts +19 -19
  438. package/src/clients/SpokePoolClient/EVMSpokePoolClient.ts +23 -21
  439. package/src/clients/SpokePoolClient/SVMSpokePoolClient.ts +268 -0
  440. package/src/clients/SpokePoolClient/SpokePoolClient.ts +50 -59
  441. package/src/clients/SpokePoolClient/index.ts +11 -0
  442. package/src/clients/index.ts +1 -1
  443. package/src/clients/mocks/MockConfigStoreClient.ts +2 -2
  444. package/src/clients/mocks/MockHubPoolClient.ts +2 -2
  445. package/src/clients/mocks/MockSpokePoolClient.ts +9 -4
  446. package/src/clients/mocks/MockSvmCpiEventsClient.ts +226 -0
  447. package/src/clients/mocks/MockSvmSpokePoolClient.ts +119 -0
  448. package/src/clients/mocks/index.ts +2 -0
  449. package/src/coingecko/Coingecko.ts +12 -3
  450. package/src/constants.ts +1 -0
  451. package/src/gasPriceOracle/adapters/arbitrum.ts +5 -2
  452. package/src/gasPriceOracle/adapters/ethereum.ts +7 -4
  453. package/src/gasPriceOracle/adapters/linea-viem.ts +3 -1
  454. package/src/gasPriceOracle/adapters/polygon.ts +6 -6
  455. package/src/gasPriceOracle/adapters/solana.ts +47 -0
  456. package/src/gasPriceOracle/index.ts +1 -1
  457. package/src/gasPriceOracle/oracle.ts +20 -4
  458. package/src/gasPriceOracle/types.ts +7 -1
  459. package/src/index.ts +0 -1
  460. package/src/interfaces/SpokePool.ts +14 -0
  461. package/src/providers/index.ts +1 -1
  462. package/src/providers/mocks/MockCachedSolanaRpcFactory.ts +15 -0
  463. package/src/providers/mocks/MockRateLimitedSolanaRpcFactory.ts +14 -0
  464. package/src/providers/mocks/MockSolanaRpcFactory.ts +55 -0
  465. package/src/providers/mocks/index.ts +4 -0
  466. package/src/providers/{mockProvider.ts → mocks/mockEthersProvider.ts} +1 -1
  467. package/src/relayFeeCalculator/chain-queries/baseQuery.ts +11 -9
  468. package/src/relayFeeCalculator/chain-queries/factory.ts +24 -8
  469. package/src/relayFeeCalculator/chain-queries/index.ts +1 -0
  470. package/src/relayFeeCalculator/chain-queries/svmQuery.ts +225 -0
  471. package/src/relayFeeCalculator/relayFeeCalculator.ts +15 -3
  472. package/src/utils/AddressUtils.ts +49 -6
  473. package/src/utils/ArrayUtils.ts +12 -0
  474. package/src/utils/BlockFinder.ts +26 -0
  475. package/src/utils/BlockUtils.ts +5 -215
  476. package/src/utils/EventUtils.ts +11 -11
  477. package/src/utils/JSONUtils.ts +2 -0
  478. package/src/utils/NumberUtils.ts +10 -0
  479. package/src/utils/SpokeUtils.ts +7 -3
  480. package/src/utils/TokenUtils.ts +6 -3
  481. package/src/utils/index.ts +1 -0
  482. package/dist/cjs/providers/mockProvider.js.map +0 -1
  483. package/dist/cjs/svm/eventsClient.d.ts +0 -15
  484. package/dist/cjs/svm/eventsClient.js +0 -157
  485. package/dist/cjs/svm/eventsClient.js.map +0 -1
  486. package/dist/cjs/svm/index.d.ts +0 -3
  487. package/dist/cjs/svm/index.js +0 -8
  488. package/dist/cjs/svm/index.js.map +0 -1
  489. package/dist/cjs/svm/types.js.map +0 -1
  490. package/dist/cjs/svm/utils/events.d.ts +0 -8
  491. package/dist/cjs/svm/utils/events.js +0 -47
  492. package/dist/cjs/svm/utils/events.js.map +0 -1
  493. package/dist/cjs/svm/utils/helpers.d.ts +0 -2
  494. package/dist/cjs/svm/utils/helpers.js +0 -19
  495. package/dist/cjs/svm/utils/helpers.js.map +0 -1
  496. package/dist/cjs/svm/utils/index.d.ts +0 -1
  497. package/dist/cjs/svm/utils/index.js +0 -5
  498. package/dist/cjs/svm/utils/index.js.map +0 -1
  499. package/dist/esm/providers/mockProvider.js.map +0 -1
  500. package/dist/esm/svm/eventsClient.d.ts +0 -51
  501. package/dist/esm/svm/eventsClient.js +0 -195
  502. package/dist/esm/svm/eventsClient.js.map +0 -1
  503. package/dist/esm/svm/index.d.ts +0 -3
  504. package/dist/esm/svm/index.js +0 -5
  505. package/dist/esm/svm/index.js.map +0 -1
  506. package/dist/esm/svm/types.js.map +0 -1
  507. package/dist/esm/svm/utils/events.d.ts +0 -17
  508. package/dist/esm/svm/utils/events.js +0 -55
  509. package/dist/esm/svm/utils/events.js.map +0 -1
  510. package/dist/esm/svm/utils/helpers.d.ts +0 -5
  511. package/dist/esm/svm/utils/helpers.js +0 -18
  512. package/dist/esm/svm/utils/helpers.js.map +0 -1
  513. package/dist/esm/svm/utils/index.d.ts +0 -1
  514. package/dist/esm/svm/utils/index.js +0 -2
  515. package/dist/esm/svm/utils/index.js.map +0 -1
  516. package/dist/types/providers/mockProvider.d.ts.map +0 -1
  517. package/dist/types/svm/eventsClient.d.ts +0 -52
  518. package/dist/types/svm/eventsClient.d.ts.map +0 -1
  519. package/dist/types/svm/index.d.ts +0 -4
  520. package/dist/types/svm/index.d.ts.map +0 -1
  521. package/dist/types/svm/types.d.ts.map +0 -1
  522. package/dist/types/svm/utils/events.d.ts +0 -18
  523. package/dist/types/svm/utils/events.d.ts.map +0 -1
  524. package/dist/types/svm/utils/helpers.d.ts +0 -6
  525. package/dist/types/svm/utils/helpers.d.ts.map +0 -1
  526. package/dist/types/svm/utils/index.d.ts +0 -2
  527. package/dist/types/svm/utils/index.d.ts.map +0 -1
  528. package/src/svm/eventsClient.ts +0 -199
  529. package/src/svm/index.ts +0 -3
  530. package/src/svm/utils/events.ts +0 -58
  531. package/src/svm/utils/helpers.ts +0 -9
  532. package/src/svm/utils/index.ts +0 -1
  533. /package/dist/cjs/{svm → arch/svm}/types.js +0 -0
  534. /package/dist/cjs/providers/{mockProvider.d.ts → mocks/mockEthersProvider.d.ts} +0 -0
  535. /package/dist/esm/{svm → arch/svm}/types.js +0 -0
  536. /package/dist/esm/providers/{mockProvider.d.ts → mocks/mockEthersProvider.d.ts} +0 -0
@@ -0,0 +1,581 @@
1
+ import { SvmSpokeClient } from "@across-protocol/contracts";
2
+ import { decodeFillStatusAccount, fetchState } from "@across-protocol/contracts/dist/src/svm/clients/SvmSpoke";
3
+ import { hashNonEmptyMessage } from "@across-protocol/contracts/dist/src/svm/web3-v1";
4
+ import {
5
+ ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
6
+ TOKEN_PROGRAM_ADDRESS,
7
+ getApproveCheckedInstruction,
8
+ } from "@solana-program/token";
9
+ import {
10
+ Address,
11
+ address,
12
+ fetchEncodedAccount,
13
+ fetchEncodedAccounts,
14
+ getAddressEncoder,
15
+ getProgramDerivedAddress,
16
+ getU32Encoder,
17
+ getU64Encoder,
18
+ some,
19
+ type TransactionSigner,
20
+ } from "@solana/kit";
21
+ import assert from "assert";
22
+ import { arrayify, hexZeroPad, hexlify } from "ethers/lib/utils";
23
+ import { Logger } from "winston";
24
+
25
+ import { CHAIN_IDs } from "../../constants";
26
+ import { Deposit, DepositWithBlock, FillStatus, FillWithBlock, RelayData } from "../../interfaces";
27
+ import {
28
+ BigNumber,
29
+ isUnsafeDepositId,
30
+ SvmAddress,
31
+ getTokenInfo,
32
+ isDefined,
33
+ toAddressType,
34
+ keccak256,
35
+ chainIsSvm,
36
+ chunk,
37
+ } from "../../utils";
38
+ import { getStatePda, SvmCpiEventsClient, getFillStatusPda, unwrapEventData, getEventAuthority } from "./";
39
+ import { SVMEventNames, SVMProvider } from "./types";
40
+
41
+ /**
42
+ * @note: Average Solana slot duration is about 400-500ms. We can be conservative
43
+ * and choose 400 to ensure that the most slots get included in our ranges
44
+ */
45
+ export const SLOT_DURATION_MS = 400;
46
+
47
+ /**
48
+ * Retrieves the chain time at a particular slot.
49
+ */
50
+ export async function getTimestampForSlot(provider: SVMProvider, slotNumber: number): Promise<number> {
51
+ // @note: getBlockTime receives a slot number, not a block number.
52
+ const slotTime = await provider.getBlockTime(BigInt(slotNumber)).send();
53
+ return Number(slotTime);
54
+ }
55
+
56
+ /**
57
+ * Returns the current fill deadline buffer.
58
+ * @param provider SVM Provider instance
59
+ * @param statePda Spoke Pool's State PDA
60
+ * @returns fill deadline buffer
61
+ */
62
+ export async function getFillDeadline(provider: SVMProvider, statePda: Address): Promise<number> {
63
+ const state = await fetchState(provider, statePda);
64
+ return state.data.fillDeadlineBuffer;
65
+ }
66
+
67
+ /**
68
+ * Finds the deposit id at a specific block number.
69
+ * @param blockTag The block number to search for the deposit ID at.
70
+ * @returns The deposit ID.
71
+ */
72
+ export function getDepositIdAtBlock(_contract: unknown, _blockTag: number): Promise<BigNumber> {
73
+ throw new Error("getDepositIdAtBlock: not implemented");
74
+ }
75
+
76
+ /**
77
+ * Finds deposit events within a 2-day window ending at the specified slot.
78
+ *
79
+ * @remarks
80
+ * This implementation uses a slot-limited search approach because Solana PDA state has
81
+ * limitations that prevent directly referencing old deposit IDs. Unlike EVM chains where
82
+ * we might use binary search across the entire chain history, in Solana we must query within
83
+ * a constrained slot range.
84
+ *
85
+ * The search window is calculated by:
86
+ * 1. Using the provided slot (or current confirmed slot if none is provided)
87
+ * 2. Looking back 2 days worth of slots from that point
88
+ *
89
+ * We use a 2-day window because:
90
+ * 1. Most valid deposits that need to be processed will be recent
91
+ * 2. This covers multiple bundle submission periods
92
+ * 3. It balances performance with practical deposit age
93
+ *
94
+ * @important
95
+ * This function may return `undefined` for valid deposit IDs that are older than the search
96
+ * window (approximately 2 days before the specified slot). This is an acceptable limitation
97
+ * as deposits this old are typically not relevant to current operations.
98
+ *
99
+ * @param eventClient - SvmCpiEventsClient instance
100
+ * @param depositId - The deposit ID to search for
101
+ * @param slot - The slot to search up to (defaults to current slot). The search will look
102
+ * for deposits between (slot - secondsLookback) and slot.
103
+ * @param secondsLookback - The number of seconds to look back for deposits (defaults to 2 days).
104
+ * @returns The deposit if found within the slot window, undefined otherwise
105
+ */
106
+ export async function findDeposit(
107
+ eventClient: SvmCpiEventsClient,
108
+ depositId: BigNumber,
109
+ slot?: bigint,
110
+ secondsLookback = 2 * 24 * 60 * 60 // 2 days
111
+ ): Promise<DepositWithBlock | undefined> {
112
+ // We can only perform this search when we have a safe deposit ID.
113
+ if (isUnsafeDepositId(depositId)) {
114
+ throw new Error(`Cannot binary search for depositId ${depositId}`);
115
+ }
116
+
117
+ const provider = eventClient.getRpc();
118
+ const currentSlot = await provider.getSlot({ commitment: "confirmed" }).send();
119
+
120
+ // If no slot is provided, use the current slot
121
+ // If a slot is provided, ensure it's not in the future
122
+ const endSlot = slot !== undefined ? BigInt(Math.min(Number(slot), Number(currentSlot))) : currentSlot;
123
+
124
+ // Calculate start slot (approximately secondsLookback seconds earlier)
125
+ const slotsInElapsed = BigInt(Math.round((secondsLookback * 1000) / SLOT_DURATION_MS));
126
+ const startSlot = endSlot - slotsInElapsed;
127
+
128
+ // Query for the deposit events with this limited slot range. Filter by deposit id.
129
+ const depositEvent = (await eventClient.queryEvents("FundsDeposited", startSlot, endSlot))?.find((event) =>
130
+ depositId.eq((event.data as unknown as { depositId: BigNumber }).depositId)
131
+ );
132
+
133
+ // If no deposit event is found, return undefined
134
+ if (!depositEvent) {
135
+ return undefined;
136
+ }
137
+
138
+ // Return the deposit event with block info
139
+ return {
140
+ txnRef: depositEvent.signature.toString(),
141
+ blockNumber: Number(depositEvent.slot),
142
+ txnIndex: 0,
143
+ logIndex: 0,
144
+ ...(unwrapEventData(depositEvent.data) as Record<string, unknown>),
145
+ } as DepositWithBlock;
146
+ }
147
+
148
+ /**
149
+ * Resolves the fill status of a deposit at a specific slot or at the current confirmed one.
150
+ *
151
+ * If no slot is provided, attempts to solve the fill status using the PDA. Otherwise, it is reconstructed from PDA events.
152
+ *
153
+ * @param programId - The spoke pool program ID.
154
+ * @param relayData - Deposit information used to locate the fill status.
155
+ * @param destinationChainId - Destination chain ID (must be an SVM chain).
156
+ * @param provider - SVM provider instance.
157
+ * @param svmEventsClient - SVM events client for querying events.
158
+ * @param atHeight - (Optional) Specific slot number to query. Defaults to the latest confirmed slot.
159
+ * @returns The fill status for the deposit at the specified or current slot.
160
+ */
161
+ export async function relayFillStatus(
162
+ programId: Address,
163
+ relayData: RelayData,
164
+ destinationChainId: number,
165
+ svmEventsClient: SvmCpiEventsClient,
166
+ atHeight?: number
167
+ ): Promise<FillStatus> {
168
+ assert(chainIsSvm(destinationChainId), "Destination chain must be an SVM chain");
169
+ const provider = svmEventsClient.getRpc();
170
+ // Get fill status PDA using relayData
171
+ const fillStatusPda = await getFillStatusPda(programId, relayData, destinationChainId);
172
+ const currentSlot = await provider.getSlot({ commitment: "confirmed" }).send();
173
+
174
+ // If no specific slot is requested, try fetching the current status from the PDA
175
+ if (atHeight === undefined) {
176
+ const [fillStatusAccount, currentSlotTimestamp] = await Promise.all([
177
+ fetchEncodedAccount(provider, fillStatusPda, { commitment: "confirmed" }),
178
+ provider.getBlockTime(currentSlot).send(),
179
+ ]);
180
+ // If the PDA exists, return the stored fill status
181
+ if (fillStatusAccount.exists) {
182
+ const decodedAccountData = decodeFillStatusAccount(fillStatusAccount);
183
+ return decodedAccountData.data.status;
184
+ }
185
+ // If the PDA doesn't exist and the deadline hasn't passed yet, the deposit must be unfilled,
186
+ // since PDAs can't be closed before the fill deadline.
187
+ else if (Number(currentSlotTimestamp) < relayData.fillDeadline) {
188
+ return FillStatus.Unfilled;
189
+ }
190
+ }
191
+
192
+ // If status couldn't be determined from the PDA, or if a specific slot was requested, reconstruct the status from events
193
+ const toSlot = atHeight ? BigInt(atHeight) : currentSlot;
194
+
195
+ return resolveFillStatusFromPdaEvents(fillStatusPda, toSlot, svmEventsClient);
196
+ }
197
+
198
+ /**
199
+ * Resolves fill statuses for multiple deposits at a specific or latest confirmed slot,
200
+ * using PDAs when possible and falling back to events if needed.
201
+ *
202
+ * @param programId The spoke pool program ID.
203
+ * @param relayData An array of relay data to resolve fill statuses for.
204
+ * @param destinationChainId The destination chain ID (must be an SVM chain).
205
+ * @param provider SVM Provider instance.
206
+ * @param svmEventsClient SVM events client instance for querying events.
207
+ * @param atHeight (Optional) The slot number to query at. If omitted, queries the latest confirmed slot.
208
+ * @returns An array of fill statuses for the specified deposits at the requested slot (or at the current confirmed slot).
209
+ */
210
+ export async function fillStatusArray(
211
+ programId: Address,
212
+ relayData: RelayData[],
213
+ destinationChainId: number,
214
+ svmEventsClient: SvmCpiEventsClient,
215
+ atHeight?: number,
216
+ logger?: Logger
217
+ ): Promise<(FillStatus | undefined)[]> {
218
+ assert(chainIsSvm(destinationChainId), "Destination chain must be an SVM chain");
219
+ const provider = svmEventsClient.getRpc();
220
+ const chunkSize = 100;
221
+ const chunkedRelayData = chunk(relayData, chunkSize);
222
+
223
+ // Get all PDAs
224
+ const fillStatusPdas = (
225
+ await Promise.all(
226
+ chunkedRelayData.map((relayDataChunk) =>
227
+ Promise.all(relayDataChunk.map((relayData) => getFillStatusPda(programId, relayData, destinationChainId)))
228
+ )
229
+ )
230
+ ).flat();
231
+
232
+ if (atHeight !== undefined && logger) {
233
+ logger.warn({
234
+ at: "SvmSpokeUtils#fillStatusArray",
235
+ message:
236
+ "Querying specific slots for large arrays is slow. For current status, omit 'atHeight' param to use latest confirmed slot instead.",
237
+ });
238
+ }
239
+
240
+ // If no specific slot is requested, try fetching current statuses from PDAs
241
+ // Otherwise, initialize all statuses as undefined
242
+ const fillStatuses: (FillStatus | undefined)[] =
243
+ atHeight === undefined
244
+ ? await fetchBatchFillStatusFromPdaAccounts(provider, fillStatusPdas, relayData)
245
+ : new Array(relayData.length).fill(undefined);
246
+
247
+ // Collect indices of deposits that still need their status resolved
248
+ const missingStatuses = fillStatuses.reduce<number[]>((acc, status, index) => {
249
+ if (status === undefined) {
250
+ acc.push(index);
251
+ }
252
+ return acc;
253
+ }, []);
254
+
255
+ // Chunk the missing deposits for batch processing
256
+ const missingChunked = chunk(missingStatuses, chunkSize);
257
+ const missingResults: { index: number; fillStatus: FillStatus }[] = [];
258
+
259
+ // Determine the toSlot to use for event reconstruction
260
+ const toSlot = atHeight ? BigInt(atHeight) : await provider.getSlot({ commitment: "confirmed" }).send();
261
+
262
+ // @note: This path is mostly used for deposits past their fill deadline.
263
+ // If it becomes a bottleneck, consider returning an "Unknown" status that can be handled downstream.
264
+ for (const chunk of missingChunked) {
265
+ const chunkResults = await Promise.all(
266
+ chunk.map(async (missingIndex) => {
267
+ return {
268
+ index: missingIndex,
269
+ fillStatus: await resolveFillStatusFromPdaEvents(fillStatusPdas[missingIndex], toSlot, svmEventsClient),
270
+ };
271
+ })
272
+ );
273
+ missingResults.push(...chunkResults);
274
+ }
275
+
276
+ // Fill in missing statuses back to the result array
277
+ missingResults.forEach(({ index, fillStatus }) => {
278
+ fillStatuses[index] = fillStatus;
279
+ });
280
+
281
+ return fillStatuses;
282
+ }
283
+
284
+ /**
285
+ * Finds the `FilledRelay` event for a given deposit within the provided slot range.
286
+ *
287
+ * @param relayData - Deposit information that is used to complete a fill.
288
+ * @param destinationChainId - Destination chain ID (must be an SVM chain).
289
+ * @param svmEventsClient - SVM events client instance for querying events.
290
+ * @param fromSlot - Starting slot to search.
291
+ * @param toSlot (Optional) Ending slot to search. If not provided, the current confirmed slot will be used.
292
+ * @returns The fill event with block info, or `undefined` if not found.
293
+ */
294
+ export async function findFillEvent(
295
+ relayData: RelayData,
296
+ destinationChainId: number,
297
+ svmEventsClient: SvmCpiEventsClient,
298
+ fromSlot: number,
299
+ toSlot?: number
300
+ ): Promise<FillWithBlock | undefined> {
301
+ assert(chainIsSvm(destinationChainId), "Destination chain must be an SVM chain");
302
+ toSlot ??= Number(await svmEventsClient.getRpc().getSlot({ commitment: "confirmed" }).send());
303
+
304
+ // Get fillStatus PDA using relayData
305
+ const programId = svmEventsClient.getProgramAddress();
306
+ const fillStatusPda = await getFillStatusPda(programId, relayData, destinationChainId);
307
+
308
+ // Get fill events from fillStatus PDA
309
+ const fillEvents = await svmEventsClient.queryDerivedAddressEvents(
310
+ SVMEventNames.FilledRelay,
311
+ fillStatusPda,
312
+ BigInt(fromSlot),
313
+ BigInt(toSlot),
314
+ { limit: 10 }
315
+ );
316
+ assert(fillEvents.length <= 1, `Expected at most one fill event for ${fillStatusPda}, got ${fillEvents.length}`);
317
+
318
+ if (fillEvents.length > 0) {
319
+ const rawFillEvent = fillEvents[0];
320
+ const parsedFillEvent = {
321
+ transactionHash: rawFillEvent.signature,
322
+ blockNumber: Number(rawFillEvent.slot),
323
+ transactionIndex: 0,
324
+ logIndex: 0,
325
+ destinationChainId,
326
+ ...(unwrapEventData(rawFillEvent.data) as Record<string, unknown>),
327
+ } as unknown as FillWithBlock;
328
+ return parsedFillEvent;
329
+ }
330
+
331
+ return undefined;
332
+ }
333
+
334
+ /**
335
+ * @param spokePool Address (program ID) of the SvmSpoke.
336
+ * @param deposit V3Deopsit instance.
337
+ * @param relayer Address of the relayer filling the deposit.
338
+ * @param repaymentChainId Optional repaymentChainId (defaults to destinationChainId).
339
+ * @returns An Ethers UnsignedTransaction instance.
340
+ */
341
+ export async function fillRelayInstruction(
342
+ spokePool: SvmAddress,
343
+ deposit: Omit<Deposit, "messageHash">,
344
+ relayer: TransactionSigner<string>,
345
+ recipientTokenAccount: Address<string>,
346
+ repaymentChainId = deposit.destinationChainId
347
+ ) {
348
+ const programId = spokePool.toBase58();
349
+ const relayerAddress = SvmAddress.from(relayer.address);
350
+
351
+ // @todo we need to convert the deposit's relayData to svm-like since the interface assumes the data originates from an EVM Spoke pool.
352
+ // Once we migrate to `Address` types, this can be modified/removed.
353
+ const [depositor, recipient, exclusiveRelayer, inputToken, outputToken] = [
354
+ deposit.depositor,
355
+ deposit.recipient,
356
+ deposit.exclusiveRelayer,
357
+ deposit.inputToken,
358
+ deposit.outputToken,
359
+ ].map((addr) => toAddressType(addr).forceSvmAddress());
360
+
361
+ const _relayDataHash = getRelayDataHash(deposit, deposit.destinationChainId);
362
+ const relayDataHash = new Uint8Array(Buffer.from(_relayDataHash.slice(2), "hex"));
363
+
364
+ // Create ATA for the relayer and recipient token accounts
365
+ const relayerTokenAccount = await getAssociatedTokenAddress(relayerAddress, outputToken);
366
+
367
+ const [statePda, fillStatusPda, eventAuthority] = await Promise.all([
368
+ getStatePda(spokePool.toV2Address()),
369
+ getFillStatusPda(spokePool.toV2Address(), deposit, deposit.destinationChainId),
370
+ getEventAuthority(),
371
+ ]);
372
+ const depositIdBuffer = new Uint8Array(32);
373
+ const shortenedBuffer = new Uint8Array(Buffer.from(deposit.depositId.toHexString().slice(2), "hex"));
374
+ depositIdBuffer.set(shortenedBuffer, 32 - shortenedBuffer.length);
375
+
376
+ return SvmSpokeClient.getFillRelayInstruction({
377
+ signer: relayer,
378
+ state: statePda,
379
+ mint: outputToken.toV2Address(),
380
+ relayerTokenAccount: relayerTokenAccount,
381
+ recipientTokenAccount: recipientTokenAccount,
382
+ fillStatus: fillStatusPda,
383
+ eventAuthority,
384
+ program: address(programId),
385
+ relayHash: relayDataHash,
386
+ relayData: some({
387
+ depositor: depositor.toV2Address(),
388
+ recipient: recipient.toV2Address(),
389
+ exclusiveRelayer: exclusiveRelayer.toV2Address(),
390
+ inputToken: inputToken.toV2Address(),
391
+ outputToken: outputToken.toV2Address(),
392
+ inputAmount: deposit.inputAmount.toBigInt(),
393
+ outputAmount: deposit.outputAmount.toBigInt(),
394
+ originChainId: BigInt(deposit.originChainId),
395
+ fillDeadline: deposit.fillDeadline,
396
+ exclusivityDeadline: deposit.exclusivityDeadline,
397
+ depositId: depositIdBuffer,
398
+ message: new Uint8Array(Buffer.from(deposit.message.slice(2), "hex")),
399
+ }),
400
+ repaymentChainId: some(BigInt(repaymentChainId)),
401
+ repaymentAddress: some(relayerAddress.toV2Address()),
402
+ });
403
+ }
404
+
405
+ /**
406
+ * @param mint Address of the token corresponding to the account being made.
407
+ * @param relayer Address of the relayer filling the deposit.
408
+ * @returns An instruction for creating a new token account.
409
+ */
410
+ export function createTokenAccountsInstruction(
411
+ mint: SvmAddress,
412
+ relayer: TransactionSigner<string>
413
+ ): SvmSpokeClient.CreateTokenAccountsInstruction {
414
+ return SvmSpokeClient.getCreateTokenAccountsInstruction({
415
+ signer: relayer,
416
+ mint: mint.toV2Address(),
417
+ });
418
+ }
419
+
420
+ /**
421
+ * @param mint Address of the token corresponding to the account being made.
422
+ * @param amount Amount of the token to approve.
423
+ * @param relayer Address of the relayer filling the deposit.
424
+ * @param spokePool Address (program ID) of the SvmSpoke.
425
+ * @returns A token approval instruction.
426
+ */
427
+ export async function createApproveInstruction(
428
+ mint: SvmAddress,
429
+ amount: BigNumber,
430
+ relayer: SvmAddress,
431
+ spokePool: SvmAddress,
432
+ mintDecimals?: number
433
+ ) {
434
+ const [relayerTokenAccount, statePda] = await Promise.all([
435
+ getAssociatedTokenAddress(relayer, mint, TOKEN_PROGRAM_ADDRESS),
436
+ getStatePda(spokePool.toV2Address()),
437
+ ]);
438
+
439
+ // If no mint decimals were supplied, then assign it to whatever value we have in TOKEN_SYMBOLS_MAP.
440
+ // If this token is not in TOKEN_SYMBOLS_MAP, then throw an error.
441
+ mintDecimals ??= getTokenInfo(mint.toBase58(), CHAIN_IDs.SOLANA)?.decimals;
442
+ if (!isDefined(mintDecimals)) {
443
+ throw new Error(`No mint decimals found for token ${mint.toBase58()}`);
444
+ }
445
+
446
+ return getApproveCheckedInstruction({
447
+ source: relayerTokenAccount,
448
+ mint: mint.toV2Address(),
449
+ delegate: statePda,
450
+ owner: relayer.toV2Address(),
451
+ amount: amount.toBigInt(),
452
+ decimals: mintDecimals,
453
+ });
454
+ }
455
+
456
+ export async function getAssociatedTokenAddress(
457
+ owner: SvmAddress,
458
+ mint: SvmAddress,
459
+ tokenProgramId: Address<string> = TOKEN_PROGRAM_ADDRESS
460
+ ): Promise<Address<string>> {
461
+ const [associatedToken] = await getProgramDerivedAddress({
462
+ programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
463
+ seeds: [
464
+ new Uint8Array(owner.toBuffer()),
465
+ new Uint8Array(SvmAddress.from(tokenProgramId).toBuffer()),
466
+ new Uint8Array(mint.toBuffer()),
467
+ ],
468
+ });
469
+ return associatedToken;
470
+ }
471
+
472
+ export function getRelayDataHash(relayData: RelayData, destinationChainId: number): string {
473
+ const addressEncoder = getAddressEncoder();
474
+ const uint64Encoder = getU64Encoder();
475
+ const uint32Encoder = getU32Encoder();
476
+
477
+ assert(relayData.message.startsWith("0x"), "Message must be a hex string");
478
+
479
+ const contentToHash = Buffer.concat([
480
+ Uint8Array.from(addressEncoder.encode(SvmAddress.from(relayData.depositor, "base16").toV2Address())),
481
+ Uint8Array.from(addressEncoder.encode(SvmAddress.from(relayData.recipient, "base16").toV2Address())),
482
+ Uint8Array.from(addressEncoder.encode(SvmAddress.from(relayData.exclusiveRelayer, "base16").toV2Address())),
483
+ Uint8Array.from(addressEncoder.encode(SvmAddress.from(relayData.inputToken, "base16").toV2Address())),
484
+ Uint8Array.from(addressEncoder.encode(SvmAddress.from(relayData.outputToken, "base16").toV2Address())),
485
+ Uint8Array.from(uint64Encoder.encode(BigInt(relayData.inputAmount.toString()))),
486
+ Uint8Array.from(uint64Encoder.encode(BigInt(relayData.outputAmount.toString()))),
487
+ Uint8Array.from(uint64Encoder.encode(BigInt(relayData.originChainId.toString()))),
488
+ arrayify(hexZeroPad(hexlify(relayData.depositId), 32)),
489
+ Uint8Array.from(uint32Encoder.encode(relayData.fillDeadline)),
490
+ Uint8Array.from(uint32Encoder.encode(relayData.exclusivityDeadline)),
491
+ hashNonEmptyMessage(Buffer.from(arrayify(relayData.message))),
492
+ Uint8Array.from(uint64Encoder.encode(BigInt(destinationChainId))),
493
+ ]);
494
+ return keccak256(contentToHash);
495
+ }
496
+
497
+ async function resolveFillStatusFromPdaEvents(
498
+ fillStatusPda: Address,
499
+ toSlot: bigint,
500
+ svmEventsClient: SvmCpiEventsClient
501
+ ): Promise<FillStatus> {
502
+ // Get fill and requested slow fill events from fillStatus PDA
503
+ const eventsToQuery = [SVMEventNames.FilledRelay, SVMEventNames.RequestedSlowFill];
504
+ const relevantEvents = (
505
+ await Promise.all(
506
+ eventsToQuery.map((eventName) =>
507
+ // PDAs should have only a few events, requesting up to 10 should be enough.
508
+ svmEventsClient.queryDerivedAddressEvents(eventName, fillStatusPda, undefined, toSlot, { limit: 10 })
509
+ )
510
+ )
511
+ ).flat();
512
+
513
+ if (relevantEvents.length === 0) {
514
+ // No fill or requested slow fill events found for this PDA
515
+ return FillStatus.Unfilled;
516
+ }
517
+
518
+ // Sort events in ascending order of slot number
519
+ relevantEvents.sort((a, b) => Number(a.slot - b.slot));
520
+
521
+ // At this point we have an ordered array of only fill and requested slow fill events and
522
+ // since it's not possible to submit a slow fill request once a fill has been submitted,
523
+ // we can use the last event in the list to determine the fill status at the requested slot.
524
+ const fillStatusEvent = relevantEvents.pop();
525
+ switch (fillStatusEvent!.name) {
526
+ case SVMEventNames.FilledRelay:
527
+ return FillStatus.Filled;
528
+ case SVMEventNames.RequestedSlowFill:
529
+ return FillStatus.RequestedSlowFill;
530
+ default:
531
+ throw new Error(`Unexpected event name: ${fillStatusEvent!.name}`);
532
+ }
533
+ }
534
+
535
+ /**
536
+ * Attempts to resolve the fill status for an array of deposits by reading their fillStatus PDAs.
537
+ *
538
+ * - If a PDA exists, the status is read directly from it.
539
+ * - If the PDA does not exist but the deposit's fill deadline has not passed, the deposit is considered unfilled.
540
+ * - If the PDA does not exist and the fill deadline has passed, the status cannot be determined and is set to undefined.
541
+ *
542
+ * Assumes PDAs can only be closed after the fill deadline expires.
543
+ *
544
+ * @param provider SVM provider instance
545
+ * @param fillStatusPdas An array of fill status PDAs to retrieve the fill status for.
546
+ * @param relayData An array of relay data from which the fill status PDAs were derived.
547
+ */
548
+ async function fetchBatchFillStatusFromPdaAccounts(
549
+ provider: SVMProvider,
550
+ fillStatusPdas: Address[],
551
+ relayDataArray: RelayData[]
552
+ ): Promise<(FillStatus | undefined)[]> {
553
+ const chunkSize = 100; // SVM method getMultipleAccounts allows a max of 100 addresses per request
554
+ const currentSlot = await provider.getSlot({ commitment: "confirmed" }).send();
555
+
556
+ const [pdaAccounts, currentSlotTimestamp] = await Promise.all([
557
+ Promise.all(
558
+ chunk(fillStatusPdas, chunkSize).map((chunk) =>
559
+ fetchEncodedAccounts(provider, chunk, { commitment: "confirmed" })
560
+ )
561
+ ),
562
+ provider.getBlockTime(currentSlot).send(),
563
+ ]);
564
+
565
+ const fillStatuses = pdaAccounts.flat().map((account, index) => {
566
+ // If the PDA exists, we can fetch the status directly.
567
+ if (account.exists) {
568
+ const decodedAccount = decodeFillStatusAccount(account);
569
+ return decodedAccount.data.status;
570
+ }
571
+ // If the PDA doesn't exist and the deadline hasn't passed yet, the deposit must be unfilled,
572
+ // since PDAs can't be closed before the fill deadline.
573
+ else if (Number(currentSlotTimestamp) < relayDataArray[index].fillDeadline) {
574
+ return FillStatus.Unfilled;
575
+ }
576
+ // If the PDA doesn't exist and the fill deadline has passed, then the status can't be determined and is set to undefined.
577
+ return undefined;
578
+ });
579
+
580
+ return fillStatuses;
581
+ }
@@ -0,0 +1,2 @@
1
+ export { SYSTEM_PROGRAM_ADDRESS as SVM_DEFAULT_ADDRESS } from "@solana-program/system";
2
+ export const SVM_SPOKE_SEED = BigInt(0);