@ape.swap/bonds-sdk 5.1.48 → 5.1.49-test-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +14 -7
  2. package/dist/components/ConnectAptosWalletButton/ConnectAptosWalletButton.d.ts +4 -0
  3. package/dist/components/ConnectAptosWalletButton/ConnectAptosWalletButton.js +39 -0
  4. package/dist/components/ConnectAptosWalletButton/ConnectAptosWalletButton.js.map +1 -0
  5. package/dist/components/ConnectSuiWalletButton/ConnectSuiWalletButton.d.ts +5 -0
  6. package/dist/components/ConnectoToVmBanners/ConnectToAptosBanner.d.ts +1 -0
  7. package/dist/components/ConnectoToVmBanners/ConnectToAptosBanner.js +49 -0
  8. package/dist/components/ConnectoToVmBanners/ConnectToAptosBanner.js.map +1 -0
  9. package/dist/components/ConnectoToVmBanners/ConnectToEvmBanner.js +11 -15
  10. package/dist/components/ConnectoToVmBanners/ConnectToEvmBanner.js.map +1 -1
  11. package/dist/components/ConnectoToVmBanners/ConnectToSolanaBanner.js +13 -17
  12. package/dist/components/ConnectoToVmBanners/ConnectToSolanaBanner.js.map +1 -1
  13. package/dist/components/ConnectoToVmBanners/ConnectToSuiBanner.d.ts +1 -0
  14. package/dist/components/ConnectoToVmBanners/ConnectToSuiBanner.js +44 -0
  15. package/dist/components/ConnectoToVmBanners/ConnectToSuiBanner.js.map +1 -0
  16. package/dist/components/TokenInfoAndName/index.js +2 -0
  17. package/dist/components/TokenInfoAndName/index.js.map +1 -1
  18. package/dist/components/TokenSelectorPanel/index.js +11 -1
  19. package/dist/components/TokenSelectorPanel/index.js.map +1 -1
  20. package/dist/components/Tooltip/Tooltip.js +11 -3
  21. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  22. package/dist/components/uikit-sdk/Svg/index.js +6 -0
  23. package/dist/components/uikit-sdk/Svg/index.js.map +1 -1
  24. package/dist/components/uikit-sdk/Svg/tokens/APTOS.d.ts +4 -0
  25. package/dist/components/uikit-sdk/Svg/tokens/APTOS.js +8 -0
  26. package/dist/components/uikit-sdk/Svg/tokens/APTOS.js.map +1 -0
  27. package/dist/components/uikit-sdk/Svg/tokens/SUI.d.ts +4 -0
  28. package/dist/components/uikit-sdk/Svg/tokens/SUI.js +8 -0
  29. package/dist/components/uikit-sdk/Svg/tokens/SUI.js.map +1 -0
  30. package/dist/components/uikit-sdk/Svg/types.d.ts +2 -0
  31. package/dist/components/uikit-sdk/Svg/types.js +2 -0
  32. package/dist/components/uikit-sdk/Svg/types.js.map +1 -1
  33. package/dist/components/uikit-sdk/TokenImage/index.js +15 -3
  34. package/dist/components/uikit-sdk/TokenImage/index.js.map +1 -1
  35. package/dist/config/constants/addresses.d.ts +1 -1
  36. package/dist/config/constants/addresses.js +2 -0
  37. package/dist/config/constants/addresses.js.map +1 -1
  38. package/dist/config/constants/aptosZapTokens.d.ts +23 -0
  39. package/dist/config/constants/aptosZapTokens.js +66 -0
  40. package/dist/config/constants/aptosZapTokens.js.map +1 -0
  41. package/dist/config/constants/chains.d.ts +3 -1
  42. package/dist/config/constants/chains.js +12 -0
  43. package/dist/config/constants/chains.js.map +1 -1
  44. package/dist/config/constants/networks.js +9 -0
  45. package/dist/config/constants/networks.js.map +1 -1
  46. package/dist/config/constants/queryKeys.js +23 -1
  47. package/dist/config/constants/queryKeys.js.map +1 -1
  48. package/dist/config/constants/suiZapTokens.d.ts +14 -0
  49. package/dist/config/constants/suiZapTokens.js +41 -0
  50. package/dist/config/constants/suiZapTokens.js.map +1 -0
  51. package/dist/config/constants/tokens.js +48 -0
  52. package/dist/config/constants/tokens.js.map +1 -0
  53. package/dist/config/constants/variables.d.ts +1 -1
  54. package/dist/config/constants/variables.js +2 -0
  55. package/dist/config/constants/variables.js.map +1 -1
  56. package/dist/constants/aptosConstants.d.ts +20 -0
  57. package/dist/constants/aptosConstants.js +78 -0
  58. package/dist/constants/aptosConstants.js.map +1 -0
  59. package/dist/constants/suiConstants.d.ts +18 -0
  60. package/dist/constants/suiConstants.js +61 -0
  61. package/dist/constants/suiConstants.js.map +1 -0
  62. package/dist/hooks/accounts/useAPTAccount.d.ts +30 -0
  63. package/dist/hooks/accounts/useAPTAccount.js +39 -0
  64. package/dist/hooks/accounts/useAPTAccount.js.map +1 -0
  65. package/dist/hooks/accounts/useSUIAccount.d.ts +7 -0
  66. package/dist/hooks/accounts/useSUIAccount.js +46 -0
  67. package/dist/hooks/accounts/useSUIAccount.js.map +1 -0
  68. package/dist/hooks/useMonitorTx.d.ts +2 -21
  69. package/dist/hooks/useMonitorTx.js.map +1 -1
  70. package/dist/hooks/useSortedZapList.js +7 -2
  71. package/dist/hooks/useSortedZapList.js.map +1 -1
  72. package/dist/hooks/useTokenFromZapList.js +1 -0
  73. package/dist/hooks/useTokenFromZapList.js.map +1 -1
  74. package/dist/providers/AptosWalletProvider.d.ts +5 -0
  75. package/dist/providers/SuiWalletProvider.d.ts +5 -0
  76. package/dist/state/balance/useCurrencyBalance.js +9 -0
  77. package/dist/state/balance/useCurrencyBalance.js.map +1 -1
  78. package/dist/state/balance/useCurrencyBalanceAptos.d.ts +14 -0
  79. package/dist/state/balance/useCurrencyBalanceAptos.js +75 -0
  80. package/dist/state/balance/useCurrencyBalanceAptos.js.map +1 -0
  81. package/dist/state/balance/useCurrencyBalanceSui.d.ts +14 -0
  82. package/dist/state/balance/useCurrencyBalanceSui.js +42 -0
  83. package/dist/state/balance/useCurrencyBalanceSui.js.map +1 -0
  84. package/dist/state/balance/useUserTokensBalance.js +19 -1
  85. package/dist/state/balance/useUserTokensBalance.js.map +1 -1
  86. package/dist/state/bonds/aptosBondsConfig.d.ts +4 -0
  87. package/dist/state/bonds/aptosBondsConfig.js +114 -0
  88. package/dist/state/bonds/aptosBondsConfig.js.map +1 -0
  89. package/dist/state/bonds/fetchBillsUserAptos.d.ts +4 -0
  90. package/dist/state/bonds/fetchBillsUserAptos.js +187 -0
  91. package/dist/state/bonds/fetchBillsUserAptos.js.map +1 -0
  92. package/dist/state/bonds/fetchBillsUserSui.d.ts +4 -0
  93. package/dist/state/bonds/fetchBillsUserSui.js +287 -0
  94. package/dist/state/bonds/fetchBillsUserSui.js.map +1 -0
  95. package/dist/state/bonds/fetchBondsDataAptos.d.ts +12 -0
  96. package/dist/state/bonds/fetchBondsDataAptos.js +114 -0
  97. package/dist/state/bonds/fetchBondsDataAptos.js.map +1 -0
  98. package/dist/state/bonds/fetchBondsDataSui.d.ts +13 -0
  99. package/dist/state/bonds/fetchBondsDataSui.js +205 -0
  100. package/dist/state/bonds/fetchBondsDataSui.js.map +1 -0
  101. package/dist/state/bonds/suiBondsConfig.d.ts +4 -0
  102. package/dist/state/bonds/suiBondsConfig.js +113 -0
  103. package/dist/state/bonds/suiBondsConfig.js.map +1 -0
  104. package/dist/state/bonds/useBondsData.js +32 -8
  105. package/dist/state/bonds/useBondsData.js.map +1 -1
  106. package/dist/state/bonds/useBondsList.js +15 -2
  107. package/dist/state/bonds/useBondsList.js.map +1 -1
  108. package/dist/state/bonds/useUserBonds.d.ts +1 -1
  109. package/dist/state/bonds/useUserBonds.js +34 -12
  110. package/dist/state/bonds/useUserBonds.js.map +1 -1
  111. package/dist/state/bonds/utils.js +8 -0
  112. package/dist/state/bonds/utils.js.map +1 -1
  113. package/dist/state/price/useCurrencyPrice.js +2 -1
  114. package/dist/state/price/useCurrencyPrice.js.map +1 -1
  115. package/dist/state/tiers/useTierPoints.js +1 -4
  116. package/dist/state/tiers/useTierPoints.js.map +1 -1
  117. package/dist/state/tokenPrices/useTokenPrices.js +16 -1
  118. package/dist/state/tokenPrices/useTokenPrices.js.map +1 -1
  119. package/dist/state/useSDKConfig.d.ts +4 -0
  120. package/dist/state/useSDKConfig.js.map +1 -1
  121. package/dist/state/zap/useAptosZapQuote.d.ts +28 -0
  122. package/dist/state/zap/useAptosZapQuote.js +83 -0
  123. package/dist/state/zap/useAptosZapQuote.js.map +1 -0
  124. package/dist/state/zap/useSoulZapBondQuote.js +1 -0
  125. package/dist/state/zap/useSoulZapBondQuote.js.map +1 -1
  126. package/dist/state/zap/useSuiZapQuote.d.ts +24 -0
  127. package/dist/state/zap/useSuiZapQuote.js +119 -0
  128. package/dist/state/zap/useSuiZapQuote.js.map +1 -0
  129. package/dist/types/aptosBonds.d.ts +152 -0
  130. package/dist/types/yourbonds.d.ts +3 -9
  131. package/dist/utils/aptosHelpers.d.ts +80 -0
  132. package/dist/utils/aptosHelpers.js +202 -0
  133. package/dist/utils/aptosHelpers.js.map +1 -0
  134. package/dist/utils/getNativeTicker.js +1 -0
  135. package/dist/utils/getNativeTicker.js.map +1 -1
  136. package/dist/utils/suiHelpers.d.ts +6 -0
  137. package/dist/utils/suiHelpers.js +106 -0
  138. package/dist/utils/suiHelpers.js.map +1 -0
  139. package/dist/views/Bonds/components/BondRows/ActiveBondRows.js +8 -2
  140. package/dist/views/Bonds/components/BondRows/ActiveBondRows.js.map +1 -1
  141. package/dist/views/Bonds/components/BondRows/ModalHandler.js +18 -1
  142. package/dist/views/Bonds/components/BondRows/ModalHandler.js.map +1 -1
  143. package/dist/views/Bonds/components/ChainBanner/ChainBanner.js +29 -0
  144. package/dist/views/Bonds/components/ChainBanner/ChainBanner.js.map +1 -1
  145. package/dist/views/BuyBond/BuyBondModal.js +4 -1
  146. package/dist/views/BuyBond/BuyBondModal.js.map +1 -1
  147. package/dist/views/BuyBond/BuyComponentAptos.d.ts +10 -0
  148. package/dist/views/BuyBond/BuyComponentAptos.js +349 -0
  149. package/dist/views/BuyBond/BuyComponentAptos.js.map +1 -0
  150. package/dist/views/BuyBond/BuyComponentSui.d.ts +10 -0
  151. package/dist/views/BuyBond/BuyComponentSui.js +459 -0
  152. package/dist/views/BuyBond/BuyComponentSui.js.map +1 -0
  153. package/dist/views/BuyBond/components/Estimations.js +2 -1
  154. package/dist/views/BuyBond/components/Estimations.js.map +1 -1
  155. package/dist/views/BuyBond/components/PointsLeftForNextTier/PointsLeftForNextTier.js +8 -23
  156. package/dist/views/BuyBond/components/PointsLeftForNextTier/PointsLeftForNextTier.js.map +1 -1
  157. package/dist/views/YourBonds/YourBonds.js +19 -2
  158. package/dist/views/YourBonds/YourBonds.js.map +1 -1
  159. package/dist/views/YourBonds/components/ClaimAll/ClaimAllModal.js +139 -5
  160. package/dist/views/YourBonds/components/ClaimAll/ClaimAllModal.js.map +1 -1
  161. package/dist/views/YourBonds/components/ClaimAll/index.js +6 -2
  162. package/dist/views/YourBonds/components/ClaimAll/index.js.map +1 -1
  163. package/dist/views/YourBonds/components/UserBondRow/UserBondRowAptos.d.ts +6 -0
  164. package/dist/views/YourBonds/components/UserBondRow/UserBondRowAptos.js +109 -0
  165. package/dist/views/YourBonds/components/UserBondRow/UserBondRowAptos.js.map +1 -0
  166. package/dist/views/YourBonds/components/UserBondRow/UserBondRowSui.d.ts +6 -0
  167. package/dist/views/YourBonds/components/UserBondRow/UserBondRowSui.js +126 -0
  168. package/dist/views/YourBonds/components/UserBondRow/UserBondRowSui.js.map +1 -0
  169. package/dist/views/YourBonds/components/UserBondRow/index.d.ts +2 -0
  170. package/dist/views/YourBondsModal/YourBondsModal.js +3 -1
  171. package/dist/views/YourBondsModal/YourBondsModal.js.map +1 -1
  172. package/dist/views/YourBondsModal/components/Actions/ActionsAptos.d.ts +6 -0
  173. package/dist/views/YourBondsModal/components/Actions/ActionsAptos.js +96 -0
  174. package/dist/views/YourBondsModal/components/Actions/ActionsAptos.js.map +1 -0
  175. package/dist/views/YourBondsModal/components/Actions/ActionsSui.d.ts +6 -0
  176. package/dist/views/YourBondsModal/components/Actions/ActionsSui.js +115 -0
  177. package/dist/views/YourBondsModal/components/Actions/ActionsSui.js.map +1 -0
  178. package/dist/views/YourBondsModal/components/TransferBondModal/TransferActionAptos.d.ts +8 -0
  179. package/dist/views/YourBondsModal/components/TransferBondModal/TransferActionAptos.js +18 -0
  180. package/dist/views/YourBondsModal/components/TransferBondModal/TransferActionAptos.js.map +1 -0
  181. package/dist/views/YourBondsModal/components/TransferBondModal/index.js +2 -1
  182. package/dist/views/YourBondsModal/components/TransferBondModal/index.js.map +1 -1
  183. package/package.json +7 -4
@@ -3,9 +3,12 @@ import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
3
3
  import axios from 'axios';
4
4
  import useTokenPrices from '../tokenPrices/useTokenPrices.js';
5
5
  import useBondsList from './useBondsList.js';
6
+ import { ChainId } from '@ape.swap/apeswap-lists';
6
7
  import { ACF_TO_ABOND } from '../../config/constants/addresses.js';
7
8
  import useBondsListPreTGE from './useBondsListPreTGE.js';
8
9
  import { fetchBondsData, fetchBondsDataPreTGE } from './utils.js';
10
+ import { enrichAptosBonds } from './fetchBondsDataAptos.js';
11
+ import { enrichSuiBonds } from './fetchBondsDataSui.js';
9
12
 
10
13
  function useBondsData() {
11
14
  const { data: bondList } = useBondsList();
@@ -26,8 +29,7 @@ function useBondsData() {
26
29
  });
27
30
  }
28
31
  const calculateBondsData = async (queryClient) => {
29
- console.log('calculateBondsData');
30
- // Fetch state from queryClient
32
+ // Firstly, we fetch some necessary data and prepare the ground to then fetch on.chain bonds data.
31
33
  const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]);
32
34
  const realTimeApiUrl = urls['realTimeApi'];
33
35
  const apiUrl = urls['apiV2'];
@@ -49,17 +51,21 @@ const calculateBondsData = async (queryClient) => {
49
51
  }
50
52
  return acc;
51
53
  }, {});
54
+ // Secondly we fetch EVM & SOL data from realtime
55
+ let evmSolBondsData = [];
52
56
  try {
53
- // First, we try to fetch from realtime API
57
+ // For EVM & SOL we first try to fetch from realtime, if it fails we trigger the fallback strategy.
54
58
  const realTimeApiResponse = await axios.get(`${realTimeApiUrl}/bonds`);
55
- return realTimeApiResponse.data.bonds.filter((bond) => chains.includes(bond.chainId));
59
+ evmSolBondsData = realTimeApiResponse.data.bonds.filter((bond) => chains.includes(bond.chainId));
56
60
  }
57
61
  catch {
58
- // If realtime fails, we trigger the fallback strategy on the client
62
+ // Fallback strategy
59
63
  if (bondList) {
60
64
  console.time('Fallback BondsData');
61
65
  const billData = await Promise.all([
62
- ...chains.map(async (chainId) => {
66
+ ...chains
67
+ .filter((c) => c !== ChainId.APTOS_MAINNET && c !== ChainId.SUI_MAINNET)
68
+ .map(async (chainId) => {
63
69
  if (!reducedBonds[chainId])
64
70
  return [];
65
71
  return ((await fetchBondsData(chainId, reducedBonds[chainId], apiUrl, tokenPrices?.[chainId], priceApiUrl)) ?? []);
@@ -70,10 +76,28 @@ const calculateBondsData = async (queryClient) => {
70
76
  }),
71
77
  ]);
72
78
  console.timeEnd('Fallback BondsData');
73
- return billData.flat();
79
+ evmSolBondsData = billData.flat();
74
80
  }
75
- return [];
76
81
  }
82
+ // Lastly, we fetch Aptos & Sui Bonds data
83
+ let aptosBonds = [];
84
+ let suiBonds = [];
85
+ try {
86
+ if (reducedBonds &&
87
+ tokenPrices &&
88
+ (chains.includes(ChainId.APTOS_MAINNET) || chains.includes(ChainId.SUI_MAINNET))) {
89
+ const [aptos, sui] = await Promise.all([
90
+ enrichAptosBonds(reducedBonds[ChainId.APTOS_MAINNET], tokenPrices[ChainId.APTOS_MAINNET], priceApiUrl),
91
+ enrichSuiBonds(reducedBonds[ChainId.SUI_MAINNET], tokenPrices[ChainId.SUI_MAINNET], priceApiUrl),
92
+ ]);
93
+ aptosBonds = aptos;
94
+ suiBonds = sui;
95
+ }
96
+ }
97
+ catch (e) {
98
+ console.error(e);
99
+ }
100
+ return [...evmSolBondsData, ...aptosBonds, ...suiBonds];
77
101
  };
78
102
 
79
103
  export { calculateBondsData, useBondsData as default };
@@ -1 +1 @@
1
- {"version":3,"file":"useBondsData.js","sources":["../../../src/state/bonds/useBondsData.ts"],"sourcesContent":["import { QueryClient, useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BondsData } from '../../types/bonds'\nimport axios from 'axios'\nimport { SDKProps } from '../useSDKConfig'\nimport useTokenPrices, { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport useBondsList from './useBondsList'\nimport { BillsConfig, ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport { ACF_TO_ABOND } from '../../config/constants/addresses'\nimport useBondsListPreTGE from '../bonds/useBondsListPreTGE'\nimport { fetchBondsData, fetchBondsDataPreTGE } from './utils'\n\nexport default function useBondsData(): UseQueryResult<BondsData[]> {\n const { data: bondList } = useBondsList()\n const { data: preTGEList } = useBondsListPreTGE()\n const { data: tokenPrices } = useTokenPrices()\n const tokenPricesKey = Object.keys(tokenPrices ?? {})?.length\n const queryClient = useQueryClient()\n\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_DATA],\n queryFn: () => calculateBondsData(queryClient),\n refetchInterval: 25000, // i.e. 25 sec\n enabled: !!bondList && !!preTGEList && !!tokenPricesKey,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n retry: 0,\n staleTime: 25000, // i.e. 25 sec\n })\n}\n\nexport const calculateBondsData = async (queryClient: QueryClient): Promise<BondsData[]> => {\n console.log('calculateBondsData')\n // Fetch state from queryClient\n const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiUrl = urls['realTimeApi']\n const apiUrl = urls['apiV2']\n const priceApiUrl = urls['priceApi']\n const bondList: BillsConfig[] = queryClient?.getQueryData([QUERY_KEYS.BONDS_LIST]) as BillsConfig[]\n const preTGEList: PreTGEConfig[] = queryClient?.getQueryData([QUERY_KEYS.BONDS_LIST_PRE_TGE]) as PreTGEConfig[]\n const tokenPrices: Partial<Record<ChainId, TokenPrices[]>> | undefined = queryClient?.getQueryData([\n QUERY_KEYS.TOKEN_PRICES,\n ])\n if (!tokenPrices) return []\n const reducedBonds = bondList?.reduce<Record<number, BillsConfig[]>>((acc, bill) => {\n const chainId = bill.chainId\n if (!acc[chainId]) {\n acc[chainId] = []\n }\n if (bill.contractAddress?.[chainId]?.toLowerCase() !== ACF_TO_ABOND.toLowerCase() && !bill.soldOut) {\n acc[chainId].push(bill)\n }\n return acc\n }, {})\n try {\n // First, we try to fetch from realtime API\n const realTimeApiResponse = await axios.get(`${realTimeApiUrl}/bonds`)\n return realTimeApiResponse.data.bonds.filter((bond: BondsData) => chains.includes(bond.chainId))\n } catch {\n // If realtime fails, we trigger the fallback strategy on the client\n if (bondList) {\n console.time('Fallback BondsData')\n const billData = await Promise.all([\n ...chains.map(async (chainId: ChainId) => {\n if (!reducedBonds[chainId]) return []\n return (\n (await fetchBondsData(chainId, reducedBonds[chainId], apiUrl, tokenPrices?.[chainId], priceApiUrl)) ?? []\n )\n }),\n ...chains.map(async (chainId: ChainId) => {\n const filteredBonds = preTGEList?.filter((bond) => bond.chainId === chainId) ?? []\n return await fetchBondsDataPreTGE(chainId, tokenPrices, filteredBonds, apiUrl)\n }),\n ])\n console.timeEnd('Fallback BondsData')\n return billData.flat()\n }\n return []\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useBondsData.js","sources":["../../../src/state/bonds/useBondsData.ts"],"sourcesContent":["import { QueryClient, useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BondsData } from '../../types/bonds'\nimport axios from 'axios'\nimport { SDKProps } from '../useSDKConfig'\nimport useTokenPrices, { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport useBondsList from './useBondsList'\nimport { BillsConfig, ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport { ACF_TO_ABOND } from '../../config/constants/addresses'\nimport useBondsListPreTGE from '../bonds/useBondsListPreTGE'\nimport { fetchBondsData, fetchBondsDataPreTGE } from './utils'\nimport { enrichAptosBonds } from './fetchBondsDataAptos'\nimport { enrichSuiBonds } from './fetchBondsDataSui'\n\nexport default function useBondsData(): UseQueryResult<BondsData[]> {\n const { data: bondList } = useBondsList()\n const { data: preTGEList } = useBondsListPreTGE()\n const { data: tokenPrices } = useTokenPrices()\n const tokenPricesKey = Object.keys(tokenPrices ?? {})?.length\n const queryClient = useQueryClient()\n\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_DATA],\n queryFn: () => calculateBondsData(queryClient),\n refetchInterval: 25000, // i.e. 25 sec\n enabled: !!bondList && !!preTGEList && !!tokenPricesKey,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n retry: 0,\n staleTime: 25000, // i.e. 25 sec\n })\n}\n\nexport const calculateBondsData = async (queryClient: QueryClient): Promise<BondsData[]> => {\n // Firstly, we fetch some necessary data and prepare the ground to then fetch on.chain bonds data.\n const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiUrl = urls['realTimeApi']\n const apiUrl = urls['apiV2']\n const priceApiUrl = urls['priceApi']\n const bondList: BillsConfig[] = queryClient?.getQueryData([QUERY_KEYS.BONDS_LIST]) as BillsConfig[]\n const preTGEList: PreTGEConfig[] = queryClient?.getQueryData([QUERY_KEYS.BONDS_LIST_PRE_TGE]) as PreTGEConfig[]\n const tokenPrices: Partial<Record<ChainId, TokenPrices[]>> | undefined = queryClient?.getQueryData([\n QUERY_KEYS.TOKEN_PRICES,\n ])\n if (!tokenPrices) return []\n const reducedBonds = bondList?.reduce<Record<number, BillsConfig[]>>((acc, bill) => {\n const chainId = bill.chainId\n if (!acc[chainId]) {\n acc[chainId] = []\n }\n if (bill.contractAddress?.[chainId]?.toLowerCase() !== ACF_TO_ABOND.toLowerCase() && !bill.soldOut) {\n acc[chainId].push(bill)\n }\n return acc\n }, {})\n\n // Secondly we fetch EVM & SOL data from realtime\n let evmSolBondsData: BondsData[] = []\n\n try {\n // For EVM & SOL we first try to fetch from realtime, if it fails we trigger the fallback strategy.\n const realTimeApiResponse = await axios.get(`${realTimeApiUrl}/bonds`)\n evmSolBondsData = realTimeApiResponse.data.bonds.filter((bond: BondsData) => chains.includes(bond.chainId))\n } catch {\n // Fallback strategy\n if (bondList) {\n console.time('Fallback BondsData')\n const billData = await Promise.all([\n ...chains\n .filter((c) => c !== ChainId.APTOS_MAINNET && c !== ChainId.SUI_MAINNET)\n .map(async (chainId: ChainId) => {\n if (!reducedBonds[chainId]) return []\n return (\n (await fetchBondsData(chainId, reducedBonds[chainId], apiUrl, tokenPrices?.[chainId], priceApiUrl)) ?? []\n )\n }),\n ...chains.map(async (chainId: ChainId) => {\n const filteredBonds = preTGEList?.filter((bond) => bond.chainId === chainId) ?? []\n return await fetchBondsDataPreTGE(chainId, tokenPrices, filteredBonds, apiUrl)\n }),\n ])\n console.timeEnd('Fallback BondsData')\n evmSolBondsData = billData.flat()\n }\n }\n\n // Lastly, we fetch Aptos & Sui Bonds data\n let aptosBonds: BondsData[] = []\n let suiBonds: BondsData[] = []\n\n try {\n if (\n reducedBonds &&\n tokenPrices &&\n (chains.includes(ChainId.APTOS_MAINNET) || chains.includes(ChainId.SUI_MAINNET))\n ) {\n const [aptos, sui] = await Promise.all([\n enrichAptosBonds(reducedBonds[ChainId.APTOS_MAINNET], tokenPrices[ChainId.APTOS_MAINNET], priceApiUrl),\n enrichSuiBonds(reducedBonds[ChainId.SUI_MAINNET], tokenPrices[ChainId.SUI_MAINNET], priceApiUrl),\n ])\n aptosBonds = aptos\n suiBonds = sui\n }\n } catch (e) {\n console.error(e)\n }\n\n return [...evmSolBondsData, ...aptosBonds, ...suiBonds]\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,10 @@
1
1
  import { useQueryClient, useQuery } from '@tanstack/react-query';
2
2
  import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
3
3
  import axios from 'axios';
4
+ import { ChainId } from '@ape.swap/apeswap-lists';
4
5
  import { reportError } from '../../utils/reportError.js';
6
+ import { getAptosBondsList } from './aptosBondsConfig.js';
7
+ import { getSuiBondsList } from './suiBondsConfig.js';
5
8
 
6
9
  function useBondsList() {
7
10
  const queryClient = useQueryClient();
@@ -19,7 +22,17 @@ const getBondsList = async (queryClient) => {
19
22
  const apiUrl = urls['apiV2'];
20
23
  try {
21
24
  const response = await axios.get(`${realTimeApiURL}/utils/bonds${customBranch ? `?branch=${customBranch}` : ''}`);
22
- return response.data;
25
+ // TODO remove this fallback, from now on bonds should be fetched from list repo 'feat/sui-aptos' branch. Also remove try-catch
26
+ // Aptos bonds come from static config (on-chain first). realtime-api won't
27
+ // support Aptos. To add new markets, update aptosBondsConfig.ts.
28
+ const apiData = response.data ?? [];
29
+ if (apiData.some((b) => b.chainId === ChainId.APTOS_MAINNET)) {
30
+ return apiData;
31
+ }
32
+ // Sui bonds come from static config (on-chain first). realtime-api won't
33
+ // support Sui. To add new markets, update suiBondsConfig.ts.
34
+ const suiBonds = apiData.some((b) => b.chainId === ChainId.SUI_MAINNET) ? [] : getSuiBondsList();
35
+ return [...apiData, ...getAptosBondsList(), ...suiBonds];
23
36
  }
24
37
  catch (e) {
25
38
  reportError({
@@ -27,7 +40,7 @@ const getBondsList = async (queryClient) => {
27
40
  error: e,
28
41
  extraInfo: { type: 'getBondsList', e },
29
42
  });
30
- return [];
43
+ return [...getAptosBondsList(), ...getSuiBondsList()];
31
44
  }
32
45
  };
33
46
 
@@ -1 +1 @@
1
- {"version":3,"file":"useBondsList.js","sources":["../../../src/state/bonds/useBondsList.ts"],"sourcesContent":["import { QueryClient, useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport axios from 'axios'\nimport { BillsConfig } from '@ape.swap/apeswap-lists'\nimport { reportError } from '../../utils/reportError'\nimport { SDKProps } from '../useSDKConfig'\n\nexport default function useBondsList(): UseQueryResult<BillsConfig[]> {\n const queryClient = useQueryClient()\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_LIST],\n queryFn: () => getBondsList(queryClient),\n staleTime: Infinity,\n refetchInterval: 300000, // 5 min\n refetchOnWindowFocus: false,\n })\n}\n\nexport const getBondsList = async (queryClient: QueryClient): Promise<BillsConfig[]> => {\n const { urls, customBranch } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiURL = urls['realTimeApi']\n const apiUrl = urls['apiV2']\n\n try {\n const response = await axios.get(`${realTimeApiURL}/utils/bonds${customBranch ? `?branch=${customBranch}` : ''}`)\n return response.data\n } catch (e) {\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getBondsList', e },\n })\n return []\n }\n}\n"],"names":[],"mappings":";;;;;AAOc,SAAU,YAAY,GAAA;AAClC,IAAA,MAAM,WAAW,GAAG,cAAc,EAAE;AACpC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;AACjC,QAAA,OAAO,EAAE,MAAM,YAAY,CAAC,WAAW,CAAC;AACxC,QAAA,SAAS,EAAE,QAAQ;QACnB,eAAe,EAAE,MAAM;AACvB,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA,CAAC;AACJ;MAEa,YAAY,GAAG,OAAO,WAAwB,KAA4B;AACrF,IAAA,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAa;AAC7F,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;AAC1C,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;AAE5B,IAAA,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,cAAc,CAAA,YAAA,EAAe,YAAY,GAAG,CAAA,QAAA,EAAW,YAAY,CAAA,CAAE,GAAG,EAAE,CAAA,CAAE,CAAC;QACjH,OAAO,QAAQ,CAAC,IAAI;IACtB;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,WAAW,CAAC;YACV,MAAM;AACN,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;AACvC,SAAA,CAAC;AACF,QAAA,OAAO,EAAE;IACX;AACF;;;;"}
1
+ {"version":3,"file":"useBondsList.js","sources":["../../../src/state/bonds/useBondsList.ts"],"sourcesContent":["import { QueryClient, useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport axios from 'axios'\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { reportError } from '../../utils/reportError'\nimport { SDKProps } from '../useSDKConfig'\nimport { getAptosBondsList } from './aptosBondsConfig'\nimport { getSuiBondsList } from './suiBondsConfig'\n\nexport default function useBondsList(): UseQueryResult<BillsConfig[]> {\n const queryClient = useQueryClient()\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_LIST],\n queryFn: () => getBondsList(queryClient),\n staleTime: Infinity,\n refetchInterval: 300000, // 5 min\n refetchOnWindowFocus: false,\n })\n}\n\nexport const getBondsList = async (queryClient: QueryClient): Promise<BillsConfig[]> => {\n const { urls, customBranch } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiURL = urls['realTimeApi']\n const apiUrl = urls['apiV2']\n\n try {\n const response = await axios.get(`${realTimeApiURL}/utils/bonds${customBranch ? `?branch=${customBranch}` : ''}`)\n // TODO remove this fallback, from now on bonds should be fetched from list repo 'feat/sui-aptos' branch. Also remove try-catch\n\n // Aptos bonds come from static config (on-chain first). realtime-api won't\n // support Aptos. To add new markets, update aptosBondsConfig.ts.\n const apiData: BillsConfig[] = response.data ?? []\n if (apiData.some((b) => b.chainId === ChainId.APTOS_MAINNET)) {\n return apiData\n }\n // Sui bonds come from static config (on-chain first). realtime-api won't\n // support Sui. To add new markets, update suiBondsConfig.ts.\n const suiBonds = apiData.some((b) => b.chainId === ChainId.SUI_MAINNET) ? [] : getSuiBondsList()\n return [...apiData, ...getAptosBondsList(), ...suiBonds]\n } catch (e) {\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getBondsList', e },\n })\n return [...getAptosBondsList(), ...getSuiBondsList()]\n }\n}\n"],"names":[],"mappings":";;;;;;;;AASc,SAAU,YAAY,GAAA;AAClC,IAAA,MAAM,WAAW,GAAG,cAAc,EAAE;AACpC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;AACjC,QAAA,OAAO,EAAE,MAAM,YAAY,CAAC,WAAW,CAAC;AACxC,QAAA,SAAS,EAAE,QAAQ;QACnB,eAAe,EAAE,MAAM;AACvB,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA,CAAC;AACJ;MAEa,YAAY,GAAG,OAAO,WAAwB,KAA4B;AACrF,IAAA,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAa;AAC7F,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;AAC1C,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;AAE5B,IAAA,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,cAAc,CAAA,YAAA,EAAe,YAAY,GAAG,CAAA,QAAA,EAAW,YAAY,CAAA,CAAE,GAAG,EAAE,CAAA,CAAE,CAAC;;;;AAKjH,QAAA,MAAM,OAAO,GAAkB,QAAQ,CAAC,IAAI,IAAI,EAAE;AAClD,QAAA,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,aAAa,CAAC,EAAE;AAC5D,YAAA,OAAO,OAAO;QAChB;;;AAGA,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,eAAe,EAAE;QAChG,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,iBAAiB,EAAE,EAAE,GAAG,QAAQ,CAAC;IAC1D;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,WAAW,CAAC;YACV,MAAM;AACN,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;AACvC,SAAA,CAAC;QACF,OAAO,CAAC,GAAG,iBAAiB,EAAE,EAAE,GAAG,eAAe,EAAE,CAAC;IACvD;AACF;;;;"}
@@ -2,4 +2,4 @@ import { QueryClient, UseQueryResult } from '@tanstack/react-query';
2
2
  import { BillsConfig } from '@ape.swap/apeswap-lists';
3
3
  import { UserBill } from '../../types/yourbonds';
4
4
  export default function useUserBonds(): UseQueryResult<UserBill[]>;
5
- export declare const getUserBonds: (account: string, solanaAccount: string, bondList: BillsConfig[], queryClient: QueryClient) => Promise<UserBill[]>;
5
+ export declare const getUserBonds: (account: string, solanaAccount: string, aptosAccount: string, suiAccount: string, bondList: BillsConfig[], queryClient: QueryClient) => Promise<UserBill[]>;
@@ -9,20 +9,33 @@ import { ACF_TO_ABOND } from '../../config/constants/addresses.js';
9
9
  import { reportError } from '../../utils/reportError.js';
10
10
  import useEVMAccount from '../../hooks/accounts/useEVMAccount.js';
11
11
  import useSOLAccount from '../../hooks/accounts/useSOLAccount.js';
12
+ import useAPTAccount from '../../hooks/accounts/useAPTAccount.js';
13
+ import useSUIAccount from '../../hooks/accounts/useSUIAccount.js';
14
+ import { fetchUserOwnedAptosBonds } from './fetchBillsUserAptos.js';
15
+ import { fetchUserOwnedSuiBonds } from './fetchBillsUserSui.js';
12
16
  import axios from 'axios';
13
17
 
14
18
  function useUserBonds() {
15
19
  // First fetch the full list of bonds
16
- const { data: bondList } = useBondsList();
20
+ const { data: bondList } = useBondsList(); // aca podes reemplazarlo con un dummy
17
21
  const { address } = useEVMAccount();
18
22
  const { publicKey } = useSOLAccount();
19
23
  const solanaAccount = publicKey?.toBase58();
24
+ const { address: aptosAccount } = useAPTAccount();
25
+ const { address: suiAccount } = useSUIAccount();
20
26
  const { data: tokenPrices } = useTokenPrices();
21
27
  const queryClient = useQueryClient();
22
28
  return useQuery({
23
- queryKey: [QUERY_KEYS.USER_BONDS, address, publicKey, Object.keys(tokenPrices ?? {})?.length ?? null],
24
- queryFn: () => getUserBonds(address, solanaAccount, bondList, queryClient),
25
- enabled: !!bondList && !!(address || solanaAccount) && !!tokenPrices,
29
+ queryKey: [
30
+ QUERY_KEYS.USER_BONDS,
31
+ address,
32
+ publicKey,
33
+ aptosAccount,
34
+ suiAccount,
35
+ Object.keys(tokenPrices ?? {})?.length ?? null,
36
+ ],
37
+ queryFn: () => getUserBonds(address, solanaAccount, aptosAccount, suiAccount, bondList, queryClient),
38
+ enabled: !!bondList && !!(address || solanaAccount || aptosAccount || suiAccount) && !!tokenPrices,
26
39
  refetchInterval: 120000,
27
40
  refetchOnWindowFocus: false,
28
41
  refetchOnMount: false,
@@ -30,13 +43,12 @@ function useUserBonds() {
30
43
  retry: 1,
31
44
  });
32
45
  }
33
- const getUserBonds = async (account, solanaAccount, bondList, queryClient) => {
46
+ const getUserBonds = async (account, solanaAccount, aptosAccount, suiAccount, bondList, queryClient) => {
34
47
  const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]);
35
48
  const apiUrl = urls['apiV2'];
36
49
  const priceApiUrl = urls['priceApi'];
37
50
  const tokenPrices = queryClient?.getQueryData([QUERY_KEYS.TOKEN_PRICES]);
38
51
  try {
39
- console.time('getUserBonds');
40
52
  const bondsByChain = bondList.reduce((acc, bond) => {
41
53
  // Exclude ACF to ABOND bonds, fixed price bonds, and migration bonds
42
54
  if (bond.contractAddress[bond.chainId]?.toLowerCase() === ACF_TO_ABOND.toLowerCase() ||
@@ -61,6 +73,12 @@ const getUserBonds = async (account, solanaAccount, bondList, queryClient) => {
61
73
  if (chain === ChainId.SOL) {
62
74
  return fetchUserOwnedSolanaBonds(solanaAccount, bondsByChain[chain], tokenPrices, priceApiUrl);
63
75
  }
76
+ else if (chain === ChainId.APTOS_MAINNET) {
77
+ return fetchUserOwnedAptosBonds(aptosAccount, bondsByChain[chain], tokenPrices, priceApiUrl);
78
+ }
79
+ else if (chain === ChainId.SUI_MAINNET) {
80
+ return fetchUserOwnedSuiBonds(suiAccount, bondsByChain[chain], tokenPrices, priceApiUrl);
81
+ }
64
82
  else
65
83
  return fetchUserOwnedBillsDataAsync(chain, account, bondsByChain[chain], tokenPrices, priceApiUrl);
66
84
  }));
@@ -70,7 +88,11 @@ const getUserBonds = async (account, solanaAccount, bondList, queryClient) => {
70
88
  .map((result) => result.value);
71
89
  const onChainData = fulfilledResults.flat().flatMap((result) => result.userOwnedBills);
72
90
  // Prepare body for batch API call
73
- const body = Object.values(onChainData.reduce((acc, data) => {
91
+ // api-v2 won't support Aptos/Sui. Bills are read on-chain, no /bills/multi-batch
92
+ // enrichment. Aptos/Sui bills use the placeholder image from their constants.
93
+ const body = Object.values(onChainData
94
+ .filter((data) => data?.bond?.chainId !== ChainId.APTOS_MAINNET && data?.bond?.chainId !== ChainId.SUI_MAINNET)
95
+ .reduce((acc, data) => {
74
96
  const contract = data?.bond?.chainId === ChainId.SOL ? data.bond.contractAddress[data.bond.chainId] : data.billNftAddress;
75
97
  const key = `${data?.bond?.chainId}-${contract}`;
76
98
  if (!acc[key]) {
@@ -89,13 +111,14 @@ const getUserBonds = async (account, solanaAccount, bondList, queryClient) => {
89
111
  }
90
112
  catch (e) {
91
113
  console.error(e);
92
- console.log('multibatch failed, using only on-chain data');
93
- console.timeEnd('getUserBonds');
94
114
  return onChainData;
95
115
  }
96
- console.log('multibatch success');
97
- // Enrich on-chain data with API data
116
+ // Enrich on-chain data with API data.
117
+ // Aptos/Sui bills are not sent to api-v2 (no support), so keep their existing
118
+ // nftData populated by fetchBillsUser{Aptos,Sui} instead of overwriting with undefined.
98
119
  const enrichedData = onChainData.map((userBond) => {
120
+ if (userBond.bond?.chainId === ChainId.APTOS_MAINNET || userBond.bond?.chainId === ChainId.SUI_MAINNET)
121
+ return userBond;
99
122
  const nftDataResponse = response.data?.find((nft) => {
100
123
  const contract = nft.contract.toLowerCase();
101
124
  const chain = nft.chainId;
@@ -109,7 +132,6 @@ const getUserBonds = async (account, solanaAccount, bondList, queryClient) => {
109
132
  nftData,
110
133
  };
111
134
  });
112
- console.timeEnd('getUserBonds');
113
135
  return enrichedData;
114
136
  }
115
137
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"useUserBonds.js","sources":["../../../src/state/bonds/useUserBonds.ts"],"sourcesContent":["import { QueryClient, useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BillsConfig, ChainId, BillVersion } from '@ape.swap/apeswap-lists'\nimport useBondsList from './useBondsList'\nimport { fetchUserOwnedBillsDataAsync } from './fetchBillsUser'\nimport { UserBill, UserBillNftData } from '../../types/yourbonds'\nimport { SDKProps } from '../useSDKConfig'\nimport useTokenPrices, { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport { fetchUserOwnedSolanaBonds } from './fetchBillsUserSolana'\nimport { ACF_TO_ABOND } from '../../config/constants/addresses'\nimport { reportError } from '../../utils/reportError'\nimport useEVMAccount from '../../hooks/accounts/useEVMAccount'\nimport useSOLAccount from '../../hooks/accounts/useSOLAccount'\nimport axios from 'axios'\n\nexport default function useUserBonds(): UseQueryResult<UserBill[]> {\n // First fetch the full list of bonds\n const { data: bondList } = useBondsList()\n const { address } = useEVMAccount()\n const { publicKey } = useSOLAccount()\n const solanaAccount = publicKey?.toBase58()\n const { data: tokenPrices } = useTokenPrices()\n const queryClient = useQueryClient()\n return useQuery({\n queryKey: [QUERY_KEYS.USER_BONDS, address, publicKey, Object.keys(tokenPrices ?? {})?.length ?? null],\n queryFn: () => getUserBonds(address!, solanaAccount!, bondList!, queryClient),\n enabled: !!bondList && !!(address || solanaAccount) && !!tokenPrices,\n refetchInterval: 120000,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n retry: 1,\n })\n}\n\nexport const getUserBonds = async (\n account: string,\n solanaAccount: string,\n bondList: BillsConfig[],\n queryClient: QueryClient,\n): Promise<UserBill[]> => {\n const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const apiUrl = urls['apiV2']\n const priceApiUrl = urls['priceApi']\n const tokenPrices: Partial<Record<ChainId, TokenPrices[]>> = queryClient?.getQueryData([QUERY_KEYS.TOKEN_PRICES])!\n\n try {\n console.time('getUserBonds')\n const bondsByChain = bondList.reduce(\n (acc, bond) => {\n // Exclude ACF to ABOND bonds, fixed price bonds, and migration bonds\n if (\n bond.contractAddress[bond.chainId]?.toLowerCase() === ACF_TO_ABOND.toLowerCase() ||\n bond.billVersion === BillVersion.FixedPrice ||\n bond.billType === 'migration'\n ) {\n return acc // Skip this bond\n }\n\n // Only process bonds that belong to the specified chains\n if (chains.includes(bond.chainId)) {\n // Initialize acc[bond.chainId] if it doesn't exist yet\n if (!acc[bond.chainId]) {\n acc[bond.chainId] = []\n }\n\n // Safely push the bond to the array\n acc[bond.chainId].push(bond)\n }\n return acc\n },\n {} as Record<number, BillsConfig[]>,\n )\n\n const results = await Promise.allSettled(\n chains\n .filter((chain) => bondsByChain[chain])\n .map((chain) => {\n if (chain === ChainId.SOL) {\n return fetchUserOwnedSolanaBonds(solanaAccount, bondsByChain[chain], tokenPrices, priceApiUrl)\n } else\n return fetchUserOwnedBillsDataAsync(chain as number, account, bondsByChain[chain], tokenPrices, priceApiUrl)\n }),\n )\n\n // Filter out only fulfilled promises\n const fulfilledResults = results\n .filter((result): result is PromiseFulfilledResult<any> => result.status === 'fulfilled')\n .map((result) => result.value)\n\n const onChainData: UserBill[] = fulfilledResults.flat().flatMap((result) => result.userOwnedBills)\n\n // Prepare body for batch API call\n const body = Object.values(\n onChainData.reduce(\n (acc, data) => {\n const contract =\n data?.bond?.chainId === ChainId.SOL ? data.bond.contractAddress[data.bond.chainId] : data.billNftAddress\n const key = `${data?.bond?.chainId}-${contract}`\n\n if (!acc[key]) {\n acc[key] = {\n chainId: data?.bond?.chainId as number,\n contract: contract as string,\n billIds: [],\n }\n }\n\n acc[key].billIds.push(parseInt(data.id))\n return acc\n },\n {} as Record<string, { chainId: number; contract: string; billIds: number[] }>,\n ),\n )\n let response\n\n try {\n response = await axios.post(`${apiUrl}/bills/multi-batch`, body, { timeout: 40000 })\n } catch (e) {\n console.error(e)\n console.log('multibatch failed, using only on-chain data')\n console.timeEnd('getUserBonds')\n return onChainData\n }\n console.log('multibatch success')\n\n // Enrich on-chain data with API data\n const enrichedData: UserBill[] = onChainData.map((userBond) => {\n const nftDataResponse = response.data?.find((nft: any) => {\n const contract = nft.contract.toLowerCase()\n const chain = nft.chainId\n\n // API uses contractAddress for Solana bonds instead of NFT Address\n const contractToCompare =\n chain === ChainId.SOL ? userBond.bond?.contractAddress[ChainId.SOL] : userBond.billNftAddress\n return contractToCompare?.toLowerCase() === contract && userBond.bond?.chainId === chain\n })\n const nftData: UserBillNftData | undefined = nftDataResponse?.bills?.find(\n (billApiData: UserBillNftData) => billApiData.tokenId === parseInt(userBond.id),\n )\n return {\n ...userBond,\n nftData,\n }\n })\n\n console.timeEnd('getUserBonds')\n return enrichedData\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getUserBonds', bondList, chains, e },\n account,\n })\n throw new Error('Failed to fetch user bonds')\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useUserBonds.js","sources":["../../../src/state/bonds/useUserBonds.ts"],"sourcesContent":["import { QueryClient, useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BillsConfig, ChainId, BillVersion } from '@ape.swap/apeswap-lists'\nimport useBondsList from './useBondsList'\nimport { fetchUserOwnedBillsDataAsync } from './fetchBillsUser'\nimport { UserBill, UserBillNftData } from '../../types/yourbonds'\nimport { SDKProps } from '../useSDKConfig'\nimport useTokenPrices, { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport { fetchUserOwnedSolanaBonds } from './fetchBillsUserSolana'\nimport { ACF_TO_ABOND } from '../../config/constants/addresses'\nimport { reportError } from '../../utils/reportError'\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 { fetchUserOwnedAptosBonds } from './fetchBillsUserAptos'\nimport { fetchUserOwnedSuiBonds } from './fetchBillsUserSui'\nimport axios from 'axios'\n\nexport default function useUserBonds(): UseQueryResult<UserBill[]> {\n // First fetch the full list of bonds\n const { data: bondList } = useBondsList() // aca podes reemplazarlo con un dummy\n const { address } = useEVMAccount()\n const { publicKey } = useSOLAccount()\n const solanaAccount = publicKey?.toBase58()\n const { address: aptosAccount } = useAPTAccount()\n const { address: suiAccount } = useSUIAccount()\n const { data: tokenPrices } = useTokenPrices()\n const queryClient = useQueryClient()\n return useQuery({\n queryKey: [\n QUERY_KEYS.USER_BONDS,\n address,\n publicKey,\n aptosAccount,\n suiAccount,\n Object.keys(tokenPrices ?? {})?.length ?? null,\n ],\n queryFn: () => getUserBonds(address!, solanaAccount!, aptosAccount!, suiAccount!, bondList!, queryClient),\n enabled: !!bondList && !!(address || solanaAccount || aptosAccount || suiAccount) && !!tokenPrices,\n refetchInterval: 120000,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n retry: 1,\n })\n}\n\nexport const getUserBonds = async (\n account: string,\n solanaAccount: string,\n aptosAccount: string,\n suiAccount: string,\n bondList: BillsConfig[],\n queryClient: QueryClient,\n): Promise<UserBill[]> => {\n const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const apiUrl = urls['apiV2']\n const priceApiUrl = urls['priceApi']\n const tokenPrices: Partial<Record<ChainId, TokenPrices[]>> = queryClient?.getQueryData([QUERY_KEYS.TOKEN_PRICES])!\n\n try {\n const bondsByChain = bondList.reduce(\n (acc, bond) => {\n // Exclude ACF to ABOND bonds, fixed price bonds, and migration bonds\n if (\n bond.contractAddress[bond.chainId]?.toLowerCase() === ACF_TO_ABOND.toLowerCase() ||\n bond.billVersion === BillVersion.FixedPrice ||\n bond.billType === 'migration'\n ) {\n return acc // Skip this bond\n }\n\n // Only process bonds that belong to the specified chains\n if (chains.includes(bond.chainId)) {\n // Initialize acc[bond.chainId] if it doesn't exist yet\n if (!acc[bond.chainId]) {\n acc[bond.chainId] = []\n }\n\n // Safely push the bond to the array\n acc[bond.chainId].push(bond)\n }\n return acc\n },\n {} as Record<number, BillsConfig[]>,\n )\n\n const results = await Promise.allSettled(\n chains\n .filter((chain) => bondsByChain[chain])\n .map((chain) => {\n if (chain === ChainId.SOL) {\n return fetchUserOwnedSolanaBonds(solanaAccount, bondsByChain[chain], tokenPrices, priceApiUrl)\n } else if (chain === ChainId.APTOS_MAINNET) {\n return fetchUserOwnedAptosBonds(aptosAccount, bondsByChain[chain], tokenPrices, priceApiUrl)\n } else if (chain === ChainId.SUI_MAINNET) {\n return fetchUserOwnedSuiBonds(suiAccount, bondsByChain[chain], tokenPrices, priceApiUrl)\n } else\n return fetchUserOwnedBillsDataAsync(chain as number, account, bondsByChain[chain], tokenPrices, priceApiUrl)\n }),\n )\n\n // Filter out only fulfilled promises\n const fulfilledResults = results\n .filter((result): result is PromiseFulfilledResult<any> => result.status === 'fulfilled')\n .map((result) => result.value)\n\n const onChainData: UserBill[] = fulfilledResults.flat().flatMap((result) => result.userOwnedBills)\n\n // Prepare body for batch API call\n // api-v2 won't support Aptos/Sui. Bills are read on-chain, no /bills/multi-batch\n // enrichment. Aptos/Sui bills use the placeholder image from their constants.\n const body = Object.values(\n onChainData\n .filter((data) => data?.bond?.chainId !== ChainId.APTOS_MAINNET && data?.bond?.chainId !== ChainId.SUI_MAINNET)\n .reduce(\n (acc, data) => {\n const contract =\n data?.bond?.chainId === ChainId.SOL ? data.bond.contractAddress[data.bond.chainId] : data.billNftAddress\n const key = `${data?.bond?.chainId}-${contract}`\n\n if (!acc[key]) {\n acc[key] = {\n chainId: data?.bond?.chainId as number,\n contract: contract as string,\n billIds: [],\n }\n }\n\n acc[key].billIds.push(parseInt(data.id))\n return acc\n },\n {} as Record<string, { chainId: number; contract: string; billIds: number[] }>,\n ),\n )\n let response\n\n try {\n response = await axios.post(`${apiUrl}/bills/multi-batch`, body, { timeout: 40000 })\n } catch (e) {\n console.error(e)\n return onChainData\n }\n // Enrich on-chain data with API data.\n // Aptos/Sui bills are not sent to api-v2 (no support), so keep their existing\n // nftData populated by fetchBillsUser{Aptos,Sui} instead of overwriting with undefined.\n const enrichedData: UserBill[] = onChainData.map((userBond) => {\n if (userBond.bond?.chainId === ChainId.APTOS_MAINNET || userBond.bond?.chainId === ChainId.SUI_MAINNET)\n return userBond\n\n const nftDataResponse = response.data?.find((nft: any) => {\n const contract = nft.contract.toLowerCase()\n const chain = nft.chainId\n\n // API uses contractAddress for Solana bonds instead of NFT Address\n const contractToCompare =\n chain === ChainId.SOL ? userBond.bond?.contractAddress[ChainId.SOL] : userBond.billNftAddress\n return contractToCompare?.toLowerCase() === contract && userBond.bond?.chainId === chain\n })\n const nftData: UserBillNftData | undefined = nftDataResponse?.bills?.find(\n (billApiData: UserBillNftData) => billApiData.tokenId === parseInt(userBond.id),\n )\n return {\n ...userBond,\n nftData,\n }\n })\n\n return enrichedData\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getUserBonds', bondList, chains, e },\n account,\n })\n throw new Error('Failed to fetch user bonds')\n }\n}\n"],"names":[],"mappings":"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"}
@@ -119,6 +119,14 @@ const fetchBondsData = async (chainId, bills, apiUrl, tokenPrices, priceApiUrl)
119
119
  if (!tokenPrices)
120
120
  return [];
121
121
  try {
122
+ // Aptos & SUI have their own fetching functions, once we integrate them to the realtime api we might want to move those functions here,
123
+ // but for now, we are good with this approach
124
+ if (chainId === ChainId.APTOS_MAINNET) {
125
+ return [];
126
+ }
127
+ if (chainId === ChainId.SUI_MAINNET) {
128
+ return [];
129
+ }
122
130
  if (chainId === ChainId.SOL) {
123
131
  const solanaCalls = [];
124
132
  const solanaBillIds = [];
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/state/bonds/utils.ts"],"sourcesContent":["import { BondsData, TrueBondPrices } from '../../types/bonds'\nimport { getBalanceNumber } from '../../utils/getBalanceNumber'\nimport { BillsConfig, BillVersion, ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport multicall from '../../utils/multicall'\nimport chunk from 'lodash-es/chunk.js'\nimport launchBondsABI_V2_4_1 from '../../config/abi/launchBond_v2_4_1.json'\nimport { SolanaCall, solanaMulticall } from '../../utils/solanaMulticall'\nimport { PublicKey } from '@solana/web3.js'\nimport { derivePda } from '../../utils/derivePda'\nimport { PROGRAM_ID } from '../../constants/solanaConstants'\nimport { BondIssuance, SolanaBondData, SolanaBondsResult } from '../../types/solanaBonds'\nimport BOND_2_4_0 from '../../config/abi/BOND_2_4_0.json'\nimport ERC20ABI from '../../config/abi/erc20.json'\nimport { reportError } from '../../utils/reportError'\nimport BigNumber from 'bignumber.js'\nimport { calculateTrueBondPrice } from '../../utils/calculateSolanaTrueBillPrice'\nimport axios from 'axios'\nimport { TIER_MAPPING } from '../tiers/useTierPoints'\n\nexport const fetchBondsDataPreTGE = async (\n chain: number,\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n preTGEBonds: PreTGEConfig[],\n apiUrl?: string,\n): Promise<BondsData[]> => {\n try {\n if (!preTGEBonds?.length) return []\n const data = []\n const chainId = chain as ChainId\n\n const preTGEBondsIds: number[] = []\n const launchBondsCalls = preTGEBonds.flatMap((bond) => {\n preTGEBondsIds.push(bond.index)\n const bill = bond\n return [\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'trueBillPrice',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'terms',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'totalPrincipalBilled',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'finalized',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'minPoints',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'maxPoints',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'startVestingTimestamp',\n },\n ]\n })\n const vals = await multicall(chainId, launchBondsABI_V2_4_1, launchBondsCalls)\n const chunkSize = vals.length / preTGEBonds.length\n const chunkedBills = chunk(vals, chunkSize)\n const returnedBills = chunkedBills?.map((chunk: any, index) => {\n const bondConfig = preTGEBonds?.find((bill) => bill?.index === preTGEBondsIds[index])!\n\n const [trueBillPrice, terms, totalPrincipalBilled, finalized, minPoints, maxPoints, startVestingTimestamp] = chunk\n const [, , vestingTerm, , , initialRelease, totalRaise, maxTotalPayout] = terms\n\n const initPrice = getBalanceNumber(\n trueBillPrice,\n bondConfig?.lpToken?.decimals?.[bondConfig?.chainId as ChainId] ?? 18,\n )\n\n const lpPrice =\n tokenPrices?.[bondConfig?.chainId]?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() ===\n bondConfig?.lpToken?.address?.[bondConfig?.chainId]?.toLowerCase(),\n )?.price ?? 0\n const earnTokenPrice =\n tokenPrices?.[bondConfig?.chainId]?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() ===\n bondConfig?.earnToken?.address?.[bondConfig?.chainId]?.toLowerCase(),\n )?.price ?? 0\n\n const principalTokenPrice = lpPrice?.toString() ?? '0'\n const payoutTokenPrice = earnTokenPrice ? earnTokenPrice?.toString() : initPrice?.toString()\n\n const bonus = Math.round((bondConfig.tgePrice! / initPrice) * 100 - 100)\n\n const data: BondsData = {\n ...bondConfig,\n initialRelease: initialRelease / 10000,\n vestingTerm: parseInt(vestingTerm),\n trueBondPrices: [\n {\n points: '0',\n boost: 0,\n trueBondPrice: trueBillPrice?.toString(),\n bonus,\n bonusWithFee: bonus, // placeholder, wont be used\n discount: bonus, // placeholder, wont be used\n discountWithFee: bonus, // placeholder, wont be used\n },\n ],\n maxTotalPayout: maxTotalPayout?.toString(),\n totalPrincipalBilled: totalPrincipalBilled?.toString(),\n payoutTokenPrice,\n principalTokenPrice,\n totalRaise: totalRaise?.toString(),\n finalized: finalized[0],\n minPoints: minPoints.toString(),\n maxPoints: maxPoints.toString(),\n startVestingTimestamp: startVestingTimestamp?.toString(),\n initTime: { [bondConfig.chainId]: parseInt(terms[1]) },\n finishTime: parseInt(terms[0]),\n initPrice,\n soldOut: finalized[0] || (parseInt(terms[0]) ?? 0) < Date.now() / 1000 || bondConfig.soldOut,\n }\n return data\n })\n data.push(returnedBills)\n return data.flat()\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getLaunchBondsPublicData', preTGEBonds, chain, e },\n })\n return []\n }\n}\n\nexport const fetchBondsData = async (\n chainId: number,\n bills: BillsConfig[],\n apiUrl: string,\n tokenPrices?: TokenPrices[],\n priceApiUrl?: string,\n) => {\n if (!tokenPrices) return []\n try {\n if (chainId === ChainId.SOL) {\n const solanaCalls: SolanaCall[] = []\n const solanaBillIds: number[] = []\n for (const bill of bills) {\n const bondIssuanceAddress = bill.contractAddress[ChainId.SOL]\n if (!bondIssuanceAddress) continue\n\n solanaBillIds.push(bill.index)\n const bondIssuancePubkey = new PublicKey(bondIssuanceAddress)\n const bondTermPda = derivePda('bond_term', bondIssuancePubkey, PROGRAM_ID)\n const bondPricingPda = derivePda('bond_pricing', bondIssuancePubkey, PROGRAM_ID)\n solanaCalls.push(\n { accountAddress: bondIssuanceAddress, accountType: 'bondIssuance' },\n { accountAddress: bondTermPda.toBase58(), accountType: 'bondTerm' },\n { accountAddress: bondPricingPda.toBase58(), accountType: 'bondPricing' },\n )\n }\n // Fetch Solana bills\n const solanaResults = (await solanaMulticall(solanaCalls)) as SolanaBondsResult\n\n const solanaBills =\n solanaResults?.bondIssuance\n ?.map((bondIssuance: BondIssuance, index: number) => {\n const vestingTermDuration = Number(solanaResults.bondTerm[index]?.vestingEnd.toString())\n const bill = {\n ...bondIssuance,\n ...solanaResults.bondPricing[index],\n terms: solanaResults.bondTerm[index],\n } as SolanaBondData\n\n return [\n bill.trueBillPrice,\n bill.totalPayoutGiven,\n [bill.terms.controlVariable, vestingTermDuration, bill.terms.minimumDebt, bill.terms.maxPayout],\n bill.terms.maxTotalPayout,\n bill.feeInPayout.toString(),\n bill.feeInPrincipal.toString(),\n false,\n undefined,\n undefined,\n solanaResults.bondPricing[index],\n solanaResults.bondTerm[index],\n ] // Map to reflect evm structure\n })\n .filter((bill: any) => typeof bill !== 'undefined') ?? []\n const allBillsIds = []\n const allBillsData = []\n if (solanaBills.length > 0) {\n allBillsIds.push(...solanaBillIds)\n allBillsData.push(...solanaBills)\n }\n return await cleanBillsData(allBillsIds, allBillsData, chainId, bills, tokenPrices, priceApiUrl)\n } else {\n const billIds: number[] = []\n const billCalls = bills.flatMap((bill) => {\n billIds.push(bill.index)\n return [\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: bill.billVersion === BillVersion.V4 ? 'trueBondPrices' : 'trueBillPrice()',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'totalPayoutGiven',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'terms',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: bill.billVersion !== BillVersion.V1 ? 'getMaxTotalPayout' : 'maxTotalPayout',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'feeInPayout',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'feeInPrincipal',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'paused',\n },\n // keep custom treasury at the very last position\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'customTreasury',\n },\n ]\n })\n const vals = await multicall(chainId, BOND_2_4_0, billCalls)\n\n // The following lines basically grab the values from customTreasury returned from bills contract and then,\n // appends the treasury contract's balance to the chunk that will be passed to cleanBillsData\n\n // appendIndex value assumes customTreasury will be at the end of the billCalls array\n const appendIndex = billCalls.length / bills.length\n const treasuryAddresses = vals\n .filter((_: any, i: number) => (i % appendIndex) + 1 === appendIndex)\n .map((customTreasury: string[]) => customTreasury[0])\n const treasuryBalanceCalls = treasuryAddresses.map((treasuryAddress: string, i: number) => ({\n address: bills?.[i]?.earnToken?.address?.[chainId as ChainId] ?? '',\n name: 'balanceOf',\n params: [treasuryAddress],\n }))\n const treasuryBalances = await multicall(chainId, ERC20ABI, treasuryBalanceCalls)\n const updatedVals = vals.reduce((acc: any, val: any, index: number) => {\n acc.push(val)\n if ((index + 1) % appendIndex === 0) {\n const pos = (index + 1) / appendIndex\n acc.push(treasuryBalances[pos - 1])\n }\n return acc\n }, [])\n\n //\n const chunkSize = updatedVals?.length / bills?.length\n const chunkedBills = chunk(updatedVals, chunkSize)\n\n return await cleanBillsData(billIds, chunkedBills, chainId, bills, tokenPrices, priceApiUrl)\n }\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getBondsData', e },\n })\n return []\n }\n}\n\nconst cleanBillsData = async (\n billIds: number[],\n chunkedBills: any[],\n chainId: ChainId,\n bills: BillsConfig[],\n tokenPrices?: TokenPrices[],\n priceApiUrl?: string,\n): Promise<BondsData[]> => {\n const data: BondsData[] = await Promise.all(\n chunkedBills?.map(async (chunk, index) => {\n const bill = bills?.find((bill) => bill?.index === billIds[index]) as BillsConfig\n\n let principalTokenPrice = tokenPrices?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() === bill?.lpToken?.address?.[bill?.chainId]?.toLowerCase() &&\n tokenPrice?.chainId === chainId,\n )\n\n if (principalTokenPrice === undefined || !!principalTokenPrice.error) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bill?.lpToken?.address?.[bill?.chainId]}&chain=${bill?.chainId}`,\n )\n console.log('Individual call for: ', bill.lpToken.symbol, '. Price: ', res.data.price)\n principalTokenPrice = res.data\n } catch {\n console.error('Failed to fetch price for: ', bill.lpToken.symbol)\n }\n }\n\n let payoutTokenPrice = tokenPrices?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() === bill?.earnToken?.address?.[bill?.chainId]?.toLowerCase() &&\n tokenPrice?.chainId === chainId,\n )\n\n if (payoutTokenPrice === undefined || !!payoutTokenPrice.error) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bill?.earnToken?.address?.[bill?.chainId]}&chain=${bill?.chainId}`,\n )\n console.log('Individual call for: ', bill.earnToken.symbol, '. Price: ', res.data.price)\n payoutTokenPrice = res.data\n } catch {\n console.error('Failed to fetch price for: ', bill.earnToken.symbol)\n }\n }\n const lpPrice = principalTokenPrice?.price ?? 0\n const earnTokenPrice = payoutTokenPrice?.price ?? 0\n\n const [\n trueBillPriceFromChunk,\n totalPayoutGiven,\n terms,\n maxTotalPayout,\n feeInPayoutRaw,\n feeInPrincipalRaw,\n paused,\n ,\n customTreasuryBalance,\n bondPricing,\n bondTerms,\n ] = chunk\n let trueBillPrice = trueBillPriceFromChunk\n\n const feeInPayout = Number(feeInPayoutRaw / 10000)\n const feeInPrincipal = Number(feeInPrincipalRaw / 10000)\n const tierBoostRate = bill.tierBoostRate === undefined ? 1 : bill.tierBoostRate\n const [, vestingTerm, , maxPayout] = terms\n const tokensRemaining = new BigNumber(maxTotalPayout ?? '0')\n .minus(new BigNumber(totalPayoutGiven))\n .div(new BigNumber(10).pow(bill?.earnToken.decimals[bill?.chainId] ?? 18))\n .toNumber()\n const treasuryBalance = getBalanceNumber(customTreasuryBalance, bill?.earnToken?.decimals?.[bill?.chainId] ?? 18)\n\n if (chainId === ChainId.SOL) {\n const principalDecimals = bill?.lpToken.decimals[ChainId.SOL] as number\n const payoutDecimals = bill?.earnToken.decimals[ChainId.SOL] as number\n const timeStamp = Math.floor(Date.now() / 1000)\n trueBillPrice = calculateTrueBondPrice(\n bondPricing,\n bondTerms,\n timeStamp,\n principalDecimals,\n payoutDecimals,\n feeInPrincipal,\n )\n }\n\n let trueBondPrices: TrueBondPrices[] = []\n if (bill?.billVersion === BillVersion.V4) {\n trueBondPrices = trueBillPrice[0].map((data: any) => {\n return {\n points: data?.points?.toString(),\n trueBondPrice: data?.trueBondPrice.toString(),\n discount: getRawDiscount(data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),\n bonus: getRawBonus(data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),\n discountWithFee: getDiscountWithFee(\n feeInPayout,\n tierBoostRate,\n data?.trueBondPrice.toString(),\n lpPrice,\n earnTokenPrice,\n ),\n bonusWithFee: getBonusWithFee(\n feeInPayout,\n tierBoostRate,\n data?.trueBondPrice.toString(),\n lpPrice,\n earnTokenPrice,\n ),\n boost: TIER_MAPPING[data?.points?.toString() as keyof typeof TIER_MAPPING],\n }\n })\n } else {\n const bonus = getRawBonus(trueBillPrice, lpPrice, earnTokenPrice)\n const bonusWithFee = getBonusWithFee(feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice)\n const discount = getRawDiscount(trueBillPrice, lpPrice, earnTokenPrice)\n const discountWithFee = getDiscountWithFee(feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice)\n trueBondPrices = [\n {\n points: '0',\n boost: 0,\n trueBondPrice: trueBillPrice.toString(),\n bonus,\n bonusWithFee,\n discount,\n discountWithFee,\n },\n ]\n }\n const cleanedData: BondsData = {\n ...bill,\n soldOut: paused[0] ? true : bill.soldOut,\n feeInPayout,\n feeInPrincipal,\n showcaseTokenName: bill?.showcaseToken?.symbol ?? bill?.earnToken.symbol ?? '',\n trueBondPrices,\n principalTokenPrice: lpPrice?.toString(),\n payoutTokenPrice: earnTokenPrice?.toString(),\n tokensRemaining: treasuryBalance\n ? Math.min(treasuryBalance, tokensRemaining).toString()\n : tokensRemaining.toString(),\n maxTotalPayout: maxTotalPayout?.toString(),\n maxPayout: maxPayout?.toString(),\n totalPayoutGiven: totalPayoutGiven?.toString(),\n vestingTerm: typeof vestingTerm === 'number' ? vestingTerm : parseInt(vestingTerm),\n tierBoostRate: bill.tierBoostRate === undefined ? 1 : bill.tierBoostRate,\n }\n return cleanedData\n }),\n )\n return data\n}\n\nexport const getBonusWithFee = (\n feeInPayout: number,\n tierBoostRate: number,\n trueBillPrice: string,\n lpPrice: number,\n earnTokenPrice: number,\n) => {\n const fee = feeInPayout ?? 0\n const reverseFee = new BigNumber(fee / 100 / (1 - fee / 100))\n const trueBondPrice = new BigNumber(trueBillPrice)\n .times((100 + tierBoostRate) / 100)\n .plus(new BigNumber(trueBillPrice).times(reverseFee))\n const priceUSDMinusFee = getBalanceNumber(trueBondPrice) * lpPrice\n const bonusWithoutFee = ((earnTokenPrice - priceUSDMinusFee) / earnTokenPrice) * 100\n const validatedBonus = bonusWithoutFee > 0 ? (bonusWithoutFee / (100 - bonusWithoutFee)) * 100 : 0\n return validatedBonus\n}\n\nconst getRawBonus = (trueBillPrice: any, lpPrice: number, earnTokenPrice: number) => {\n const priceUsd = getBalanceNumber(trueBillPrice.toString()) * lpPrice\n const discount: number = ((earnTokenPrice - priceUsd) / earnTokenPrice) * 100\n return discount > 0 ? (discount / (100 - discount)) * 100 : 0\n}\n\nconst getRawDiscount = (trueBillPrice: any, lpPrice: number, earnTokenPrice: number) => {\n const trueBondPrice = getBalanceNumber(trueBillPrice.toString())\n\n return ((earnTokenPrice - lpPrice * trueBondPrice) / earnTokenPrice) * 100\n}\n\nconst getDiscountWithFee = (\n feeInPayout: number,\n tierBoostRate: number,\n trueBillPrice: any,\n lpPrice: number,\n earnTokenPrice: number,\n) => {\n const trueBondPrice = getBalanceNumber(trueBillPrice.toString())\n const trueBondPriceWithFee = trueBondPrice * (1 / ((100 - (feeInPayout ?? 0)) / 100))\n const discount = ((earnTokenPrice - lpPrice * trueBondPriceWithFee) / earnTokenPrice) * 100\n const discountToReturn = 100 - ((100 - discount) / (100 - tierBoostRate)) * 100\n return discountToReturn\n}\n"],"names":["launchBondsABI_V2_4_1","BOND_2_4_0","ERC20ABI"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/state/bonds/utils.ts"],"sourcesContent":["import { BondsData, TrueBondPrices } from '../../types/bonds'\nimport { getBalanceNumber } from '../../utils/getBalanceNumber'\nimport { BillsConfig, BillVersion, ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport multicall from '../../utils/multicall'\nimport chunk from 'lodash-es/chunk.js'\nimport launchBondsABI_V2_4_1 from '../../config/abi/launchBond_v2_4_1.json'\nimport { SolanaCall, solanaMulticall } from '../../utils/solanaMulticall'\nimport { PublicKey } from '@solana/web3.js'\nimport { derivePda } from '../../utils/derivePda'\nimport { PROGRAM_ID } from '../../constants/solanaConstants'\nimport { BondIssuance, SolanaBondData, SolanaBondsResult } from '../../types/solanaBonds'\nimport BOND_2_4_0 from '../../config/abi/BOND_2_4_0.json'\nimport ERC20ABI from '../../config/abi/erc20.json'\nimport { reportError } from '../../utils/reportError'\nimport BigNumber from 'bignumber.js'\nimport { calculateTrueBondPrice } from '../../utils/calculateSolanaTrueBillPrice'\nimport axios from 'axios'\nimport { TIER_MAPPING } from '../tiers/useTierPoints'\n\nexport const fetchBondsDataPreTGE = async (\n chain: number,\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n preTGEBonds: PreTGEConfig[],\n apiUrl?: string,\n): Promise<BondsData[]> => {\n try {\n if (!preTGEBonds?.length) return []\n const data = []\n const chainId = chain as ChainId\n\n const preTGEBondsIds: number[] = []\n const launchBondsCalls = preTGEBonds.flatMap((bond) => {\n preTGEBondsIds.push(bond.index)\n const bill = bond\n return [\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'trueBillPrice',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'terms',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'totalPrincipalBilled',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'finalized',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'minPoints',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'maxPoints',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'startVestingTimestamp',\n },\n ]\n })\n const vals = await multicall(chainId, launchBondsABI_V2_4_1, launchBondsCalls)\n const chunkSize = vals.length / preTGEBonds.length\n const chunkedBills = chunk(vals, chunkSize)\n const returnedBills = chunkedBills?.map((chunk: any, index) => {\n const bondConfig = preTGEBonds?.find((bill) => bill?.index === preTGEBondsIds[index])!\n\n const [trueBillPrice, terms, totalPrincipalBilled, finalized, minPoints, maxPoints, startVestingTimestamp] = chunk\n const [, , vestingTerm, , , initialRelease, totalRaise, maxTotalPayout] = terms\n\n const initPrice = getBalanceNumber(\n trueBillPrice,\n bondConfig?.lpToken?.decimals?.[bondConfig?.chainId as ChainId] ?? 18,\n )\n\n const lpPrice =\n tokenPrices?.[bondConfig?.chainId]?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() ===\n bondConfig?.lpToken?.address?.[bondConfig?.chainId]?.toLowerCase(),\n )?.price ?? 0\n const earnTokenPrice =\n tokenPrices?.[bondConfig?.chainId]?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() ===\n bondConfig?.earnToken?.address?.[bondConfig?.chainId]?.toLowerCase(),\n )?.price ?? 0\n\n const principalTokenPrice = lpPrice?.toString() ?? '0'\n const payoutTokenPrice = earnTokenPrice ? earnTokenPrice?.toString() : initPrice?.toString()\n\n const bonus = Math.round((bondConfig.tgePrice! / initPrice) * 100 - 100)\n\n const data: BondsData = {\n ...bondConfig,\n initialRelease: initialRelease / 10000,\n vestingTerm: parseInt(vestingTerm),\n trueBondPrices: [\n {\n points: '0',\n boost: 0,\n trueBondPrice: trueBillPrice?.toString(),\n bonus,\n bonusWithFee: bonus, // placeholder, wont be used\n discount: bonus, // placeholder, wont be used\n discountWithFee: bonus, // placeholder, wont be used\n },\n ],\n maxTotalPayout: maxTotalPayout?.toString(),\n totalPrincipalBilled: totalPrincipalBilled?.toString(),\n payoutTokenPrice,\n principalTokenPrice,\n totalRaise: totalRaise?.toString(),\n finalized: finalized[0],\n minPoints: minPoints.toString(),\n maxPoints: maxPoints.toString(),\n startVestingTimestamp: startVestingTimestamp?.toString(),\n initTime: { [bondConfig.chainId]: parseInt(terms[1]) },\n finishTime: parseInt(terms[0]),\n initPrice,\n soldOut: finalized[0] || (parseInt(terms[0]) ?? 0) < Date.now() / 1000 || bondConfig.soldOut,\n }\n return data\n })\n data.push(returnedBills)\n return data.flat()\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getLaunchBondsPublicData', preTGEBonds, chain, e },\n })\n return []\n }\n}\n\nexport const fetchBondsData = async (\n chainId: number,\n bills: BillsConfig[],\n apiUrl: string,\n tokenPrices?: TokenPrices[],\n priceApiUrl?: string,\n) => {\n if (!tokenPrices) return []\n try {\n // Aptos & SUI have their own fetching functions, once we integrate them to the realtime api we might want to move those functions here,\n // but for now, we are good with this approach\n if (chainId === ChainId.APTOS_MAINNET) {\n return []\n }\n if (chainId === ChainId.SUI_MAINNET) {\n return []\n }\n if (chainId === ChainId.SOL) {\n const solanaCalls: SolanaCall[] = []\n const solanaBillIds: number[] = []\n for (const bill of bills) {\n const bondIssuanceAddress = bill.contractAddress[ChainId.SOL]\n if (!bondIssuanceAddress) continue\n\n solanaBillIds.push(bill.index)\n const bondIssuancePubkey = new PublicKey(bondIssuanceAddress)\n const bondTermPda = derivePda('bond_term', bondIssuancePubkey, PROGRAM_ID)\n const bondPricingPda = derivePda('bond_pricing', bondIssuancePubkey, PROGRAM_ID)\n solanaCalls.push(\n { accountAddress: bondIssuanceAddress, accountType: 'bondIssuance' },\n { accountAddress: bondTermPda.toBase58(), accountType: 'bondTerm' },\n { accountAddress: bondPricingPda.toBase58(), accountType: 'bondPricing' },\n )\n }\n // Fetch Solana bills\n const solanaResults = (await solanaMulticall(solanaCalls)) as SolanaBondsResult\n\n const solanaBills =\n solanaResults?.bondIssuance\n ?.map((bondIssuance: BondIssuance, index: number) => {\n const vestingTermDuration = Number(solanaResults.bondTerm[index]?.vestingEnd.toString())\n const bill = {\n ...bondIssuance,\n ...solanaResults.bondPricing[index],\n terms: solanaResults.bondTerm[index],\n } as SolanaBondData\n\n return [\n bill.trueBillPrice,\n bill.totalPayoutGiven,\n [bill.terms.controlVariable, vestingTermDuration, bill.terms.minimumDebt, bill.terms.maxPayout],\n bill.terms.maxTotalPayout,\n bill.feeInPayout.toString(),\n bill.feeInPrincipal.toString(),\n false,\n undefined,\n undefined,\n solanaResults.bondPricing[index],\n solanaResults.bondTerm[index],\n ] // Map to reflect evm structure\n })\n .filter((bill: any) => typeof bill !== 'undefined') ?? []\n const allBillsIds = []\n const allBillsData = []\n if (solanaBills.length > 0) {\n allBillsIds.push(...solanaBillIds)\n allBillsData.push(...solanaBills)\n }\n return await cleanBillsData(allBillsIds, allBillsData, chainId, bills, tokenPrices, priceApiUrl)\n } else {\n const billIds: number[] = []\n const billCalls = bills.flatMap((bill) => {\n billIds.push(bill.index)\n return [\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: bill.billVersion === BillVersion.V4 ? 'trueBondPrices' : 'trueBillPrice()',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'totalPayoutGiven',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'terms',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: bill.billVersion !== BillVersion.V1 ? 'getMaxTotalPayout' : 'maxTotalPayout',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'feeInPayout',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'feeInPrincipal',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'paused',\n },\n // keep custom treasury at the very last position\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'customTreasury',\n },\n ]\n })\n const vals = await multicall(chainId, BOND_2_4_0, billCalls)\n\n // The following lines basically grab the values from customTreasury returned from bills contract and then,\n // appends the treasury contract's balance to the chunk that will be passed to cleanBillsData\n\n // appendIndex value assumes customTreasury will be at the end of the billCalls array\n const appendIndex = billCalls.length / bills.length\n const treasuryAddresses = vals\n .filter((_: any, i: number) => (i % appendIndex) + 1 === appendIndex)\n .map((customTreasury: string[]) => customTreasury[0])\n const treasuryBalanceCalls = treasuryAddresses.map((treasuryAddress: string, i: number) => ({\n address: bills?.[i]?.earnToken?.address?.[chainId as ChainId] ?? '',\n name: 'balanceOf',\n params: [treasuryAddress],\n }))\n const treasuryBalances = await multicall(chainId, ERC20ABI, treasuryBalanceCalls)\n const updatedVals = vals.reduce((acc: any, val: any, index: number) => {\n acc.push(val)\n if ((index + 1) % appendIndex === 0) {\n const pos = (index + 1) / appendIndex\n acc.push(treasuryBalances[pos - 1])\n }\n return acc\n }, [])\n\n //\n const chunkSize = updatedVals?.length / bills?.length\n const chunkedBills = chunk(updatedVals, chunkSize)\n\n return await cleanBillsData(billIds, chunkedBills, chainId, bills, tokenPrices, priceApiUrl)\n }\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getBondsData', e },\n })\n return []\n }\n}\n\nconst cleanBillsData = async (\n billIds: number[],\n chunkedBills: any[],\n chainId: ChainId,\n bills: BillsConfig[],\n tokenPrices?: TokenPrices[],\n priceApiUrl?: string,\n): Promise<BondsData[]> => {\n const data: BondsData[] = await Promise.all(\n chunkedBills?.map(async (chunk, index) => {\n const bill = bills?.find((bill) => bill?.index === billIds[index]) as BillsConfig\n\n let principalTokenPrice = tokenPrices?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() === bill?.lpToken?.address?.[bill?.chainId]?.toLowerCase() &&\n tokenPrice?.chainId === chainId,\n )\n\n if (principalTokenPrice === undefined || !!principalTokenPrice.error) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bill?.lpToken?.address?.[bill?.chainId]}&chain=${bill?.chainId}`,\n )\n console.log('Individual call for: ', bill.lpToken.symbol, '. Price: ', res.data.price)\n principalTokenPrice = res.data\n } catch {\n console.error('Failed to fetch price for: ', bill.lpToken.symbol)\n }\n }\n\n let payoutTokenPrice = tokenPrices?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() === bill?.earnToken?.address?.[bill?.chainId]?.toLowerCase() &&\n tokenPrice?.chainId === chainId,\n )\n\n if (payoutTokenPrice === undefined || !!payoutTokenPrice.error) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bill?.earnToken?.address?.[bill?.chainId]}&chain=${bill?.chainId}`,\n )\n console.log('Individual call for: ', bill.earnToken.symbol, '. Price: ', res.data.price)\n payoutTokenPrice = res.data\n } catch {\n console.error('Failed to fetch price for: ', bill.earnToken.symbol)\n }\n }\n const lpPrice = principalTokenPrice?.price ?? 0\n const earnTokenPrice = payoutTokenPrice?.price ?? 0\n\n const [\n trueBillPriceFromChunk,\n totalPayoutGiven,\n terms,\n maxTotalPayout,\n feeInPayoutRaw,\n feeInPrincipalRaw,\n paused,\n ,\n customTreasuryBalance,\n bondPricing,\n bondTerms,\n ] = chunk\n let trueBillPrice = trueBillPriceFromChunk\n\n const feeInPayout = Number(feeInPayoutRaw / 10000)\n const feeInPrincipal = Number(feeInPrincipalRaw / 10000)\n const tierBoostRate = bill.tierBoostRate === undefined ? 1 : bill.tierBoostRate\n const [, vestingTerm, , maxPayout] = terms\n const tokensRemaining = new BigNumber(maxTotalPayout ?? '0')\n .minus(new BigNumber(totalPayoutGiven))\n .div(new BigNumber(10).pow(bill?.earnToken.decimals[bill?.chainId] ?? 18))\n .toNumber()\n const treasuryBalance = getBalanceNumber(customTreasuryBalance, bill?.earnToken?.decimals?.[bill?.chainId] ?? 18)\n\n if (chainId === ChainId.SOL) {\n const principalDecimals = bill?.lpToken.decimals[ChainId.SOL] as number\n const payoutDecimals = bill?.earnToken.decimals[ChainId.SOL] as number\n const timeStamp = Math.floor(Date.now() / 1000)\n trueBillPrice = calculateTrueBondPrice(\n bondPricing,\n bondTerms,\n timeStamp,\n principalDecimals,\n payoutDecimals,\n feeInPrincipal,\n )\n }\n\n let trueBondPrices: TrueBondPrices[] = []\n if (bill?.billVersion === BillVersion.V4) {\n trueBondPrices = trueBillPrice[0].map((data: any) => {\n return {\n points: data?.points?.toString(),\n trueBondPrice: data?.trueBondPrice.toString(),\n discount: getRawDiscount(data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),\n bonus: getRawBonus(data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),\n discountWithFee: getDiscountWithFee(\n feeInPayout,\n tierBoostRate,\n data?.trueBondPrice.toString(),\n lpPrice,\n earnTokenPrice,\n ),\n bonusWithFee: getBonusWithFee(\n feeInPayout,\n tierBoostRate,\n data?.trueBondPrice.toString(),\n lpPrice,\n earnTokenPrice,\n ),\n boost: TIER_MAPPING[data?.points?.toString() as keyof typeof TIER_MAPPING],\n }\n })\n } else {\n const bonus = getRawBonus(trueBillPrice, lpPrice, earnTokenPrice)\n const bonusWithFee = getBonusWithFee(feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice)\n const discount = getRawDiscount(trueBillPrice, lpPrice, earnTokenPrice)\n const discountWithFee = getDiscountWithFee(feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice)\n trueBondPrices = [\n {\n points: '0',\n boost: 0,\n trueBondPrice: trueBillPrice.toString(),\n bonus,\n bonusWithFee,\n discount,\n discountWithFee,\n },\n ]\n }\n const cleanedData: BondsData = {\n ...bill,\n soldOut: paused[0] ? true : bill.soldOut,\n feeInPayout,\n feeInPrincipal,\n showcaseTokenName: bill?.showcaseToken?.symbol ?? bill?.earnToken.symbol ?? '',\n trueBondPrices,\n principalTokenPrice: lpPrice?.toString(),\n payoutTokenPrice: earnTokenPrice?.toString(),\n tokensRemaining: treasuryBalance\n ? Math.min(treasuryBalance, tokensRemaining).toString()\n : tokensRemaining.toString(),\n maxTotalPayout: maxTotalPayout?.toString(),\n maxPayout: maxPayout?.toString(),\n totalPayoutGiven: totalPayoutGiven?.toString(),\n vestingTerm: typeof vestingTerm === 'number' ? vestingTerm : parseInt(vestingTerm),\n tierBoostRate: bill.tierBoostRate === undefined ? 1 : bill.tierBoostRate,\n }\n return cleanedData\n }),\n )\n return data\n}\n\nexport const getBonusWithFee = (\n feeInPayout: number,\n tierBoostRate: number,\n trueBillPrice: string,\n lpPrice: number,\n earnTokenPrice: number,\n) => {\n const fee = feeInPayout ?? 0\n const reverseFee = new BigNumber(fee / 100 / (1 - fee / 100))\n const trueBondPrice = new BigNumber(trueBillPrice)\n .times((100 + tierBoostRate) / 100)\n .plus(new BigNumber(trueBillPrice).times(reverseFee))\n const priceUSDMinusFee = getBalanceNumber(trueBondPrice) * lpPrice\n const bonusWithoutFee = ((earnTokenPrice - priceUSDMinusFee) / earnTokenPrice) * 100\n const validatedBonus = bonusWithoutFee > 0 ? (bonusWithoutFee / (100 - bonusWithoutFee)) * 100 : 0\n return validatedBonus\n}\n\nconst getRawBonus = (trueBillPrice: any, lpPrice: number, earnTokenPrice: number) => {\n const priceUsd = getBalanceNumber(trueBillPrice.toString()) * lpPrice\n const discount: number = ((earnTokenPrice - priceUsd) / earnTokenPrice) * 100\n return discount > 0 ? (discount / (100 - discount)) * 100 : 0\n}\n\nconst getRawDiscount = (trueBillPrice: any, lpPrice: number, earnTokenPrice: number) => {\n const trueBondPrice = getBalanceNumber(trueBillPrice.toString())\n\n return ((earnTokenPrice - lpPrice * trueBondPrice) / earnTokenPrice) * 100\n}\n\nconst getDiscountWithFee = (\n feeInPayout: number,\n tierBoostRate: number,\n trueBillPrice: any,\n lpPrice: number,\n earnTokenPrice: number,\n) => {\n const trueBondPrice = getBalanceNumber(trueBillPrice.toString())\n const trueBondPriceWithFee = trueBondPrice * (1 / ((100 - (feeInPayout ?? 0)) / 100))\n const discount = ((earnTokenPrice - lpPrice * trueBondPriceWithFee) / earnTokenPrice) * 100\n const discountToReturn = 100 - ((100 - discount) / (100 - tierBoostRate)) * 100\n return discountToReturn\n}\n"],"names":["launchBondsABI_V2_4_1","BOND_2_4_0","ERC20ABI"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
- import { WNATIVE } from '@ape.swap/apeswap-lists';
1
+ import '../../config/constants/tokens.js';
2
2
  import useTokenPrices from '../tokenPrices/useTokenPrices.js';
3
3
  import { useMemo } from 'react';
4
+ import { WNATIVE } from '@ape.swap/apeswap-lists';
4
5
 
5
6
  function useCurrencyPrice(currency, chainId) {
6
7
  const { data: tokenPrices } = useTokenPrices();
@@ -1 +1 @@
1
- {"version":3,"file":"useCurrencyPrice.js","sources":["../../../src/state/price/useCurrencyPrice.ts"],"sourcesContent":["import { ChainId } from '@ape.swap/apeswap-lists'\nimport { Token } from '@ape.swap/apeswap-lists'\nimport { WNATIVE } from '../../config/constants/tokens'\nimport useTokenPrices from '../tokenPrices/useTokenPrices'\nimport { useMemo } from 'react'\n\nexport default function useCurrencyPrice(\n currency: 'NATIVE' | Token | null | undefined,\n chainId: ChainId | null | undefined,\n) {\n const { data: tokenPrices } = useTokenPrices()\n const token = currency === 'NATIVE' && chainId ? WNATIVE[chainId] : (currency as Token | undefined)\n const tokenAddress = token?.address?.[chainId as ChainId]\n return useMemo(\n () => {\n if (!tokenAddress || !chainId) return undefined\n return tokenPrices?.[chainId]?.find(\n (tokenPrice) => tokenPrice?.tokenAddress?.toLowerCase() === tokenAddress?.toLowerCase(),\n )\n },\n /* eslint-disable react-hooks/exhaustive-deps */\n [Object.keys(tokenPrices ?? {}).length, tokenAddress, chainId],\n )\n}\n"],"names":[],"mappings":";;;;AAMc,SAAU,gBAAgB,CACtC,QAA6C,EAC7C,OAAmC,EAAA;IAEnC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE;AAC9C,IAAA,MAAM,KAAK,GAAG,QAAQ,KAAK,QAAQ,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAI,QAA8B;IACnG,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,GAAG,OAAkB,CAAC;IACzD,OAAO,OAAO,CACZ,MAAK;AACH,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,SAAS;QAC/C,OAAO,WAAW,GAAG,OAAO,CAAC,EAAE,IAAI,CACjC,CAAC,UAAU,KAAK,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,WAAW,EAAE,CACxF;IACH,CAAC;;AAED,IAAA,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAC/D;AACH;;;;"}
1
+ {"version":3,"file":"useCurrencyPrice.js","sources":["../../../src/state/price/useCurrencyPrice.ts"],"sourcesContent":["import { ChainId } from '@ape.swap/apeswap-lists'\nimport { Token } from '@ape.swap/apeswap-lists'\nimport { WNATIVE } from '../../config/constants/tokens'\nimport useTokenPrices from '../tokenPrices/useTokenPrices'\nimport { useMemo } from 'react'\n\nexport default function useCurrencyPrice(\n currency: 'NATIVE' | Token | null | undefined,\n chainId: ChainId | null | undefined,\n) {\n const { data: tokenPrices } = useTokenPrices()\n const token = currency === 'NATIVE' && chainId ? WNATIVE[chainId] : (currency as Token | undefined)\n const tokenAddress = token?.address?.[chainId as ChainId]\n return useMemo(\n () => {\n if (!tokenAddress || !chainId) return undefined\n return tokenPrices?.[chainId]?.find(\n (tokenPrice) => tokenPrice?.tokenAddress?.toLowerCase() === tokenAddress?.toLowerCase(),\n )\n },\n /* eslint-disable react-hooks/exhaustive-deps */\n [Object.keys(tokenPrices ?? {}).length, tokenAddress, chainId],\n )\n}\n"],"names":[],"mappings":";;;;;AAMc,SAAU,gBAAgB,CACtC,QAA6C,EAC7C,OAAmC,EAAA;IAEnC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE;AAC9C,IAAA,MAAM,KAAK,GAAG,QAAQ,KAAK,QAAQ,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAI,QAA8B;IACnG,MAAM,YAAY,GAAG,KAAK,EAAE,OAAO,GAAG,OAAkB,CAAC;IACzD,OAAO,OAAO,CACZ,MAAK;AACH,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,SAAS;QAC/C,OAAO,WAAW,GAAG,OAAO,CAAC,EAAE,IAAI,CACjC,CAAC,UAAU,KAAK,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,WAAW,EAAE,CACxF;IACH,CAAC;;AAED,IAAA,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,CAC/D;AACH;;;;"}
@@ -97,10 +97,7 @@ const fetchUserPoints = async (account, useTiers, apiUrl) => {
97
97
  const onChainPoints = new BigNumber(res[0][0].toString()).times(2);
98
98
  const promotionsData = await fetch(`${apiUrl}/tier-promotion?user=${account}`)
99
99
  .then((res) => res.json())
100
- .then((data) => {
101
- console.log(data);
102
- return data;
103
- })
100
+ .then((data) => data)
104
101
  .catch((err) => {
105
102
  console.error('Error fetching promotions:', err);
106
103
  return {};