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,37 @@
1
+ import { TokenImage as SeqTokenImage } from "@0xsequence/design-system"
2
+ import type React from "react"
3
+
4
+ interface TokenImageProps {
5
+ imageUrl?: string
6
+ symbol?: string
7
+ chainId?: number
8
+ size?: number
9
+ }
10
+
11
+ export const TokenImage: React.FC<TokenImageProps> = ({
12
+ imageUrl,
13
+ symbol,
14
+ chainId,
15
+ size = 24,
16
+ }) => {
17
+ imageUrl = imageUrl?.replace("/small/", "/large/")
18
+ symbol = imageUrl ? symbol : symbol?.[0]
19
+
20
+ return (
21
+ <div
22
+ className={`rounded-full flex items-center justify-center text-sm relative bg-black-100 bg-opacity-90`}
23
+ style={{ width: size, height: size }}
24
+ >
25
+ <SeqTokenImage
26
+ src={imageUrl}
27
+ symbol={symbol}
28
+ withNetwork={chainId}
29
+ size="xl"
30
+ className="absolute w-full h-full text-white"
31
+ disableAnimation={true}
32
+ />
33
+ </div>
34
+ )
35
+ }
36
+
37
+ export default TokenImage
@@ -0,0 +1,287 @@
1
+ import type { SequenceIndexerGateway } from "@0xsequence/indexer"
2
+ import { ChevronLeft, Search } from "lucide-react"
3
+ import type React from "react"
4
+ import type { ActiveTheme } from "../../theme.js"
5
+ import type { Token, TokenFormatted } from "../hooks/useTokenList.js"
6
+ import { useTokenList } from "../hooks/useTokenList.js"
7
+ import { TokenImage } from "./TokenImage.js"
8
+
9
+ interface TokenListProps {
10
+ onContinue: (selectedToken: Token) => void
11
+ onBack: () => void
12
+ indexerGatewayClient: SequenceIndexerGateway
13
+ theme?: ActiveTheme
14
+ targetAmountUsd?: number | null
15
+ targetAmountUsdFormatted?: string | null
16
+ onError: (error: Error | string | null) => void
17
+ }
18
+
19
+ export const TokenList: React.FC<TokenListProps> = ({
20
+ onContinue,
21
+ onBack,
22
+ indexerGatewayClient,
23
+ theme = "light",
24
+ targetAmountUsd,
25
+ targetAmountUsdFormatted,
26
+ onError,
27
+ }) => {
28
+ const {
29
+ searchQuery,
30
+ setSearchQuery,
31
+ handleTokenSelect,
32
+ filteredTokens,
33
+ isLoadingSortedTokens,
34
+ isTokenSelected,
35
+ selectedToken,
36
+ showContinueButton,
37
+ filteredTokensFormatted,
38
+ totalBalanceUsd,
39
+ totalBalanceUsdFormatted,
40
+ showInsufficientBalance,
41
+ balanceError,
42
+ } = useTokenList({
43
+ onContinue,
44
+ targetAmountUsd,
45
+ indexerGatewayClient,
46
+ onError,
47
+ })
48
+
49
+ return (
50
+ <div className="space-y-6">
51
+ <div className="flex items-center justify-between relative">
52
+ <div className="flex items-center">
53
+ {!targetAmountUsd && (
54
+ <button
55
+ type="button"
56
+ onClick={onBack}
57
+ className={`p-2 rounded-full transition-colors cursor-pointer ${
58
+ theme === "dark"
59
+ ? "hover:bg-gray-800 text-gray-400"
60
+ : "hover:bg-gray-100 text-gray-600"
61
+ }`}
62
+ >
63
+ <ChevronLeft className="h-6 w-6" />
64
+ </button>
65
+ )}
66
+
67
+ <h2
68
+ className={`text-lg font-semibold ${targetAmountUsd ? "text-left" : "text-center"} ${theme === "dark" ? "text-white" : "text-gray-900"}`}
69
+ >
70
+ {targetAmountUsd
71
+ ? `Pay ${targetAmountUsdFormatted} with:`
72
+ : "Select Token"}
73
+ </h2>
74
+ </div>
75
+
76
+ {totalBalanceUsd > 0 && (
77
+ <p
78
+ className={`text-xs mr-8 ${theme === "dark" ? "text-gray-400" : "text-gray-500"}`}
79
+ >
80
+ Total balance: {totalBalanceUsdFormatted}
81
+ </p>
82
+ )}
83
+ </div>
84
+
85
+ {/* Search Field */}
86
+ <div className="relative">
87
+ <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
88
+ <Search
89
+ className={`h-5 w-5 ${theme === "dark" ? "text-gray-500" : "text-gray-400"}`}
90
+ />
91
+ </div>
92
+ <input
93
+ type="text"
94
+ value={searchQuery}
95
+ onChange={(e) => setSearchQuery(e.target.value)}
96
+ placeholder="Search tokens"
97
+ className={`block w-full pl-10 pr-3 py-2 border rounded-[24px] focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${
98
+ theme === "dark"
99
+ ? "bg-gray-800 border-gray-700 text-white placeholder-gray-500"
100
+ : "bg-white border-gray-300 text-gray-900 placeholder-gray-500"
101
+ }`}
102
+ />
103
+ </div>
104
+
105
+ {isLoadingSortedTokens && (
106
+ <div className="text-center py-4">
107
+ <div
108
+ className={`animate-spin rounded-full h-8 w-8 border-b-2 mx-auto ${
109
+ theme === "dark" ? "border-white" : "border-black"
110
+ }`}
111
+ ></div>
112
+ <p
113
+ className={`mt-2 ${theme === "dark" ? "text-gray-400" : "text-gray-500"}`}
114
+ >
115
+ Loading your token balances...
116
+ </p>
117
+ </div>
118
+ )}
119
+
120
+ {!isLoadingSortedTokens &&
121
+ !balanceError &&
122
+ filteredTokens.length === 0 && (
123
+ <div
124
+ className={`text-center py-4 rounded-lg ${theme === "dark" ? "bg-gray-800" : "bg-gray-50"}`}
125
+ >
126
+ <p className={theme === "dark" ? "text-gray-400" : "text-gray-500"}>
127
+ {searchQuery.trim()
128
+ ? "No tokens found matching your search."
129
+ : "No tokens found with balance greater than 0."}
130
+ </p>
131
+ </div>
132
+ )}
133
+
134
+ {/* Token List */}
135
+ <div
136
+ className={`divide-y ${
137
+ theme === "dark" ? "divide-gray-700/50" : "divide-gray-200"
138
+ } max-h-[35vh] overflow-y-auto rounded-[16px] ${theme === "dark" ? "bg-gray-800/50" : "bg-white"}`}
139
+ >
140
+ {filteredTokensFormatted.map((token: TokenFormatted) => {
141
+ const {
142
+ symbol,
143
+ imageUrl,
144
+ chainId,
145
+ contractAddress,
146
+ balanceUsdFormatted,
147
+ tokenName,
148
+ priceUsd,
149
+ balanceFormatted,
150
+ isSufficientBalance,
151
+ } = token
152
+
153
+ return (
154
+ <button
155
+ key={`${chainId}-${contractAddress}`}
156
+ type="button"
157
+ onClick={() => handleTokenSelect(token)}
158
+ title={
159
+ !isSufficientBalance
160
+ ? "Insufficient balance for this token"
161
+ : undefined
162
+ }
163
+ className={`w-full py-2.5 px-3 flex items-center space-x-3 transition-colors ${
164
+ theme === "dark"
165
+ ? isTokenSelected(token)
166
+ ? "bg-gray-800"
167
+ : "hover:bg-gray-800/80"
168
+ : isTokenSelected(token)
169
+ ? "bg-gray-100"
170
+ : "hover:bg-gray-50"
171
+ } ${!isSufficientBalance ? "opacity-50 cursor-not-allowed" : "cursor-pointer"}`}
172
+ >
173
+ <div className="relative flex-shrink-0">
174
+ <div
175
+ className={`rounded-full flex items-center justify-center ${
176
+ theme === "dark" ? "bg-gray-700" : "bg-gray-100"
177
+ }`}
178
+ >
179
+ {contractAddress ? (
180
+ <TokenImage
181
+ symbol={symbol[0]}
182
+ imageUrl={imageUrl}
183
+ chainId={chainId}
184
+ size={32}
185
+ />
186
+ ) : (
187
+ <span
188
+ className={`text-base font-medium ${theme === "dark" ? "text-gray-300" : "text-gray-600"}`}
189
+ >
190
+ {symbol}
191
+ </span>
192
+ )}
193
+ </div>
194
+ </div>
195
+
196
+ <div className="flex-1 min-w-0 text-left">
197
+ <h3
198
+ className={`text-sm font-medium truncate ${
199
+ theme === "dark" ? "text-white" : "text-gray-900"
200
+ } ${!isSufficientBalance ? (theme === "dark" ? "text-gray-500" : "text-gray-400") : ""}`}
201
+ >
202
+ {tokenName}
203
+ </h3>
204
+ <p
205
+ className={`text-xs ${
206
+ theme === "dark" ? "text-gray-400" : "text-gray-500"
207
+ } ${!isSufficientBalance ? (theme === "dark" ? "text-gray-600" : "text-gray-400") : ""}`}
208
+ >
209
+ {symbol}
210
+ </p>
211
+ </div>
212
+
213
+ <div className="text-right flex-shrink-0">
214
+ {priceUsd > 0 ? (
215
+ <>
216
+ <p
217
+ className={`text-sm font-medium ${
218
+ theme === "dark" ? "text-white" : "text-gray-900"
219
+ } ${!isSufficientBalance ? (theme === "dark" ? "text-gray-500" : "text-gray-400") : ""}`}
220
+ >
221
+ {balanceUsdFormatted}
222
+ </p>
223
+ <p
224
+ className={`text-xs ${
225
+ theme === "dark" ? "text-gray-400" : "text-gray-500"
226
+ } ${!isSufficientBalance ? (theme === "dark" ? "text-gray-600" : "text-gray-400") : ""}`}
227
+ >
228
+ {balanceFormatted}
229
+ </p>
230
+ </>
231
+ ) : (
232
+ <p
233
+ className={`text-sm font-medium ${
234
+ theme === "dark" ? "text-white" : "text-gray-900"
235
+ } ${!isSufficientBalance ? (theme === "dark" ? "text-gray-500" : "text-gray-400") : ""}`}
236
+ >
237
+ {balanceFormatted}
238
+ </p>
239
+ )}
240
+ </div>
241
+ </button>
242
+ )
243
+ })}
244
+ </div>
245
+
246
+ {showInsufficientBalance && (
247
+ <div
248
+ className={`text-left py-3 px-4 rounded-lg ${
249
+ theme === "dark"
250
+ ? "bg-amber-500/10 border border-amber-500/30"
251
+ : "bg-amber-50 border border-amber-200"
252
+ }`}
253
+ >
254
+ <p
255
+ className={`text-xs font-medium ${theme === "dark" ? "text-amber-400" : "text-amber-700"}`}
256
+ >
257
+ Insufficient balance
258
+ </p>
259
+ <p
260
+ className={`text-xs mt-1 ${theme === "dark" ? "text-amber-300" : "text-amber-600"}`}
261
+ >
262
+ You do not have enough funds to reach the target amount
263
+ </p>
264
+ </div>
265
+ )}
266
+
267
+ {showContinueButton && (
268
+ <div className="space-y-4">
269
+ <button
270
+ type="button"
271
+ onClick={() => selectedToken && onContinue(selectedToken)}
272
+ disabled={!selectedToken}
273
+ className={`w-full font-semibold py-3 px-4 rounded-[24px] transition-colors ${
274
+ theme === "dark"
275
+ ? "bg-blue-600 disabled:bg-gray-700 text-white disabled:text-gray-400 enabled:hover:bg-blue-700"
276
+ : "bg-blue-500 disabled:bg-gray-300 text-white disabled:text-gray-500 enabled:hover:bg-blue-600"
277
+ } disabled:cursor-not-allowed cursor-pointer`}
278
+ >
279
+ Continue
280
+ </button>
281
+ </div>
282
+ )}
283
+ </div>
284
+ )
285
+ }
286
+
287
+ export default TokenList
@@ -0,0 +1,204 @@
1
+ import { ExternalLink } from "lucide-react"
2
+ import React, { useEffect } from "react"
3
+ import type { TransactionState } from "../../prepareSend.js"
4
+ import type { ActiveTheme } from "../../theme.js"
5
+
6
+ interface TransferPendingProps {
7
+ onComplete: () => void
8
+ theme?: ActiveTheme
9
+ transactionStates: TransactionState[]
10
+ }
11
+
12
+ const _truncateHash = (hash: string) => {
13
+ return `${hash.slice(0, 6)}...${hash.slice(-4)}`
14
+ }
15
+
16
+ export const TransferPending: React.FC<TransferPendingProps> = ({
17
+ onComplete,
18
+ theme = "light",
19
+ transactionStates,
20
+ }) => {
21
+ useEffect(() => {
22
+ const timer = setTimeout(() => {
23
+ onComplete()
24
+ }, 5000)
25
+
26
+ return () => clearTimeout(timer)
27
+ }, [onComplete])
28
+
29
+ // Find the first pending transaction index
30
+ const activePendingIndex = transactionStates.findIndex(
31
+ (tx) => tx.state === "pending",
32
+ )
33
+
34
+ const renderStep = (tx: TransactionState, index: number) => {
35
+ const isPending = tx.state === "pending"
36
+ const isActivePending = index === activePendingIndex
37
+ const isAfterPending =
38
+ activePendingIndex !== -1 && index > activePendingIndex
39
+
40
+ const dotClasses = `relative w-3 h-3 rounded-full transition-colors ${
41
+ isAfterPending
42
+ ? theme === "dark"
43
+ ? "bg-gray-700"
44
+ : "bg-gray-300"
45
+ : tx.state === "confirmed"
46
+ ? theme === "dark"
47
+ ? "bg-green-500"
48
+ : "bg-green-600"
49
+ : tx.state === "failed"
50
+ ? theme === "dark"
51
+ ? "bg-red-500"
52
+ : "bg-red-600"
53
+ : theme === "dark"
54
+ ? "bg-blue-500"
55
+ : "bg-blue-600"
56
+ } ${isActivePending ? "animate-[pulse_1.5s_ease-in-out_infinite]" : ""}`
57
+
58
+ const labelClasses = `mt-2 text-xs transition-colors text-center whitespace-nowrap flex items-center gap-1 ${
59
+ isPending || isAfterPending
60
+ ? theme === "dark"
61
+ ? "text-gray-400 font-medium"
62
+ : "text-gray-500 font-medium"
63
+ : theme === "dark"
64
+ ? "text-gray-100 font-semibold hover:underline"
65
+ : "text-gray-900 font-semibold hover:underline"
66
+ }`
67
+
68
+ const content = (
69
+ <>
70
+ <div className="relative">
71
+ <div className={dotClasses}>
72
+ {isActivePending && (
73
+ <div
74
+ className={`absolute inset-0 rounded-full ${
75
+ theme === "dark" ? "bg-blue-500" : "bg-blue-600"
76
+ } animate-[pulseRing_2s_cubic-bezier(0.4,0,0.6,1)_infinite]`}
77
+ />
78
+ )}
79
+ </div>
80
+ </div>
81
+ <div className="mt-2 flex justify-center">
82
+ <div className={labelClasses}>
83
+ {tx.label}
84
+ {!isPending && !isAfterPending && (
85
+ <ExternalLink className="w-3 h-3" />
86
+ )}
87
+ </div>
88
+ </div>
89
+ </>
90
+ )
91
+
92
+ if (isPending || isAfterPending) {
93
+ return (
94
+ <div className="flex flex-col items-center relative">{content}</div>
95
+ )
96
+ }
97
+
98
+ return (
99
+ <a
100
+ href={tx.explorerUrl}
101
+ target="_blank"
102
+ rel="noopener noreferrer"
103
+ className="flex flex-col items-center relative"
104
+ >
105
+ {content}
106
+ </a>
107
+ )
108
+ }
109
+
110
+ const renderDots = (index: number) => {
111
+ const isActiveDots = index === activePendingIndex - 1
112
+
113
+ return (
114
+ <div className="flex-1 flex items-center justify-center mx-4">
115
+ <div className="flex items-center space-x-2">
116
+ {[...Array(3)].map((_, i) => (
117
+ <div
118
+ key={i}
119
+ className={`w-1 h-1 rounded-full ${
120
+ theme === "dark"
121
+ ? index >= activePendingIndex
122
+ ? "bg-gray-700"
123
+ : "bg-gray-600"
124
+ : index >= activePendingIndex
125
+ ? "bg-gray-300"
126
+ : "bg-gray-400"
127
+ } ${isActiveDots ? "animate-[dotFadeIn_1.5s_ease-in-out_infinite]" : ""}`}
128
+ style={{
129
+ animationDelay: isActiveDots ? `${i * 0.2}s` : "0s",
130
+ }}
131
+ />
132
+ ))}
133
+ </div>
134
+ </div>
135
+ )
136
+ }
137
+
138
+ return (
139
+ <>
140
+ <style>
141
+ {`
142
+ @keyframes dotFadeIn {
143
+ 0% { opacity: 0.3; transform: scale(0.8); }
144
+ 50% { opacity: 1; transform: scale(1.2); }
145
+ 100% { opacity: 0.3; transform: scale(0.8); }
146
+ }
147
+ @keyframes pulseRing {
148
+ 0% { transform: scale(0.7); opacity: 0; }
149
+ 50% { opacity: 0.3; }
150
+ 100% { transform: scale(2); opacity: 0; }
151
+ }
152
+ `}
153
+ </style>
154
+ <div className="space-y-8 flex flex-col items-center justify-center py-8">
155
+ <h2
156
+ className={`text-2xl font-bold ${theme === "dark" ? "text-white" : "text-gray-900"}`}
157
+ >
158
+ Transfer Pending
159
+ </h2>
160
+
161
+ {/* Large Spinner */}
162
+ <div
163
+ className={`animate-spin rounded-full h-16 w-16 border-b-2 ${
164
+ theme === "dark" ? "border-blue-400" : "border-blue-500"
165
+ }`}
166
+ style={{ borderTopWidth: "2px", borderBottomWidth: "2px" }}
167
+ />
168
+
169
+ <div className="w-full max-w-2xl">
170
+ <div className="relative flex items-center justify-center pb-8">
171
+ <div
172
+ className={`flex items-center ${
173
+ transactionStates.length === 1
174
+ ? "w-auto"
175
+ : transactionStates.length === 2
176
+ ? "w-[200px]"
177
+ : "w-full justify-between"
178
+ }`}
179
+ >
180
+ {/* Steps with dotted lines */}
181
+ {transactionStates.map((tx, index) => (
182
+ <React.Fragment key={`${tx.transactionHash}-${index}`}>
183
+ {/* Step */}
184
+ <div className="flex flex-col items-center">
185
+ {renderStep(tx, index)}
186
+ </div>
187
+
188
+ {/* Dotted line after each dot except the last one */}
189
+ {index < transactionStates.length - 1 && renderDots(index)}
190
+ </React.Fragment>
191
+ ))}
192
+ </div>
193
+ </div>
194
+ </div>
195
+
196
+ <p className={theme === "dark" ? "text-gray-400" : "text-gray-500"}>
197
+ Waiting for confirmation...
198
+ </p>
199
+ </div>
200
+ </>
201
+ )
202
+ }
203
+
204
+ export default TransferPending