@0xsquid/react-hooks 1.0.4 → 1.0.6
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/assets/images/icons/wallets/index.d.ts +22 -0
- package/{src/assets/images/icons/wallets/index.ts → dist/assets/images/icons/wallets/index.js} +21 -21
- package/dist/assets/images/icons/wallets/index.js.map +1 -0
- package/dist/connectors/ExodusConnector.d.ts +4 -0
- package/{src/connectors/ExodusConnector.ts → dist/connectors/ExodusConnector.js} +3 -3
- package/dist/connectors/ExodusConnector.js.map +1 -0
- package/dist/connectors/LedgerLiveConnector.d.ts +40 -0
- package/dist/connectors/LedgerLiveConnector.js +177 -0
- package/dist/connectors/LedgerLiveConnector.js.map +1 -0
- package/dist/contracts/typechain/factories/ERC20__factory.js +324 -0
- package/dist/contracts/typechain/factories/ERC20__factory.js.map +1 -0
- package/dist/core/constants.d.ts +37 -0
- package/dist/core/constants.js +487 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/externalLinks.d.ts +18 -0
- package/{src/core/externalLinks.ts → dist/core/externalLinks.js} +5 -9
- package/dist/core/externalLinks.js.map +1 -0
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/multicall3.d.ts +16 -0
- package/dist/core/multicall3.js +23 -0
- package/dist/core/multicall3.js.map +1 -0
- package/dist/core/numbers.d.ts +3 -0
- package/dist/core/numbers.js +28 -0
- package/dist/core/numbers.js.map +1 -0
- package/dist/core/providers/CosmosProvider.d.ts +34 -0
- package/dist/core/providers/CosmosProvider.js +12 -0
- package/dist/core/providers/CosmosProvider.js.map +1 -0
- package/dist/core/queries/queries-keys.d.ts +34 -0
- package/dist/core/queries/queries-keys.js +120 -0
- package/dist/core/queries/queries-keys.js.map +1 -0
- package/dist/core/queries/react-query-config.d.ts +3 -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/components.d.ts +14 -0
- package/dist/core/types/components.js +2 -0
- package/dist/core/types/components.js.map +1 -0
- package/dist/core/types/config.d.ts +47 -0
- package/dist/core/types/config.js +2 -0
- package/dist/core/types/config.js.map +1 -0
- package/dist/core/types/dex.d.ts +28 -0
- package/dist/core/types/dex.js +33 -0
- package/dist/core/types/dex.js.map +1 -0
- package/dist/core/types/error.d.ts +44 -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 +17 -0
- package/dist/core/types/event.js +2 -0
- package/dist/core/types/event.js.map +1 -0
- package/dist/core/types/route.d.ts +9 -0
- package/dist/core/types/route.js +4 -0
- package/dist/core/types/route.js.map +1 -0
- package/dist/core/types/swap.d.ts +8 -0
- package/dist/core/types/swap.js +2 -0
- package/dist/core/types/swap.js.map +1 -0
- package/dist/core/types/tokens.d.ts +29 -0
- package/dist/core/types/tokens.js +2 -0
- package/dist/core/types/tokens.js.map +1 -0
- package/dist/core/types/transaction.d.ts +68 -0
- package/dist/core/types/transaction.js +38 -0
- package/dist/core/types/transaction.js.map +1 -0
- package/dist/core/types/types.d.ts +30 -0
- package/dist/core/types/types.js +7 -0
- package/dist/core/types/types.js.map +1 -0
- package/dist/core/types/wallet.d.ts +55 -0
- package/dist/core/types/wallet.js +26 -0
- package/dist/core/types/wallet.js.map +1 -0
- package/dist/hooks/chains/useSquidChains.d.ts +12 -0
- package/dist/hooks/chains/useSquidChains.js +45 -0
- package/dist/hooks/chains/useSquidChains.js.map +1 -0
- package/dist/hooks/cosmos/useCosmos.d.ts +33 -0
- package/dist/hooks/cosmos/useCosmos.js +194 -0
- package/dist/hooks/cosmos/useCosmos.js.map +1 -0
- package/dist/hooks/cosmos/useCosmosForChain.d.ts +4 -0
- package/dist/hooks/cosmos/useCosmosForChain.js +22 -0
- package/dist/hooks/cosmos/useCosmosForChain.js.map +1 -0
- package/{src/hooks/index.ts → dist/hooks/index.d.ts} +1 -7
- package/dist/hooks/index.js +27 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/navigation/useKeyboardNavigation.d.ts +7 -0
- package/dist/hooks/navigation/useKeyboardNavigation.js +69 -0
- package/dist/hooks/navigation/useKeyboardNavigation.js.map +1 -0
- package/dist/hooks/store/useSquidStore.d.ts +105 -0
- package/dist/hooks/store/useSquidStore.js +35 -0
- package/dist/hooks/store/useSquidStore.js.map +1 -0
- package/dist/hooks/swap/useSwap.d.ts +25 -0
- package/dist/hooks/swap/useSwap.js +229 -0
- package/dist/hooks/swap/useSwap.js.map +1 -0
- package/dist/hooks/tokens/useAllTokensWithBalance.d.ts +11 -0
- package/dist/hooks/tokens/useAllTokensWithBalance.js +97 -0
- package/dist/hooks/tokens/useAllTokensWithBalance.js.map +1 -0
- package/dist/hooks/tokens/useBalance.d.ts +34 -0
- package/dist/hooks/tokens/useBalance.js +112 -0
- package/dist/hooks/tokens/useBalance.js.map +1 -0
- package/dist/hooks/tokens/useMultiChainBalance.d.ts +17 -0
- package/dist/hooks/tokens/useMultiChainBalance.js +36 -0
- package/dist/hooks/tokens/useMultiChainBalance.js.map +1 -0
- package/dist/hooks/tokens/usePrices.d.ts +6 -0
- package/dist/hooks/tokens/usePrices.js +42 -0
- package/dist/hooks/tokens/usePrices.js.map +1 -0
- package/dist/hooks/tokens/useSingleTokenPrice.d.ts +10 -0
- package/dist/hooks/tokens/useSingleTokenPrice.js +32 -0
- package/dist/hooks/tokens/useSingleTokenPrice.js.map +1 -0
- package/dist/hooks/tokens/useSquidTokens.d.ts +13 -0
- package/dist/hooks/tokens/useSquidTokens.js +35 -0
- package/dist/hooks/tokens/useSquidTokens.js.map +1 -0
- package/dist/hooks/tokens/useTokensWithBalance.d.ts +7 -0
- package/dist/hooks/tokens/useTokensWithBalance.js +111 -0
- package/dist/hooks/tokens/useTokensWithBalance.js.map +1 -0
- package/dist/hooks/transaction/useEstimate.d.ts +44 -0
- package/dist/hooks/transaction/useEstimate.js +274 -0
- package/dist/hooks/transaction/useEstimate.js.map +1 -0
- package/dist/hooks/transaction/useEstimatePriceImpact.d.ts +7 -0
- package/dist/hooks/transaction/useEstimatePriceImpact.js +26 -0
- package/dist/hooks/transaction/useEstimatePriceImpact.js.map +1 -0
- package/dist/hooks/transaction/useExecuteTransaction.d.ts +20 -0
- package/dist/hooks/transaction/useExecuteTransaction.js +310 -0
- package/dist/hooks/transaction/useExecuteTransaction.js.map +1 -0
- package/dist/hooks/transaction/useExpress.d.ts +5 -0
- package/dist/hooks/transaction/useExpress.js +31 -0
- package/dist/hooks/transaction/useExpress.js.map +1 -0
- package/dist/hooks/transaction/useGetRoute.d.ts +14 -0
- package/dist/hooks/transaction/useGetRoute.js +96 -0
- package/dist/hooks/transaction/useGetRoute.js.map +1 -0
- package/dist/hooks/transaction/useSingleTransaction.d.ts +8 -0
- package/dist/hooks/transaction/useSingleTransaction.js +99 -0
- package/dist/hooks/transaction/useSingleTransaction.js.map +1 -0
- package/dist/hooks/transaction/useTransaction.d.ts +25 -0
- package/dist/hooks/transaction/useTransaction.js +521 -0
- package/dist/hooks/transaction/useTransaction.js.map +1 -0
- package/dist/hooks/user/useUserParams.d.ts +6 -0
- package/dist/hooks/user/useUserParams.js +41 -0
- package/dist/hooks/user/useUserParams.js.map +1 -0
- package/dist/hooks/wallet/useAddToken.d.ts +4 -0
- package/dist/hooks/wallet/useAddToken.js +45 -0
- package/dist/hooks/wallet/useAddToken.js.map +1 -0
- package/dist/hooks/wallet/useAutoConnect.d.ts +6 -0
- package/dist/hooks/wallet/useAutoConnect.js +44 -0
- package/dist/hooks/wallet/useAutoConnect.js.map +1 -0
- package/dist/hooks/wallet/useGnosisContext.d.ts +7 -0
- package/dist/hooks/wallet/useGnosisContext.js +70 -0
- package/dist/hooks/wallet/useGnosisContext.js.map +1 -0
- package/dist/hooks/wallet/useIntegratorContext.d.ts +5 -0
- package/dist/hooks/wallet/useIntegratorContext.js +39 -0
- package/dist/hooks/wallet/useIntegratorContext.js.map +1 -0
- package/dist/hooks/wallet/useMultiChainWallet.d.ts +8 -0
- package/dist/hooks/wallet/useMultiChainWallet.js +113 -0
- package/dist/hooks/wallet/useMultiChainWallet.js.map +1 -0
- package/dist/hooks/wallet/useWallet.d.ts +6 -0
- package/dist/hooks/wallet/useWallet.js +65 -0
- package/dist/hooks/wallet/useWallet.js.map +1 -0
- package/dist/hooks/webapp-router/useSquidRouter.d.ts +11 -0
- package/dist/hooks/webapp-router/useSquidRouter.js +33 -0
- package/dist/hooks/webapp-router/useSquidRouter.js.map +1 -0
- package/{src/index.ts → dist/index.d.ts} +0 -1
- package/dist/index.js.map +1 -0
- package/dist/provider/index.d.ts +10 -0
- package/dist/provider/index.js +71 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/services/external/analyticsService.d.ts +18 -0
- package/dist/services/external/analyticsService.js +30 -0
- package/dist/services/external/analyticsService.js.map +1 -0
- package/dist/services/external/coingeckoService.d.ts +8 -0
- package/dist/services/external/coingeckoService.js +20 -0
- package/dist/services/external/coingeckoService.js.map +1 -0
- package/dist/services/external/rpcService.d.ts +4 -0
- package/dist/services/external/rpcService.js +145 -0
- package/dist/services/external/rpcService.js.map +1 -0
- package/dist/services/external/secretService.d.ts +28 -0
- package/dist/services/external/secretService.js +129 -0
- package/dist/services/external/secretService.js.map +1 -0
- package/dist/services/index.js +2 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/internal/apiService.d.ts +4 -0
- package/dist/services/internal/apiService.js +7 -0
- package/dist/services/internal/apiService.js.map +1 -0
- package/dist/services/internal/assetsService.d.ts +28 -0
- package/dist/services/internal/assetsService.js +46 -0
- package/dist/services/internal/assetsService.js.map +1 -0
- package/dist/services/internal/configService.d.ts +40 -0
- package/dist/services/internal/configService.js +119 -0
- package/dist/services/internal/configService.js.map +1 -0
- package/dist/services/internal/errorService.d.ts +30 -0
- package/{src/services/internal/errorService.ts → dist/services/internal/errorService.js} +35 -54
- package/dist/services/internal/errorService.js.map +1 -0
- package/dist/services/internal/eventService.d.ts +52 -0
- package/dist/services/internal/eventService.js +66 -0
- package/dist/services/internal/eventService.js.map +1 -0
- package/dist/services/internal/priceService.d.ts +1 -0
- package/dist/services/internal/priceService.js +7 -0
- package/dist/services/internal/priceService.js.map +1 -0
- package/dist/services/internal/transactionService.d.ts +43 -0
- package/dist/services/internal/transactionService.js +172 -0
- package/dist/services/internal/transactionService.js.map +1 -0
- package/dist/services/internal/transactionStatusService.d.ts +28 -0
- package/dist/services/internal/transactionStatusService.js +225 -0
- package/dist/services/internal/transactionStatusService.js.map +1 -0
- package/dist/services/internal/walletService.d.ts +28 -0
- package/dist/services/internal/walletService.js +123 -0
- package/dist/services/internal/walletService.js.map +1 -0
- package/dist/tests/assetsService.test.d.ts +1 -0
- package/dist/tests/assetsService.test.js +130 -0
- package/dist/tests/assetsService.test.js.map +1 -0
- package/dist/tests/configService.test.d.ts +1 -0
- package/dist/tests/configService.test.js +295 -0
- package/dist/tests/configService.test.js.map +1 -0
- package/dist/tests/fetchSquidData.d.ts +6 -0
- package/dist/tests/fetchSquidData.js +27 -0
- package/dist/tests/fetchSquidData.js.map +1 -0
- package/{src/tests/jest-svg-transform.ts → dist/tests/jest-svg-transform.js} +11 -9
- package/dist/tests/jest-svg-transform.js.map +1 -0
- package/dist/tests/sample.json +0 -0
- package/dist/tests/walletService.test.d.ts +1 -0
- package/dist/tests/walletService.test.js +74 -0
- package/dist/tests/walletService.test.js.map +1 -0
- package/package.json +6 -1
- package/.babelrc +0 -7
- package/.eslintignore +0 -1
- package/.eslintrc.json +0 -44
- package/CHANGELOG.md +0 -9
- package/jest.config.ts +0 -28
- package/scripts/copyAssets.js +0 -27
- package/scripts/removeBuildTestFolder.js +0 -28
- package/scripts/replacePaths.js +0 -37
- package/src/connectors/LedgerLiveConnector.ts +0 -226
- package/src/contracts/typechain/ERC20.d.ts +0 -441
- package/src/contracts/typechain/factories/ERC20__factory.ts +0 -340
- package/src/core/constants.ts +0 -549
- package/src/core/multicall3.ts +0 -22
- package/src/core/numbers.ts +0 -44
- package/src/core/providers/CosmosProvider.tsx +0 -55
- package/src/core/queries/queries-keys.ts +0 -156
- package/src/core/queries/react-query-config.ts +0 -13
- package/src/core/types/components.ts +0 -16
- package/src/core/types/config.ts +0 -52
- package/src/core/types/dex.ts +0 -31
- package/src/core/types/error.ts +0 -52
- package/src/core/types/event.ts +0 -16
- package/src/core/types/route.ts +0 -21
- package/src/core/types/swap.ts +0 -8
- package/src/core/types/tokens.ts +0 -30
- package/src/core/types/transaction.ts +0 -84
- package/src/core/types/types.ts +0 -37
- package/src/core/types/wallet.ts +0 -83
- package/src/hooks/chains/useSquidChains.ts +0 -66
- package/src/hooks/cosmos/useCosmos.ts +0 -279
- package/src/hooks/cosmos/useCosmosForChain.ts +0 -33
- package/src/hooks/navigation/useKeyboardNavigation.ts +0 -88
- package/src/hooks/store/useSquidStore.ts +0 -80
- package/src/hooks/swap/useSwap.ts +0 -359
- package/src/hooks/tokens/useAllTokensWithBalance.ts +0 -157
- package/src/hooks/tokens/useBalance.ts +0 -180
- package/src/hooks/tokens/useMultiChainBalance.ts +0 -59
- package/src/hooks/tokens/usePrices.ts +0 -52
- package/src/hooks/tokens/useSingleTokenPrice.ts +0 -45
- package/src/hooks/tokens/useSquidTokens.ts +0 -48
- package/src/hooks/tokens/useTokensWithBalance.ts +0 -169
- package/src/hooks/transaction/useEstimate.ts +0 -397
- package/src/hooks/transaction/useEstimatePriceImpact.ts +0 -39
- package/src/hooks/transaction/useExecuteTransaction.ts +0 -440
- package/src/hooks/transaction/useExpress.ts +0 -46
- package/src/hooks/transaction/useGetRoute.ts +0 -145
- package/src/hooks/transaction/useSingleTransaction.ts +0 -155
- package/src/hooks/transaction/useTransaction.ts +0 -734
- package/src/hooks/user/useUserParams.ts +0 -63
- package/src/hooks/wallet/useAddToken.ts +0 -53
- package/src/hooks/wallet/useAutoConnect.ts +0 -56
- package/src/hooks/wallet/useGnosisContext.ts +0 -84
- package/src/hooks/wallet/useIntegratorContext.ts +0 -44
- package/src/hooks/wallet/useMultiChainWallet.ts +0 -146
- package/src/hooks/wallet/useWallet.ts +0 -86
- package/src/hooks/webapp-router/useSquidRouter.ts +0 -42
- package/src/provider/index.tsx +0 -105
- package/src/react-app-env.d.ts +0 -2
- package/src/services/external/analyticsService.ts +0 -46
- package/src/services/external/coingeckoService.ts +0 -35
- package/src/services/external/rpcService.ts +0 -196
- package/src/services/external/secretService.ts +0 -178
- package/src/services/internal/apiService.ts +0 -6
- package/src/services/internal/assetsService.ts +0 -84
- package/src/services/internal/configService.ts +0 -261
- package/src/services/internal/eventService.ts +0 -93
- package/src/services/internal/priceService.ts +0 -10
- package/src/services/internal/transactionService.ts +0 -255
- package/src/services/internal/transactionStatusService.ts +0 -293
- package/src/services/internal/walletService.ts +0 -158
- package/src/tests/assetsService.test.ts +0 -176
- package/src/tests/configService.test.ts +0 -486
- package/src/tests/fetchSquidData.ts +0 -43
- package/src/tests/walletService.test.ts +0 -178
- package/tsconfig.cjs.json +0 -8
- package/tsconfig.json +0 -31
- /package/{src → dist}/assets/images/icons/wallets/binance.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/bitget.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/bitkeep.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/blockchaindotcom.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/brave.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/c98.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/coinbase.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/cosmostation.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/defiConnect.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/exodus.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/fetchai.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/keplr.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/leap.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/metamask.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/okx.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/rabby.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/trustwallet.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/walletConnect.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/wallet_icon.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/xdefi.svg +0 -0
- /package/{src → dist}/assets/images/icons/wallets/zerion.svg +0 -0
- /package/{src → dist}/contracts/typechain/factories/ERC20__factory.d.ts +0 -0
- /package/{src/core/index.ts → dist/core/index.d.ts} +0 -0
- /package/{src/services/index.ts → dist/services/index.d.ts} +0 -0
- /package/{src/tests/sample.json → dist/tests/jest-svg-transform.d.ts} +0 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { gasRefundMultiplier } from "./../../core/constants";
|
|
2
|
+
import { formatUnitsRounded } from "./../../core/numbers";
|
|
3
|
+
import { useSquidStore } from "./../../hooks/store/useSquidStore";
|
|
4
|
+
import { useNativeTokenBalanceFromChain } from "./../../hooks/tokens/useBalance";
|
|
5
|
+
import { useSingleTokenPrice } from "./../../hooks/tokens/useSingleTokenPrice";
|
|
6
|
+
import { useSquidTokens } from "./../../hooks/tokens/useSquidTokens";
|
|
7
|
+
import { ChainType } from "@0xsquid/squid-types";
|
|
8
|
+
import { BigNumber, constants } from "ethers";
|
|
9
|
+
import { formatUnits } from "ethers/lib/utils";
|
|
10
|
+
import { useMemo } from "react";
|
|
11
|
+
import { useSquidChains } from "../chains/useSquidChains";
|
|
12
|
+
import { useMultiChainBalance } from "../tokens/useMultiChainBalance";
|
|
13
|
+
export const useEstimate = ({ squidRoute, }) => {
|
|
14
|
+
const { config } = useSquidStore();
|
|
15
|
+
const { balance: nativeTokenBalanceFromChain } = useNativeTokenBalanceFromChain();
|
|
16
|
+
const { tokens } = useSquidTokens();
|
|
17
|
+
const { chains } = useSquidChains();
|
|
18
|
+
const [fromChain, toChain] = useMemo(() => {
|
|
19
|
+
return [
|
|
20
|
+
chains.find((c) => c.chainId === squidRoute.data?.params.fromChain),
|
|
21
|
+
chains.find((c) => c.chainId === squidRoute.data?.params.toChain),
|
|
22
|
+
];
|
|
23
|
+
}, [
|
|
24
|
+
chains,
|
|
25
|
+
squidRoute.data?.params.fromChain,
|
|
26
|
+
squidRoute.data?.params.toChain,
|
|
27
|
+
]);
|
|
28
|
+
const fromToken = useMemo(() => tokens.find((t) => t.address === squidRoute.data?.params.fromToken), [tokens, squidRoute.data?.params.fromToken]);
|
|
29
|
+
const balanceFormatted = useMultiChainBalance({
|
|
30
|
+
chain: fromChain,
|
|
31
|
+
token: fromToken,
|
|
32
|
+
userAddress: squidRoute.data?.params.fromAddress ?? "",
|
|
33
|
+
enabled: !!squidRoute.data,
|
|
34
|
+
}).balance ?? "0";
|
|
35
|
+
const fromAmount = useMemo(() => squidRoute.data?.estimate?.fromAmount ?? undefined, [squidRoute.data?.estimate?.fromAmount]);
|
|
36
|
+
const fromAmountFormatted = useMemo(() => (fromAmount ? formatUnits(fromAmount, fromToken?.decimals) : ""), [fromAmount, fromToken?.decimals]);
|
|
37
|
+
const sourceChainNativeToken = useMemo(() => {
|
|
38
|
+
return tokens.find((t) => t.symbol === fromChain?.nativeCurrency.symbol &&
|
|
39
|
+
t.chainId == fromChain?.chainId);
|
|
40
|
+
}, [tokens, fromChain]);
|
|
41
|
+
const destChainNativeToken = useMemo(() => {
|
|
42
|
+
return tokens.find((t) => t.symbol === toChain?.nativeCurrency.symbol &&
|
|
43
|
+
t.chainId == toChain?.chainId);
|
|
44
|
+
}, [tokens, toChain]);
|
|
45
|
+
const toAmountUSD = useMemo(() => squidRoute.data?.estimate?.toAmountUSD ?? undefined, [squidRoute.data?.estimate?.toAmountUSD]);
|
|
46
|
+
const toAmountUSDFloat = useMemo(() => (toAmountUSD ? parseFloat(toAmountUSD.replace(/,/g, "")) : 0), [toAmountUSD]);
|
|
47
|
+
const exchangeRate = useMemo(() => squidRoute.data?.estimate.exchangeRate ?? "0", [squidRoute.data?.estimate.exchangeRate]);
|
|
48
|
+
const toAmountMin = useMemo(() => {
|
|
49
|
+
return formatUnits(squidRoute.data?.estimate.toAmountMin ?? "0", squidRoute.data?.estimate.toToken.decimals);
|
|
50
|
+
}, [
|
|
51
|
+
squidRoute.data?.estimate.toAmountMin,
|
|
52
|
+
squidRoute.data?.estimate.toToken.decimals,
|
|
53
|
+
]);
|
|
54
|
+
const toAmount = useMemo(() => {
|
|
55
|
+
const formattedAmount = formatUnitsRounded(squidRoute.data?.estimate.toAmount ?? "0", squidRoute.data?.estimate.toToken.decimals, 14);
|
|
56
|
+
return formattedAmount === "0.0" ? "0" : formattedAmount;
|
|
57
|
+
}, [
|
|
58
|
+
squidRoute.data?.estimate.toAmount,
|
|
59
|
+
squidRoute.data?.estimate.toToken.decimals,
|
|
60
|
+
]);
|
|
61
|
+
/**
|
|
62
|
+
* At the moment we're only taking the first item
|
|
63
|
+
* of fees array, but keeping the possibility to display multiple fees
|
|
64
|
+
*/
|
|
65
|
+
const crossChainGasFee = useMemo(() => {
|
|
66
|
+
const estimate = squidRoute.data?.estimate;
|
|
67
|
+
return estimate?.feeCosts.length > 0 ? estimate?.feeCosts[0] : undefined;
|
|
68
|
+
}, [squidRoute.data?.estimate]);
|
|
69
|
+
const allFeeCosts = useMemo(() => {
|
|
70
|
+
const estimate = squidRoute.data?.estimate;
|
|
71
|
+
return estimate?.feeCosts ?? [];
|
|
72
|
+
}, [squidRoute.data?.estimate]);
|
|
73
|
+
const allGasCosts = useMemo(() => {
|
|
74
|
+
const estimate = squidRoute.data?.estimate;
|
|
75
|
+
return estimate?.gasCosts ?? [];
|
|
76
|
+
}, [squidRoute.data?.estimate]);
|
|
77
|
+
const firstGasCost = useMemo(() => allGasCosts.length > 0 ? allGasCosts[0] : undefined, [allGasCosts]);
|
|
78
|
+
const firstFeeCost = useMemo(() => allFeeCosts.length > 0 ? allFeeCosts[0] : undefined, [allFeeCosts]);
|
|
79
|
+
const integratorFeeCost = useMemo(() => allFeeCosts.length > 0 && config.collectFees
|
|
80
|
+
? // TODO: This is a hack to get the integrator fee, not mapped in squid types yet
|
|
81
|
+
allFeeCosts.find((f) => f.name === "Integrator Fee")
|
|
82
|
+
: undefined, [allFeeCosts, config]);
|
|
83
|
+
const { getUSDValue } = useSingleTokenPrice(firstFeeCost?.token);
|
|
84
|
+
const expressFeeCost = useMemo(() => allFeeCosts.length > 0
|
|
85
|
+
? allFeeCosts.find((f) => f.name === "Express Fee")
|
|
86
|
+
: undefined, [allFeeCosts]);
|
|
87
|
+
const expectedGasRefundCost = useMemo(() => BigNumber.from(firstFeeCost?.amount ?? "0")
|
|
88
|
+
.mul(
|
|
89
|
+
// When source is Cosmos we don't refund any gas
|
|
90
|
+
fromChain?.chainType === ChainType.COSMOS ? 0 : gasRefundMultiplier)
|
|
91
|
+
.div(100), [firstFeeCost?.amount]);
|
|
92
|
+
const sameTokenBetweenFees = useMemo(() => firstFeeCost?.token.address === firstGasCost?.token.address &&
|
|
93
|
+
firstFeeCost?.token.chainId === firstGasCost?.token.chainId, [
|
|
94
|
+
firstFeeCost?.token.address,
|
|
95
|
+
firstFeeCost?.token.chainId,
|
|
96
|
+
firstGasCost?.token.address,
|
|
97
|
+
firstGasCost?.token.chainId,
|
|
98
|
+
]);
|
|
99
|
+
// From token is the same as the native chain token
|
|
100
|
+
// TODO: This only works for EVM chains
|
|
101
|
+
const isFromTokenNative = useMemo(() => {
|
|
102
|
+
if (fromToken === undefined || fromChain?.chainId === undefined) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
return fromToken.symbol === fromChain.nativeCurrency.symbol;
|
|
106
|
+
}, [fromToken, fromChain]);
|
|
107
|
+
const totalNativeFees = useMemo(() => {
|
|
108
|
+
const expressBn = BigNumber.from(expressFeeCost?.amount ?? constants.Zero);
|
|
109
|
+
if (sameTokenBetweenFees) {
|
|
110
|
+
return BigNumber.from(firstFeeCost?.amount ?? constants.Zero)
|
|
111
|
+
.add(BigNumber.from(firstGasCost?.amount ?? constants.Zero))
|
|
112
|
+
.add(expressBn);
|
|
113
|
+
}
|
|
114
|
+
return BigNumber.from(firstGasCost?.amount ?? constants.Zero).add(expressBn);
|
|
115
|
+
}, [
|
|
116
|
+
firstFeeCost?.amount,
|
|
117
|
+
firstGasCost?.amount,
|
|
118
|
+
sameTokenBetweenFees,
|
|
119
|
+
expressFeeCost?.amount,
|
|
120
|
+
]);
|
|
121
|
+
const totalFeesInNativeTokenPlusRatio = useMemo(() => {
|
|
122
|
+
return totalNativeFees.mul(105).div(100);
|
|
123
|
+
}, [totalNativeFees]);
|
|
124
|
+
const totalWithRefundEstimate = useMemo(() => {
|
|
125
|
+
const firstFee = {
|
|
126
|
+
BN: BigNumber.from(firstFeeCost?.amount ?? "0"),
|
|
127
|
+
token: firstFeeCost?.token,
|
|
128
|
+
};
|
|
129
|
+
const expressFee = {
|
|
130
|
+
BN: BigNumber.from(expressFeeCost?.amount ?? "0"),
|
|
131
|
+
token: expressFeeCost?.token,
|
|
132
|
+
};
|
|
133
|
+
// Big number amount
|
|
134
|
+
const totalBnbAmount = firstFee.BN.add(expressFee.BN).sub(expectedGasRefundCost);
|
|
135
|
+
const totalAmount = formatUnits(totalBnbAmount, firstFee.token?.decimals ?? 18);
|
|
136
|
+
// USD values
|
|
137
|
+
const formattedRefundCost = formatUnits(expectedGasRefundCost, firstFeeCost?.token.decimals);
|
|
138
|
+
const formattedRefundCostUSD = getUSDValue(formattedRefundCost);
|
|
139
|
+
const totalAmountUSD = +(firstFeeCost?.amountUsd ?? 0) +
|
|
140
|
+
+(expressFeeCost?.amountUsd ?? 0) -
|
|
141
|
+
+(formattedRefundCostUSD ?? 0);
|
|
142
|
+
return {
|
|
143
|
+
totalAmount,
|
|
144
|
+
totalAmountUSD,
|
|
145
|
+
feeToken: firstFeeCost?.token,
|
|
146
|
+
};
|
|
147
|
+
}, [
|
|
148
|
+
expectedGasRefundCost,
|
|
149
|
+
expressFeeCost?.amount,
|
|
150
|
+
expressFeeCost?.amountUsd,
|
|
151
|
+
expressFeeCost?.token,
|
|
152
|
+
firstFeeCost?.amount,
|
|
153
|
+
firstFeeCost?.amountUsd,
|
|
154
|
+
firstFeeCost?.token,
|
|
155
|
+
getUSDValue,
|
|
156
|
+
]);
|
|
157
|
+
/**
|
|
158
|
+
* Two cases:
|
|
159
|
+
* 1. If the source token is the same as the native token, check if the balance of native token is less than the (source amount) + (native gas)
|
|
160
|
+
* 2. If the source token is different from the native token, check if the balance of native token is less than (native gas)
|
|
161
|
+
*/
|
|
162
|
+
const fromBalanceEnoughToSwap = useMemo(() => {
|
|
163
|
+
if (squidRoute.isLoading)
|
|
164
|
+
return true;
|
|
165
|
+
const fromAmountWei = BigNumber.from(fromAmount ?? constants.Zero);
|
|
166
|
+
const fromBalance = nativeTokenBalanceFromChain.data ?? constants.Zero;
|
|
167
|
+
if (isFromTokenNative) {
|
|
168
|
+
const fromPlusGas = fromAmountWei.add(totalFeesInNativeTokenPlusRatio);
|
|
169
|
+
if (fromPlusGas.lte(fromBalance)) {
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if (totalFeesInNativeTokenPlusRatio.lte(fromBalance)) {
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
return false;
|
|
177
|
+
}, [
|
|
178
|
+
nativeTokenBalanceFromChain.data,
|
|
179
|
+
fromAmount,
|
|
180
|
+
isFromTokenNative,
|
|
181
|
+
squidRoute.isLoading,
|
|
182
|
+
totalFeesInNativeTokenPlusRatio,
|
|
183
|
+
]);
|
|
184
|
+
/**
|
|
185
|
+
* In the case where the source token is the same as the native token,
|
|
186
|
+
* we need to advise the user to change the source amount to be less than the balance of native token minus the gas cost
|
|
187
|
+
*/
|
|
188
|
+
const minAmountValueWarnMsg = useMemo(() => {
|
|
189
|
+
if (!isFromTokenNative) {
|
|
190
|
+
return undefined;
|
|
191
|
+
}
|
|
192
|
+
const fromBalance = nativeTokenBalanceFromChain.data ?? constants.Zero;
|
|
193
|
+
const minAmount = fromBalance.sub(totalFeesInNativeTokenPlusRatio);
|
|
194
|
+
if (minAmount.gt(constants.Zero)) {
|
|
195
|
+
const parsedMinAmount = formatUnits(minAmount, sourceChainNativeToken?.decimals ?? 18);
|
|
196
|
+
return parsedMinAmount;
|
|
197
|
+
}
|
|
198
|
+
return "0";
|
|
199
|
+
}, [
|
|
200
|
+
nativeTokenBalanceFromChain.data,
|
|
201
|
+
isFromTokenNative,
|
|
202
|
+
sourceChainNativeToken?.decimals,
|
|
203
|
+
totalFeesInNativeTokenPlusRatio,
|
|
204
|
+
]);
|
|
205
|
+
const proposedGasDestinationAmount = useMemo(() => {
|
|
206
|
+
// Get native token of chain
|
|
207
|
+
const nativeToken = toChain?.nativeCurrency.symbol;
|
|
208
|
+
let gasDestinationAmount = 0;
|
|
209
|
+
switch (nativeToken) {
|
|
210
|
+
case "GLMR":
|
|
211
|
+
gasDestinationAmount = 5.289;
|
|
212
|
+
break;
|
|
213
|
+
case "ETH":
|
|
214
|
+
gasDestinationAmount = 0.0009;
|
|
215
|
+
break;
|
|
216
|
+
case "AVAX":
|
|
217
|
+
gasDestinationAmount = 0.115;
|
|
218
|
+
break;
|
|
219
|
+
case "BNB":
|
|
220
|
+
gasDestinationAmount = 0.00425;
|
|
221
|
+
break;
|
|
222
|
+
case "FTM":
|
|
223
|
+
gasDestinationAmount = 4.45;
|
|
224
|
+
break;
|
|
225
|
+
case "CELO":
|
|
226
|
+
gasDestinationAmount = 3.052;
|
|
227
|
+
break;
|
|
228
|
+
case "KAVA":
|
|
229
|
+
gasDestinationAmount = 2.339;
|
|
230
|
+
break;
|
|
231
|
+
case "MATIC":
|
|
232
|
+
gasDestinationAmount = 1.795;
|
|
233
|
+
break;
|
|
234
|
+
default:
|
|
235
|
+
gasDestinationAmount = 0;
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
return { value: gasDestinationAmount, currency: nativeToken };
|
|
239
|
+
}, [toChain?.nativeCurrency.symbol]);
|
|
240
|
+
const enoughBalanceToSwap = useMemo(() => +balanceFormatted >= 0 && +balanceFormatted > +fromAmountFormatted, [balanceFormatted, fromAmountFormatted]);
|
|
241
|
+
return {
|
|
242
|
+
allFeeCosts,
|
|
243
|
+
allGasCosts,
|
|
244
|
+
crossChainGasFee,
|
|
245
|
+
exchangeRate,
|
|
246
|
+
toAmountMin,
|
|
247
|
+
toAmount,
|
|
248
|
+
fromToken,
|
|
249
|
+
toAmountUSD,
|
|
250
|
+
toAmountUSDFloat,
|
|
251
|
+
isFetching: squidRoute.isLoading,
|
|
252
|
+
squidRouteError: squidRoute.error,
|
|
253
|
+
fromAmount,
|
|
254
|
+
fromAmountFormatted,
|
|
255
|
+
estimatedRouteDuration: squidRoute.data?.estimate?.estimatedRouteDuration,
|
|
256
|
+
minAmountValueWarnMsg,
|
|
257
|
+
fromBalanceEnoughToSwap,
|
|
258
|
+
isFromTokenNative,
|
|
259
|
+
firstFeeCost,
|
|
260
|
+
firstGasCost,
|
|
261
|
+
sameTokenBetweenFees,
|
|
262
|
+
totalFeesInNativeTokenPlusRatio,
|
|
263
|
+
totalNativeFees,
|
|
264
|
+
sourceChainNativeToken,
|
|
265
|
+
expressFeeCost,
|
|
266
|
+
proposedGasDestinationAmount,
|
|
267
|
+
expectedGasRefundCost,
|
|
268
|
+
totalWithRefundEstimate,
|
|
269
|
+
destChainNativeToken,
|
|
270
|
+
integratorFeeCost,
|
|
271
|
+
enoughBalanceToSwap,
|
|
272
|
+
};
|
|
273
|
+
};
|
|
274
|
+
//# sourceMappingURL=useEstimate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEstimate.js","sourceRoot":"","sources":["../../../src/hooks/transaction/useEstimate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useSquidStore } from "./../../hooks/store/useSquidStore";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
export const useEstimatePriceImpact = ({ squidRoute, }) => {
|
|
4
|
+
const { config } = useSquidStore();
|
|
5
|
+
const priceImpact = useMemo(() => squidRoute.data?.estimate?.aggregatePriceImpact ?? undefined, [squidRoute.data?.estimate]);
|
|
6
|
+
const priceImpactStatus = useMemo(() => {
|
|
7
|
+
if (config.priceImpactWarnings !== undefined && priceImpact !== undefined) {
|
|
8
|
+
if (+priceImpact >= config.priceImpactWarnings.warning &&
|
|
9
|
+
+priceImpact < config.priceImpactWarnings.critical) {
|
|
10
|
+
return "warning";
|
|
11
|
+
}
|
|
12
|
+
if (+priceImpact >= config.priceImpactWarnings.critical) {
|
|
13
|
+
return "critical";
|
|
14
|
+
}
|
|
15
|
+
if (+priceImpact < config.priceImpactWarnings.warning) {
|
|
16
|
+
return "normal";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}, [config.priceImpactWarnings, priceImpact]);
|
|
21
|
+
return {
|
|
22
|
+
priceImpact,
|
|
23
|
+
priceImpactStatus,
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=useEstimatePriceImpact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEstimatePriceImpact.js","sourceRoot":"","sources":["../../../src/hooks/transaction/useEstimatePriceImpact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EACrC,UAAU,GAGX,EAAE,EAAE;IACH,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAEnC,MAAM,WAAW,GAAG,OAAO,CACzB,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,oBAAoB,IAAI,SAAS,EAClE,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAC5B,CAAC;IAEF,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,MAAM,CAAC,mBAAmB,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC1E,IACE,CAAC,WAAW,IAAI,MAAM,CAAC,mBAAmB,CAAC,OAAO;gBAClD,CAAC,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAClD,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC;gBACxD,OAAO,UAAU,CAAC;YACpB,CAAC;YACD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC;gBACtD,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,EAAE,CAAC,MAAM,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC,CAAC;IAE9C,OAAO;QACL,WAAW;QACX,iBAAiB;KAClB,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { TransactionReceipt } from "@ethersproject/abstract-provider";
|
|
2
|
+
import type { TransactionParams } from "@/core/types/transaction";
|
|
3
|
+
import { useGetRoute } from "@/hooks/transaction/useGetRoute";
|
|
4
|
+
declare enum ExecutionState {
|
|
5
|
+
NOT_ENOUGH_BALANCE = "NOT_ENOUGH_BALANCE",
|
|
6
|
+
NOT_CONNECTED = "NOT_CONNECTED",
|
|
7
|
+
READY = "READY"
|
|
8
|
+
}
|
|
9
|
+
export declare const useExecuteTransaction: (route: ReturnType<typeof useGetRoute>) => {
|
|
10
|
+
swapQuery: import("@tanstack/react-query").UseMutationResult<boolean | TransactionReceipt, any, void, unknown>;
|
|
11
|
+
currentTransaction: TransactionParams | undefined;
|
|
12
|
+
fromToken: import("@0xsquid/squid-types/dist/tokens").Token | undefined;
|
|
13
|
+
toToken: import("@0xsquid/squid-types/dist/tokens").Token | undefined;
|
|
14
|
+
fromPrice: string | undefined;
|
|
15
|
+
toPrice: number | undefined;
|
|
16
|
+
toChain: import("@0xsquid/squid-types/dist/chains").ChainData | undefined;
|
|
17
|
+
fromChain: import("@0xsquid/squid-types/dist/chains").ChainData | undefined;
|
|
18
|
+
executionState: ExecutionState;
|
|
19
|
+
};
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
// import type { TransactionResponse } from "@0xsquid/sdk/dist/types/ethers";
|
|
2
|
+
import { useCosmosContext } from "./../../core/providers/CosmosProvider";
|
|
3
|
+
import { keys } from "./../../core/queries/queries-keys";
|
|
4
|
+
import { TransactionErrorType } from "./../../core/types/error";
|
|
5
|
+
import { ChainType } from "@0xsquid/sdk/dist/types";
|
|
6
|
+
import { SigningCosmWasmClient } from "@cosmjs/cosmwasm-stargate";
|
|
7
|
+
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
|
8
|
+
import { TxRaw } from "cosmjs-types/cosmos/tx/v1beta1/tx";
|
|
9
|
+
import { Logger } from "ethers/lib/utils.js";
|
|
10
|
+
import { useCallback, useMemo } from "react";
|
|
11
|
+
import { useAccount, useSigner } from "wagmi";
|
|
12
|
+
import { TransactionStatus } from "./../../core/types/transaction";
|
|
13
|
+
import { getWorkingCosmosRpcUrl } from "./../../services/external/rpcService";
|
|
14
|
+
import { getTransactionError } from "./../../services/internal/errorService";
|
|
15
|
+
import { getSourceExplorerTxUrl, replaceTransactionAtNonce, updateTransactionHistoryStatus, } from "./../../services/internal/transactionService";
|
|
16
|
+
import { useSquidChains } from "./../../hooks//chains/useSquidChains";
|
|
17
|
+
import { usePersistStore, useSquidStore } from "./../../hooks/store/useSquidStore";
|
|
18
|
+
import { useSwap } from "./../../hooks/swap/useSwap";
|
|
19
|
+
import { useEstimate } from "./../../hooks/transaction/useEstimate";
|
|
20
|
+
import { useGnosisContext } from "./../../hooks/wallet/useGnosisContext";
|
|
21
|
+
import { useMultiChainWallet } from "./../../hooks/wallet/useMultiChainWallet";
|
|
22
|
+
import { WidgetEvents } from "./../../services/internal/eventService";
|
|
23
|
+
var ExecutionState;
|
|
24
|
+
(function (ExecutionState) {
|
|
25
|
+
ExecutionState["NOT_ENOUGH_BALANCE"] = "NOT_ENOUGH_BALANCE";
|
|
26
|
+
ExecutionState["NOT_CONNECTED"] = "NOT_CONNECTED";
|
|
27
|
+
ExecutionState["READY"] = "READY";
|
|
28
|
+
})(ExecutionState || (ExecutionState = {}));
|
|
29
|
+
export const useExecuteTransaction = (route) => {
|
|
30
|
+
const signer = useSigner();
|
|
31
|
+
const { cosmosSigner } = useCosmosContext();
|
|
32
|
+
const { chains } = useSquidChains();
|
|
33
|
+
const queryClient = useQueryClient();
|
|
34
|
+
const { fromPrice, toPrice, squid, currentTransaction, config } = useSquidStore();
|
|
35
|
+
const { enoughBalanceToSwap } = useEstimate({
|
|
36
|
+
squidRoute: route,
|
|
37
|
+
});
|
|
38
|
+
const { connector: activeConnector } = useAccount();
|
|
39
|
+
const { fromChain, toChain, fromToken, toToken } = useSwap();
|
|
40
|
+
const { getGnosisTransactionHash } = useGnosisContext();
|
|
41
|
+
const { connectedAddress: sourceUserAddress } = useMultiChainWallet(fromChain);
|
|
42
|
+
const isSameChainSwap = useMemo(() => fromChain?.chainId === toChain?.chainId, [fromChain?.chainId, toChain?.chainId]);
|
|
43
|
+
/**
|
|
44
|
+
* States to see if the swap execution is possible or not based on swap & user params
|
|
45
|
+
* And if not possible, gives the reason
|
|
46
|
+
* TODO: The NOT_ENOUGH_BALANCE state could be fetch independently from the route response, only based on user fromAmount
|
|
47
|
+
*/
|
|
48
|
+
const executionState = useMemo(() => {
|
|
49
|
+
if (!enoughBalanceToSwap) {
|
|
50
|
+
return ExecutionState.NOT_ENOUGH_BALANCE;
|
|
51
|
+
}
|
|
52
|
+
// TODO:; Add more states here
|
|
53
|
+
return ExecutionState.READY;
|
|
54
|
+
}, [enoughBalanceToSwap]);
|
|
55
|
+
/**
|
|
56
|
+
* This method is used to persist the transaction in local storage
|
|
57
|
+
* This way we can access user's transaction history
|
|
58
|
+
* TODO: This part will be fetched from the backend, using user address in the future
|
|
59
|
+
* @param txToPersist
|
|
60
|
+
* @param route
|
|
61
|
+
*/
|
|
62
|
+
const persistTransaction = async (txToPersist, route) => {
|
|
63
|
+
// Persisting the transaction in local storage
|
|
64
|
+
if (route) {
|
|
65
|
+
const previousHistoryList = usePersistStore.getState().transactionsHistory ?? [];
|
|
66
|
+
const newHistoryElement = {
|
|
67
|
+
...txToPersist,
|
|
68
|
+
params: route.params,
|
|
69
|
+
estimate: route.estimate,
|
|
70
|
+
};
|
|
71
|
+
usePersistStore.setState({
|
|
72
|
+
transactionsHistory: [...previousHistoryList, newHistoryElement],
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Set the transaction state in the store
|
|
78
|
+
* This is useful to access the latest transaction from any hook
|
|
79
|
+
*/
|
|
80
|
+
const setTransactionState = useCallback(({ route, txHash, nonce, status, sourceStatus, userAddress, axelarUrl, }) => {
|
|
81
|
+
if (route && route.transactionRequest) {
|
|
82
|
+
const { routeType } = route.transactionRequest;
|
|
83
|
+
const tx = {
|
|
84
|
+
fromChain,
|
|
85
|
+
toChain,
|
|
86
|
+
routeType,
|
|
87
|
+
nonce,
|
|
88
|
+
transactionId: txHash,
|
|
89
|
+
status,
|
|
90
|
+
sourceStatus,
|
|
91
|
+
timestamp: Date.now(),
|
|
92
|
+
fromAddress: userAddress,
|
|
93
|
+
sourceTxExplorerUrl: getSourceExplorerTxUrl(fromChain, txHash),
|
|
94
|
+
sourceExplorerImgUrl: fromChain?.chainIconURI,
|
|
95
|
+
axelarUrl,
|
|
96
|
+
};
|
|
97
|
+
useSquidStore.setState({
|
|
98
|
+
currentTransaction: tx,
|
|
99
|
+
});
|
|
100
|
+
return tx;
|
|
101
|
+
}
|
|
102
|
+
return undefined;
|
|
103
|
+
}, [fromChain, toChain]);
|
|
104
|
+
const swapQueryCosmos = useMutation(async (route) => {
|
|
105
|
+
const chainData = chains.find((c) => c.chainId === route?.params.fromChain);
|
|
106
|
+
if (cosmosSigner && chainData) {
|
|
107
|
+
try {
|
|
108
|
+
const rpc = await getWorkingCosmosRpcUrl(chainData);
|
|
109
|
+
const signingClient = await SigningCosmWasmClient.connectWithSigner(rpc, cosmosSigner);
|
|
110
|
+
const signerAddress = (await cosmosSigner.getAccounts())[0].address;
|
|
111
|
+
if (signerAddress && signingClient && route) {
|
|
112
|
+
const tx = (await squid?.executeRoute({
|
|
113
|
+
signer: signingClient,
|
|
114
|
+
signerAddress,
|
|
115
|
+
route,
|
|
116
|
+
executionSettings: {
|
|
117
|
+
infiniteApproval: config.infiniteApproval,
|
|
118
|
+
},
|
|
119
|
+
}));
|
|
120
|
+
// set the tx state to loading, as soon as user signed the tx
|
|
121
|
+
setTransactionState({
|
|
122
|
+
txHash: "", // We don't have the hash yet
|
|
123
|
+
route,
|
|
124
|
+
status: TransactionStatus.ONGOING,
|
|
125
|
+
sourceStatus: TransactionStatus.ONGOING,
|
|
126
|
+
});
|
|
127
|
+
// broadcast the signed tx to get hash and listen to events
|
|
128
|
+
const response = await signingClient.broadcastTx(TxRaw.encode(tx).finish());
|
|
129
|
+
const hash = response.transactionHash;
|
|
130
|
+
// Dispatch event so it can be listened from outside the widget
|
|
131
|
+
WidgetEvents.getInstance().dispatchSwapExecuteCall(route, hash);
|
|
132
|
+
const txParams = setTransactionState({
|
|
133
|
+
route,
|
|
134
|
+
txHash: hash,
|
|
135
|
+
userAddress: sourceUserAddress,
|
|
136
|
+
status: TransactionStatus.ONGOING,
|
|
137
|
+
sourceStatus: TransactionStatus.ONGOING,
|
|
138
|
+
axelarUrl: undefined,
|
|
139
|
+
});
|
|
140
|
+
if (txParams) {
|
|
141
|
+
persistTransaction(txParams);
|
|
142
|
+
}
|
|
143
|
+
return response.code === 0;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.log(error);
|
|
148
|
+
const castedError = error ?? {};
|
|
149
|
+
if (castedError.message?.includes("Request rejected")) {
|
|
150
|
+
throw new Error(castedError.message);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
throw new Error("Need all parameters");
|
|
155
|
+
});
|
|
156
|
+
// If the transaction is replaced, we need to update the transaction hash
|
|
157
|
+
// Transaction replaced can mean that the user has speed up the transaction for example
|
|
158
|
+
// Could also be cancelled
|
|
159
|
+
const handleTransactionReplacementError = useCallback(async ({ error, route, status, sourceStatus, userAddress, axelarUrl, }) => {
|
|
160
|
+
if (route && error.code === Logger.errors.TRANSACTION_REPLACED) {
|
|
161
|
+
const txReplacementError = error;
|
|
162
|
+
const { hash: newHash, nonce: newNonce } = txReplacementError.replacement;
|
|
163
|
+
if (route.transactionRequest) {
|
|
164
|
+
const txParams = setTransactionState({
|
|
165
|
+
route,
|
|
166
|
+
txHash: newHash,
|
|
167
|
+
nonce: newNonce,
|
|
168
|
+
userAddress: sourceUserAddress,
|
|
169
|
+
status,
|
|
170
|
+
sourceStatus,
|
|
171
|
+
axelarUrl: undefined,
|
|
172
|
+
});
|
|
173
|
+
if (txParams) {
|
|
174
|
+
const newHistoryElement = {
|
|
175
|
+
...txParams,
|
|
176
|
+
params: route.params,
|
|
177
|
+
estimate: route.estimate,
|
|
178
|
+
};
|
|
179
|
+
// Need to store the new transaction hash on the previous transaction
|
|
180
|
+
usePersistStore.setState({
|
|
181
|
+
transactionsHistory: replaceTransactionAtNonce(newNonce, sourceUserAddress, usePersistStore.getState().transactionsHistory, newHistoryElement),
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
const response = await txReplacementError.replacement.wait();
|
|
187
|
+
return response;
|
|
188
|
+
}
|
|
189
|
+
catch (replacementError) {
|
|
190
|
+
// Maybe the transaction was replaced again
|
|
191
|
+
// recursive call
|
|
192
|
+
return handleTransactionReplacementError({
|
|
193
|
+
error,
|
|
194
|
+
route,
|
|
195
|
+
status,
|
|
196
|
+
sourceStatus,
|
|
197
|
+
userAddress,
|
|
198
|
+
axelarUrl,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
}, [setTransactionState, sourceUserAddress, squid?.axelarscanURL]);
|
|
206
|
+
const swapQueryEvm = useMutation(async (route) => {
|
|
207
|
+
if (route && !!squid && signer.isSuccess && signer.data) {
|
|
208
|
+
const txResponse = (await squid.executeRoute({
|
|
209
|
+
signer: signer.data,
|
|
210
|
+
route,
|
|
211
|
+
executionSettings: {
|
|
212
|
+
infiniteApproval: config.infiniteApproval,
|
|
213
|
+
},
|
|
214
|
+
}));
|
|
215
|
+
let hash = txResponse.hash;
|
|
216
|
+
if (activeConnector?.id === "safe") {
|
|
217
|
+
hash = await getGnosisTransactionHash(txResponse.hash);
|
|
218
|
+
}
|
|
219
|
+
// Dispatch event so it can be listened from outside the widget
|
|
220
|
+
WidgetEvents.getInstance().dispatchSwapExecuteCall(route, hash);
|
|
221
|
+
if (route.transactionRequest) {
|
|
222
|
+
const txParams = setTransactionState({
|
|
223
|
+
route,
|
|
224
|
+
txHash: hash,
|
|
225
|
+
nonce: txResponse.nonce,
|
|
226
|
+
userAddress: sourceUserAddress,
|
|
227
|
+
status: TransactionStatus.INITIAL_LOADING,
|
|
228
|
+
sourceStatus: TransactionStatus.ONGOING,
|
|
229
|
+
axelarUrl: undefined,
|
|
230
|
+
});
|
|
231
|
+
if (txParams) {
|
|
232
|
+
persistTransaction(txParams);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
const response = await txResponse.wait();
|
|
237
|
+
return response;
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
return handleTransactionReplacementError({
|
|
241
|
+
error,
|
|
242
|
+
route,
|
|
243
|
+
status: TransactionStatus.INITIAL_LOADING,
|
|
244
|
+
sourceStatus: TransactionStatus.ONGOING,
|
|
245
|
+
userAddress: sourceUserAddress,
|
|
246
|
+
axelarUrl: undefined,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
throw new Error("Need all parameters");
|
|
251
|
+
});
|
|
252
|
+
/**
|
|
253
|
+
* Execute cross chain swap with selected tokens
|
|
254
|
+
* getRoute should be called before this mutation
|
|
255
|
+
*/
|
|
256
|
+
const swapQuery = useMutation(async () => {
|
|
257
|
+
const sourceChain = chains?.find((chain) => chain.chainId == route.data?.params?.fromChain);
|
|
258
|
+
if (sourceChain?.chainType === ChainType.COSMOS) {
|
|
259
|
+
return swapQueryCosmos.mutateAsync(route.data);
|
|
260
|
+
}
|
|
261
|
+
if (sourceChain?.chainType === ChainType.EVM) {
|
|
262
|
+
return swapQueryEvm.mutateAsync(route.data);
|
|
263
|
+
}
|
|
264
|
+
throw new Error("Invalid parameters or chain not found");
|
|
265
|
+
}, {
|
|
266
|
+
onError: (error) => {
|
|
267
|
+
const { currentTransaction: currentTx } = useSquidStore.getState();
|
|
268
|
+
const errorObject = getTransactionError(error);
|
|
269
|
+
useSquidStore.setState({
|
|
270
|
+
currentTransaction: {
|
|
271
|
+
...currentTx,
|
|
272
|
+
status: TransactionStatus.ERROR,
|
|
273
|
+
sourceStatus: TransactionStatus.ERROR,
|
|
274
|
+
error: errorObject,
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
if (currentTx?.transactionId &&
|
|
278
|
+
errorObject?.type === TransactionErrorType.CALL_EXCEPTION) {
|
|
279
|
+
usePersistStore.setState({
|
|
280
|
+
transactionsHistory: updateTransactionHistoryStatus(currentTransaction?.transactionId, TransactionStatus.ERROR, usePersistStore.getState().transactionsHistory, undefined),
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
onSuccess: () => {
|
|
285
|
+
const { currentTransaction: currentTx } = useSquidStore.getState();
|
|
286
|
+
queryClient.invalidateQueries(keys({}).balances());
|
|
287
|
+
useSquidStore.setState({
|
|
288
|
+
currentTransaction: {
|
|
289
|
+
...currentTx,
|
|
290
|
+
sourceStatus: TransactionStatus.SUCCESS,
|
|
291
|
+
status: isSameChainSwap
|
|
292
|
+
? TransactionStatus.SUCCESS
|
|
293
|
+
: TransactionStatus.ONGOING,
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
},
|
|
297
|
+
});
|
|
298
|
+
return {
|
|
299
|
+
swapQuery,
|
|
300
|
+
currentTransaction,
|
|
301
|
+
fromToken,
|
|
302
|
+
toToken,
|
|
303
|
+
fromPrice,
|
|
304
|
+
toPrice,
|
|
305
|
+
toChain,
|
|
306
|
+
fromChain,
|
|
307
|
+
executionState,
|
|
308
|
+
};
|
|
309
|
+
};
|
|
310
|
+
//# sourceMappingURL=useExecuteTransaction.js.map
|