0xtrails 0.0.1 → 0.0.2

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 (359) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +42 -0
  3. package/dist/abi.d.ts +37 -0
  4. package/dist/abi.d.ts.map +1 -0
  5. package/dist/abi.js +36 -0
  6. package/dist/apiClient.d.ts +9 -0
  7. package/dist/apiClient.d.ts.map +1 -0
  8. package/dist/apiClient.js +18 -0
  9. package/dist/buffer.d.ts +3 -0
  10. package/dist/buffer.d.ts.map +1 -0
  11. package/dist/buffer.js +8 -0
  12. package/dist/cctp.d.ts +84 -0
  13. package/dist/cctp.d.ts.map +1 -0
  14. package/dist/cctp.js +401 -0
  15. package/dist/chainSwitch.d.ts +7 -0
  16. package/dist/chainSwitch.d.ts.map +1 -0
  17. package/dist/chainSwitch.js +33 -0
  18. package/dist/chains.d.ts +13 -0
  19. package/dist/chains.d.ts.map +1 -0
  20. package/dist/chains.js +95 -0
  21. package/dist/constants.d.ts +11 -0
  22. package/dist/constants.d.ts.map +1 -0
  23. package/dist/constants.js +16 -0
  24. package/dist/encoders.d.ts +7 -0
  25. package/dist/encoders.d.ts.map +1 -0
  26. package/dist/encoders.js +8 -0
  27. package/dist/error.d.ts +2 -0
  28. package/dist/error.d.ts.map +1 -0
  29. package/dist/error.js +12 -0
  30. package/dist/explorer.d.ts +12 -0
  31. package/dist/explorer.d.ts.map +1 -0
  32. package/dist/explorer.js +18 -0
  33. package/dist/gasless.d.ts +116 -0
  34. package/dist/gasless.d.ts.map +1 -0
  35. package/dist/gasless.js +297 -0
  36. package/dist/index.d.ts +13 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +9 -0
  39. package/dist/indexerClient.d.ts +9 -0
  40. package/dist/indexerClient.d.ts.map +1 -0
  41. package/dist/indexerClient.js +18 -0
  42. package/dist/intents.d.ts +83 -0
  43. package/dist/intents.d.ts.map +1 -0
  44. package/dist/intents.js +288 -0
  45. package/dist/metaTxnMonitor.d.ts +14 -0
  46. package/dist/metaTxnMonitor.d.ts.map +1 -0
  47. package/dist/metaTxnMonitor.js +121 -0
  48. package/dist/metaTxns.d.ts +6 -0
  49. package/dist/metaTxns.d.ts.map +1 -0
  50. package/dist/metaTxns.js +4 -0
  51. package/dist/paymasterSend.d.ts +90 -0
  52. package/dist/paymasterSend.d.ts.map +1 -0
  53. package/dist/paymasterSend.js +329 -0
  54. package/dist/preconditions.d.ts +11 -0
  55. package/dist/preconditions.d.ts.map +1 -0
  56. package/dist/preconditions.js +29 -0
  57. package/dist/prepareSend.d.ts +102 -0
  58. package/dist/prepareSend.d.ts.map +1 -0
  59. package/dist/prepareSend.js +1080 -0
  60. package/dist/prices.d.ts +18 -0
  61. package/dist/prices.d.ts.map +1 -0
  62. package/dist/prices.js +142 -0
  63. package/dist/queryParams.d.ts +9 -0
  64. package/dist/queryParams.d.ts.map +1 -0
  65. package/dist/queryParams.js +66 -0
  66. package/dist/relaySdk.d.ts +65 -0
  67. package/dist/relaySdk.d.ts.map +1 -0
  68. package/dist/relaySdk.js +314 -0
  69. package/dist/relayer.d.ts +23 -0
  70. package/dist/relayer.d.ts.map +1 -0
  71. package/dist/relayer.js +230 -0
  72. package/dist/sendUserOp.d.ts +140 -0
  73. package/dist/sendUserOp.d.ts.map +1 -0
  74. package/dist/sendUserOp.js +388 -0
  75. package/dist/sequenceWallet.d.ts +79 -0
  76. package/dist/sequenceWallet.d.ts.map +1 -0
  77. package/dist/sequenceWallet.js +374 -0
  78. package/dist/theme.d.ts +3 -0
  79. package/dist/theme.d.ts.map +1 -0
  80. package/dist/theme.js +1 -0
  81. package/dist/toSimpleSmartAccount.d.ts +95 -0
  82. package/dist/toSimpleSmartAccount.d.ts.map +1 -0
  83. package/dist/toSimpleSmartAccount.js +373 -0
  84. package/dist/tokenBalances.d.ts +118 -0
  85. package/dist/tokenBalances.d.ts.map +1 -0
  86. package/dist/tokenBalances.js +492 -0
  87. package/dist/tokens.d.ts +50 -0
  88. package/dist/tokens.d.ts.map +1 -0
  89. package/dist/tokens.js +356 -0
  90. package/dist/trails.d.ts +128 -0
  91. package/dist/trails.d.ts.map +1 -0
  92. package/dist/trails.js +1031 -0
  93. package/dist/umd/trails.min.js +12610 -0
  94. package/dist/umd/trails.min.js.map +1 -0
  95. package/dist/umd.d.ts +24 -0
  96. package/dist/umd.d.ts.map +1 -0
  97. package/dist/utils.d.ts +5 -0
  98. package/dist/utils.d.ts.map +1 -0
  99. package/dist/utils.js +9 -0
  100. package/dist/widget/ConstantsUtil-B-_-u8aQ.js +6 -0
  101. package/dist/widget/add-hVLs3ldJ.js +20 -0
  102. package/dist/widget/all-wallets-Cwxnx4BT.js +11 -0
  103. package/dist/widget/app-store-CAAVQjW0.js +22 -0
  104. package/dist/widget/apple-C3BSbglw.js +23 -0
  105. package/dist/widget/arrow-bottom-circle-BGU9MmsZ.js +16 -0
  106. package/dist/widget/arrow-bottom-hS_SA8Gp.js +13 -0
  107. package/dist/widget/arrow-left-CJZanWz7.js +13 -0
  108. package/dist/widget/arrow-right-C1qL8EMd.js +13 -0
  109. package/dist/widget/arrow-top-CbuCmbQs.js +13 -0
  110. package/dist/widget/bank-CXBEEGbb.js +19 -0
  111. package/dist/widget/bin-Dqzv3zCZ.js +9 -0
  112. package/dist/widget/bitcoin-4y3sovZp.js +18 -0
  113. package/dist/widget/browser-DyOl4_8m.js +1413 -0
  114. package/dist/widget/browser-t7Fh0sEU.js +19 -0
  115. package/dist/widget/card-Bo4CZkTs.js +19 -0
  116. package/dist/widget/ccip-BynehMIN.js +232 -0
  117. package/dist/widget/checkmark-DV6OKvnY.js +16 -0
  118. package/dist/widget/checkmark-bold-CAp1-IQ2.js +13 -0
  119. package/dist/widget/chevron-bottom-BjzsVzk9.js +13 -0
  120. package/dist/widget/chevron-left-CQZBDCiR.js +13 -0
  121. package/dist/widget/chevron-right-Dhg4zeZM.js +13 -0
  122. package/dist/widget/chevron-top-CDQmfJef.js +13 -0
  123. package/dist/widget/chrome-store-BNaC_b6w.js +66 -0
  124. package/dist/widget/circle-BC_GBj91.js +9 -0
  125. package/dist/widget/clock-BmF8-4a0.js +13 -0
  126. package/dist/widget/close-Bf61nZ8o.js +13 -0
  127. package/dist/widget/coinPlaceholder-7cZW2058.js +13 -0
  128. package/dist/widget/compass-CFC3yhnW.js +13 -0
  129. package/dist/widget/components/ChainImage.d.ts +8 -0
  130. package/dist/widget/components/ChainImage.d.ts.map +1 -0
  131. package/dist/widget/components/ChainImage.js +6 -0
  132. package/dist/widget/components/ConnectWallet.d.ts +18 -0
  133. package/dist/widget/components/ConnectWallet.d.ts.map +1 -0
  134. package/dist/widget/components/ConnectWallet.js +66 -0
  135. package/dist/widget/components/DebugScreensDropdown.d.ts +9 -0
  136. package/dist/widget/components/DebugScreensDropdown.d.ts.map +1 -0
  137. package/dist/widget/components/DebugScreensDropdown.js +40 -0
  138. package/dist/widget/components/FeeOptions.d.ts +17 -0
  139. package/dist/widget/components/FeeOptions.d.ts.map +1 -0
  140. package/dist/widget/components/FeeOptions.js +65 -0
  141. package/dist/widget/components/Footer.d.ts +9 -0
  142. package/dist/widget/components/Footer.d.ts.map +1 -0
  143. package/dist/widget/components/Footer.js +13 -0
  144. package/dist/widget/components/GreenCheckAnimation.d.ts +2 -0
  145. package/dist/widget/components/GreenCheckAnimation.d.ts.map +1 -0
  146. package/dist/widget/components/GreenCheckAnimation.js +74 -0
  147. package/dist/widget/components/Modal.d.ts +11 -0
  148. package/dist/widget/components/Modal.d.ts.map +1 -0
  149. package/dist/widget/components/Modal.js +36 -0
  150. package/dist/widget/components/Receipt.d.ts +13 -0
  151. package/dist/widget/components/Receipt.d.ts.map +1 -0
  152. package/dist/widget/components/Receipt.js +36 -0
  153. package/dist/widget/components/SendForm.d.ts +44 -0
  154. package/dist/widget/components/SendForm.d.ts.map +1 -0
  155. package/dist/widget/components/SendForm.js +177 -0
  156. package/dist/widget/components/TokenImage.d.ts +10 -0
  157. package/dist/widget/components/TokenImage.d.ts.map +1 -0
  158. package/dist/widget/components/TokenImage.js +8 -0
  159. package/dist/widget/components/TokenList.d.ts +16 -0
  160. package/dist/widget/components/TokenList.d.ts.map +1 -0
  161. package/dist/widget/components/TokenList.js +39 -0
  162. package/dist/widget/components/TransferPending.d.ts +11 -0
  163. package/dist/widget/components/TransferPending.d.ts.map +1 -0
  164. package/dist/widget/components/TransferPending.js +77 -0
  165. package/dist/widget/components/TransferPendingVertical.d.ts +18 -0
  166. package/dist/widget/components/TransferPendingVertical.d.ts.map +1 -0
  167. package/dist/widget/components/TransferPendingVertical.js +183 -0
  168. package/dist/widget/components/WalletConfirmation.d.ts +18 -0
  169. package/dist/widget/components/WalletConfirmation.d.ts.map +1 -0
  170. package/dist/widget/components/WalletConfirmation.js +22 -0
  171. package/dist/widget/config.d.ts +4 -0
  172. package/dist/widget/config.d.ts.map +1 -0
  173. package/dist/widget/config.js +3 -0
  174. package/dist/widget/copy-e0xXvKN0.js +20 -0
  175. package/dist/widget/cursor-CqM3v0xJ.js +8 -0
  176. package/dist/widget/cursor-transparent-CUQpdsCG.js +17 -0
  177. package/dist/widget/desktop-DUDGIRpM.js +14 -0
  178. package/dist/widget/disconnect-DUFST9QQ.js +13 -0
  179. package/dist/widget/discord-C1cj365Z.js +22 -0
  180. package/dist/widget/email-BHhmb_lX.js +703 -0
  181. package/dist/widget/embedded-wallet-CuuC4eah.js +467 -0
  182. package/dist/widget/ethereum-CfmBVfeB.js +15 -0
  183. package/dist/widget/etherscan-BSiynDhW.js +11 -0
  184. package/dist/widget/exclamation-triangle-DEiFNpHw.js +9 -0
  185. package/dist/widget/extension-mRmfCDxo.js +13 -0
  186. package/dist/widget/external-link-B4xMIVnW.js +13 -0
  187. package/dist/widget/facebook-CBAZStBR.js +31 -0
  188. package/dist/widget/farcaster-LHDEDf5S.js +17 -0
  189. package/dist/widget/filters-CBijuvFv.js +13 -0
  190. package/dist/widget/github-C3ILD420.js +23 -0
  191. package/dist/widget/google-CSj73POX.js +23 -0
  192. package/dist/widget/help-circle-2hdG5IdB.js +17 -0
  193. package/dist/widget/hooks/useAmountUsd.d.ts +13 -0
  194. package/dist/widget/hooks/useAmountUsd.d.ts.map +1 -0
  195. package/dist/widget/hooks/useAmountUsd.js +35 -0
  196. package/dist/widget/hooks/useSendForm.d.ts +125 -0
  197. package/dist/widget/hooks/useSendForm.d.ts.map +1 -0
  198. package/dist/widget/hooks/useSendForm.js +450 -0
  199. package/dist/widget/hooks/useTokenList.d.ts +52 -0
  200. package/dist/widget/hooks/useTokenList.d.ts.map +1 -0
  201. package/dist/widget/hooks/useTokenList.js +252 -0
  202. package/dist/widget/id-ByYSrwsd.js +17 -0
  203. package/dist/widget/if-defined-DRXJEhv7.js +752 -0
  204. package/dist/widget/image-C90L4Rf6.js +9 -0
  205. package/dist/widget/index-B3SlQ9v3.js +46 -0
  206. package/dist/widget/index-B8LPuLXQ.js +78 -0
  207. package/dist/widget/index-BDbworWA.js +171 -0
  208. package/dist/widget/index-BTlDgFSK.js +98 -0
  209. package/dist/widget/index-BUCcjXbd.js +306 -0
  210. package/dist/widget/index-BZ34edi2.js +1055 -0
  211. package/dist/widget/index-BiCU29wK.js +147 -0
  212. package/dist/widget/index-BlmqIKsY.js +266 -0
  213. package/dist/widget/index-BlviH5nG.js +55 -0
  214. package/dist/widget/index-Bwd5X3fS.js +8306 -0
  215. package/dist/widget/index-C5gmknHK.js +78 -0
  216. package/dist/widget/index-CD6dBcRj.js +76 -0
  217. package/dist/widget/index-CDlhy529.js +63 -0
  218. package/dist/widget/index-CHXa5ke-.js +59 -0
  219. package/dist/widget/index-CK94R-H7.js +22498 -0
  220. package/dist/widget/index-CQzo3m3x.js +182 -0
  221. package/dist/widget/index-CRT8cAwG.js +325 -0
  222. package/dist/widget/index-CY7Lt2Yu.js +310 -0
  223. package/dist/widget/index-CiKfAu1E.js +79 -0
  224. package/dist/widget/index-CkCu6rMi.js +258 -0
  225. package/dist/widget/index-CngLTu_R.js +517 -0
  226. package/dist/widget/index-CsMV8-em.js +2577 -0
  227. package/dist/widget/index-Cu2Wva8v.js +200 -0
  228. package/dist/widget/index-DKBxLTEF.js +240 -0
  229. package/dist/widget/index-DQEVT3dx.js +511 -0
  230. package/dist/widget/index-DU2HcCis.js +200 -0
  231. package/dist/widget/index-DutZGWNW.js +321 -0
  232. package/dist/widget/index-O0glArmc.js +182 -0
  233. package/dist/widget/index-O8FmRjKe.js +63719 -0
  234. package/dist/widget/index-RtKXrB6I.js +576 -0
  235. package/dist/widget/index-TIYtS0gE.js +88 -0
  236. package/dist/widget/index-dQNJvWHs.js +66 -0
  237. package/dist/widget/index-wmEwdsq7.js +909 -0
  238. package/dist/widget/index.d.ts +3 -0
  239. package/dist/widget/index.d.ts.map +1 -0
  240. package/dist/widget/index.js +2 -0
  241. package/dist/widget/info-DMPChDjV.js +8 -0
  242. package/dist/widget/info-circle-DAvS_7nY.js +17 -0
  243. package/dist/widget/lightbulb-DnZ9mNEs.js +8 -0
  244. package/dist/widget/lit-html-BRjl1r6K.js +243 -0
  245. package/dist/widget/mail-DpaVSOP8.js +13 -0
  246. package/dist/widget/mobile-CRvdyu7I.js +14 -0
  247. package/dist/widget/more-C5VqW9PR.js +16 -0
  248. package/dist/widget/network-placeholder-CZ0vApma.js +19 -0
  249. package/dist/widget/nftPlaceholder-7jjIK2bT.js +13 -0
  250. package/dist/widget/off-4mHjJLLX.js +9 -0
  251. package/dist/widget/onramp-Bc0ozVsw.js +929 -0
  252. package/dist/widget/play-store-Uocul8nC.js +37 -0
  253. package/dist/widget/plus-DrYF7siO.js +18 -0
  254. package/dist/widget/prepareSend-BQJmzM5B.js +54987 -0
  255. package/dist/widget/qr-code-DcnGMUB3.js +11 -0
  256. package/dist/widget/receive-fvIVd7R_.js +184 -0
  257. package/dist/widget/recycle-horizontal-DrDwXC4D.js +14 -0
  258. package/dist/widget/ref-CXNmEjML.js +41 -0
  259. package/dist/widget/refresh-OK9lIPLS.js +13 -0
  260. package/dist/widget/reown-logo-C-Qn7mS3.js +17 -0
  261. package/dist/widget/search-DZqv1oKg.js +13 -0
  262. package/dist/widget/send-CJlmI-xe.js +1039 -0
  263. package/dist/widget/send-otoEC8uU.js +20 -0
  264. package/dist/widget/socials-BJciurWF.js +599 -0
  265. package/dist/widget/solana-Bv5Hs_0T.js +18 -0
  266. package/dist/widget/swapHorizontal-BzOPGV37.js +13 -0
  267. package/dist/widget/swapHorizontalBold-axyHnSmj.js +13 -0
  268. package/dist/widget/swapHorizontalMedium-C6YOPfPz.js +21 -0
  269. package/dist/widget/swapHorizontalRoundedBold-yVcLbWNT.js +13 -0
  270. package/dist/widget/swapVertical-BDjxt9pE.js +13 -0
  271. package/dist/widget/swaps-DEWNj4kd.js +1637 -0
  272. package/dist/widget/telegram-BQJD7dlP.js +21 -0
  273. package/dist/widget/three-dots-DW9jmSMG.js +10 -0
  274. package/dist/widget/transactions-uCseGQQt.js +38 -0
  275. package/dist/widget/twitch-XugxDfOE.js +23 -0
  276. package/dist/widget/twitterIcon-DQVObQUL.js +11 -0
  277. package/dist/widget/types.d.ts +51 -0
  278. package/dist/widget/types.d.ts.map +1 -0
  279. package/dist/widget/types.js +1 -0
  280. package/dist/widget/verify-DpMYHxLf.js +13 -0
  281. package/dist/widget/verify-filled-KpEL6ZJ_.js +13 -0
  282. package/dist/widget/w3m-modal-C8e-6Kba.js +1047 -0
  283. package/dist/widget/wallet-D8ssEB0o.js +13 -0
  284. package/dist/widget/wallet-placeholder-HtAy21Wc.js +19 -0
  285. package/dist/widget/walletconnect-Bp_4XfrY.js +37 -0
  286. package/dist/widget/warning-circle-FgYS7P7n.js +17 -0
  287. package/dist/widget/widget/index.js +7 -0
  288. package/dist/widget/widget.d.ts +47 -0
  289. package/dist/widget/widget.d.ts.map +1 -0
  290. package/dist/widget/widget.js +932 -0
  291. package/dist/widget/x-DlZBoP9k.js +17 -0
  292. package/dist/widget/x-mark-Ba9pt-_h.js +8 -0
  293. package/package.json +102 -8
  294. package/src/abi.ts +38 -0
  295. package/src/apiClient.ts +32 -0
  296. package/src/buffer.ts +10 -0
  297. package/src/cctp.ts +579 -0
  298. package/src/chainSwitch.ts +55 -0
  299. package/src/chains.ts +124 -0
  300. package/src/constants.ts +26 -0
  301. package/src/encoders.ts +20 -0
  302. package/src/error.ts +15 -0
  303. package/src/explorer.ts +37 -0
  304. package/src/gasless.ts +545 -0
  305. package/src/index.ts +48 -0
  306. package/src/indexerClient.ts +36 -0
  307. package/src/intents.ts +537 -0
  308. package/src/metaTxnMonitor.ts +163 -0
  309. package/src/metaTxns.ts +21 -0
  310. package/src/paymasterSend.ts +503 -0
  311. package/src/preconditions.ts +52 -0
  312. package/src/prepareSend.ts +1849 -0
  313. package/src/prices.ts +186 -0
  314. package/src/queryParams.ts +80 -0
  315. package/src/relaySdk.ts +481 -0
  316. package/src/relayer.ts +255 -0
  317. package/src/sendUserOp.ts +570 -0
  318. package/src/sequenceWallet.ts +579 -0
  319. package/src/theme.ts +2 -0
  320. package/src/toSimpleSmartAccount.ts +567 -0
  321. package/src/tokenBalances.ts +760 -0
  322. package/src/tokens.ts +471 -0
  323. package/src/trails.ts +1591 -0
  324. package/src/types.d.ts +11 -0
  325. package/src/umd.tsx +49 -0
  326. package/src/utils.ts +16 -0
  327. package/src/vite-env.d.ts +4 -0
  328. package/src/widget/assets/MetaMask-icon-fox-with-margins.svg +31 -0
  329. package/src/widget/assets/MetaMask-icon-fox.svg +26 -0
  330. package/src/widget/assets/MetaMask-logo-black.svg +3 -0
  331. package/src/widget/assets/MetaMask-logo-white.svg +16 -0
  332. package/src/widget/assets/Privy_Brandmark_Black.svg +9 -0
  333. package/src/widget/assets/Privy_Brandmark_White.svg +9 -0
  334. package/src/widget/assets/Trails-logo-black.svg +11 -0
  335. package/src/widget/assets/Trails-logo-white.svg +11 -0
  336. package/src/widget/components/ChainImage.tsx +28 -0
  337. package/src/widget/components/ConnectWallet.tsx +206 -0
  338. package/src/widget/components/DebugScreensDropdown.tsx +88 -0
  339. package/src/widget/components/FeeOptions.tsx +199 -0
  340. package/src/widget/components/Footer.tsx +51 -0
  341. package/src/widget/components/GreenCheckAnimation.tsx +119 -0
  342. package/src/widget/components/Modal.tsx +97 -0
  343. package/src/widget/components/Receipt.tsx +237 -0
  344. package/src/widget/components/SendForm.tsx +695 -0
  345. package/src/widget/components/TokenImage.tsx +37 -0
  346. package/src/widget/components/TokenList.tsx +287 -0
  347. package/src/widget/components/TransferPending.tsx +204 -0
  348. package/src/widget/components/TransferPendingVertical.tsx +412 -0
  349. package/src/widget/components/WalletConfirmation.tsx +172 -0
  350. package/src/widget/config.ts +5 -0
  351. package/src/widget/hooks/useAmountUsd.ts +59 -0
  352. package/src/widget/hooks/useSendForm.ts +715 -0
  353. package/src/widget/hooks/useTokenList.ts +397 -0
  354. package/src/widget/index.css +2 -0
  355. package/src/widget/index.tsx +8 -0
  356. package/src/widget/types/svg.d.ts +8 -0
  357. package/src/widget/types.ts +59 -0
  358. package/src/widget/widget.tsx +1438 -0
  359. package/index.js +0 -1
@@ -0,0 +1,18 @@
1
+ import type { SequenceAPIClient, Token, TokenPrice } from "@0xsequence/trails-api";
2
+ export declare const fetchGetTokenPrices: (apiClient: SequenceAPIClient, tokens: Token[]) => Promise<TokenPrice[]>;
3
+ export declare function normalizeToken(token: Token & {
4
+ tokenID?: string;
5
+ symbol?: string;
6
+ }): Token;
7
+ export declare const getTokenPrices: (apiClient: SequenceAPIClient, tokens: Token[]) => Promise<TokenPrice[]>;
8
+ export declare const getTokenPrice: (apiClient: SequenceAPIClient, token: Token) => Promise<TokenPrice | null>;
9
+ export declare const useTokenPrices: (tokens: Token[], apiClient: SequenceAPIClient) => {
10
+ tokenPrices: TokenPrice[] | undefined;
11
+ isLoadingTokenPrices: boolean;
12
+ };
13
+ export declare const useTokenPrice: (token?: Token | null, apiClient?: SequenceAPIClient) => {
14
+ tokenPrice: TokenPrice | null | undefined;
15
+ isLoadingTokenPrice: boolean;
16
+ };
17
+ export declare function invalidateTokenPricesCache(token?: Token): void;
18
+ //# sourceMappingURL=prices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prices.d.ts","sourceRoot":"","sources":["../src/prices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,KAAK,EACL,UAAU,EACX,MAAM,wBAAwB,CAAA;AAyE/B,eAAO,MAAM,mBAAmB,GAC9B,WAAW,iBAAiB,EAC5B,QAAQ,KAAK,EAAE,KACd,OAAO,CAAC,UAAU,EAAE,CAgBtB,CAAA;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,KAAK,CAMP;AAED,eAAO,MAAM,cAAc,GACzB,WAAW,iBAAiB,EAC5B,QAAQ,KAAK,EAAE,KACd,OAAO,CAAC,UAAU,EAAE,CAQtB,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,WAAW,iBAAiB,EAC5B,OAAO,KAAK,KACX,OAAO,CAAC,UAAU,GAAG,IAAI,CAS3B,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,QAAQ,KAAK,EAAE,EACf,WAAW,iBAAiB;;;CAe7B,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,QAAQ,KAAK,GAAG,IAAI,EACpB,YAAY,iBAAiB;;;CAc9B,CAAA;AAGD,wBAAgB,0BAA0B,CAAC,KAAK,CAAC,EAAE,KAAK,QAYvD"}
package/dist/prices.js ADDED
@@ -0,0 +1,142 @@
1
+ import { QueryClient, useQuery } from "@tanstack/react-query";
2
+ import { zeroAddress } from "viem";
3
+ // Global caching configuration
4
+ const CACHE_CONFIG = {
5
+ // Time configurations
6
+ staleTime: 30000, // 30 seconds - prices change frequently
7
+ gcTime: 120000, // 2 minutes cache time
8
+ refetchInterval: 60000, // Background refetch every minute for prices
9
+ // Retry configurations
10
+ retry: 2,
11
+ retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
12
+ // Refetch behaviors
13
+ refetchOnWindowFocus: false,
14
+ refetchOnReconnect: true,
15
+ refetchIntervalInBackground: true,
16
+ // Retry logic for specific error types
17
+ shouldRetry: (failureCount, error) => {
18
+ if (error && "status" in error && error.status === 404)
19
+ return false;
20
+ if (failureCount < 2)
21
+ return true;
22
+ return false;
23
+ },
24
+ };
25
+ // Extract common query options for reuse
26
+ const COMMON_QUERY_OPTIONS = {
27
+ staleTime: CACHE_CONFIG.staleTime,
28
+ gcTime: CACHE_CONFIG.gcTime,
29
+ retry: CACHE_CONFIG.shouldRetry,
30
+ retryDelay: CACHE_CONFIG.retryDelay,
31
+ refetchOnWindowFocus: CACHE_CONFIG.refetchOnWindowFocus,
32
+ refetchOnReconnect: CACHE_CONFIG.refetchOnReconnect,
33
+ refetchInterval: CACHE_CONFIG.refetchInterval,
34
+ refetchIntervalInBackground: CACHE_CONFIG.refetchIntervalInBackground,
35
+ };
36
+ // Initialize query client for token prices
37
+ const tokenPricesQueryClient = new QueryClient({
38
+ defaultOptions: {
39
+ queries: {
40
+ ...COMMON_QUERY_OPTIONS,
41
+ // Override retry for QueryClient (use number instead of function)
42
+ retry: CACHE_CONFIG.retry,
43
+ },
44
+ },
45
+ });
46
+ // Cache key generation methods
47
+ const createTokenCacheKey = (token) => {
48
+ return `${token.contractAddress}-${token.chainId}-${token.tokenId}`;
49
+ };
50
+ const createBatchCacheKey = (tokens) => {
51
+ return [
52
+ "tokenPrices",
53
+ "batch",
54
+ tokens.length,
55
+ tokens.map(createTokenCacheKey).sort(),
56
+ ];
57
+ };
58
+ const createSingleCacheKey = (token) => {
59
+ return ["tokenPrices", "single", token ? createTokenCacheKey(token) : null];
60
+ };
61
+ // Separate fetch function for token prices
62
+ export const fetchGetTokenPrices = async (apiClient, tokens) => {
63
+ if (!apiClient) {
64
+ throw new Error("API client is required");
65
+ }
66
+ if (tokens.length === 0) {
67
+ return [];
68
+ }
69
+ try {
70
+ const res = await apiClient.getCoinPrices({ tokens });
71
+ return res?.tokenPrices || [];
72
+ }
73
+ catch (error) {
74
+ console.error("[trails-sdk] Failed to fetch token prices:", error);
75
+ throw error;
76
+ }
77
+ };
78
+ export function normalizeToken(token) {
79
+ return {
80
+ chainId: token.chainId,
81
+ contractAddress: token.contractAddress || zeroAddress,
82
+ tokenId: token.tokenId || token.tokenID || token.symbol,
83
+ };
84
+ }
85
+ export const getTokenPrices = async (apiClient, tokens) => {
86
+ tokens = tokens.map(normalizeToken);
87
+ return tokenPricesQueryClient.fetchQuery({
88
+ queryKey: createBatchCacheKey(tokens),
89
+ queryFn: () => fetchGetTokenPrices(apiClient, tokens),
90
+ ...COMMON_QUERY_OPTIONS,
91
+ });
92
+ };
93
+ export const getTokenPrice = async (apiClient, token) => {
94
+ return tokenPricesQueryClient.fetchQuery({
95
+ queryKey: createSingleCacheKey(token),
96
+ queryFn: async () => {
97
+ const prices = await getTokenPrices(apiClient, [token]);
98
+ return prices?.length ? prices[0] : null;
99
+ },
100
+ ...COMMON_QUERY_OPTIONS,
101
+ });
102
+ };
103
+ export const useTokenPrices = (tokens, apiClient) => {
104
+ tokens = tokens.map(normalizeToken);
105
+ const { data: tokenPrices, isLoading: isLoadingTokenPrices } = useQuery({
106
+ queryKey: createBatchCacheKey(tokens),
107
+ queryFn: () => getTokenPrices(apiClient, tokens),
108
+ enabled: tokens.length > 0 && !!apiClient,
109
+ ...COMMON_QUERY_OPTIONS,
110
+ });
111
+ return {
112
+ tokenPrices,
113
+ isLoadingTokenPrices,
114
+ };
115
+ };
116
+ export const useTokenPrice = (token, apiClient) => {
117
+ const { data: tokenPrice, isLoading: isLoadingTokenPrice } = useQuery({
118
+ queryKey: createSingleCacheKey(token),
119
+ queryFn: () => token && apiClient ? getTokenPrice(apiClient, token) : null,
120
+ enabled: !!token && !!apiClient,
121
+ ...COMMON_QUERY_OPTIONS,
122
+ });
123
+ return {
124
+ tokenPrice,
125
+ isLoadingTokenPrice,
126
+ };
127
+ };
128
+ // Cache invalidation utility function
129
+ export function invalidateTokenPricesCache(token) {
130
+ if (token) {
131
+ // Invalidate specific token price using consistent cache key
132
+ tokenPricesQueryClient.invalidateQueries({
133
+ queryKey: createSingleCacheKey(token),
134
+ });
135
+ }
136
+ else {
137
+ // Invalidate all token price queries
138
+ tokenPricesQueryClient.invalidateQueries({
139
+ queryKey: ["tokenPrices"],
140
+ });
141
+ }
142
+ }
@@ -0,0 +1,9 @@
1
+ export declare function getQueryParam(key: string): string | null;
2
+ export declare function useQueryParams(): {
3
+ queryParams: URLSearchParams;
4
+ getParam: (key: string) => string | null;
5
+ hasParam: (key: string, value?: string) => boolean;
6
+ setParam: (key: string, value: string) => void;
7
+ removeParam: (key: string) => void;
8
+ };
9
+ //# sourceMappingURL=queryParams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryParams.d.ts","sourceRoot":"","sources":["../src/queryParams.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGxD;AAED,wBAAgB,cAAc;;oBAsCL,MAAM,KAAG,MAAM,GAAG,IAAI;oBAItB,MAAM,UAAU,MAAM,KAAG,OAAO;oBAKhC,MAAM,SAAS,MAAM;uBASlB,MAAM;EAgBjC"}
@@ -0,0 +1,66 @@
1
+ import { useEffect, useState } from "react";
2
+ export function getQueryParam(key) {
3
+ if (typeof window === "undefined")
4
+ return null;
5
+ return new URLSearchParams(window.location.search).get(key);
6
+ }
7
+ export function useQueryParams() {
8
+ const [queryParams, setQueryParams] = useState(typeof window !== "undefined"
9
+ ? new URLSearchParams(window.location.search)
10
+ : new URLSearchParams());
11
+ useEffect(() => {
12
+ const updateQueryParams = () => {
13
+ setQueryParams(new URLSearchParams(window.location.search));
14
+ };
15
+ // Check on popstate (back/forward navigation)
16
+ window.addEventListener("popstate", updateQueryParams);
17
+ // Check on pushState/replaceState
18
+ const originalPushState = window.history.pushState;
19
+ const originalReplaceState = window.history.replaceState;
20
+ window.history.pushState = function () {
21
+ // biome-ignore lint/complexity/noArguments: TODO: To fix
22
+ originalPushState.apply(this, arguments);
23
+ updateQueryParams();
24
+ };
25
+ window.history.replaceState = function () {
26
+ // biome-ignore lint/complexity/noArguments: TODO: To fix
27
+ originalReplaceState.apply(this, arguments);
28
+ updateQueryParams();
29
+ };
30
+ return () => {
31
+ window.removeEventListener("popstate", updateQueryParams);
32
+ window.history.pushState = originalPushState;
33
+ window.history.replaceState = originalReplaceState;
34
+ };
35
+ }, []);
36
+ const getParam = (key) => {
37
+ return queryParams.get(key);
38
+ };
39
+ const hasParam = (key, value) => {
40
+ const result = value ? queryParams.get(key) === value : queryParams.has(key);
41
+ return result;
42
+ };
43
+ const setParam = (key, value) => {
44
+ const newParams = new URLSearchParams(queryParams);
45
+ newParams.set(key, value);
46
+ const url = new URL(window.location.href);
47
+ url.search = newParams.toString();
48
+ window.history.pushState({}, "", url.toString());
49
+ setQueryParams(newParams);
50
+ };
51
+ const removeParam = (key) => {
52
+ const newParams = new URLSearchParams(queryParams);
53
+ newParams.delete(key);
54
+ const url = new URL(window.location.href);
55
+ url.search = newParams.toString();
56
+ window.history.pushState({}, "", url.toString());
57
+ setQueryParams(newParams);
58
+ };
59
+ return {
60
+ queryParams,
61
+ getParam,
62
+ hasParam,
63
+ setParam,
64
+ removeParam,
65
+ };
66
+ }
@@ -0,0 +1,65 @@
1
+ import type { WalletClient } from "viem";
2
+ export type Chain = any;
3
+ export type RelayQuote = any;
4
+ export type RelayExecuteResult = any;
5
+ export type RelayProgressData = any;
6
+ export interface RelayQuoteOptions {
7
+ wallet: WalletClient;
8
+ chainId: number;
9
+ toChainId?: number;
10
+ amount: string;
11
+ currency: string;
12
+ toCurrency?: string;
13
+ tradeType?: "EXACT_INPUT" | "EXACT_OUTPUT";
14
+ txs: Array<{
15
+ to: string;
16
+ value: string;
17
+ data: string;
18
+ }>;
19
+ recipient?: string;
20
+ }
21
+ export interface RelayExecuteOptions {
22
+ quote: RelayQuote;
23
+ wallet: WalletClient;
24
+ onProgress?: (data: RelayProgressData) => void;
25
+ }
26
+ /**
27
+ * Get a quote for a relay transaction
28
+ */
29
+ export declare function getRelaySDKQuote(options: RelayQuoteOptions): Promise<RelayQuote>;
30
+ /**
31
+ * Execute a relay transaction
32
+ */
33
+ export declare function relaySDKExecute(options: RelayExecuteOptions): Promise<RelayExecuteResult>;
34
+ /**
35
+ * Helper function to create a simple relay transaction for a contract call
36
+ */
37
+ export declare function createSimpleRelayTransaction(wallet: WalletClient, contractAddress: string, callData: string, value: string, chainId: number, currency?: string): Promise<RelayQuote>;
38
+ /**
39
+ * Helper function to execute a simple relay transaction
40
+ */
41
+ export declare function executeSimpleRelayTransaction(quote: RelayQuote, wallet: WalletClient, onProgress?: RelayExecuteOptions["onProgress"]): Promise<RelayExecuteResult>;
42
+ export declare function getTxHashFromRelayResult(result: RelayExecuteResult): string;
43
+ export declare const relaySupportedChains: Record<number, Chain>;
44
+ export declare function getRelaySupportedChains(): Promise<Chain[]>;
45
+ export declare function isChainSupported(chainId: number): Promise<boolean>;
46
+ export interface RelayToken {
47
+ id: string;
48
+ symbol: string;
49
+ name: string;
50
+ contractAddress: string;
51
+ decimals: number;
52
+ chainId: number;
53
+ chainName: string;
54
+ imageUrl: string;
55
+ }
56
+ export declare function getRelaySupportedTokens(): Promise<RelayToken[]>;
57
+ export type GetIsRouteSupportedOptions = {
58
+ originChainId: number;
59
+ destinationChainId: number;
60
+ amount: string;
61
+ originToken: string;
62
+ destinationToken: string;
63
+ };
64
+ export declare function getIsRouteSupported({ originChainId, destinationChainId, amount, originToken, destinationToken, }: GetIsRouteSupportedOptions): Promise<boolean>;
65
+ //# sourceMappingURL=relaySdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relaySdk.d.ts","sourceRoot":"","sources":["../src/relaySdk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,314 @@
1
+ import { convertViemChainToRelayChain, createClient, getClient, MAINNET_RELAY_API, } from "@reservoir0x/relay-sdk";
2
+ import * as chains from "viem/chains";
3
+ createClient({
4
+ baseApiUrl: MAINNET_RELAY_API,
5
+ source: "Trails",
6
+ chains: Object.values(chains).map((chain) => convertViemChainToRelayChain(chain)),
7
+ });
8
+ /**
9
+ * Get a quote for a relay transaction
10
+ */
11
+ export async function getRelaySDKQuote(options) {
12
+ try {
13
+ const client = getClient();
14
+ if (!client) {
15
+ throw new Error("Relay client not available");
16
+ }
17
+ console.log("[trails-sdk] getRelaySDKQuote", options);
18
+ const quote = await client.actions.getQuote({
19
+ wallet: options.wallet,
20
+ chainId: options.chainId,
21
+ toChainId: options.toChainId || options.chainId,
22
+ amount: options.amount,
23
+ currency: options.currency,
24
+ toCurrency: options.toCurrency || options.currency,
25
+ tradeType: options.tradeType || "EXACT_OUTPUT",
26
+ txs: options.txs,
27
+ user: options.wallet.account.address,
28
+ recipient: options.recipient || options.wallet.account.address,
29
+ });
30
+ return quote;
31
+ }
32
+ catch (error) {
33
+ console.error("[trails-sdk] Error getting relay quote:", error);
34
+ throw error;
35
+ }
36
+ }
37
+ /**
38
+ * Execute a relay transaction
39
+ */
40
+ export async function relaySDKExecute(options) {
41
+ try {
42
+ const client = getClient();
43
+ if (!client) {
44
+ throw new Error("Relay client not available");
45
+ }
46
+ console.log("[trails-sdk] relaysdkclient", client.chains, options.quote);
47
+ const result = await client.actions.execute({
48
+ quote: options.quote,
49
+ wallet: options.wallet,
50
+ onProgress: options.onProgress ||
51
+ ((data) => {
52
+ console.log("[trails-sdk] Relay progress:", data);
53
+ }),
54
+ });
55
+ return result;
56
+ }
57
+ catch (error) {
58
+ console.error("[trails-sdk] Error executing relay transaction:", error);
59
+ throw error;
60
+ }
61
+ }
62
+ /**
63
+ * Helper function to create a simple relay transaction for a contract call
64
+ */
65
+ export async function createSimpleRelayTransaction(wallet, contractAddress, callData, value, chainId, currency = "0x0000000000000000000000000000000000000000") {
66
+ const options = {
67
+ wallet,
68
+ chainId,
69
+ amount: value,
70
+ currency,
71
+ txs: [
72
+ {
73
+ to: contractAddress,
74
+ value,
75
+ data: callData,
76
+ },
77
+ ],
78
+ };
79
+ return await getRelaySDKQuote(options);
80
+ }
81
+ /**
82
+ * Helper function to execute a simple relay transaction
83
+ */
84
+ export async function executeSimpleRelayTransaction(quote, wallet, onProgress) {
85
+ return await relaySDKExecute({
86
+ quote,
87
+ wallet,
88
+ onProgress,
89
+ });
90
+ }
91
+ export function getTxHashFromRelayResult(result) {
92
+ return result?.data?.steps?.[result?.data?.steps.length - 1]?.items?.[0]
93
+ ?.txHashes?.[0]?.txHash;
94
+ }
95
+ // Source: https://docs.relay.link/resources/supported-chains
96
+ export const relaySupportedChains = {
97
+ [chains.abstract.id]: chains.abstract,
98
+ [chains.ancient8.id]: chains.ancient8,
99
+ [chains.apeChain.id]: chains.apeChain,
100
+ [chains.arbitrum.id]: chains.arbitrum,
101
+ [chains.arbitrumNova.id]: chains.arbitrumNova,
102
+ [chains.arenaz.id]: chains.arenaz,
103
+ [chains.avalanche.id]: chains.avalanche,
104
+ [chains.b3.id]: chains.b3,
105
+ [chains.base.id]: chains.base,
106
+ [chains.berachain.id]: chains.berachain,
107
+ [chains.blast.id]: chains.blast,
108
+ [chains.opBNB.id]: chains.opBNB,
109
+ [chains.bob.id]: chains.bob,
110
+ [chains.boba.id]: chains.boba,
111
+ [chains.celo.id]: chains.celo,
112
+ [chains.corn.id]: chains.corn,
113
+ [chains.cronos.id]: chains.cronos,
114
+ [chains.cyber.id]: chains.cyber,
115
+ [chains.degen.id]: chains.degen,
116
+ [chains.mainnet.id]: chains.mainnet,
117
+ [chains.flowMainnet.id]: chains.flowMainnet,
118
+ [chains.forma.id]: chains.forma,
119
+ [chains.funkiMainnet.id]: chains.funkiMainnet,
120
+ [chains.gnosis.id]: chains.gnosis,
121
+ [chains.gravity.id]: chains.gravity,
122
+ [chains.hemi.id]: chains.hemi,
123
+ [chains.hychain.id]: chains.hychain,
124
+ [chains.ink.id]: chains.ink,
125
+ [chains.linea.id]: chains.linea,
126
+ [chains.lisk.id]: chains.lisk,
127
+ [chains.manta.id]: chains.manta,
128
+ [chains.mantle.id]: chains.mantle,
129
+ [chains.metis.id]: chains.metis,
130
+ [chains.mint.id]: chains.mint,
131
+ [chains.mode.id]: chains.mode,
132
+ [chains.morph.id]: chains.morph,
133
+ [chains.optimism.id]: chains.optimism,
134
+ [chains.plume.id]: chains.plume,
135
+ [chains.polygon.id]: chains.polygon,
136
+ [chains.polygonZkEvm.id]: chains.polygonZkEvm,
137
+ [chains.ronin.id]: chains.ronin,
138
+ [chains.redstone.id]: chains.redstone,
139
+ [chains.sanko.id]: chains.sanko,
140
+ [chains.scroll.id]: chains.scroll,
141
+ [chains.sei.id]: chains.sei,
142
+ [chains.shape.id]: chains.shape,
143
+ [chains.soneium.id]: chains.soneium,
144
+ [chains.sonic.id]: chains.sonic,
145
+ [chains.story.id]: chains.story,
146
+ [chains.superposition.id]: chains.superposition,
147
+ [chains.superseed.id]: chains.superseed,
148
+ [chains.swellchain.id]: chains.swellchain,
149
+ [chains.taiko.id]: chains.taiko,
150
+ [chains.tron.id]: chains.tron,
151
+ [chains.unichain.id]: chains.unichain,
152
+ [chains.worldchain.id]: chains.worldchain,
153
+ [chains.xai.id]: chains.xai,
154
+ [chains.zeroG.id]: chains.zeroG,
155
+ [chains.zircuit.id]: chains.zircuit,
156
+ [chains.zksync.id]: chains.zksync,
157
+ [chains.zora.id]: chains.zora,
158
+ };
159
+ export async function getRelaySupportedChains() {
160
+ return Object.values(relaySupportedChains);
161
+ }
162
+ export async function isChainSupported(chainId) {
163
+ return Object.keys(relaySupportedChains).includes(chainId.toString());
164
+ }
165
+ export async function getRelaySupportedTokens() {
166
+ try {
167
+ const chains = await fetchRelayChains();
168
+ const tokens = [];
169
+ chains.forEach((chain) => {
170
+ if (!chain.disabled) {
171
+ // Add native currency
172
+ tokens.push({
173
+ id: chain.currency.id,
174
+ symbol: chain.currency.symbol,
175
+ name: chain.currency.name,
176
+ contractAddress: chain.currency.address,
177
+ decimals: chain.currency.decimals,
178
+ chainId: chain.id,
179
+ chainName: chain.displayName || chain.name,
180
+ imageUrl: "", // Native currencies typically don't have logoURI
181
+ });
182
+ // Add featured tokens
183
+ chain.featuredTokens.forEach((token) => {
184
+ tokens.push({
185
+ id: token.id,
186
+ symbol: token.symbol,
187
+ name: token.name,
188
+ contractAddress: token.address,
189
+ decimals: token.decimals,
190
+ chainId: chain.id,
191
+ chainName: chain.displayName || chain.name,
192
+ imageUrl: token.metadata?.logoURI || "",
193
+ });
194
+ });
195
+ // Add ERC20 currencies
196
+ chain.erc20Currencies.forEach((token) => {
197
+ tokens.push({
198
+ id: token.id,
199
+ symbol: token.symbol,
200
+ name: token.name,
201
+ contractAddress: token.address,
202
+ decimals: token.decimals,
203
+ chainId: chain.id,
204
+ chainName: chain.displayName || chain.name,
205
+ imageUrl: token.metadata?.logoURI || "",
206
+ });
207
+ });
208
+ // Add solver currencies (fallback for chains that might not have featuredTokens/erc20Currencies)
209
+ chain.solverCurrencies.forEach((token) => {
210
+ tokens.push({
211
+ id: token.id,
212
+ symbol: token.symbol,
213
+ name: token.name,
214
+ contractAddress: token.address,
215
+ decimals: token.decimals,
216
+ chainId: chain.id,
217
+ chainName: chain.displayName || chain.name,
218
+ imageUrl: token.metadata?.logoURI || "",
219
+ });
220
+ });
221
+ }
222
+ });
223
+ // Remove duplicates by chainId and contractAddress
224
+ const uniqueTokens = tokens.filter((token, index, self) => index ===
225
+ self.findIndex((t) => t.chainId === token.chainId &&
226
+ t.contractAddress.toLowerCase() ===
227
+ token.contractAddress.toLowerCase()));
228
+ console.log(`[trails-sdk] Fetched ${uniqueTokens.length} unique tokens from Relay API`);
229
+ return uniqueTokens;
230
+ }
231
+ catch (error) {
232
+ console.error("[trails-sdk] Error fetching Relay supported tokens:", error);
233
+ return [];
234
+ }
235
+ }
236
+ // Cache for chains data
237
+ let cachedChains = null;
238
+ let cacheTimestamp = 0;
239
+ const CACHE_DURATION = 5 * 60 * 1000; // 5 minutes
240
+ async function fetchRelayChains() {
241
+ const now = Date.now();
242
+ // Return cached data if still valid
243
+ if (cachedChains && now - cacheTimestamp < CACHE_DURATION) {
244
+ return cachedChains;
245
+ }
246
+ try {
247
+ const response = await fetch("https://api.relay.link/chains");
248
+ if (!response.ok) {
249
+ throw new Error(`Failed to fetch chains: ${response.status}`);
250
+ }
251
+ const data = await response.json();
252
+ cachedChains = data.chains;
253
+ cacheTimestamp = now;
254
+ return data.chains;
255
+ }
256
+ catch (error) {
257
+ console.error("[trails-sdk] Error fetching Relay chains:", error);
258
+ // Return cached data if available, even if expired
259
+ if (cachedChains) {
260
+ return cachedChains;
261
+ }
262
+ throw error;
263
+ }
264
+ }
265
+ export async function getIsRouteSupported({ originChainId, destinationChainId, amount, originToken, destinationToken, }) {
266
+ try {
267
+ // Fetch supported chains from Relay API
268
+ const chains = await fetchRelayChains();
269
+ // Check if both chains are supported and not disabled
270
+ const originChain = chains.find((chain) => chain.id === originChainId);
271
+ const destinationChain = chains.find((chain) => chain.id === destinationChainId);
272
+ if (!originChain ||
273
+ !destinationChain ||
274
+ originChain.disabled ||
275
+ destinationChain.disabled) {
276
+ return false;
277
+ }
278
+ // Check if destination token is supported on destination chain
279
+ const isDestinationTokenSupported = destinationChain.solverCurrencies.some((currency) => currency.address.toLowerCase() === destinationToken.toLowerCase());
280
+ if (!isDestinationTokenSupported) {
281
+ return false;
282
+ }
283
+ // If we have a client available, try to get a quote to verify the route
284
+ const client = getClient();
285
+ if (client) {
286
+ try {
287
+ const sender = "0x1111111111111111111111111111111111111111";
288
+ const quote = await client.actions.getQuote({
289
+ chainId: originChainId,
290
+ toChainId: destinationChainId,
291
+ amount: amount,
292
+ currency: originToken,
293
+ toCurrency: destinationToken,
294
+ tradeType: "EXACT_OUTPUT",
295
+ txs: [],
296
+ user: sender,
297
+ recipient: sender,
298
+ });
299
+ return quote.steps.length > 0;
300
+ }
301
+ catch (error) {
302
+ console.warn("[trails-sdk] Quote check failed, falling back to chain/token validation:", error);
303
+ // If quote fails, we still return true if chains and tokens are supported
304
+ return true;
305
+ }
306
+ }
307
+ // If no client available, return true if chains and tokens are supported
308
+ return true;
309
+ }
310
+ catch (error) {
311
+ console.error("[trails-sdk] Error checking route support:", error);
312
+ return false;
313
+ }
314
+ }
@@ -0,0 +1,23 @@
1
+ import { Relayer } from "@0xsequence/wallet-core";
2
+ export type RelayerOperationStatus = Relayer.OperationStatus;
3
+ export type RpcRelayer = Relayer.Standard.Rpc.RpcRelayer;
4
+ export type RelayerConfig = {
5
+ hostname: string;
6
+ chainId: number;
7
+ rpcUrl: string;
8
+ };
9
+ export type RelayerEnv = "local" | "cors-anywhere" | "dev" | "prod";
10
+ export type RelayerEnvConfig = {
11
+ env?: RelayerEnv;
12
+ useV3Relayers?: boolean;
13
+ };
14
+ export type { Relayer };
15
+ export declare function getBackupRelayer(chainId: number): Relayer.Standard.Rpc.RpcRelayer | undefined;
16
+ export declare function getRelayerUrl(config: RelayerEnvConfig, chainId: number): string;
17
+ export declare function getRelayer(config: RelayerEnvConfig, chainId: number): Relayer.Standard.Rpc.RpcRelayer;
18
+ export declare function useRelayers(config?: RelayerEnvConfig): {
19
+ relayers: Map<number, Relayer.Standard.Rpc.RpcRelayer>;
20
+ getRelayer: (chainId: number) => Relayer.Standard.Rpc.RpcRelayer;
21
+ getBackupRelayer: (chainId: number) => Relayer.Standard.Rpc.RpcRelayer | undefined;
22
+ };
23
+ //# sourceMappingURL=relayer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relayer.d.ts","sourceRoot":"","sources":["../src/relayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AAMjD,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAA;AAC5D,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAA;AAExD,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,eAAe,GAAG,KAAK,GAAG,MAAM,CAAA;AAEnE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,EAAE,UAAU,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,YAAY,EAAE,OAAO,EAAE,CAAA;AAEvB,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,CAgB7C;AAGD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,GACd,MAAM,CAsJR;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAejC;AAED,wBAAgB,WAAW,CACzB,MAAM,GAAE,gBAEP,GACA;IACD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IACtD,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAA;IAChE,gBAAgB,EAAE,CAChB,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,CAAA;CACjD,CAwBA"}