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,492 @@
1
+ import { ContractVerificationStatus } from "@0xsequence/indexer";
2
+ import { QueryClient, useQuery } from "@tanstack/react-query";
3
+ import { useEffect, useState } from "react";
4
+ import { formatUnits, parseUnits, zeroAddress } from "viem";
5
+ import { useAPIClient } from "./apiClient.js";
6
+ import { useIndexerGatewayClient } from "./indexerClient.js";
7
+ import { getTokenPrices, useTokenPrices } from "./prices.js";
8
+ // Initialize query client for token balances
9
+ const tokenBalancesQueryClient = new QueryClient({
10
+ defaultOptions: {
11
+ queries: {
12
+ staleTime: 60000, // 1 minute
13
+ gcTime: 300000, // 5 minutes
14
+ retry: 2,
15
+ retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
16
+ refetchOnWindowFocus: false,
17
+ refetchOnReconnect: true,
18
+ },
19
+ },
20
+ });
21
+ // Default empty page info for query fallback
22
+ const defaultPage = { page: 1, pageSize: 10, more: false };
23
+ // Type guard for native token balance
24
+ export function isNativeToken(token) {
25
+ if ("contractAddress" in token) {
26
+ return false;
27
+ }
28
+ return true;
29
+ }
30
+ export function sortTokensByPriority(a, b) {
31
+ // First sort by USD balance if available
32
+ const aUsdBalance = a.balanceUsd ?? 0;
33
+ const bUsdBalance = b.balanceUsd ?? 0;
34
+ if (aUsdBalance !== bUsdBalance) {
35
+ return bUsdBalance - aUsdBalance; // Higher USD balance first
36
+ }
37
+ // Then sort by native token status
38
+ if (isNativeToken(a) && !isNativeToken(b))
39
+ return -1;
40
+ if (!isNativeToken(a) && isNativeToken(b))
41
+ return 1;
42
+ // Finally sort by token balance
43
+ try {
44
+ const balanceA = BigInt(a.balance);
45
+ const balanceB = BigInt(b.balance);
46
+ if (balanceA > balanceB)
47
+ return -1;
48
+ if (balanceA < balanceB)
49
+ return 1;
50
+ }
51
+ catch {
52
+ // If balance comparison fails, maintain current order
53
+ return 0;
54
+ }
55
+ return 0;
56
+ }
57
+ export function useTokenBalances(address, indexerGatewayClient, sequenceApiClient) {
58
+ // Always call hooks unconditionally to fix React rules violation
59
+ const hookIndexerClient = useIndexerGatewayClient();
60
+ const hookApiClient = useAPIClient();
61
+ // Use passed parameters if available, otherwise use hook results
62
+ const indexerClient = indexerGatewayClient ?? hookIndexerClient;
63
+ const apiClient = sequenceApiClient ?? hookApiClient;
64
+ // Fetch token balances with improved query key structure
65
+ const { data: tokenBalancesData, isLoading: isLoadingBalances, error: balanceError, } = useQuery({
66
+ queryKey: ["tokenBalances", "summary", address],
67
+ queryFn: async () => {
68
+ if (!address) {
69
+ console.warn("[trails-sdk] No account address or indexer client");
70
+ return {
71
+ balances: [],
72
+ nativeBalances: [],
73
+ page: defaultPage,
74
+ };
75
+ }
76
+ try {
77
+ const summaryFromGateway = await getTokenBalances({
78
+ account: address,
79
+ indexerGatewayClient: indexerClient,
80
+ });
81
+ return {
82
+ page: summaryFromGateway.page,
83
+ balances: summaryFromGateway.balances.flatMap((b) => b.results),
84
+ nativeBalances: summaryFromGateway.nativeBalances.flatMap((b) => b.results),
85
+ };
86
+ }
87
+ catch (error) {
88
+ console.error("[trails-sdk] Failed to fetch token balances:", error);
89
+ throw error;
90
+ }
91
+ },
92
+ enabled: !!address && !!indexerClient,
93
+ staleTime: 60000, // 1 minute
94
+ gcTime: 300000, // 5 minutes cache time
95
+ retry: (failureCount, error) => {
96
+ // Don't retry 404s or network errors after 3 attempts
97
+ if (error && "status" in error && error.status === 404)
98
+ return false;
99
+ if (failureCount < 3)
100
+ return true;
101
+ return false;
102
+ },
103
+ retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000), // Exponential backoff
104
+ refetchOnWindowFocus: false, // Prevent refetch on window focus
105
+ refetchOnReconnect: true, // Refetch on reconnect
106
+ refetchInterval: 300000, // Background refetch every 5 minutes
107
+ refetchIntervalInBackground: true,
108
+ });
109
+ const { tokenPrices, isLoadingTokenPrices } = useTokenPrices((tokenBalancesData?.balances ?? [])
110
+ .map((b) => {
111
+ return {
112
+ tokenId: b.contractInfo?.symbol,
113
+ contractAddress: b.contractAddress,
114
+ chainId: b.contractInfo?.chainId,
115
+ };
116
+ })
117
+ .concat((tokenBalancesData?.nativeBalances ?? []).map((b) => {
118
+ return {
119
+ tokenId: b.symbol,
120
+ contractAddress: zeroAddress,
121
+ chainId: b.chainId,
122
+ };
123
+ })) ?? [], apiClient);
124
+ const { data: sortedTokens = [], isLoading: isLoadingSortedTokens } = useQuery({
125
+ queryKey: [
126
+ "tokenBalances",
127
+ "sorted",
128
+ address,
129
+ tokenBalancesData?.page?.page,
130
+ tokenPrices?.length,
131
+ ],
132
+ queryFn: () => {
133
+ if (!tokenBalancesData || !tokenPrices) {
134
+ return [];
135
+ }
136
+ const balances = [
137
+ ...tokenBalancesData.nativeBalances,
138
+ ...tokenBalancesData.balances,
139
+ ].filter((token) => {
140
+ try {
141
+ return BigInt(token.balance) > 0n;
142
+ }
143
+ catch {
144
+ return false;
145
+ }
146
+ });
147
+ // First pass: add prices to all tokens
148
+ const tokensWithPrices = balances.map((token) => {
149
+ const isNative = isNativeToken(token);
150
+ const priceData = tokenPrices.find((p) => p.token.contractAddress ===
151
+ (isNative ? zeroAddress : token.contractAddress) &&
152
+ p.token.chainId ===
153
+ (isNative ? token.chainId : token.contractInfo?.chainId));
154
+ if (priceData?.price) {
155
+ const tokenWithPrice = { ...token, price: priceData.price };
156
+ tokenWithPrice.balanceUsd = getTokenBalanceUsd(token, priceData.price);
157
+ tokenWithPrice.balanceUsdFormatted = getTokenBalanceUsdFormatted(token, priceData.price);
158
+ return tokenWithPrice;
159
+ }
160
+ return token;
161
+ });
162
+ return tokensWithPrices.sort(sortTokensByPriority);
163
+ },
164
+ enabled: !isLoadingBalances &&
165
+ !isLoadingTokenPrices &&
166
+ !!tokenBalancesData &&
167
+ !!tokenPrices,
168
+ staleTime: 30000, // 30 seconds for sorted tokens
169
+ gcTime: 120000, // 2 minutes cache time
170
+ refetchOnWindowFocus: false,
171
+ });
172
+ return {
173
+ tokenBalancesData,
174
+ isLoadingBalances,
175
+ isLoadingPrices: isLoadingTokenPrices,
176
+ isLoadingSortedTokens: isLoadingSortedTokens || isLoadingBalances || isLoadingTokenPrices,
177
+ balanceError,
178
+ sortedTokens,
179
+ };
180
+ }
181
+ // Helper to format balance
182
+ export function formatBalance(balance, decimals = 18) {
183
+ try {
184
+ const formatted = formatUnits(BigInt(balance), decimals);
185
+ return formatValue(formatted);
186
+ }
187
+ catch (e) {
188
+ console.error("[trails-sdk] Error formatting balance:", e);
189
+ return balance;
190
+ }
191
+ }
192
+ export function getTokenBalanceUsd(token, tokenPrice) {
193
+ const isNative = isNativeToken(token);
194
+ const formattedBalance = formatBalance(token.balance, isNative ? 18 : token.contractInfo?.decimals);
195
+ const priceUsd = Number(tokenPrice.value) ?? 0;
196
+ return Number(formattedBalance) * priceUsd;
197
+ }
198
+ export function formatValue(value) {
199
+ try {
200
+ return Number(value).toLocaleString(undefined, {
201
+ maximumFractionDigits: 5,
202
+ minimumFractionDigits: 2,
203
+ });
204
+ }
205
+ catch (err) {
206
+ console.error("[trails-sdk] Error formatting value:", err);
207
+ }
208
+ return value.toString();
209
+ }
210
+ export function formatUsdValue(value = 0) {
211
+ return Intl.NumberFormat("en-US", {
212
+ style: "currency",
213
+ currency: "USD",
214
+ maximumFractionDigits: 2,
215
+ minimumFractionDigits: 2,
216
+ }).format(Number(value));
217
+ }
218
+ export function getTokenBalanceUsdFormatted(token, tokenPrice) {
219
+ const balanceUsd = getTokenBalanceUsd(token, tokenPrice);
220
+ return formatUsdValue(balanceUsd);
221
+ }
222
+ export function useTokenBalanceUsdFormat(token, tokenPrice) {
223
+ const [format, setFormat] = useState("");
224
+ useEffect(() => {
225
+ const formattedBalance = getTokenBalanceUsdFormatted(token, tokenPrice);
226
+ setFormat(formattedBalance);
227
+ }, [token, tokenPrice]);
228
+ return format;
229
+ }
230
+ // Separate fetch function for token balances summary
231
+ export async function fetchGetTokenBalancesSummary({ account, indexerGatewayClient, }) {
232
+ if (!account || !indexerGatewayClient) {
233
+ throw new Error("Account address and indexer client are required");
234
+ }
235
+ try {
236
+ const summaryFromGateway = await indexerGatewayClient.getTokenBalancesSummary({
237
+ filter: {
238
+ accountAddresses: [account],
239
+ contractStatus: ContractVerificationStatus.VERIFIED,
240
+ contractTypes: ["ERC20"],
241
+ omitNativeBalances: false,
242
+ },
243
+ });
244
+ return summaryFromGateway;
245
+ }
246
+ catch (error) {
247
+ console.error("[trails-sdk] Failed to fetch token balances summary:", error);
248
+ throw error;
249
+ }
250
+ }
251
+ export async function getTokenBalances({ account, indexerGatewayClient, }) {
252
+ return tokenBalancesQueryClient.fetchQuery({
253
+ queryKey: ["tokenBalances", "summary", account],
254
+ queryFn: () => fetchGetTokenBalancesSummary({ account, indexerGatewayClient }),
255
+ staleTime: 60000, // 1 minute
256
+ gcTime: 300000, // 5 minutes
257
+ });
258
+ }
259
+ // Cache invalidation utility function
260
+ export function invalidateTokenBalancesCache(account) {
261
+ if (account) {
262
+ // Invalidate specific account's token balances
263
+ tokenBalancesQueryClient.invalidateQueries({
264
+ queryKey: ["tokenBalances", account],
265
+ });
266
+ }
267
+ else {
268
+ // Invalidate all token balance queries
269
+ tokenBalancesQueryClient.invalidateQueries({
270
+ queryKey: ["tokenBalances"],
271
+ });
272
+ }
273
+ }
274
+ export async function getTokenBalancesFlatArray({ account, indexerGatewayClient, }) {
275
+ const summaryFromGateway = await getTokenBalances({
276
+ account,
277
+ indexerGatewayClient,
278
+ });
279
+ const tokenMap = new Map();
280
+ for (const balance of summaryFromGateway.balances) {
281
+ ;
282
+ balance.results.forEach((b) => {
283
+ tokenMap.set(`${b.contractAddress}-${b.contractInfo?.chainId}-${b.contractInfo?.symbol}`, {
284
+ ...b,
285
+ contractAddress: b.contractAddress ?? zeroAddress,
286
+ tokenId: b.contractInfo?.symbol,
287
+ });
288
+ });
289
+ }
290
+ for (const balance of summaryFromGateway.nativeBalances) {
291
+ ;
292
+ balance.results.forEach((b) => {
293
+ tokenMap.set(`${b.contractAddress}-${b.chainId}-${b.symbol}`, {
294
+ ...b,
295
+ contractAddress: b.contractAddress ?? zeroAddress,
296
+ tokenId: b.symbol,
297
+ });
298
+ });
299
+ }
300
+ const tokens = Array.from(tokenMap.values());
301
+ return tokens;
302
+ }
303
+ export async function getTokenBalancesWithPrices({ account, indexerGatewayClient, apiClient, }) {
304
+ const tokens = await getTokenBalancesFlatArray({
305
+ account,
306
+ indexerGatewayClient,
307
+ });
308
+ const tokenPrices = await getTokenPrices(apiClient, tokens);
309
+ const balancesWithPrices = tokens.map((b) => {
310
+ const price = tokenPrices.find((p) => {
311
+ const isSameChain = p.token.chainId === b.chainId;
312
+ let isSameToken = p.token.contractAddress === b.contractAddress;
313
+ if (!b.contractAddress) {
314
+ isSameToken =
315
+ p.token.contractAddress === zeroAddress || !p.token.contractAddress;
316
+ }
317
+ return isSameChain && isSameToken;
318
+ });
319
+ return {
320
+ ...b,
321
+ price: price?.price,
322
+ balanceUsd: price?.price
323
+ ? getTokenBalanceUsd(b, price?.price)
324
+ : undefined,
325
+ balanceUsdFormatted: price?.price
326
+ ? getTokenBalanceUsdFormatted(b, price?.price)
327
+ : undefined,
328
+ };
329
+ });
330
+ return {
331
+ balances: balancesWithPrices,
332
+ };
333
+ }
334
+ export function useAccountTokenBalance({ account, token, chainId, indexerGatewayClient, apiClient, }) {
335
+ const { data: tokenBalance, isLoading: isLoadingTokenBalance } = useQuery({
336
+ queryKey: ["tokenBalances", "balances", account],
337
+ queryFn: async () => {
338
+ if (!account ||
339
+ !indexerGatewayClient ||
340
+ !apiClient ||
341
+ !token ||
342
+ !chainId) {
343
+ return null;
344
+ }
345
+ const { balances } = await getTokenBalancesWithPrices({
346
+ account,
347
+ indexerGatewayClient,
348
+ apiClient,
349
+ });
350
+ const tokenBalance = balances.find((b) => b.chainId === chainId &&
351
+ (b.contractAddress?.toLowerCase() === token.toLowerCase() ||
352
+ (!b.contractAddress && token === zeroAddress)));
353
+ return tokenBalance;
354
+ },
355
+ });
356
+ return {
357
+ tokenBalance,
358
+ isLoadingTokenBalance,
359
+ };
360
+ }
361
+ export async function getHasSufficientBalanceToken({ account, token, amount, chainId, indexerGatewayClient, apiClient, }) {
362
+ const { balances } = await getTokenBalancesWithPrices({
363
+ account,
364
+ indexerGatewayClient,
365
+ apiClient,
366
+ });
367
+ const tokenBalance = balances.find((b) => b.chainId === chainId &&
368
+ (b.contractAddress?.toLowerCase() === token.toLowerCase() ||
369
+ (!b.contractAddress && token === zeroAddress)));
370
+ if (!tokenBalance) {
371
+ return false;
372
+ }
373
+ const decimals = tokenBalance?.contractInfo?.decimals ?? 18;
374
+ return tokenBalance?.balance
375
+ ? BigInt(tokenBalance.balance) >= parseUnits(amount, decimals)
376
+ : false;
377
+ }
378
+ export function useHasSufficientBalanceToken(account, token, amount, chainId) {
379
+ const indexerGatewayClient = useIndexerGatewayClient();
380
+ const apiClient = useAPIClient();
381
+ const { data: hasSufficientBalanceToken, isLoading: isLoadingHasSufficientBalanceToken, } = useQuery({
382
+ queryKey: ["tokenBalances", "sufficient", account, token, amount, chainId],
383
+ queryFn: () => account
384
+ ? getHasSufficientBalanceToken({
385
+ account: account,
386
+ token: token,
387
+ amount: amount,
388
+ chainId: chainId,
389
+ indexerGatewayClient: indexerGatewayClient,
390
+ apiClient: apiClient,
391
+ })
392
+ : null,
393
+ enabled: !!account && !!token && !!amount && !!chainId,
394
+ staleTime: 45000, // 45 seconds
395
+ gcTime: 180000, // 3 minutes cache time
396
+ retry: (failureCount, error) => {
397
+ if (error && "status" in error && error.status === 404)
398
+ return false;
399
+ if (failureCount < 2)
400
+ return true;
401
+ return false;
402
+ },
403
+ retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
404
+ refetchOnWindowFocus: false,
405
+ });
406
+ return {
407
+ hasSufficientBalanceToken: hasSufficientBalanceToken || false,
408
+ isLoadingHasSufficientBalanceToken,
409
+ };
410
+ }
411
+ export async function getHasSufficientBalanceUsd({ account, targetAmountUsd, indexerGatewayClient, apiClient, }) {
412
+ const totalBalanceUsd = await getAccountTotalBalanceUsd({
413
+ account,
414
+ indexerGatewayClient,
415
+ apiClient,
416
+ });
417
+ return totalBalanceUsd >= Number(targetAmountUsd);
418
+ }
419
+ export function useHasSufficientBalanceUsd(account, targetAmountUsd) {
420
+ const indexerGatewayClient = useIndexerGatewayClient();
421
+ const apiClient = useAPIClient();
422
+ const { data: hasSufficientBalanceUsd, isLoading: isLoadingHasSufficientBalanceUsd, error: hasSufficientBalanceUsdError, } = useQuery({
423
+ queryKey: ["tokenBalances", "sufficientUsd", account, targetAmountUsd],
424
+ queryFn: () => account && targetAmountUsd
425
+ ? getHasSufficientBalanceUsd({
426
+ account: account,
427
+ targetAmountUsd: targetAmountUsd,
428
+ indexerGatewayClient: indexerGatewayClient,
429
+ apiClient: apiClient,
430
+ })
431
+ : false,
432
+ enabled: !!account && !!targetAmountUsd,
433
+ staleTime: 45000, // 45 seconds
434
+ gcTime: 180000, // 3 minutes cache time
435
+ retry: (failureCount, error) => {
436
+ if (error && "status" in error && error.status === 404)
437
+ return false;
438
+ if (failureCount < 2)
439
+ return true;
440
+ return false;
441
+ },
442
+ retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
443
+ refetchOnWindowFocus: false,
444
+ });
445
+ return {
446
+ hasSufficientBalanceUsd: hasSufficientBalanceUsd || false,
447
+ isLoadingHasSufficientBalanceUsd: isLoadingHasSufficientBalanceUsd || !targetAmountUsd || !account,
448
+ hasSufficientBalanceUsdError,
449
+ };
450
+ }
451
+ export async function getAccountTotalBalanceUsd({ account, indexerGatewayClient, apiClient, }) {
452
+ const { balances } = await getTokenBalancesWithPrices({
453
+ account,
454
+ indexerGatewayClient,
455
+ apiClient,
456
+ });
457
+ return balances.reduce((acc, b) => acc + (b.balanceUsd ?? 0), 0);
458
+ }
459
+ export function useAccountTotalBalanceUsd(account) {
460
+ const indexerGatewayClient = useIndexerGatewayClient();
461
+ const apiClient = useAPIClient();
462
+ const { data: totalBalanceUsd, isLoading: isLoadingTotalBalanceUsd } = useQuery({
463
+ queryKey: ["tokenBalances", "totalUsd", account],
464
+ queryFn: () => account
465
+ ? getAccountTotalBalanceUsd({
466
+ account: account,
467
+ indexerGatewayClient: indexerGatewayClient,
468
+ apiClient: apiClient,
469
+ })
470
+ : null,
471
+ enabled: !!account,
472
+ staleTime: 60000, // 1 minute
473
+ gcTime: 300000, // 5 minutes cache time
474
+ retry: (failureCount, error) => {
475
+ if (error && "status" in error && error.status === 404)
476
+ return false;
477
+ if (failureCount < 2)
478
+ return true;
479
+ return false;
480
+ },
481
+ retryDelay: (attemptIndex) => Math.min(1000 * 2 ** attemptIndex, 30000),
482
+ refetchOnWindowFocus: false,
483
+ refetchOnReconnect: true,
484
+ refetchInterval: 300000, // Background refetch every 5 minutes
485
+ refetchIntervalInBackground: true,
486
+ });
487
+ return {
488
+ totalBalanceUsd: totalBalanceUsd || 0,
489
+ isLoadingTotalBalanceUsd,
490
+ totalBalanceUsdFormatted: formatUsdValue(totalBalanceUsd || 0),
491
+ };
492
+ }
@@ -0,0 +1,50 @@
1
+ export type SupportedToken = {
2
+ id: string;
3
+ symbol: string;
4
+ name: string;
5
+ contractAddress: string;
6
+ decimals: number;
7
+ chainId: number;
8
+ chainName: string;
9
+ imageUrl: string;
10
+ };
11
+ export declare function getTokenImageUrlOrFallback(chainId: number, contractAddress: string): Promise<string>;
12
+ export declare function getSupportedTokens(): Promise<SupportedToken[]>;
13
+ export declare function useSupportedTokens({ chainId }?: {
14
+ chainId?: number;
15
+ }): {
16
+ supportedTokens: SupportedToken[];
17
+ isLoadingTokens: boolean;
18
+ };
19
+ export declare function getSourceTokenList(): Promise<string[]>;
20
+ export declare function useSourceTokenList(): string[];
21
+ export declare const tokensToPrefix: Record<string, string>;
22
+ export declare const tokenNamePrefixes: Record<string, string>;
23
+ export declare function getFormatttedTokenName(currentName: string, tokenSymbol: string, chainId?: number): string;
24
+ export declare function getTokenAddress(chainId: number, tokenSymbol: string): Promise<string>;
25
+ type UseTokenAddressProps = {
26
+ chainId?: number | null;
27
+ tokenSymbol?: string | null;
28
+ };
29
+ export declare function useTokenAddress({ chainId, tokenSymbol, }: UseTokenAddressProps): string | null;
30
+ export declare function getTokenImageUrl(chainId: number, contractAddress: string): string;
31
+ export declare function useTokenImageUrl(chainId: number | undefined, contractAddress: string | undefined): {
32
+ imageUrl: string;
33
+ isLoading: boolean;
34
+ error: Error | null;
35
+ hasImage: boolean;
36
+ };
37
+ export declare function useTokenList(): {
38
+ tokens: SupportedToken[];
39
+ isLoadingTokens: boolean;
40
+ };
41
+ export declare function useTokenInfo({ address, chainId, }: {
42
+ address: string;
43
+ chainId?: number;
44
+ }): {
45
+ tokenInfo: Partial<SupportedToken> | null;
46
+ isLoading: boolean;
47
+ error: Error | null;
48
+ };
49
+ export {};
50
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AA4HD,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CA4CjB;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CA4BpE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG;IAC1E,eAAe,EAAE,cAAc,EAAE,CAAA;IACjC,eAAe,EAAE,OAAO,CAAA;CACzB,CAqBA;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG5D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAU7C;AAeD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIjD,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIpD,CAAA;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAqBR;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,mBAiBzE;AAED,KAAK,oBAAoB,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B,CAAA;AAED,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,WAAW,GACZ,EAAE,oBAAoB,iBAatB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAGxE;AAGD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,eAAe,EAAE,MAAM,GAAG,SAAS;;;;;EAwBpC;AAED,wBAAgB,YAAY;;;EAO3B;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,GAAG;IACF,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAAA;IACzC,SAAS,EAAE,OAAO,CAAA;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB,CA4DA"}