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,412 @@
1
+ import { ExternalLink } from "lucide-react"
2
+ import type React from "react"
3
+ import { useEffect, useState } from "react"
4
+ import type { TransactionState } from "../../prepareSend.js"
5
+ import type { ActiveTheme } from "../../theme.js"
6
+ import { TokenImage } from "./TokenImage.js"
7
+
8
+ interface TransferPendingProps {
9
+ onComplete: () => void
10
+ theme?: ActiveTheme
11
+ transactionStates: TransactionState[]
12
+ fromAmount: string
13
+ fromAmountUsd: string
14
+ fromTokenSymbol: string
15
+ fromTokenName: string
16
+ fromChainId: number
17
+ fromTokenImageUrl?: string
18
+ timestamp?: number
19
+ }
20
+
21
+ const _truncateHash = (hash: string) => {
22
+ return `${hash.slice(0, 6)}...${hash.slice(-4)}`
23
+ }
24
+
25
+ export const TransferPending: React.FC<TransferPendingProps> = ({
26
+ onComplete,
27
+ theme = "light",
28
+ transactionStates,
29
+ fromAmount,
30
+ fromAmountUsd,
31
+ fromTokenSymbol,
32
+ fromTokenName,
33
+ fromChainId,
34
+ fromTokenImageUrl,
35
+ timestamp,
36
+ }) => {
37
+ const [showContent, setShowContent] = useState(false)
38
+ const [activePendingIndex, setActivePendingIndex] = useState(-1)
39
+ const [showDots, setShowDots] = useState(false)
40
+ const [showLine, setShowLine] = useState(false)
41
+
42
+ useEffect(() => {
43
+ const timer = setTimeout(() => {
44
+ onComplete()
45
+ }, 5000)
46
+
47
+ return () => clearTimeout(timer)
48
+ }, [onComplete])
49
+
50
+ useEffect(() => {
51
+ // Animate content in
52
+ const contentTimer = setTimeout(() => {
53
+ setShowContent(true)
54
+ }, 200)
55
+
56
+ return () => clearTimeout(contentTimer)
57
+ }, [])
58
+
59
+ useEffect(() => {
60
+ // Show dots first, then animate them in
61
+ const dotsTimer = setTimeout(() => {
62
+ setShowDots(true)
63
+ }, 400)
64
+
65
+ // Show line after dots are visible
66
+ const lineTimer = setTimeout(() => {
67
+ setShowLine(true)
68
+ }, 800)
69
+
70
+ return () => {
71
+ clearTimeout(dotsTimer)
72
+ clearTimeout(lineTimer)
73
+ }
74
+ }, [])
75
+
76
+ useEffect(() => {
77
+ // Update active pending index with animation
78
+ const newActiveIndex = transactionStates.findIndex(
79
+ (tx) => tx.state === "pending",
80
+ )
81
+ if (newActiveIndex !== activePendingIndex) {
82
+ setActivePendingIndex(newActiveIndex)
83
+ }
84
+ }, [transactionStates, activePendingIndex])
85
+
86
+ // Add CSS animation for draw effect
87
+ useEffect(() => {
88
+ const style = document.createElement("style")
89
+ style.textContent = `
90
+ @keyframes draw {
91
+ from {
92
+ stroke-dasharray: 0 100;
93
+ }
94
+ to {
95
+ stroke-dasharray: 100 0;
96
+ }
97
+ }
98
+
99
+ .animate-draw {
100
+ animation: draw 0.6s ease-out forwards;
101
+ }
102
+
103
+ @keyframes slideInFromTop {
104
+ from {
105
+ transform: translateY(-20px);
106
+ }
107
+ to {
108
+ transform: translateY(0);
109
+ }
110
+ }
111
+
112
+ @keyframes lineGrow {
113
+ from {
114
+ height: 0;
115
+ }
116
+ to {
117
+ height: 100%;
118
+ }
119
+ }
120
+
121
+ .animate-slide-in {
122
+ animation: slideInFromTop 0.3s ease-out forwards;
123
+ }
124
+
125
+ .animate-line-grow {
126
+ animation: lineGrow 0.6s ease-out forwards;
127
+ }
128
+ `
129
+ document.head.appendChild(style)
130
+
131
+ return () => {
132
+ document.head.removeChild(style)
133
+ }
134
+ }, [])
135
+
136
+ // Calculate time difference
137
+ const getTimeAgo = () => {
138
+ if (!timestamp) return "Sent just now"
139
+
140
+ const now = Date.now()
141
+ const diffInSeconds = Math.floor((now - timestamp) / 1000)
142
+
143
+ if (diffInSeconds < 1) return "Sent just now"
144
+ if (diffInSeconds === 1) return "Sent 1 second ago"
145
+ if (diffInSeconds < 60) return `Sent ${diffInSeconds} seconds ago`
146
+
147
+ const diffInMinutes = Math.floor(diffInSeconds / 60)
148
+ if (diffInMinutes === 1) return "Sent 1 minute ago"
149
+ if (diffInMinutes < 60) return `Sent ${diffInMinutes} minutes ago`
150
+
151
+ const diffInHours = Math.floor(diffInMinutes / 60)
152
+ if (diffInHours === 1) return "Sent 1 hour ago"
153
+ if (diffInHours < 24) return `Sent ${diffInHours} hours ago`
154
+
155
+ const diffInDays = Math.floor(diffInHours / 24)
156
+ if (diffInDays === 1) return "Sent 1 day ago"
157
+ return `Sent ${diffInDays} days ago`
158
+ }
159
+
160
+ const renderStep = (tx: TransactionState, index: number) => {
161
+ const isActivePending = index === activePendingIndex
162
+ const isCompleted = tx.state === "confirmed"
163
+ const isFailed = tx.state === "failed"
164
+
165
+ // Determine step state
166
+ let stepState: "completed" | "active" | "pending" | "failed"
167
+ if (isFailed) {
168
+ stepState = "failed"
169
+ } else if (isCompleted) {
170
+ stepState = "completed"
171
+ } else if (isActivePending) {
172
+ stepState = "active"
173
+ } else {
174
+ stepState = "pending"
175
+ }
176
+
177
+ // Circle styles based on state
178
+ const getCircleStyles = () => {
179
+ const baseStyles =
180
+ "w-5 h-5 rounded-full flex items-center justify-center transition-all duration-500 ease-out"
181
+
182
+ switch (stepState) {
183
+ case "completed":
184
+ return `${baseStyles} ${
185
+ theme === "dark" ? "bg-green-500" : "bg-green-600"
186
+ } scale-100`
187
+ case "active":
188
+ return `${baseStyles} ${
189
+ theme === "dark" ? "bg-blue-500" : "bg-blue-600"
190
+ } scale-110`
191
+ case "failed":
192
+ return `${baseStyles} ${
193
+ theme === "dark" ? "bg-red-500" : "bg-red-600"
194
+ } scale-100`
195
+ case "pending":
196
+ return `${baseStyles} ${
197
+ theme === "dark" ? "bg-gray-600" : "bg-gray-300"
198
+ } scale-100`
199
+ }
200
+ }
201
+
202
+ // Checkmark icon for completed steps
203
+ const CheckmarkIcon = () => (
204
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none">
205
+ <title>Completed</title>
206
+ <path
207
+ d="M2.5 6L5 8.5L9.5 4"
208
+ stroke="white"
209
+ strokeWidth="2"
210
+ strokeLinecap="round"
211
+ strokeLinejoin="round"
212
+ className="animate-draw"
213
+ />
214
+ </svg>
215
+ )
216
+
217
+ // X icon for failed steps
218
+ const XIcon = () => (
219
+ <svg width="12" height="12" viewBox="0 0 12 12" fill="none">
220
+ <title>Failed</title>
221
+ <path
222
+ d="M3 3L9 9M9 3L3 9"
223
+ stroke="white"
224
+ strokeWidth="2"
225
+ strokeLinecap="round"
226
+ strokeLinejoin="round"
227
+ className="animate-draw"
228
+ />
229
+ </svg>
230
+ )
231
+
232
+ // Spinner icon for active steps
233
+ const SpinnerIcon = () => (
234
+ <svg
235
+ width="12"
236
+ height="12"
237
+ viewBox="0 0 12 12"
238
+ fill="none"
239
+ className="animate-spin"
240
+ >
241
+ <title>Processing</title>
242
+ <circle
243
+ cx="6"
244
+ cy="6"
245
+ r="4"
246
+ stroke="white"
247
+ strokeWidth="2"
248
+ strokeLinecap="round"
249
+ strokeDasharray="6 6"
250
+ strokeDashoffset="0"
251
+ />
252
+ </svg>
253
+ )
254
+
255
+ // Text styles based on state
256
+ const getTextStyles = () => {
257
+ const baseStyles =
258
+ "text-sm font-medium transition-all duration-500 ease-out"
259
+
260
+ // Use regular colors instead of state-based colors
261
+ return `${baseStyles} ${
262
+ theme === "dark" ? "text-white" : "text-gray-900"
263
+ }`
264
+ }
265
+
266
+ const content = (
267
+ <div className="flex items-start space-x-4">
268
+ {/* Circle with state indicator */}
269
+ <div className="flex-shrink-0">
270
+ <div className={getCircleStyles()}>
271
+ {stepState === "completed" && <CheckmarkIcon />}
272
+ {stepState === "failed" && <XIcon />}
273
+ {stepState === "active" && <SpinnerIcon />}
274
+ </div>
275
+ </div>
276
+
277
+ {/* Step content */}
278
+ <div className="flex-1 min-w-0">
279
+ <div className="flex items-center space-x-2">
280
+ <span className={getTextStyles()}>{tx.label}</span>
281
+ {stepState === "completed" && (
282
+ <ExternalLink className="w-4 h-4 text-gray-400 transition-opacity duration-300" />
283
+ )}
284
+ </div>
285
+ </div>
286
+ </div>
287
+ )
288
+
289
+ if (stepState === "completed" || stepState === "failed") {
290
+ return (
291
+ <a
292
+ href={tx.explorerUrl}
293
+ target="_blank"
294
+ rel="noopener noreferrer"
295
+ className="block hover:opacity-80 transition-all duration-300 ease-out"
296
+ >
297
+ {content}
298
+ </a>
299
+ )
300
+ }
301
+
302
+ return <div className="block">{content}</div>
303
+ }
304
+
305
+ return (
306
+ <div className="space-y-8 flex flex-col items-center justify-center py-8">
307
+ <h2
308
+ className={`text-2xl font-bold transition-all duration-500 ease-out ${
309
+ showContent ? "opacity-100 translate-y-0" : "opacity-0 translate-y-4"
310
+ } ${theme === "dark" ? "text-white" : "text-gray-900"}`}
311
+ >
312
+ Transaction status
313
+ </h2>
314
+
315
+ {/* Transfer Information */}
316
+ <div
317
+ className={`w-full max-w-sm p-3 rounded-lg transition-all duration-500 ease-out delay-100 ${
318
+ showContent ? "opacity-100 translate-y-0" : "opacity-0 translate-y-4"
319
+ } ${
320
+ theme === "dark"
321
+ ? "bg-gray-800/50 text-gray-200"
322
+ : "bg-gray-50 text-gray-700"
323
+ }`}
324
+ >
325
+ <div className="flex items-start justify-between">
326
+ {/* Left side - Chain and Token images with token name */}
327
+ <div className="flex items-start space-x-2">
328
+ {/* Token Image and Name */}
329
+ <div className="flex items-center space-x-2">
330
+ <div style={{ width: "24px", height: "24px" }}>
331
+ <TokenImage
332
+ imageUrl={fromTokenImageUrl}
333
+ symbol={fromTokenSymbol}
334
+ chainId={fromChainId}
335
+ size={24}
336
+ />
337
+ </div>
338
+ <div className="flex flex-col">
339
+ <span
340
+ className={`text-xs font-medium ${theme === "dark" ? "text-white" : "text-gray-900"}`}
341
+ >
342
+ {fromTokenName}
343
+ </span>
344
+ <span
345
+ className={`text-xs ${theme === "dark" ? "text-gray-400" : "text-gray-500"}`}
346
+ >
347
+ {getTimeAgo()}
348
+ </span>
349
+ </div>
350
+ </div>
351
+ </div>
352
+
353
+ {/* Right side - USD value and amount */}
354
+ <div className="text-right">
355
+ <div
356
+ className={`text-xs font-medium ${theme === "dark" ? "text-white" : "text-gray-900"}`}
357
+ >
358
+ {fromAmountUsd}
359
+ </div>
360
+ <div
361
+ className={`text-xs ${theme === "dark" ? "text-gray-400" : "text-gray-600"}`}
362
+ >
363
+ {fromAmount} {fromTokenSymbol}
364
+ </div>
365
+ </div>
366
+ </div>
367
+ </div>
368
+
369
+ {/* Vertical Stepper */}
370
+ <div className="w-full mx-auto" style={{ width: "auto" }}>
371
+ <div className="relative">
372
+ {/* Vertical line connecting all steps */}
373
+ <div
374
+ className={`absolute left-2.5 top-5 bottom-5 w-0.5 transition-all duration-500 ease-out ${
375
+ theme === "dark" ? "bg-gray-700" : "bg-gray-300"
376
+ } ${showLine ? "animate-line-grow" : "h-0"}`}
377
+ />
378
+
379
+ {/* Progress line for completed steps */}
380
+ {activePendingIndex > 0 && showLine && (
381
+ <div
382
+ className="absolute left-2.5 top-5 w-0.5 bg-green-500 transition-all duration-1000 ease-out"
383
+ style={{
384
+ height: `${(activePendingIndex / (transactionStates.length - 1)) * 80}%`,
385
+ maxHeight: "calc(100% - 20px)",
386
+ }}
387
+ />
388
+ )}
389
+
390
+ {/* Steps */}
391
+ <div className="space-y-6">
392
+ {transactionStates.map((tx, index) => (
393
+ <div
394
+ key={`${tx.transactionHash}-${index}`}
395
+ className="relative transition-all duration-300 ease-out"
396
+ style={{
397
+ transitionDelay: showDots ? `${index * 100}ms` : "0ms",
398
+ transform: showDots ? "translateY(0)" : "translateY(-20px)",
399
+ visibility: showDots ? "visible" : "hidden",
400
+ }}
401
+ >
402
+ {renderStep(tx, index)}
403
+ </div>
404
+ ))}
405
+ </div>
406
+ </div>
407
+ </div>
408
+ </div>
409
+ )
410
+ }
411
+
412
+ export default TransferPending
@@ -0,0 +1,172 @@
1
+ import { TokenImage } from "./TokenImage.js"
2
+ import { ChevronLeft } from "lucide-react"
3
+ import type React from "react"
4
+ import { useEffect, useState } from "react"
5
+ import { getExplorerUrlForAddress } from "../../explorer.js"
6
+ import type { ActiveTheme } from "../../theme.js"
7
+
8
+ interface WalletConfirmationProps {
9
+ onBack: () => void
10
+ onComplete: () => void
11
+ theme?: ActiveTheme
12
+ amount?: string
13
+ recipient?: string
14
+ tokenSymbol?: string
15
+ retryEnabled?: boolean
16
+ onRetry?: () => void
17
+ fromTokenSymbol: string
18
+ fromChainId: number
19
+ fromTokenImageUrl: string
20
+ }
21
+
22
+ export const WalletConfirmation: React.FC<WalletConfirmationProps> = ({
23
+ theme = "light",
24
+ amount,
25
+ recipient,
26
+ tokenSymbol,
27
+ retryEnabled = false,
28
+ onRetry,
29
+ onBack,
30
+ fromTokenSymbol,
31
+ fromChainId,
32
+ fromTokenImageUrl,
33
+ }) => {
34
+ const [showContent, setShowContent] = useState(false)
35
+
36
+ useEffect(() => {
37
+ setShowContent(true)
38
+ }, [])
39
+
40
+ return (
41
+ <div className="space-y-6">
42
+ <div className="flex items-center relative">
43
+ <button
44
+ type="button"
45
+ onClick={onBack}
46
+ className={`absolute -left-2 p-2 rounded-full transition-colors cursor-pointer ${
47
+ theme === "dark"
48
+ ? "hover:bg-gray-800 text-gray-400"
49
+ : "hover:bg-gray-100 text-gray-600"
50
+ }`}
51
+ >
52
+ <ChevronLeft className="h-6 w-6" />
53
+ </button>
54
+ </div>
55
+
56
+ <div className="flex flex-col justify-center min-h-full space-y-6 pt-8">
57
+ <div className="text-center">
58
+ <div
59
+ className={`mx-auto flex items-center justify-center transition-all duration-500 ease-out relative ${showContent ? "transform -translate-y-8" : ""}`}
60
+ >
61
+ {retryEnabled ? (
62
+ <div className={`h-24 w-24`} />
63
+ ) : (
64
+ <div
65
+ className={`animate-spin rounded-full h-24 w-24 border-b-2 ${
66
+ theme === "dark" ? "border-blue-400" : "border-blue-500"
67
+ }`}
68
+ style={{ borderTopWidth: "2px", borderBottomWidth: "2px" }}
69
+ />
70
+ )}
71
+
72
+ <div className="absolute">
73
+ <TokenImage
74
+ imageUrl={fromTokenImageUrl}
75
+ symbol={fromTokenSymbol}
76
+ chainId={fromChainId}
77
+ size={64}
78
+ />
79
+ </div>
80
+ </div>
81
+
82
+ <div
83
+ className={`transition-all duration-500 ease-out ${showContent ? "opacity-100 translate-y-0" : "opacity-0 translate-y-4"}`}
84
+ >
85
+ <h2
86
+ className={`text-xl font-bold ${theme === "dark" ? "text-white" : "text-gray-900"}`}
87
+ >
88
+ {retryEnabled ? "Try again" : "Waiting for wallet..."}
89
+ </h2>
90
+ <p
91
+ className={`mt-2 text-sm ${theme === "dark" ? "text-gray-300" : "text-gray-600"}`}
92
+ >
93
+ Please approve the request in your wallet
94
+ </p>
95
+ </div>
96
+ </div>
97
+
98
+ {/* Transaction Details */}
99
+ <div
100
+ className={`transition-all duration-500 ease-out delay-100 ${showContent ? "opacity-100 translate-y-0" : "opacity-0 translate-y-4"}`}
101
+ >
102
+ <div
103
+ className={`p-4 rounded-lg border ${
104
+ theme === "dark"
105
+ ? "bg-gray-800/50 border-gray-700"
106
+ : "bg-gray-50 border-gray-200"
107
+ }`}
108
+ >
109
+ <div className="space-y-3">
110
+ {amount && tokenSymbol && (
111
+ <div className="flex justify-between items-center">
112
+ <span
113
+ className={`text-xs ${theme === "dark" ? "text-gray-400" : "text-gray-600"}`}
114
+ >
115
+ Amount:
116
+ </span>
117
+ <span
118
+ className={`font-medium text-xs ${theme === "dark" ? "text-white" : "text-gray-900"}`}
119
+ >
120
+ {amount} {tokenSymbol}
121
+ </span>
122
+ </div>
123
+ )}
124
+
125
+ {recipient && (
126
+ <div className="flex justify-between items-center">
127
+ <span
128
+ className={`text-xs ${theme === "dark" ? "text-gray-400" : "text-gray-600"}`}
129
+ >
130
+ To (Intent):
131
+ </span>
132
+ <a
133
+ href={getExplorerUrlForAddress({
134
+ address: recipient,
135
+ chainId: fromChainId,
136
+ })}
137
+ target="_blank"
138
+ rel="noopener noreferrer"
139
+ className={`font-mono text-xs hover:underline ${theme === "dark" ? "text-gray-300" : "text-gray-700"}`}
140
+ >
141
+ {recipient.slice(0, 6)}...{recipient.slice(-4)}
142
+ </a>
143
+ </div>
144
+ )}
145
+ </div>
146
+ </div>
147
+ </div>
148
+
149
+ {/* Retry Button */}
150
+ {retryEnabled && onRetry && (
151
+ <div
152
+ className={`transition-all duration-500 ease-out delay-300 ${showContent ? "opacity-100 translate-y-0" : "opacity-0 translate-y-4"}`}
153
+ >
154
+ <button
155
+ type="button"
156
+ onClick={onRetry}
157
+ className={`w-full px-4 py-2 rounded-lg font-medium transition-colors cursor-pointer ${
158
+ theme === "dark"
159
+ ? "bg-blue-600 hover:bg-blue-700 text-white"
160
+ : "bg-blue-500 hover:bg-blue-600 text-white"
161
+ }`}
162
+ >
163
+ Try Again
164
+ </button>
165
+ </div>
166
+ )}
167
+ </div>
168
+ </div>
169
+ )
170
+ }
171
+
172
+ export default WalletConfirmation
@@ -0,0 +1,5 @@
1
+ export const defaultPrivyAppId = "cmc25oq0a01dvl40mn0ex5e1o"
2
+ export const defaultPrivyClientId =
3
+ "client-WY6MrvK6dbp1FSBPU1DKa6ymAHrJBPYxyFX39dFCCd56L"
4
+
5
+ export const SITE_URL = "https://trails.build/"
@@ -0,0 +1,59 @@
1
+ import type { SequenceAPIClient } from "@0xsequence/trails-api"
2
+ import { useQuery } from "@tanstack/react-query"
3
+ import { useTokenPrice } from "../../prices.js"
4
+ import { formatUsdValue } from "../../tokenBalances.js"
5
+ import { useTokenAddress } from "../../tokens.js"
6
+
7
+ type UseAmountUsdProps = {
8
+ amount?: string | null
9
+ token?: string | null
10
+ chainId?: number | null
11
+ apiClient: SequenceAPIClient
12
+ }
13
+
14
+ export function useAmountUsd({
15
+ amount,
16
+ token,
17
+ chainId,
18
+ apiClient,
19
+ }: UseAmountUsdProps): {
20
+ amountUsd: number | null
21
+ amountUsdFormatted: string
22
+ } {
23
+ const isTokenAddress = token?.startsWith("0x")
24
+ const resolvedTokenAddress = useTokenAddress({
25
+ chainId,
26
+ tokenSymbol: isTokenAddress ? undefined : token,
27
+ })
28
+ const tokenAddress = isTokenAddress ? token : resolvedTokenAddress
29
+
30
+ const { tokenPrice } = useTokenPrice(
31
+ token && tokenAddress && chainId
32
+ ? {
33
+ tokenId: token,
34
+ contractAddress: tokenAddress,
35
+ chainId: Number(chainId),
36
+ }
37
+ : null,
38
+ apiClient,
39
+ )
40
+
41
+ const { data: amountUsd } = useQuery({
42
+ queryKey: ["amountUsd", amount, tokenPrice?.price?.value],
43
+ queryFn: () => {
44
+ if (!amount || !tokenPrice?.price?.value) {
45
+ return null
46
+ }
47
+
48
+ const tokenPriceValue = tokenPrice.price.value
49
+ const value = Number(amount) * tokenPriceValue
50
+ return value
51
+ },
52
+ enabled: !!amount && !!tokenPrice?.price?.value,
53
+ })
54
+
55
+ return {
56
+ amountUsd: amountUsd || null,
57
+ amountUsdFormatted: formatUsdValue(amountUsd || 0),
58
+ }
59
+ }