@0xsquid/react-hooks 6.7.0-rollup-beta.1 → 6.7.0
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/dist/core/abis/ics20.json +128 -0
- package/dist/core/connectors/bitcoin/errors/index.js +22 -0
- package/dist/core/connectors/bitcoin/errors/index.js.map +1 -0
- package/dist/core/connectors/bitcoin/helpers.js +86 -0
- package/dist/core/connectors/bitcoin/helpers.js.map +1 -0
- package/dist/core/connectors/bitcoin/index.js +2 -0
- package/dist/core/connectors/bitcoin/index.js.map +1 -0
- package/dist/core/connectors/bitcoin/wallets/index.js +4 -0
- package/dist/core/connectors/bitcoin/wallets/index.js.map +1 -0
- package/dist/core/connectors/bitcoin/wallets/keplr.js +28 -0
- package/dist/core/connectors/bitcoin/wallets/keplr.js.map +1 -0
- package/dist/core/connectors/bitcoin/wallets/phantom.js +56 -0
- package/dist/core/connectors/bitcoin/wallets/phantom.js.map +1 -0
- package/dist/core/connectors/bitcoin/wallets/unisat.js +28 -0
- package/dist/core/connectors/bitcoin/wallets/unisat.js.map +1 -0
- package/dist/core/constants.js +144 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/externalLinks.js +21 -0
- package/dist/core/externalLinks.js.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/multicall3.js +442 -0
- package/dist/core/multicall3.js.map +1 -0
- package/dist/core/providers/CosmosProvider.js +13 -0
- package/dist/core/providers/CosmosProvider.js.map +1 -0
- package/dist/core/providers/SolanaProvider.js +15 -0
- package/dist/core/providers/SolanaProvider.js.map +1 -0
- package/dist/core/providers/SuiProvider.js +15 -0
- package/dist/core/providers/SuiProvider.js.map +1 -0
- package/dist/core/queries/queries-keys.d.ts +2 -2
- package/dist/core/queries/queries-keys.js +206 -0
- package/dist/core/queries/queries-keys.js.map +1 -0
- package/dist/core/queries/react-query-config.js +11 -0
- package/dist/core/queries/react-query-config.js.map +1 -0
- package/dist/core/types/config.d.ts +2 -0
- package/dist/core/types/config.js +2 -0
- package/dist/core/types/config.js.map +1 -0
- package/dist/core/types/dex.js +33 -0
- package/dist/core/types/dex.js.map +1 -0
- package/dist/core/types/error.js +12 -0
- package/dist/core/types/error.js.map +1 -0
- package/dist/core/types/event.d.ts +5 -0
- package/dist/core/types/event.js +2 -0
- package/dist/core/types/event.js.map +1 -0
- package/dist/core/types/index.js +2 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/types/rpc.js +2 -0
- package/dist/core/types/rpc.js.map +1 -0
- package/dist/core/types/sui.js +2 -0
- package/dist/core/types/sui.js.map +1 -0
- package/dist/core/types/swap.js +2 -0
- package/dist/core/types/swap.js.map +1 -0
- package/dist/core/types/tokens.js +2 -0
- package/dist/core/types/tokens.js.map +1 -0
- package/dist/core/types/transaction.js +41 -0
- package/dist/core/types/transaction.js.map +1 -0
- package/dist/core/types/wallet.js +26 -0
- package/dist/core/types/wallet.js.map +1 -0
- package/dist/core/wagmiConfig.js +60 -0
- package/dist/core/wagmiConfig.js.map +1 -0
- package/dist/core/wallets.js +549 -0
- package/dist/core/wallets.js.map +1 -0
- package/dist/hooks/analytics/useTrackSearchEmpty.d.ts +12 -0
- package/dist/hooks/analytics/useTrackSearchEmpty.js +22 -0
- package/dist/hooks/analytics/useTrackSearchEmpty.js.map +1 -0
- package/dist/hooks/chains/useSquidChains.js +107 -0
- package/dist/hooks/chains/useSquidChains.js.map +1 -0
- package/dist/hooks/client/useClient.js +6 -0
- package/dist/hooks/client/useClient.js.map +1 -0
- package/dist/hooks/cosmos/useCosmos.js +172 -0
- package/dist/hooks/cosmos/useCosmos.js.map +1 -0
- package/dist/hooks/cosmos/useCosmosForChain.js +33 -0
- package/dist/hooks/cosmos/useCosmosForChain.js.map +1 -0
- package/dist/hooks/index.d.ts +5 -5
- package/dist/hooks/index.js +45 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/navigation/useKeyboardNavigation.js +67 -0
- package/dist/hooks/navigation/useKeyboardNavigation.js.map +1 -0
- package/dist/hooks/query/useSquidQueryClient.js +23 -0
- package/dist/hooks/query/useSquidQueryClient.js.map +1 -0
- package/dist/hooks/solana/useSolana.js +104 -0
- package/dist/hooks/solana/useSolana.js.map +1 -0
- package/dist/hooks/squid/useSquid.js +55 -0
- package/dist/hooks/squid/useSquid.js.map +1 -0
- package/dist/hooks/store/useAddressBookStore.js +26 -0
- package/dist/hooks/store/useAddressBookStore.js.map +1 -0
- package/dist/hooks/store/useAssetsColorsStore.js +7 -0
- package/dist/hooks/store/useAssetsColorsStore.js.map +1 -0
- package/dist/hooks/store/useDepositAddressStore.js +12 -0
- package/dist/hooks/store/useDepositAddressStore.js.map +1 -0
- package/dist/hooks/store/useFavoriteTokensStore.js +28 -0
- package/dist/hooks/store/useFavoriteTokensStore.js.map +1 -0
- package/dist/hooks/store/useHistoryStore.js +41 -0
- package/dist/hooks/store/useHistoryStore.js.map +1 -0
- package/dist/hooks/store/useSquidStore.js +56 -0
- package/dist/hooks/store/useSquidStore.js.map +1 -0
- package/dist/hooks/store/useWalletStore.js +42 -0
- package/dist/hooks/store/useWalletStore.js.map +1 -0
- package/dist/hooks/sui/useSui.js +28 -0
- package/dist/hooks/sui/useSui.js.map +1 -0
- package/dist/hooks/sui/useSuiClient.js +16 -0
- package/dist/hooks/sui/useSuiClient.js.map +1 -0
- package/dist/hooks/sui/useSuiWallets.js +42 -0
- package/dist/hooks/sui/useSuiWallets.js.map +1 -0
- package/dist/hooks/swap/useDepositAddress.js +63 -0
- package/dist/hooks/swap/useDepositAddress.js.map +1 -0
- package/dist/hooks/swap/useSwap.js +209 -0
- package/dist/hooks/swap/useSwap.js.map +1 -0
- package/dist/hooks/tokens/useAllConnectedWalletBalances.js +103 -0
- package/dist/hooks/tokens/useAllConnectedWalletBalances.js.map +1 -0
- package/dist/hooks/tokens/useAllTokensWithBalanceForChainType.js +119 -0
- package/dist/hooks/tokens/useAllTokensWithBalanceForChainType.js.map +1 -0
- package/dist/hooks/tokens/useBalance.js +136 -0
- package/dist/hooks/tokens/useBalance.js.map +1 -0
- package/dist/hooks/tokens/useMultiChainBalance.js +68 -0
- package/dist/hooks/tokens/useMultiChainBalance.js.map +1 -0
- package/dist/hooks/tokens/useMultipleTokenPrices.js +46 -0
- package/dist/hooks/tokens/useMultipleTokenPrices.js.map +1 -0
- package/dist/hooks/tokens/useNativeBalance.js +217 -0
- package/dist/hooks/tokens/useNativeBalance.js.map +1 -0
- package/dist/hooks/tokens/useNativeTokenForChain.js +28 -0
- package/dist/hooks/tokens/useNativeTokenForChain.js.map +1 -0
- package/dist/hooks/tokens/useSingleTokenPrice.js +38 -0
- package/dist/hooks/tokens/useSingleTokenPrice.js.map +1 -0
- package/dist/hooks/tokens/useSquidTokens.js +80 -0
- package/dist/hooks/tokens/useSquidTokens.js.map +1 -0
- package/dist/hooks/tokens/useTokenHistoricalData.js +23 -0
- package/dist/hooks/tokens/useTokenHistoricalData.js.map +1 -0
- package/dist/hooks/transaction/useAllTransactionsStatus.js +68 -0
- package/dist/hooks/transaction/useAllTransactionsStatus.js.map +1 -0
- package/dist/hooks/transaction/useApproval.js +223 -0
- package/dist/hooks/transaction/useApproval.js.map +1 -0
- package/dist/hooks/transaction/useErc20Allowance.js +43 -0
- package/dist/hooks/transaction/useErc20Allowance.js.map +1 -0
- package/dist/hooks/transaction/useEstimate.js +118 -0
- package/dist/hooks/transaction/useEstimate.js.map +1 -0
- package/dist/hooks/transaction/useEstimatePriceImpact.js +31 -0
- package/dist/hooks/transaction/useEstimatePriceImpact.js.map +1 -0
- package/dist/hooks/transaction/useExecuteTransaction.js +605 -0
- package/dist/hooks/transaction/useExecuteTransaction.js.map +1 -0
- package/dist/hooks/transaction/useGetRoute.d.ts +3 -0
- package/dist/hooks/transaction/useGetRoute.js +230 -0
- package/dist/hooks/transaction/useGetRoute.js.map +1 -0
- package/dist/hooks/transaction/useIcs20Allowance.js +40 -0
- package/dist/hooks/transaction/useIcs20Allowance.js.map +1 -0
- package/dist/hooks/transaction/useRouteWarnings.js +19 -0
- package/dist/hooks/transaction/useRouteWarnings.js.map +1 -0
- package/dist/hooks/transaction/useSingleTransaction.js +91 -0
- package/dist/hooks/transaction/useSingleTransaction.js.map +1 -0
- package/dist/hooks/user/useAvatar.js +34 -0
- package/dist/hooks/user/useAvatar.js.map +1 -0
- package/dist/hooks/user/useHistory.js +106 -0
- package/dist/hooks/user/useHistory.js.map +1 -0
- package/dist/hooks/user/useUserParams.js +33 -0
- package/dist/hooks/user/useUserParams.js.map +1 -0
- package/dist/hooks/wallet/useAddToken.js +49 -0
- package/dist/hooks/wallet/useAddToken.js.map +1 -0
- package/dist/hooks/wallet/useAutoConnect.js +74 -0
- package/dist/hooks/wallet/useAutoConnect.js.map +1 -0
- package/dist/hooks/wallet/useEns.js +69 -0
- package/dist/hooks/wallet/useEns.js.map +1 -0
- package/dist/hooks/wallet/useGnosisContext.js +78 -0
- package/dist/hooks/wallet/useGnosisContext.js.map +1 -0
- package/dist/hooks/wallet/useIntegratorContext.js +39 -0
- package/dist/hooks/wallet/useIntegratorContext.js.map +1 -0
- package/dist/hooks/wallet/useMultiChainWallet.js +175 -0
- package/dist/hooks/wallet/useMultiChainWallet.js.map +1 -0
- package/dist/hooks/wallet/useSigner.js +76 -0
- package/dist/hooks/wallet/useSigner.js.map +1 -0
- package/dist/hooks/wallet/useWallet.js +206 -0
- package/dist/hooks/wallet/useWallet.js.map +1 -0
- package/dist/hooks/wallet/useWallets.js +36 -0
- package/dist/hooks/wallet/useWallets.js.map +1 -0
- package/dist/index.js +6 -17096
- package/dist/index.js.map +1 -1
- package/dist/provider/index.js +113 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/services/external/ens.js +66 -0
- package/dist/services/external/ens.js.map +1 -0
- package/dist/services/external/rpcService.js +421 -0
- package/dist/services/external/rpcService.js.map +1 -0
- package/dist/{secretService-Cnn1_HQT.js → services/external/secretService.js} +8 -37
- package/dist/services/external/secretService.js.map +1 -0
- package/dist/services/external/suiRpcClient.js +80 -0
- package/dist/services/external/suiRpcClient.js.map +1 -0
- package/dist/services/external/tokenDataService.js +108 -0
- package/dist/services/external/tokenDataService.js.map +1 -0
- package/dist/services/index.js +16 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/internal/apiService.js +21 -0
- package/dist/services/internal/apiService.js.map +1 -0
- package/dist/services/internal/assetsService.js +586 -0
- package/dist/services/internal/assetsService.js.map +1 -0
- package/dist/services/internal/bitcoinService.js +51 -0
- package/dist/services/internal/bitcoinService.js.map +1 -0
- package/dist/services/internal/configService.js +218 -0
- package/dist/services/internal/configService.js.map +1 -0
- package/dist/services/internal/cosmosService.js +141 -0
- package/dist/services/internal/cosmosService.js.map +1 -0
- package/dist/services/internal/errorService.js +188 -0
- package/dist/services/internal/errorService.js.map +1 -0
- package/dist/services/internal/estimateService.js +221 -0
- package/dist/services/internal/estimateService.js.map +1 -0
- package/dist/services/internal/eventService.d.ts +5 -0
- package/dist/services/internal/eventService.js +163 -0
- package/dist/services/internal/eventService.js.map +1 -0
- package/dist/services/internal/evmService.js +42 -0
- package/dist/services/internal/evmService.js.map +1 -0
- package/dist/services/internal/numberService.js +171 -0
- package/dist/services/internal/numberService.js.map +1 -0
- package/dist/services/internal/priceService.js +53 -0
- package/dist/services/internal/priceService.js.map +1 -0
- package/dist/services/internal/searchService.js +98 -0
- package/dist/services/internal/searchService.js.map +1 -0
- package/dist/services/internal/solanaService.js +109 -0
- package/dist/services/internal/solanaService.js.map +1 -0
- package/dist/services/internal/suiService.js +119 -0
- package/dist/services/internal/suiService.js.map +1 -0
- package/dist/services/internal/transactionService.js +207 -0
- package/dist/services/internal/transactionService.js.map +1 -0
- package/dist/services/internal/transactionStatusService.js +315 -0
- package/dist/services/internal/transactionStatusService.js.map +1 -0
- package/dist/services/internal/walletService.js +464 -0
- package/dist/services/internal/walletService.js.map +1 -0
- package/dist/tests/apiService.test.js +40 -0
- package/dist/tests/apiService.test.js.map +1 -0
- package/dist/tests/assetsService.test.js +500 -0
- package/dist/tests/assetsService.test.js.map +1 -0
- package/dist/tests/configService.test.js +673 -0
- package/dist/tests/configService.test.js.map +1 -0
- package/dist/tests/estimateService.test.js +355 -0
- package/dist/tests/estimateService.test.js.map +1 -0
- package/dist/tests/fetchSquidData.js +36 -0
- package/dist/tests/fetchSquidData.js.map +1 -0
- package/dist/tests/jest-svg-transform.d.ts +0 -0
- package/dist/tests/jest-svg-transform.js +21 -0
- package/dist/tests/jest-svg-transform.js.map +1 -0
- package/dist/tests/numberService.test.js +135 -0
- package/dist/tests/numberService.test.js.map +1 -0
- package/dist/tests/priceService.test.js +38 -0
- package/dist/tests/priceService.test.js.map +1 -0
- package/dist/tests/sample.json +0 -0
- package/dist/tests/searchService.test.js +92 -0
- package/dist/tests/searchService.test.js.map +1 -0
- package/dist/tests/swapConfig.test.js +332 -0
- package/dist/tests/swapConfig.test.js.map +1 -0
- package/dist/tests/transactionService.test.js +53 -0
- package/dist/tests/transactionService.test.js.map +1 -0
- package/dist/tests/transactionStatusService.test.js +165 -0
- package/dist/tests/transactionStatusService.test.js.map +1 -0
- package/dist/tests/walletService.test.js +264 -0
- package/dist/tests/walletService.test.js.map +1 -0
- package/package.json +4 -18
- package/dist/index.esm.js +0 -16892
- package/dist/index.esm.js.map +0 -1
- package/dist/secretService-Cnn1_HQT.js.map +0 -1
- package/dist/secretService-DW4QetNp.js +0 -162
- package/dist/secretService-DW4QetNp.js.map +0 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Squid } from "@0xsquid/sdk";
|
|
2
|
+
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
|
|
3
|
+
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
4
|
+
import { mainnet } from "viem/chains";
|
|
5
|
+
import { createConfig, http, WagmiProvider } from "wagmi";
|
|
6
|
+
import { injected } from "wagmi/connectors";
|
|
7
|
+
import { squidApiBaseUrl } from "../core/externalLinks";
|
|
8
|
+
import { CosmosProvider } from "../core/providers/CosmosProvider";
|
|
9
|
+
import { SolanaProvider } from "../core/providers/SolanaProvider";
|
|
10
|
+
import { SuiProvider } from "../core/providers/SuiProvider";
|
|
11
|
+
import { defaultOptions } from "../core/queries/react-query-config";
|
|
12
|
+
import { createWagmiConfig } from "../core/wagmiConfig";
|
|
13
|
+
import { useAssetsColorsStore } from "../hooks/store/useAssetsColorsStore";
|
|
14
|
+
import { useConfigStore, useSquidStore, useSwapRoutePersistStore, } from "../hooks/store/useSquidStore";
|
|
15
|
+
import { fetchAssetsColors, initializeSquidWithAssetsColors, isEmptyObject, } from "../services";
|
|
16
|
+
import { getConfigWithDefaults } from "../services/internal/configService";
|
|
17
|
+
const queryClient = new QueryClient({ defaultOptions });
|
|
18
|
+
const verifyIntegratorIdValidity = (integratorId) => {
|
|
19
|
+
if (!integratorId) {
|
|
20
|
+
throw new Error("Integrator ID is required");
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
export const SquidProvider = ({ children, config, placeholder, }) => {
|
|
24
|
+
verifyIntegratorIdValidity(config.integratorId);
|
|
25
|
+
const [wagmiConfig, setWagmiConfig] = useState();
|
|
26
|
+
const sdkInitializedRef = useRef(false);
|
|
27
|
+
const initializeSdk = useCallback(async () => {
|
|
28
|
+
if (sdkInitializedRef.current) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
sdkInitializedRef.current = true;
|
|
32
|
+
try {
|
|
33
|
+
const squid = new Squid({
|
|
34
|
+
integratorId: config.integratorId,
|
|
35
|
+
baseUrl: config.apiUrl ?? squidApiBaseUrl,
|
|
36
|
+
});
|
|
37
|
+
const [sdkInfoResponse, assetsColorsResponse] = await Promise.allSettled([
|
|
38
|
+
squid.init(),
|
|
39
|
+
fetchAssetsColors(),
|
|
40
|
+
]);
|
|
41
|
+
if (sdkInfoResponse.status === "rejected") {
|
|
42
|
+
throw sdkInfoResponse.reason;
|
|
43
|
+
}
|
|
44
|
+
if (assetsColorsResponse.status === "fulfilled") {
|
|
45
|
+
useAssetsColorsStore.setState(assetsColorsResponse.value);
|
|
46
|
+
initializeSquidWithAssetsColors(squid, assetsColorsResponse.value);
|
|
47
|
+
}
|
|
48
|
+
const shouldResetSwapRouteStore =
|
|
49
|
+
// reset swap route if specified in config
|
|
50
|
+
!config?.loadPreviousStateFromLocalStorage ||
|
|
51
|
+
// or if initial assets are provided
|
|
52
|
+
!isEmptyObject(config.initialAssets?.from) ||
|
|
53
|
+
!isEmptyObject(config.initialAssets?.to);
|
|
54
|
+
if (shouldResetSwapRouteStore) {
|
|
55
|
+
useSwapRoutePersistStore.setState({
|
|
56
|
+
swapRoute: undefined,
|
|
57
|
+
destinationAddressHasBeenUpdated: undefined,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
useSquidStore.setState((_) => ({
|
|
61
|
+
squid,
|
|
62
|
+
maintenanceMode: { active: false, message: undefined },
|
|
63
|
+
}));
|
|
64
|
+
const newWagmiConfig = createWagmiConfig(squid.chains);
|
|
65
|
+
setWagmiConfig(newWagmiConfig);
|
|
66
|
+
useConfigStore.setState({
|
|
67
|
+
isInitialized: true,
|
|
68
|
+
config: getConfigWithDefaults(config),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const isAxios503Error = error.isAxiosError &&
|
|
73
|
+
error.response?.status === 503;
|
|
74
|
+
if (isAxios503Error) {
|
|
75
|
+
const maintenanceMessage = error.response?.data
|
|
76
|
+
?.message ?? undefined;
|
|
77
|
+
// Even with an error, we want wagmi to be defined so that we can display the maintenance mode layout
|
|
78
|
+
// Create wagmi config with mainnet as fallback in maintenance mode
|
|
79
|
+
const newWagmiConfig = createConfig({
|
|
80
|
+
chains: [mainnet],
|
|
81
|
+
connectors: [injected()],
|
|
82
|
+
transports: {
|
|
83
|
+
[mainnet.id]: http(),
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
setWagmiConfig(newWagmiConfig);
|
|
87
|
+
useConfigStore.setState({
|
|
88
|
+
isInitialized: false,
|
|
89
|
+
config: getConfigWithDefaults(config),
|
|
90
|
+
});
|
|
91
|
+
useSquidStore.setState({
|
|
92
|
+
squid: undefined,
|
|
93
|
+
maintenanceMode: {
|
|
94
|
+
active: true,
|
|
95
|
+
message: maintenanceMessage,
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
console.error("Error initializing SDK:", error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}, [config]);
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
initializeSdk();
|
|
106
|
+
}, [initializeSdk]);
|
|
107
|
+
return wagmiConfig ? (React.createElement(WagmiProvider, { config: wagmiConfig },
|
|
108
|
+
React.createElement(QueryClientProvider, { client: queryClient },
|
|
109
|
+
React.createElement(SuiProvider, null,
|
|
110
|
+
React.createElement(SolanaProvider, null,
|
|
111
|
+
React.createElement(CosmosProvider, null, children)))))) : (placeholder);
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/provider/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { CloudflareProvider } from "ethers";
|
|
2
|
+
import { internalSquidApiBaseUrl } from "../../core/constants";
|
|
3
|
+
const provider = new CloudflareProvider();
|
|
4
|
+
const API_BASE_URL = `${internalSquidApiBaseUrl}/ens`;
|
|
5
|
+
const getAvatarFromEns = async (ensName) => {
|
|
6
|
+
if (!ensName)
|
|
7
|
+
return;
|
|
8
|
+
try {
|
|
9
|
+
const resolver = await provider.getResolver(ensName);
|
|
10
|
+
return await resolver?.getText("avatar");
|
|
11
|
+
}
|
|
12
|
+
catch (error) { }
|
|
13
|
+
};
|
|
14
|
+
const getEnsDataFromAddress = async (address) => {
|
|
15
|
+
if (!address)
|
|
16
|
+
return {};
|
|
17
|
+
try {
|
|
18
|
+
const ensName = await provider.lookupAddress(address);
|
|
19
|
+
if (!ensName)
|
|
20
|
+
return {};
|
|
21
|
+
const avatar = await getAvatarFromEns(ensName);
|
|
22
|
+
return { name: ensName, avatar };
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return {};
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
export class EnsService {
|
|
29
|
+
static async getEnsDataFromAddress(address) {
|
|
30
|
+
if (!address)
|
|
31
|
+
return {};
|
|
32
|
+
try {
|
|
33
|
+
const ensData = await getEnsDataFromAddress(address);
|
|
34
|
+
return ensData;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.error("Error fetching ENS data:", error);
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
static async searchEnsNames(partialName) {
|
|
42
|
+
if (!partialName)
|
|
43
|
+
return [];
|
|
44
|
+
try {
|
|
45
|
+
const response = await fetch(`${API_BASE_URL}?action=searchEnsNames&query=${encodeURIComponent(partialName)}`);
|
|
46
|
+
return await response.json();
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error("Error searching ENS names:", error);
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
static async getExactEns(exactEns) {
|
|
54
|
+
if (!exactEns)
|
|
55
|
+
return [];
|
|
56
|
+
try {
|
|
57
|
+
const response = await fetch(`${API_BASE_URL}?action=getExactEns&query=${encodeURIComponent(exactEns)}`);
|
|
58
|
+
return await response.json();
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error("Error fetching exact ENS:", error);
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=ens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ens.js","sourceRoot":"","sources":["../../../src/services/external/ens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,QAAQ,GAAG,IAAI,kBAAkB,EAAE,CAAC;AAC1C,MAAM,YAAY,GAAG,GAAG,uBAAuB,MAAM,CAAC;AAEtD,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAgB,EAAE,EAAE;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;KAC1C;IAAC,OAAO,KAAK,EAAE,GAAE;AACpB,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,KAAK,EAAE,OAAgB,EAAE,EAAE;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI;QACF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;KAClC;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,EAAE,CAAC;KACX;AACH,CAAC,CAAC;AAEF,MAAM,OAAO,UAAU;IACrB,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,OAAgB;QACjD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAExB,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;YACrD,OAAO,OAAkB,CAAC;SAC3B;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,OAAO,EAAE,CAAC;SACX;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,cAAc,CACzB,WAAoB;QAEpB,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAC;QAE5B,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,YAAY,gCAAgC,kBAAkB,CAAC,WAAW,CAAC,EAAE,CACjF,CAAC;YACF,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;SAC9B;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,EAAE,CAAC;SACX;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,QAAiB;QACxC,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,CAAC;QAEzB,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,YAAY,6BAA6B,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAC3E,CAAC;YACF,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;SAC9B;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,EAAE,CAAC;SACX;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
import { ChainType, } from "@0xsquid/squid-types";
|
|
2
|
+
import { StargateClient } from "@cosmjs/stargate";
|
|
3
|
+
import { CHAIN_IDS, nativeEvmTokenAddress, nativeSolanaTokenAddress, SOLANA_RPC_URL, } from "../../core/constants";
|
|
4
|
+
import { multicallAbi, multicallAddress } from "../../core/multicall3";
|
|
5
|
+
import { ethers, Interface, JsonRpcProvider } from "ethers";
|
|
6
|
+
import { erc20Abi } from "viem";
|
|
7
|
+
import { normalizeIbcAddress } from "../internal/assetsService";
|
|
8
|
+
import { isBitcoinAddressValid } from "../internal/bitcoinService";
|
|
9
|
+
import { formatBNToReadable } from "../internal/numberService";
|
|
10
|
+
import { SuiRpcClient } from "./suiRpcClient";
|
|
11
|
+
const isTokenNative = (token) => token.address.toLowerCase() === nativeEvmTokenAddress.toLowerCase();
|
|
12
|
+
const getTokenAddressForMultiCall = (t) => {
|
|
13
|
+
return isTokenNative(t)
|
|
14
|
+
? multicallAddress
|
|
15
|
+
: t.address;
|
|
16
|
+
};
|
|
17
|
+
const getTokenBalanceCall = (token, userAddress) => {
|
|
18
|
+
const address = getTokenAddressForMultiCall(token);
|
|
19
|
+
const abi = isTokenNative(token) ? multicallAbi : erc20Abi;
|
|
20
|
+
const method = isTokenNative(token) ? "getEthBalance" : "balanceOf";
|
|
21
|
+
const iface = new Interface(abi);
|
|
22
|
+
const callData = iface.encodeFunctionData(method, [userAddress]);
|
|
23
|
+
return [address, callData];
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Using Multicall3 contract, available on a lot of chains
|
|
27
|
+
* @param multicall
|
|
28
|
+
* @param calls
|
|
29
|
+
* @param tokens
|
|
30
|
+
* @returns
|
|
31
|
+
*/
|
|
32
|
+
const executeMulticall = async (multicall, calls, tokens) => {
|
|
33
|
+
try {
|
|
34
|
+
const results = await multicall.tryAggregate.staticCall(false, calls);
|
|
35
|
+
const tokenWithResult = tokens.map((token, index) => ({
|
|
36
|
+
token,
|
|
37
|
+
result: { success: results[index][0], returnData: results[index][1] },
|
|
38
|
+
}));
|
|
39
|
+
return tokenWithResult;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
return tokens.map((token) => ({
|
|
43
|
+
token,
|
|
44
|
+
result: { success: false, returnData: "" },
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Format balance using ethers, based on success of the call
|
|
50
|
+
* If the call fails, we return 0 as balance
|
|
51
|
+
* @param results
|
|
52
|
+
* @returns
|
|
53
|
+
*/
|
|
54
|
+
const formatBalanceForTokens = (results) => {
|
|
55
|
+
return results.map((data) => {
|
|
56
|
+
const token = data.token;
|
|
57
|
+
const result = data.result;
|
|
58
|
+
if (!result.success) {
|
|
59
|
+
return { ...token, balance: "0" };
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
return {
|
|
63
|
+
...token,
|
|
64
|
+
balance: formatBNToReadable(BigInt(result.returnData), token.decimals),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return {
|
|
69
|
+
...token,
|
|
70
|
+
balance: "0",
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
export const getTokensSupportingMultiCall = async (tokens, userAddress, chains) => {
|
|
76
|
+
// Create providers for each chain
|
|
77
|
+
const providers = {};
|
|
78
|
+
chains.forEach((chain) => {
|
|
79
|
+
providers[chain.chainId] = new JsonRpcProvider(chain.rpc);
|
|
80
|
+
});
|
|
81
|
+
const fetchBalancesForChain = async (chain) => {
|
|
82
|
+
const tokensForChain = tokens.filter((t) => t.chainId === chain.chainId);
|
|
83
|
+
if (tokensForChain.length === 0)
|
|
84
|
+
return [];
|
|
85
|
+
const provider = providers[chain.chainId];
|
|
86
|
+
if (!provider) {
|
|
87
|
+
return [
|
|
88
|
+
...tokensForChain.map((t) => ({
|
|
89
|
+
...t,
|
|
90
|
+
balance: "0",
|
|
91
|
+
})),
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
const multicall = new ethers.Contract(multicallAddress, multicallAbi, provider);
|
|
95
|
+
const calls = tokensForChain.map((token) => getTokenBalanceCall(token, userAddress));
|
|
96
|
+
const multicallResults = await executeMulticall(multicall, calls, tokensForChain);
|
|
97
|
+
return formatBalanceForTokens(multicallResults);
|
|
98
|
+
};
|
|
99
|
+
const allResults = await Promise.all(chains.map((chain) => fetchBalancesForChain(chain)));
|
|
100
|
+
return allResults.flat();
|
|
101
|
+
};
|
|
102
|
+
export const getAllEvmTokensBalance = async (evmTokens, userAddress, chains) => {
|
|
103
|
+
const tokensMulticall = await getTokensSupportingMultiCall(evmTokens, userAddress, chains);
|
|
104
|
+
return tokensMulticall;
|
|
105
|
+
};
|
|
106
|
+
/**
|
|
107
|
+
* We'll get the current block of a given RPC to see if we can query it
|
|
108
|
+
* Without getting CORS error or any other error
|
|
109
|
+
* @param rpc
|
|
110
|
+
* @returns
|
|
111
|
+
*/
|
|
112
|
+
const testCosmosRpc = async (rpc) => {
|
|
113
|
+
let rpcIsValid = false;
|
|
114
|
+
try {
|
|
115
|
+
const client = await StargateClient.connect(rpc);
|
|
116
|
+
const block = await client.getBlock();
|
|
117
|
+
rpcIsValid = !!block.id;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
rpcIsValid = false;
|
|
121
|
+
}
|
|
122
|
+
return rpcIsValid;
|
|
123
|
+
};
|
|
124
|
+
export const getWorkingCosmosRpcUrl = async (chainData) => {
|
|
125
|
+
if (chainData.chainType !== ChainType.COSMOS)
|
|
126
|
+
return chainData.rpc;
|
|
127
|
+
const chain = chainData;
|
|
128
|
+
const rpcList = chain.rpcList.length > 0 ? chain.rpcList : chain.rpc ? [chain.rpc] : [];
|
|
129
|
+
// if rpcList is empty, use the default rpc
|
|
130
|
+
if (rpcList.length === 0) {
|
|
131
|
+
try {
|
|
132
|
+
const isValid = await testCosmosRpc(chain.rpc);
|
|
133
|
+
if (isValid) {
|
|
134
|
+
return chain.rpc;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
console.error(`Error fetching rpc url: ${chain.rpc} - Error: ${error?.toString()}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// if rpcList is not empty, try to fetch each rpc until we find a valid one
|
|
142
|
+
for (const rpc of rpcList) {
|
|
143
|
+
try {
|
|
144
|
+
// eslint-disable-next-line no-await-in-loop
|
|
145
|
+
const isValid = await timeout(5_000, testCosmosRpc(rpc));
|
|
146
|
+
if (isValid) {
|
|
147
|
+
return rpc;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error(`Error fetching rpc url: ${chain.rpc} - Error: ${error?.toString()}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// In the case that all rpcs are invalid, return the default rpc anyway
|
|
155
|
+
return chain.rpc;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Get the balance of a single token for a given address
|
|
159
|
+
* @param chain - Cosmos chain
|
|
160
|
+
* @param address - user address
|
|
161
|
+
* @param tokenAddress - token address
|
|
162
|
+
* @returns balance as formatted string
|
|
163
|
+
*/
|
|
164
|
+
export const getCosmosTokenBalance = async (chain, address, tokenAddress) => {
|
|
165
|
+
const validRpc = await getWorkingCosmosRpcUrl(chain);
|
|
166
|
+
if (!validRpc)
|
|
167
|
+
return "0";
|
|
168
|
+
const client = await StargateClient.connect(validRpc);
|
|
169
|
+
const balance = await client.getBalance(address, tokenAddress);
|
|
170
|
+
return balance.amount;
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Fetches all Cosmos balances for a given address and RPC.
|
|
174
|
+
*
|
|
175
|
+
* @param {string} params.rpc - RPC URL to fetch balances from.
|
|
176
|
+
* @param {string} params.address - user address to fetch balances for.
|
|
177
|
+
* @param {Token[]} params.tokens - array of Cosmos tokens.
|
|
178
|
+
* @returns {Promise<TokenWithBalance[]>} promise that resolves to an array of tokens with their balances.
|
|
179
|
+
*/
|
|
180
|
+
export const getAllCosmosBalancesForChain = async ({ rpc, address, tokens, }) => {
|
|
181
|
+
const client = await StargateClient.connect(rpc);
|
|
182
|
+
const balanceAsCoin = await client.getAllBalances(address);
|
|
183
|
+
// Need to map tokens and put balance, based on denom
|
|
184
|
+
const tokensWithBalance = tokens.map((t) => {
|
|
185
|
+
const balanceCoin = balanceAsCoin?.find((c) => c.denom === normalizeIbcAddress(t.address));
|
|
186
|
+
return {
|
|
187
|
+
...t,
|
|
188
|
+
balance: balanceCoin
|
|
189
|
+
? formatBNToReadable(BigInt(balanceCoin?.amount), t?.decimals)
|
|
190
|
+
: "0",
|
|
191
|
+
};
|
|
192
|
+
});
|
|
193
|
+
return tokensWithBalance;
|
|
194
|
+
};
|
|
195
|
+
/**
|
|
196
|
+
* Fetches all Cosmos balances for a given address and RPC.
|
|
197
|
+
*
|
|
198
|
+
* @param {object} params.addresses user addresses per cosmos network
|
|
199
|
+
* @param {Token[]} params.cosmosTokens
|
|
200
|
+
* @param {CosmosChain[]} params.cosmosChains
|
|
201
|
+
* @returns {Promise<TokenWithBalance[]>} All tokens with their balances.
|
|
202
|
+
*/
|
|
203
|
+
export const getAllCosmosBalances = async ({ addresses, cosmosTokens, cosmosChains, }) => {
|
|
204
|
+
const tokensWithBalance = [];
|
|
205
|
+
await Promise.all(cosmosChains.map(async (cosmosChain) => {
|
|
206
|
+
const userAddress = addresses.find((a) => a.chainId === cosmosChain.chainId)?.address;
|
|
207
|
+
const tokensForChain = cosmosTokens.filter((t) => t.chainId === cosmosChain.chainId);
|
|
208
|
+
if (!userAddress) {
|
|
209
|
+
tokensWithBalance.push(...tokensForChain.map((t) => ({ ...t, balance: "0" })));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
try {
|
|
213
|
+
// These are networks that were not working with the default rpc.cosmos.directory
|
|
214
|
+
const specialNetworks = [
|
|
215
|
+
CHAIN_IDS.INJECTIVE,
|
|
216
|
+
CHAIN_IDS.OSMOSIS,
|
|
217
|
+
CHAIN_IDS.C4E,
|
|
218
|
+
CHAIN_IDS.KAVA_IBC,
|
|
219
|
+
CHAIN_IDS.TERRA,
|
|
220
|
+
CHAIN_IDS.SEI,
|
|
221
|
+
CHAIN_IDS.FETCH,
|
|
222
|
+
CHAIN_IDS.SECRET,
|
|
223
|
+
CHAIN_IDS.KI,
|
|
224
|
+
CHAIN_IDS.UMEE,
|
|
225
|
+
CHAIN_IDS.PERSISTENCE,
|
|
226
|
+
CHAIN_IDS.MIGALOO,
|
|
227
|
+
];
|
|
228
|
+
let rpc;
|
|
229
|
+
if (specialNetworks.includes(cosmosChain.chainId)) {
|
|
230
|
+
// try to get a working rpc url
|
|
231
|
+
const validRpc = await timeout(3_000, getWorkingCosmosRpcUrl(cosmosChain));
|
|
232
|
+
// fallback to the default chain rpc
|
|
233
|
+
rpc = validRpc ?? cosmosChain.rpc;
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
switch (cosmosChain.networkIdentifier) {
|
|
237
|
+
case "axelarnet":
|
|
238
|
+
rpc = `https://rpc.cosmos.directory/axelar`;
|
|
239
|
+
break;
|
|
240
|
+
case "sentinel":
|
|
241
|
+
rpc = `https://rpc.sentinel.chaintools.tech`;
|
|
242
|
+
break;
|
|
243
|
+
default:
|
|
244
|
+
rpc = `https://rpc.cosmos.directory/${cosmosChain.networkIdentifier}`;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const balances = await timeout(6_000, getAllCosmosBalancesForChain({
|
|
249
|
+
rpc,
|
|
250
|
+
address: userAddress,
|
|
251
|
+
tokens: tokensForChain,
|
|
252
|
+
}));
|
|
253
|
+
if (balances) {
|
|
254
|
+
tokensWithBalance.push(...balances);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
tokensWithBalance.push(...tokensForChain.map((t) => ({ ...t, balance: "0" })));
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch (error) {
|
|
261
|
+
console.warn(`Failed to fetch balances for chain ${cosmosChain.chainId}:`, error);
|
|
262
|
+
tokensWithBalance.push(...tokensForChain.map((t) => ({ ...t, balance: "0" })));
|
|
263
|
+
}
|
|
264
|
+
}));
|
|
265
|
+
return tokensWithBalance;
|
|
266
|
+
};
|
|
267
|
+
export const getSolanaNativeBalance = async (userAddress) => {
|
|
268
|
+
const response = await fetch(SOLANA_RPC_URL, {
|
|
269
|
+
method: "POST",
|
|
270
|
+
headers: { "Content-Type": "application/json" },
|
|
271
|
+
body: JSON.stringify({
|
|
272
|
+
jsonrpc: "2.0",
|
|
273
|
+
id: 1,
|
|
274
|
+
method: "getBalance",
|
|
275
|
+
params: [userAddress],
|
|
276
|
+
}),
|
|
277
|
+
});
|
|
278
|
+
const data = await response.json();
|
|
279
|
+
return BigInt(data.result?.value || 0);
|
|
280
|
+
};
|
|
281
|
+
export const getSolanaTokenBalance = async (userAddress, tokenAddress) => {
|
|
282
|
+
if (tokenAddress.toLowerCase() === nativeSolanaTokenAddress.toLowerCase()) {
|
|
283
|
+
return getSolanaNativeBalance(userAddress);
|
|
284
|
+
}
|
|
285
|
+
const response = await fetch(SOLANA_RPC_URL, {
|
|
286
|
+
method: "POST",
|
|
287
|
+
headers: { "Content-Type": "application/json" },
|
|
288
|
+
body: JSON.stringify({
|
|
289
|
+
jsonrpc: "2.0",
|
|
290
|
+
id: 1,
|
|
291
|
+
method: "getTokenAccountsByOwner",
|
|
292
|
+
params: [
|
|
293
|
+
userAddress,
|
|
294
|
+
{ programId: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" },
|
|
295
|
+
{ encoding: "jsonParsed" },
|
|
296
|
+
],
|
|
297
|
+
}),
|
|
298
|
+
});
|
|
299
|
+
const data = await response.json();
|
|
300
|
+
const tokenAccount = data.result?.value?.find((acc) => acc.account.data.parsed.info.mint.toLowerCase() ===
|
|
301
|
+
tokenAddress.toLowerCase());
|
|
302
|
+
return BigInt(tokenAccount?.account.data.parsed.info.tokenAmount.amount || 0);
|
|
303
|
+
};
|
|
304
|
+
export const getSolanaTokensBalance = async (userAddress, tokenAddresses) => {
|
|
305
|
+
const response = await fetch(SOLANA_RPC_URL, {
|
|
306
|
+
method: "POST",
|
|
307
|
+
headers: { "Content-Type": "application/json" },
|
|
308
|
+
body: JSON.stringify({
|
|
309
|
+
jsonrpc: "2.0",
|
|
310
|
+
id: 1,
|
|
311
|
+
method: "getTokenAccountsByOwner",
|
|
312
|
+
params: [
|
|
313
|
+
userAddress,
|
|
314
|
+
{ programId: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" },
|
|
315
|
+
{ encoding: "jsonParsed" },
|
|
316
|
+
],
|
|
317
|
+
}),
|
|
318
|
+
});
|
|
319
|
+
const data = await response.json();
|
|
320
|
+
return tokenAddresses.reduce((acc, address) => {
|
|
321
|
+
const tokenAccount = data.result?.value?.find((accountInfo) => accountInfo.account.data.parsed.info.mint.toLowerCase() ===
|
|
322
|
+
address.toLowerCase());
|
|
323
|
+
acc[address] = BigInt(tokenAccount?.account.data.parsed.info.tokenAmount.amount || 0);
|
|
324
|
+
return acc;
|
|
325
|
+
}, {});
|
|
326
|
+
};
|
|
327
|
+
export const getAllSolanaTokensBalance = async (solanaTokens, userAddress) => {
|
|
328
|
+
try {
|
|
329
|
+
const nativeToken = solanaTokens.find((t) => t.address === nativeEvmTokenAddress);
|
|
330
|
+
const otherTokens = solanaTokens.filter((t) => t.address !== nativeEvmTokenAddress);
|
|
331
|
+
const [nativeBalance, tokenBalances] = await Promise.all([
|
|
332
|
+
nativeToken
|
|
333
|
+
? getSolanaNativeBalance(userAddress)
|
|
334
|
+
: Promise.resolve(BigInt(0)),
|
|
335
|
+
getSolanaTokensBalance(userAddress, otherTokens.map((t) => t.address)),
|
|
336
|
+
]);
|
|
337
|
+
return solanaTokens.map((token) => ({
|
|
338
|
+
...token,
|
|
339
|
+
balance: token.address === nativeEvmTokenAddress
|
|
340
|
+
? formatBNToReadable(nativeBalance, token.decimals)
|
|
341
|
+
: formatBNToReadable(tokenBalances[token.address], token.decimals),
|
|
342
|
+
}));
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
console.warn("Failed to fetch Solana balances:", error);
|
|
346
|
+
return solanaTokens.map((t) => ({ ...t, balance: "0" }));
|
|
347
|
+
}
|
|
348
|
+
};
|
|
349
|
+
export async function getBitcoinNativeBalance(address) {
|
|
350
|
+
try {
|
|
351
|
+
const isValidBitcoinAddress = isBitcoinAddressValid(address);
|
|
352
|
+
if (!isValidBitcoinAddress) {
|
|
353
|
+
throw new Error(`Invalid Bitcoin address: ${address}`);
|
|
354
|
+
}
|
|
355
|
+
const apiUrl = `https://blockchain.info/q/addressbalance/${address}?confirmations=6`;
|
|
356
|
+
const response = await fetch(apiUrl);
|
|
357
|
+
const balanceInSatoshis = await response.json();
|
|
358
|
+
const isValidResponse = typeof balanceInSatoshis === "string" ||
|
|
359
|
+
typeof balanceInSatoshis === "number";
|
|
360
|
+
if (!isValidResponse) {
|
|
361
|
+
throw new Error("Invalid balance response");
|
|
362
|
+
}
|
|
363
|
+
return String(balanceInSatoshis || "0");
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
console.error("Failed to fetch Bitcoin balance:", error);
|
|
367
|
+
return "0";
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// TODO: implement fetching balances for all bitcoin tokens
|
|
371
|
+
export const getAllBitcoinTokensBalance = async (userAddress, bitcoinTokens) => {
|
|
372
|
+
const nativeBalance = await getBitcoinNativeBalance(userAddress);
|
|
373
|
+
return Promise.all(bitcoinTokens.map(async (token) => {
|
|
374
|
+
return {
|
|
375
|
+
...token,
|
|
376
|
+
balance: formatBNToReadable(nativeBalance, token.decimals),
|
|
377
|
+
};
|
|
378
|
+
}));
|
|
379
|
+
};
|
|
380
|
+
/**
|
|
381
|
+
* Returns the balance of a single Sui coin for a given address
|
|
382
|
+
*/
|
|
383
|
+
export const getSuiTokenBalance = async (userAddress, tokenAddress, rpcUrl) => {
|
|
384
|
+
const suiClient = new SuiRpcClient(rpcUrl);
|
|
385
|
+
const { totalBalance } = await suiClient.getBalance(userAddress, tokenAddress);
|
|
386
|
+
return BigInt(totalBalance || 0);
|
|
387
|
+
};
|
|
388
|
+
export const getAllSuiTokensBalance = async (userAddress, suiTokens, suiChains) => {
|
|
389
|
+
const getBalancesForChain = async (chain) => {
|
|
390
|
+
const tokensForChain = suiTokens.filter((t) => t.chainId === chain.chainId);
|
|
391
|
+
const suiClient = new SuiRpcClient(chain.rpc);
|
|
392
|
+
const foundBalances = await suiClient.getAllBalances(userAddress);
|
|
393
|
+
const balanceMap = foundBalances.reduce((acc, balance) => {
|
|
394
|
+
acc[balance.coinType] = balance.totalBalance;
|
|
395
|
+
return acc;
|
|
396
|
+
}, {});
|
|
397
|
+
return tokensForChain.map((token) => {
|
|
398
|
+
const balanceBn = BigInt(balanceMap[token.address] || 0);
|
|
399
|
+
return {
|
|
400
|
+
...token,
|
|
401
|
+
balance: formatBNToReadable(balanceBn, token.decimals),
|
|
402
|
+
};
|
|
403
|
+
});
|
|
404
|
+
};
|
|
405
|
+
const allResults = await Promise.all(suiChains.map(getBalancesForChain));
|
|
406
|
+
return allResults.flat();
|
|
407
|
+
};
|
|
408
|
+
/**
|
|
409
|
+
* Returns a promise that resolves when the given promise resolves or after the given timeout
|
|
410
|
+
* @param ms - timeout in milliseconds
|
|
411
|
+
* @param promise - the promise to wait for
|
|
412
|
+
*/
|
|
413
|
+
export function timeout(ms, promise) {
|
|
414
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
415
|
+
setTimeout(() => {
|
|
416
|
+
resolve(null);
|
|
417
|
+
}, ms);
|
|
418
|
+
});
|
|
419
|
+
return Promise.race([promise, timeoutPromise]);
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=rpcService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpcService.js","sourceRoot":"","sources":["../../../src/services/external/rpcService.ts"],"names":[],"mappings":"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"}
|