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,481 @@
1
+ import {
2
+ convertViemChainToRelayChain,
3
+ createClient,
4
+ getClient,
5
+ MAINNET_RELAY_API,
6
+ } from "@reservoir0x/relay-sdk"
7
+ import type { WalletClient } from "viem"
8
+ import * as chains from "viem/chains"
9
+
10
+ export type Chain = any
11
+ export type RelayQuote = any
12
+ export type RelayExecuteResult = any
13
+ export type RelayProgressData = any
14
+
15
+ createClient({
16
+ baseApiUrl: MAINNET_RELAY_API,
17
+ source: "Trails",
18
+ chains: Object.values(chains).map((chain: Chain) =>
19
+ convertViemChainToRelayChain(chain),
20
+ ),
21
+ })
22
+
23
+ export interface RelayQuoteOptions {
24
+ wallet: WalletClient
25
+ chainId: number
26
+ toChainId?: number
27
+ amount: string
28
+ currency: string
29
+ toCurrency?: string
30
+ tradeType?: "EXACT_INPUT" | "EXACT_OUTPUT"
31
+ txs: Array<{
32
+ to: string
33
+ value: string
34
+ data: string
35
+ }>
36
+ recipient?: string
37
+ }
38
+
39
+ export interface RelayExecuteOptions {
40
+ quote: RelayQuote
41
+ wallet: WalletClient
42
+ onProgress?: (data: RelayProgressData) => void
43
+ }
44
+
45
+ /**
46
+ * Get a quote for a relay transaction
47
+ */
48
+ export async function getRelaySDKQuote(
49
+ options: RelayQuoteOptions,
50
+ ): Promise<RelayQuote> {
51
+ try {
52
+ const client = getClient()
53
+ if (!client) {
54
+ throw new Error("Relay client not available")
55
+ }
56
+
57
+ console.log("[trails-sdk] getRelaySDKQuote", options)
58
+
59
+ const quote = await client.actions.getQuote({
60
+ wallet: options.wallet,
61
+ chainId: options.chainId,
62
+ toChainId: options.toChainId || options.chainId,
63
+ amount: options.amount,
64
+ currency: options.currency,
65
+ toCurrency: options.toCurrency || options.currency,
66
+ tradeType: options.tradeType || "EXACT_OUTPUT",
67
+ txs: options.txs,
68
+ user: options.wallet.account!.address,
69
+ recipient: options.recipient || options.wallet.account!.address,
70
+ })
71
+
72
+ return quote
73
+ } catch (error) {
74
+ console.error("[trails-sdk] Error getting relay quote:", error)
75
+ throw error
76
+ }
77
+ }
78
+
79
+ /**
80
+ * Execute a relay transaction
81
+ */
82
+ export async function relaySDKExecute(
83
+ options: RelayExecuteOptions,
84
+ ): Promise<RelayExecuteResult> {
85
+ try {
86
+ const client = getClient()
87
+ if (!client) {
88
+ throw new Error("Relay client not available")
89
+ }
90
+
91
+ console.log("[trails-sdk] relaysdkclient", client.chains, options.quote)
92
+
93
+ const result = await client.actions.execute({
94
+ quote: options.quote,
95
+ wallet: options.wallet,
96
+ onProgress:
97
+ options.onProgress ||
98
+ ((data) => {
99
+ console.log("[trails-sdk] Relay progress:", data)
100
+ }),
101
+ })
102
+
103
+ return result
104
+ } catch (error) {
105
+ console.error("[trails-sdk] Error executing relay transaction:", error)
106
+ throw error
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Helper function to create a simple relay transaction for a contract call
112
+ */
113
+ export async function createSimpleRelayTransaction(
114
+ wallet: WalletClient,
115
+ contractAddress: string,
116
+ callData: string,
117
+ value: string,
118
+ chainId: number,
119
+ currency: string = "0x0000000000000000000000000000000000000000", // ETH
120
+ ): Promise<RelayQuote> {
121
+ const options: RelayQuoteOptions = {
122
+ wallet,
123
+ chainId,
124
+ amount: value,
125
+ currency,
126
+ txs: [
127
+ {
128
+ to: contractAddress,
129
+ value,
130
+ data: callData,
131
+ },
132
+ ],
133
+ }
134
+
135
+ return await getRelaySDKQuote(options)
136
+ }
137
+
138
+ /**
139
+ * Helper function to execute a simple relay transaction
140
+ */
141
+ export async function executeSimpleRelayTransaction(
142
+ quote: RelayQuote,
143
+ wallet: WalletClient,
144
+ onProgress?: RelayExecuteOptions["onProgress"],
145
+ ): Promise<RelayExecuteResult> {
146
+ return await relaySDKExecute({
147
+ quote,
148
+ wallet,
149
+ onProgress,
150
+ })
151
+ }
152
+
153
+ export function getTxHashFromRelayResult(result: RelayExecuteResult): string {
154
+ return result?.data?.steps?.[result?.data?.steps!.length - 1]?.items?.[0]
155
+ ?.txHashes?.[0]?.txHash
156
+ }
157
+
158
+ // Source: https://docs.relay.link/resources/supported-chains
159
+ export const relaySupportedChains: Record<number, Chain> = {
160
+ [chains.abstract.id]: chains.abstract,
161
+ [chains.ancient8.id]: chains.ancient8,
162
+ [chains.apeChain.id]: chains.apeChain,
163
+ [chains.arbitrum.id]: chains.arbitrum,
164
+ [chains.arbitrumNova.id]: chains.arbitrumNova,
165
+ [chains.arenaz.id]: chains.arenaz,
166
+ [chains.avalanche.id]: chains.avalanche,
167
+ [chains.b3.id]: chains.b3,
168
+ [chains.base.id]: chains.base,
169
+ [chains.berachain.id]: chains.berachain,
170
+ [chains.blast.id]: chains.blast,
171
+ [chains.opBNB.id]: chains.opBNB,
172
+ [chains.bob.id]: chains.bob,
173
+ [chains.boba.id]: chains.boba,
174
+ [chains.celo.id]: chains.celo,
175
+ [chains.corn.id]: chains.corn,
176
+ [chains.cronos.id]: chains.cronos,
177
+ [chains.cyber.id]: chains.cyber,
178
+ [chains.degen.id]: chains.degen,
179
+ [chains.mainnet.id]: chains.mainnet,
180
+ [chains.flowMainnet.id]: chains.flowMainnet,
181
+ [chains.forma.id]: chains.forma,
182
+ [chains.funkiMainnet.id]: chains.funkiMainnet,
183
+ [chains.gnosis.id]: chains.gnosis,
184
+ [chains.gravity.id]: chains.gravity,
185
+ [chains.hemi.id]: chains.hemi,
186
+ [chains.hychain.id]: chains.hychain,
187
+ [chains.ink.id]: chains.ink,
188
+ [chains.linea.id]: chains.linea,
189
+ [chains.lisk.id]: chains.lisk,
190
+ [chains.manta.id]: chains.manta,
191
+ [chains.mantle.id]: chains.mantle,
192
+ [chains.metis.id]: chains.metis,
193
+ [chains.mint.id]: chains.mint,
194
+ [chains.mode.id]: chains.mode,
195
+ [chains.morph.id]: chains.morph,
196
+ [chains.optimism.id]: chains.optimism,
197
+ [chains.plume.id]: chains.plume,
198
+ [chains.polygon.id]: chains.polygon,
199
+ [chains.polygonZkEvm.id]: chains.polygonZkEvm,
200
+ [chains.ronin.id]: chains.ronin,
201
+ [chains.redstone.id]: chains.redstone,
202
+ [chains.sanko.id]: chains.sanko,
203
+ [chains.scroll.id]: chains.scroll,
204
+ [chains.sei.id]: chains.sei,
205
+ [chains.shape.id]: chains.shape,
206
+ [chains.soneium.id]: chains.soneium,
207
+ [chains.sonic.id]: chains.sonic,
208
+ [chains.story.id]: chains.story,
209
+ [chains.superposition.id]: chains.superposition,
210
+ [chains.superseed.id]: chains.superseed,
211
+ [chains.swellchain.id]: chains.swellchain,
212
+ [chains.taiko.id]: chains.taiko,
213
+ [chains.tron.id]: chains.tron,
214
+ [chains.unichain.id]: chains.unichain,
215
+ [chains.worldchain.id]: chains.worldchain,
216
+ [chains.xai.id]: chains.xai,
217
+ [chains.zeroG.id]: chains.zeroG,
218
+ [chains.zircuit.id]: chains.zircuit,
219
+ [chains.zksync.id]: chains.zksync,
220
+ [chains.zora.id]: chains.zora,
221
+ }
222
+
223
+ export async function getRelaySupportedChains(): Promise<Chain[]> {
224
+ return Object.values(relaySupportedChains)
225
+ }
226
+
227
+ export async function isChainSupported(chainId: number): Promise<boolean> {
228
+ return Object.keys(relaySupportedChains).includes(chainId.toString())
229
+ }
230
+
231
+ export interface RelayToken {
232
+ id: string
233
+ symbol: string
234
+ name: string
235
+ contractAddress: string
236
+ decimals: number
237
+ chainId: number
238
+ chainName: string
239
+ imageUrl: string
240
+ }
241
+
242
+ export async function getRelaySupportedTokens(): Promise<RelayToken[]> {
243
+ try {
244
+ const chains = await fetchRelayChains()
245
+
246
+ const tokens: RelayToken[] = []
247
+
248
+ chains.forEach((chain) => {
249
+ if (!chain.disabled) {
250
+ // Add native currency
251
+ tokens.push({
252
+ id: chain.currency.id,
253
+ symbol: chain.currency.symbol,
254
+ name: chain.currency.name,
255
+ contractAddress: chain.currency.address,
256
+ decimals: chain.currency.decimals,
257
+ chainId: chain.id,
258
+ chainName: chain.displayName || chain.name,
259
+ imageUrl: "", // Native currencies typically don't have logoURI
260
+ })
261
+
262
+ // Add featured tokens
263
+ chain.featuredTokens.forEach((token) => {
264
+ tokens.push({
265
+ id: token.id,
266
+ symbol: token.symbol,
267
+ name: token.name,
268
+ contractAddress: token.address,
269
+ decimals: token.decimals,
270
+ chainId: chain.id,
271
+ chainName: chain.displayName || chain.name,
272
+ imageUrl: token.metadata?.logoURI || "",
273
+ })
274
+ })
275
+
276
+ // Add ERC20 currencies
277
+ chain.erc20Currencies.forEach((token) => {
278
+ tokens.push({
279
+ id: token.id,
280
+ symbol: token.symbol,
281
+ name: token.name,
282
+ contractAddress: token.address,
283
+ decimals: token.decimals,
284
+ chainId: chain.id,
285
+ chainName: chain.displayName || chain.name,
286
+ imageUrl: token.metadata?.logoURI || "",
287
+ })
288
+ })
289
+
290
+ // Add solver currencies (fallback for chains that might not have featuredTokens/erc20Currencies)
291
+ chain.solverCurrencies.forEach((token) => {
292
+ tokens.push({
293
+ id: token.id,
294
+ symbol: token.symbol,
295
+ name: token.name,
296
+ contractAddress: token.address,
297
+ decimals: token.decimals,
298
+ chainId: chain.id,
299
+ chainName: chain.displayName || chain.name,
300
+ imageUrl: token.metadata?.logoURI || "",
301
+ })
302
+ })
303
+ }
304
+ })
305
+
306
+ // Remove duplicates by chainId and contractAddress
307
+ const uniqueTokens = tokens.filter(
308
+ (token, index, self) =>
309
+ index ===
310
+ self.findIndex(
311
+ (t) =>
312
+ t.chainId === token.chainId &&
313
+ t.contractAddress.toLowerCase() ===
314
+ token.contractAddress.toLowerCase(),
315
+ ),
316
+ )
317
+
318
+ console.log(
319
+ `[trails-sdk] Fetched ${uniqueTokens.length} unique tokens from Relay API`,
320
+ )
321
+
322
+ return uniqueTokens
323
+ } catch (error) {
324
+ console.error("[trails-sdk] Error fetching Relay supported tokens:", error)
325
+ return []
326
+ }
327
+ }
328
+
329
+ // Types for Relay API response
330
+ interface RelayApiToken {
331
+ id: string
332
+ symbol: string
333
+ name: string
334
+ address: string
335
+ decimals: number
336
+ metadata?: {
337
+ logoURI?: string
338
+ }
339
+ supportsBridging?: boolean
340
+ withdrawalFee?: number
341
+ depositFee?: number
342
+ surgeEnabled?: boolean
343
+ supportsPermit?: boolean
344
+ }
345
+
346
+ interface RelayChain {
347
+ id: number
348
+ name: string
349
+ displayName: string
350
+ disabled: boolean
351
+ currency: {
352
+ id: string
353
+ symbol: string
354
+ name: string
355
+ address: string
356
+ decimals: number
357
+ supportsBridging: boolean
358
+ }
359
+ featuredTokens: RelayApiToken[]
360
+ erc20Currencies: RelayApiToken[]
361
+ solverCurrencies: RelayApiToken[]
362
+ }
363
+
364
+ interface RelayChainsResponse {
365
+ chains: RelayChain[]
366
+ }
367
+
368
+ // Cache for chains data
369
+ let cachedChains: RelayChain[] | null = null
370
+ let cacheTimestamp: number = 0
371
+ const CACHE_DURATION = 5 * 60 * 1000 // 5 minutes
372
+
373
+ async function fetchRelayChains(): Promise<RelayChain[]> {
374
+ const now = Date.now()
375
+
376
+ // Return cached data if still valid
377
+ if (cachedChains && now - cacheTimestamp < CACHE_DURATION) {
378
+ return cachedChains
379
+ }
380
+
381
+ try {
382
+ const response = await fetch("https://api.relay.link/chains")
383
+ if (!response.ok) {
384
+ throw new Error(`Failed to fetch chains: ${response.status}`)
385
+ }
386
+
387
+ const data: RelayChainsResponse = await response.json()
388
+ cachedChains = data.chains
389
+ cacheTimestamp = now
390
+
391
+ return data.chains
392
+ } catch (error) {
393
+ console.error("[trails-sdk] Error fetching Relay chains:", error)
394
+ // Return cached data if available, even if expired
395
+ if (cachedChains) {
396
+ return cachedChains
397
+ }
398
+ throw error
399
+ }
400
+ }
401
+
402
+ export type GetIsRouteSupportedOptions = {
403
+ originChainId: number
404
+ destinationChainId: number
405
+ amount: string
406
+ originToken: string
407
+ destinationToken: string
408
+ }
409
+
410
+ export async function getIsRouteSupported({
411
+ originChainId,
412
+ destinationChainId,
413
+ amount,
414
+ originToken,
415
+ destinationToken,
416
+ }: GetIsRouteSupportedOptions): Promise<boolean> {
417
+ try {
418
+ // Fetch supported chains from Relay API
419
+ const chains = await fetchRelayChains()
420
+
421
+ // Check if both chains are supported and not disabled
422
+ const originChain = chains.find((chain) => chain.id === originChainId)
423
+ const destinationChain = chains.find(
424
+ (chain) => chain.id === destinationChainId,
425
+ )
426
+
427
+ if (
428
+ !originChain ||
429
+ !destinationChain ||
430
+ originChain.disabled ||
431
+ destinationChain.disabled
432
+ ) {
433
+ return false
434
+ }
435
+
436
+ // Check if destination token is supported on destination chain
437
+ const isDestinationTokenSupported = destinationChain.solverCurrencies.some(
438
+ (currency) =>
439
+ currency.address.toLowerCase() === destinationToken.toLowerCase(),
440
+ )
441
+
442
+ if (!isDestinationTokenSupported) {
443
+ return false
444
+ }
445
+
446
+ // If we have a client available, try to get a quote to verify the route
447
+ const client = getClient()
448
+ if (client) {
449
+ try {
450
+ const sender = "0x1111111111111111111111111111111111111111"
451
+
452
+ const quote = await client.actions.getQuote({
453
+ chainId: originChainId,
454
+ toChainId: destinationChainId,
455
+ amount: amount,
456
+ currency: originToken,
457
+ toCurrency: destinationToken,
458
+ tradeType: "EXACT_OUTPUT",
459
+ txs: [],
460
+ user: sender,
461
+ recipient: sender,
462
+ })
463
+
464
+ return quote.steps.length > 0
465
+ } catch (error) {
466
+ console.warn(
467
+ "[trails-sdk] Quote check failed, falling back to chain/token validation:",
468
+ error,
469
+ )
470
+ // If quote fails, we still return true if chains and tokens are supported
471
+ return true
472
+ }
473
+ }
474
+
475
+ // If no client available, return true if chains and tokens are supported
476
+ return true
477
+ } catch (error) {
478
+ console.error("[trails-sdk] Error checking route support:", error)
479
+ return false
480
+ }
481
+ }