@ape.swap/bonds-sdk 6.2.2 → 6.2.3
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/components/TokenSelectorModal/TokenRow.js +2 -2
- package/dist/components/TokenSelectorModal/TokenRow.js.map +1 -1
- package/dist/components/TokenSelectorPanel/index.js +3 -3
- package/dist/components/TokenSelectorPanel/index.js.map +1 -1
- package/dist/providers/index.d.ts +11 -0
- package/dist/providers/index.js +0 -6
- package/dist/providers/index.js.map +1 -1
- package/dist/state/allowance/useAllowance.js +2 -3
- package/dist/state/allowance/useAllowance.js.map +1 -1
- package/dist/state/balance/useCurrencyBalance.js +2 -3
- package/dist/state/balance/useCurrencyBalance.js.map +1 -1
- package/dist/state/balance/useCurrencyBalanceAptos.js +5 -5
- package/dist/state/balance/useCurrencyBalanceAptos.js.map +1 -1
- package/dist/state/balance/useCurrencyBalanceSolana.js +3 -5
- package/dist/state/balance/useCurrencyBalanceSolana.js.map +1 -1
- package/dist/state/balance/useCurrencyBalanceSui.js +2 -2
- package/dist/state/balance/useCurrencyBalanceSui.js.map +1 -1
- package/dist/state/balance/useUserTokensBalance.js +3 -5
- package/dist/state/balance/useUserTokensBalance.js.map +1 -1
- package/dist/state/bonds/fetchBondsData/cleanBillsData.js +16 -13
- package/dist/state/bonds/fetchBondsData/cleanBillsData.js.map +1 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataAptos.d.ts +1 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataAptos.js +4 -6
- package/dist/state/bonds/fetchBondsData/fetchBondsDataAptos.js.map +1 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataEVM.d.ts +1 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataEVM.js +4 -3
- package/dist/state/bonds/fetchBondsData/fetchBondsDataEVM.js.map +1 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataSOL.d.ts +1 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataSOL.js +2 -3
- package/dist/state/bonds/fetchBondsData/fetchBondsDataSOL.js.map +1 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataSui.d.ts +1 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataSui.js +5 -7
- package/dist/state/bonds/fetchBondsData/fetchBondsDataSui.js.map +1 -1
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsEVM.js +1 -4
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsEVM.js.map +1 -1
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSOL.js +2 -5
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSOL.js.map +1 -1
- package/dist/state/bonds/useUserBondsPreTGE.js +3 -6
- package/dist/state/bonds/useUserBondsPreTGE.js.map +1 -1
- package/dist/state/tiers/useTierPoints.js +15 -16
- package/dist/state/tiers/useTierPoints.js.map +1 -1
- package/dist/state/zap/useAptosZapQuote.js +4 -4
- package/dist/state/zap/useAptosZapQuote.js.map +1 -1
- package/dist/state/zap/useJupiterSolanaQuote.js +4 -11
- package/dist/state/zap/useJupiterSolanaQuote.js.map +1 -1
- package/dist/state/zap/useSoulZapBondQuote.js +12 -20
- package/dist/state/zap/useSoulZapBondQuote.js.map +1 -1
- package/dist/state/zap/useSuiZapQuote.js +9 -14
- package/dist/state/zap/useSuiZapQuote.js.map +1 -1
- package/dist/utils/bondPriceHelpers.d.ts +1 -1
- package/dist/utils/bondPriceHelpers.js +5 -11
- package/dist/utils/bondPriceHelpers.js.map +1 -1
- package/dist/utils/calculateSolanaTrueBillPrice.d.ts +0 -3
- package/dist/utils/calculateSolanaTrueBillPrice.js +33 -27
- package/dist/utils/calculateSolanaTrueBillPrice.js.map +1 -1
- package/dist/utils/convertToBigish.js +2 -17
- package/dist/utils/convertToBigish.js.map +1 -1
- package/dist/utils/displayHelpers.d.ts +3 -3
- package/dist/utils/displayHelpers.js +62 -46
- package/dist/utils/displayHelpers.js.map +1 -1
- package/dist/utils/fixedPoint.d.ts +28 -0
- package/dist/utils/fixedPoint.js +239 -0
- package/dist/utils/fixedPoint.js.map +1 -0
- package/dist/utils/formatNumber.js +5 -11
- package/dist/utils/formatNumber.js.map +1 -1
- package/dist/utils/getBalanceNumber.d.ts +1 -2
- package/dist/utils/getBalanceNumber.js +5 -3
- package/dist/utils/getBalanceNumber.js.map +1 -1
- package/dist/views/Bonds/components/BondRows/ActiveBondRows.js +2 -3
- package/dist/views/Bonds/components/BondRows/ActiveBondRows.js.map +1 -1
- package/dist/views/Bonds/components/BonusComponents/BonusComponent.js +1 -2
- package/dist/views/Bonds/components/BonusComponents/BonusComponent.js.map +1 -1
- package/dist/views/Bonds/components/BonusComponents/BonusTable.js +1 -2
- package/dist/views/Bonds/components/BonusComponents/BonusTable.js.map +1 -1
- package/dist/views/Bonds/components/BuyAgainRow/index.js +2 -4
- package/dist/views/Bonds/components/BuyAgainRow/index.js.map +1 -1
- package/dist/views/Bonds/utils.js +2 -3
- package/dist/views/Bonds/utils.js.map +1 -1
- package/dist/views/BuyBond/BuyComponent.js +16 -17
- package/dist/views/BuyBond/BuyComponent.js.map +1 -1
- package/dist/views/BuyBond/BuyComponentAptos.js +20 -33
- package/dist/views/BuyBond/BuyComponentAptos.js.map +1 -1
- package/dist/views/BuyBond/BuyComponentPreTGE.js +6 -8
- package/dist/views/BuyBond/BuyComponentPreTGE.js.map +1 -1
- package/dist/views/BuyBond/BuyComponentSolana.js +20 -27
- package/dist/views/BuyBond/BuyComponentSolana.js.map +1 -1
- package/dist/views/BuyBond/BuyComponentSui.js +15 -28
- package/dist/views/BuyBond/BuyComponentSui.js.map +1 -1
- package/dist/views/BuyBond/components/NewRateModal/NewRateModal.js +2 -2
- package/dist/views/BuyBond/components/NewRateModal/NewRateModal.js.map +1 -1
- package/dist/views/BuyBond/components/PointsLeftForNextTier/PointsLeftForNextTier.js +6 -9
- package/dist/views/BuyBond/components/PointsLeftForNextTier/PointsLeftForNextTier.js.map +1 -1
- package/dist/views/ProjectView/components/BondStats/index.js +2 -4
- package/dist/views/ProjectView/components/BondStats/index.js.map +1 -1
- package/dist/views/YourBonds/components/UserBondRow/UserBondRowPreTGE.js +4 -5
- package/dist/views/YourBonds/components/UserBondRow/UserBondRowPreTGE.js.map +1 -1
- package/dist/views/YourBondsModal/components/LinkShare/htmlToJpeg.d.ts +8 -0
- package/dist/views/YourBondsModal/components/LinkShare/htmlToJpeg.js +43 -0
- package/dist/views/YourBondsModal/components/LinkShare/htmlToJpeg.js.map +1 -0
- package/dist/views/YourBondsModal/components/LinkShare/templateImageShare.d.ts +8 -1
- package/dist/views/YourBondsModal/components/LinkShare/templateImageShare.js +172 -15
- package/dist/views/YourBondsModal/components/LinkShare/templateImageShare.js.map +1 -1
- package/dist/views/YourBondsModal/components/LinkShare/utils.js +19 -10
- package/dist/views/YourBondsModal/components/LinkShare/utils.js.map +1 -1
- package/dist/views/YourBondsModal/components/TransferBondModal/index.js +1 -2
- package/dist/views/YourBondsModal/components/TransferBondModal/index.js.map +1 -1
- package/package.json +1 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'theme-ui/jsx-runtime';
|
|
2
2
|
import Flex from '../uikit-sdk/Flex/index.js';
|
|
3
3
|
import TokenImage from '../uikit-sdk/TokenImage/index.js';
|
|
4
|
-
import
|
|
4
|
+
import { toSignificantDigitsString } from '../../utils/fixedPoint.js';
|
|
5
5
|
import { Spinner } from 'theme-ui';
|
|
6
6
|
import { getSymbol } from '../../utils/getNativeTicker.js';
|
|
7
7
|
import isArray from 'lodash-es/isArray.js';
|
|
@@ -10,7 +10,7 @@ const TokenRow = ({ token, chainId, handleTokenSelect, tokenBalance, isConnected
|
|
|
10
10
|
const symbol = getSymbol(token, chainId);
|
|
11
11
|
const tokenAddress = token === 'NATIVE' ? 'NATIVE' : token.address[chainId];
|
|
12
12
|
const splited = typeof token !== 'string' ? token?.symbol?.split('-') : undefined;
|
|
13
|
-
return (jsxs(Flex, { sx: { p: '8px', justifyContent: 'space-between', cursor: 'pointer', '&:hover': { background: 'white4' } }, onClick: () => handleTokenSelect(tokenAddress ?? ''), children: [jsxs(Flex, { children: [isArray(splited) ? (jsx(TokenImage, { symbol: splited[0], symbol2: splited[1], size: 28, chain: chainId })) : (jsx(TokenImage, { symbol: getSymbol(token, chainId), size: 28, chain: chainId })), jsx(Flex, { sx: { mx: '8px', lineHeight: '28px', fontSize: '14px' }, children: symbol })] }), isConnected && (jsx(Flex, { sx: { fontSize: '14px' }, children: tokenBalance === '0' ? ('0') : !tokenBalance ? (jsx(Spinner, { size: 15 })) : (jsx(Fragment, { children:
|
|
13
|
+
return (jsxs(Flex, { sx: { p: '8px', justifyContent: 'space-between', cursor: 'pointer', '&:hover': { background: 'white4' } }, onClick: () => handleTokenSelect(tokenAddress ?? ''), children: [jsxs(Flex, { children: [isArray(splited) ? (jsx(TokenImage, { symbol: splited[0], symbol2: splited[1], size: 28, chain: chainId })) : (jsx(TokenImage, { symbol: getSymbol(token, chainId), size: 28, chain: chainId })), jsx(Flex, { sx: { mx: '8px', lineHeight: '28px', fontSize: '14px' }, children: symbol })] }), isConnected && (jsx(Flex, { sx: { fontSize: '14px' }, children: tokenBalance === '0' ? ('0') : !tokenBalance ? (jsx(Spinner, { size: 15 })) : (jsx(Fragment, { children: toSignificantDigitsString(tokenBalance ?? '0', 5) })) }))] }));
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
export { TokenRow as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenRow.js","sources":["../../../src/components/TokenSelectorModal/TokenRow.tsx"],"sourcesContent":["import React from 'react'\nimport Flex from '../uikit-sdk/Flex'\nimport TokenImage from '../uikit-sdk/TokenImage'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport
|
|
1
|
+
{"version":3,"file":"TokenRow.js","sources":["../../../src/components/TokenSelectorModal/TokenRow.tsx"],"sourcesContent":["import React from 'react'\nimport Flex from '../uikit-sdk/Flex'\nimport TokenImage from '../uikit-sdk/TokenImage'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { toSignificantDigitsString } from '../../utils/fixedPoint'\nimport { Spinner } from 'theme-ui'\nimport { getSymbol } from '../../utils/getNativeTicker'\nimport isArray from 'lodash-es/isArray.js'\n\nconst TokenRow = ({\n token,\n chainId,\n handleTokenSelect,\n tokenBalance,\n isConnected,\n}: {\n token: 'NATIVE' | Token\n chainId: ChainId\n handleTokenSelect: (currency: string) => void\n tokenBalance?: string\n isConnected: boolean\n}) => {\n const symbol = getSymbol(token, chainId)\n const tokenAddress = token === 'NATIVE' ? 'NATIVE' : token.address[chainId]\n\n const splited = typeof token !== 'string' ? token?.symbol?.split('-') : undefined\n\n return (\n <Flex\n sx={{ p: '8px', justifyContent: 'space-between', cursor: 'pointer', '&:hover': { background: 'white4' } }}\n onClick={() => handleTokenSelect(tokenAddress ?? '')}\n >\n <Flex>\n {isArray(splited) ? (\n <TokenImage symbol={splited[0]} symbol2={splited[1]} size={28} chain={chainId} />\n ) : (\n <TokenImage symbol={getSymbol(token, chainId)} size={28} chain={chainId} />\n )}\n <Flex sx={{ mx: '8px', lineHeight: '28px', fontSize: '14px' }}>{symbol}</Flex>\n </Flex>\n {isConnected && (\n <Flex sx={{ fontSize: '14px' }}>\n {tokenBalance === '0' ? (\n '0'\n ) : !tokenBalance ? (\n <Spinner size={15} />\n ) : (\n <>{toSignificantDigitsString(tokenBalance ?? '0', 5)}</>\n )}\n </Flex>\n )}\n </Flex>\n )\n}\n\nexport default TokenRow\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":";;;;;;;;AASA,MAAM,QAAQ,GAAG,CAAC,EAChB,KAAK,EACL,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,WAAW,GAOZ,KAAI;IACH,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;AACxC,IAAA,MAAM,YAAY,GAAG,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;IAE3E,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS;AAEjF,IAAA,QACEA,IAAA,CAAC,IAAI,IACH,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EACzG,OAAO,EAAE,MAAM,iBAAiB,CAAC,YAAY,IAAI,EAAE,CAAC,aAEpDA,IAAA,CAAC,IAAI,eACF,OAAO,CAAC,OAAO,CAAC,IACfC,GAAA,CAAC,UAAU,IAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAA,CAAI,KAEjFA,GAAA,CAAC,UAAU,IAAC,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,GAAI,CAC5E,EACDA,IAAC,IAAI,EAAA,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAG,MAAM,EAAA,CAAQ,IACzE,EACN,WAAW,KACVA,GAAA,CAAC,IAAI,EAAA,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAC3B,YAAY,KAAK,GAAG,IACnB,GAAG,IACD,CAAC,YAAY,IACfA,GAAA,CAAC,OAAO,IAAC,IAAI,EAAE,EAAE,EAAA,CAAI,KAErBA,GAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAG,yBAAyB,CAAC,YAAY,IAAI,GAAG,EAAE,CAAC,CAAC,EAAA,CAAI,CACzD,GACI,CACR,CAAA,EAAA,CACI;AAEX;;;;"}
|
|
@@ -5,7 +5,7 @@ import TokenImage from '../uikit-sdk/TokenImage/index.js';
|
|
|
5
5
|
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
6
6
|
import useModal from '../../hooks/useModal.js';
|
|
7
7
|
import TokenSelectorModal from '../TokenSelectorModal/index.js';
|
|
8
|
-
import
|
|
8
|
+
import { toSignificantDigitsString } from '../../utils/fixedPoint.js';
|
|
9
9
|
import isArray from 'lodash-es/isArray.js';
|
|
10
10
|
import { getSymbol } from '../../utils/getNativeTicker.js';
|
|
11
11
|
import { formatUSDNumber } from '../../utils/displayHelpers.js';
|
|
@@ -29,7 +29,7 @@ const TokenSelectorPanel = ({ typedValue, setTypedValue, selectedToken, bondChai
|
|
|
29
29
|
: bondChainId === ChainId.SUI
|
|
30
30
|
? !!suiAccount
|
|
31
31
|
: !!account;
|
|
32
|
-
const tokenBalanceString = tokenBalance ?
|
|
32
|
+
const tokenBalanceString = tokenBalance ? toSignificantDigitsString(tokenBalance, 5) : 'loading';
|
|
33
33
|
const splited = typeof selectedToken !== 'string' ? selectedToken?.symbol?.split('-') : undefined;
|
|
34
34
|
const handleInputChange = (event) => {
|
|
35
35
|
setTypedValue(event.target.value);
|
|
@@ -55,7 +55,7 @@ const TokenSelectorPanel = ({ typedValue, setTypedValue, selectedToken, bondChai
|
|
|
55
55
|
background: MCColorMapping.white4[marketingCampaign],
|
|
56
56
|
}, children: [jsxs(Flex, { sx: { alignItems: 'center', gap: '10px' }, children: [jsx(Flex, { className: "input-container bondicon", children: isArray(splited) ? (jsx(TokenImage, { symbol: splited[0], symbol2: splited[1], size: 28, chain: bondChainId })) : (jsx(TokenImage, { symbol: getSymbol(selectedToken, bondChainId), size: 28, chain: bondChainId })) }), jsx(Flex, { className: "title-container tokenname", children: getSymbol(selectedToken, bondChainId) })] }), enableZap && (jsx(Flex, { sx: { mr: '8px' }, children: jsx(Caret, {}) }))] })] }), jsxs(Flex, { className: "input-container balancerow", children: [jsx(Flex, { sx: { opacity: 0.6 }, children: selectedTokenPrice && typedValue
|
|
57
57
|
? `$${formatUSDNumber((selectedTokenPrice * parseFloat(typedValue)).toFixed(2))}`
|
|
58
|
-
: '' }), jsxs(Flex, { children: [showBalance && jsxs(Flex, { className: "balancerow text", children: ["Balance: ", tokenBalanceString] }), jsx(Flex, { className: "balancerow max", children: showBalance && tokenBalance && tokenBalance !== '0' && handleValueBtn && (jsx(Button, { className: "max-button", onClick: () => handleValueBtn(
|
|
58
|
+
: '' }), jsxs(Flex, { children: [showBalance && jsxs(Flex, { className: "balancerow text", children: ["Balance: ", tokenBalanceString] }), jsx(Flex, { className: "balancerow max", children: showBalance && tokenBalance && tokenBalance !== '0' && handleValueBtn && (jsx(Button, { className: "max-button", onClick: () => handleValueBtn(tokenBalance ?? '0'), children: "Max" })) })] })] })] }));
|
|
59
59
|
};
|
|
60
60
|
|
|
61
61
|
export { TokenSelectorPanel as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/TokenSelectorPanel/index.tsx"],"sourcesContent":["import React, { FormEvent } from 'react'\nimport { Flex, Input } from 'theme-ui'\nimport { isNumber } from '../../utils/numbers'\nimport TokenImage from '../uikit-sdk/TokenImage'\nimport { ChainId, MarketingCampaign, Token } from '@ape.swap/apeswap-lists'\nimport useModal from '../../hooks/useModal'\nimport TokenSelectorModal from '../TokenSelectorModal'\nimport BigNumber from 'bignumber.js'\nimport isArray from 'lodash-es/isArray.js'\nimport { getSymbol } from '../../utils/getNativeTicker'\nimport { formatUSDNumber } from '../../utils/displayHelpers'\nimport useEVMAccount from '../../hooks/accounts/useEVMAccount'\nimport useSOLAccount from '../../hooks/accounts/useSOLAccount'\nimport useAPTAccount from '../../hooks/accounts/useAPTAccount'\nimport useSUIAccount from '../../hooks/accounts/useSUIAccount'\nimport { MCColorMapping } from '../../utils/campaignStyles'\nimport Button from '../uikit-sdk/Button/Button'\nimport Caret from '../uikit-sdk/Svg/Icons/Caret'\n\nconst TokenSelectorPanel = ({\n typedValue,\n setTypedValue,\n selectedToken,\n bondChainId,\n handleValueBtn,\n handleCurrencySelect,\n enableZap,\n tokenBalance,\n selectedTokenPrice,\n bondPrincipalToken,\n inputDisabled = false,\n marketingCampaign,\n isConnected,\n}: {\n typedValue: string\n setTypedValue: (value: React.SetStateAction<string>) => void\n selectedToken?: 'NATIVE' | Token\n bondChainId: ChainId\n handleValueBtn?: (value: string) => void\n handleCurrencySelect: (value: string) => void\n enableZap?: boolean\n tokenBalance?: string\n selectedTokenPrice?: number\n bondPrincipalToken?: Token // Used to ADD this token to the inputList\n inputDisabled?: boolean\n marketingCampaign?: MarketingCampaign\n isConnected: boolean\n}) => {\n const { address: account } = useEVMAccount()\n const { publicKey: solanaAccount } = useSOLAccount()\n const { address: aptosAccount } = useAPTAccount()\n const { address: suiAccount } = useSUIAccount()\n\n const showBalance =\n bondChainId === ChainId.SOL\n ? !!solanaAccount\n : bondChainId === ChainId.APTOS\n ? !!aptosAccount\n : bondChainId === ChainId.SUI\n ? !!suiAccount\n : !!account\n const tokenBalanceString = tokenBalance ? new BigNumber(tokenBalance).toPrecision(5) : 'loading'\n\n const splited = typeof selectedToken !== 'string' ? selectedToken?.symbol?.split('-') : undefined\n const handleInputChange = (event: { target: { value: React.SetStateAction<string> } }) => {\n setTypedValue(event.target.value)\n }\n\n const [onTokenSelectorModal] = useModal(\n <TokenSelectorModal\n bondPrincipalToken={bondPrincipalToken}\n handleCurrencySelect={handleCurrencySelect}\n chainId={bondChainId}\n isConnected={isConnected}\n />,\n true,\n false,\n `tokenSelectorOnLiquidityModal${bondPrincipalToken?.address?.[bondChainId]}-${bondPrincipalToken?.symbol}`,\n )\n\n return (\n <Flex\n className=\"token-selector-panel\"\n sx={{ borderRadius: 'normal', background: MCColorMapping.white3[marketingCampaign!] }}\n >\n <Flex className=\"input-container inputrow\">\n <Flex className=\"input-container input\">\n <Input\n placeholder=\"0.0\"\n value={typedValue}\n pattern=\"^[0-9]*[.,]?[0-9]*$\"\n onChange={handleInputChange}\n onInput={(v: FormEvent<HTMLInputElement>) => {\n if (v.currentTarget.value.includes(',')) {\n v.currentTarget.value = v.currentTarget.value.replace(/,/g, '.')\n }\n if (v.currentTarget.value.includes('%')) {\n v.currentTarget.value = v.currentTarget.value.replace(/[^0-9]/g, '')\n }\n if (v.currentTarget.value === '.') {\n v.currentTarget.value = '0.'\n }\n v.currentTarget.value =\n !!v.currentTarget.value && isNumber(v.currentTarget.value) && parseFloat(v.currentTarget.value) >= 0\n ? v.currentTarget.value\n : v.currentTarget.value.slice(0, v.currentTarget.value.length - 1)\n }}\n disabled={inputDisabled}\n />\n </Flex>\n\n {/* TOKEN SELECTOR PANEL */}\n\n <Flex\n className=\"input-container token\"\n onClick={() => (enableZap ? onTokenSelectorModal() : null)}\n sx={{\n cursor: enableZap ? 'pointer' : 'default',\n borderRadius: 'normal',\n background: MCColorMapping.white4[marketingCampaign!],\n }}\n >\n <Flex sx={{ alignItems: 'center', gap: '10px' }}>\n <Flex className=\"input-container bondicon\">\n {isArray(splited) ? (\n <TokenImage symbol={splited[0]} symbol2={splited[1]} size={28} chain={bondChainId} />\n ) : (\n <TokenImage symbol={getSymbol(selectedToken, bondChainId)} size={28} chain={bondChainId} />\n )}\n </Flex>\n <Flex className=\"title-container tokenname\">{getSymbol(selectedToken, bondChainId)}</Flex>\n </Flex>\n {enableZap && (\n <Flex sx={{ mr: '8px' }}>\n <Caret />\n </Flex>\n )}\n </Flex>\n </Flex>\n <Flex className=\"input-container balancerow\">\n <Flex sx={{ opacity: 0.6 }}>\n {selectedTokenPrice && typedValue\n ? `$${formatUSDNumber((selectedTokenPrice * parseFloat(typedValue)).toFixed(2))}`\n : ''}\n </Flex>\n <Flex>\n {showBalance && <Flex className=\"balancerow text\">Balance: {tokenBalanceString}</Flex>}\n <Flex className=\"balancerow max\">\n {showBalance && tokenBalance && tokenBalance !== '0' && handleValueBtn && (\n <Button\n className=\"max-button\"\n onClick={() => handleValueBtn(new BigNumber(tokenBalance ?? '0')?.toString())}\n >\n Max\n </Button>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n )\n}\n\nexport default TokenSelectorPanel\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/TokenSelectorPanel/index.tsx"],"sourcesContent":["import React, { FormEvent } from 'react'\nimport { Flex, Input } from 'theme-ui'\nimport { isNumber } from '../../utils/numbers'\nimport TokenImage from '../uikit-sdk/TokenImage'\nimport { ChainId, MarketingCampaign, Token } from '@ape.swap/apeswap-lists'\nimport useModal from '../../hooks/useModal'\nimport TokenSelectorModal from '../TokenSelectorModal'\nimport { toSignificantDigitsString } from '../../utils/fixedPoint'\nimport isArray from 'lodash-es/isArray.js'\nimport { getSymbol } from '../../utils/getNativeTicker'\nimport { formatUSDNumber } from '../../utils/displayHelpers'\nimport useEVMAccount from '../../hooks/accounts/useEVMAccount'\nimport useSOLAccount from '../../hooks/accounts/useSOLAccount'\nimport useAPTAccount from '../../hooks/accounts/useAPTAccount'\nimport useSUIAccount from '../../hooks/accounts/useSUIAccount'\nimport { MCColorMapping } from '../../utils/campaignStyles'\nimport Button from '../uikit-sdk/Button/Button'\nimport Caret from '../uikit-sdk/Svg/Icons/Caret'\n\nconst TokenSelectorPanel = ({\n typedValue,\n setTypedValue,\n selectedToken,\n bondChainId,\n handleValueBtn,\n handleCurrencySelect,\n enableZap,\n tokenBalance,\n selectedTokenPrice,\n bondPrincipalToken,\n inputDisabled = false,\n marketingCampaign,\n isConnected,\n}: {\n typedValue: string\n setTypedValue: (value: React.SetStateAction<string>) => void\n selectedToken?: 'NATIVE' | Token\n bondChainId: ChainId\n handleValueBtn?: (value: string) => void\n handleCurrencySelect: (value: string) => void\n enableZap?: boolean\n tokenBalance?: string\n selectedTokenPrice?: number\n bondPrincipalToken?: Token // Used to ADD this token to the inputList\n inputDisabled?: boolean\n marketingCampaign?: MarketingCampaign\n isConnected: boolean\n}) => {\n const { address: account } = useEVMAccount()\n const { publicKey: solanaAccount } = useSOLAccount()\n const { address: aptosAccount } = useAPTAccount()\n const { address: suiAccount } = useSUIAccount()\n\n const showBalance =\n bondChainId === ChainId.SOL\n ? !!solanaAccount\n : bondChainId === ChainId.APTOS\n ? !!aptosAccount\n : bondChainId === ChainId.SUI\n ? !!suiAccount\n : !!account\n const tokenBalanceString = tokenBalance ? toSignificantDigitsString(tokenBalance, 5) : 'loading'\n\n const splited = typeof selectedToken !== 'string' ? selectedToken?.symbol?.split('-') : undefined\n const handleInputChange = (event: { target: { value: React.SetStateAction<string> } }) => {\n setTypedValue(event.target.value)\n }\n\n const [onTokenSelectorModal] = useModal(\n <TokenSelectorModal\n bondPrincipalToken={bondPrincipalToken}\n handleCurrencySelect={handleCurrencySelect}\n chainId={bondChainId}\n isConnected={isConnected}\n />,\n true,\n false,\n `tokenSelectorOnLiquidityModal${bondPrincipalToken?.address?.[bondChainId]}-${bondPrincipalToken?.symbol}`,\n )\n\n return (\n <Flex\n className=\"token-selector-panel\"\n sx={{ borderRadius: 'normal', background: MCColorMapping.white3[marketingCampaign!] }}\n >\n <Flex className=\"input-container inputrow\">\n <Flex className=\"input-container input\">\n <Input\n placeholder=\"0.0\"\n value={typedValue}\n pattern=\"^[0-9]*[.,]?[0-9]*$\"\n onChange={handleInputChange}\n onInput={(v: FormEvent<HTMLInputElement>) => {\n if (v.currentTarget.value.includes(',')) {\n v.currentTarget.value = v.currentTarget.value.replace(/,/g, '.')\n }\n if (v.currentTarget.value.includes('%')) {\n v.currentTarget.value = v.currentTarget.value.replace(/[^0-9]/g, '')\n }\n if (v.currentTarget.value === '.') {\n v.currentTarget.value = '0.'\n }\n v.currentTarget.value =\n !!v.currentTarget.value && isNumber(v.currentTarget.value) && parseFloat(v.currentTarget.value) >= 0\n ? v.currentTarget.value\n : v.currentTarget.value.slice(0, v.currentTarget.value.length - 1)\n }}\n disabled={inputDisabled}\n />\n </Flex>\n\n {/* TOKEN SELECTOR PANEL */}\n\n <Flex\n className=\"input-container token\"\n onClick={() => (enableZap ? onTokenSelectorModal() : null)}\n sx={{\n cursor: enableZap ? 'pointer' : 'default',\n borderRadius: 'normal',\n background: MCColorMapping.white4[marketingCampaign!],\n }}\n >\n <Flex sx={{ alignItems: 'center', gap: '10px' }}>\n <Flex className=\"input-container bondicon\">\n {isArray(splited) ? (\n <TokenImage symbol={splited[0]} symbol2={splited[1]} size={28} chain={bondChainId} />\n ) : (\n <TokenImage symbol={getSymbol(selectedToken, bondChainId)} size={28} chain={bondChainId} />\n )}\n </Flex>\n <Flex className=\"title-container tokenname\">{getSymbol(selectedToken, bondChainId)}</Flex>\n </Flex>\n {enableZap && (\n <Flex sx={{ mr: '8px' }}>\n <Caret />\n </Flex>\n )}\n </Flex>\n </Flex>\n <Flex className=\"input-container balancerow\">\n <Flex sx={{ opacity: 0.6 }}>\n {selectedTokenPrice && typedValue\n ? `$${formatUSDNumber((selectedTokenPrice * parseFloat(typedValue)).toFixed(2))}`\n : ''}\n </Flex>\n <Flex>\n {showBalance && <Flex className=\"balancerow text\">Balance: {tokenBalanceString}</Flex>}\n <Flex className=\"balancerow max\">\n {showBalance && tokenBalance && tokenBalance !== '0' && handleValueBtn && (\n <Button\n className=\"max-button\"\n onClick={() => handleValueBtn(tokenBalance ?? '0')}\n >\n Max\n </Button>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n )\n}\n\nexport default TokenSelectorPanel\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* This is the list of local providers that will be used internally by the SDK
|
|
4
|
+
*
|
|
5
|
+
* It is important to understand the difference between this component and the one located on the dev directory,
|
|
6
|
+
* which aims to simulate the providers required to be installed by the consumer of the SDK.
|
|
7
|
+
*
|
|
8
|
+
* Finally, it is important to note that this Providers component should NOT be used multiple times, so for instance:
|
|
9
|
+
* The components exported from the src/main.ts file are all wrapped with this Provider component. Though the FullBondsView
|
|
10
|
+
* component that imports the Bonds and YourBonds views, do NOT import the Bonds and YourBonds with providers, it imports
|
|
11
|
+
* the component directly without providers. This is important to understand.
|
|
12
|
+
*/
|
|
2
13
|
declare const Providers: ({ children, theme }: {
|
|
3
14
|
children: React.ReactNode;
|
|
4
15
|
theme: any;
|
package/dist/providers/index.js
CHANGED
|
@@ -2,7 +2,6 @@ import { jsx } from 'theme-ui/jsx-runtime';
|
|
|
2
2
|
import ModalProvider from '../contexts/ModalContext.js';
|
|
3
3
|
import { defaultTheme } from '../theme/index.js';
|
|
4
4
|
import { ThemeUIProvider } from 'theme-ui';
|
|
5
|
-
import BigNumber from 'bignumber.js';
|
|
6
5
|
import Popups from '../contexts/Popups.js';
|
|
7
6
|
|
|
8
7
|
/**
|
|
@@ -16,11 +15,6 @@ import Popups from '../contexts/Popups.js';
|
|
|
16
15
|
* component that imports the Bonds and YourBonds views, do NOT import the Bonds and YourBonds with providers, it imports
|
|
17
16
|
* the component directly without providers. This is important to understand.
|
|
18
17
|
*/
|
|
19
|
-
// This config is required for number formatting
|
|
20
|
-
BigNumber.config({
|
|
21
|
-
EXPONENTIAL_AT: 1000,
|
|
22
|
-
DECIMAL_PLACES: 80,
|
|
23
|
-
});
|
|
24
18
|
const Providers = ({ children, theme }) => {
|
|
25
19
|
const themeToUse = defaultTheme;
|
|
26
20
|
if (themeToUse?.colors?.primaryButton && theme?.colors?.primaryButton) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/providers/index.tsx"],"sourcesContent":["import React from 'react'\nimport ModalProvider from '../contexts/ModalContext'\nimport { defaultTheme } from '../theme'\nimport { ThemeUIProvider } from 'theme-ui'\nimport
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/providers/index.tsx"],"sourcesContent":["import React from 'react'\nimport ModalProvider from '../contexts/ModalContext'\nimport { defaultTheme } from '../theme'\nimport { ThemeUIProvider } from 'theme-ui'\nimport Popups from '../contexts/Popups'\n\n/**\n * This is the list of local providers that will be used internally by the SDK\n *\n * It is important to understand the difference between this component and the one located on the dev directory,\n * which aims to simulate the providers required to be installed by the consumer of the SDK.\n *\n * Finally, it is important to note that this Providers component should NOT be used multiple times, so for instance:\n * The components exported from the src/main.ts file are all wrapped with this Provider component. Though the FullBondsView\n * component that imports the Bonds and YourBonds views, do NOT import the Bonds and YourBonds with providers, it imports\n * the component directly without providers. This is important to understand.\n */\n\nconst Providers = ({ children, theme }: { children: React.ReactNode; theme: any }) => {\n const themeToUse = defaultTheme\n\n if (themeToUse?.colors?.primaryButton && theme?.colors?.primaryButton) {\n themeToUse.colors.primaryButton = theme?.colors?.primaryButton\n }\n if (themeToUse?.colors?.white1 && theme?.colors?.white1) {\n themeToUse.colors.white1 = theme?.colors?.white1\n }\n if (themeToUse?.colors?.white2 && theme?.colors?.white2) {\n themeToUse.colors.white2 = theme?.colors?.white2\n }\n if (themeToUse?.colors?.white3 && theme?.colors?.white3) {\n themeToUse.colors.white3 = theme?.colors?.white3\n }\n if (themeToUse?.colors?.white4 && theme?.colors?.white4) {\n themeToUse.colors.white4 = theme?.colors?.white4\n }\n if (themeToUse?.colors?.white5 && theme?.colors?.white5) {\n themeToUse.colors.white5 = theme?.colors?.white5\n }\n if (themeToUse?.colors?.text && theme?.colors?.text) {\n themeToUse.colors.text = theme?.colors?.text\n }\n if (themeToUse?.colors?.primaryBright && theme?.colors?.primaryBright) {\n themeToUse.colors.primaryBright = theme?.colors?.primaryBright\n }\n if (themeToUse?.radii && theme?.radii) {\n themeToUse.radii = { normal: theme?.radii }\n }\n if (themeToUse?.fonts && theme?.customFont) {\n themeToUse.fonts = {\n body: `${theme?.customFont}, sans-serif`,\n }\n }\n\n return (\n <ThemeUIProvider theme={themeToUse}>\n <ModalProvider>\n <Popups>{children}</Popups>\n </ModalProvider>\n </ThemeUIProvider>\n )\n}\n\nexport default Providers\n"],"names":["_jsx"],"mappings":";;;;;;AAMA;;;;;;;;;;AAUG;AAEH,MAAM,SAAS,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAA6C,KAAI;IACnF,MAAM,UAAU,GAAG,YAAY;AAE/B,IAAA,IAAI,UAAU,EAAE,MAAM,EAAE,aAAa,IAAI,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE;QACrE,UAAU,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,EAAE,MAAM,EAAE,aAAa;IAChE;AACA,IAAA,IAAI,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;QACvD,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM;IAClD;AACA,IAAA,IAAI,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;QACvD,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM;IAClD;AACA,IAAA,IAAI,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;QACvD,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM;IAClD;AACA,IAAA,IAAI,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;QACvD,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM;IAClD;AACA,IAAA,IAAI,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;QACvD,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM;IAClD;AACA,IAAA,IAAI,UAAU,EAAE,MAAM,EAAE,IAAI,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;QACnD,UAAU,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI;IAC9C;AACA,IAAA,IAAI,UAAU,EAAE,MAAM,EAAE,aAAa,IAAI,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE;QACrE,UAAU,CAAC,MAAM,CAAC,aAAa,GAAG,KAAK,EAAE,MAAM,EAAE,aAAa;IAChE;IACA,IAAI,UAAU,EAAE,KAAK,IAAI,KAAK,EAAE,KAAK,EAAE;QACrC,UAAU,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE;IAC7C;IACA,IAAI,UAAU,EAAE,KAAK,IAAI,KAAK,EAAE,UAAU,EAAE;QAC1C,UAAU,CAAC,KAAK,GAAG;AACjB,YAAA,IAAI,EAAE,CAAA,EAAG,KAAK,EAAE,UAAU,CAAA,YAAA,CAAc;SACzC;IACH;AAEA,IAAA,QACEA,GAAA,CAAC,eAAe,IAAC,KAAK,EAAE,UAAU,EAAA,QAAA,EAChCA,GAAA,CAAC,aAAa,EAAA,EAAA,QAAA,EACZA,GAAA,CAAC,MAAM,EAAA,EAAA,QAAA,EAAE,QAAQ,GAAU,EAAA,CACb,EAAA,CACA;AAEtB;;;;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { useQuery } from '@tanstack/react-query';
|
|
2
|
-
import BigNumber from 'bignumber.js';
|
|
3
2
|
import erc20ABI from '../../config/abi/erc20.json.js';
|
|
4
3
|
import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
|
|
5
4
|
import multicall from '../../utils/multicall.js';
|
|
6
5
|
import { convertToBigish } from '../../utils/convertToBigish.js';
|
|
6
|
+
import { getBalanceNumber } from '../../utils/getBalanceNumber.js';
|
|
7
7
|
import USDT_ETH_ABI from '../../config/abi/usdtETH.json.js';
|
|
8
8
|
import { useState, useEffect, useCallback } from 'react';
|
|
9
9
|
import { useWriteContract } from 'wagmi';
|
|
@@ -60,8 +60,7 @@ const getTokenAllowance = async (currency, spender, account, chainId) => {
|
|
|
60
60
|
},
|
|
61
61
|
];
|
|
62
62
|
const data = await multicall(chainId, erc20ABI, calls);
|
|
63
|
-
|
|
64
|
-
return value.toNumber();
|
|
63
|
+
return getBalanceNumber(data[0] ?? 0, currency.decimals[chainId]);
|
|
65
64
|
};
|
|
66
65
|
const useApproval = (amount, currency, spender, account, chainId) => {
|
|
67
66
|
const apiUrl = useURLByEnvironment('apiV2');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAllowance.js","sources":["../../../src/state/allowance/useAllowance.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport
|
|
1
|
+
{"version":3,"file":"useAllowance.js","sources":["../../../src/state/allowance/useAllowance.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport erc20ABI from '../../config/abi/erc20.json'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport multicall, { Call } from '../../utils/multicall'\nimport { convertToBigish } from '../../utils/convertToBigish'\nimport { getBalanceNumber } from '../../utils/getBalanceNumber'\nimport ERC_20_ABI from '../../config/abi/erc20.json'\nimport USDT_ETH_ABI from '../../config/abi/usdtETH.json'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useWriteContract } from 'wagmi'\nimport { useMonitorTx } from '../../hooks/useMonitorTx'\nimport { usePopups } from '../popups/usePopups'\nimport { reportError } from '../../utils/reportError'\nimport { useURLByEnvironment } from '../useSDKConfig'\n\n/**\n * useAllowance hook: fetches the amount approved by the user for a given token\n * useApproval hook: returns the approval state (not approved, pending or approved) and a function to approve on chain\n * getTokenAllowance function fetches the allowance on chain\n */\n\nexport enum ApprovalState {\n NOT_APPROVED = 'NOT_APPROVED',\n PENDING = 'PENDING',\n APPROVED = 'APPROVED',\n}\n\nexport default function useAllowance(\n currency: 'NATIVE' | Token | null,\n spender: string | null,\n account: string | null,\n chainId: ChainId | null,\n): UseQueryResult<number | null> {\n return useQuery({\n queryKey: [\n QUERY_KEYS.ALLOWANCE,\n account ?? '',\n chainId,\n currency === 'NATIVE' ? currency : currency?.symbol,\n spender,\n ],\n queryFn: () => getTokenAllowance(currency, spender, account, chainId),\n refetchInterval: 10000, // i.e. 10 sec\n refetchOnWindowFocus: false,\n retry: 1,\n })\n}\n\nexport const getTokenAllowance = async (\n currency: 'NATIVE' | Token | null,\n spender: string | null,\n account: string | null,\n chainId: ChainId | null,\n): Promise<number | null> => {\n if (currency === 'NATIVE') return null\n // if (!account) {\n // console.log('Account disconnected')\n // } else if (!currency) {\n // console.log('No currency selected')\n // } else if (!chainId) {\n // console.log('No chainId selected')\n // } else if (!spender) {\n // console.log('No spender selected')\n // }\n if (!account || !currency || !chainId || !spender) return null\n const calls: Call[] = [\n {\n address: currency.address[chainId]!,\n name: 'allowance',\n params: [account, spender],\n },\n ]\n const data = await multicall(chainId, erc20ABI, calls)\n return getBalanceNumber(data[0] ?? 0, currency.decimals![chainId]!)\n}\n\nexport const useApproval = (\n amount: string,\n currency: 'NATIVE' | Token | null,\n spender: string | null,\n account: string | null,\n chainId: ChainId | null,\n): [ApprovalState, () => Promise<string | null | undefined>] => {\n const apiUrl = useURLByEnvironment('apiV2')\n const [confirmingTxOnWallet, setConfirmingTxOnWallet] = useState(false)\n const { data: allowance, refetch } = useAllowance(currency, spender, account, chainId)\n\n const { writeContractAsync, data: txHash, reset } = useWriteContract()\n const { isLoading: isConfirming, isSuccess: isConfirmed } = useMonitorTx(txHash, chainId as ChainId)\n const { addToastError } = usePopups()\n const confirmingTxOnChain = isConfirming && !isConfirmed\n\n useEffect(() => {\n if (txHash && isConfirmed) {\n setTimeout(() => {\n refetch()\n console.log('refetch allowance')\n reset()\n }, 1500)\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [txHash, confirmingTxOnChain, isConfirmed])\n\n const handleApprove = useCallback(async () => {\n if (!chainId || !amount || currency === 'NATIVE' || !currency) return null\n const decimals = currency.decimals![chainId]\n const tokenAddress = currency.address[chainId] as `0x${string}`\n if (!decimals || !tokenAddress) return null\n try {\n const bigishAmount = convertToBigish(amount, decimals)\n setConfirmingTxOnWallet(true)\n const hash = await writeContractAsync({\n address: tokenAddress,\n abi:\n tokenAddress?.toLowerCase() === '0xdAC17F958D2ee523a2206206994597C13D831ec7'.toLowerCase()\n ? USDT_ETH_ABI\n : ERC_20_ABI,\n functionName: 'approve',\n args: [spender, bigishAmount],\n account: account as `0x${string}`,\n chain: chainId as any,\n })\n setConfirmingTxOnWallet(false)\n // Adding a delay as I suspect RPCs need to catch up as the txs are indexed onchain too fast\n await new Promise((resolve) => setTimeout(resolve, 1500))\n return hash\n } catch (error: any) {\n setConfirmingTxOnWallet(false)\n console.error('Approval failed:', error)\n addToastError(error?.shortMessage || error?.details || error?.message)\n reportError({\n apiUrl,\n error,\n extraInfo: { type: 'approval', tokenAddress: tokenAddress, spenderAddress: spender, error },\n chainId,\n account: account!,\n })\n throw error\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [amount, currency, chainId])\n\n let approvalState: ApprovalState = ApprovalState.NOT_APPROVED\n\n if (allowance && amount) {\n approvalState = allowance >= parseFloat(amount) ? ApprovalState.APPROVED : ApprovalState.NOT_APPROVED\n }\n if (currency === 'NATIVE') {\n approvalState = ApprovalState.APPROVED\n }\n if (confirmingTxOnChain || confirmingTxOnWallet) {\n approvalState = ApprovalState.PENDING\n }\n\n return [approvalState ?? ApprovalState.NOT_APPROVED, handleApprove]\n}\n"],"names":["ERC_20_ABI"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useQuery } from '@tanstack/react-query';
|
|
2
|
-
import BigNumber from 'bignumber.js';
|
|
3
2
|
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
4
3
|
import { MULTICALL_V2 } from '../../config/constants/addresses.js';
|
|
5
4
|
import multicallV2Abi from '../../config/abi/multicallv2.json.js';
|
|
6
5
|
import erc20ABI from '../../config/abi/erc20.json.js';
|
|
7
6
|
import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
|
|
8
7
|
import multicall from '../../utils/multicall.js';
|
|
8
|
+
import { formatUnits } from '../../utils/fixedPoint.js';
|
|
9
9
|
import { getTokenBalanceAptos } from './useCurrencyBalanceAptos.js';
|
|
10
10
|
import { getTokenBalanceSui } from './useCurrencyBalanceSui.js';
|
|
11
11
|
|
|
@@ -40,8 +40,7 @@ const getTokenBalance = async (currency, account, chainId) => {
|
|
|
40
40
|
},
|
|
41
41
|
];
|
|
42
42
|
const data = await multicall(chainId, currency === 'NATIVE' ? multicallV2Abi : erc20ABI, calls);
|
|
43
|
-
|
|
44
|
-
return value.toString();
|
|
43
|
+
return formatUnits(data[0] ?? 0, currency === 'NATIVE' ? 18 : currency.decimals[chainId]);
|
|
45
44
|
};
|
|
46
45
|
|
|
47
46
|
export { useCurrencyBalance as default, getTokenBalance };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCurrencyBalance.js","sources":["../../../src/state/balance/useCurrencyBalance.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport
|
|
1
|
+
{"version":3,"file":"useCurrencyBalance.js","sources":["../../../src/state/balance/useCurrencyBalance.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { MULTICALL_V2 } from '../../config/constants/addresses'\nimport multicallV2Abi from '../../config/abi/multicallv2.json'\nimport erc20ABI from '../../config/abi/erc20.json'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport multicall, { Call } from '../../utils/multicall'\nimport { formatUnits } from '../../utils/fixedPoint'\nimport { getTokenBalanceAptos } from './useCurrencyBalanceAptos'\nimport { getTokenBalanceSui } from './useCurrencyBalanceSui'\n\nexport default function useCurrencyBalance(\n currency: 'NATIVE' | Token | null,\n account: string | null,\n chainId: ChainId | null,\n): UseQueryResult<string | null> {\n return useQuery({\n queryKey: [\n QUERY_KEYS.CURRENCY_BALANCE,\n account ?? '',\n currency === 'NATIVE' ? currency : currency?.symbol,\n chainId,\n ],\n queryFn: () => getTokenBalance(currency, account, chainId),\n refetchInterval: 10000, // i.e. 10 sec\n refetchOnWindowFocus: false,\n retry: 1,\n })\n}\n\nexport const getTokenBalance = async (\n currency: 'NATIVE' | Token | null,\n account: string | null,\n chainId: ChainId | null,\n): Promise<string | null> => {\n if (!account || !currency || !chainId) return null\n\n if (chainId === ChainId.APTOS) {\n return getTokenBalanceAptos(currency, account)\n }\n\n if (chainId === ChainId.SUI) {\n return getTokenBalanceSui(currency, account)\n }\n\n const calls: Call[] = [\n {\n address: currency === 'NATIVE' ? MULTICALL_V2[chainId]! : currency.address[chainId]!,\n name: currency === 'NATIVE' ? 'getEthBalance' : 'balanceOf',\n params: [account],\n },\n ]\n const data = await multicall(chainId, currency === 'NATIVE' ? multicallV2Abi : erc20ABI, calls)\n return formatUnits(data[0] ?? 0, currency === 'NATIVE' ? 18 : currency.decimals![chainId]!)\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAWc,SAAU,kBAAkB,CACxC,QAAiC,EACjC,OAAsB,EACtB,OAAuB,EAAA;AAEvB,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE;AACR,YAAA,UAAU,CAAC,gBAAgB;AAC3B,YAAA,OAAO,IAAI,EAAE;YACb,QAAQ,KAAK,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE,MAAM;YACnD,OAAO;AACR,SAAA;QACD,OAAO,EAAE,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC;QAC1D,eAAe,EAAE,KAAK;AACtB,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,KAAK,EAAE,CAAC;AACT,KAAA,CAAC;AACJ;AAEO,MAAM,eAAe,GAAG,OAC7B,QAAiC,EACjC,OAAsB,EACtB,OAAuB,KACG;AAC1B,IAAA,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,IAAI;AAElD,IAAA,IAAI,OAAO,KAAK,OAAO,CAAC,KAAK,EAAE;AAC7B,QAAA,OAAO,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC;IAChD;AAEA,IAAA,IAAI,OAAO,KAAK,OAAO,CAAC,GAAG,EAAE;AAC3B,QAAA,OAAO,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC9C;AAEA,IAAA,MAAM,KAAK,GAAW;AACpB,QAAA;AACE,YAAA,OAAO,EAAE,QAAQ,KAAK,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAE;YACpF,IAAI,EAAE,QAAQ,KAAK,QAAQ,GAAG,eAAe,GAAG,WAAW;YAC3D,MAAM,EAAE,CAAC,OAAO,CAAC;AAClB,SAAA;KACF;IACD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,QAAQ,KAAK,QAAQ,GAAG,cAAc,GAAG,QAAQ,EAAE,KAAK,CAAC;IAC/F,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,KAAK,QAAQ,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAS,CAAC,OAAO,CAAE,CAAC;AAC7F;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import BigNumber from 'bignumber.js';
|
|
2
1
|
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
3
2
|
import { getAptosClient } from '../../utils/aptosHelpers.js';
|
|
3
|
+
import { formatUnits } from '../../utils/fixedPoint.js';
|
|
4
4
|
|
|
5
5
|
// Aptos balance reads — mirrors useCurrencyBalanceSolana.ts
|
|
6
6
|
const APTOS_KEY = ChainId.APTOS;
|
|
@@ -15,7 +15,7 @@ const getTokenBalanceAptos = async (currency, account) => {
|
|
|
15
15
|
const aptos = getAptosClient();
|
|
16
16
|
if (currency === 'NATIVE') {
|
|
17
17
|
const amount = await aptos.getAccountAPTAmount({ accountAddress: account });
|
|
18
|
-
return
|
|
18
|
+
return formatUnits(String(amount), 8);
|
|
19
19
|
}
|
|
20
20
|
const tokenAddress = currency.address[APTOS_KEY];
|
|
21
21
|
if (!tokenAddress)
|
|
@@ -28,7 +28,7 @@ const getTokenBalanceAptos = async (currency, account) => {
|
|
|
28
28
|
: { faMetadataAddress: tokenAddress }),
|
|
29
29
|
});
|
|
30
30
|
const decimals = currency.decimals?.[APTOS_KEY] ?? 8;
|
|
31
|
-
return
|
|
31
|
+
return formatUnits(String(amount), decimals);
|
|
32
32
|
}
|
|
33
33
|
catch {
|
|
34
34
|
return '0';
|
|
@@ -45,7 +45,7 @@ const getTokensBalanceAptos = async (account, tokens) => {
|
|
|
45
45
|
if (token === 'NATIVE') {
|
|
46
46
|
try {
|
|
47
47
|
const amount = await aptos.getAccountAPTAmount({ accountAddress: account });
|
|
48
|
-
return { address, balance:
|
|
48
|
+
return { address, balance: formatUnits(String(amount), 8) };
|
|
49
49
|
}
|
|
50
50
|
catch {
|
|
51
51
|
return { address, balance: '0' };
|
|
@@ -62,7 +62,7 @@ const getTokensBalanceAptos = async (account, tokens) => {
|
|
|
62
62
|
const decimals = token.decimals?.[APTOS_KEY] ?? 8;
|
|
63
63
|
return {
|
|
64
64
|
address,
|
|
65
|
-
balance:
|
|
65
|
+
balance: formatUnits(String(amount), decimals),
|
|
66
66
|
};
|
|
67
67
|
}
|
|
68
68
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCurrencyBalanceAptos.js","sources":["../../../src/state/balance/useCurrencyBalanceAptos.ts"],"sourcesContent":["// Aptos balance reads — mirrors useCurrencyBalanceSolana.ts\n\nimport
|
|
1
|
+
{"version":3,"file":"useCurrencyBalanceAptos.js","sources":["../../../src/state/balance/useCurrencyBalanceAptos.ts"],"sourcesContent":["// Aptos balance reads — mirrors useCurrencyBalanceSolana.ts\n\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { getAptosClient } from '../../utils/aptosHelpers'\nimport { formatUnits } from '../../utils/fixedPoint'\n\nconst APTOS_KEY = ChainId.APTOS\n\n/**\n * Single-token balance read for Aptos.\n * Used by `useCurrencyBalance` when `chainId === ChainId.APTOS`.\n */\nexport const getTokenBalanceAptos = async (\n currency: 'NATIVE' | Token | null,\n account: string | null,\n): Promise<string | null> => {\n if (!account || !currency) return null\n\n try {\n const aptos = getAptosClient()\n if (currency === 'NATIVE') {\n const amount = await aptos.getAccountAPTAmount({ accountAddress: account })\n return formatUnits(String(amount), 8)\n }\n const tokenAddress = currency.address[APTOS_KEY]\n if (!tokenAddress) return '0'\n const isCoinType = tokenAddress.includes('::')\n const amount = await aptos.getAccountCoinAmount({\n accountAddress: account,\n ...(isCoinType\n ? { coinType: tokenAddress as `${string}::${string}::${string}` }\n : { faMetadataAddress: tokenAddress }),\n })\n const decimals = currency.decimals?.[APTOS_KEY] ?? 8\n return formatUnits(String(amount), decimals)\n } catch {\n return '0'\n }\n}\n\n/**\n * Multi-token balance read for Aptos.\n * Used by `useUserTokensBalance` when `chainId === ChainId.APTOS`.\n */\nexport const getTokensBalanceAptos = async (\n account: string,\n tokens: ('NATIVE' | Token)[],\n): Promise<{ address: string; balance: string }[]> => {\n const aptos = getAptosClient()\n return await Promise.all(\n tokens.map(async (token) => {\n const address = token === 'NATIVE' ? 'NATIVE' : ((token as Token).address[APTOS_KEY] as string)\n if (token === 'NATIVE') {\n try {\n const amount = await aptos.getAccountAPTAmount({ accountAddress: account })\n return { address, balance: formatUnits(String(amount), 8) }\n } catch {\n return { address, balance: '0' }\n }\n }\n try {\n // FA tokens use faMetadataAddress; legacy coins use coinType.\n // Detect by checking if address looks like a coin type (contains ::).\n const isCoinType = address.includes('::')\n const amount = await aptos.getAccountCoinAmount({\n accountAddress: account,\n ...(isCoinType ? { coinType: address as `${string}::${string}::${string}` } : { faMetadataAddress: address }),\n })\n const decimals = (token as Token).decimals?.[APTOS_KEY] ?? 8\n return {\n address,\n balance: formatUnits(String(amount), decimals),\n }\n } catch {\n return { address, balance: '0' }\n }\n }),\n )\n}\n"],"names":[],"mappings":";;;;AAAA;AAMA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK;AAE/B;;;AAGG;AACI,MAAM,oBAAoB,GAAG,OAClC,QAAiC,EACjC,OAAsB,KACI;AAC1B,IAAA,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,IAAI;AAEtC,IAAA,IAAI;AACF,QAAA,MAAM,KAAK,GAAG,cAAc,EAAE;AAC9B,QAAA,IAAI,QAAQ,KAAK,QAAQ,EAAE;AACzB,YAAA,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,mBAAmB,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;YAC3E,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC;QACA,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC;AAChD,QAAA,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,GAAG;QAC7B,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC9C,QAAA,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC;AAC9C,YAAA,cAAc,EAAE,OAAO;AACvB,YAAA,IAAI;AACF,kBAAE,EAAE,QAAQ,EAAE,YAAiD;AAC/D,kBAAE,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;AACzC,SAAA,CAAC;QACF,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC;QACpD,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;IAC9C;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,GAAG;IACZ;AACF;AAEA;;;AAGG;AACI,MAAM,qBAAqB,GAAG,OACnC,OAAe,EACf,MAA4B,KACuB;AACnD,IAAA,MAAM,KAAK,GAAG,cAAc,EAAE;AAC9B,IAAA,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,MAAM,CAAC,GAAG,CAAC,OAAO,KAAK,KAAI;AACzB,QAAA,MAAM,OAAO,GAAG,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAK,KAAe,CAAC,OAAO,CAAC,SAAS,CAAY;AAC/F,QAAA,IAAI,KAAK,KAAK,QAAQ,EAAE;AACtB,YAAA,IAAI;AACF,gBAAA,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,mBAAmB,CAAC,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;AAC3E,gBAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE;YAC7D;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE;YAClC;QACF;AACA,QAAA,IAAI;;;YAGF,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AACzC,YAAA,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC;AAC9C,gBAAA,cAAc,EAAE,OAAO;AACvB,gBAAA,IAAI,UAAU,GAAG,EAAE,QAAQ,EAAE,OAA4C,EAAE,GAAG,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC;AAC9G,aAAA,CAAC;YACF,MAAM,QAAQ,GAAI,KAAe,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC;YAC5D,OAAO;gBACL,OAAO;gBACP,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC;aAC/C;QACH;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE;QAClC;IACF,CAAC,CAAC,CACH;AACH;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Connection, PublicKey } from '@solana/web3.js';
|
|
2
2
|
import { getAssociatedTokenAddress, getAccount } from '@solana/spl-token';
|
|
3
3
|
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
4
|
-
import
|
|
4
|
+
import { formatUnits } from '../../utils/fixedPoint.js';
|
|
5
5
|
import { getRPC } from '../../config/constants/networks.js';
|
|
6
6
|
import { getTokenProgramForMint } from '../../utils/solanaAtaHelper.js';
|
|
7
7
|
|
|
@@ -14,8 +14,7 @@ const getTokenBalanceSolana = async (currency, account) => {
|
|
|
14
14
|
try {
|
|
15
15
|
if (currency === 'NATIVE') {
|
|
16
16
|
const lamports = await connection.getBalance(userPubkey);
|
|
17
|
-
|
|
18
|
-
return sol.toString();
|
|
17
|
+
return formatUnits(lamports, 9);
|
|
19
18
|
}
|
|
20
19
|
else {
|
|
21
20
|
const mint = new PublicKey(currency?.address?.[ChainId.SOL]);
|
|
@@ -25,8 +24,7 @@ const getTokenBalanceSolana = async (currency, account) => {
|
|
|
25
24
|
if (!ata)
|
|
26
25
|
return '0';
|
|
27
26
|
const tokenAccount = await getAccount(connection, ata, undefined, tokenProgram);
|
|
28
|
-
|
|
29
|
-
return amount.toString();
|
|
27
|
+
return formatUnits(tokenAccount.amount.toString(), currency?.decimals?.[ChainId.SOL]);
|
|
30
28
|
}
|
|
31
29
|
}
|
|
32
30
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCurrencyBalanceSolana.js","sources":["../../../src/state/balance/useCurrencyBalanceSolana.ts"],"sourcesContent":["import { Connection, PublicKey } from '@solana/web3.js'\nimport { getAccount } from '@solana/spl-token'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport
|
|
1
|
+
{"version":3,"file":"useCurrencyBalanceSolana.js","sources":["../../../src/state/balance/useCurrencyBalanceSolana.ts"],"sourcesContent":["import { Connection, PublicKey } from '@solana/web3.js'\nimport { getAccount } from '@solana/spl-token'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { formatUnits } from '../../utils/fixedPoint'\nimport { getRPC } from '../../config/constants/networks'\nimport { getTokenProgramForMint } from '../../utils/solanaAtaHelper'\nimport { getAssociatedTokenAddress } from '@solana/spl-token'\n\n// Use devnet or your custom cluster URL\nexport const getTokenBalanceSolana = async (\n currency: 'NATIVE' | Token | null,\n account: string | null,\n): Promise<string | null> => {\n if (!account || !currency) return null\n\n const connection = new Connection(getRPC(ChainId.SOL), 'confirmed')\n const userPubkey = new PublicKey(account)\n\n try {\n if (currency === 'NATIVE') {\n const lamports = await connection.getBalance(userPubkey)\n return formatUnits(lamports, 9)\n } else {\n const mint = new PublicKey(currency?.address?.[ChainId.SOL] as string)\n // Detect token program to get correct ATA (supports Token-2022)\n const tokenProgram = await getTokenProgramForMint(connection, mint)\n const ata = await getAssociatedTokenAddress(mint, userPubkey, true, tokenProgram)\n if (!ata) return '0'\n const tokenAccount = await getAccount(connection, ata, undefined, tokenProgram)\n return formatUnits(tokenAccount.amount.toString(), currency?.decimals?.[ChainId.SOL] as number)\n }\n } catch {\n // If account doesn't exist (e.g. never received that token)\n return '0'\n }\n}\n"],"names":[],"mappings":";;;;;;;AAQA;AACO,MAAM,qBAAqB,GAAG,OACnC,QAAiC,EACjC,OAAsB,KACI;AAC1B,IAAA,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,IAAI;AAEtC,IAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC;AACnE,IAAA,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC;AAEzC,IAAA,IAAI;AACF,QAAA,IAAI,QAAQ,KAAK,QAAQ,EAAE;YACzB,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC;AACxD,YAAA,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjC;aAAO;AACL,YAAA,MAAM,IAAI,GAAG,IAAI,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAW,CAAC;;YAEtE,MAAM,YAAY,GAAG,MAAM,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC;AACnE,YAAA,MAAM,GAAG,GAAG,MAAM,yBAAyB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,CAAC;AACjF,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,GAAG;AACpB,YAAA,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC;AAC/E,YAAA,OAAO,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAW,CAAC;QACjG;IACF;AAAE,IAAA,MAAM;;AAEN,QAAA,OAAO,GAAG;IACZ;AACF;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import BigNumber from 'bignumber.js';
|
|
2
1
|
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
3
2
|
import { getSuiClient } from '../../utils/suiHelpers.js';
|
|
3
|
+
import { formatUnits } from '../../utils/fixedPoint.js';
|
|
4
4
|
|
|
5
5
|
// Sui balance reads — mirrors useCurrencyBalanceAptos.ts
|
|
6
6
|
const SUI_KEY = ChainId.SUI;
|
|
@@ -20,7 +20,7 @@ const getTokenBalanceSui = async (currency, account) => {
|
|
|
20
20
|
try {
|
|
21
21
|
const client = getSuiClient();
|
|
22
22
|
const result = await client.getBalance({ owner: account, coinType });
|
|
23
|
-
return
|
|
23
|
+
return formatUnits(result.totalBalance, decimals);
|
|
24
24
|
}
|
|
25
25
|
catch {
|
|
26
26
|
return '0';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCurrencyBalanceSui.js","sources":["../../../src/state/balance/useCurrencyBalanceSui.ts"],"sourcesContent":["// Sui balance reads — mirrors useCurrencyBalanceAptos.ts\n\nimport
|
|
1
|
+
{"version":3,"file":"useCurrencyBalanceSui.js","sources":["../../../src/state/balance/useCurrencyBalanceSui.ts"],"sourcesContent":["// Sui balance reads — mirrors useCurrencyBalanceAptos.ts\n\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { getSuiClient } from '../../utils/suiHelpers'\nimport { formatUnits } from '../../utils/fixedPoint'\n\nconst SUI_KEY = ChainId.SUI\nconst SUI_NATIVE_COIN_TYPE = '0x2::sui::SUI'\nconst SUI_NATIVE_DECIMALS = 9\n\n/**\n * Single-token balance read for Sui.\n * Used by `useCurrencyBalance` when `chainId === ChainId.SUI`.\n */\nexport const getTokenBalanceSui = async (\n currency: 'NATIVE' | Token | null,\n account: string | null,\n): Promise<string | null> => {\n if (!account || !currency) return null\n\n const coinType = currency === 'NATIVE' ? SUI_NATIVE_COIN_TYPE : currency.address[SUI_KEY]\n if (!coinType) return '0'\n\n const decimals = currency === 'NATIVE' ? SUI_NATIVE_DECIMALS : (currency.decimals?.[SUI_KEY] ?? 9)\n\n try {\n const client = getSuiClient()\n const result = await client.getBalance({ owner: account, coinType })\n return formatUnits(result.totalBalance, decimals)\n } catch {\n return '0'\n }\n}\n\n/**\n * Multi-token balance read for Sui.\n * Used by `useUserTokensBalance` when `chainId === ChainId.SUI`.\n */\nexport const getTokensBalanceSui = async (\n account: string,\n tokens: ('NATIVE' | Token)[],\n): Promise<{ address: string; balance: string }[]> => {\n return Promise.all(\n tokens.map(async (token) => {\n const address = token === 'NATIVE' ? 'NATIVE' : ((token as Token).address[SUI_KEY] as string)\n const balance = await getTokenBalanceSui(token, account)\n return { address, balance: balance ?? '0' }\n }),\n )\n}\n"],"names":[],"mappings":";;;;AAAA;AAMA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG;AAC3B,MAAM,oBAAoB,GAAG,eAAe;AAC5C,MAAM,mBAAmB,GAAG,CAAC;AAE7B;;;AAGG;AACI,MAAM,kBAAkB,GAAG,OAChC,QAAiC,EACjC,OAAsB,KACI;AAC1B,IAAA,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,IAAI;AAEtC,IAAA,MAAM,QAAQ,GAAG,QAAQ,KAAK,QAAQ,GAAG,oBAAoB,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;AACzF,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,GAAG;IAEzB,MAAM,QAAQ,GAAG,QAAQ,KAAK,QAAQ,GAAG,mBAAmB,IAAI,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAElG,IAAA,IAAI;AACF,QAAA,MAAM,MAAM,GAAG,YAAY,EAAE;AAC7B,QAAA,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QACpE,OAAO,WAAW,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC;IACnD;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,GAAG;IACZ;AACF;AAEA;;;AAGG;AACI,MAAM,mBAAmB,GAAG,OACjC,OAAe,EACf,MAA4B,KACuB;AACnD,IAAA,OAAO,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,GAAG,CAAC,OAAO,KAAK,KAAI;AACzB,QAAA,MAAM,OAAO,GAAG,KAAK,KAAK,QAAQ,GAAG,QAAQ,GAAK,KAAe,CAAC,OAAO,CAAC,OAAO,CAAY;QAC7F,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC;QACxD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE;IAC7C,CAAC,CAAC,CACH;AACH;;;;"}
|
|
@@ -5,7 +5,7 @@ import erc20ABI from '../../config/abi/erc20.json.js';
|
|
|
5
5
|
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
6
6
|
import multicall from '../../utils/multicall.js';
|
|
7
7
|
import { MULTICALL_V2 } from '../../config/constants/addresses.js';
|
|
8
|
-
import
|
|
8
|
+
import { formatUnits } from '../../utils/fixedPoint.js';
|
|
9
9
|
import { reportError } from '../../utils/reportError.js';
|
|
10
10
|
import { useURLByEnvironment } from '../useSDKConfig.js';
|
|
11
11
|
import useEVMAccount from '../../hooks/accounts/useEVMAccount.js';
|
|
@@ -74,15 +74,13 @@ const getTokensBalance = async (account, tokens, chainId, apiUrl) => {
|
|
|
74
74
|
token?.address?.[chainId]?.toLowerCase() === callsToken[i].address.toLowerCase());
|
|
75
75
|
return {
|
|
76
76
|
address: token?.address[chainId],
|
|
77
|
-
balance:
|
|
78
|
-
.div(new BigNumber(10).pow(token.decimals[chainId]))
|
|
79
|
-
.toString(),
|
|
77
|
+
balance: formatUnits(balance, token.decimals[chainId]),
|
|
80
78
|
};
|
|
81
79
|
});
|
|
82
80
|
const balancesNative = dataNative.map((balance) => {
|
|
83
81
|
return {
|
|
84
82
|
address: 'NATIVE',
|
|
85
|
-
balance:
|
|
83
|
+
balance: formatUnits(balance, 18),
|
|
86
84
|
};
|
|
87
85
|
});
|
|
88
86
|
return [...balancesToken, ...balancesNative];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUserTokensBalance.js","sources":["../../../src/state/balance/useUserTokensBalance.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport multicallV2Abi from '../../config/abi/multicallv2.json'\nimport erc20ABI from '../../config/abi/erc20.json'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport multicall, { Call } from '../../utils/multicall'\nimport { MULTICALL_V2 } from '../../config/constants/addresses'\nimport
|
|
1
|
+
{"version":3,"file":"useUserTokensBalance.js","sources":["../../../src/state/balance/useUserTokensBalance.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport multicallV2Abi from '../../config/abi/multicallv2.json'\nimport erc20ABI from '../../config/abi/erc20.json'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport multicall, { Call } from '../../utils/multicall'\nimport { MULTICALL_V2 } from '../../config/constants/addresses'\nimport { formatUnits } from '../../utils/fixedPoint'\nimport { reportError } from '../../utils/reportError'\nimport { useURLByEnvironment } from '../useSDKConfig'\nimport useEVMAccount from '../../hooks/accounts/useEVMAccount'\nimport { getTokenBalanceSolana } from './useCurrencyBalanceSolana'\nimport useSOLAccount from '../../hooks/accounts/useSOLAccount'\nimport useAPTAccount from '../../hooks/accounts/useAPTAccount'\nimport useSUIAccount from '../../hooks/accounts/useSUIAccount'\nimport { getTokensBalanceAptos } from './useCurrencyBalanceAptos'\nimport { getTokensBalanceSui } from './useCurrencyBalanceSui'\n\nexport default function useUserTokensBalance(\n tokens: ('NATIVE' | Token)[],\n chainId: number,\n): UseQueryResult<{ address: string; balance: string }[]> {\n const keys = tokens.map((token) => (token === 'NATIVE' ? 'NATIVE' : token.address[chainId as ChainId]))\n const { address: account } = useEVMAccount()\n const { publicKey: accountSolana } = useSOLAccount()\n const { address: aptosAccount } = useAPTAccount()\n const { address: suiAccount } = useSUIAccount()\n const accountToUse =\n chainId === ChainId.SOL\n ? accountSolana?.toString()\n : chainId === ChainId.APTOS\n ? aptosAccount\n : chainId === ChainId.SUI\n ? suiAccount\n : account\n const apiUrl = useURLByEnvironment('apiV2')\n return useQuery({\n queryKey: [`${QUERY_KEYS.USER_TOKENS_BALANCES}-${keys}-${accountToUse}`],\n queryFn: () => getTokensBalance(accountToUse!, tokens, chainId, apiUrl),\n staleTime: 45000,\n refetchOnWindowFocus: false,\n enabled: !!accountToUse,\n })\n}\n\nexport const getTokensBalance = async (\n account: string,\n tokens: ('NATIVE' | Token)[],\n chainId: number,\n apiUrl?: string,\n): Promise<{ address: string; balance: string }[]> => {\n try {\n if (chainId === ChainId.APTOS) {\n return getTokensBalanceAptos(account, tokens)\n }\n\n if (chainId === ChainId.SUI) {\n return getTokensBalanceSui(account, tokens)\n }\n\n if (chainId !== ChainId.SOL) {\n const callsToken: Call[] = tokens\n .filter((token) => token !== 'NATIVE')\n .map((token) => {\n return {\n address: token?.address?.[chainId as ChainId] ?? '',\n name: 'balanceOf',\n params: [account],\n }\n })\n const callNative: Call[] = tokens\n .filter((token) => token === 'NATIVE')\n .map(() => {\n return {\n address: MULTICALL_V2[chainId]!,\n name: 'getEthBalance',\n params: [account],\n }\n })\n const [dataToken, dataNative] = await Promise.all([\n multicall(chainId, erc20ABI, callsToken),\n multicall(chainId, multicallV2Abi, callNative),\n ])\n\n const balancesToken = dataToken.map((balance: any, i: number) => {\n const token = tokens.find(\n (token) =>\n token !== 'NATIVE' &&\n (token as Token)?.address?.[chainId as ChainId]?.toLowerCase() === callsToken[i].address.toLowerCase(),\n )\n return {\n address: (token as Token)?.address[chainId as ChainId],\n balance: formatUnits(balance, (token as Token).decimals![chainId as ChainId]!),\n }\n })\n const balancesNative = dataNative.map((balance: any) => {\n return {\n address: 'NATIVE',\n balance: formatUnits(balance, 18),\n }\n })\n return [...balancesToken, ...balancesNative]\n } else {\n return await Promise.all(\n tokens.map(async (token) => {\n const balance = await getTokenBalanceSolana(token, account)\n return {\n address: token === 'NATIVE' ? 'NATIVE' : ((token as Token).address[ChainId.SOL] as string),\n balance: balance || '0',\n }\n }),\n )\n }\n } catch (e) {\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getTokensBalance', tokens, e },\n account,\n chainId,\n })\n return []\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import axios from 'axios';
|
|
|
3
3
|
import { getBalanceNumber } from '../../../utils/getBalanceNumber.js';
|
|
4
4
|
import { calculateTrueBondPrice } from '../../../utils/calculateSolanaTrueBillPrice.js';
|
|
5
5
|
import { TIER_MAPPING } from '../../tiers/useTierPoints.js';
|
|
6
|
-
import
|
|
6
|
+
import { formatUnits, mulDivRound, parseUnits } from '../../../utils/fixedPoint.js';
|
|
7
7
|
import { PRICE_API_URL } from '../../../config/constants/variables.js';
|
|
8
8
|
|
|
9
9
|
const cleanBillsData = async (billIds, chunkedBills, chainId, bills, tokenPrices) => {
|
|
@@ -43,11 +43,10 @@ const cleanBillsData = async (billIds, chunkedBills, chainId, bills, tokenPrices
|
|
|
43
43
|
const feeInPrincipal = Number(feeInPrincipalRaw / 10000);
|
|
44
44
|
const tierBoostRate = bill.tierBoostRate === undefined ? 1 : bill.tierBoostRate;
|
|
45
45
|
const [, vestingTerm, , maxPayout] = terms;
|
|
46
|
-
const tokensRemaining =
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const treasuryBalance = getBalanceNumber(customTreasuryBalance, bill?.earnToken?.decimals?.[bill?.chainId] ?? 18);
|
|
46
|
+
const tokensRemaining = Number(formatUnits(BigInt(maxTotalPayout ?? '0') - BigInt(totalPayoutGiven), bill?.earnToken.decimals[bill?.chainId] ?? 18));
|
|
47
|
+
const treasuryBalance = customTreasuryBalance
|
|
48
|
+
? getBalanceNumber(customTreasuryBalance, bill?.earnToken?.decimals?.[bill?.chainId] ?? 18)
|
|
49
|
+
: null;
|
|
51
50
|
if (chainId === ChainId.SOL) {
|
|
52
51
|
const principalDecimals = bill?.lpToken.decimals[ChainId.SOL];
|
|
53
52
|
const payoutDecimals = bill?.earnToken.decimals[ChainId.SOL];
|
|
@@ -94,9 +93,7 @@ const cleanBillsData = async (billIds, chunkedBills, chainId, bills, tokenPrices
|
|
|
94
93
|
trueBondPrices,
|
|
95
94
|
principalTokenPrice: lpPrice?.toString(),
|
|
96
95
|
payoutTokenPrice: earnTokenPrice?.toString(),
|
|
97
|
-
tokensRemaining: treasuryBalance
|
|
98
|
-
? Math.min(treasuryBalance, tokensRemaining).toString()
|
|
99
|
-
: tokensRemaining.toString(),
|
|
96
|
+
tokensRemaining: treasuryBalance !== null ? Math.min(treasuryBalance, tokensRemaining).toString() : tokensRemaining.toString(),
|
|
100
97
|
maxTotalPayout: maxTotalPayout?.toString(),
|
|
101
98
|
maxPayout: maxPayout?.toString(),
|
|
102
99
|
totalPayoutGiven: totalPayoutGiven?.toString(),
|
|
@@ -107,12 +104,18 @@ const cleanBillsData = async (billIds, chunkedBills, chainId, bills, tokenPrices
|
|
|
107
104
|
}));
|
|
108
105
|
return data;
|
|
109
106
|
};
|
|
107
|
+
// Scale used to carry percentage ratios (tier boost, reverse fee) into integer math
|
|
108
|
+
// alongside the wei-scale `trueBillPrice`, so the huge integer never round-trips through
|
|
109
|
+
// a JS float before the final getBalanceNumber() conversion.
|
|
110
|
+
const RATIO_SCALE = 1000000000000n; // 1e12
|
|
111
|
+
const scaleRatio = (ratio) => parseUnits(ratio.toString(), 12);
|
|
110
112
|
const getBonusWithFee = (feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice) => {
|
|
111
113
|
const fee = feeInPayout ?? 0;
|
|
112
|
-
const reverseFee =
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
114
|
+
const reverseFee = fee / 100 / (1 - fee / 100);
|
|
115
|
+
const trueBillPriceBig = BigInt(trueBillPrice);
|
|
116
|
+
const tierAdjusted = mulDivRound(trueBillPriceBig, scaleRatio((100 + tierBoostRate) / 100), RATIO_SCALE);
|
|
117
|
+
const feeAdjusted = mulDivRound(trueBillPriceBig, scaleRatio(reverseFee), RATIO_SCALE);
|
|
118
|
+
const trueBondPrice = tierAdjusted + feeAdjusted;
|
|
116
119
|
const priceUSDMinusFee = getBalanceNumber(trueBondPrice) * lpPrice;
|
|
117
120
|
const bonusWithoutFee = ((earnTokenPrice - priceUSDMinusFee) / earnTokenPrice) * 100;
|
|
118
121
|
const validatedBonus = bonusWithoutFee > 0 ? (bonusWithoutFee / (100 - bonusWithoutFee)) * 100 : 0;
|