@ape.swap/bonds-sdk 6.0.6 → 6.0.7

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 (62) hide show
  1. package/dist/config/constants/variables.d.ts +1 -0
  2. package/dist/config/constants/variables.js +2 -1
  3. package/dist/config/constants/variables.js.map +1 -1
  4. package/dist/state/bonds/fetchBondsData/cleanBillsData.d.ts +4 -0
  5. package/dist/state/bonds/fetchBondsData/cleanBillsData.js +139 -0
  6. package/dist/state/bonds/fetchBondsData/cleanBillsData.js.map +1 -0
  7. package/dist/state/bonds/{fetchBondsDataAptos.d.ts → fetchBondsData/fetchBondsDataAptos.d.ts} +3 -3
  8. package/dist/state/bonds/{fetchBondsDataAptos.js → fetchBondsData/fetchBondsDataAptos.js} +6 -5
  9. package/dist/state/bonds/fetchBondsData/fetchBondsDataAptos.js.map +1 -0
  10. package/dist/state/bonds/fetchBondsData/fetchBondsDataEVM.d.ts +3 -0
  11. package/dist/state/bonds/fetchBondsData/fetchBondsDataEVM.js +90 -0
  12. package/dist/state/bonds/fetchBondsData/fetchBondsDataEVM.js.map +1 -0
  13. package/dist/state/bonds/fetchBondsData/fetchBondsDataPreTGE.d.ts +4 -0
  14. package/dist/state/bonds/fetchBondsData/fetchBondsDataPreTGE.js +109 -0
  15. package/dist/state/bonds/fetchBondsData/fetchBondsDataPreTGE.js.map +1 -0
  16. package/dist/state/bonds/fetchBondsData/fetchBondsDataSOL.d.ts +3 -0
  17. package/dist/state/bonds/fetchBondsData/fetchBondsDataSOL.js +69 -0
  18. package/dist/state/bonds/fetchBondsData/fetchBondsDataSOL.js.map +1 -0
  19. package/dist/state/bonds/{fetchBondsDataSui.d.ts → fetchBondsData/fetchBondsDataSui.d.ts} +3 -3
  20. package/dist/state/bonds/{fetchBondsDataSui.js → fetchBondsData/fetchBondsDataSui.js} +3 -3
  21. package/dist/state/bonds/fetchBondsData/fetchBondsDataSui.js.map +1 -0
  22. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsAptos.d.ts +4 -0
  23. package/dist/state/bonds/{fetchBillsUserAptos.js → fetchUsersBonds/fetchUsersBondsAptos.js} +10 -9
  24. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsAptos.js.map +1 -0
  25. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsEVM.d.ts +5 -0
  26. package/dist/state/bonds/{fetchBillsUser.js → fetchUsersBonds/fetchUsersBondsEVM.js} +5 -5
  27. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsEVM.js.map +1 -0
  28. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSOL.d.ts +4 -0
  29. package/dist/state/bonds/{fetchBillsUserSolana.js → fetchUsersBonds/fetchUsersBondsSOL.js} +9 -8
  30. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSOL.js.map +1 -0
  31. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSUI.d.ts +4 -0
  32. package/dist/state/bonds/{fetchBillsUserSui.js → fetchUsersBonds/fetchUsersBondsSUI.js} +10 -9
  33. package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSUI.js.map +1 -0
  34. package/dist/state/bonds/useBondsData.js +20 -15
  35. package/dist/state/bonds/useBondsData.js.map +1 -1
  36. package/dist/state/bonds/useUserBonds.js +20 -21
  37. package/dist/state/bonds/useUserBonds.js.map +1 -1
  38. package/dist/state/tokenPrices/useTokenPrices.d.ts +1 -1
  39. package/dist/state/tokenPrices/useTokenPrices.js +4 -4
  40. package/dist/state/tokenPrices/useTokenPrices.js.map +1 -1
  41. package/dist/state/useSDKConfig.d.ts +1 -1
  42. package/dist/state/useSDKConfig.js +0 -2
  43. package/dist/state/useSDKConfig.js.map +1 -1
  44. package/dist/styles.css +1 -0
  45. package/dist/views/YourBonds/components/YourBondsMenu/YourBondsMenu.js +1 -1
  46. package/dist/views/YourBonds/components/YourBondsMenu/YourBondsMenu.js.map +1 -1
  47. package/package.json +1 -1
  48. package/dist/state/bonds/discoverSuiBonds.d.ts +0 -6
  49. package/dist/state/bonds/fetchBillsUser.d.ts +0 -5
  50. package/dist/state/bonds/fetchBillsUser.js.map +0 -1
  51. package/dist/state/bonds/fetchBillsUserAptos.d.ts +0 -4
  52. package/dist/state/bonds/fetchBillsUserAptos.js.map +0 -1
  53. package/dist/state/bonds/fetchBillsUserSolana.d.ts +0 -4
  54. package/dist/state/bonds/fetchBillsUserSolana.js.map +0 -1
  55. package/dist/state/bonds/fetchBillsUserSui.d.ts +0 -4
  56. package/dist/state/bonds/fetchBillsUserSui.js.map +0 -1
  57. package/dist/state/bonds/fetchBondsDataAptos.js.map +0 -1
  58. package/dist/state/bonds/fetchBondsDataSui.js.map +0 -1
  59. package/dist/state/bonds/utils.d.ts +0 -6
  60. package/dist/state/bonds/utils.js +0 -384
  61. package/dist/state/bonds/utils.js.map +0 -1
  62. /package/dist/state/bonds/{getBillNftData.d.ts → fetchUsersBonds/getBillNftData.d.ts} +0 -0
@@ -5,5 +5,6 @@ export declare const zapSupported: readonly [ChainId.MAINNET, ChainId.MATIC, Cha
5
5
  export type ZapSupportedChainId = (typeof zapSupported)[number];
6
6
  export declare const STRAPI_URL = "https://strapi-api.ape.bond";
7
7
  export declare const SOUL_ZAP_API = "https://zap-api.ape.bond/zap";
8
+ export declare const PRICE_API_URL = "https://price-api.ape.bond";
8
9
  export declare const APEBOND = "https://ape.bond";
9
10
  export declare const tierOptimizerUIEnabled = true;
@@ -37,8 +37,9 @@ const zapSupported = [
37
37
  ];
38
38
  const STRAPI_URL = `https://strapi-api.ape.bond`;
39
39
  const SOUL_ZAP_API = `https://zap-api.ape.bond/zap`;
40
+ const PRICE_API_URL = `https://price-api.ape.bond`;
40
41
  const APEBOND = `https://ape.bond`;
41
42
  const tierOptimizerUIEnabled = true;
42
43
 
43
- export { APEBOND, LifiSupported, SOUL_ZAP_API, STRAPI_URL, tierOptimizerUIEnabled, zapSupported };
44
+ export { APEBOND, LifiSupported, PRICE_API_URL, SOUL_ZAP_API, STRAPI_URL, tierOptimizerUIEnabled, zapSupported };
44
45
  //# sourceMappingURL=variables.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"variables.js","sources":["../../../src/config/constants/variables.ts"],"sourcesContent":["import { ChainId } from '@ape.swap/apeswap-lists'\n\nexport const LifiSupported = [\n ChainId.BASE,\n ChainId.MAINNET,\n ChainId.MATIC,\n ChainId.BSC,\n ChainId.ARBITRUM,\n ChainId.LINEA,\n ChainId.AVAX,\n ChainId.BLAST,\n ChainId.SONIC,\n ChainId.BERACHAIN,\n ChainId.UNICHAIN,\n ChainId.MONAD,\n ChainId.KATANA,\n ChainId.SOL,\n ChainId.HYPEREVM,\n]\n\nexport const zapSupported = [\n ChainId.MAINNET,\n ChainId.MATIC,\n ChainId.BSC,\n ChainId.ARBITRUM,\n ChainId.LINEA,\n ChainId.BASE,\n ChainId.AVAX,\n ChainId.BLAST,\n ChainId.SONIC,\n ChainId.BERACHAIN,\n // ChainId.UNICHAIN, not working atm\n ChainId.KATANA,\n ChainId.SOL,\n ChainId.HYPEREVM,\n ChainId.APTOS,\n ChainId.SUI,\n] as const\n\n/** Union of all chain IDs where zap is supported. Derived from `zapSupported`. */\nexport type ZapSupportedChainId = (typeof zapSupported)[number]\n\nexport const STRAPI_URL = `https://strapi-api.ape.bond`\nexport const SOUL_ZAP_API = `https://zap-api.ape.bond/zap`\nexport const APEBOND = `https://ape.bond`\n\nexport const tierOptimizerUIEnabled = true\n"],"names":[],"mappings":";;AAEO,MAAM,aAAa,GAAG;AAC3B,IAAA,OAAO,CAAC,IAAI;AACZ,IAAA,OAAO,CAAC,OAAO;AACf,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,GAAG;AACX,IAAA,OAAO,CAAC,QAAQ;AAChB,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,IAAI;AACZ,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,SAAS;AACjB,IAAA,OAAO,CAAC,QAAQ;AAChB,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,MAAM;AACd,IAAA,OAAO,CAAC,GAAG;AACX,IAAA,OAAO,CAAC,QAAQ;;AAGX,MAAM,YAAY,GAAG;AAC1B,IAAA,OAAO,CAAC,OAAO;AACf,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,GAAG;AACX,IAAA,OAAO,CAAC,QAAQ;AAChB,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,IAAI;AACZ,IAAA,OAAO,CAAC,IAAI;AACZ,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,SAAS;;AAEjB,IAAA,OAAO,CAAC,MAAM;AACd,IAAA,OAAO,CAAC,GAAG;AACX,IAAA,OAAO,CAAC,QAAQ;AAChB,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,GAAG;;AAMN,MAAM,UAAU,GAAG;AACnB,MAAM,YAAY,GAAG;AACrB,MAAM,OAAO,GAAG;AAEhB,MAAM,sBAAsB,GAAG;;;;"}
1
+ {"version":3,"file":"variables.js","sources":["../../../src/config/constants/variables.ts"],"sourcesContent":["import { ChainId } from '@ape.swap/apeswap-lists'\n\nexport const LifiSupported = [\n ChainId.BASE,\n ChainId.MAINNET,\n ChainId.MATIC,\n ChainId.BSC,\n ChainId.ARBITRUM,\n ChainId.LINEA,\n ChainId.AVAX,\n ChainId.BLAST,\n ChainId.SONIC,\n ChainId.BERACHAIN,\n ChainId.UNICHAIN,\n ChainId.MONAD,\n ChainId.KATANA,\n ChainId.SOL,\n ChainId.HYPEREVM,\n]\n\nexport const zapSupported = [\n ChainId.MAINNET,\n ChainId.MATIC,\n ChainId.BSC,\n ChainId.ARBITRUM,\n ChainId.LINEA,\n ChainId.BASE,\n ChainId.AVAX,\n ChainId.BLAST,\n ChainId.SONIC,\n ChainId.BERACHAIN,\n // ChainId.UNICHAIN, not working atm\n ChainId.KATANA,\n ChainId.SOL,\n ChainId.HYPEREVM,\n ChainId.APTOS,\n ChainId.SUI,\n] as const\n\n/** Union of all chain IDs where zap is supported. Derived from `zapSupported`. */\nexport type ZapSupportedChainId = (typeof zapSupported)[number]\n\nexport const STRAPI_URL = `https://strapi-api.ape.bond`\nexport const SOUL_ZAP_API = `https://zap-api.ape.bond/zap`\nexport const PRICE_API_URL = `https://price-api.ape.bond`\nexport const APEBOND = `https://ape.bond`\n\nexport const tierOptimizerUIEnabled = true\n"],"names":[],"mappings":";;AAEO,MAAM,aAAa,GAAG;AAC3B,IAAA,OAAO,CAAC,IAAI;AACZ,IAAA,OAAO,CAAC,OAAO;AACf,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,GAAG;AACX,IAAA,OAAO,CAAC,QAAQ;AAChB,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,IAAI;AACZ,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,SAAS;AACjB,IAAA,OAAO,CAAC,QAAQ;AAChB,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,MAAM;AACd,IAAA,OAAO,CAAC,GAAG;AACX,IAAA,OAAO,CAAC,QAAQ;;AAGX,MAAM,YAAY,GAAG;AAC1B,IAAA,OAAO,CAAC,OAAO;AACf,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,GAAG;AACX,IAAA,OAAO,CAAC,QAAQ;AAChB,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,IAAI;AACZ,IAAA,OAAO,CAAC,IAAI;AACZ,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,SAAS;;AAEjB,IAAA,OAAO,CAAC,MAAM;AACd,IAAA,OAAO,CAAC,GAAG;AACX,IAAA,OAAO,CAAC,QAAQ;AAChB,IAAA,OAAO,CAAC,KAAK;AACb,IAAA,OAAO,CAAC,GAAG;;AAMN,MAAM,UAAU,GAAG;AACnB,MAAM,YAAY,GAAG;AACrB,MAAM,aAAa,GAAG;AACtB,MAAM,OAAO,GAAG;AAEhB,MAAM,sBAAsB,GAAG;;;;"}
@@ -0,0 +1,4 @@
1
+ import { BillsConfig, ChainId } from '@ape.swap/apeswap-lists';
2
+ import { TokenPrices } from '../../tokenPrices/useTokenPrices';
3
+ import { BondsData } from '../../../types/bonds';
4
+ export declare const cleanBillsData: (billIds: number[], chunkedBills: any[], chainId: ChainId, bills: BillsConfig[], tokenPrices?: TokenPrices[]) => Promise<BondsData[]>;
@@ -0,0 +1,139 @@
1
+ import { ChainId, BillVersion } from '@ape.swap/apeswap-lists';
2
+ import axios from 'axios';
3
+ import { getBalanceNumber } from '../../../utils/getBalanceNumber.js';
4
+ import { calculateTrueBondPrice } from '../../../utils/calculateSolanaTrueBillPrice.js';
5
+ import { TIER_MAPPING } from '../../tiers/useTierPoints.js';
6
+ import BigNumber from 'bignumber.js';
7
+ import { PRICE_API_URL } from '../../../config/constants/variables.js';
8
+
9
+ const cleanBillsData = async (billIds, chunkedBills, chainId, bills, tokenPrices) => {
10
+ const data = await Promise.all(chunkedBills?.map(async (chunk, index) => {
11
+ const bill = bills?.find((bill) => bill?.index === billIds[index]);
12
+ let principalTokenPrice = tokenPrices?.find((tokenPrice) => tokenPrice?.tokenAddress?.toLowerCase() === bill?.lpToken?.address?.[bill?.chainId]?.toLowerCase() &&
13
+ tokenPrice?.chainId === chainId);
14
+ if (principalTokenPrice === undefined || !!principalTokenPrice.error) {
15
+ try {
16
+ // Missing token price, therefor make a single call to api to fetch it
17
+ const res = await axios.get(`${PRICE_API_URL}/realtime/price?token=${bill?.lpToken?.address?.[bill?.chainId]}&chain=${bill?.chainId}`);
18
+ console.log('Individual call for: ', bill.lpToken.symbol, '. Price: ', res.data.price);
19
+ principalTokenPrice = res.data;
20
+ }
21
+ catch {
22
+ console.error('Failed to fetch price for: ', bill.lpToken.symbol);
23
+ }
24
+ }
25
+ let payoutTokenPrice = tokenPrices?.find((tokenPrice) => tokenPrice?.tokenAddress?.toLowerCase() === bill?.earnToken?.address?.[bill?.chainId]?.toLowerCase() &&
26
+ tokenPrice?.chainId === chainId);
27
+ if (payoutTokenPrice === undefined || !!payoutTokenPrice.error) {
28
+ try {
29
+ // Missing token price, therefor make a single call to api to fetch it
30
+ const res = await axios.get(`${PRICE_API_URL}/realtime/price?token=${bill?.earnToken?.address?.[bill?.chainId]}&chain=${bill?.chainId}`);
31
+ console.log('Individual call for: ', bill.earnToken.symbol, '. Price: ', res.data.price);
32
+ payoutTokenPrice = res.data;
33
+ }
34
+ catch {
35
+ console.error('Failed to fetch price for: ', bill.earnToken.symbol);
36
+ }
37
+ }
38
+ const lpPrice = principalTokenPrice?.price ?? 0;
39
+ const earnTokenPrice = payoutTokenPrice?.price ?? 0;
40
+ const [trueBillPriceFromChunk, totalPayoutGiven, terms, maxTotalPayout, feeInPayoutRaw, feeInPrincipalRaw, paused, , customTreasuryBalance, bondPricing, bondTerms,] = chunk;
41
+ let trueBillPrice = trueBillPriceFromChunk;
42
+ const feeInPayout = Number(feeInPayoutRaw / 10000);
43
+ const feeInPrincipal = Number(feeInPrincipalRaw / 10000);
44
+ const tierBoostRate = bill.tierBoostRate === undefined ? 1 : bill.tierBoostRate;
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);
51
+ if (chainId === ChainId.SOL) {
52
+ const principalDecimals = bill?.lpToken.decimals[ChainId.SOL];
53
+ const payoutDecimals = bill?.earnToken.decimals[ChainId.SOL];
54
+ const timeStamp = Math.floor(Date.now() / 1000);
55
+ trueBillPrice = calculateTrueBondPrice(bondPricing, bondTerms, timeStamp, principalDecimals, payoutDecimals, feeInPrincipal);
56
+ }
57
+ let trueBondPrices = [];
58
+ if (bill?.billVersion === BillVersion.V4) {
59
+ trueBondPrices = trueBillPrice[0].map((data) => {
60
+ return {
61
+ points: data?.points?.toString(),
62
+ trueBondPrice: data?.trueBondPrice.toString(),
63
+ discount: getRawDiscount(data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),
64
+ bonus: getRawBonus(data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),
65
+ discountWithFee: getDiscountWithFee(feeInPayout, tierBoostRate, data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),
66
+ bonusWithFee: getBonusWithFee(feeInPayout, tierBoostRate, data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),
67
+ boost: TIER_MAPPING[data?.points?.toString()],
68
+ };
69
+ });
70
+ }
71
+ else {
72
+ const bonus = getRawBonus(trueBillPrice, lpPrice, earnTokenPrice);
73
+ const bonusWithFee = getBonusWithFee(feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice);
74
+ const discount = getRawDiscount(trueBillPrice, lpPrice, earnTokenPrice);
75
+ const discountWithFee = getDiscountWithFee(feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice);
76
+ trueBondPrices = [
77
+ {
78
+ points: '0',
79
+ boost: 0,
80
+ trueBondPrice: trueBillPrice.toString(),
81
+ bonus,
82
+ bonusWithFee,
83
+ discount,
84
+ discountWithFee,
85
+ },
86
+ ];
87
+ }
88
+ const cleanedData = {
89
+ ...bill,
90
+ soldOut: paused[0] ? true : bill.soldOut,
91
+ feeInPayout,
92
+ feeInPrincipal,
93
+ showcaseTokenName: bill?.showcaseToken?.symbol ?? bill?.earnToken.symbol ?? '',
94
+ trueBondPrices,
95
+ principalTokenPrice: lpPrice?.toString(),
96
+ payoutTokenPrice: earnTokenPrice?.toString(),
97
+ tokensRemaining: treasuryBalance
98
+ ? Math.min(treasuryBalance, tokensRemaining).toString()
99
+ : tokensRemaining.toString(),
100
+ maxTotalPayout: maxTotalPayout?.toString(),
101
+ maxPayout: maxPayout?.toString(),
102
+ totalPayoutGiven: totalPayoutGiven?.toString(),
103
+ vestingTerm: typeof vestingTerm === 'number' ? vestingTerm : parseInt(vestingTerm),
104
+ tierBoostRate: bill.tierBoostRate === undefined ? 1 : bill.tierBoostRate,
105
+ };
106
+ return cleanedData;
107
+ }));
108
+ return data;
109
+ };
110
+ const getBonusWithFee = (feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice) => {
111
+ 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));
116
+ const priceUSDMinusFee = getBalanceNumber(trueBondPrice) * lpPrice;
117
+ const bonusWithoutFee = ((earnTokenPrice - priceUSDMinusFee) / earnTokenPrice) * 100;
118
+ const validatedBonus = bonusWithoutFee > 0 ? (bonusWithoutFee / (100 - bonusWithoutFee)) * 100 : 0;
119
+ return validatedBonus;
120
+ };
121
+ const getRawBonus = (trueBillPrice, lpPrice, earnTokenPrice) => {
122
+ const priceUsd = getBalanceNumber(trueBillPrice.toString()) * lpPrice;
123
+ const discount = ((earnTokenPrice - priceUsd) / earnTokenPrice) * 100;
124
+ return discount > 0 ? (discount / (100 - discount)) * 100 : 0;
125
+ };
126
+ const getRawDiscount = (trueBillPrice, lpPrice, earnTokenPrice) => {
127
+ const trueBondPrice = getBalanceNumber(trueBillPrice.toString());
128
+ return ((earnTokenPrice - lpPrice * trueBondPrice) / earnTokenPrice) * 100;
129
+ };
130
+ const getDiscountWithFee = (feeInPayout, tierBoostRate, trueBillPrice, lpPrice, earnTokenPrice) => {
131
+ const trueBondPrice = getBalanceNumber(trueBillPrice.toString());
132
+ const trueBondPriceWithFee = trueBondPrice * (1 / ((100 - (feeInPayout ?? 0)) / 100));
133
+ const discount = ((earnTokenPrice - lpPrice * trueBondPriceWithFee) / earnTokenPrice) * 100;
134
+ const discountToReturn = 100 - ((100 - discount) / (100 - tierBoostRate)) * 100;
135
+ return discountToReturn;
136
+ };
137
+
138
+ export { cleanBillsData };
139
+ //# sourceMappingURL=cleanBillsData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanBillsData.js","sources":["../../../../src/state/bonds/fetchBondsData/cleanBillsData.ts"],"sourcesContent":["import { BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { BondsData, TrueBondPrices } from '../../../types/bonds'\nimport axios from 'axios'\nimport { getBalanceNumber } from '../../../utils/getBalanceNumber'\nimport { calculateTrueBondPrice } from '../../../utils/calculateSolanaTrueBillPrice'\nimport { TIER_MAPPING } from '../../tiers/useTierPoints'\nimport BigNumber from 'bignumber.js'\nimport { PRICE_API_URL } from '../../../config/constants/variables'\n\nexport const cleanBillsData = async (\n billIds: number[],\n chunkedBills: any[],\n chainId: ChainId,\n bills: BillsConfig[],\n tokenPrices?: TokenPrices[],\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 `${PRICE_API_URL}/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 `${PRICE_API_URL}/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\nconst 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":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { BillsConfig } from '@ape.swap/apeswap-lists';
2
- import { BondsData } from '../../types/bonds';
3
- import { TokenPrices } from '../tokenPrices/useTokenPrices';
2
+ import { BondsData } from '../../../types/bonds';
3
+ import { TokenPrices } from '../../tokenPrices/useTokenPrices';
4
4
  /**
5
5
  * Enrich Aptos bond configs into full BondsData objects.
6
6
  *
@@ -9,4 +9,4 @@ import { TokenPrices } from '../tokenPrices/useTokenPrices';
9
9
  * scaled by PRICE_DECIMALS = 1e8; the SDK stores `trueBondPrice` scaled by
10
10
  * 1e18 (legacy EVM format) → multiply by 1e10.
11
11
  */
12
- export declare const enrichAptosBonds: (aptosConfigs?: BillsConfig[], aptosPrices?: TokenPrices[], priceApiUrl?: string) => Promise<BondsData[]>;
12
+ export declare const fetchBondsDataAptos: (aptosConfigs?: BillsConfig[], aptosPrices?: TokenPrices[]) => Promise<BondsData[]>;
@@ -1,7 +1,8 @@
1
1
  import BigNumber from 'bignumber.js';
2
2
  import { ChainId } from '@ape.swap/apeswap-lists';
3
- import { readAptosMarketInfo } from '../../utils/aptosHelpers.js';
3
+ import { readAptosMarketInfo } from '../../../utils/aptosHelpers.js';
4
4
  import axios from 'axios';
5
+ import { PRICE_API_URL } from '../../../config/constants/variables.js';
5
6
 
6
7
  // =============================================================================
7
8
  // Aptos bond enrichment — builds BondsData[] from BillsConfig[] + prices
@@ -19,7 +20,7 @@ const APTOS_KEY = ChainId.APTOS;
19
20
  * scaled by PRICE_DECIMALS = 1e8; the SDK stores `trueBondPrice` scaled by
20
21
  * 1e18 (legacy EVM format) → multiply by 1e10.
21
22
  */
22
- const enrichAptosBonds = async (aptosConfigs, aptosPrices, priceApiUrl) => {
23
+ const fetchBondsDataAptos = async (aptosConfigs, aptosPrices) => {
23
24
  if (!aptosConfigs || aptosConfigs?.length === 0)
24
25
  return [];
25
26
  const enriched = await Promise.all(aptosConfigs.map(async (bond) => {
@@ -31,7 +32,7 @@ const enrichAptosBonds = async (aptosConfigs, aptosPrices, priceApiUrl) => {
31
32
  let principalPrice = aptosPrices?.find((t) => t.tokenAddress.toLowerCase() === principalAddr)?.price;
32
33
  if (principalPrice === undefined) {
33
34
  try {
34
- const res = await axios.get(`${priceApiUrl}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`);
35
+ const res = await axios.get(`${PRICE_API_URL}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`);
35
36
  principalPrice = res.data.price ?? 0;
36
37
  }
37
38
  catch {
@@ -42,7 +43,7 @@ const enrichAptosBonds = async (aptosConfigs, aptosPrices, priceApiUrl) => {
42
43
  if (payoutPrice === undefined) {
43
44
  try {
44
45
  // Missing token price, therefor make a single call to api to fetch it
45
- const res = await axios.get(`${priceApiUrl}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`);
46
+ const res = await axios.get(`${PRICE_API_URL}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`);
46
47
  payoutPrice = res.data.price ?? 0;
47
48
  }
48
49
  catch {
@@ -106,5 +107,5 @@ const enrichAptosBonds = async (aptosConfigs, aptosPrices, priceApiUrl) => {
106
107
  return enriched.filter((b) => b !== null);
107
108
  };
108
109
 
109
- export { enrichAptosBonds };
110
+ export { fetchBondsDataAptos };
110
111
  //# sourceMappingURL=fetchBondsDataAptos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchBondsDataAptos.js","sources":["../../../../src/state/bonds/fetchBondsData/fetchBondsDataAptos.ts"],"sourcesContent":["// =============================================================================\n// Aptos bond enrichment — builds BondsData[] from BillsConfig[] + prices\n// =============================================================================\n//\n// On-chain first: reads bond::market_info via view function for each config\n// and projects the tuple onto BondsData. No backend dependency (realtime-api\n// does not support Aptos).\n\nimport BigNumber from 'bignumber.js'\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { BondsData } from '../../../types/bonds'\nimport { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { readAptosMarketInfo } from '../../../utils/aptosHelpers'\nimport axios from 'axios'\nimport { PRICE_API_URL } from '../../../config/constants/variables'\n\nconst APTOS_KEY = ChainId.APTOS\n\n/**\n * Enrich Aptos bond configs into full BondsData objects.\n *\n * Calls `bond::market_info(market)` for each config and projects the tuple\n * onto BondsData. Scale conversion: contract returns `true_bill_price` as u64\n * scaled by PRICE_DECIMALS = 1e8; the SDK stores `trueBondPrice` scaled by\n * 1e18 (legacy EVM format) → multiply by 1e10.\n */\nexport const fetchBondsDataAptos = async (\n aptosConfigs?: BillsConfig[],\n aptosPrices?: TokenPrices[],\n): Promise<BondsData[]> => {\n if (!aptosConfigs || aptosConfigs?.length === 0) return []\n\n const enriched = await Promise.all(\n aptosConfigs.map(async (bond): Promise<BondsData | null> => {\n const marketAddr = bond.contractAddress[APTOS_KEY]\n if (!marketAddr) return null\n try {\n // Firstly we fetch prices\n let principalPrice = aptosPrices?.find((t) => t.tokenAddress.toLowerCase() === principalAddr)?.price!\n if (principalPrice === undefined) {\n try {\n const res = await axios.get(\n `${PRICE_API_URL}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n principalPrice = res.data.price ?? 0\n } catch {\n principalPrice = 0\n }\n }\n\n let payoutPrice = aptosPrices?.find((t) => t.tokenAddress.toLowerCase() === payoutAddr)?.price!\n if (payoutPrice === undefined) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${PRICE_API_URL}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n payoutPrice = res.data.price ?? 0\n } catch {\n payoutPrice = 0\n }\n }\n\n const info = await readAptosMarketInfo(marketAddr)\n const principalAddr = bond.lpToken.address[APTOS_KEY]?.toLowerCase()\n const payoutAddr = bond.earnToken.address[APTOS_KEY]?.toLowerCase()\n\n // Convert on-chain u64 (scaled 1e8) to the SDK's legacy 1e18 scale\n const trueBillPriceU64 = info[17]\n const trueBondPriceScaled = (BigInt(trueBillPriceU64) * 10n ** 10n).toString()\n const trueBondPriceHuman = Number(trueBillPriceU64) / 1e8\n\n // Same formula as getRawDiscount / getRawBonus in state/bonds/utils.ts\n const discount = payoutPrice > 0 ? ((payoutPrice - principalPrice * trueBondPriceHuman) / payoutPrice) * 100 : 0\n const bonus = discount > 0 && discount < 100 ? (discount / (100 - discount)) * 100 : 0\n\n // Fees: u64 in PERCENTAGE_BASE (1e6) → divide by 10_000 for human %\n const feeInPayout = Number(info[14]) / 10_000\n const feeInPrincipal = Number(info[13]) / 10_000\n const trueBondPriceWithFee =\n feeInPayout < 100 ? trueBondPriceHuman * (1 / ((100 - feeInPayout) / 100)) : trueBondPriceHuman\n const discountWithFee =\n payoutPrice > 0 ? ((payoutPrice - principalPrice * trueBondPriceWithFee) / payoutPrice) * 100 : 0\n const bonusWithFee =\n discountWithFee > 0 && discountWithFee < 100 ? (discountWithFee / (100 - discountWithFee)) * 100 : 0\n\n const payoutDecimals = bond.earnToken.decimals[APTOS_KEY] ?? 8\n const tokensRemaining = new BigNumber(info[23])\n .minus(new BigNumber(info[5]))\n .div(new BigNumber(10).pow(payoutDecimals))\n .toString()\n\n return {\n ...bond,\n soldOut: info[2] || info[3] ? true : bond.soldOut,\n maxTotalPayout: String(info[23]),\n totalPayoutGiven: String(info[5]),\n maxPayout: String(info[21]),\n tokensRemaining,\n showcaseTokenName: bond.earnToken.symbol,\n vestingTerm: Number(info[19]),\n feeInPayout,\n feeInPrincipal,\n trueBondPrices: [\n {\n trueBondPrice: trueBondPriceScaled,\n points: '0',\n discount,\n discountWithFee,\n bonus,\n bonusWithFee,\n boost: 0,\n },\n ],\n principalTokenPrice: principalPrice.toString(),\n payoutTokenPrice: payoutPrice.toString(),\n }\n } catch (e) {\n console.warn(`[Aptos] Failed to read market_info for ${marketAddr}`, e)\n // Hide the bond from the list when on-chain data is unavailable —\n // showing a card with all zeros is confusing for users.\n return null\n }\n }),\n )\n return enriched.filter((b): b is BondsData => b !== null)\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { BillsConfig } from '@ape.swap/apeswap-lists';
2
+ import { TokenPrices } from '../../tokenPrices/useTokenPrices';
3
+ export declare const fetchBondsDataEVM: (chainId: number, bills: BillsConfig[], apiUrl: string, tokenPrices?: TokenPrices[]) => Promise<import("../../../types/bonds").BondsData[]>;
@@ -0,0 +1,90 @@
1
+ import { BillVersion } from '@ape.swap/apeswap-lists';
2
+ import multicall from '../../../utils/multicall.js';
3
+ import BOND_ABI from '../../../config/abi/BOND_2_4_0.json.js';
4
+ import erc20ABI from '../../../config/abi/erc20.json.js';
5
+ import chunk from 'lodash-es/chunk.js';
6
+ import { cleanBillsData } from './cleanBillsData.js';
7
+
8
+ const fetchBondsDataEVM = async (chainId, bills, apiUrl, tokenPrices) => {
9
+ if (!tokenPrices)
10
+ return [];
11
+ try {
12
+ const billIds = [];
13
+ const billCalls = bills.flatMap((bill) => {
14
+ billIds.push(bill.index);
15
+ return [
16
+ {
17
+ address: bill.contractAddress[bill.chainId] ?? '',
18
+ name: bill.billVersion === BillVersion.V4 ? 'trueBondPrices' : 'trueBillPrice()',
19
+ },
20
+ {
21
+ address: bill.contractAddress[bill.chainId] ?? '',
22
+ name: 'totalPayoutGiven',
23
+ },
24
+ {
25
+ address: bill.contractAddress[bill.chainId] ?? '',
26
+ name: 'terms',
27
+ },
28
+ {
29
+ address: bill.contractAddress[bill.chainId] ?? '',
30
+ name: bill.billVersion !== BillVersion.V1 ? 'getMaxTotalPayout' : 'maxTotalPayout',
31
+ },
32
+ {
33
+ address: bill.contractAddress[bill.chainId] ?? '',
34
+ name: 'feeInPayout',
35
+ },
36
+ {
37
+ address: bill.contractAddress[bill.chainId] ?? '',
38
+ name: 'feeInPrincipal',
39
+ },
40
+ {
41
+ address: bill.contractAddress[bill.chainId] ?? '',
42
+ name: 'paused',
43
+ },
44
+ // keep custom treasury at the very last position
45
+ {
46
+ address: bill.contractAddress[bill.chainId] ?? '',
47
+ name: 'customTreasury',
48
+ },
49
+ ];
50
+ });
51
+ const vals = await multicall(chainId, BOND_ABI, billCalls);
52
+ // The following lines basically grab the values from customTreasury returned from bills contract and then,
53
+ // appends the treasury contract's balance to the chunk that will be passed to cleanBillsData
54
+ // appendIndex value assumes customTreasury will be at the end of the billCalls array
55
+ const appendIndex = billCalls.length / bills.length;
56
+ const treasuryAddresses = vals
57
+ .filter((_, i) => (i % appendIndex) + 1 === appendIndex)
58
+ .map((customTreasury) => customTreasury[0]);
59
+ const treasuryBalanceCalls = treasuryAddresses.map((treasuryAddress, i) => ({
60
+ address: bills?.[i]?.earnToken?.address?.[chainId] ?? '',
61
+ name: 'balanceOf',
62
+ params: [treasuryAddress],
63
+ }));
64
+ const treasuryBalances = await multicall(chainId, erc20ABI, treasuryBalanceCalls);
65
+ const updatedVals = vals.reduce((acc, val, index) => {
66
+ acc.push(val);
67
+ if ((index + 1) % appendIndex === 0) {
68
+ const pos = (index + 1) / appendIndex;
69
+ acc.push(treasuryBalances[pos - 1]);
70
+ }
71
+ return acc;
72
+ }, []);
73
+ //
74
+ const chunkSize = updatedVals?.length / bills?.length;
75
+ const chunkedBills = chunk(updatedVals, chunkSize);
76
+ return await cleanBillsData(billIds, chunkedBills, chainId, bills, tokenPrices);
77
+ }
78
+ catch (e) {
79
+ console.error(e);
80
+ reportError({
81
+ apiUrl,
82
+ error: e,
83
+ extraInfo: { type: 'getBondsData', e },
84
+ });
85
+ return [];
86
+ }
87
+ };
88
+
89
+ export { fetchBondsDataEVM };
90
+ //# sourceMappingURL=fetchBondsDataEVM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchBondsDataEVM.js","sources":["../../../../src/state/bonds/fetchBondsData/fetchBondsDataEVM.ts"],"sourcesContent":["import { BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport multicall from '../../../utils/multicall'\nimport BOND_2_4_0 from '../../../config/abi/BOND_2_4_0.json'\nimport ERC20ABI from '../../../config/abi/erc20.json'\nimport chunk from 'lodash-es/chunk.js'\nimport { cleanBillsData } from './cleanBillsData'\n\nexport const fetchBondsDataEVM = async (\n chainId: number,\n bills: BillsConfig[],\n apiUrl: string,\n tokenPrices?: TokenPrices[],\n) => {\n if (!tokenPrices) return []\n try {\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)\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"],"names":["BOND_2_4_0","ERC20ABI"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { BondsData } from '../../../types/bonds';
2
+ import { ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists';
3
+ import { TokenPrices } from '../../tokenPrices/useTokenPrices';
4
+ export declare const fetchBondsDataPreTGE: (chain: number, tokenPrices: Partial<Record<ChainId, TokenPrices[]>>, preTGEBonds: PreTGEConfig[], apiUrl?: string) => Promise<BondsData[]>;
@@ -0,0 +1,109 @@
1
+ import { getBalanceNumber } from '../../../utils/getBalanceNumber.js';
2
+ import multicall from '../../../utils/multicall.js';
3
+ import chunk from 'lodash-es/chunk.js';
4
+ import LaunchBondABI_V_2_4_1 from '../../../config/abi/launchBond_v2_4_1.json.js';
5
+ import { reportError } from '../../../utils/reportError.js';
6
+
7
+ const fetchBondsDataPreTGE = async (chain, tokenPrices, preTGEBonds, apiUrl) => {
8
+ try {
9
+ if (!preTGEBonds?.length)
10
+ return [];
11
+ const data = [];
12
+ const chainId = chain;
13
+ const preTGEBondsIds = [];
14
+ const launchBondsCalls = preTGEBonds.flatMap((bond) => {
15
+ preTGEBondsIds.push(bond.index);
16
+ const bill = bond;
17
+ return [
18
+ {
19
+ address: bill.contractAddress[bill.chainId],
20
+ name: 'trueBillPrice',
21
+ },
22
+ {
23
+ address: bill.contractAddress[bill.chainId],
24
+ name: 'terms',
25
+ },
26
+ {
27
+ address: bill.contractAddress[bill.chainId],
28
+ name: 'totalPrincipalBilled',
29
+ },
30
+ {
31
+ address: bill.contractAddress[bill.chainId],
32
+ name: 'finalized',
33
+ },
34
+ {
35
+ address: bill.contractAddress[bill.chainId],
36
+ name: 'minPoints',
37
+ },
38
+ {
39
+ address: bill.contractAddress[bill.chainId],
40
+ name: 'maxPoints',
41
+ },
42
+ {
43
+ address: bill.contractAddress[bill.chainId],
44
+ name: 'startVestingTimestamp',
45
+ },
46
+ ];
47
+ });
48
+ const vals = await multicall(chainId, LaunchBondABI_V_2_4_1, launchBondsCalls);
49
+ const chunkSize = vals.length / preTGEBonds.length;
50
+ const chunkedBills = chunk(vals, chunkSize);
51
+ const returnedBills = chunkedBills?.map((chunk, index) => {
52
+ const bondConfig = preTGEBonds?.find((bill) => bill?.index === preTGEBondsIds[index]);
53
+ const [trueBillPrice, terms, totalPrincipalBilled, finalized, minPoints, maxPoints, startVestingTimestamp] = chunk;
54
+ const [, , vestingTerm, , , initialRelease, totalRaise, maxTotalPayout] = terms;
55
+ const initPrice = getBalanceNumber(trueBillPrice, bondConfig?.lpToken?.decimals?.[bondConfig?.chainId] ?? 18);
56
+ const lpPrice = tokenPrices?.[bondConfig?.chainId]?.find((tokenPrice) => tokenPrice?.tokenAddress?.toLowerCase() ===
57
+ bondConfig?.lpToken?.address?.[bondConfig?.chainId]?.toLowerCase())?.price ?? 0;
58
+ const earnTokenPrice = tokenPrices?.[bondConfig?.chainId]?.find((tokenPrice) => tokenPrice?.tokenAddress?.toLowerCase() ===
59
+ bondConfig?.earnToken?.address?.[bondConfig?.chainId]?.toLowerCase())?.price ?? 0;
60
+ const principalTokenPrice = lpPrice?.toString() ?? '0';
61
+ const payoutTokenPrice = earnTokenPrice ? earnTokenPrice?.toString() : initPrice?.toString();
62
+ const bonus = Math.round((bondConfig.tgePrice / initPrice) * 100 - 100);
63
+ const data = {
64
+ ...bondConfig,
65
+ initialRelease: initialRelease / 10000,
66
+ vestingTerm: parseInt(vestingTerm),
67
+ trueBondPrices: [
68
+ {
69
+ points: '0',
70
+ boost: 0,
71
+ trueBondPrice: trueBillPrice?.toString(),
72
+ bonus,
73
+ bonusWithFee: bonus, // placeholder, wont be used
74
+ discount: bonus, // placeholder, wont be used
75
+ discountWithFee: bonus, // placeholder, wont be used
76
+ },
77
+ ],
78
+ maxTotalPayout: maxTotalPayout?.toString(),
79
+ totalPrincipalBilled: totalPrincipalBilled?.toString(),
80
+ payoutTokenPrice,
81
+ principalTokenPrice,
82
+ totalRaise: totalRaise?.toString(),
83
+ finalized: finalized[0],
84
+ minPoints: minPoints.toString(),
85
+ maxPoints: maxPoints.toString(),
86
+ startVestingTimestamp: startVestingTimestamp?.toString(),
87
+ initTime: { [bondConfig.chainId]: parseInt(terms[1]) },
88
+ finishTime: parseInt(terms[0]),
89
+ initPrice,
90
+ soldOut: finalized[0] || (parseInt(terms[0]) ?? 0) < Date.now() / 1000 || bondConfig.soldOut,
91
+ };
92
+ return data;
93
+ });
94
+ data.push(returnedBills);
95
+ return data.flat();
96
+ }
97
+ catch (e) {
98
+ console.error(e);
99
+ reportError({
100
+ apiUrl,
101
+ error: e,
102
+ extraInfo: { type: 'getLaunchBondsPublicData', preTGEBonds, chain, e },
103
+ });
104
+ return [];
105
+ }
106
+ };
107
+
108
+ export { fetchBondsDataPreTGE };
109
+ //# sourceMappingURL=fetchBondsDataPreTGE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchBondsDataPreTGE.js","sources":["../../../../src/state/bonds/fetchBondsData/fetchBondsDataPreTGE.ts"],"sourcesContent":["import { BondsData } from '../../../types/bonds'\nimport { getBalanceNumber } from '../../../utils/getBalanceNumber'\nimport { 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 { reportError } from '../../../utils/reportError'\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"],"names":["launchBondsABI_V2_4_1"],"mappings":";;;;;;AASO,MAAM,oBAAoB,GAAG,OAClC,KAAa,EACb,WAAoD,EACpD,WAA2B,EAC3B,MAAe,KACS;AACxB,IAAA,IAAI;QACF,IAAI,CAAC,WAAW,EAAE,MAAM;AAAE,YAAA,OAAO,EAAE;QACnC,MAAM,IAAI,GAAG,EAAE;QACf,MAAM,OAAO,GAAG,KAAgB;QAEhC,MAAM,cAAc,GAAa,EAAE;QACnC,MAAM,gBAAgB,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACpD,YAAA,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI;YACjB,OAAO;AACL,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAW;AACrD,oBAAA,IAAI,EAAE,eAAe;AACtB,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAW;AACrD,oBAAA,IAAI,EAAE,OAAO;AACd,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAW;AACrD,oBAAA,IAAI,EAAE,sBAAsB;AAC7B,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAW;AACrD,oBAAA,IAAI,EAAE,WAAW;AAClB,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAW;AACrD,oBAAA,IAAI,EAAE,WAAW;AAClB,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAW;AACrD,oBAAA,IAAI,EAAE,WAAW;AAClB,iBAAA;AACD,gBAAA;oBACE,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAW;AACrD,oBAAA,IAAI,EAAE,uBAAuB;AAC9B,iBAAA;aACF;AACH,QAAA,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAEA,qBAAqB,EAAE,gBAAgB,CAAC;QAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM;QAClD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC;QAC3C,MAAM,aAAa,GAAG,YAAY,EAAE,GAAG,CAAC,CAAC,KAAU,EAAE,KAAK,KAAI;YAC5D,MAAM,UAAU,GAAG,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,KAAK,KAAK,cAAc,CAAC,KAAK,CAAC,CAAE;AAEtF,YAAA,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,qBAAqB,CAAC,GAAG,KAAK;AAClH,YAAA,MAAM,KAAK,WAAW,MAAM,cAAc,EAAE,UAAU,EAAE,cAAc,CAAC,GAAG,KAAK;YAE/E,MAAM,SAAS,GAAG,gBAAgB,CAChC,aAAa,EACb,UAAU,EAAE,OAAO,EAAE,QAAQ,GAAG,UAAU,EAAE,OAAkB,CAAC,IAAI,EAAE,CACtE;YAED,MAAM,OAAO,GACX,WAAW,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,IAAI,CACtC,CAAC,UAAU,KACT,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE;AACvC,gBAAA,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,CACrE,EAAE,KAAK,IAAI,CAAC;YACf,MAAM,cAAc,GAClB,WAAW,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,IAAI,CACtC,CAAC,UAAU,KACT,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE;AACvC,gBAAA,UAAU,EAAE,SAAS,EAAE,OAAO,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,CACvE,EAAE,KAAK,IAAI,CAAC;YAEf,MAAM,mBAAmB,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,GAAG;AACtD,YAAA,MAAM,gBAAgB,GAAG,cAAc,GAAG,cAAc,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,QAAQ,EAAE;AAE5F,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,QAAS,GAAG,SAAS,IAAI,GAAG,GAAG,GAAG,CAAC;AAExE,YAAA,MAAM,IAAI,GAAc;AACtB,gBAAA,GAAG,UAAU;gBACb,cAAc,EAAE,cAAc,GAAG,KAAK;AACtC,gBAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC;AAClC,gBAAA,cAAc,EAAE;AACd,oBAAA;AACE,wBAAA,MAAM,EAAE,GAAG;AACX,wBAAA,KAAK,EAAE,CAAC;AACR,wBAAA,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE;wBACxC,KAAK;wBACL,YAAY,EAAE,KAAK;wBACnB,QAAQ,EAAE,KAAK;wBACf,eAAe,EAAE,KAAK;AACvB,qBAAA;AACF,iBAAA;AACD,gBAAA,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE;AAC1C,gBAAA,oBAAoB,EAAE,oBAAoB,EAAE,QAAQ,EAAE;gBACtD,gBAAgB;gBAChB,mBAAmB;AACnB,gBAAA,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE;AAClC,gBAAA,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACvB,gBAAA,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;AAC/B,gBAAA,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;AAC/B,gBAAA,qBAAqB,EAAE,qBAAqB,EAAE,QAAQ,EAAE;AACxD,gBAAA,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;AACtD,gBAAA,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC9B,SAAS;gBACT,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,UAAU,CAAC,OAAO;aAC7F;AACD,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;AACxB,QAAA,OAAO,IAAI,CAAC,IAAI,EAAE;IACpB;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,QAAA,WAAW,CAAC;YACV,MAAM;AACN,YAAA,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE;AACvE,SAAA,CAAC;AACF,QAAA,OAAO,EAAE;IACX;AACF;;;;"}
@@ -0,0 +1,3 @@
1
+ import { BillsConfig } from '@ape.swap/apeswap-lists';
2
+ import { TokenPrices } from '../../tokenPrices/useTokenPrices';
3
+ export declare const fetchBondsDataSOL: (bills: BillsConfig[], apiUrl: string, tokenPrices?: TokenPrices[]) => Promise<import("../../../types/bonds").BondsData[]>;
@@ -0,0 +1,69 @@
1
+ import { ChainId } from '@ape.swap/apeswap-lists';
2
+ import { solanaMulticall } from '../../../utils/solanaMulticall.js';
3
+ import { PublicKey } from '@solana/web3.js';
4
+ import { derivePda } from '../../../utils/derivePda.js';
5
+ import { PROGRAM_ID } from '../../../constants/solanaConstants.js';
6
+ import { cleanBillsData } from './cleanBillsData.js';
7
+
8
+ const fetchBondsDataSOL = async (bills, apiUrl, tokenPrices) => {
9
+ if (!tokenPrices)
10
+ return [];
11
+ try {
12
+ const solanaCalls = [];
13
+ const solanaBillIds = [];
14
+ for (const bill of bills) {
15
+ const bondIssuanceAddress = bill.contractAddress[ChainId.SOL];
16
+ if (!bondIssuanceAddress)
17
+ continue;
18
+ solanaBillIds.push(bill.index);
19
+ const bondIssuancePubkey = new PublicKey(bondIssuanceAddress);
20
+ const bondTermPda = derivePda('bond_term', bondIssuancePubkey, PROGRAM_ID);
21
+ const bondPricingPda = derivePda('bond_pricing', bondIssuancePubkey, PROGRAM_ID);
22
+ solanaCalls.push({ accountAddress: bondIssuanceAddress, accountType: 'bondIssuance' }, { accountAddress: bondTermPda.toBase58(), accountType: 'bondTerm' }, { accountAddress: bondPricingPda.toBase58(), accountType: 'bondPricing' });
23
+ }
24
+ // Fetch Solana bills
25
+ const solanaResults = (await solanaMulticall(solanaCalls));
26
+ const solanaBills = solanaResults?.bondIssuance
27
+ ?.map((bondIssuance, index) => {
28
+ const vestingTermDuration = Number(solanaResults.bondTerm[index]?.vestingEnd.toString());
29
+ const bill = {
30
+ ...bondIssuance,
31
+ ...solanaResults.bondPricing[index],
32
+ terms: solanaResults.bondTerm[index],
33
+ };
34
+ return [
35
+ bill.trueBillPrice,
36
+ bill.totalPayoutGiven,
37
+ [bill.terms.controlVariable, vestingTermDuration, bill.terms.minimumDebt, bill.terms.maxPayout],
38
+ bill.terms.maxTotalPayout,
39
+ bill.feeInPayout.toString(),
40
+ bill.feeInPrincipal.toString(),
41
+ false,
42
+ undefined,
43
+ undefined,
44
+ solanaResults.bondPricing[index],
45
+ solanaResults.bondTerm[index],
46
+ ]; // Map to reflect evm structure
47
+ })
48
+ .filter((bill) => typeof bill !== 'undefined') ?? [];
49
+ const allBillsIds = [];
50
+ const allBillsData = [];
51
+ if (solanaBills.length > 0) {
52
+ allBillsIds.push(...solanaBillIds);
53
+ allBillsData.push(...solanaBills);
54
+ }
55
+ return await cleanBillsData(allBillsIds, allBillsData, ChainId.SOL, bills, tokenPrices);
56
+ }
57
+ catch (e) {
58
+ console.error(e);
59
+ reportError({
60
+ apiUrl,
61
+ error: e,
62
+ extraInfo: { type: 'getBondsDataSOL', e },
63
+ });
64
+ return [];
65
+ }
66
+ };
67
+
68
+ export { fetchBondsDataSOL };
69
+ //# sourceMappingURL=fetchBondsDataSOL.js.map