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,397 @@
1
+ import type { SequenceIndexerGateway } from "@0xsequence/indexer"
2
+ import { ResourceStatus } from "@0xsequence/indexer"
3
+ import { Address } from "ox"
4
+ import { useEffect, useMemo, useState } from "react"
5
+ import { isAddressEqual, zeroAddress } from "viem"
6
+ import { useAccount } from "wagmi"
7
+ import { getChainInfo, useSupportedChains } from "../../chains.js"
8
+ import type {
9
+ TokenBalanceExtended,
10
+ TokenBalanceWithPrice,
11
+ } from "../../tokenBalances.js"
12
+ import {
13
+ formatBalance,
14
+ useAccountTotalBalanceUsd,
15
+ useHasSufficientBalanceUsd,
16
+ useTokenBalances,
17
+ } from "../../tokenBalances.js"
18
+ import { getFormatttedTokenName, useSourceTokenList } from "../../tokens.js"
19
+
20
+ export interface Token {
21
+ id: number
22
+ name: string
23
+ symbol: string
24
+ balance: string
25
+ imageUrl: string
26
+ chainId: number
27
+ contractAddress: string
28
+ balanceUsdFormatted: string
29
+ tokenPriceUsd: number
30
+ contractInfo?: {
31
+ decimals: number
32
+ symbol: string
33
+ name: string
34
+ }
35
+ }
36
+
37
+ export type TokenFormatted = Token &
38
+ TokenBalanceExtended & {
39
+ balanceFormatted: string
40
+ tokenPriceUsd: number
41
+ balanceUsdFormatted: string
42
+ isNative: boolean
43
+ tokenName: string
44
+ priceUsd: number
45
+ isSufficientBalance: boolean
46
+ chainName: string
47
+ }
48
+
49
+ export type UseTokenListProps = {
50
+ onContinue: (selectedToken: Token) => void
51
+ targetAmountUsd?: number | null
52
+ indexerGatewayClient: SequenceIndexerGateway
53
+ onError: (error: Error | string | null) => void
54
+ }
55
+
56
+ export type UseTokenListReturn = {
57
+ selectedToken: Token | null
58
+ searchQuery: string
59
+ handleTokenSelect: (token: TokenFormatted) => void
60
+ filteredTokens: TokenBalanceExtended[]
61
+ isLoadingSortedTokens: boolean
62
+ balanceError: Error | null
63
+ showContinueButton: boolean
64
+ isTokenSelected: (token: TokenBalanceExtended) => boolean
65
+ setSearchQuery: (query: string) => void
66
+ filteredTokensFormatted: TokenFormatted[]
67
+ totalBalanceUsd: number
68
+ totalBalanceUsdFormatted: string
69
+ isLoadingTotalBalanceUsd: boolean
70
+ showInsufficientBalance: boolean
71
+ }
72
+
73
+ export function useTokenList({
74
+ onContinue,
75
+ targetAmountUsd,
76
+ indexerGatewayClient,
77
+ onError,
78
+ }: UseTokenListProps): UseTokenListReturn {
79
+ const [selectedToken, setSelectedToken] = useState<Token | null>(null)
80
+ const [searchQuery, setSearchQuery] = useState("")
81
+ const { address } = useAccount()
82
+ const {
83
+ sortedTokens: allSortedTokens,
84
+ isLoadingSortedTokens,
85
+ balanceError,
86
+ } = useTokenBalances(address as Address.Address, indexerGatewayClient)
87
+
88
+ const {
89
+ totalBalanceUsd,
90
+ totalBalanceUsdFormatted,
91
+ isLoadingTotalBalanceUsd,
92
+ } = useAccountTotalBalanceUsd(address as Address.Address)
93
+ const {
94
+ hasSufficientBalanceUsd,
95
+ isLoadingHasSufficientBalanceUsd,
96
+ hasSufficientBalanceUsdError,
97
+ } = useHasSufficientBalanceUsd(address as Address.Address, targetAmountUsd)
98
+ const showContinueButton = false
99
+ const sourceTokenList = useSourceTokenList()
100
+ const { supportedChains: supportedToChains } = useSupportedChains()
101
+
102
+ const supportedChainIds = useMemo(() => {
103
+ return new Set(supportedToChains.map((c) => c.id))
104
+ }, [supportedToChains])
105
+
106
+ const sortedTokens = useMemo<Array<TokenBalanceExtended>>(() => {
107
+ return allSortedTokens.filter((token: TokenBalanceExtended) => {
108
+ if (!supportedChainIds.has(token.chainId)) {
109
+ return false
110
+ }
111
+ return (
112
+ !(token as TokenBalanceWithPrice).contractAddress ||
113
+ sourceTokenList.includes(
114
+ (token as TokenBalanceWithPrice).contractInfo?.symbol || "",
115
+ )
116
+ )
117
+ })
118
+ }, [allSortedTokens, sourceTokenList, supportedChainIds])
119
+
120
+ useEffect(() => {
121
+ if (onError) {
122
+ onError(balanceError)
123
+ }
124
+ }, [balanceError, onError])
125
+
126
+ const handleTokenSelect = (token: TokenFormatted) => {
127
+ const isNative = !("contractAddress" in token)
128
+ const chainInfo = getChainInfo(token.chainId)
129
+ const imageUrl = token.imageUrl
130
+
131
+ let formattedToken: Token
132
+ if (isNative) {
133
+ formattedToken = {
134
+ id: (token as TokenBalanceExtended).chainId,
135
+ name: chainInfo?.nativeCurrency.name || "Native Token",
136
+ symbol: chainInfo?.nativeCurrency.symbol || "ETH",
137
+ balance: (token as TokenBalanceExtended).balance,
138
+ imageUrl,
139
+ chainId: (token as TokenBalanceExtended).chainId,
140
+ contractAddress: zeroAddress,
141
+ balanceUsdFormatted:
142
+ (token as TokenBalanceExtended).balanceUsdFormatted ?? "",
143
+ tokenPriceUsd: (token as TokenBalanceExtended).price?.value ?? 0,
144
+ contractInfo: {
145
+ decimals: 18,
146
+ symbol: chainInfo?.nativeCurrency.symbol || "ETH",
147
+ name: chainInfo?.nativeCurrency.name || "Native Token",
148
+ },
149
+ }
150
+ } else {
151
+ formattedToken = {
152
+ id: token.chainId,
153
+ name: token.contractInfo?.name || "Unknown Token",
154
+ symbol: token.contractInfo?.symbol || "???",
155
+ balance: token.balance,
156
+ imageUrl,
157
+ chainId: token.chainId,
158
+ contractAddress: token.contractAddress,
159
+ contractInfo: {
160
+ ...token.contractInfo,
161
+ name: token.contractInfo?.name ?? "Unknown Token",
162
+ symbol: token.contractInfo?.symbol ?? "???",
163
+ decimals: token.contractInfo?.decimals ?? 18,
164
+ },
165
+ balanceUsdFormatted: token.balanceUsdFormatted ?? "",
166
+ tokenPriceUsd: token.price?.value ?? 0,
167
+ }
168
+ }
169
+
170
+ setSelectedToken(formattedToken)
171
+ const canContinue =
172
+ (!targetAmountUsd || (targetAmountUsd && hasSufficientBalanceUsd)) &&
173
+ token.isSufficientBalance
174
+
175
+ if (!canContinue) {
176
+ console.warn("[trails-sdk] Cannot continue with token selection", {
177
+ token: formattedToken,
178
+ targetAmountUsd,
179
+ hasSufficientBalanceUsd,
180
+ isSufficientBalance: token.isSufficientBalance,
181
+ })
182
+ }
183
+
184
+ onContinue(formattedToken)
185
+ }
186
+
187
+ const isTokenSelected = (token: TokenBalanceExtended): boolean => {
188
+ if (!selectedToken) return false
189
+
190
+ const isNative = !("contractAddress" in token)
191
+ return (
192
+ selectedToken.chainId === token.chainId &&
193
+ (isNative
194
+ ? selectedToken.contractAddress === zeroAddress
195
+ : isAddressEqual(
196
+ Address.from(selectedToken.contractAddress),
197
+ Address.from(token.contractAddress),
198
+ ))
199
+ )
200
+ }
201
+
202
+ const filteredTokens = useMemo(() => {
203
+ if (!searchQuery.trim()) {
204
+ return sortedTokens
205
+ }
206
+
207
+ const query = searchQuery.toLowerCase().trim()
208
+ const queryParts = query.split(/\s+/).filter((part) => part.length > 0)
209
+
210
+ return sortedTokens.filter((token: TokenBalanceExtended) => {
211
+ const isNative = !("contractAddress" in token)
212
+ const chainInfo = getChainInfo(token.chainId)
213
+ const chainName = chainInfo?.name || ""
214
+ const chainNameLower = chainName.toLowerCase()
215
+
216
+ if (isNative) {
217
+ const nativeSymbol = chainInfo?.nativeCurrency.symbol || "ETH"
218
+ const nativeName = chainInfo?.nativeCurrency.name || "Native Token"
219
+ const nativeSymbolLower = nativeSymbol.toLowerCase()
220
+ const nativeNameLower = nativeName.toLowerCase()
221
+
222
+ // If multiple query parts, check if they match chain + token combination
223
+ if (queryParts.length > 1) {
224
+ const matchesChain = queryParts.some((part) =>
225
+ chainNameLower.includes(part),
226
+ )
227
+ const matchesToken = queryParts.some(
228
+ (part) =>
229
+ nativeSymbolLower.includes(part) ||
230
+ nativeNameLower.includes(part),
231
+ )
232
+ return matchesChain && matchesToken
233
+ }
234
+
235
+ // Single query part - match against any field
236
+ return queryParts.some(
237
+ (part) =>
238
+ nativeSymbolLower.includes(part) ||
239
+ nativeNameLower.includes(part) ||
240
+ chainNameLower.includes(part),
241
+ )
242
+ }
243
+
244
+ const tokenSymbol = token.contractInfo?.symbol || "???"
245
+ const tokenName = token.contractInfo?.name || "Unknown Token"
246
+ const tokenSymbolLower = tokenSymbol.toLowerCase()
247
+ const tokenNameLower = tokenName.toLowerCase()
248
+
249
+ // If multiple query parts, check if they match chain + token combination
250
+ if (queryParts.length > 1) {
251
+ const matchesChain = queryParts.some((part) =>
252
+ chainNameLower.includes(part),
253
+ )
254
+ const matchesToken = queryParts.some(
255
+ (part) =>
256
+ tokenSymbolLower.includes(part) || tokenNameLower.includes(part),
257
+ )
258
+ return matchesChain && matchesToken
259
+ }
260
+
261
+ // Single query part - match against any field
262
+ return queryParts.some(
263
+ (part) =>
264
+ tokenSymbolLower.includes(part) ||
265
+ tokenNameLower.includes(part) ||
266
+ chainNameLower.includes(part),
267
+ )
268
+ })
269
+ }, [sortedTokens, searchQuery])
270
+
271
+ const filteredTokensFormatted = useMemo(() => {
272
+ return filteredTokens.map((token: TokenBalanceExtended): TokenFormatted => {
273
+ const isNative = !("contractAddress" in token)
274
+ const chainInfo = getChainInfo(token.chainId)
275
+ const nativeSymbol = chainInfo?.nativeCurrency.symbol || "ETH"
276
+ const tokenSymbol = isNative
277
+ ? nativeSymbol
278
+ : token.contractInfo?.symbol || "???"
279
+ const contractAddress = isNative ? zeroAddress : token.contractAddress
280
+ let imageContractAddress = contractAddress
281
+ if (tokenSymbol === "WETH") {
282
+ imageContractAddress = zeroAddress
283
+ }
284
+ const imageUrl = `https://assets.sequence.info/images/tokens/small/${token.chainId}/${imageContractAddress}.webp`
285
+ const currentTokenName =
286
+ (token as TokenBalanceWithPrice).contractInfo?.name || ""
287
+ const tokenName = getFormatttedTokenName(
288
+ currentTokenName,
289
+ tokenSymbol,
290
+ token.chainId,
291
+ )
292
+ const formattedBalance = formatBalance(
293
+ token.balance,
294
+ isNative ? 18 : token.contractInfo?.decimals,
295
+ )
296
+ const priceUsd = Number(token.price?.value) ?? 0
297
+ const balanceUsdFormatted = token.balanceUsdFormatted ?? ""
298
+ const decimals = isNative ? 18 : (token.contractInfo?.decimals ?? 18)
299
+ let isSufficientBalance = true
300
+ if (targetAmountUsd) {
301
+ isSufficientBalance = (token.balanceUsd ?? 0) >= targetAmountUsd
302
+ }
303
+ const chainName = chainInfo?.name || ""
304
+
305
+ return {
306
+ ...token,
307
+ id: token.chainId,
308
+ contractInfo: {
309
+ ...(token as TokenBalanceWithPrice).contractInfo,
310
+ chainId: Number(token.chainId),
311
+ source: (token as TokenBalanceWithPrice).contractInfo?.source || "",
312
+ type: (token as TokenBalanceWithPrice).contractInfo?.type || "",
313
+ logoURI: (token as TokenBalanceWithPrice).contractInfo?.logoURI || "",
314
+ deployed:
315
+ (token as TokenBalanceWithPrice).contractInfo?.deployed || false,
316
+ bytecodeHash:
317
+ (token as TokenBalanceWithPrice).contractInfo?.bytecodeHash || "",
318
+ updatedAt:
319
+ (token as TokenBalanceWithPrice).contractInfo?.updatedAt || "",
320
+ queuedAt:
321
+ (token as TokenBalanceWithPrice).contractInfo?.queuedAt || "",
322
+ extensions: (token as TokenBalanceWithPrice).contractInfo
323
+ ?.extensions || {
324
+ link: "",
325
+ description: "",
326
+ categories: [],
327
+ ogImage: "",
328
+ ogName: "",
329
+ originChainId: 0,
330
+ originAddress: "",
331
+ blacklist: false,
332
+ verified: false,
333
+ featureIndex: 0,
334
+ verifiedBy: "",
335
+ featured: false,
336
+ },
337
+ status:
338
+ (token as TokenBalanceWithPrice).contractInfo?.status ||
339
+ ResourceStatus.NOT_AVAILABLE,
340
+ address: contractAddress,
341
+ name: tokenName,
342
+ symbol: tokenSymbol,
343
+ decimals: decimals,
344
+ },
345
+ name: tokenName,
346
+ symbol: tokenSymbol,
347
+ balanceFormatted: formattedBalance,
348
+ imageUrl,
349
+ chainId: token.chainId,
350
+ contractAddress: contractAddress,
351
+ balanceUsdFormatted,
352
+ tokenPriceUsd: priceUsd,
353
+ isNative: isNative,
354
+ tokenName: tokenName,
355
+ priceUsd: priceUsd,
356
+ isSufficientBalance,
357
+ chainName,
358
+ }
359
+ })
360
+ }, [filteredTokens, targetAmountUsd])
361
+
362
+ const showInsufficientBalance = useMemo(() => {
363
+ return (
364
+ (totalBalanceUsd &&
365
+ targetAmountUsd &&
366
+ !hasSufficientBalanceUsd &&
367
+ !isLoadingHasSufficientBalanceUsd &&
368
+ !hasSufficientBalanceUsdError) ||
369
+ (filteredTokensFormatted?.length > 0 &&
370
+ !filteredTokensFormatted.some((token) => token.isSufficientBalance))
371
+ )
372
+ }, [
373
+ targetAmountUsd,
374
+ hasSufficientBalanceUsd,
375
+ isLoadingHasSufficientBalanceUsd,
376
+ hasSufficientBalanceUsdError,
377
+ filteredTokensFormatted,
378
+ totalBalanceUsd,
379
+ ])
380
+
381
+ return {
382
+ selectedToken,
383
+ searchQuery,
384
+ handleTokenSelect,
385
+ filteredTokens,
386
+ isLoadingSortedTokens,
387
+ balanceError,
388
+ showContinueButton,
389
+ isTokenSelected,
390
+ setSearchQuery,
391
+ filteredTokensFormatted,
392
+ totalBalanceUsd,
393
+ totalBalanceUsdFormatted,
394
+ isLoadingTotalBalanceUsd,
395
+ showInsufficientBalance,
396
+ }
397
+ }
@@ -0,0 +1,2 @@
1
+ @import "tailwindcss";
2
+ @import "@0xsequence/design-system/preset";
@@ -0,0 +1,8 @@
1
+ // Be explicit about what we export
2
+
3
+ export type { TrailsWidgetProps, TrailsWidgetRef } from "./widget.js"
4
+ export {
5
+ createModalController,
6
+ defaultWalletOptions,
7
+ TrailsWidget,
8
+ } from "./widget.js"
@@ -0,0 +1,8 @@
1
+ declare module "*.svg" {
2
+ const content: any
3
+ export default content
4
+ }
5
+
6
+ interface Window {
7
+ ethereum?: any
8
+ }
@@ -0,0 +1,59 @@
1
+ // UI Types
2
+ export interface FeeToken {
3
+ chainId: number
4
+ name: string
5
+ symbol: string
6
+ type: string
7
+ decimals: number
8
+ logoURL?: string
9
+ contractAddress: string
10
+ tokenID?: string
11
+ }
12
+
13
+ export interface FeeOption {
14
+ token: FeeToken
15
+ to: string
16
+ value: string
17
+ gasLimit: number
18
+ feeValue: string
19
+ decimals: number
20
+ price: {
21
+ value: number
22
+ currency: string
23
+ }
24
+ }
25
+
26
+ export interface FeeQuote {
27
+ _tag: string
28
+ _quote: string
29
+ }
30
+
31
+ export interface RelayerFeeOptions {
32
+ options: FeeOption[]
33
+ quote?: FeeQuote
34
+ }
35
+
36
+ export interface FeeTokenMetadata {
37
+ symbol: string
38
+ name: string
39
+ imageUrl: string
40
+ contractAddress: string
41
+ }
42
+
43
+ // Raw API Types
44
+ export interface RawFeeOption {
45
+ token: string
46
+ to: string
47
+ value: string
48
+ gasLimit: number
49
+ }
50
+
51
+ export interface RawFeeQuote {
52
+ _tag: string
53
+ _quote: unknown
54
+ }
55
+
56
+ export interface RawRelayerFeeOptions {
57
+ options: RawFeeOption[]
58
+ quote?: RawFeeQuote
59
+ }