@ape.swap/bonds-sdk 6.2.2 → 6.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/components/TokenSelectorModal/TokenRow.js +2 -2
  2. package/dist/components/TokenSelectorModal/TokenRow.js.map +1 -1
  3. package/dist/components/TokenSelectorPanel/index.js +3 -3
  4. package/dist/components/TokenSelectorPanel/index.js.map +1 -1
  5. package/dist/providers/index.d.ts +11 -0
  6. package/dist/providers/index.js +0 -6
  7. package/dist/providers/index.js.map +1 -1
  8. package/dist/state/allowance/useAllowance.js +2 -3
  9. package/dist/state/allowance/useAllowance.js.map +1 -1
  10. package/dist/state/balance/useCurrencyBalance.js +2 -3
  11. package/dist/state/balance/useCurrencyBalance.js.map +1 -1
  12. package/dist/state/balance/useCurrencyBalanceAptos.js +5 -5
  13. package/dist/state/balance/useCurrencyBalanceAptos.js.map +1 -1
  14. package/dist/state/balance/useCurrencyBalanceSolana.js +3 -5
  15. package/dist/state/balance/useCurrencyBalanceSolana.js.map +1 -1
  16. package/dist/state/balance/useCurrencyBalanceSui.js +2 -2
  17. package/dist/state/balance/useCurrencyBalanceSui.js.map +1 -1
  18. package/dist/state/balance/useUserTokensBalance.js +3 -5
  19. package/dist/state/balance/useUserTokensBalance.js.map +1 -1
  20. package/dist/state/bonds/fetchBondsData/cleanBillsData.js +16 -13
  21. package/dist/state/bonds/fetchBondsData/cleanBillsData.js.map +1 -1
  22. package/dist/state/bonds/fetchBondsData/fetchBondsDataAptos.d.ts +1 -1
  23. package/dist/state/bonds/fetchBondsData/fetchBondsDataAptos.js +4 -6
  24. package/dist/state/bonds/fetchBondsData/fetchBondsDataAptos.js.map +1 -1
  25. package/dist/state/bonds/fetchBondsData/fetchBondsDataEVM.d.ts +1 -1
  26. package/dist/state/bonds/fetchBondsData/fetchBondsDataEVM.js +4 -3
  27. package/dist/state/bonds/fetchBondsData/fetchBondsDataEVM.js.map +1 -1
  28. package/dist/state/bonds/fetchBondsData/fetchBondsDataSOL.d.ts +1 -1
  29. package/dist/state/bonds/fetchBondsData/fetchBondsDataSOL.js +2 -3
  30. package/dist/state/bonds/fetchBondsData/fetchBondsDataSOL.js.map +1 -1
  31. package/dist/state/bonds/fetchBondsData/fetchBondsDataSui.d.ts +1 -1
  32. package/dist/state/bonds/fetchBondsData/fetchBondsDataSui.js +5 -7
  33. package/dist/state/bonds/fetchBondsData/fetchBondsDataSui.js.map +1 -1
  34. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsEVM.js +1 -4
  35. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsEVM.js.map +1 -1
  36. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSOL.js +2 -5
  37. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSOL.js.map +1 -1
  38. package/dist/state/bonds/useUserBondsPreTGE.js +3 -6
  39. package/dist/state/bonds/useUserBondsPreTGE.js.map +1 -1
  40. package/dist/state/tiers/useTierPoints.js +15 -16
  41. package/dist/state/tiers/useTierPoints.js.map +1 -1
  42. package/dist/state/zap/useAptosZapQuote.js +4 -4
  43. package/dist/state/zap/useAptosZapQuote.js.map +1 -1
  44. package/dist/state/zap/useJupiterSolanaQuote.js +4 -11
  45. package/dist/state/zap/useJupiterSolanaQuote.js.map +1 -1
  46. package/dist/state/zap/useSoulZapBondQuote.js +12 -20
  47. package/dist/state/zap/useSoulZapBondQuote.js.map +1 -1
  48. package/dist/state/zap/useSuiZapQuote.js +9 -14
  49. package/dist/state/zap/useSuiZapQuote.js.map +1 -1
  50. package/dist/utils/bondPriceHelpers.d.ts +1 -1
  51. package/dist/utils/bondPriceHelpers.js +5 -11
  52. package/dist/utils/bondPriceHelpers.js.map +1 -1
  53. package/dist/utils/calculateSolanaTrueBillPrice.d.ts +0 -3
  54. package/dist/utils/calculateSolanaTrueBillPrice.js +33 -27
  55. package/dist/utils/calculateSolanaTrueBillPrice.js.map +1 -1
  56. package/dist/utils/convertToBigish.js +2 -17
  57. package/dist/utils/convertToBigish.js.map +1 -1
  58. package/dist/utils/displayHelpers.d.ts +3 -3
  59. package/dist/utils/displayHelpers.js +62 -46
  60. package/dist/utils/displayHelpers.js.map +1 -1
  61. package/dist/utils/fixedPoint.d.ts +28 -0
  62. package/dist/utils/fixedPoint.js +239 -0
  63. package/dist/utils/fixedPoint.js.map +1 -0
  64. package/dist/utils/formatNumber.js +5 -11
  65. package/dist/utils/formatNumber.js.map +1 -1
  66. package/dist/utils/getBalanceNumber.d.ts +1 -2
  67. package/dist/utils/getBalanceNumber.js +5 -3
  68. package/dist/utils/getBalanceNumber.js.map +1 -1
  69. package/dist/views/Bonds/components/BondRows/ActiveBondRows.js +2 -3
  70. package/dist/views/Bonds/components/BondRows/ActiveBondRows.js.map +1 -1
  71. package/dist/views/Bonds/components/BonusComponents/BonusComponent.js +1 -2
  72. package/dist/views/Bonds/components/BonusComponents/BonusComponent.js.map +1 -1
  73. package/dist/views/Bonds/components/BonusComponents/BonusTable.js +1 -2
  74. package/dist/views/Bonds/components/BonusComponents/BonusTable.js.map +1 -1
  75. package/dist/views/Bonds/components/BuyAgainRow/index.js +2 -4
  76. package/dist/views/Bonds/components/BuyAgainRow/index.js.map +1 -1
  77. package/dist/views/Bonds/utils.js +2 -3
  78. package/dist/views/Bonds/utils.js.map +1 -1
  79. package/dist/views/BuyBond/BuyComponent.js +16 -17
  80. package/dist/views/BuyBond/BuyComponent.js.map +1 -1
  81. package/dist/views/BuyBond/BuyComponentAptos.js +20 -33
  82. package/dist/views/BuyBond/BuyComponentAptos.js.map +1 -1
  83. package/dist/views/BuyBond/BuyComponentPreTGE.js +6 -8
  84. package/dist/views/BuyBond/BuyComponentPreTGE.js.map +1 -1
  85. package/dist/views/BuyBond/BuyComponentSolana.js +20 -27
  86. package/dist/views/BuyBond/BuyComponentSolana.js.map +1 -1
  87. package/dist/views/BuyBond/BuyComponentSui.js +15 -28
  88. package/dist/views/BuyBond/BuyComponentSui.js.map +1 -1
  89. package/dist/views/BuyBond/components/NewRateModal/NewRateModal.js +2 -2
  90. package/dist/views/BuyBond/components/NewRateModal/NewRateModal.js.map +1 -1
  91. package/dist/views/BuyBond/components/PointsLeftForNextTier/PointsLeftForNextTier.js +6 -9
  92. package/dist/views/BuyBond/components/PointsLeftForNextTier/PointsLeftForNextTier.js.map +1 -1
  93. package/dist/views/ProjectView/components/BondStats/index.js +2 -4
  94. package/dist/views/ProjectView/components/BondStats/index.js.map +1 -1
  95. package/dist/views/YourBonds/components/UserBondRow/UserBondRowPreTGE.js +4 -5
  96. package/dist/views/YourBonds/components/UserBondRow/UserBondRowPreTGE.js.map +1 -1
  97. package/dist/views/YourBondsModal/components/LinkShare/htmlToJpeg.d.ts +8 -0
  98. package/dist/views/YourBondsModal/components/LinkShare/htmlToJpeg.js +43 -0
  99. package/dist/views/YourBondsModal/components/LinkShare/htmlToJpeg.js.map +1 -0
  100. package/dist/views/YourBondsModal/components/LinkShare/templateImageShare.d.ts +8 -1
  101. package/dist/views/YourBondsModal/components/LinkShare/templateImageShare.js +172 -15
  102. package/dist/views/YourBondsModal/components/LinkShare/templateImageShare.js.map +1 -1
  103. package/dist/views/YourBondsModal/components/LinkShare/utils.js +19 -10
  104. package/dist/views/YourBondsModal/components/LinkShare/utils.js.map +1 -1
  105. package/dist/views/YourBondsModal/components/TransferBondModal/index.js +1 -2
  106. package/dist/views/YourBondsModal/components/TransferBondModal/index.js.map +1 -1
  107. 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 BigNumber from 'bignumber.js';
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: new BigNumber(tokenBalance ?? '0')?.toPrecision(5) })) }))] }));
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 BigNumber from 'bignumber.js'\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 <>{new BigNumber(tokenBalance ?? '0')?.toPrecision(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;IAEjF,QACEA,KAAC,IAAI,EAAA,EACH,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,EAAA,QAAA,EAAA,CAEpDA,KAAC,IAAI,EAAA,EAAA,QAAA,EAAA,CACF,OAAO,CAAC,OAAO,CAAC,IACfC,GAAA,CAAC,UAAU,EAAA,EAAC,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,EAAA,EAAC,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,IAAI,SAAS,CAAC,YAAY,IAAI,GAAG,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAA,CAAI,CAC1D,EAAA,CACI,CACR,CAAA,EAAA,CACI;AAEX;;;;"}
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 BigNumber from 'bignumber.js';
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 ? new BigNumber(tokenBalance).toPrecision(5) : 'loading';
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(new BigNumber(tokenBalance ?? '0')?.toString()), children: "Max" })) })] })] })] }));
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;
@@ -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 BigNumber from 'bignumber.js'\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\n// This config is required for number formatting\nBigNumber.config({\n EXPONENTIAL_AT: 1000,\n DECIMAL_PLACES: 80,\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":";;;;;;;AAOA;;;;;;;;;;AAUG;AAEH;AACA,SAAS,CAAC,MAAM,CAAC;AACf,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,cAAc,EAAE,EAAE;AACnB,CAAA,CAAC;AAEF,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
+ {"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
- const value = new BigNumber(data[0] ?? 0).div(new BigNumber(10).pow(currency.decimals[chainId]));
64
- return value.toNumber();
63
+ return getBalanceNumber(data[0][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 BigNumber from 'bignumber.js'\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 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 const value = new BigNumber(data[0] ?? 0).div(new BigNumber(10).pow(currency.decimals![chainId]!))\n return value.toNumber()\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
+ {"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] ?? 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
- const value = new BigNumber(data[0] ?? 0).div(new BigNumber(10).pow(currency === 'NATIVE' ? 18 : currency.decimals[chainId]));
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 BigNumber from 'bignumber.js'\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 { 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 const value = new BigNumber(data[0] ?? 0).div(\n new BigNumber(10).pow(currency === 'NATIVE' ? 18 : currency.decimals![chainId]!),\n )\n return value.toString()\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;AAC/F,IAAA,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAC3C,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,GAAG,EAAE,GAAG,QAAQ,CAAC,QAAS,CAAC,OAAO,CAAE,CAAC,CACjF;AACD,IAAA,OAAO,KAAK,CAAC,QAAQ,EAAE;AACzB;;;;"}
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 new BigNumber(String(amount)).div(new BigNumber(10).pow(8)).toString();
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 new BigNumber(String(amount)).div(new BigNumber(10).pow(decimals)).toString();
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: new BigNumber(String(amount)).div(new BigNumber(10).pow(8)).toString() };
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: new BigNumber(String(amount)).div(new BigNumber(10).pow(decimals)).toString(),
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 BigNumber from 'bignumber.js'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { getAptosClient } from '../../utils/aptosHelpers'\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 new BigNumber(String(amount)).div(new BigNumber(10).pow(8)).toString()\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 new BigNumber(String(amount)).div(new BigNumber(10).pow(decimals)).toString()\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: new BigNumber(String(amount)).div(new BigNumber(10).pow(8)).toString() }\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: new BigNumber(String(amount)).div(new BigNumber(10).pow(decimals)).toString(),\n }\n } catch {\n return { address, balance: '0' }\n }\n }),\n )\n}\n"],"names":[],"mappings":"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"}
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 BigNumber from 'bignumber.js';
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
- const sol = new BigNumber(lamports).dividedBy(1e9);
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
- const amount = new BigNumber(tokenAccount.amount.toString()).dividedBy(new BigNumber(10).pow(currency?.decimals?.[ChainId.SOL]));
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 BigNumber from 'bignumber.js'\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 const sol = new BigNumber(lamports).dividedBy(1e9)\n return sol.toString()\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 const amount = new BigNumber(tokenAccount.amount.toString()).dividedBy(\n new BigNumber(10).pow(currency?.decimals?.[ChainId.SOL] as number),\n )\n return amount.toString()\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,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC;AAClD,YAAA,OAAO,GAAG,CAAC,QAAQ,EAAE;QACvB;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,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CACpE,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAW,CAAC,CACnE;AACD,YAAA,OAAO,MAAM,CAAC,QAAQ,EAAE;QAC1B;IACF;AAAE,IAAA,MAAM;;AAEN,QAAA,OAAO,GAAG;IACZ;AACF;;;;"}
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 new BigNumber(result.totalBalance).div(new BigNumber(10).pow(decimals)).toString();
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 BigNumber from 'bignumber.js'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { getSuiClient } from '../../utils/suiHelpers'\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 new BigNumber(result.totalBalance).div(new BigNumber(10).pow(decimals)).toString()\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,IAAI,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC3F;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;;;;"}
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 BigNumber from 'bignumber.js';
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: new BigNumber(balance)
78
- .div(new BigNumber(10).pow(token.decimals[chainId]))
79
- .toString(),
77
+ balance: formatUnits(balance[0], token.decimals[chainId]),
80
78
  };
81
79
  });
82
80
  const balancesNative = dataNative.map((balance) => {
83
81
  return {
84
82
  address: 'NATIVE',
85
- balance: new BigNumber(balance).div(new BigNumber(10).pow(18)).toString(),
83
+ balance: formatUnits(balance[0], 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 BigNumber from 'bignumber.js'\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: new BigNumber(balance)\n .div(new BigNumber(10).pow((token as Token).decimals![chainId as ChainId]!))\n .toString(),\n }\n })\n const balancesNative = dataNative.map((balance: any) => {\n return {\n address: 'NATIVE',\n balance: new BigNumber(balance).div(new BigNumber(10).pow(18)).toString(),\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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"}
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[0], (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[0], 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 BigNumber from 'bignumber.js';
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 = new BigNumber(maxTotalPayout ?? '0')
47
- .minus(new BigNumber(totalPayoutGiven))
48
- .div(new BigNumber(10).pow(bill?.earnToken.decimals[bill?.chainId] ?? 18))
49
- .toNumber();
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 = new BigNumber(fee / 100 / (1 - fee / 100));
113
- const trueBondPrice = new BigNumber(trueBillPrice)
114
- .times((100 + tierBoostRate) / 100)
115
- .plus(new BigNumber(trueBillPrice).times(reverseFee));
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;