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.
- package/LICENSE +202 -0
- package/README.md +42 -0
- package/dist/abi.d.ts +37 -0
- package/dist/abi.d.ts.map +1 -0
- package/dist/abi.js +36 -0
- package/dist/apiClient.d.ts +9 -0
- package/dist/apiClient.d.ts.map +1 -0
- package/dist/apiClient.js +18 -0
- package/dist/buffer.d.ts +3 -0
- package/dist/buffer.d.ts.map +1 -0
- package/dist/buffer.js +8 -0
- package/dist/cctp.d.ts +84 -0
- package/dist/cctp.d.ts.map +1 -0
- package/dist/cctp.js +401 -0
- package/dist/chainSwitch.d.ts +7 -0
- package/dist/chainSwitch.d.ts.map +1 -0
- package/dist/chainSwitch.js +33 -0
- package/dist/chains.d.ts +13 -0
- package/dist/chains.d.ts.map +1 -0
- package/dist/chains.js +95 -0
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +16 -0
- package/dist/encoders.d.ts +7 -0
- package/dist/encoders.d.ts.map +1 -0
- package/dist/encoders.js +8 -0
- package/dist/error.d.ts +2 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +12 -0
- package/dist/explorer.d.ts +12 -0
- package/dist/explorer.d.ts.map +1 -0
- package/dist/explorer.js +18 -0
- package/dist/gasless.d.ts +116 -0
- package/dist/gasless.d.ts.map +1 -0
- package/dist/gasless.js +297 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/indexerClient.d.ts +9 -0
- package/dist/indexerClient.d.ts.map +1 -0
- package/dist/indexerClient.js +18 -0
- package/dist/intents.d.ts +83 -0
- package/dist/intents.d.ts.map +1 -0
- package/dist/intents.js +288 -0
- package/dist/metaTxnMonitor.d.ts +14 -0
- package/dist/metaTxnMonitor.d.ts.map +1 -0
- package/dist/metaTxnMonitor.js +121 -0
- package/dist/metaTxns.d.ts +6 -0
- package/dist/metaTxns.d.ts.map +1 -0
- package/dist/metaTxns.js +4 -0
- package/dist/paymasterSend.d.ts +90 -0
- package/dist/paymasterSend.d.ts.map +1 -0
- package/dist/paymasterSend.js +329 -0
- package/dist/preconditions.d.ts +11 -0
- package/dist/preconditions.d.ts.map +1 -0
- package/dist/preconditions.js +29 -0
- package/dist/prepareSend.d.ts +102 -0
- package/dist/prepareSend.d.ts.map +1 -0
- package/dist/prepareSend.js +1080 -0
- package/dist/prices.d.ts +18 -0
- package/dist/prices.d.ts.map +1 -0
- package/dist/prices.js +142 -0
- package/dist/queryParams.d.ts +9 -0
- package/dist/queryParams.d.ts.map +1 -0
- package/dist/queryParams.js +66 -0
- package/dist/relaySdk.d.ts +65 -0
- package/dist/relaySdk.d.ts.map +1 -0
- package/dist/relaySdk.js +314 -0
- package/dist/relayer.d.ts +23 -0
- package/dist/relayer.d.ts.map +1 -0
- package/dist/relayer.js +230 -0
- package/dist/sendUserOp.d.ts +140 -0
- package/dist/sendUserOp.d.ts.map +1 -0
- package/dist/sendUserOp.js +388 -0
- package/dist/sequenceWallet.d.ts +79 -0
- package/dist/sequenceWallet.d.ts.map +1 -0
- package/dist/sequenceWallet.js +374 -0
- package/dist/theme.d.ts +3 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +1 -0
- package/dist/toSimpleSmartAccount.d.ts +95 -0
- package/dist/toSimpleSmartAccount.d.ts.map +1 -0
- package/dist/toSimpleSmartAccount.js +373 -0
- package/dist/tokenBalances.d.ts +118 -0
- package/dist/tokenBalances.d.ts.map +1 -0
- package/dist/tokenBalances.js +492 -0
- package/dist/tokens.d.ts +50 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +356 -0
- package/dist/trails.d.ts +128 -0
- package/dist/trails.d.ts.map +1 -0
- package/dist/trails.js +1031 -0
- package/dist/umd/trails.min.js +12610 -0
- package/dist/umd/trails.min.js.map +1 -0
- package/dist/umd.d.ts +24 -0
- package/dist/umd.d.ts.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +9 -0
- package/dist/widget/ConstantsUtil-B-_-u8aQ.js +6 -0
- package/dist/widget/add-hVLs3ldJ.js +20 -0
- package/dist/widget/all-wallets-Cwxnx4BT.js +11 -0
- package/dist/widget/app-store-CAAVQjW0.js +22 -0
- package/dist/widget/apple-C3BSbglw.js +23 -0
- package/dist/widget/arrow-bottom-circle-BGU9MmsZ.js +16 -0
- package/dist/widget/arrow-bottom-hS_SA8Gp.js +13 -0
- package/dist/widget/arrow-left-CJZanWz7.js +13 -0
- package/dist/widget/arrow-right-C1qL8EMd.js +13 -0
- package/dist/widget/arrow-top-CbuCmbQs.js +13 -0
- package/dist/widget/bank-CXBEEGbb.js +19 -0
- package/dist/widget/bin-Dqzv3zCZ.js +9 -0
- package/dist/widget/bitcoin-4y3sovZp.js +18 -0
- package/dist/widget/browser-DyOl4_8m.js +1413 -0
- package/dist/widget/browser-t7Fh0sEU.js +19 -0
- package/dist/widget/card-Bo4CZkTs.js +19 -0
- package/dist/widget/ccip-BynehMIN.js +232 -0
- package/dist/widget/checkmark-DV6OKvnY.js +16 -0
- package/dist/widget/checkmark-bold-CAp1-IQ2.js +13 -0
- package/dist/widget/chevron-bottom-BjzsVzk9.js +13 -0
- package/dist/widget/chevron-left-CQZBDCiR.js +13 -0
- package/dist/widget/chevron-right-Dhg4zeZM.js +13 -0
- package/dist/widget/chevron-top-CDQmfJef.js +13 -0
- package/dist/widget/chrome-store-BNaC_b6w.js +66 -0
- package/dist/widget/circle-BC_GBj91.js +9 -0
- package/dist/widget/clock-BmF8-4a0.js +13 -0
- package/dist/widget/close-Bf61nZ8o.js +13 -0
- package/dist/widget/coinPlaceholder-7cZW2058.js +13 -0
- package/dist/widget/compass-CFC3yhnW.js +13 -0
- package/dist/widget/components/ChainImage.d.ts +8 -0
- package/dist/widget/components/ChainImage.d.ts.map +1 -0
- package/dist/widget/components/ChainImage.js +6 -0
- package/dist/widget/components/ConnectWallet.d.ts +18 -0
- package/dist/widget/components/ConnectWallet.d.ts.map +1 -0
- package/dist/widget/components/ConnectWallet.js +66 -0
- package/dist/widget/components/DebugScreensDropdown.d.ts +9 -0
- package/dist/widget/components/DebugScreensDropdown.d.ts.map +1 -0
- package/dist/widget/components/DebugScreensDropdown.js +40 -0
- package/dist/widget/components/FeeOptions.d.ts +17 -0
- package/dist/widget/components/FeeOptions.d.ts.map +1 -0
- package/dist/widget/components/FeeOptions.js +65 -0
- package/dist/widget/components/Footer.d.ts +9 -0
- package/dist/widget/components/Footer.d.ts.map +1 -0
- package/dist/widget/components/Footer.js +13 -0
- package/dist/widget/components/GreenCheckAnimation.d.ts +2 -0
- package/dist/widget/components/GreenCheckAnimation.d.ts.map +1 -0
- package/dist/widget/components/GreenCheckAnimation.js +74 -0
- package/dist/widget/components/Modal.d.ts +11 -0
- package/dist/widget/components/Modal.d.ts.map +1 -0
- package/dist/widget/components/Modal.js +36 -0
- package/dist/widget/components/Receipt.d.ts +13 -0
- package/dist/widget/components/Receipt.d.ts.map +1 -0
- package/dist/widget/components/Receipt.js +36 -0
- package/dist/widget/components/SendForm.d.ts +44 -0
- package/dist/widget/components/SendForm.d.ts.map +1 -0
- package/dist/widget/components/SendForm.js +177 -0
- package/dist/widget/components/TokenImage.d.ts +10 -0
- package/dist/widget/components/TokenImage.d.ts.map +1 -0
- package/dist/widget/components/TokenImage.js +8 -0
- package/dist/widget/components/TokenList.d.ts +16 -0
- package/dist/widget/components/TokenList.d.ts.map +1 -0
- package/dist/widget/components/TokenList.js +39 -0
- package/dist/widget/components/TransferPending.d.ts +11 -0
- package/dist/widget/components/TransferPending.d.ts.map +1 -0
- package/dist/widget/components/TransferPending.js +77 -0
- package/dist/widget/components/TransferPendingVertical.d.ts +18 -0
- package/dist/widget/components/TransferPendingVertical.d.ts.map +1 -0
- package/dist/widget/components/TransferPendingVertical.js +183 -0
- package/dist/widget/components/WalletConfirmation.d.ts +18 -0
- package/dist/widget/components/WalletConfirmation.d.ts.map +1 -0
- package/dist/widget/components/WalletConfirmation.js +22 -0
- package/dist/widget/config.d.ts +4 -0
- package/dist/widget/config.d.ts.map +1 -0
- package/dist/widget/config.js +3 -0
- package/dist/widget/copy-e0xXvKN0.js +20 -0
- package/dist/widget/cursor-CqM3v0xJ.js +8 -0
- package/dist/widget/cursor-transparent-CUQpdsCG.js +17 -0
- package/dist/widget/desktop-DUDGIRpM.js +14 -0
- package/dist/widget/disconnect-DUFST9QQ.js +13 -0
- package/dist/widget/discord-C1cj365Z.js +22 -0
- package/dist/widget/email-BHhmb_lX.js +703 -0
- package/dist/widget/embedded-wallet-CuuC4eah.js +467 -0
- package/dist/widget/ethereum-CfmBVfeB.js +15 -0
- package/dist/widget/etherscan-BSiynDhW.js +11 -0
- package/dist/widget/exclamation-triangle-DEiFNpHw.js +9 -0
- package/dist/widget/extension-mRmfCDxo.js +13 -0
- package/dist/widget/external-link-B4xMIVnW.js +13 -0
- package/dist/widget/facebook-CBAZStBR.js +31 -0
- package/dist/widget/farcaster-LHDEDf5S.js +17 -0
- package/dist/widget/filters-CBijuvFv.js +13 -0
- package/dist/widget/github-C3ILD420.js +23 -0
- package/dist/widget/google-CSj73POX.js +23 -0
- package/dist/widget/help-circle-2hdG5IdB.js +17 -0
- package/dist/widget/hooks/useAmountUsd.d.ts +13 -0
- package/dist/widget/hooks/useAmountUsd.d.ts.map +1 -0
- package/dist/widget/hooks/useAmountUsd.js +35 -0
- package/dist/widget/hooks/useSendForm.d.ts +125 -0
- package/dist/widget/hooks/useSendForm.d.ts.map +1 -0
- package/dist/widget/hooks/useSendForm.js +450 -0
- package/dist/widget/hooks/useTokenList.d.ts +52 -0
- package/dist/widget/hooks/useTokenList.d.ts.map +1 -0
- package/dist/widget/hooks/useTokenList.js +252 -0
- package/dist/widget/id-ByYSrwsd.js +17 -0
- package/dist/widget/if-defined-DRXJEhv7.js +752 -0
- package/dist/widget/image-C90L4Rf6.js +9 -0
- package/dist/widget/index-B3SlQ9v3.js +46 -0
- package/dist/widget/index-B8LPuLXQ.js +78 -0
- package/dist/widget/index-BDbworWA.js +171 -0
- package/dist/widget/index-BTlDgFSK.js +98 -0
- package/dist/widget/index-BUCcjXbd.js +306 -0
- package/dist/widget/index-BZ34edi2.js +1055 -0
- package/dist/widget/index-BiCU29wK.js +147 -0
- package/dist/widget/index-BlmqIKsY.js +266 -0
- package/dist/widget/index-BlviH5nG.js +55 -0
- package/dist/widget/index-Bwd5X3fS.js +8306 -0
- package/dist/widget/index-C5gmknHK.js +78 -0
- package/dist/widget/index-CD6dBcRj.js +76 -0
- package/dist/widget/index-CDlhy529.js +63 -0
- package/dist/widget/index-CHXa5ke-.js +59 -0
- package/dist/widget/index-CK94R-H7.js +22498 -0
- package/dist/widget/index-CQzo3m3x.js +182 -0
- package/dist/widget/index-CRT8cAwG.js +325 -0
- package/dist/widget/index-CY7Lt2Yu.js +310 -0
- package/dist/widget/index-CiKfAu1E.js +79 -0
- package/dist/widget/index-CkCu6rMi.js +258 -0
- package/dist/widget/index-CngLTu_R.js +517 -0
- package/dist/widget/index-CsMV8-em.js +2577 -0
- package/dist/widget/index-Cu2Wva8v.js +200 -0
- package/dist/widget/index-DKBxLTEF.js +240 -0
- package/dist/widget/index-DQEVT3dx.js +511 -0
- package/dist/widget/index-DU2HcCis.js +200 -0
- package/dist/widget/index-DutZGWNW.js +321 -0
- package/dist/widget/index-O0glArmc.js +182 -0
- package/dist/widget/index-O8FmRjKe.js +63719 -0
- package/dist/widget/index-RtKXrB6I.js +576 -0
- package/dist/widget/index-TIYtS0gE.js +88 -0
- package/dist/widget/index-dQNJvWHs.js +66 -0
- package/dist/widget/index-wmEwdsq7.js +909 -0
- package/dist/widget/index.d.ts +3 -0
- package/dist/widget/index.d.ts.map +1 -0
- package/dist/widget/index.js +2 -0
- package/dist/widget/info-DMPChDjV.js +8 -0
- package/dist/widget/info-circle-DAvS_7nY.js +17 -0
- package/dist/widget/lightbulb-DnZ9mNEs.js +8 -0
- package/dist/widget/lit-html-BRjl1r6K.js +243 -0
- package/dist/widget/mail-DpaVSOP8.js +13 -0
- package/dist/widget/mobile-CRvdyu7I.js +14 -0
- package/dist/widget/more-C5VqW9PR.js +16 -0
- package/dist/widget/network-placeholder-CZ0vApma.js +19 -0
- package/dist/widget/nftPlaceholder-7jjIK2bT.js +13 -0
- package/dist/widget/off-4mHjJLLX.js +9 -0
- package/dist/widget/onramp-Bc0ozVsw.js +929 -0
- package/dist/widget/play-store-Uocul8nC.js +37 -0
- package/dist/widget/plus-DrYF7siO.js +18 -0
- package/dist/widget/prepareSend-BQJmzM5B.js +54987 -0
- package/dist/widget/qr-code-DcnGMUB3.js +11 -0
- package/dist/widget/receive-fvIVd7R_.js +184 -0
- package/dist/widget/recycle-horizontal-DrDwXC4D.js +14 -0
- package/dist/widget/ref-CXNmEjML.js +41 -0
- package/dist/widget/refresh-OK9lIPLS.js +13 -0
- package/dist/widget/reown-logo-C-Qn7mS3.js +17 -0
- package/dist/widget/search-DZqv1oKg.js +13 -0
- package/dist/widget/send-CJlmI-xe.js +1039 -0
- package/dist/widget/send-otoEC8uU.js +20 -0
- package/dist/widget/socials-BJciurWF.js +599 -0
- package/dist/widget/solana-Bv5Hs_0T.js +18 -0
- package/dist/widget/swapHorizontal-BzOPGV37.js +13 -0
- package/dist/widget/swapHorizontalBold-axyHnSmj.js +13 -0
- package/dist/widget/swapHorizontalMedium-C6YOPfPz.js +21 -0
- package/dist/widget/swapHorizontalRoundedBold-yVcLbWNT.js +13 -0
- package/dist/widget/swapVertical-BDjxt9pE.js +13 -0
- package/dist/widget/swaps-DEWNj4kd.js +1637 -0
- package/dist/widget/telegram-BQJD7dlP.js +21 -0
- package/dist/widget/three-dots-DW9jmSMG.js +10 -0
- package/dist/widget/transactions-uCseGQQt.js +38 -0
- package/dist/widget/twitch-XugxDfOE.js +23 -0
- package/dist/widget/twitterIcon-DQVObQUL.js +11 -0
- package/dist/widget/types.d.ts +51 -0
- package/dist/widget/types.d.ts.map +1 -0
- package/dist/widget/types.js +1 -0
- package/dist/widget/verify-DpMYHxLf.js +13 -0
- package/dist/widget/verify-filled-KpEL6ZJ_.js +13 -0
- package/dist/widget/w3m-modal-C8e-6Kba.js +1047 -0
- package/dist/widget/wallet-D8ssEB0o.js +13 -0
- package/dist/widget/wallet-placeholder-HtAy21Wc.js +19 -0
- package/dist/widget/walletconnect-Bp_4XfrY.js +37 -0
- package/dist/widget/warning-circle-FgYS7P7n.js +17 -0
- package/dist/widget/widget/index.js +7 -0
- package/dist/widget/widget.d.ts +47 -0
- package/dist/widget/widget.d.ts.map +1 -0
- package/dist/widget/widget.js +932 -0
- package/dist/widget/x-DlZBoP9k.js +17 -0
- package/dist/widget/x-mark-Ba9pt-_h.js +8 -0
- package/package.json +102 -8
- package/src/abi.ts +38 -0
- package/src/apiClient.ts +32 -0
- package/src/buffer.ts +10 -0
- package/src/cctp.ts +579 -0
- package/src/chainSwitch.ts +55 -0
- package/src/chains.ts +124 -0
- package/src/constants.ts +26 -0
- package/src/encoders.ts +20 -0
- package/src/error.ts +15 -0
- package/src/explorer.ts +37 -0
- package/src/gasless.ts +545 -0
- package/src/index.ts +48 -0
- package/src/indexerClient.ts +36 -0
- package/src/intents.ts +537 -0
- package/src/metaTxnMonitor.ts +163 -0
- package/src/metaTxns.ts +21 -0
- package/src/paymasterSend.ts +503 -0
- package/src/preconditions.ts +52 -0
- package/src/prepareSend.ts +1849 -0
- package/src/prices.ts +186 -0
- package/src/queryParams.ts +80 -0
- package/src/relaySdk.ts +481 -0
- package/src/relayer.ts +255 -0
- package/src/sendUserOp.ts +570 -0
- package/src/sequenceWallet.ts +579 -0
- package/src/theme.ts +2 -0
- package/src/toSimpleSmartAccount.ts +567 -0
- package/src/tokenBalances.ts +760 -0
- package/src/tokens.ts +471 -0
- package/src/trails.ts +1591 -0
- package/src/types.d.ts +11 -0
- package/src/umd.tsx +49 -0
- package/src/utils.ts +16 -0
- package/src/vite-env.d.ts +4 -0
- package/src/widget/assets/MetaMask-icon-fox-with-margins.svg +31 -0
- package/src/widget/assets/MetaMask-icon-fox.svg +26 -0
- package/src/widget/assets/MetaMask-logo-black.svg +3 -0
- package/src/widget/assets/MetaMask-logo-white.svg +16 -0
- package/src/widget/assets/Privy_Brandmark_Black.svg +9 -0
- package/src/widget/assets/Privy_Brandmark_White.svg +9 -0
- package/src/widget/assets/Trails-logo-black.svg +11 -0
- package/src/widget/assets/Trails-logo-white.svg +11 -0
- package/src/widget/components/ChainImage.tsx +28 -0
- package/src/widget/components/ConnectWallet.tsx +206 -0
- package/src/widget/components/DebugScreensDropdown.tsx +88 -0
- package/src/widget/components/FeeOptions.tsx +199 -0
- package/src/widget/components/Footer.tsx +51 -0
- package/src/widget/components/GreenCheckAnimation.tsx +119 -0
- package/src/widget/components/Modal.tsx +97 -0
- package/src/widget/components/Receipt.tsx +237 -0
- package/src/widget/components/SendForm.tsx +695 -0
- package/src/widget/components/TokenImage.tsx +37 -0
- package/src/widget/components/TokenList.tsx +287 -0
- package/src/widget/components/TransferPending.tsx +204 -0
- package/src/widget/components/TransferPendingVertical.tsx +412 -0
- package/src/widget/components/WalletConfirmation.tsx +172 -0
- package/src/widget/config.ts +5 -0
- package/src/widget/hooks/useAmountUsd.ts +59 -0
- package/src/widget/hooks/useSendForm.ts +715 -0
- package/src/widget/hooks/useTokenList.ts +397 -0
- package/src/widget/index.css +2 -0
- package/src/widget/index.tsx +8 -0
- package/src/widget/types/svg.d.ts +8 -0
- package/src/widget/types.ts +59 -0
- package/src/widget/widget.tsx +1438 -0
- 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
|
+
}
|
package/dist/tokens.d.ts
ADDED
|
@@ -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"}
|