@ape.swap/bonds-sdk 7.0.4-test.1 → 7.0.4-test.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/evm/state/fetchBondsDataEVM.js +43 -8
- package/dist/adapters/evm/state/fetchBondsDataEVM.js.map +1 -1
- package/dist/adapters/evm/state/fetchUsersBondsEVM.js +7 -1
- package/dist/adapters/evm/state/fetchUsersBondsEVM.js.map +1 -1
- package/dist/adapters/evm/state/lpStaking/useSoulZapLpStakingQuote.js +5 -1
- package/dist/adapters/evm/state/lpStaking/useSoulZapLpStakingQuote.js.map +1 -1
- package/dist/adapters/evm/views/lpStaking/BuyComponentLpStaking.js +26 -8
- package/dist/adapters/evm/views/lpStaking/BuyComponentLpStaking.js.map +1 -1
- package/dist/config/abi/lpStakingVault.json.js +14 -0
- package/dist/config/abi/lpStakingVault.json.js.map +1 -1
- package/dist/state/bonds/useBondsData.js +0 -1
- package/dist/state/bonds/useBondsData.js.map +1 -1
- package/dist/utils/displayHelpers.js +19 -0
- package/dist/utils/displayHelpers.js.map +1 -1
- package/dist/views/Bonds/utils.js +1 -0
- package/dist/views/Bonds/utils.js.map +1 -1
- package/dist/views/YourBonds/components/ClaimAll/ClaimAllModal.js +2 -1
- package/dist/views/YourBonds/components/ClaimAll/ClaimAllModal.js.map +1 -1
- package/package.json +1 -1
|
@@ -10,6 +10,7 @@ import { getBalanceNumber } from '../../../utils/getBalanceNumber.js';
|
|
|
10
10
|
import { TIER_MAPPING } from '../../../state/tiers/tiers.js';
|
|
11
11
|
import { resolveBondTokenPrices } from '../../../state/tokenPrices/resolveTokenPrice.js';
|
|
12
12
|
import { fetchLpStakingLimits } from './lpStaking/fetchLpStakingLimits.js';
|
|
13
|
+
import LP_STAKING_VAULT_ABI from '../../../config/abi/lpStakingVault.json.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* LP staking bonds have no bond contract. The buyer's bonus is a share of the staked position's value, set per campaign
|
|
@@ -19,17 +20,45 @@ import { fetchLpStakingLimits } from './lpStaking/fetchLpStakingLimits.js';
|
|
|
19
20
|
*/
|
|
20
21
|
const fetchLpStakingBondsData = async (chainId, lpStakingBonds) => {
|
|
21
22
|
const bondsWithCampaign = lpStakingBonds.filter((bond) => bond.lpStakingConfig?.adapter && bond.lpStakingConfig?.campaignId);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
name: 'campaigns',
|
|
25
|
-
|
|
23
|
+
// Per bond, from its adapter: the campaign, and whether ApeBond deposits are paused (DepositsArePaused)
|
|
24
|
+
const adapterCalls = bondsWithCampaign.flatMap((bond) => [
|
|
25
|
+
{ address: bond.lpStakingConfig.adapter, name: 'campaigns', params: [bond.lpStakingConfig.campaignId] },
|
|
26
|
+
{ address: bond.lpStakingConfig.adapter, name: 'depositsPaused' },
|
|
27
|
+
]);
|
|
28
|
+
// And whether the vault the positions are staked in has deposits paused. The bond's contract is the vault. Read on its
|
|
29
|
+
// own: multicall fails as a whole, and this shouldn't take the campaigns down with it.
|
|
30
|
+
const vaultCalls = bondsWithCampaign.map((bond) => ({
|
|
31
|
+
address: bond.contractAddress[bond.chainId] ?? '',
|
|
32
|
+
name: 'depositsPaused',
|
|
26
33
|
}));
|
|
27
|
-
const
|
|
34
|
+
const [adapterData, vaultData] = bondsWithCampaign.length > 0
|
|
35
|
+
? await Promise.all([
|
|
36
|
+
multicall(chainId, APE_BOND_POSITION_ADAPTER_ABI, adapterCalls),
|
|
37
|
+
multicall(chainId, LP_STAKING_VAULT_ABI, vaultCalls),
|
|
38
|
+
])
|
|
39
|
+
: [[], []];
|
|
40
|
+
const campaigns = bondsWithCampaign.map((_, i) => adapterData?.[i * 2]);
|
|
28
41
|
// campaigns() → (enabled, downTicks, upTicks, toleranceTicks, bonusCliffSeconds, bonusBps, minBonusAmount)
|
|
42
|
+
// A bond that can't be bought: its campaign is disabled, or the adapter or the vault have deposits paused. A read
|
|
43
|
+
// that failed counts as not paused, so an RPC hiccup doesn't hide the bond (the deposit still reverts if it is).
|
|
44
|
+
const isSoldOut = (bond) => {
|
|
45
|
+
const i = bondsWithCampaign.indexOf(bond);
|
|
46
|
+
if (i === -1)
|
|
47
|
+
return false;
|
|
48
|
+
const campaign = campaigns[i];
|
|
49
|
+
const adapterPaused = adapterData?.[i * 2 + 1]?.[0] === true;
|
|
50
|
+
const vaultPaused = vaultData?.[i]?.[0] === true;
|
|
51
|
+
return (!!campaign && campaign[0] === false) || adapterPaused || vaultPaused;
|
|
52
|
+
};
|
|
29
53
|
const getBonusBps = (bond) => {
|
|
30
54
|
const campaign = campaigns?.[bondsWithCampaign.indexOf(bond)];
|
|
31
55
|
return campaign ? Number(campaign[5]) : 0;
|
|
32
56
|
};
|
|
57
|
+
// The bonus unlocks all at once after the campaign's cliff, so it's the bond's whole vesting term
|
|
58
|
+
const getBonusCliffSeconds = (bond) => {
|
|
59
|
+
const campaign = campaigns?.[bondsWithCampaign.indexOf(bond)];
|
|
60
|
+
return campaign ? Number(campaign[4]) : 0;
|
|
61
|
+
};
|
|
33
62
|
const limits = await Promise.all(lpStakingBonds.map((bond) => bondsWithCampaign.includes(bond)
|
|
34
63
|
? fetchLpStakingLimits(chainId, bond, getBonusBps(bond)).catch((e) => {
|
|
35
64
|
console.error(e);
|
|
@@ -43,7 +72,7 @@ const fetchLpStakingBondsData = async (chainId, lpStakingBonds) => {
|
|
|
43
72
|
const discount = bonus > 0 ? (bonus / (100 + bonus)) * 100 : 0;
|
|
44
73
|
return {
|
|
45
74
|
...bond,
|
|
46
|
-
soldOut:
|
|
75
|
+
soldOut: isSoldOut(bond),
|
|
47
76
|
feeInPayout: 0,
|
|
48
77
|
feeInPrincipal: 0,
|
|
49
78
|
trueBondPrices: [
|
|
@@ -63,7 +92,7 @@ const fetchLpStakingBondsData = async (chainId, lpStakingBonds) => {
|
|
|
63
92
|
maxTotalPayout: limits[index]?.maxTotalPayout ?? '0',
|
|
64
93
|
maxPayout: limits[index]?.maxPayout ?? '0',
|
|
65
94
|
totalPayoutGiven: limits[index]?.totalPayoutGiven ?? '0',
|
|
66
|
-
vestingTerm:
|
|
95
|
+
vestingTerm: getBonusCliffSeconds(bond),
|
|
67
96
|
tierBoostRate: bond.tierBoostRate === undefined ? 1 : bond.tierBoostRate,
|
|
68
97
|
};
|
|
69
98
|
});
|
|
@@ -72,7 +101,13 @@ const fetchBondsDataEVM = async (chainId, bonds, apiUrl, tokenPrices) => {
|
|
|
72
101
|
try {
|
|
73
102
|
/** First we separate lpStakingBonds and bills. */
|
|
74
103
|
const lpStakingBonds = bonds.filter((b) => !b.soldOut && b.billType === 'lpStaking');
|
|
75
|
-
|
|
104
|
+
// Isolated, so a failed LP staking read (campaigns multicall, RPC) doesn't drop the chain's regular bonds
|
|
105
|
+
const lpStakingBondsData = lpStakingBonds.length > 0
|
|
106
|
+
? await fetchLpStakingBondsData(chainId, lpStakingBonds).catch((e) => {
|
|
107
|
+
console.error('Error fetching LP staking bonds data:', e);
|
|
108
|
+
return [];
|
|
109
|
+
})
|
|
110
|
+
: [];
|
|
76
111
|
const bills = bonds.filter((b) => !b.soldOut && b.billType !== 'lpStaking');
|
|
77
112
|
const billIds = [];
|
|
78
113
|
const billCalls = bills.flatMap((bill) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchBondsDataEVM.js","sources":["../../../../src/adapters/evm/state/fetchBondsDataEVM.ts"],"sourcesContent":["import { BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../../../state/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 APE_BOND_POSITION_ADAPTER_ABI from '../../../config/abi/apeBondPositionAdapter.json'\nimport chunk from 'lodash-es/chunk.js'\nimport {\n getBonusWithFee,\n getDiscountWithFee,\n getRawBonus,\n getRawDiscount,\n} from '../../../state/bonds/fetchBondsData/bondPricing'\nimport { formatUnits } from '../../../utils/fixedPoint'\nimport { getBalanceNumber } from '../../../utils/getBalanceNumber'\nimport { BondsData, TrueBondPrices } from '../../../types/bonds'\nimport { TIER_MAPPING } from '../../../state/tiers/tiers'\nimport { resolveBondTokenPrices } from '../../../state/tokenPrices/resolveTokenPrice'\nimport { fetchLpStakingLimits } from './lpStaking/fetchLpStakingLimits'\n\n/**\n * LP staking bonds have no bond contract. The buyer's bonus is a share of the staked position's value, set per campaign\n * on the bond's adapter: `campaigns(campaignId).bonusBps`. It's exposed as the bond's bonus so the UI shows it like any\n * other bond's. The per-purchase and total limits come from the pool's price guard and the bonus escrow\n * (fetchLpStakingLimits). Prices are still placeholder data.\n */\nconst fetchLpStakingBondsData = async (chainId: number, lpStakingBonds: BillsConfig[]): Promise<BondsData[]> => {\n const bondsWithCampaign = lpStakingBonds.filter(\n (bond) => bond.lpStakingConfig?.adapter && bond.lpStakingConfig?.campaignId,\n )\n const campaignCalls = bondsWithCampaign.map((bond) => ({\n address: bond.lpStakingConfig!.adapter,\n name: 'campaigns',\n params: [bond.lpStakingConfig!.campaignId],\n }))\n const campaigns =\n campaignCalls.length > 0 ? await multicall(chainId, APE_BOND_POSITION_ADAPTER_ABI, campaignCalls) : []\n\n // campaigns() → (enabled, downTicks, upTicks, toleranceTicks, bonusCliffSeconds, bonusBps, minBonusAmount)\n const getBonusBps = (bond: BillsConfig) => {\n const campaign = campaigns?.[bondsWithCampaign.indexOf(bond)]\n return campaign ? Number(campaign[5]) : 0\n }\n const limits = await Promise.all(\n lpStakingBonds.map((bond) =>\n bondsWithCampaign.includes(bond)\n ? fetchLpStakingLimits(chainId, bond, getBonusBps(bond)).catch((e) => {\n console.error(e)\n return undefined\n })\n : undefined,\n ),\n )\n\n return lpStakingBonds.map((bond, index) => {\n const bonusBps = getBonusBps(bond)\n const bonus = bonusBps / 100 // e.g. 1,000 bps → 10 %\n // The bonus is computed on the position value after fees, so there's no separate \"with fee\" figure\n const discount = bonus > 0 ? (bonus / (100 + bonus)) * 100 : 0\n return {\n ...bond,\n soldOut: false,\n feeInPayout: 0,\n feeInPrincipal: 0,\n trueBondPrices: [\n {\n points: '0',\n boost: 0,\n trueBondPrice: '0',\n bonus,\n bonusWithFee: bonus,\n discount,\n discountWithFee: discount,\n },\n ],\n principalTokenPrice: '0',\n payoutTokenPrice: '0',\n tokensRemaining: limits[index]?.tokensRemaining ?? '0',\n maxTotalPayout: limits[index]?.maxTotalPayout ?? '0',\n maxPayout: limits[index]?.maxPayout ?? '0',\n totalPayoutGiven: limits[index]?.totalPayoutGiven ?? '0',\n vestingTerm: 60 * 60 * 24 * 7, // 1 week\n tierBoostRate: bond.tierBoostRate === undefined ? 1 : bond.tierBoostRate,\n }\n })\n}\n\nexport const fetchBondsDataEVM = async (\n chainId: number,\n bonds: BillsConfig[],\n apiUrl: string,\n tokenPrices?: TokenPrices[],\n) => {\n try {\n /** First we separate lpStakingBonds and bills. */\n const lpStakingBonds = bonds.filter((b) => !b.soldOut && b.billType === 'lpStaking')\n const lpStakingBondsData = lpStakingBonds.length > 0 ? await fetchLpStakingBondsData(chainId, lpStakingBonds) : []\n\n const bills = bonds.filter((b) => !b.soldOut && b.billType !== 'lpStaking')\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 each bill's chunk\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 // balanceOf has a single output, so multicall wraps it as [balance] — unwrap it\n acc.push(treasuryBalances[pos - 1][0])\n }\n return acc\n }, [])\n\n const chunkSize = updatedVals?.length / bills?.length\n const chunkedBills = chunk(updatedVals, chunkSize)\n\n const regularBondsData = await Promise.all(\n chunkedBills?.map(async (chunk, index) => {\n const bill = bills?.find((bill) => bill?.index === billIds[index]) as BillsConfig\n\n const { lpPrice, earnTokenPrice } = await resolveBondTokenPrices(bill, tokenPrices)\n\n const [\n trueBillPriceFromChunk,\n totalPayoutGiven,\n terms,\n maxTotalPayout,\n feeInPayoutRaw,\n feeInPrincipalRaw,\n paused,\n ,\n customTreasuryBalance,\n ] = chunk as any\n const 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 = Number(\n formatUnits(\n BigInt(maxTotalPayout ?? '0') - BigInt(totalPayoutGiven),\n bill?.earnToken.decimals[bill?.chainId] ?? 18,\n ),\n )\n const treasuryBalance = customTreasuryBalance\n ? getBalanceNumber(customTreasuryBalance, bill?.earnToken?.decimals?.[bill?.chainId] ?? 18)\n : null\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:\n treasuryBalance !== null\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 [...lpStakingBondsData, ...regularBondsData]\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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"}
|
|
1
|
+
{"version":3,"file":"fetchBondsDataEVM.js","sources":["../../../../src/adapters/evm/state/fetchBondsDataEVM.ts"],"sourcesContent":["import { BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../../../state/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 APE_BOND_POSITION_ADAPTER_ABI from '../../../config/abi/apeBondPositionAdapter.json'\nimport chunk from 'lodash-es/chunk.js'\nimport {\n getBonusWithFee,\n getDiscountWithFee,\n getRawBonus,\n getRawDiscount,\n} from '../../../state/bonds/fetchBondsData/bondPricing'\nimport { formatUnits } from '../../../utils/fixedPoint'\nimport { getBalanceNumber } from '../../../utils/getBalanceNumber'\nimport { BondsData, TrueBondPrices } from '../../../types/bonds'\nimport { TIER_MAPPING } from '../../../state/tiers/tiers'\nimport { resolveBondTokenPrices } from '../../../state/tokenPrices/resolveTokenPrice'\nimport { fetchLpStakingLimits } from './lpStaking/fetchLpStakingLimits'\nimport LP_STAKING_VAULT_ABI from '../../../config/abi/lpStakingVault.json'\n\n/**\n * LP staking bonds have no bond contract. The buyer's bonus is a share of the staked position's value, set per campaign\n * on the bond's adapter: `campaigns(campaignId).bonusBps`. It's exposed as the bond's bonus so the UI shows it like any\n * other bond's. The per-purchase and total limits come from the pool's price guard and the bonus escrow\n * (fetchLpStakingLimits). Prices are still placeholder data.\n */\nconst fetchLpStakingBondsData = async (chainId: number, lpStakingBonds: BillsConfig[]): Promise<BondsData[]> => {\n const bondsWithCampaign = lpStakingBonds.filter(\n (bond) => bond.lpStakingConfig?.adapter && bond.lpStakingConfig?.campaignId,\n )\n // Per bond, from its adapter: the campaign, and whether ApeBond deposits are paused (DepositsArePaused)\n const adapterCalls = bondsWithCampaign.flatMap((bond) => [\n { address: bond.lpStakingConfig!.adapter, name: 'campaigns', params: [bond.lpStakingConfig!.campaignId] },\n { address: bond.lpStakingConfig!.adapter, name: 'depositsPaused' },\n ])\n // And whether the vault the positions are staked in has deposits paused. The bond's contract is the vault. Read on its\n // own: multicall fails as a whole, and this shouldn't take the campaigns down with it.\n const vaultCalls = bondsWithCampaign.map((bond) => ({\n address: bond.contractAddress[bond.chainId] ?? '',\n name: 'depositsPaused',\n }))\n const [adapterData, vaultData] =\n bondsWithCampaign.length > 0\n ? await Promise.all([\n multicall(chainId, APE_BOND_POSITION_ADAPTER_ABI, adapterCalls),\n multicall(chainId, LP_STAKING_VAULT_ABI, vaultCalls),\n ])\n : [[], []]\n const campaigns = bondsWithCampaign.map((_, i) => adapterData?.[i * 2])\n\n // campaigns() → (enabled, downTicks, upTicks, toleranceTicks, bonusCliffSeconds, bonusBps, minBonusAmount)\n // A bond that can't be bought: its campaign is disabled, or the adapter or the vault have deposits paused. A read\n // that failed counts as not paused, so an RPC hiccup doesn't hide the bond (the deposit still reverts if it is).\n const isSoldOut = (bond: BillsConfig) => {\n const i = bondsWithCampaign.indexOf(bond)\n if (i === -1) return false\n const campaign = campaigns[i]\n const adapterPaused = adapterData?.[i * 2 + 1]?.[0] === true\n const vaultPaused = vaultData?.[i]?.[0] === true\n return (!!campaign && campaign[0] === false) || adapterPaused || vaultPaused\n }\n const getBonusBps = (bond: BillsConfig) => {\n const campaign = campaigns?.[bondsWithCampaign.indexOf(bond)]\n return campaign ? Number(campaign[5]) : 0\n }\n // The bonus unlocks all at once after the campaign's cliff, so it's the bond's whole vesting term\n const getBonusCliffSeconds = (bond: BillsConfig) => {\n const campaign = campaigns?.[bondsWithCampaign.indexOf(bond)]\n return campaign ? Number(campaign[4]) : 0\n }\n const limits = await Promise.all(\n lpStakingBonds.map((bond) =>\n bondsWithCampaign.includes(bond)\n ? fetchLpStakingLimits(chainId, bond, getBonusBps(bond)).catch((e) => {\n console.error(e)\n return undefined\n })\n : undefined,\n ),\n )\n\n return lpStakingBonds.map((bond, index) => {\n const bonusBps = getBonusBps(bond)\n const bonus = bonusBps / 100 // e.g. 1,000 bps → 10 %\n // The bonus is computed on the position value after fees, so there's no separate \"with fee\" figure\n const discount = bonus > 0 ? (bonus / (100 + bonus)) * 100 : 0\n return {\n ...bond,\n soldOut: isSoldOut(bond),\n feeInPayout: 0,\n feeInPrincipal: 0,\n trueBondPrices: [\n {\n points: '0',\n boost: 0,\n trueBondPrice: '0',\n bonus,\n bonusWithFee: bonus,\n discount,\n discountWithFee: discount,\n },\n ],\n principalTokenPrice: '0',\n payoutTokenPrice: '0',\n tokensRemaining: limits[index]?.tokensRemaining ?? '0',\n maxTotalPayout: limits[index]?.maxTotalPayout ?? '0',\n maxPayout: limits[index]?.maxPayout ?? '0',\n totalPayoutGiven: limits[index]?.totalPayoutGiven ?? '0',\n vestingTerm: getBonusCliffSeconds(bond),\n tierBoostRate: bond.tierBoostRate === undefined ? 1 : bond.tierBoostRate,\n }\n })\n}\n\nexport const fetchBondsDataEVM = async (\n chainId: number,\n bonds: BillsConfig[],\n apiUrl: string,\n tokenPrices?: TokenPrices[],\n) => {\n try {\n /** First we separate lpStakingBonds and bills. */\n const lpStakingBonds = bonds.filter((b) => !b.soldOut && b.billType === 'lpStaking')\n // Isolated, so a failed LP staking read (campaigns multicall, RPC) doesn't drop the chain's regular bonds\n const lpStakingBondsData =\n lpStakingBonds.length > 0\n ? await fetchLpStakingBondsData(chainId, lpStakingBonds).catch((e) => {\n console.error('Error fetching LP staking bonds data:', e)\n return []\n })\n : []\n\n const bills = bonds.filter((b) => !b.soldOut && b.billType !== 'lpStaking')\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 each bill's chunk\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 // balanceOf has a single output, so multicall wraps it as [balance] — unwrap it\n acc.push(treasuryBalances[pos - 1][0])\n }\n return acc\n }, [])\n\n const chunkSize = updatedVals?.length / bills?.length\n const chunkedBills = chunk(updatedVals, chunkSize)\n\n const regularBondsData = await Promise.all(\n chunkedBills?.map(async (chunk, index) => {\n const bill = bills?.find((bill) => bill?.index === billIds[index]) as BillsConfig\n\n const { lpPrice, earnTokenPrice } = await resolveBondTokenPrices(bill, tokenPrices)\n\n const [\n trueBillPriceFromChunk,\n totalPayoutGiven,\n terms,\n maxTotalPayout,\n feeInPayoutRaw,\n feeInPrincipalRaw,\n paused,\n ,\n customTreasuryBalance,\n ] = chunk as any\n const 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 = Number(\n formatUnits(\n BigInt(maxTotalPayout ?? '0') - BigInt(totalPayoutGiven),\n bill?.earnToken.decimals[bill?.chainId] ?? 18,\n ),\n )\n const treasuryBalance = customTreasuryBalance\n ? getBalanceNumber(customTreasuryBalance, bill?.earnToken?.decimals?.[bill?.chainId] ?? 18)\n : null\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:\n treasuryBalance !== null\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 [...lpStakingBondsData, ...regularBondsData]\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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"}
|
|
@@ -30,7 +30,13 @@ const fetchUsersBondsEVM = async (chainId, account, bondData, tokenPrices) => {
|
|
|
30
30
|
userOwnedBills: enrichedUserBills,
|
|
31
31
|
};
|
|
32
32
|
});
|
|
33
|
-
|
|
33
|
+
// Isolated, so a failed LP staking read (campaigns multicall, RPC) doesn't fail the chain's regular bills
|
|
34
|
+
const lpStakingData = lpStakingBonds.length > 0
|
|
35
|
+
? await fetchUserLpStakingBonds(chainId, account, lpStakingBonds).catch((e) => {
|
|
36
|
+
console.error('Error fetching LP staking positions:', e);
|
|
37
|
+
return [];
|
|
38
|
+
})
|
|
39
|
+
: [];
|
|
34
40
|
return Promise.resolve([...combinedData, ...lpStakingData]);
|
|
35
41
|
}
|
|
36
42
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchUsersBondsEVM.js","sources":["../../../../src/adapters/evm/state/fetchUsersBondsEVM.ts"],"sourcesContent":["import billAbi from '../../../config/abi/BOND_2_0_0.json'\nimport multicall from '../utils/multicall'\nimport { UserBill, UserOwnedBillsData } from '../../../types/yourbonds'\nimport { BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../../../state/tokenPrices/useTokenPrices'\nimport { BondsData } from '../../../types/bonds'\nimport { apiGet } from '../../../utils/httpClient'\nimport { PRICE_API_URL } from '../../../config/constants/variables'\nimport partition from 'lodash-es/partition.js'\nimport APE_BOND_POSITION_ADAPTER_ABI from '../../../config/abi/apeBondPositionAdapter.json'\nexport const fetchUsersBondsEVM = async (\n chainId: ChainId,\n account: string,\n bondData: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserOwnedBillsData[]> => {\n try {\n if (!account) {\n return []\n }\n const [lpStakingBonds, bonds] = partition(bondData, (bond) => bond.billType === 'lpStaking')\n\n // Fetch and set user owned bill data without NFT Data\n const userOwnedBills = await fetchUserOwnedBills(chainId, account, bonds, tokenPrices)\n const mapUserOwnedBills = bonds.map((bill: BillsConfig) =>\n userOwnedBills.filter((b) => b.address.toLowerCase() === bill.contractAddress[bill.chainId]?.toLowerCase()),\n )\n const userOwnedBillsData = bonds.map((bill: BillsConfig, i: number) => ({\n index: bill.index,\n userOwnedBills: mapUserOwnedBills[i],\n }))\n\n const combinedData = userOwnedBillsData.map((data) => {\n const enrichedUserBills = data.userOwnedBills.map((bill) => {\n return {\n ...bill,\n }\n })\n return {\n ...data,\n userOwnedBills: enrichedUserBills,\n }\n })\n\n const lpStakingData =\n lpStakingBonds.length > 0 ? await fetchUserLpStakingBonds(chainId, account, lpStakingBonds) : []\n\n return Promise.resolve([...combinedData, ...lpStakingData])\n } catch (error) {\n console.error('Error fetching user owned bills data:', error)\n return Promise.reject(error)\n }\n}\n\n// REAL's API only answers browsers from origins it allowlists, so it's called through ape.bond's proxy, which\n// forwards to REAL's API (test stack or mainnet, set on ape.bond's side).\n// TODO: staging proxy for now; switch to the production one (https://ape.bond/api/real-lp) once it's deployed.\nconst REAL_LP_API = 'https://staging.ape.bond/api/real-lp'\n// A position's page on REAL's site, where its bonus and pool rewards are claimed.\n// TODO: test site for now; REAL will send the production URL when mainnet is live.\nconst REAL_LP_DASHBOARD = 'https://staking-test.real.finance/lp/dashboard'\n\n// REAL's /rewards/<wallet>: the pool (epoch) rewards, lifetime figures. Only the fields used below are typed.\ninterface RealLpRewards {\n tokens: { token: string; symbol: string; decimals: number; claims_enabled: boolean }[]\n positions: { lineage_id: string; tokens: { token: string; claimable_wei: string }[] }[]\n}\n\n// One row of REAL's /positions/<wallet>: one episode of a position, i.e. one NFT while it sits in the vault.\n// Only the fields used below are typed.\ninterface RealLpPosition {\n token_id: string\n lineage_id: string\n next_episode_id: string | null\n stake_ordinal: number\n status: 'active' | 'rebalanced' | 'unstaked'\n tick_lower: number\n tick_upper: number\n liquidity_wei: string\n principal_usd: string\n value_usd_now: string | null\n apebond: {\n campaign_id: string\n deposited_at: number\n bonus: {\n token: string\n amount_wei: string\n unlock_at: number\n status: 'reserved' | 'claimable' | 'claimed' | 'forfeited'\n claimed_at: number | null\n token_id: string\n } | null\n } | null\n}\n\n/**\n * Raw token amounts (wei) a Uniswap v3 position holds at the pool's current tick: all token0 below its range, all\n * token1 above it, both inside. Floating point: it's for display only.\n */\nconst getPositionAmounts = (liquidity: number, tickLower: number, tickUpper: number, currentTick: number) => {\n const sqrtPrice = (tick: number) => Math.pow(1.0001, tick / 2)\n const sqrtLower = sqrtPrice(tickLower)\n const sqrtUpper = sqrtPrice(tickUpper)\n const sqrtCurrent = sqrtPrice(Math.min(Math.max(currentTick, tickLower), tickUpper))\n return {\n amount0: (liquidity * (sqrtUpper - sqrtCurrent)) / (sqrtCurrent * sqrtUpper),\n amount1: liquidity * (sqrtCurrent - sqrtLower),\n }\n}\n\n/**\n * The user's LP staking positions, shaped as purchased bonds. A position has no bill: it's a Uniswap v3 NFT staked\n * in REAL's vault, and what ApeBond pays is its bonus, reserved in REAL's escrow until the cliff. So each position\n * becomes one bill whose payout is that bonus, vesting all at once at the cliff (`vestingCliff` = `vestingTerm`).\n * Claims happen on REAL's site, so the bills are marked paused (the row's claim button would call `redeem` on the\n * vault). See docs/lp-staking-bonds/2026-10-23-real-lp-positions-rewards-api.md.\n */\nconst fetchUserLpStakingBonds = async (\n chainId: ChainId,\n account: string,\n lpStakingBonds: BillsConfig[],\n): Promise<UserOwnedBillsData[]> => {\n let rows: RealLpPosition[]\n let assetPriceUsd: string | undefined\n let assetIsToken0 = true\n let currentTick = 0\n let rewards: RealLpRewards | undefined\n try {\n const [response, rewardsResponse] = await Promise.all([\n apiGet<{\n current_tick: number\n current_price_usd: string\n asset_is_token0: boolean\n positions: RealLpPosition[]\n }>(`${REAL_LP_API}/positions/${account}`),\n // The positions still show without their pool rewards if this fails\n apiGet<RealLpRewards>(`${REAL_LP_API}/rewards/${account}`).catch((error) => {\n console.error('Error fetching LP staking rewards:', error)\n return undefined\n }),\n ])\n rewards = rewardsResponse\n rows = response?.positions ?? []\n assetPriceUsd = response?.current_price_usd\n assetIsToken0 = response?.asset_is_token0 ?? true\n currentTick = response?.current_tick ?? 0\n } catch (error) {\n // Don't fail the chain's regular bonds because REAL's API is unreachable (or refuses our origin)\n console.error('Error fetching LP staking positions:', error)\n return []\n }\n\n // All episodes of a position share its lineage_id; the one with no next episode is its current state.\n // Only positions bought through ApeBond have an apebond block.\n const currentPositions = rows.filter((row) => row.apebond && row.next_episode_id === null)\n\n // Each campaign's bonus rate and minimum bonus, for the minimum position value that earns a bonus.\n // campaigns() → (enabled, downTicks, upTicks, toleranceTicks, bonusCliffSeconds, bonusBps, minBonusAmount)\n const campaigns = await multicall(\n chainId,\n APE_BOND_POSITION_ADAPTER_ABI,\n lpStakingBonds.map((bond) => ({\n address: bond.lpStakingConfig!.adapter,\n name: 'campaigns',\n params: [bond.lpStakingConfig!.campaignId],\n })),\n )\n\n return lpStakingBonds.map((bond, bondIndex) => {\n const lpStakingConfig = bond.lpStakingConfig!\n const campaign = campaigns?.[bondIndex]\n const bonusDecimals = lpStakingConfig.bonusRewardToken.decimals[bond.chainId] ?? 18\n const bonusThreshold =\n campaign && Number(campaign[5]) > 0\n ? (Number(campaign[6]) / 10 ** bonusDecimals) * (10000 / Number(campaign[5]))\n : undefined\n const userOwnedBills: UserBill[] = currentPositions\n .filter((row) => row.apebond!.campaign_id.toLowerCase() === lpStakingConfig.campaignId.toLowerCase())\n .map((row) => {\n const { deposited_at: depositedAt, bonus } = row.apebond!\n // No bonus when the purchase was below the campaign minimum; forfeited bonuses have amount 0\n const amount = bonus?.amount_wei ?? '0'\n const cliff = bonus ? bonus.unlock_at - depositedAt : 0\n const chainId = bond.chainId\n const bonusToken = lpStakingConfig.bonusRewardToken\n // The pool is the bonus token ($ASSET) paired with the bond's principal token (USDC)\n const assetToken = {\n address: bonusToken.address[chainId] ?? '',\n symbol: bonusToken.symbol,\n name: bonusToken.symbol,\n decimals: bonusToken.decimals,\n }\n const pairedToken = {\n address: bond.lpToken.address[chainId] ?? '',\n symbol: bond.lpToken.symbol,\n name: bond.lpToken.symbol,\n decimals: bond.lpToken.decimals,\n }\n // Value of the position when it was staked: what the buyer paid, minus the zap fees and the change returned\n const principalUsd = parseFloat(row.principal_usd ?? '0')\n // Value of the position now (null once unstaked: the vault no longer holds it)\n const valueUsdNow = parseFloat(row.value_usd_now ?? '0')\n const assetPrice = parseFloat(assetPriceUsd ?? '0')\n // What the staked position holds now. An unstaked position is back in the wallet, so nothing is staked.\n // current_price_usd is $ASSET's price in USDC, and USDC is counted at $1 (as REAL's value_usd_now does).\n const { amount0, amount1 } =\n row.status === 'unstaked'\n ? { amount0: 0, amount1: 0 }\n : getPositionAmounts(parseFloat(row.liquidity_wei), row.tick_lower, row.tick_upper, currentTick)\n const [token0, token1] = assetIsToken0 ? [assetToken, pairedToken] : [pairedToken, assetToken]\n const toStakedToken = (token: typeof assetToken, rawAmount: number) => {\n const amount = rawAmount / 10 ** (token.decimals[chainId] ?? 18)\n return {\n address: token.address,\n symbol: token.symbol,\n amount,\n amountUsd: amount * (token === assetToken ? assetPrice : 1),\n }\n }\n return {\n // Rows are matched to their bond by contract address; for LP staking that's the vault\n address: bond.contractAddress[bond.chainId] ?? '',\n // The position's current NFT, the one REAL's page link uses. After a rebalance past the cliff the escrow\n // still pays on the NFT id the position had at the cliff (bonus.token_id), which has no field here.\n id: row.token_id,\n // The NFT contract is the position manager. The price range (price_lower_usd / price_upper_usd,\n // range_status_now) has no field.\n // Neither do the position's status (an unstaked position still shows, with its bonus as the API reports\n // it) and `finalized` (false for ~13 min after a purchase).\n billNftAddress: lpStakingConfig.positionManager,\n totalPayout: amount,\n // What's left to receive: everything until it's claimed (or forfeited, where amount is 0)\n payout: bonus?.status === 'claimed' ? '0' : amount,\n pendingRewards: bonus?.status === 'claimable' ? amount : '0',\n payoutClaimed: bonus?.status === 'claimed' ? amount : '0',\n vestingStartTimestamp: depositedAt.toString(),\n vestingTerm: cliff.toString(),\n lastBlockTimestamp: (bonus?.claimed_at ?? depositedAt).toString(),\n // No price per payout token: the bonus is a share of the position's value\n truePricePaid: '0',\n paused: true,\n lpStakingData: {\n token0: toStakedToken(token0, amount0),\n token1: toStakedToken(token1, amount1),\n bonusStatus: bonus?.status ?? null,\n bonusThreshold,\n // The position's page on REAL's site. The ordinal is only appended from 2 on (an NFT staked again by\n // hand after an unstake); older ids of the lineage redirect to the current one.\n positionUrl: `${REAL_LP_DASHBOARD}/${row.token_id}${row.stake_ordinal >= 2 ? `-${row.stake_ordinal}` : ''}`,\n // Matched by lineage_id, shared by every episode of the position (it survives rebalances)\n poolRewards: rewards\n ? rewards.tokens.map((rewardToken) => {\n const positionToken = rewards!.positions\n .find((position) => position.lineage_id === row.lineage_id)\n ?.tokens.find((token) => token.token.toLowerCase() === rewardToken.token.toLowerCase())\n // claimable_wei is what's earned and not claimed yet; $ASSET can't be claimed before\n // claims_enabled (mainnet launch + REAL's timelock)\n const rewardAmount = Number(positionToken?.claimable_wei ?? '0') / 10 ** rewardToken.decimals\n return {\n address: rewardToken.token,\n symbol: rewardToken.symbol,\n amount: rewardAmount,\n // Only $ASSET has a price (current_price_usd); REAL's API doesn't price $OVTR\n amountUsd:\n rewardToken.token.toLowerCase() === assetToken.address.toLowerCase()\n ? rewardAmount * assetPrice\n : undefined,\n claimsEnabled: rewardToken.claims_enabled,\n }\n })\n : undefined,\n },\n // What api-v2 provides for regular bills, here from REAL's API (useUserBonds doesn't send LP staking\n // bills to api-v2)\n nftData: {\n tokenId: parseInt(row.token_id),\n billNftId: parseInt(row.token_id),\n processing: false,\n // The position NFT is a Uniswap v3 position with no bond art\n image: 'https://www.ape.bond/images/bills/hidden-bill.jpg',\n chainId,\n contractAddress: lpStakingConfig.positionManager,\n data: {\n billContract: bond.contractAddress[chainId] ?? '',\n billNftAddress: lpStakingConfig.positionManager,\n billNftId: parseInt(row.token_id),\n // Not in REAL's API\n blockNumber: 0,\n bondArtCollection: '',\n bondPartner: bond.bondPartner ?? '',\n bondVersion: bond.billVersion ?? '',\n chainId,\n // The purchase opened the position's first episode, whose id is <token_id>-<opening tx hash>\n createTransactionHash: row.lineage_id.split('-')[1] ?? '',\n createdAddressOwner: account,\n createdAt: depositedAt,\n // The amount paid isn't in REAL's API (only in the purchase tx). The principal token is USDC, so the\n // position's USD value at purchase stands in for it.\n deposit: principalUsd,\n dollarValue: principalUsd,\n expires: depositedAt + cliff,\n pairName: assetIsToken0\n ? `${assetToken.symbol}-${pairedToken.symbol}`\n : `${pairedToken.symbol}-${assetToken.symbol}`,\n // The position's current value (used by the share image), in $ASSET (the payout token) so that\n // payout × payoutTokenPrice gives value_usd_now back. The bonus itself is in the bill's payout fields.\n payout: assetPrice > 0 ? valueUsdNow / assetPrice : 0,\n payoutToken: assetToken.address,\n payoutTokenData: {\n address: assetToken.address,\n name: assetToken.name,\n symbol: assetToken.symbol,\n decimals: assetToken.decimals,\n },\n payoutTokenPrice: assetPriceUsd ?? '0',\n principalToken: pairedToken.address,\n token0: assetIsToken0 ? assetToken : pairedToken,\n token1: assetIsToken0 ? pairedToken : assetToken,\n type: bond.billType,\n vestingPeriodSeconds: cliff,\n },\n },\n // The bonus is paid in the bonus token, not the bond's earnToken, and only unlocks at the cliff.\n // The $OVTR and $ASSET staking rewards (REAL's /rewards/<wallet>) have no field.\n bond: {\n ...bond,\n earnToken: lpStakingConfig.bonusRewardToken,\n vestingCliff: cliff,\n vestingTerm: cliff,\n payoutTokenPrice: assetPriceUsd,\n } as BondsData,\n }\n })\n return { index: bond.index, userOwnedBills }\n })\n}\n\nconst fetchUserOwnedBills = async (\n chainId: ChainId,\n account: string,\n bonds: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserBill[]> => {\n // Maps all the bills in the list repo to make a call to each of them to get Bills Id and paused state (only for V4)\n const billIdAndPausedCalls = bonds.flatMap((b, index) => {\n const calls = [\n {\n address: b.contractAddress[b.chainId] ?? '',\n name: 'getBillIds',\n params: [account],\n bondIndex: index,\n },\n ]\n // Only add paused call for V4 bonds\n if (b.billVersion === BillVersion.V4) {\n calls.push({\n address: b.contractAddress[b.chainId] ?? '',\n name: 'paused',\n params: [],\n bondIndex: index,\n })\n }\n return calls\n })\n const billIdAndPausedResults = await multicall(chainId, billAbi, billIdAndPausedCalls, true, 15)\n\n // Separate billIds and pausedStates from results, tracking which bonds have paused calls\n const billIds: any[] = []\n const pausedStates: Map<string, boolean> = new Map()\n let resultIndex = 0\n\n bonds.forEach((b) => {\n // First result is always getBillIds\n billIds.push(billIdAndPausedResults?.[resultIndex])\n resultIndex++\n\n // Next result is paused only if V4\n if (b.billVersion === BillVersion.V4) {\n pausedStates.set(\n b.contractAddress[b.chainId]?.toLowerCase() as string,\n billIdAndPausedResults?.[resultIndex]?.[0] ?? false,\n )\n resultIndex++\n }\n })\n const billDataCalls: any = []\n const billVersions: any = []\n\n billIds?.forEach((idArray: any, index: number) =>\n idArray[0].forEach((id: bigint) => {\n if (id > 0) {\n billDataCalls.push({\n address: bonds[index].contractAddress[bonds[index].chainId],\n name: bonds[index].billVersion !== BillVersion.V1 ? 'getBillInfo' : 'billInfo',\n params: [id],\n bond: bonds[index],\n })\n billDataCalls.push({\n address: bonds[index].contractAddress[bonds[index].chainId],\n name: bonds[index].billVersion !== BillVersion.V1 ? 'claimablePayout' : 'pendingPayoutFor',\n params: [id],\n bond: bonds[index],\n })\n billVersions.push(bonds[index].billVersion)\n }\n }),\n )\n const billData = await multicall(chainId, billAbi, billDataCalls, true, 150)\n const result = []\n\n for (let i = 0; i < billVersions.length; i++) {\n const billPos = i === 0 ? 0 : i * 2\n let bond: BondsData = billDataCalls[billPos].bond\n\n let principalTokenPrice = tokenPrices?.[bond.chainId]?.find(\n (tokenPrice) => tokenPrice.tokenAddress?.toLowerCase() === bond?.lpToken?.address?.[bond.chainId]?.toLowerCase(),\n )?.price\n\n let payoutTokenPrice = tokenPrices?.[bond.chainId]?.find(\n (tokenPrice: TokenPrices) =>\n tokenPrice?.tokenAddress?.toLowerCase() === bond?.earnToken?.address?.[bond.chainId]?.toLowerCase(),\n )?.price\n\n if (principalTokenPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n console.log('Individual call for: ', bond.lpToken.symbol, '. Price: ', res.price)\n principalTokenPrice = parseFloat(res.price ?? '0')\n } catch {\n principalTokenPrice = 0\n }\n }\n if (payoutTokenPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n console.log('Individual call for: ', bond.earnToken.symbol, '. Price: ', res.price)\n payoutTokenPrice = parseFloat(res.price ?? '0')\n } catch {\n payoutTokenPrice = 0\n }\n }\n\n bond = {\n ...bond,\n payoutTokenPrice: payoutTokenPrice?.toString(),\n principalTokenPrice: principalTokenPrice?.toString(),\n }\n const paused = pausedStates.get(bond.contractAddress[bond.chainId]?.toLowerCase() as string) ?? false\n\n const data =\n billVersions[i] !== BillVersion.V1\n ? {\n address: billDataCalls[billPos].address,\n id: billDataCalls[billPos].params[0].toString(),\n payout: (\n BigInt(billData[billPos][0]?.payout.toString()) - BigInt(billData[billPos][0]?.payoutClaimed.toString())\n ).toString(),\n totalPayout: billData[billPos][0]?.payout.toString(),\n payoutClaimed: billData[billPos][0]?.payoutClaimed.toString(),\n billNftAddress: bond.billNnftAddress[bond.chainId] ?? '',\n vesting: billData[billPos][0]?.vesting.toString(),\n vestingTerm: billData[billPos][0]?.vestingTerm.toString(),\n lastBlockTimestamp: billData[billPos][0]?.lastClaimTimestamp.toString(),\n vestingStartTimestamp: billData[billPos][0]?.vestingStartTimestamp.toString(),\n truePricePaid: billData[billPos][0]?.truePricePaid.toString(),\n pendingRewards: billData[billPos + 1][0].toString(),\n paused,\n bond,\n }\n : {\n address: billDataCalls[billPos].address,\n id: billDataCalls[billPos].params[0].toString(),\n payoutClaimed: billData?.[billPos]?.[0]?.payoutClaimed?.toString(),\n payout: billData[billPos][0].toString(),\n billNftAddress: bond.billNnftAddress[bond.chainId] ?? '',\n vesting: billData[billPos][1].toString(),\n lastBlockTimestamp: billData[billPos][2].toString(),\n truePricePaid: billData[billPos][3].toString(),\n pendingRewards: billData[billPos + 1][0].toString(),\n paused,\n bond,\n }\n result.push(data)\n }\n\n return result\n}\n"],"names":[],"mappings":";;;;;;;;AAUO,MAAM,kBAAkB,GAAG,OAChC,OAAgB,EAChB,OAAe,EACf,QAAuB,EACvB,WAAoD,KACnB;AACjC,IAAA,IAAI;QACF,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,EAAE;QACX;QACA,MAAM,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,WAAW,CAAC;;AAG5F,QAAA,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC;AACtF,QAAA,MAAM,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAiB,KACpD,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC,CAC5G;AACD,QAAA,MAAM,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAiB,EAAE,CAAS,MAAM;YACtE,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,YAAA,cAAc,EAAE,iBAAiB,CAAC,CAAC,CAAC;AACrC,SAAA,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;YACnD,MAAM,iBAAiB,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;gBACzD,OAAO;AACL,oBAAA,GAAG,IAAI;iBACR;AACH,YAAA,CAAC,CAAC;YACF,OAAO;AACL,gBAAA,GAAG,IAAI;AACP,gBAAA,cAAc,EAAE,iBAAiB;aAClC;AACH,QAAA,CAAC,CAAC;QAEF,MAAM,aAAa,GACjB,cAAc,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAC,GAAG,EAAE;AAElG,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,aAAa,CAAC,CAAC;IAC7D;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,KAAK,CAAC;AAC7D,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IAC9B;AACF;AAEA;AACA;AACA;AACA,MAAM,WAAW,GAAG,sCAAsC;AAC1D;AACA;AACA,MAAM,iBAAiB,GAAG,gDAAgD;AAmC1E;;;AAGG;AACH,MAAM,kBAAkB,GAAG,CAAC,SAAiB,EAAE,SAAiB,EAAE,SAAiB,EAAE,WAAmB,KAAI;AAC1G,IAAA,MAAM,SAAS,GAAG,CAAC,IAAY,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC;AAC9D,IAAA,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;AACtC,IAAA,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;IACtC,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IACpF,OAAO;AACL,QAAA,OAAO,EAAE,CAAC,SAAS,IAAI,SAAS,GAAG,WAAW,CAAC,KAAK,WAAW,GAAG,SAAS,CAAC;AAC5E,QAAA,OAAO,EAAE,SAAS,IAAI,WAAW,GAAG,SAAS,CAAC;KAC/C;AACH,CAAC;AAED;;;;;;AAMG;AACH,MAAM,uBAAuB,GAAG,OAC9B,OAAgB,EAChB,OAAe,EACf,cAA6B,KACI;AACjC,IAAA,IAAI,IAAsB;AAC1B,IAAA,IAAI,aAAiC;IACrC,IAAI,aAAa,GAAG,IAAI;IACxB,IAAI,WAAW,GAAG,CAAC;AACnB,IAAA,IAAI,OAAkC;AACtC,IAAA,IAAI;QACF,MAAM,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACpD,YAAA,MAAM,CAKH,CAAA,EAAG,WAAW,CAAA,WAAA,EAAc,OAAO,EAAE,CAAC;;AAEzC,YAAA,MAAM,CAAgB,CAAA,EAAG,WAAW,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAI;AACzE,gBAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;AAC1D,gBAAA,OAAO,SAAS;AAClB,YAAA,CAAC,CAAC;AACH,SAAA,CAAC;QACF,OAAO,GAAG,eAAe;AACzB,QAAA,IAAI,GAAG,QAAQ,EAAE,SAAS,IAAI,EAAE;AAChC,QAAA,aAAa,GAAG,QAAQ,EAAE,iBAAiB;AAC3C,QAAA,aAAa,GAAG,QAAQ,EAAE,eAAe,IAAI,IAAI;AACjD,QAAA,WAAW,GAAG,QAAQ,EAAE,YAAY,IAAI,CAAC;IAC3C;IAAE,OAAO,KAAK,EAAE;;AAEd,QAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC;AAC5D,QAAA,OAAO,EAAE;IACX;;;IAIA,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,eAAe,KAAK,IAAI,CAAC;;;AAI1F,IAAA,MAAM,SAAS,GAAG,MAAM,SAAS,CAC/B,OAAO,EACP,6BAA6B,EAC7B,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AAC5B,QAAA,OAAO,EAAE,IAAI,CAAC,eAAgB,CAAC,OAAO;AACtC,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,MAAM,EAAE,CAAC,IAAI,CAAC,eAAgB,CAAC,UAAU,CAAC;KAC3C,CAAC,CAAC,CACJ;IAED,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,KAAI;AAC5C,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAgB;AAC7C,QAAA,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AACvC,QAAA,MAAM,aAAa,GAAG,eAAe,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACnF,QAAA,MAAM,cAAc,GAClB,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG;cAC9B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,aAAa,KAAK,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;cAC1E,SAAS;QACf,MAAM,cAAc,GAAe;aAChC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,eAAe,CAAC,UAAU,CAAC,WAAW,EAAE;AACnG,aAAA,GAAG,CAAC,CAAC,GAAG,KAAI;YACX,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,OAAQ;;AAEzD,YAAA,MAAM,MAAM,GAAG,KAAK,EAAE,UAAU,IAAI,GAAG;AACvC,YAAA,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC,SAAS,GAAG,WAAW,GAAG,CAAC;AACvD,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;AAC5B,YAAA,MAAM,UAAU,GAAG,eAAe,CAAC,gBAAgB;;AAEnD,YAAA,MAAM,UAAU,GAAG;gBACjB,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;gBAC1C,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,IAAI,EAAE,UAAU,CAAC,MAAM;gBACvB,QAAQ,EAAE,UAAU,CAAC,QAAQ;aAC9B;AACD,YAAA,MAAM,WAAW,GAAG;gBAClB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;AAC5C,gBAAA,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;AAC3B,gBAAA,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;AACzB,gBAAA,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;aAChC;;YAED,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC;;YAEzD,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC;YACxD,MAAM,UAAU,GAAG,UAAU,CAAC,aAAa,IAAI,GAAG,CAAC;;;YAGnD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GACxB,GAAG,CAAC,MAAM,KAAK;kBACX,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;kBACxB,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC;YACpG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,aAAa,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC;AAC9F,YAAA,MAAM,aAAa,GAAG,CAAC,KAAwB,EAAE,SAAiB,KAAI;AACpE,gBAAA,MAAM,MAAM,GAAG,SAAS,GAAG,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBAChE,OAAO;oBACL,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,MAAM;AACN,oBAAA,SAAS,EAAE,MAAM,IAAI,KAAK,KAAK,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC;iBAC5D;AACH,YAAA,CAAC;YACD,OAAO;;gBAEL,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;;;gBAGjD,EAAE,EAAE,GAAG,CAAC,QAAQ;;;;;gBAKhB,cAAc,EAAE,eAAe,CAAC,eAAe;AAC/C,gBAAA,WAAW,EAAE,MAAM;;AAEnB,gBAAA,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,GAAG,GAAG,GAAG,MAAM;AAClD,gBAAA,cAAc,EAAE,KAAK,EAAE,MAAM,KAAK,WAAW,GAAG,MAAM,GAAG,GAAG;AAC5D,gBAAA,aAAa,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,GAAG,MAAM,GAAG,GAAG;AACzD,gBAAA,qBAAqB,EAAE,WAAW,CAAC,QAAQ,EAAE;AAC7C,gBAAA,WAAW,EAAE,KAAK,CAAC,QAAQ,EAAE;gBAC7B,kBAAkB,EAAE,CAAC,KAAK,EAAE,UAAU,IAAI,WAAW,EAAE,QAAQ,EAAE;;AAEjE,gBAAA,aAAa,EAAE,GAAG;AAClB,gBAAA,MAAM,EAAE,IAAI;AACZ,gBAAA,aAAa,EAAE;AACb,oBAAA,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC;AACtC,oBAAA,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC;AACtC,oBAAA,WAAW,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI;oBAClC,cAAc;;;oBAGd,WAAW,EAAE,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,GAAG,CAAC,QAAQ,CAAA,EAAG,GAAG,CAAC,aAAa,IAAI,CAAC,GAAG,CAAA,CAAA,EAAI,GAAG,CAAC,aAAa,CAAA,CAAE,GAAG,EAAE,CAAA,CAAE;;AAE3G,oBAAA,WAAW,EAAE;0BACT,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,KAAI;AACjC,4BAAA,MAAM,aAAa,GAAG,OAAQ,CAAC;AAC5B,iCAAA,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,UAAU,KAAK,GAAG,CAAC,UAAU;kCACxD,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;;;AAGzF,4BAAA,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,EAAE,aAAa,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,QAAQ;4BAC7F,OAAO;gCACL,OAAO,EAAE,WAAW,CAAC,KAAK;gCAC1B,MAAM,EAAE,WAAW,CAAC,MAAM;AAC1B,gCAAA,MAAM,EAAE,YAAY;;AAEpB,gCAAA,SAAS,EACP,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,OAAO,CAAC,WAAW;sCAC9D,YAAY,GAAG;AACjB,sCAAE,SAAS;gCACf,aAAa,EAAE,WAAW,CAAC,cAAc;6BAC1C;AACH,wBAAA,CAAC;AACH,0BAAE,SAAS;AACd,iBAAA;;;AAGD,gBAAA,OAAO,EAAE;AACP,oBAAA,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC/B,oBAAA,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;AACjC,oBAAA,UAAU,EAAE,KAAK;;AAEjB,oBAAA,KAAK,EAAE,mDAAmD;oBAC1D,OAAO;oBACP,eAAe,EAAE,eAAe,CAAC,eAAe;AAChD,oBAAA,IAAI,EAAE;wBACJ,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE;wBACjD,cAAc,EAAE,eAAe,CAAC,eAAe;AAC/C,wBAAA,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;;AAEjC,wBAAA,WAAW,EAAE,CAAC;AACd,wBAAA,iBAAiB,EAAE,EAAE;AACrB,wBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;AACnC,wBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;wBACnC,OAAO;;AAEP,wBAAA,qBAAqB,EAAE,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AACzD,wBAAA,mBAAmB,EAAE,OAAO;AAC5B,wBAAA,SAAS,EAAE,WAAW;;;AAGtB,wBAAA,OAAO,EAAE,YAAY;AACrB,wBAAA,WAAW,EAAE,YAAY;wBACzB,OAAO,EAAE,WAAW,GAAG,KAAK;AAC5B,wBAAA,QAAQ,EAAE;8BACN,GAAG,UAAU,CAAC,MAAM,CAAA,CAAA,EAAI,WAAW,CAAC,MAAM,CAAA;8BAC1C,GAAG,WAAW,CAAC,MAAM,CAAA,CAAA,EAAI,UAAU,CAAC,MAAM,CAAA,CAAE;;;AAGhD,wBAAA,MAAM,EAAE,UAAU,GAAG,CAAC,GAAG,WAAW,GAAG,UAAU,GAAG,CAAC;wBACrD,WAAW,EAAE,UAAU,CAAC,OAAO;AAC/B,wBAAA,eAAe,EAAE;4BACf,OAAO,EAAE,UAAU,CAAC,OAAO;4BAC3B,IAAI,EAAE,UAAU,CAAC,IAAI;4BACrB,MAAM,EAAE,UAAU,CAAC,MAAM;4BACzB,QAAQ,EAAE,UAAU,CAAC,QAAQ;AAC9B,yBAAA;wBACD,gBAAgB,EAAE,aAAa,IAAI,GAAG;wBACtC,cAAc,EAAE,WAAW,CAAC,OAAO;wBACnC,MAAM,EAAE,aAAa,GAAG,UAAU,GAAG,WAAW;wBAChD,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,UAAU;wBAChD,IAAI,EAAE,IAAI,CAAC,QAAQ;AACnB,wBAAA,oBAAoB,EAAE,KAAK;AAC5B,qBAAA;AACF,iBAAA;;;AAGD,gBAAA,IAAI,EAAE;AACJ,oBAAA,GAAG,IAAI;oBACP,SAAS,EAAE,eAAe,CAAC,gBAAgB;AAC3C,oBAAA,YAAY,EAAE,KAAK;AACnB,oBAAA,WAAW,EAAE,KAAK;AAClB,oBAAA,gBAAgB,EAAE,aAAa;AACnB,iBAAA;aACf;AACH,QAAA,CAAC,CAAC;QACJ,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE;AAC9C,IAAA,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,mBAAmB,GAAG,OAC1B,OAAgB,EAChB,OAAe,EACf,KAAoB,EACpB,WAAoD,KAC7B;;IAEvB,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,KAAI;AACtD,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA;gBACE,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE;AAC3C,gBAAA,IAAI,EAAE,YAAY;gBAClB,MAAM,EAAE,CAAC,OAAO,CAAC;AACjB,gBAAA,SAAS,EAAE,KAAK;AACjB,aAAA;SACF;;QAED,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,EAAE;YACpC,KAAK,CAAC,IAAI,CAAC;gBACT,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE;AAC3C,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,MAAM,EAAE,EAAE;AACV,gBAAA,SAAS,EAAE,KAAK;AACjB,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,CAAC;AACF,IAAA,MAAM,sBAAsB,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,CAAC;;IAGhG,MAAM,OAAO,GAAU,EAAE;AACzB,IAAA,MAAM,YAAY,GAAyB,IAAI,GAAG,EAAE;IACpD,IAAI,WAAW,GAAG,CAAC;AAEnB,IAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;;QAElB,OAAO,CAAC,IAAI,CAAC,sBAAsB,GAAG,WAAW,CAAC,CAAC;AACnD,QAAA,WAAW,EAAE;;QAGb,IAAI,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,EAAE;YACpC,YAAY,CAAC,GAAG,CACd,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAY,EACrD,sBAAsB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CACpD;AACD,YAAA,WAAW,EAAE;QACf;AACF,IAAA,CAAC,CAAC;IACF,MAAM,aAAa,GAAQ,EAAE;IAC7B,MAAM,YAAY,GAAQ,EAAE;IAE5B,OAAO,EAAE,OAAO,CAAC,CAAC,OAAY,EAAE,KAAa,KAC3C,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAU,KAAI;AAChC,QAAA,IAAI,EAAE,GAAG,CAAC,EAAE;YACV,aAAa,CAAC,IAAI,CAAC;AACjB,gBAAA,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AAC3D,gBAAA,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,GAAG,aAAa,GAAG,UAAU;gBAC9E,MAAM,EAAE,CAAC,EAAE,CAAC;AACZ,gBAAA,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;AACnB,aAAA,CAAC;YACF,aAAa,CAAC,IAAI,CAAC;AACjB,gBAAA,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AAC3D,gBAAA,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,GAAG,iBAAiB,GAAG,kBAAkB;gBAC1F,MAAM,EAAE,CAAC,EAAE,CAAC;AACZ,gBAAA,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;AACnB,aAAA,CAAC;YACF,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC;QAC7C;IACF,CAAC,CAAC,CACH;AACD,IAAA,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,CAAC;IAC5E,MAAM,MAAM,GAAG,EAAE;AAEjB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC5C,QAAA,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACnC,IAAI,IAAI,GAAc,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI;AAEjD,QAAA,IAAI,mBAAmB,GAAG,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CACzD,CAAC,UAAU,KAAK,UAAU,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CACjH,EAAE,KAAK;AAER,QAAA,IAAI,gBAAgB,GAAG,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CACtD,CAAC,UAAuB,KACtB,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,CACtG,EAAE,KAAK;AAER,QAAA,IAAI,mBAAmB,KAAK,SAAS,EAAE;AACrC,YAAA,IAAI;gBACF,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,GAAG,aAAa,CAAA,sBAAA,EAAyB,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA,OAAA,EAAU,IAAI,EAAE,OAAO,CAAA,CAAE,CAC1G;AACD,gBAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC;gBACjF,mBAAmB,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC;YACpD;AAAE,YAAA,MAAM;gBACN,mBAAmB,GAAG,CAAC;YACzB;QACF;AACA,QAAA,IAAI,gBAAgB,KAAK,SAAS,EAAE;AAClC,YAAA,IAAI;gBACF,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,GAAG,aAAa,CAAA,sBAAA,EAAyB,IAAI,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,CAAA,OAAA,EAAU,IAAI,EAAE,OAAO,CAAA,CAAE,CAC5G;AACD,gBAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,KAAK,CAAC;gBACnF,gBAAgB,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC;YACjD;AAAE,YAAA,MAAM;gBACN,gBAAgB,GAAG,CAAC;YACtB;QACF;AAEA,QAAA,IAAI,GAAG;AACL,YAAA,GAAG,IAAI;AACP,YAAA,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE;AAC9C,YAAA,mBAAmB,EAAE,mBAAmB,EAAE,QAAQ,EAAE;SACrD;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAY,CAAC,IAAI,KAAK;QAErG,MAAM,IAAI,GACR,YAAY,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC;AAC9B,cAAE;AACE,gBAAA,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO;AACvC,gBAAA,EAAE,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;AAC/C,gBAAA,MAAM,EAAE,CACN,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,EACxG,QAAQ,EAAE;AACZ,gBAAA,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE;AACpD,gBAAA,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,QAAQ,EAAE;gBAC7D,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;AACxD,gBAAA,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE;AACjD,gBAAA,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,QAAQ,EAAE;AACzD,gBAAA,kBAAkB,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,kBAAkB,CAAC,QAAQ,EAAE;AACvE,gBAAA,qBAAqB,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC,QAAQ,EAAE;AAC7E,gBAAA,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,QAAQ,EAAE;AAC7D,gBAAA,cAAc,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACnD,MAAM;gBACN,IAAI;AACL;AACH,cAAE;AACE,gBAAA,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO;AACvC,gBAAA,EAAE,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;AAC/C,gBAAA,aAAa,EAAE,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE;gBAClE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACvC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gBACxD,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACxC,kBAAkB,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACnD,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;AAC9C,gBAAA,cAAc,EAAE,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACnD,MAAM;gBACN,IAAI;aACL;AACP,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IACnB;AAEA,IAAA,OAAO,MAAM;AACf,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"fetchUsersBondsEVM.js","sources":["../../../../src/adapters/evm/state/fetchUsersBondsEVM.ts"],"sourcesContent":["import billAbi from '../../../config/abi/BOND_2_0_0.json'\nimport multicall from '../utils/multicall'\nimport { UserBill, UserOwnedBillsData } from '../../../types/yourbonds'\nimport { BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../../../state/tokenPrices/useTokenPrices'\nimport { BondsData } from '../../../types/bonds'\nimport { apiGet } from '../../../utils/httpClient'\nimport { PRICE_API_URL } from '../../../config/constants/variables'\nimport partition from 'lodash-es/partition.js'\nimport APE_BOND_POSITION_ADAPTER_ABI from '../../../config/abi/apeBondPositionAdapter.json'\nexport const fetchUsersBondsEVM = async (\n chainId: ChainId,\n account: string,\n bondData: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserOwnedBillsData[]> => {\n try {\n if (!account) {\n return []\n }\n const [lpStakingBonds, bonds] = partition(bondData, (bond) => bond.billType === 'lpStaking')\n\n // Fetch and set user owned bill data without NFT Data\n const userOwnedBills = await fetchUserOwnedBills(chainId, account, bonds, tokenPrices)\n const mapUserOwnedBills = bonds.map((bill: BillsConfig) =>\n userOwnedBills.filter((b) => b.address.toLowerCase() === bill.contractAddress[bill.chainId]?.toLowerCase()),\n )\n const userOwnedBillsData = bonds.map((bill: BillsConfig, i: number) => ({\n index: bill.index,\n userOwnedBills: mapUserOwnedBills[i],\n }))\n\n const combinedData = userOwnedBillsData.map((data) => {\n const enrichedUserBills = data.userOwnedBills.map((bill) => {\n return {\n ...bill,\n }\n })\n return {\n ...data,\n userOwnedBills: enrichedUserBills,\n }\n })\n\n // Isolated, so a failed LP staking read (campaigns multicall, RPC) doesn't fail the chain's regular bills\n const lpStakingData =\n lpStakingBonds.length > 0\n ? await fetchUserLpStakingBonds(chainId, account, lpStakingBonds).catch((e) => {\n console.error('Error fetching LP staking positions:', e)\n return []\n })\n : []\n\n return Promise.resolve([...combinedData, ...lpStakingData])\n } catch (error) {\n console.error('Error fetching user owned bills data:', error)\n return Promise.reject(error)\n }\n}\n\n// REAL's API only answers browsers from origins it allowlists, so it's called through ape.bond's proxy, which\n// forwards to REAL's API (test stack or mainnet, set on ape.bond's side).\n// TODO: staging proxy for now; switch to the production one (https://ape.bond/api/real-lp) once it's deployed.\nconst REAL_LP_API = 'https://staging.ape.bond/api/real-lp'\n// A position's page on REAL's site, where its bonus and pool rewards are claimed.\n// TODO: test site for now; REAL will send the production URL when mainnet is live.\nconst REAL_LP_DASHBOARD = 'https://staking-test.real.finance/lp/dashboard'\n\n// REAL's /rewards/<wallet>: the pool (epoch) rewards, lifetime figures. Only the fields used below are typed.\ninterface RealLpRewards {\n tokens: { token: string; symbol: string; decimals: number; claims_enabled: boolean }[]\n positions: { lineage_id: string; tokens: { token: string; claimable_wei: string }[] }[]\n}\n\n// One row of REAL's /positions/<wallet>: one episode of a position, i.e. one NFT while it sits in the vault.\n// Only the fields used below are typed.\ninterface RealLpPosition {\n token_id: string\n lineage_id: string\n next_episode_id: string | null\n stake_ordinal: number\n status: 'active' | 'rebalanced' | 'unstaked'\n tick_lower: number\n tick_upper: number\n liquidity_wei: string\n principal_usd: string\n value_usd_now: string | null\n apebond: {\n campaign_id: string\n deposited_at: number\n bonus: {\n token: string\n amount_wei: string\n unlock_at: number\n status: 'reserved' | 'claimable' | 'claimed' | 'forfeited'\n claimed_at: number | null\n token_id: string\n } | null\n } | null\n}\n\n/**\n * Raw token amounts (wei) a Uniswap v3 position holds at the pool's current tick: all token0 below its range, all\n * token1 above it, both inside. Floating point: it's for display only.\n */\nconst getPositionAmounts = (liquidity: number, tickLower: number, tickUpper: number, currentTick: number) => {\n const sqrtPrice = (tick: number) => Math.pow(1.0001, tick / 2)\n const sqrtLower = sqrtPrice(tickLower)\n const sqrtUpper = sqrtPrice(tickUpper)\n const sqrtCurrent = sqrtPrice(Math.min(Math.max(currentTick, tickLower), tickUpper))\n return {\n amount0: (liquidity * (sqrtUpper - sqrtCurrent)) / (sqrtCurrent * sqrtUpper),\n amount1: liquidity * (sqrtCurrent - sqrtLower),\n }\n}\n\n/**\n * The user's LP staking positions, shaped as purchased bonds. A position has no bill: it's a Uniswap v3 NFT staked\n * in REAL's vault, and what ApeBond pays is its bonus, reserved in REAL's escrow until the cliff. So each position\n * becomes one bill whose payout is that bonus, vesting all at once at the cliff (`vestingCliff` = `vestingTerm`).\n * Claims happen on REAL's site, so the bills are marked paused (the row's claim button would call `redeem` on the\n * vault). See docs/lp-staking-bonds/2026-10-23-real-lp-positions-rewards-api.md.\n */\nconst fetchUserLpStakingBonds = async (\n chainId: ChainId,\n account: string,\n lpStakingBonds: BillsConfig[],\n): Promise<UserOwnedBillsData[]> => {\n let rows: RealLpPosition[]\n let assetPriceUsd: string | undefined\n let assetIsToken0 = true\n let currentTick = 0\n let rewards: RealLpRewards | undefined\n try {\n const [response, rewardsResponse] = await Promise.all([\n apiGet<{\n current_tick: number\n current_price_usd: string\n asset_is_token0: boolean\n positions: RealLpPosition[]\n }>(`${REAL_LP_API}/positions/${account}`),\n // The positions still show without their pool rewards if this fails\n apiGet<RealLpRewards>(`${REAL_LP_API}/rewards/${account}`).catch((error) => {\n console.error('Error fetching LP staking rewards:', error)\n return undefined\n }),\n ])\n rewards = rewardsResponse\n rows = response?.positions ?? []\n assetPriceUsd = response?.current_price_usd\n assetIsToken0 = response?.asset_is_token0 ?? true\n currentTick = response?.current_tick ?? 0\n } catch (error) {\n // Don't fail the chain's regular bonds because REAL's API is unreachable (or refuses our origin)\n console.error('Error fetching LP staking positions:', error)\n return []\n }\n\n // All episodes of a position share its lineage_id; the one with no next episode is its current state.\n // Only positions bought through ApeBond have an apebond block.\n const currentPositions = rows.filter((row) => row.apebond && row.next_episode_id === null)\n\n // Each campaign's bonus rate and minimum bonus, for the minimum position value that earns a bonus.\n // campaigns() → (enabled, downTicks, upTicks, toleranceTicks, bonusCliffSeconds, bonusBps, minBonusAmount)\n const campaigns = await multicall(\n chainId,\n APE_BOND_POSITION_ADAPTER_ABI,\n lpStakingBonds.map((bond) => ({\n address: bond.lpStakingConfig!.adapter,\n name: 'campaigns',\n params: [bond.lpStakingConfig!.campaignId],\n })),\n )\n\n return lpStakingBonds.map((bond, bondIndex) => {\n const lpStakingConfig = bond.lpStakingConfig!\n const campaign = campaigns?.[bondIndex]\n const bonusDecimals = lpStakingConfig.bonusRewardToken.decimals[bond.chainId] ?? 18\n const bonusThreshold =\n campaign && Number(campaign[5]) > 0\n ? (Number(campaign[6]) / 10 ** bonusDecimals) * (10000 / Number(campaign[5]))\n : undefined\n const userOwnedBills: UserBill[] = currentPositions\n .filter((row) => row.apebond!.campaign_id.toLowerCase() === lpStakingConfig.campaignId.toLowerCase())\n .map((row) => {\n const { deposited_at: depositedAt, bonus } = row.apebond!\n // No bonus when the purchase was below the campaign minimum; forfeited bonuses have amount 0\n const amount = bonus?.amount_wei ?? '0'\n const cliff = bonus ? bonus.unlock_at - depositedAt : 0\n const chainId = bond.chainId\n const bonusToken = lpStakingConfig.bonusRewardToken\n // The pool is the bonus token ($ASSET) paired with the bond's principal token (USDC)\n const assetToken = {\n address: bonusToken.address[chainId] ?? '',\n symbol: bonusToken.symbol,\n name: bonusToken.symbol,\n decimals: bonusToken.decimals,\n }\n const pairedToken = {\n address: bond.lpToken.address[chainId] ?? '',\n symbol: bond.lpToken.symbol,\n name: bond.lpToken.symbol,\n decimals: bond.lpToken.decimals,\n }\n // Value of the position when it was staked: what the buyer paid, minus the zap fees and the change returned\n const principalUsd = parseFloat(row.principal_usd ?? '0')\n // Value of the position now (null once unstaked: the vault no longer holds it)\n const valueUsdNow = parseFloat(row.value_usd_now ?? '0')\n const assetPrice = parseFloat(assetPriceUsd ?? '0')\n // What the staked position holds now. An unstaked position is back in the wallet, so nothing is staked.\n // current_price_usd is $ASSET's price in USDC, and USDC is counted at $1 (as REAL's value_usd_now does).\n const { amount0, amount1 } =\n row.status === 'unstaked'\n ? { amount0: 0, amount1: 0 }\n : getPositionAmounts(parseFloat(row.liquidity_wei), row.tick_lower, row.tick_upper, currentTick)\n const [token0, token1] = assetIsToken0 ? [assetToken, pairedToken] : [pairedToken, assetToken]\n const toStakedToken = (token: typeof assetToken, rawAmount: number) => {\n const amount = rawAmount / 10 ** (token.decimals[chainId] ?? 18)\n return {\n address: token.address,\n symbol: token.symbol,\n amount,\n amountUsd: amount * (token === assetToken ? assetPrice : 1),\n }\n }\n return {\n // Rows are matched to their bond by contract address; for LP staking that's the vault\n address: bond.contractAddress[bond.chainId] ?? '',\n // The position's current NFT, the one REAL's page link uses. After a rebalance past the cliff the escrow\n // still pays on the NFT id the position had at the cliff (bonus.token_id), which has no field here.\n id: row.token_id,\n // The NFT contract is the position manager. The price range (price_lower_usd / price_upper_usd,\n // range_status_now) has no field.\n // Neither do the position's status (an unstaked position still shows, with its bonus as the API reports\n // it) and `finalized` (false for ~13 min after a purchase).\n billNftAddress: lpStakingConfig.positionManager,\n totalPayout: amount,\n // What's left to receive: everything until it's claimed (or forfeited, where amount is 0)\n payout: bonus?.status === 'claimed' ? '0' : amount,\n pendingRewards: bonus?.status === 'claimable' ? amount : '0',\n payoutClaimed: bonus?.status === 'claimed' ? amount : '0',\n vestingStartTimestamp: depositedAt.toString(),\n vestingTerm: cliff.toString(),\n lastBlockTimestamp: (bonus?.claimed_at ?? depositedAt).toString(),\n // No price per payout token: the bonus is a share of the position's value\n truePricePaid: '0',\n paused: true,\n lpStakingData: {\n token0: toStakedToken(token0, amount0),\n token1: toStakedToken(token1, amount1),\n bonusStatus: bonus?.status ?? null,\n bonusThreshold,\n // The position's page on REAL's site. The ordinal is only appended from 2 on (an NFT staked again by\n // hand after an unstake); older ids of the lineage redirect to the current one.\n positionUrl: `${REAL_LP_DASHBOARD}/${row.token_id}${row.stake_ordinal >= 2 ? `-${row.stake_ordinal}` : ''}`,\n // Matched by lineage_id, shared by every episode of the position (it survives rebalances)\n poolRewards: rewards\n ? rewards.tokens.map((rewardToken) => {\n const positionToken = rewards!.positions\n .find((position) => position.lineage_id === row.lineage_id)\n ?.tokens.find((token) => token.token.toLowerCase() === rewardToken.token.toLowerCase())\n // claimable_wei is what's earned and not claimed yet; $ASSET can't be claimed before\n // claims_enabled (mainnet launch + REAL's timelock)\n const rewardAmount = Number(positionToken?.claimable_wei ?? '0') / 10 ** rewardToken.decimals\n return {\n address: rewardToken.token,\n symbol: rewardToken.symbol,\n amount: rewardAmount,\n // Only $ASSET has a price (current_price_usd); REAL's API doesn't price $OVTR\n amountUsd:\n rewardToken.token.toLowerCase() === assetToken.address.toLowerCase()\n ? rewardAmount * assetPrice\n : undefined,\n claimsEnabled: rewardToken.claims_enabled,\n }\n })\n : undefined,\n },\n // What api-v2 provides for regular bills, here from REAL's API (useUserBonds doesn't send LP staking\n // bills to api-v2)\n nftData: {\n tokenId: parseInt(row.token_id),\n billNftId: parseInt(row.token_id),\n processing: false,\n // The position NFT is a Uniswap v3 position with no bond art\n image: 'https://www.ape.bond/images/bills/hidden-bill.jpg',\n chainId,\n contractAddress: lpStakingConfig.positionManager,\n data: {\n billContract: bond.contractAddress[chainId] ?? '',\n billNftAddress: lpStakingConfig.positionManager,\n billNftId: parseInt(row.token_id),\n // Not in REAL's API\n blockNumber: 0,\n bondArtCollection: '',\n bondPartner: bond.bondPartner ?? '',\n bondVersion: bond.billVersion ?? '',\n chainId,\n // The purchase opened the position's first episode, whose id is <token_id>-<opening tx hash>\n createTransactionHash: row.lineage_id.split('-')[1] ?? '',\n createdAddressOwner: account,\n createdAt: depositedAt,\n // The amount paid isn't in REAL's API (only in the purchase tx). The principal token is USDC, so the\n // position's USD value at purchase stands in for it.\n deposit: principalUsd,\n dollarValue: principalUsd,\n expires: depositedAt + cliff,\n pairName: assetIsToken0\n ? `${assetToken.symbol}-${pairedToken.symbol}`\n : `${pairedToken.symbol}-${assetToken.symbol}`,\n // The position's current value (used by the share image), in $ASSET (the payout token) so that\n // payout × payoutTokenPrice gives value_usd_now back. The bonus itself is in the bill's payout fields.\n payout: assetPrice > 0 ? valueUsdNow / assetPrice : 0,\n payoutToken: assetToken.address,\n payoutTokenData: {\n address: assetToken.address,\n name: assetToken.name,\n symbol: assetToken.symbol,\n decimals: assetToken.decimals,\n },\n payoutTokenPrice: assetPriceUsd ?? '0',\n principalToken: pairedToken.address,\n token0: assetIsToken0 ? assetToken : pairedToken,\n token1: assetIsToken0 ? pairedToken : assetToken,\n type: bond.billType,\n vestingPeriodSeconds: cliff,\n },\n },\n // The bonus is paid in the bonus token, not the bond's earnToken, and only unlocks at the cliff.\n // The $OVTR and $ASSET staking rewards (REAL's /rewards/<wallet>) have no field.\n bond: {\n ...bond,\n earnToken: lpStakingConfig.bonusRewardToken,\n vestingCliff: cliff,\n vestingTerm: cliff,\n payoutTokenPrice: assetPriceUsd,\n } as BondsData,\n }\n })\n return { index: bond.index, userOwnedBills }\n })\n}\n\nconst fetchUserOwnedBills = async (\n chainId: ChainId,\n account: string,\n bonds: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserBill[]> => {\n // Maps all the bills in the list repo to make a call to each of them to get Bills Id and paused state (only for V4)\n const billIdAndPausedCalls = bonds.flatMap((b, index) => {\n const calls = [\n {\n address: b.contractAddress[b.chainId] ?? '',\n name: 'getBillIds',\n params: [account],\n bondIndex: index,\n },\n ]\n // Only add paused call for V4 bonds\n if (b.billVersion === BillVersion.V4) {\n calls.push({\n address: b.contractAddress[b.chainId] ?? '',\n name: 'paused',\n params: [],\n bondIndex: index,\n })\n }\n return calls\n })\n const billIdAndPausedResults = await multicall(chainId, billAbi, billIdAndPausedCalls, true, 15)\n\n // Separate billIds and pausedStates from results, tracking which bonds have paused calls\n const billIds: any[] = []\n const pausedStates: Map<string, boolean> = new Map()\n let resultIndex = 0\n\n bonds.forEach((b) => {\n // First result is always getBillIds\n billIds.push(billIdAndPausedResults?.[resultIndex])\n resultIndex++\n\n // Next result is paused only if V4\n if (b.billVersion === BillVersion.V4) {\n pausedStates.set(\n b.contractAddress[b.chainId]?.toLowerCase() as string,\n billIdAndPausedResults?.[resultIndex]?.[0] ?? false,\n )\n resultIndex++\n }\n })\n const billDataCalls: any = []\n const billVersions: any = []\n\n billIds?.forEach((idArray: any, index: number) =>\n idArray[0].forEach((id: bigint) => {\n if (id > 0) {\n billDataCalls.push({\n address: bonds[index].contractAddress[bonds[index].chainId],\n name: bonds[index].billVersion !== BillVersion.V1 ? 'getBillInfo' : 'billInfo',\n params: [id],\n bond: bonds[index],\n })\n billDataCalls.push({\n address: bonds[index].contractAddress[bonds[index].chainId],\n name: bonds[index].billVersion !== BillVersion.V1 ? 'claimablePayout' : 'pendingPayoutFor',\n params: [id],\n bond: bonds[index],\n })\n billVersions.push(bonds[index].billVersion)\n }\n }),\n )\n const billData = await multicall(chainId, billAbi, billDataCalls, true, 150)\n const result = []\n\n for (let i = 0; i < billVersions.length; i++) {\n const billPos = i === 0 ? 0 : i * 2\n let bond: BondsData = billDataCalls[billPos].bond\n\n let principalTokenPrice = tokenPrices?.[bond.chainId]?.find(\n (tokenPrice) => tokenPrice.tokenAddress?.toLowerCase() === bond?.lpToken?.address?.[bond.chainId]?.toLowerCase(),\n )?.price\n\n let payoutTokenPrice = tokenPrices?.[bond.chainId]?.find(\n (tokenPrice: TokenPrices) =>\n tokenPrice?.tokenAddress?.toLowerCase() === bond?.earnToken?.address?.[bond.chainId]?.toLowerCase(),\n )?.price\n\n if (principalTokenPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond?.lpToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n console.log('Individual call for: ', bond.lpToken.symbol, '. Price: ', res.price)\n principalTokenPrice = parseFloat(res.price ?? '0')\n } catch {\n principalTokenPrice = 0\n }\n }\n if (payoutTokenPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond?.earnToken?.address?.[bond?.chainId]}&chain=${bond?.chainId}`,\n )\n console.log('Individual call for: ', bond.earnToken.symbol, '. Price: ', res.price)\n payoutTokenPrice = parseFloat(res.price ?? '0')\n } catch {\n payoutTokenPrice = 0\n }\n }\n\n bond = {\n ...bond,\n payoutTokenPrice: payoutTokenPrice?.toString(),\n principalTokenPrice: principalTokenPrice?.toString(),\n }\n const paused = pausedStates.get(bond.contractAddress[bond.chainId]?.toLowerCase() as string) ?? false\n\n const data =\n billVersions[i] !== BillVersion.V1\n ? {\n address: billDataCalls[billPos].address,\n id: billDataCalls[billPos].params[0].toString(),\n payout: (\n BigInt(billData[billPos][0]?.payout.toString()) - BigInt(billData[billPos][0]?.payoutClaimed.toString())\n ).toString(),\n totalPayout: billData[billPos][0]?.payout.toString(),\n payoutClaimed: billData[billPos][0]?.payoutClaimed.toString(),\n billNftAddress: bond.billNnftAddress[bond.chainId] ?? '',\n vesting: billData[billPos][0]?.vesting.toString(),\n vestingTerm: billData[billPos][0]?.vestingTerm.toString(),\n lastBlockTimestamp: billData[billPos][0]?.lastClaimTimestamp.toString(),\n vestingStartTimestamp: billData[billPos][0]?.vestingStartTimestamp.toString(),\n truePricePaid: billData[billPos][0]?.truePricePaid.toString(),\n pendingRewards: billData[billPos + 1][0].toString(),\n paused,\n bond,\n }\n : {\n address: billDataCalls[billPos].address,\n id: billDataCalls[billPos].params[0].toString(),\n payoutClaimed: billData?.[billPos]?.[0]?.payoutClaimed?.toString(),\n payout: billData[billPos][0].toString(),\n billNftAddress: bond.billNnftAddress[bond.chainId] ?? '',\n vesting: billData[billPos][1].toString(),\n lastBlockTimestamp: billData[billPos][2].toString(),\n truePricePaid: billData[billPos][3].toString(),\n pendingRewards: billData[billPos + 1][0].toString(),\n paused,\n bond,\n }\n result.push(data)\n }\n\n return result\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -57,13 +57,17 @@ const useSoulZapLpStakingQuote = (typedValue, inputCurrency, bond, account) => {
|
|
|
57
57
|
if (!zapInputData)
|
|
58
58
|
return null;
|
|
59
59
|
return [
|
|
60
|
-
'
|
|
60
|
+
'zapLpStakingDetails',
|
|
61
61
|
zapInputData.chain,
|
|
62
62
|
zapInputData.user,
|
|
63
63
|
zapInputData.lpData.lpType,
|
|
64
64
|
zapInputData.lpData.fromToken,
|
|
65
65
|
zapInputData.lpData.fromAmount,
|
|
66
66
|
zapInputData.lpData.slippage,
|
|
67
|
+
zapInputData.lpData.pool,
|
|
68
|
+
zapInputData.lpData.positionManager,
|
|
69
|
+
zapInputData.protocolData.adapter,
|
|
70
|
+
zapInputData.protocolData.campaignId,
|
|
67
71
|
];
|
|
68
72
|
}, [zapInputData]);
|
|
69
73
|
const fetchZapDetails = async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSoulZapLpStakingQuote.js","sources":["../../../../../src/adapters/evm/state/lpStaking/useSoulZapLpStakingQuote.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { getChainParam } from '../../../../state/zap/getChainParam'\nimport { apiPost } from '../../../../utils/httpClient'\nimport { useQuery } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../../../config/constants/queryKeys'\nimport useCurrencyPrice from '../../../../state/price/useCurrencyPrice'\nimport { BondsData } from '../../../../types/bonds'\nimport { useSlippage } from '../../../../state/slippage/useSlippage'\nimport useDebounce from '../../../../hooks/useDebounce'\nimport { WNATIVE, zapInputTokens } from '@ape.swap/apeswap-lists'\nimport { SOUL_ZAP_API } from '../../../../config/constants/variables'\nimport { formatUnits, parseUnits } from '../../../../utils/fixedPoint'\nimport multicall from '../../utils/multicall'\nimport APE_BOND_POSITION_ADAPTER_ABI from '../../../../config/abi/apeBondPositionAdapter.json'\n\nconst useSoulZapLpStakingQuote = (\n typedValue: string,\n inputCurrency: 'NATIVE' | Token | undefined,\n bond: BondsData | undefined,\n account?: string,\n): [loading: boolean, response: any, depositAmount: string, error: boolean, trueBondPrice: string | undefined] => {\n const debouncedInput = useDebounce(typedValue, 500)\n const isDebouncing = typedValue !== debouncedInput\n const { evmSlippage: slippage } = useSlippage()\n\n const principalToken = bond?.lpToken as Token\n const chainId = bond?.chainId as ChainId\n const inputCurrencyString =\n inputCurrency === 'NATIVE' ? '0x0000000000000000000000000000000000000000' : inputCurrency?.address[chainId]\n const inputCurrencyDecimals = inputCurrency === 'NATIVE' ? 18 : inputCurrency?.decimals![chainId]\n const chainName = getChainParam(chainId)\n\n const bigishInputAmount = parseUnits(debouncedInput ?? '0', inputCurrencyDecimals ?? 18).toString()\n const lpStakingConfig = bond?.lpStakingConfig\n\n const zapInputData = useMemo(() => {\n if (\n chainName &&\n inputCurrencyString &&\n inputCurrencyDecimals &&\n bigishInputAmount !== 'NaN' &&\n bigishInputAmount !== '0' &&\n lpStakingConfig\n ) {\n return {\n chain: chainName,\n recipient: account ?? '0x0000000000000000000000000000000000000000',\n user: account ?? '0x0000000000000000000000000000000000000000',\n integrator: 'apebond',\n lpData: {\n fromToken: inputCurrencyString,\n fromAmount: bigishInputAmount,\n lpType: lpStakingConfig.lpType,\n positionManager: lpStakingConfig.positionManager,\n pool: lpStakingConfig.pool,\n slippage,\n tickLower: '0', //TODO add this\n tickUpper: '0', //TODO add this\n },\n protocolData: {\n protocol: 'RealFinance',\n adapter: lpStakingConfig.adapter,\n campaignId: lpStakingConfig.campaignId,\n },\n }\n }\n }, [account, bigishInputAmount, chainName, inputCurrencyDecimals, inputCurrencyString, lpStakingConfig, slippage])\n\n const queryKey = useMemo(() => {\n if (!zapInputData) return null\n return [\n 'zapBondDetails',\n zapInputData.chain,\n zapInputData.user,\n zapInputData.lpData.lpType,\n zapInputData.lpData.fromToken,\n zapInputData.lpData.fromAmount,\n zapInputData.lpData.slippage,\n ]\n }, [zapInputData])\n\n const fetchZapDetails = async () => {\n console.log('fetching zap ')\n // The campaign fixes the tick range around the current pool price, so it's read right before each quote\n const res = await multicall(chainId, APE_BOND_POSITION_ADAPTER_ABI, [\n { address: lpStakingConfig!.adapter, name: 'campaignRange', params: [lpStakingConfig!.campaignId] },\n ])\n if (!res[0]) throw new Error('Could not read the campaign tick range')\n\n const [tickLower, tickUpper] = res[0]\n\n const response = await apiPost<any>(SOUL_ZAP_API, {\n ...zapInputData,\n lpData: { ...zapInputData!.lpData, tickLower: Number(tickLower), tickUpper: Number(tickUpper) },\n })\n return response?.result?.data ?? response\n }\n\n const {\n data: response,\n isLoading,\n isFetching,\n error,\n } = useQuery({\n queryKey: [QUERY_KEYS.ZAP_TOKEN_QUOTE, queryKey],\n queryFn: fetchZapDetails,\n refetchInterval: 60000, // i.e. 60 sec\n staleTime: 60000,\n enabled: !!queryKey,\n retry: 1,\n })\n const zapError = !!error\n\n const tokenList = zapInputTokens[chainId] ? zapInputTokens[chainId] : []\n\n // toToken0 data\n const toToken0Estimate: string | undefined = response?.lpQuote?.token0?.fromAmountEstimate\n const toToken0 = [...tokenList, principalToken]?.find(\n (token) => token?.address?.[chainId]?.toLowerCase() === response?.lpQuote?.token0?.address?.toLowerCase(),\n )\n const toToken0Price = useCurrencyPrice(toToken0 ?? null, chainId)\n\n // toToken1 data\n const toToken1Estimate: string | undefined = response?.lpQuote?.token1?.fromAmountEstimate\n const toToken1 = zapInputTokens[chainId]?.find(\n (token) => token.address[chainId]?.toLowerCase() === response?.lpQuote?.token1?.address?.toLowerCase(),\n )\n const toToken1Price = useCurrencyPrice(toToken1 ?? null, chainId)\n\n let toToken0USD =\n Number(formatUnits(toToken0Estimate ?? '0', toToken0?.decimals![chainId] ?? 18)) * (toToken0Price?.price ?? 0) // this is amount of swap output, converted to usd price\n\n if (response?.lpQuote?.token0?.fromAmountUSD) {\n toToken0USD = Number(response?.lpQuote?.token0?.fromAmountUSD)\n }\n\n let toToken1USD =\n Number(formatUnits(toToken1Estimate ?? '0', toToken1?.decimals![chainId] ?? 18)) * (toToken1Price?.price ?? 0) // this is amount of swap output, converted to usd price\n\n if (response?.lpQuote?.token1?.fromAmountUSD) {\n toToken1USD = Number(response?.lpQuote?.token1?.fromAmountUSD)\n }\n\n const youSpendUSD = toToken0USD + toToken1USD // youSpendUSD\n const estimatedDepositAmount = youSpendUSD / Number(bond?.principalTokenPrice ?? '0')\n\n const isWrap =\n inputCurrency === 'NATIVE' &&\n bond?.lpToken?.address?.[chainId]?.toLowerCase() === WNATIVE[chainId]?.address?.[chainId]?.toLowerCase()\n\n const isPrincipalToken =\n inputCurrency !== 'NATIVE' && inputCurrency?.address[chainId] === principalToken.address[chainId]\n\n const estimatedDepositAmountToReturn =\n isWrap || isPrincipalToken\n ? (Number(typedValue || '0') * ((100 - bond?.tierBoostRate!) / 100)).toString()\n : estimatedDepositAmount.toString()\n\n const trueBondPrice: string | undefined = response?.protocolQuote?.trueBondPrice\n\n // DEBUG: log tierOptimization when present\n if (response?.protocolQuote?.tierOptimization) {\n const tier = response.protocolQuote.tierOptimization\n const decimals = principalToken?.decimals?.[chainId] ?? 18\n const cost = Number(formatUnits(tier.tierCost, decimals))\n const input = Number(formatUnits(tier.bondInput, decimals))\n const profit = Number(formatUnits(tier.profit, decimals))\n console.log('[ZAP] tierOptimization:', {\n tier: `${tier.previousTier} → ${tier.newTier}`,\n cost: cost.toFixed(6),\n bondInput: input.toFixed(6),\n profit: profit.toFixed(6),\n })\n }\n\n const zapLoading = isDebouncing || isLoading || isFetching\n if (zapLoading) return [true, undefined, '', false, undefined]\n\n return [zapLoading, response, estimatedDepositAmountToReturn, zapError, trueBondPrice]\n}\n\nexport default useSoulZapLpStakingQuote\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useSoulZapLpStakingQuote.js","sources":["../../../../../src/adapters/evm/state/lpStaking/useSoulZapLpStakingQuote.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { ChainId, Token } from '@ape.swap/apeswap-lists'\nimport { getChainParam } from '../../../../state/zap/getChainParam'\nimport { apiPost } from '../../../../utils/httpClient'\nimport { useQuery } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../../../config/constants/queryKeys'\nimport useCurrencyPrice from '../../../../state/price/useCurrencyPrice'\nimport { BondsData } from '../../../../types/bonds'\nimport { useSlippage } from '../../../../state/slippage/useSlippage'\nimport useDebounce from '../../../../hooks/useDebounce'\nimport { WNATIVE, zapInputTokens } from '@ape.swap/apeswap-lists'\nimport { SOUL_ZAP_API } from '../../../../config/constants/variables'\nimport { formatUnits, parseUnits } from '../../../../utils/fixedPoint'\nimport multicall from '../../utils/multicall'\nimport APE_BOND_POSITION_ADAPTER_ABI from '../../../../config/abi/apeBondPositionAdapter.json'\n\nconst useSoulZapLpStakingQuote = (\n typedValue: string,\n inputCurrency: 'NATIVE' | Token | undefined,\n bond: BondsData | undefined,\n account?: string,\n): [loading: boolean, response: any, depositAmount: string, error: boolean, trueBondPrice: string | undefined] => {\n const debouncedInput = useDebounce(typedValue, 500)\n const isDebouncing = typedValue !== debouncedInput\n const { evmSlippage: slippage } = useSlippage()\n\n const principalToken = bond?.lpToken as Token\n const chainId = bond?.chainId as ChainId\n const inputCurrencyString =\n inputCurrency === 'NATIVE' ? '0x0000000000000000000000000000000000000000' : inputCurrency?.address[chainId]\n const inputCurrencyDecimals = inputCurrency === 'NATIVE' ? 18 : inputCurrency?.decimals![chainId]\n const chainName = getChainParam(chainId)\n\n const bigishInputAmount = parseUnits(debouncedInput ?? '0', inputCurrencyDecimals ?? 18).toString()\n const lpStakingConfig = bond?.lpStakingConfig\n\n const zapInputData = useMemo(() => {\n if (\n chainName &&\n inputCurrencyString &&\n inputCurrencyDecimals &&\n bigishInputAmount !== 'NaN' &&\n bigishInputAmount !== '0' &&\n lpStakingConfig\n ) {\n return {\n chain: chainName,\n recipient: account ?? '0x0000000000000000000000000000000000000000',\n user: account ?? '0x0000000000000000000000000000000000000000',\n integrator: 'apebond',\n lpData: {\n fromToken: inputCurrencyString,\n fromAmount: bigishInputAmount,\n lpType: lpStakingConfig.lpType,\n positionManager: lpStakingConfig.positionManager,\n pool: lpStakingConfig.pool,\n slippage,\n tickLower: '0', //TODO add this\n tickUpper: '0', //TODO add this\n },\n protocolData: {\n protocol: 'RealFinance',\n adapter: lpStakingConfig.adapter,\n campaignId: lpStakingConfig.campaignId,\n },\n }\n }\n }, [account, bigishInputAmount, chainName, inputCurrencyDecimals, inputCurrencyString, lpStakingConfig, slippage])\n\n const queryKey = useMemo(() => {\n if (!zapInputData) return null\n return [\n 'zapLpStakingDetails',\n zapInputData.chain,\n zapInputData.user,\n zapInputData.lpData.lpType,\n zapInputData.lpData.fromToken,\n zapInputData.lpData.fromAmount,\n zapInputData.lpData.slippage,\n zapInputData.lpData.pool,\n zapInputData.lpData.positionManager,\n zapInputData.protocolData.adapter,\n zapInputData.protocolData.campaignId,\n ]\n }, [zapInputData])\n\n const fetchZapDetails = async () => {\n console.log('fetching zap ')\n // The campaign fixes the tick range around the current pool price, so it's read right before each quote\n const res = await multicall(chainId, APE_BOND_POSITION_ADAPTER_ABI, [\n { address: lpStakingConfig!.adapter, name: 'campaignRange', params: [lpStakingConfig!.campaignId] },\n ])\n if (!res[0]) throw new Error('Could not read the campaign tick range')\n\n const [tickLower, tickUpper] = res[0]\n\n const response = await apiPost<any>(SOUL_ZAP_API, {\n ...zapInputData,\n lpData: { ...zapInputData!.lpData, tickLower: Number(tickLower), tickUpper: Number(tickUpper) },\n })\n return response?.result?.data ?? response\n }\n\n const {\n data: response,\n isLoading,\n isFetching,\n error,\n } = useQuery({\n queryKey: [QUERY_KEYS.ZAP_TOKEN_QUOTE, queryKey],\n queryFn: fetchZapDetails,\n refetchInterval: 60000, // i.e. 60 sec\n staleTime: 60000,\n enabled: !!queryKey,\n retry: 1,\n })\n const zapError = !!error\n\n const tokenList = zapInputTokens[chainId] ? zapInputTokens[chainId] : []\n\n // toToken0 data\n const toToken0Estimate: string | undefined = response?.lpQuote?.token0?.fromAmountEstimate\n const toToken0 = [...tokenList, principalToken]?.find(\n (token) => token?.address?.[chainId]?.toLowerCase() === response?.lpQuote?.token0?.address?.toLowerCase(),\n )\n const toToken0Price = useCurrencyPrice(toToken0 ?? null, chainId)\n\n // toToken1 data\n const toToken1Estimate: string | undefined = response?.lpQuote?.token1?.fromAmountEstimate\n const toToken1 = zapInputTokens[chainId]?.find(\n (token) => token.address[chainId]?.toLowerCase() === response?.lpQuote?.token1?.address?.toLowerCase(),\n )\n const toToken1Price = useCurrencyPrice(toToken1 ?? null, chainId)\n\n let toToken0USD =\n Number(formatUnits(toToken0Estimate ?? '0', toToken0?.decimals![chainId] ?? 18)) * (toToken0Price?.price ?? 0) // this is amount of swap output, converted to usd price\n\n if (response?.lpQuote?.token0?.fromAmountUSD) {\n toToken0USD = Number(response?.lpQuote?.token0?.fromAmountUSD)\n }\n\n let toToken1USD =\n Number(formatUnits(toToken1Estimate ?? '0', toToken1?.decimals![chainId] ?? 18)) * (toToken1Price?.price ?? 0) // this is amount of swap output, converted to usd price\n\n if (response?.lpQuote?.token1?.fromAmountUSD) {\n toToken1USD = Number(response?.lpQuote?.token1?.fromAmountUSD)\n }\n\n const youSpendUSD = toToken0USD + toToken1USD // youSpendUSD\n const estimatedDepositAmount = youSpendUSD / Number(bond?.principalTokenPrice ?? '0')\n\n const isWrap =\n inputCurrency === 'NATIVE' &&\n bond?.lpToken?.address?.[chainId]?.toLowerCase() === WNATIVE[chainId]?.address?.[chainId]?.toLowerCase()\n\n const isPrincipalToken =\n inputCurrency !== 'NATIVE' && inputCurrency?.address[chainId] === principalToken.address[chainId]\n\n const estimatedDepositAmountToReturn =\n isWrap || isPrincipalToken\n ? (Number(typedValue || '0') * ((100 - bond?.tierBoostRate!) / 100)).toString()\n : estimatedDepositAmount.toString()\n\n const trueBondPrice: string | undefined = response?.protocolQuote?.trueBondPrice\n\n // DEBUG: log tierOptimization when present\n if (response?.protocolQuote?.tierOptimization) {\n const tier = response.protocolQuote.tierOptimization\n const decimals = principalToken?.decimals?.[chainId] ?? 18\n const cost = Number(formatUnits(tier.tierCost, decimals))\n const input = Number(formatUnits(tier.bondInput, decimals))\n const profit = Number(formatUnits(tier.profit, decimals))\n console.log('[ZAP] tierOptimization:', {\n tier: `${tier.previousTier} → ${tier.newTier}`,\n cost: cost.toFixed(6),\n bondInput: input.toFixed(6),\n profit: profit.toFixed(6),\n })\n }\n\n const zapLoading = isDebouncing || isLoading || isFetching\n if (zapLoading) return [true, undefined, '', false, undefined]\n\n return [zapLoading, response, estimatedDepositAmountToReturn, zapError, trueBondPrice]\n}\n\nexport default useSoulZapLpStakingQuote\n"],"names":[],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ import LpBondModalHeader from './LpBondModalHeader.js';
|
|
|
30
30
|
import LpStakingEstimations from './LpStakingEstimations.js';
|
|
31
31
|
import useSortedZapList from '../../../../hooks/useSortedZapList.js';
|
|
32
32
|
import { getSymbol } from '../../../../utils/getNativeTicker.js';
|
|
33
|
-
import { formatUSDNumber } from '../../../../utils/displayHelpers.js';
|
|
33
|
+
import { formatUSDNumber, getMaxBuy } from '../../../../utils/displayHelpers.js';
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Buy form of LP staking bonds (`billType === 'lpStaking'`). Kept apart from the regular EVM BuyComponent because the
|
|
@@ -75,6 +75,17 @@ const BuyComponentLpStaking = ({ onDismiss, bondAddress, bondChain, handlePurcha
|
|
|
75
75
|
const spendAmount = parseFloat(inputValue) || 0;
|
|
76
76
|
const youSpendString = `${spendAmount.toLocaleString()} ${getSymbol(inputToken, bondData?.chainId)}${inputTokenPrice ? ` ($${formatUSDNumber((spendAmount * inputTokenPrice).toString())})` : ''}`;
|
|
77
77
|
const isZapSupported = false;
|
|
78
|
+
// Every purchase goes through the zap, so it can't be sent without a quote to send
|
|
79
|
+
const hasZapQuote = !zapError && !!zapData?.txData;
|
|
80
|
+
// maxPayout and the bond's remaining capacity are in the pool's stablecoin (lpToken1), counted at $1. Paying with it
|
|
81
|
+
// needs no price; other tokens are converted with their USD price, and can't be checked without one (the price
|
|
82
|
+
// guard still reverts the tx).
|
|
83
|
+
const stablecoinAddress = bondData?.lpStakingConfig?.lpToken1?.address?.[bondChain]?.toLowerCase();
|
|
84
|
+
const isPayingWithStablecoin = inputToken !== 'NATIVE' && inputToken?.address?.[bondChain]?.toLowerCase() === stablecoinAddress;
|
|
85
|
+
const spendInStablecoin = isPayingWithStablecoin ? spendAmount : spendAmount * (inputTokenPrice ?? 0);
|
|
86
|
+
const maxBuy = getMaxBuy(bondData, true);
|
|
87
|
+
// 0 when the limits couldn't be read; the price guard still applies then
|
|
88
|
+
const exceedsMaxBuy = maxBuy > 0 && spendInStablecoin > maxBuy;
|
|
78
89
|
// Once the buy tx is confirmed, report the new position's NFT id so ModalHandlerLpStaking can show it. The adapter's
|
|
79
90
|
// deposit event has it: topics = [event, tokenId, campaignId, buyer]. It's the token_id REAL's API lists the
|
|
80
91
|
// position under, which is the bill's id.
|
|
@@ -126,7 +137,7 @@ const BuyComponentLpStaking = ({ onDismiss, bondAddress, bondChain, handlePurcha
|
|
|
126
137
|
});
|
|
127
138
|
};
|
|
128
139
|
const handleBuy = async () => {
|
|
129
|
-
if (!bondData || !bondAddress || !bondChain)
|
|
140
|
+
if (!bondData || !bondAddress || !bondChain || !hasZapQuote)
|
|
130
141
|
return;
|
|
131
142
|
if (isWrongChain) {
|
|
132
143
|
try {
|
|
@@ -195,16 +206,23 @@ const BuyComponentLpStaking = ({ onDismiss, bondAddress, bondChain, handlePurcha
|
|
|
195
206
|
bondData?.soldOut ||
|
|
196
207
|
isEmptyInput ||
|
|
197
208
|
exceedsBalance ||
|
|
209
|
+
exceedsMaxBuy ||
|
|
198
210
|
SDKConfig.blockSales ||
|
|
199
|
-
zapLoading
|
|
211
|
+
zapLoading ||
|
|
212
|
+
// Approving doesn't need the quote, buying does
|
|
213
|
+
(isApproved && !hasZapQuote), onClick: isApproved ? handleBuy : handleApprove, children: exceedsBalance
|
|
200
214
|
? 'Exceeds balance'
|
|
201
215
|
: isEmptyInput
|
|
202
216
|
? 'Insert amount'
|
|
203
|
-
:
|
|
204
|
-
?
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
217
|
+
: exceedsMaxBuy
|
|
218
|
+
? 'Exceeds Max Buy. Reduce amount'
|
|
219
|
+
: isApproved
|
|
220
|
+
? zapLoading
|
|
221
|
+
? 'Loading'
|
|
222
|
+
: hasZapQuote
|
|
223
|
+
? 'buy'
|
|
224
|
+
: 'Quote unavailable'
|
|
225
|
+
: 'approve' })) }) })] }) })) : (jsx(Fragment, {}));
|
|
208
226
|
};
|
|
209
227
|
var BuyComponentLpStaking$1 = React.memo(BuyComponentLpStaking);
|
|
210
228
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuyComponentLpStaking.js","sources":["../../../../../src/adapters/evm/views/lpStaking/BuyComponentLpStaking.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useChainId, useSendTransaction, useSwitchChain } from 'wagmi'\nimport { ChainId, MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport type { ChainBuyComponentProps } from '../../../types'\nimport useBondsData from '../../../../state/bonds/useBondsData'\nimport { useSDKConfig } from '../../../../state/useSDKConfig'\nimport { usePopups } from '../../../../state/popups/usePopups'\nimport { useSendReferenceId } from '../../../../hooks/useSendReferenceId'\nimport TokenSelectorPanel from '../../../../components/TokenSelectorPanel'\nimport ConnectButton from '../../../../components/ConnectButton'\nimport ProjectDescription from '../../../../views/BuyBond/components/ProjectDescription'\nimport Flex from '../../../../components/uikit-sdk/Flex'\nimport Button from '../../../../components/uikit-sdk/Button/Button'\nimport { MCBuyComponentStyles } from '../../../../utils/campaignStyles'\nimport { toFixedString } from '../../../../utils/fixedPoint'\nimport { remove0xPrefix } from '../../../../utils/remove0xPrefix'\nimport { reportError } from '../../../../utils/reportError'\nimport track from '../../../../utils/track'\nimport useEVMAccount from '../../state/useEVMAccount'\nimport { ApprovalState, useApproval } from '../../state/useAllowance'\nimport { useMonitorTx } from '../../state/useMonitorTx'\nimport clsx from 'clsx'\nimport BondCards from '../../../../views/BuyBond/components/BondCards/BondCards'\nimport Text from '../../../../components/uikit-sdk/Text'\nimport SafeHTMLComponent from '../../../../components/SafeHTMLComponent'\nimport useSoulZapLpStakingQuote from '../../state/lpStaking/useSoulZapLpStakingQuote'\nimport { parseEther } from 'viem'\nimport useTokenFromZapList from '../../../../hooks/useTokenFromZapList'\nimport { SoulZapTokenManager } from '../../../../config/constants/addresses'\nimport { ZapSupportedChainId } from '../../../../config/constants/variables'\nimport LpBondModalHeader from './LpBondModalHeader'\nimport LpStakingEstimations from './LpStakingEstimations'\nimport useSortedZapList from '../../../../hooks/useSortedZapList'\nimport { getSymbol } from '../../../../utils/getNativeTicker'\nimport { formatUSDNumber } from '../../../../utils/displayHelpers'\n\n/**\n * Buy form of LP staking bonds (`billType === 'lpStaking'`). Kept apart from the regular EVM BuyComponent because the\n * flow is different: no zaps, tiers, bridge or max-buy rules. Rendered inside ModalHandlerLpStaking from the bond list,\n * and directly by ChainBuyComponent elsewhere.\n */\nconst BuyComponentLpStaking: React.FC<ChainBuyComponentProps> = ({\n onDismiss,\n bondAddress,\n bondChain,\n handlePurchasedBond,\n setBillId,\n isProjectView,\n}) => {\n // Hooks\n const SDKConfig = useSDKConfig()\n const userChainId = useChainId()\n const { switchChainAsync } = useSwitchChain()\n const { address: account } = useEVMAccount()\n const { data: bonds } = useBondsData()\n const { addToastError } = usePopups()\n const sendReferenceId = useSendReferenceId()\n const { sendTransactionAsync } = useSendTransaction()\n\n // Bond to be used\n const bondData = useMemo(\n () =>\n bonds?.find(\n (bond) =>\n bond?.contractAddress?.[bond.chainId]?.toLowerCase() === bondAddress?.toLowerCase() &&\n bond.chainId === bondChain,\n ),\n [bonds, bondAddress, bondChain],\n )\n\n // State\n const [buyTxHash, setBuyTxHash] = useState<string | undefined>()\n const [inputValue, setInputValue] = useState('')\n const [loadingTx, setLoadingTx] = useState(false)\n const { isLoading: isConfirming, isSuccess: isConfirmed, data: buyTxReceipt } = useMonitorTx(buyTxHash, bondChain)\n const [inputTokenString, setInputTokenString] = useState(bondData?.lpToken?.address?.[bondData.chainId])\n const inputToken = useTokenFromZapList(inputTokenString, bondData?.chainId, bondData?.lpToken)\n\n const { sortedZapList } = useSortedZapList(bondChain, bondData?.lpToken)\n const enrichedTokenData = sortedZapList.find((item) =>\n item.token === 'NATIVE' || inputToken === 'NATIVE'\n ? item.token === inputToken\n : item?.token?.address?.[bondChain as ChainId]?.toLowerCase() ===\n inputToken?.address?.[bondChain as ChainId]?.toLowerCase(),\n )\n const inputCurrencyBalance = enrichedTokenData?.balance\n\n const inputTokenPrice = enrichedTokenData?.price\n\n // Zap call data\n\n const [zapLoading, zapData, , zapError] = useSoulZapLpStakingQuote(inputValue, inputToken, bondData, account)\n // console.log(zapData)\n\n // Static Data\n const load = loadingTx || (isConfirming && !isConfirmed)\n const isWrongChain = !!bondChain && userChainId !== bondChain\n const exceedsBalance = Number(inputCurrencyBalance ?? '0') < Number(inputValue)\n const isEmptyInput = !inputValue || parseFloat(inputValue) === 0\n\n const spendAmount = parseFloat(inputValue) || 0\n const youSpendString = `${spendAmount.toLocaleString()} ${getSymbol(inputToken, bondData?.chainId)}${inputTokenPrice ? ` ($${formatUSDNumber((spendAmount * inputTokenPrice).toString())})` : ''}`\n const isZapSupported = false\n\n // Once the buy tx is confirmed, report the new position's NFT id so ModalHandlerLpStaking can show it. The adapter's\n // deposit event has it: topics = [event, tokenId, campaignId, buyer]. It's the token_id REAL's API lists the\n // position under, which is the bill's id.\n useEffect(() => {\n if (!buyTxReceipt || !setBillId) return\n try {\n const adapter = bondData?.lpStakingConfig?.adapter?.toLowerCase()\n const campaignId = bondData?.lpStakingConfig?.campaignId?.toLowerCase()\n const depositLog = buyTxReceipt.logs.find(\n (log) => log.address.toLowerCase() === adapter && log.topics[2]?.toLowerCase() === campaignId,\n )\n const tokenIdTopic = depositLog?.topics[1]\n if (tokenIdTopic) setBillId(BigInt(tokenIdTopic).toString())\n } catch (e) {\n console.error(e)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [buyTxReceipt])\n\n // State Handlers\n const handleMaxButton = useCallback(() => {\n setInputValue(inputCurrencyBalance ?? '0')\n }, [inputCurrencyBalance])\n\n const handleCurrencySelect = useCallback((newInputToken: string) => {\n setInputValue('')\n setInputTokenString(newInputToken)\n }, [])\n\n // Approve & Purchase Functions\n const [approvalState, approveCallback] = useApproval(\n inputValue,\n inputToken ?? null,\n SoulZapTokenManager?.[bondData?.chainId as ZapSupportedChainId] ?? null,\n account ?? null,\n bondChain ?? null,\n )\n const isApproved = approvalState === ApprovalState.APPROVED\n\n const handleApprove = async () => {\n if (isWrongChain) {\n try {\n await switchChainAsync({ chainId: bondChain })\n } catch (error: any) {\n addToastError(error.shortMessage)\n return\n }\n }\n await approveCallback()\n track({\n event: 'approveBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n },\n })\n }\n\n const handleBuy = async () => {\n if (!bondData || !bondAddress || !bondChain) return\n\n if (isWrongChain) {\n try {\n await switchChainAsync({ chainId: bondChain })\n } catch (error: any) {\n addToastError(error.shortMessage)\n return\n }\n }\n\n setLoadingTx(true)\n const usdAmount = parseFloat(inputValue) * parseFloat(bondData?.principalTokenPrice ?? '0')\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: usdAmount,\n },\n })\n try {\n const validated18DecimalAmount = toFixedString(inputValue ?? '0', 18, 'trunc')\n const parsedValue = parseEther(validated18DecimalAmount)\n const hash = await sendTransactionAsync({\n to: zapData.txData.to,\n data: zapData.txData.data,\n value: inputToken === 'NATIVE' ? parsedValue : undefined,\n })\n if (hash) {\n setBuyTxHash(hash)\n sendReferenceId(bondAddress, bondChain, hash)\n handlePurchasedBond?.({ buyTxHash: hash })\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-staking-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(bondAddress),\n usdAmount,\n },\n })\n }\n } catch (error: any) {\n console.error('Buy error', error)\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error,\n extraInfo: { type: 'buyLpStakingBond', bondData, error },\n chainId: bondChain,\n account,\n })\n addToastError(error.shortMessage)\n } finally {\n setLoadingTx(false)\n }\n }\n\n return bondData ? (\n <Flex\n className=\"modal-content ape:flex ape:flex-col ape:rounded-[10px] ape:bg-white2 ape:w-full ape:p-3.75 ape:md:p-5\"\n style={{ ...MCBuyComponentStyles[bondData?.marketingCampaign as MarketingCampaign] }}\n >\n <Flex className=\"modaltable-container ape:w-full ape:flex ape:flex-col ape:relative ape:gap-2.5\">\n <LpBondModalHeader bondData={bondData} onDismiss={onDismiss} />\n <ProjectDescription description={bondData.shortDescription} isProjectView={isProjectView} />\n <Flex className={clsx('ape:w-full', isProjectView ? 'ape:flex ape:md:hidden!' : 'ape:flex')}>\n <BondCards bondData={bondData} isDoingMaxBuy={false} />\n </Flex>\n <LpStakingEstimations\n inputValue={inputValue}\n inputTokenPrice={inputTokenPrice}\n bondData={bondData}\n youSpendString={youSpendString}\n isZap={isZapSupported}\n fetchingZapQuote={zapLoading}\n zapError={zapError}\n protocolQuote={zapData?.protocolQuote}\n lpQuote={zapData?.lpQuote}\n />\n <TokenSelectorPanel\n typedValue={inputValue}\n setTypedValue={setInputValue}\n selectedToken={inputToken}\n handleValueBtn={handleMaxButton}\n handleCurrencySelect={handleCurrencySelect}\n bondChainId={bondData?.chainId}\n enableZap={true}\n bondPrincipalToken={bondData?.lpToken}\n tokenBalance={inputCurrencyBalance}\n selectedTokenPrice={parseFloat(bondData?.principalTokenPrice ?? '0')}\n marketingCampaign={bondData?.marketingCampaign}\n isConnected={!!account}\n />\n {bondData?.warningCard && (\n <Flex className=\"ape:w-full ape:rounded-normal ape:p-[2px_10px]\" style={{ background: '#DE62F366' }}>\n <Text as=\"div\" size=\"12px\" className=\"ape:font-normal ape:flex ape:items-center ape:leading-5.5!\">\n <SafeHTMLComponent html={bondData?.warningCard} />\n </Text>\n </Flex>\n )}\n <Flex className=\"modaltable-container button-container ape:w-full ape:flex ape:relative ape:flex-row ape:justify-between\">\n <Flex className=\"button-container buy ape:justify-center ape:items-center ape:cursor-pointer ape:w-full\">\n {!account ? (\n <ConnectButton />\n ) : (\n <Button\n className=\"action-button ape:w-full ape:text-[14px]! ape:lg:text-[16px]!\"\n load={load || approvalState === ApprovalState.PENDING || zapLoading}\n disabled={\n load ||\n approvalState === ApprovalState.PENDING ||\n bondData?.soldOut ||\n isEmptyInput ||\n exceedsBalance ||\n SDKConfig.blockSales ||\n zapLoading\n }\n onClick={isApproved ? handleBuy : handleApprove}\n >\n {exceedsBalance\n ? 'Exceeds balance'\n : isEmptyInput\n ? 'Insert amount'\n : isApproved\n ? zapLoading\n ? 'Loading'\n : 'buy'\n : 'approve'}\n </Button>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n ) : (\n <></>\n )\n}\n\nexport default React.memo(BuyComponentLpStaking)\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BuyComponentLpStaking.js","sources":["../../../../../src/adapters/evm/views/lpStaking/BuyComponentLpStaking.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useChainId, useSendTransaction, useSwitchChain } from 'wagmi'\nimport { ChainId, MarketingCampaign } from '@ape.swap/apeswap-lists'\nimport type { ChainBuyComponentProps } from '../../../types'\nimport useBondsData from '../../../../state/bonds/useBondsData'\nimport { useSDKConfig } from '../../../../state/useSDKConfig'\nimport { usePopups } from '../../../../state/popups/usePopups'\nimport { useSendReferenceId } from '../../../../hooks/useSendReferenceId'\nimport TokenSelectorPanel from '../../../../components/TokenSelectorPanel'\nimport ConnectButton from '../../../../components/ConnectButton'\nimport ProjectDescription from '../../../../views/BuyBond/components/ProjectDescription'\nimport Flex from '../../../../components/uikit-sdk/Flex'\nimport Button from '../../../../components/uikit-sdk/Button/Button'\nimport { MCBuyComponentStyles } from '../../../../utils/campaignStyles'\nimport { toFixedString } from '../../../../utils/fixedPoint'\nimport { remove0xPrefix } from '../../../../utils/remove0xPrefix'\nimport { reportError } from '../../../../utils/reportError'\nimport track from '../../../../utils/track'\nimport useEVMAccount from '../../state/useEVMAccount'\nimport { ApprovalState, useApproval } from '../../state/useAllowance'\nimport { useMonitorTx } from '../../state/useMonitorTx'\nimport clsx from 'clsx'\nimport BondCards from '../../../../views/BuyBond/components/BondCards/BondCards'\nimport Text from '../../../../components/uikit-sdk/Text'\nimport SafeHTMLComponent from '../../../../components/SafeHTMLComponent'\nimport useSoulZapLpStakingQuote from '../../state/lpStaking/useSoulZapLpStakingQuote'\nimport { parseEther } from 'viem'\nimport useTokenFromZapList from '../../../../hooks/useTokenFromZapList'\nimport { SoulZapTokenManager } from '../../../../config/constants/addresses'\nimport { ZapSupportedChainId } from '../../../../config/constants/variables'\nimport LpBondModalHeader from './LpBondModalHeader'\nimport LpStakingEstimations from './LpStakingEstimations'\nimport useSortedZapList from '../../../../hooks/useSortedZapList'\nimport { getSymbol } from '../../../../utils/getNativeTicker'\nimport { formatUSDNumber, getMaxBuy } from '../../../../utils/displayHelpers'\n\n/**\n * Buy form of LP staking bonds (`billType === 'lpStaking'`). Kept apart from the regular EVM BuyComponent because the\n * flow is different: no zaps, tiers, bridge or max-buy rules. Rendered inside ModalHandlerLpStaking from the bond list,\n * and directly by ChainBuyComponent elsewhere.\n */\nconst BuyComponentLpStaking: React.FC<ChainBuyComponentProps> = ({\n onDismiss,\n bondAddress,\n bondChain,\n handlePurchasedBond,\n setBillId,\n isProjectView,\n}) => {\n // Hooks\n const SDKConfig = useSDKConfig()\n const userChainId = useChainId()\n const { switchChainAsync } = useSwitchChain()\n const { address: account } = useEVMAccount()\n const { data: bonds } = useBondsData()\n const { addToastError } = usePopups()\n const sendReferenceId = useSendReferenceId()\n const { sendTransactionAsync } = useSendTransaction()\n\n // Bond to be used\n const bondData = useMemo(\n () =>\n bonds?.find(\n (bond) =>\n bond?.contractAddress?.[bond.chainId]?.toLowerCase() === bondAddress?.toLowerCase() &&\n bond.chainId === bondChain,\n ),\n [bonds, bondAddress, bondChain],\n )\n\n // State\n const [buyTxHash, setBuyTxHash] = useState<string | undefined>()\n const [inputValue, setInputValue] = useState('')\n const [loadingTx, setLoadingTx] = useState(false)\n const { isLoading: isConfirming, isSuccess: isConfirmed, data: buyTxReceipt } = useMonitorTx(buyTxHash, bondChain)\n const [inputTokenString, setInputTokenString] = useState(bondData?.lpToken?.address?.[bondData.chainId])\n const inputToken = useTokenFromZapList(inputTokenString, bondData?.chainId, bondData?.lpToken)\n\n const { sortedZapList } = useSortedZapList(bondChain, bondData?.lpToken)\n const enrichedTokenData = sortedZapList.find((item) =>\n item.token === 'NATIVE' || inputToken === 'NATIVE'\n ? item.token === inputToken\n : item?.token?.address?.[bondChain as ChainId]?.toLowerCase() ===\n inputToken?.address?.[bondChain as ChainId]?.toLowerCase(),\n )\n const inputCurrencyBalance = enrichedTokenData?.balance\n\n const inputTokenPrice = enrichedTokenData?.price\n\n // Zap call data\n\n const [zapLoading, zapData, , zapError] = useSoulZapLpStakingQuote(inputValue, inputToken, bondData, account)\n // console.log(zapData)\n\n // Static Data\n const load = loadingTx || (isConfirming && !isConfirmed)\n const isWrongChain = !!bondChain && userChainId !== bondChain\n const exceedsBalance = Number(inputCurrencyBalance ?? '0') < Number(inputValue)\n const isEmptyInput = !inputValue || parseFloat(inputValue) === 0\n\n const spendAmount = parseFloat(inputValue) || 0\n const youSpendString = `${spendAmount.toLocaleString()} ${getSymbol(inputToken, bondData?.chainId)}${inputTokenPrice ? ` ($${formatUSDNumber((spendAmount * inputTokenPrice).toString())})` : ''}`\n const isZapSupported = false\n // Every purchase goes through the zap, so it can't be sent without a quote to send\n const hasZapQuote = !zapError && !!zapData?.txData\n\n // maxPayout and the bond's remaining capacity are in the pool's stablecoin (lpToken1), counted at $1. Paying with it\n // needs no price; other tokens are converted with their USD price, and can't be checked without one (the price\n // guard still reverts the tx).\n const stablecoinAddress = bondData?.lpStakingConfig?.lpToken1?.address?.[bondChain as ChainId]?.toLowerCase()\n const isPayingWithStablecoin =\n inputToken !== 'NATIVE' && inputToken?.address?.[bondChain as ChainId]?.toLowerCase() === stablecoinAddress\n const spendInStablecoin = isPayingWithStablecoin ? spendAmount : spendAmount * (inputTokenPrice ?? 0)\n const maxBuy = getMaxBuy(bondData, true)\n // 0 when the limits couldn't be read; the price guard still applies then\n const exceedsMaxBuy = maxBuy > 0 && spendInStablecoin > maxBuy\n\n // Once the buy tx is confirmed, report the new position's NFT id so ModalHandlerLpStaking can show it. The adapter's\n // deposit event has it: topics = [event, tokenId, campaignId, buyer]. It's the token_id REAL's API lists the\n // position under, which is the bill's id.\n useEffect(() => {\n if (!buyTxReceipt || !setBillId) return\n try {\n const adapter = bondData?.lpStakingConfig?.adapter?.toLowerCase()\n const campaignId = bondData?.lpStakingConfig?.campaignId?.toLowerCase()\n const depositLog = buyTxReceipt.logs.find(\n (log) => log.address.toLowerCase() === adapter && log.topics[2]?.toLowerCase() === campaignId,\n )\n const tokenIdTopic = depositLog?.topics[1]\n if (tokenIdTopic) setBillId(BigInt(tokenIdTopic).toString())\n } catch (e) {\n console.error(e)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [buyTxReceipt])\n\n // State Handlers\n const handleMaxButton = useCallback(() => {\n setInputValue(inputCurrencyBalance ?? '0')\n }, [inputCurrencyBalance])\n\n const handleCurrencySelect = useCallback((newInputToken: string) => {\n setInputValue('')\n setInputTokenString(newInputToken)\n }, [])\n\n // Approve & Purchase Functions\n const [approvalState, approveCallback] = useApproval(\n inputValue,\n inputToken ?? null,\n SoulZapTokenManager?.[bondData?.chainId as ZapSupportedChainId] ?? null,\n account ?? null,\n bondChain ?? null,\n )\n const isApproved = approvalState === ApprovalState.APPROVED\n\n const handleApprove = async () => {\n if (isWrongChain) {\n try {\n await switchChainAsync({ chainId: bondChain })\n } catch (error: any) {\n addToastError(error.shortMessage)\n return\n }\n }\n await approveCallback()\n track({\n event: 'approveBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n },\n })\n }\n\n const handleBuy = async () => {\n if (!bondData || !bondAddress || !bondChain || !hasZapQuote) return\n\n if (isWrongChain) {\n try {\n await switchChainAsync({ chainId: bondChain })\n } catch (error: any) {\n addToastError(error.shortMessage)\n return\n }\n }\n\n setLoadingTx(true)\n const usdAmount = parseFloat(inputValue) * parseFloat(bondData?.principalTokenPrice ?? '0')\n track({\n event: 'buyBondClick',\n chain: bondChain,\n data: {\n cat: bondData?.billType,\n bond: bondData?.earnToken.symbol,\n value: usdAmount,\n },\n })\n try {\n const validated18DecimalAmount = toFixedString(inputValue ?? '0', 18, 'trunc')\n const parsedValue = parseEther(validated18DecimalAmount)\n const hash = await sendTransactionAsync({\n to: zapData.txData.to,\n data: zapData.txData.data,\n value: inputToken === 'NATIVE' ? parsedValue : undefined,\n })\n if (hash) {\n setBuyTxHash(hash)\n sendReferenceId(bondAddress, bondChain, hash)\n handlePurchasedBond?.({ buyTxHash: hash })\n track({\n event: 'bond',\n chain: bondChain,\n data: {\n cat: 'lp-staking-buy',\n type: bondData?.billType ?? '',\n typedValue: inputValue,\n principalToken: bondData?.lpToken.symbol ?? '',\n earnToken: bondData?.earnToken.symbol ?? '',\n address: remove0xPrefix(bondAddress),\n usdAmount,\n },\n })\n }\n } catch (error: any) {\n console.error('Buy error', error)\n reportError({\n apiUrl: SDKConfig?.urls?.apiV2,\n error,\n extraInfo: { type: 'buyLpStakingBond', bondData, error },\n chainId: bondChain,\n account,\n })\n addToastError(error.shortMessage)\n } finally {\n setLoadingTx(false)\n }\n }\n\n return bondData ? (\n <Flex\n className=\"modal-content ape:flex ape:flex-col ape:rounded-[10px] ape:bg-white2 ape:w-full ape:p-3.75 ape:md:p-5\"\n style={{ ...MCBuyComponentStyles[bondData?.marketingCampaign as MarketingCampaign] }}\n >\n <Flex className=\"modaltable-container ape:w-full ape:flex ape:flex-col ape:relative ape:gap-2.5\">\n <LpBondModalHeader bondData={bondData} onDismiss={onDismiss} />\n <ProjectDescription description={bondData.shortDescription} isProjectView={isProjectView} />\n <Flex className={clsx('ape:w-full', isProjectView ? 'ape:flex ape:md:hidden!' : 'ape:flex')}>\n <BondCards bondData={bondData} isDoingMaxBuy={false} />\n </Flex>\n <LpStakingEstimations\n inputValue={inputValue}\n inputTokenPrice={inputTokenPrice}\n bondData={bondData}\n youSpendString={youSpendString}\n isZap={isZapSupported}\n fetchingZapQuote={zapLoading}\n zapError={zapError}\n protocolQuote={zapData?.protocolQuote}\n lpQuote={zapData?.lpQuote}\n />\n <TokenSelectorPanel\n typedValue={inputValue}\n setTypedValue={setInputValue}\n selectedToken={inputToken}\n handleValueBtn={handleMaxButton}\n handleCurrencySelect={handleCurrencySelect}\n bondChainId={bondData?.chainId}\n enableZap={true}\n bondPrincipalToken={bondData?.lpToken}\n tokenBalance={inputCurrencyBalance}\n selectedTokenPrice={parseFloat(bondData?.principalTokenPrice ?? '0')}\n marketingCampaign={bondData?.marketingCampaign}\n isConnected={!!account}\n />\n {bondData?.warningCard && (\n <Flex className=\"ape:w-full ape:rounded-normal ape:p-[2px_10px]\" style={{ background: '#DE62F366' }}>\n <Text as=\"div\" size=\"12px\" className=\"ape:font-normal ape:flex ape:items-center ape:leading-5.5!\">\n <SafeHTMLComponent html={bondData?.warningCard} />\n </Text>\n </Flex>\n )}\n <Flex className=\"modaltable-container button-container ape:w-full ape:flex ape:relative ape:flex-row ape:justify-between\">\n <Flex className=\"button-container buy ape:justify-center ape:items-center ape:cursor-pointer ape:w-full\">\n {!account ? (\n <ConnectButton />\n ) : (\n <Button\n className=\"action-button ape:w-full ape:text-[14px]! ape:lg:text-[16px]!\"\n load={load || approvalState === ApprovalState.PENDING || zapLoading}\n disabled={\n load ||\n approvalState === ApprovalState.PENDING ||\n bondData?.soldOut ||\n isEmptyInput ||\n exceedsBalance ||\n exceedsMaxBuy ||\n SDKConfig.blockSales ||\n zapLoading ||\n // Approving doesn't need the quote, buying does\n (isApproved && !hasZapQuote)\n }\n onClick={isApproved ? handleBuy : handleApprove}\n >\n {exceedsBalance\n ? 'Exceeds balance'\n : isEmptyInput\n ? 'Insert amount'\n : exceedsMaxBuy\n ? 'Exceeds Max Buy. Reduce amount'\n : isApproved\n ? zapLoading\n ? 'Loading'\n : hasZapQuote\n ? 'buy'\n : 'Quote unavailable'\n : 'approve'}\n </Button>\n )}\n </Flex>\n </Flex>\n </Flex>\n </Flex>\n ) : (\n <></>\n )\n}\n\nexport default React.memo(BuyComponentLpStaking)\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA;;;;AAIG;AACH,MAAM,qBAAqB,GAAqC,CAAC,EAC/D,SAAS,EACT,WAAW,EACX,SAAS,EACT,mBAAmB,EACnB,SAAS,EACT,aAAa,GACd,KAAI;;AAEH,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,IAAA,MAAM,WAAW,GAAG,UAAU,EAAE;AAChC,IAAA,MAAM,EAAE,gBAAgB,EAAE,GAAG,cAAc,EAAE;IAC7C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE;IAC5C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,EAAE;AACtC,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE;AACrC,IAAA,MAAM,eAAe,GAAG,kBAAkB,EAAE;AAC5C,IAAA,MAAM,EAAE,oBAAoB,EAAE,GAAG,kBAAkB,EAAE;;AAGrD,IAAA,MAAM,QAAQ,GAAG,OAAO,CACtB,MACE,KAAK,EAAE,IAAI,CACT,CAAC,IAAI,KACH,IAAI,EAAE,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,WAAW,EAAE;AACnF,QAAA,IAAI,CAAC,OAAO,KAAK,SAAS,CAC7B,EACH,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC,CAChC;;IAGD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,EAAsB;IAChE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;IAChD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;IACjD,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC;IAClH,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;AACxG,IAAA,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC;AAE9F,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;AACxE,IAAA,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,KAChD,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,UAAU,KAAK;AACxC,UAAE,IAAI,CAAC,KAAK,KAAK;AACjB,UAAE,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,SAAoB,CAAC,EAAE,WAAW,EAAE;YAC3D,UAAU,EAAE,OAAO,GAAG,SAAoB,CAAC,EAAE,WAAW,EAAE,CAC/D;AACD,IAAA,MAAM,oBAAoB,GAAG,iBAAiB,EAAE,OAAO;AAEvD,IAAA,MAAM,eAAe,GAAG,iBAAiB,EAAE,KAAK;;IAIhD,MAAM,CAAC,UAAU,EAAE,OAAO,IAAI,QAAQ,CAAC,GAAG,wBAAwB,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC;;;IAI7G,MAAM,IAAI,GAAG,SAAS,KAAK,YAAY,IAAI,CAAC,WAAW,CAAC;IACxD,MAAM,YAAY,GAAG,CAAC,CAAC,SAAS,IAAI,WAAW,KAAK,SAAS;AAC7D,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,oBAAoB,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;IAC/E,MAAM,YAAY,GAAG,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC;IAEhE,MAAM,WAAW,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;AAC/C,IAAA,MAAM,cAAc,GAAG,CAAA,EAAG,WAAW,CAAC,cAAc,EAAE,CAAA,CAAA,EAAI,SAAS,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,eAAe,GAAG,MAAM,eAAe,CAAC,CAAC,WAAW,GAAG,eAAe,EAAE,QAAQ,EAAE,CAAC,CAAA,CAAA,CAAG,GAAG,EAAE,EAAE;IAClM,MAAM,cAAc,GAAG,KAAK;;IAE5B,MAAM,WAAW,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM;;;;AAKlD,IAAA,MAAM,iBAAiB,GAAG,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAoB,CAAC,EAAE,WAAW,EAAE;AAC7G,IAAA,MAAM,sBAAsB,GAC1B,UAAU,KAAK,QAAQ,IAAI,UAAU,EAAE,OAAO,GAAG,SAAoB,CAAC,EAAE,WAAW,EAAE,KAAK,iBAAiB;AAC7G,IAAA,MAAM,iBAAiB,GAAG,sBAAsB,GAAG,WAAW,GAAG,WAAW,IAAI,eAAe,IAAI,CAAC,CAAC;IACrG,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC;;IAExC,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,IAAI,iBAAiB,GAAG,MAAM;;;;IAK9D,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS;YAAE;AACjC,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,WAAW,EAAE;YACjE,MAAM,UAAU,GAAG,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE;AACvE,YAAA,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CACvC,CAAC,GAAG,KAAK,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,UAAU,CAC9F;YACD,MAAM,YAAY,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1C,YAAA,IAAI,YAAY;gBAAE,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC9D;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAClB;;AAEF,IAAA,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;;AAGlB,IAAA,MAAM,eAAe,GAAG,WAAW,CAAC,MAAK;AACvC,QAAA,aAAa,CAAC,oBAAoB,IAAI,GAAG,CAAC;AAC5C,IAAA,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC;AAE1B,IAAA,MAAM,oBAAoB,GAAG,WAAW,CAAC,CAAC,aAAqB,KAAI;QACjE,aAAa,CAAC,EAAE,CAAC;QACjB,mBAAmB,CAAC,aAAa,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC;;AAGN,IAAA,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,GAAG,WAAW,CAClD,UAAU,EACV,UAAU,IAAI,IAAI,EAClB,mBAAmB,GAAG,QAAQ,EAAE,OAA8B,CAAC,IAAI,IAAI,EACvE,OAAO,IAAI,IAAI,EACf,SAAS,IAAI,IAAI,CAClB;AACD,IAAA,MAAM,UAAU,GAAG,aAAa,KAAK,aAAa,CAAC,QAAQ;AAE3D,IAAA,MAAM,aAAa,GAAG,YAAW;QAC/B,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI;gBACF,MAAM,gBAAgB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YAChD;YAAE,OAAO,KAAU,EAAE;AACnB,gBAAA,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;gBACjC;YACF;QACF;QACA,MAAM,eAAe,EAAE;AACvB,QAAA,KAAK,CAAC;AACJ,YAAA,KAAK,EAAE,kBAAkB;AACzB,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,IAAI,EAAE;gBACJ,GAAG,EAAE,QAAQ,EAAE,QAAQ;AACvB,gBAAA,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM;AACjC,aAAA;AACF,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,MAAM,SAAS,GAAG,YAAW;QAC3B,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW;YAAE;QAE7D,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI;gBACF,MAAM,gBAAgB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YAChD;YAAE,OAAO,KAAU,EAAE;AACnB,gBAAA,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;gBACjC;YACF;QACF;QAEA,YAAY,CAAC,IAAI,CAAC;AAClB,QAAA,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,mBAAmB,IAAI,GAAG,CAAC;AAC3F,QAAA,KAAK,CAAC;AACJ,YAAA,KAAK,EAAE,cAAc;AACrB,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,IAAI,EAAE;gBACJ,GAAG,EAAE,QAAQ,EAAE,QAAQ;AACvB,gBAAA,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM;AAChC,gBAAA,KAAK,EAAE,SAAS;AACjB,aAAA;AACF,SAAA,CAAC;AACF,QAAA,IAAI;AACF,YAAA,MAAM,wBAAwB,GAAG,aAAa,CAAC,UAAU,IAAI,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC;AAC9E,YAAA,MAAM,WAAW,GAAG,UAAU,CAAC,wBAAwB,CAAC;AACxD,YAAA,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC;AACtC,gBAAA,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;AACrB,gBAAA,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;gBACzB,KAAK,EAAE,UAAU,KAAK,QAAQ,GAAG,WAAW,GAAG,SAAS;AACzD,aAAA,CAAC;YACF,IAAI,IAAI,EAAE;gBACR,YAAY,CAAC,IAAI,CAAC;AAClB,gBAAA,eAAe,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC;gBAC7C,mBAAmB,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAC1C,gBAAA,KAAK,CAAC;AACJ,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,KAAK,EAAE,SAAS;AAChB,oBAAA,IAAI,EAAE;AACJ,wBAAA,GAAG,EAAE,gBAAgB;AACrB,wBAAA,IAAI,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE;AAC9B,wBAAA,UAAU,EAAE,UAAU;AACtB,wBAAA,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;AAC9C,wBAAA,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,MAAM,IAAI,EAAE;AAC3C,wBAAA,OAAO,EAAE,cAAc,CAAC,WAAW,CAAC;wBACpC,SAAS;AACV,qBAAA;AACF,iBAAA,CAAC;YACJ;QACF;QAAE,OAAO,KAAU,EAAE;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC;AACjC,YAAA,WAAW,CAAC;AACV,gBAAA,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK;gBAC9B,KAAK;gBACL,SAAS,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE;AACxD,gBAAA,OAAO,EAAE,SAAS;gBAClB,OAAO;AACR,aAAA,CAAC;AACF,YAAA,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;QACnC;gBAAU;YACR,YAAY,CAAC,KAAK,CAAC;QACrB;AACF,IAAA,CAAC;AAED,IAAA,OAAO,QAAQ,IACbA,GAAA,CAAC,IAAI,EAAA,EACH,SAAS,EAAC,uGAAuG,EACjH,KAAK,EAAE,EAAE,GAAG,oBAAoB,CAAC,QAAQ,EAAE,iBAAsC,CAAC,EAAE,EAAA,QAAA,EAEpFC,IAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,gFAAgF,EAAA,QAAA,EAAA,CAC9FD,GAAA,CAAC,iBAAiB,EAAA,EAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAI,EAC/DA,GAAA,CAAC,kBAAkB,EAAA,EAAC,WAAW,EAAE,QAAQ,CAAC,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAA,CAAI,EAC5FA,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,GAAG,yBAAyB,GAAG,UAAU,CAAC,EAAA,QAAA,EACzFA,GAAA,CAAC,SAAS,IAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAA,CAAI,EAAA,CAClD,EACPA,GAAA,CAAC,oBAAoB,EAAA,EACnB,UAAU,EAAE,UAAU,EACtB,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,cAAc,EACrB,gBAAgB,EAAE,UAAU,EAC5B,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,OAAO,EAAE,aAAa,EACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAA,CACzB,EACFA,GAAA,CAAC,kBAAkB,IACjB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,UAAU,EACzB,cAAc,EAAE,eAAe,EAC/B,oBAAoB,EAAE,oBAAoB,EAC1C,WAAW,EAAE,QAAQ,EAAE,OAAO,EAC9B,SAAS,EAAE,IAAI,EACf,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EACrC,YAAY,EAAE,oBAAoB,EAClC,kBAAkB,EAAE,UAAU,CAAC,QAAQ,EAAE,mBAAmB,IAAI,GAAG,CAAC,EACpE,iBAAiB,EAAE,QAAQ,EAAE,iBAAiB,EAC9C,WAAW,EAAE,CAAC,CAAC,OAAO,EAAA,CACtB,EACD,QAAQ,EAAE,WAAW,KACpBA,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,gDAAgD,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,EAAA,QAAA,EACjGA,IAAC,IAAI,EAAA,EAAC,EAAE,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,4DAA4D,YAC/FA,GAAA,CAAC,iBAAiB,EAAA,EAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAA,CAAI,EAAA,CAC7C,EAAA,CACF,CACR,EACDA,IAAC,IAAI,EAAA,EAAC,SAAS,EAAC,yGAAyG,EAAA,QAAA,EACvHA,GAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,wFAAwF,EAAA,QAAA,EACrG,CAAC,OAAO,IACPA,GAAA,CAAC,aAAa,EAAA,EAAA,CAAG,KAEjBA,GAAA,CAAC,MAAM,EAAA,EACL,SAAS,EAAC,+DAA+D,EACzE,IAAI,EAAE,IAAI,IAAI,aAAa,KAAK,aAAa,CAAC,OAAO,IAAI,UAAU,EACnE,QAAQ,EACN,IAAI;gCACJ,aAAa,KAAK,aAAa,CAAC,OAAO;AACvC,gCAAA,QAAQ,EAAE,OAAO;gCACjB,YAAY;gCACZ,cAAc;gCACd,aAAa;AACb,gCAAA,SAAS,CAAC,UAAU;gCACpB,UAAU;;AAEV,iCAAC,UAAU,IAAI,CAAC,WAAW,CAAC,EAE9B,OAAO,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,YAE9C;AACC,kCAAE;AACF,kCAAE;AACA,sCAAE;AACF,sCAAE;AACA,0CAAE;AACF,0CAAE;AACA,8CAAE;AACA,kDAAE;AACF,kDAAE;AACA,sDAAE;AACF,sDAAE;AACN,8CAAE,SAAS,EAAA,CACZ,CACV,GACI,EAAA,CACF,CAAA,EAAA,CACF,EAAA,CACF,KAEPA,GAAA,CAAAE,QAAA,EAAA,EAAA,CAAK,CACN;AACH,CAAC;AAED,8BAAe,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC;;;;"}
|
|
@@ -27,6 +27,20 @@ var LP_STAKING_VAULT_ABI = [
|
|
|
27
27
|
],
|
|
28
28
|
stateMutability: "view",
|
|
29
29
|
type: "function"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
inputs: [
|
|
33
|
+
],
|
|
34
|
+
name: "depositsPaused",
|
|
35
|
+
outputs: [
|
|
36
|
+
{
|
|
37
|
+
internalType: "bool",
|
|
38
|
+
name: "",
|
|
39
|
+
type: "bool"
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
stateMutability: "view",
|
|
43
|
+
type: "function"
|
|
30
44
|
}
|
|
31
45
|
];
|
|
32
46
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lpStakingVault.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lpStakingVault.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -36,7 +36,6 @@ const calculateBondsData = async (queryClient) => {
|
|
|
36
36
|
// Fetch the realtime-API adapters' bonds (EVM incl. PreTGE, Solana)
|
|
37
37
|
let evmSolBondsData = [];
|
|
38
38
|
try {
|
|
39
|
-
throw new Error('Force fallback to on-chain reads');
|
|
40
39
|
// We first try to fetch from realtime; if it fails we fall back to each adapter's on-chain reads.
|
|
41
40
|
const realTimeApiResponse = await apiGet(`${realTimeApiUrl}/bonds`);
|
|
42
41
|
evmSolBondsData = realTimeApiResponse.bonds.filter((bond) => chains.includes(bond.chainId) && usesRealtimeApi(bond.chainId));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBondsData.js","sources":["../../../src/state/bonds/useBondsData.ts"],"sourcesContent":["import { QueryClient, useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BondsData } from '../../types/bonds'\nimport { apiGet } from '../../utils/httpClient'\nimport { SDKProps } from '../useSDKConfig'\nimport useTokenPrices, { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport useBondsList from './useBondsList'\nimport { BillsConfig, ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport useBondsListPreTGE from './useBondsListPreTGE'\nimport { getAdapterForChain } from '../../adapters/registry'\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\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_DATA],\n queryFn: ({ client }) => calculateBondsData(client),\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 // ----------------------- Step 1 -----------------------\n // Fetch necessary data from the queryClient\n const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiUrl = urls['realTimeApi']\n const apiUrl = urls['apiV2']\n\n // Adapters that don't use the realtime API are read on-chain in step 3. Chains without a registered adapter are\n // unsupported.\n const usesRealtimeApi = (chainId: ChainId) => getAdapterForChain(chainId)?.usesRealtimeApi ?? false\n\n // ----------------------- Step 2 -----------------------\n // Fetch the realtime-API adapters' bonds (EVM incl. PreTGE, Solana)\n let evmSolBondsData: BondsData[] = []\n\n try {\n
|
|
1
|
+
{"version":3,"file":"useBondsData.js","sources":["../../../src/state/bonds/useBondsData.ts"],"sourcesContent":["import { QueryClient, useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BondsData } from '../../types/bonds'\nimport { apiGet } from '../../utils/httpClient'\nimport { SDKProps } from '../useSDKConfig'\nimport useTokenPrices, { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport useBondsList from './useBondsList'\nimport { BillsConfig, ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport useBondsListPreTGE from './useBondsListPreTGE'\nimport { getAdapterForChain } from '../../adapters/registry'\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\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_DATA],\n queryFn: ({ client }) => calculateBondsData(client),\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 // ----------------------- Step 1 -----------------------\n // Fetch necessary data from the queryClient\n const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiUrl = urls['realTimeApi']\n const apiUrl = urls['apiV2']\n\n // Adapters that don't use the realtime API are read on-chain in step 3. Chains without a registered adapter are\n // unsupported.\n const usesRealtimeApi = (chainId: ChainId) => getAdapterForChain(chainId)?.usesRealtimeApi ?? false\n\n // ----------------------- Step 2 -----------------------\n // Fetch the realtime-API adapters' bonds (EVM incl. PreTGE, Solana)\n let evmSolBondsData: BondsData[] = []\n\n try {\n // We first try to fetch from realtime; if it fails we fall back to each adapter's on-chain reads.\n const realTimeApiResponse = await apiGet<{ bonds: BondsData[] }>(`${realTimeApiUrl}/bonds`)\n evmSolBondsData = realTimeApiResponse.bonds.filter(\n (bond: BondsData) => chains.includes(bond.chainId) && usesRealtimeApi(bond.chainId),\n )\n } catch {\n // Fallback strategy\n console.time('Fallback BondsData')\n const bondList = queryClient?.getQueryData([QUERY_KEYS.BONDS_LIST]) as Record<ChainId, BillsConfig[]>\n const preTGEList = queryClient?.getQueryData([QUERY_KEYS.BONDS_LIST_PRE_TGE]) as PreTGEConfig[]\n const tokenPrices = queryClient?.getQueryData([QUERY_KEYS.TOKEN_PRICES]) as Partial<Record<ChainId, TokenPrices[]>>\n const billData = await Promise.all([\n ...chains\n .filter((c) => usesRealtimeApi(c))\n .map(async (chainId: ChainId) => {\n if (!bondList[chainId]) return []\n return await getAdapterForChain(chainId)!.fetchBondsData(\n chainId,\n bondList[chainId],\n tokenPrices[chainId],\n apiUrl,\n )\n }),\n ...chains.map(async (chainId: ChainId) => {\n const preTGE = getAdapterForChain(chainId)?.preTGE\n if (!preTGE) return []\n const filteredBonds = preTGEList?.filter((bond) => bond.chainId === chainId) ?? []\n return await preTGE.fetchBondsData(chainId, tokenPrices, filteredBonds, apiUrl)\n }),\n ])\n console.timeEnd('Fallback BondsData')\n evmSolBondsData = billData.flat()\n }\n\n // ----------------------- Step 3 -----------------------\n // Fetch on-chain-only bonds: adapters that don't use the realtime API (e.g. Aptos, Sui)\n let onChainBonds: BondsData[] = []\n const onChainAdapterChains = (chains as ChainId[]).filter((chainId) => {\n const adapter = getAdapterForChain(chainId)\n return !!adapter && !adapter.usesRealtimeApi\n })\n\n if (onChainAdapterChains.length > 0) {\n try {\n const bondList = queryClient?.getQueryData([QUERY_KEYS.BONDS_LIST]) as Record<ChainId, BillsConfig[]>\n const tokenPrices = queryClient?.getQueryData([QUERY_KEYS.TOKEN_PRICES]) as Partial<\n Record<ChainId, TokenPrices[]>\n >\n const results = await Promise.all(\n onChainAdapterChains.map((chainId) =>\n getAdapterForChain(chainId)!.fetchBondsData(chainId, bondList[chainId] ?? [], tokenPrices[chainId], apiUrl),\n ),\n )\n onChainBonds = results.flat()\n } catch (e) {\n console.error(e)\n }\n }\n\n return [...evmSolBondsData, ...onChainBonds]\n}\n"],"names":[],"mappings":";;;;;;;;AAWc,SAAU,YAAY,GAAA;IAClC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE;IACzC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,kBAAkB,EAAE;IACjD,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE;AAC9C,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,MAAM;AAE7D,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QACjC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,kBAAkB,CAAC,MAAM,CAAC;QACnD,eAAe,EAAE,KAAK;QACtB,OAAO,EAAE,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,cAAc;AACvD,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,kBAAkB,EAAE,KAAK;AACzB,QAAA,KAAK,EAAE,CAAC;QACR,SAAS,EAAE,KAAK;AACjB,KAAA,CAAC;AACJ;MAEa,kBAAkB,GAAG,OAAO,WAAwB,KAA0B;;;AAGzF,IAAA,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAa;AACvF,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;AAC1C,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;;;AAI5B,IAAA,MAAM,eAAe,GAAG,CAAC,OAAgB,KAAK,kBAAkB,CAAC,OAAO,CAAC,EAAE,eAAe,IAAI,KAAK;;;IAInG,IAAI,eAAe,GAAgB,EAAE;AAErC,IAAA,IAAI;;QAEF,MAAM,mBAAmB,GAAG,MAAM,MAAM,CAAyB,CAAA,EAAG,cAAc,CAAA,MAAA,CAAQ,CAAC;AAC3F,QAAA,eAAe,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAChD,CAAC,IAAe,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CACpF;IACH;AAAE,IAAA,MAAM;;AAEN,QAAA,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC;AAClC,QAAA,MAAM,QAAQ,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAmC;AACrG,QAAA,MAAM,UAAU,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAmB;AAC/F,QAAA,MAAM,WAAW,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAA4C;AACnH,QAAA,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACjC,YAAA,GAAG;iBACA,MAAM,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC;AAChC,iBAAA,GAAG,CAAC,OAAO,OAAgB,KAAI;AAC9B,gBAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;AAAE,oBAAA,OAAO,EAAE;gBACjC,OAAO,MAAM,kBAAkB,CAAC,OAAO,CAAE,CAAC,cAAc,CACtD,OAAO,EACP,QAAQ,CAAC,OAAO,CAAC,EACjB,WAAW,CAAC,OAAO,CAAC,EACpB,MAAM,CACP;AACH,YAAA,CAAC,CAAC;YACJ,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,OAAgB,KAAI;gBACvC,MAAM,MAAM,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM;AAClD,gBAAA,IAAI,CAAC,MAAM;AAAE,oBAAA,OAAO,EAAE;AACtB,gBAAA,MAAM,aAAa,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,EAAE;AAClF,gBAAA,OAAO,MAAM,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,CAAC;AACjF,YAAA,CAAC,CAAC;AACH,SAAA,CAAC;AACF,QAAA,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC;AACrC,QAAA,eAAe,GAAG,QAAQ,CAAC,IAAI,EAAE;IACnC;;;IAIA,IAAI,YAAY,GAAgB,EAAE;IAClC,MAAM,oBAAoB,GAAI,MAAoB,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AACpE,QAAA,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC;QAC3C,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe;AAC9C,IAAA,CAAC,CAAC;AAEF,IAAA,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE;AACnC,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAmC;AACrG,YAAA,MAAM,WAAW,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAEtE;AACD,YAAA,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,oBAAoB,CAAC,GAAG,CAAC,CAAC,OAAO,KAC/B,kBAAkB,CAAC,OAAO,CAAE,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAC5G,CACF;AACD,YAAA,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE;QAC/B;QAAE,OAAO,CAAC,EAAE;AACV,YAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAClB;IACF;AAEA,IAAA,OAAO,CAAC,GAAG,eAAe,EAAE,GAAG,YAAY,CAAC;AAC9C;;;;"}
|
|
@@ -56,9 +56,24 @@ const getPendingVestingString = (bond) => {
|
|
|
56
56
|
const vestingTime = getTimePeriods(timeLeftForFullyVested, true);
|
|
57
57
|
return `${vestingTime.days}d, ${vestingTime.hours}h, ${vestingTime.minutes}m`;
|
|
58
58
|
};
|
|
59
|
+
// LP staking cliffs can be shorter than a day (5 minutes on the Sepolia test campaign), so they fall back to hours, then
|
|
60
|
+
// minutes, instead of reading "0 D"
|
|
61
|
+
const getShortTermUnit = (seconds) => {
|
|
62
|
+
const { days, hours, minutes } = getTimePeriods(seconds, true);
|
|
63
|
+
if (days > 0)
|
|
64
|
+
return { value: days, short: 'D', long: 'day' };
|
|
65
|
+
if (hours > 0)
|
|
66
|
+
return { value: hours, short: 'H', long: 'hour' };
|
|
67
|
+
return { value: minutes, short: 'Min', long: 'minute' };
|
|
68
|
+
};
|
|
59
69
|
const getVestingTermsString = (bond) => {
|
|
60
70
|
const vestingTerm = bond?.vestingTerm ?? 0;
|
|
61
71
|
const vestingCliff = bond?.vestingCliff ?? 0;
|
|
72
|
+
if (bond?.billType === 'lpStaking') {
|
|
73
|
+
// The bonus unlocks all at once at the cliff, so the term is the cliff
|
|
74
|
+
const { value, short } = getShortTermUnit(vestingTerm);
|
|
75
|
+
return `${value} ${short}`;
|
|
76
|
+
}
|
|
62
77
|
if (!vestingCliff) {
|
|
63
78
|
const vestingTime = getTimePeriods(vestingTerm, true);
|
|
64
79
|
return `${vestingTime.days} D`;
|
|
@@ -79,6 +94,10 @@ const getVestingTermsTooltipString = (bond) => {
|
|
|
79
94
|
const vestingCliff = bond?.vestingCliff;
|
|
80
95
|
if (!vestingCliff)
|
|
81
96
|
return undefined;
|
|
97
|
+
if (bond?.billType === 'lpStaking') {
|
|
98
|
+
const { value, long } = getShortTermUnit(vestingCliff);
|
|
99
|
+
return `${value}-${long} cliff, then instant release of all tokens.`;
|
|
100
|
+
}
|
|
82
101
|
const vestingTime = getTimePeriods(vestingTerm - vestingCliff, true);
|
|
83
102
|
const vestingCliffString = getTimePeriods(vestingCliff, true);
|
|
84
103
|
if (vestingTerm - vestingCliff === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"displayHelpers.js","sources":["../../src/utils/displayHelpers.ts"],"sourcesContent":["import { UserBill } from '../types/yourbonds'\nimport { getBalanceNumber } from './getBalanceNumber'\nimport { BondsData } from '../types/bonds'\nimport { getFirstNonZeroDigits } from './roundNumber'\nimport { getTimePeriods } from './getTimePeriods'\nimport { formatNumberSI } from './formatNumber'\nimport { BillsConfig, LaunchBondTiers } from '@ape.swap/apeswap-lists'\nimport { TIERS_WEIGHT } from '../state/tiers/tiers'\nimport { findHighestTrueBondPrice } from './bondPriceHelpers'\nimport { mulDivRound, parseUnits, toFixedString } from './fixedPoint'\n\nconst PRECISION_18 = 10n ** 18n\n// Scale used to carry percentage ratios (tier boost, fee) into integer math alongside\n// wei-scale trueBondPrice values, so the huge integer never round-trips through a float.\nconst RATIO_SCALE = 1_000_000_000_000n // 1e12\nconst scaleRatio = (ratio: number): bigint => parseUnits(ratio.toString(), 12)\n\nexport const claimable = (userBill?: UserBill) => {\n return getBalanceNumber(\n userBill?.pendingRewards ?? '0',\n userBill?.bond?.earnToken?.decimals?.[userBill?.bond?.chainId] ?? 18,\n )\n}\n\nexport const claimableUSD = (userBill?: UserBill) => {\n const claimableTokens = claimable(userBill)\n return claimableTokens * parseFloat(userBill?.bond?.payoutTokenPrice ?? '0')\n}\n\nexport const earnTokenPrice = (bond: BondsData) => {\n return formatNumberSI(bond?.payoutTokenPrice ?? '0')\n}\n\n// Amount of unvested (locked) tokens\nexport const pending = (userBill?: UserBill) => {\n return (\n getBalanceNumber(userBill?.payout ?? 0, userBill?.bond?.earnToken?.decimals?.[userBill?.bond?.chainId] ?? 18) -\n claimable(userBill)\n )\n}\n\nexport const pendingUSD = (userBill?: UserBill) => {\n const pendingTokens = pending(userBill)\n return pendingTokens * parseFloat(userBill?.bond?.payoutTokenPrice ?? '0')\n}\n\nexport const claimed = (userBill?: UserBill) => {\n return getBalanceNumber(\n userBill?.payoutClaimed ?? '0',\n userBill?.bond?.earnToken?.decimals?.[userBill?.bond?.chainId] ?? 18,\n )\n}\n\nexport const claimedUSD = (userBill?: UserBill) => {\n const claimedTokens = claimed(userBill)\n return claimedTokens * parseFloat(userBill?.bond?.payoutTokenPrice ?? '0')\n}\n\nexport const getPercentageVested = (bond?: UserBill) => {\n const vestingTerm = parseInt(bond?.vestingTerm ?? '0')\n const timeLeftForFullyVested = getTimeLeftForFullyVested(bond)\n if (timeLeftForFullyVested <= 0) return 100\n return ((vestingTerm - timeLeftForFullyVested) / vestingTerm) * 100\n}\n\nexport const getTimeLeftForFullyVested = (bond?: UserBill) => {\n const vestingTerm = parseInt(bond?.vestingTerm ?? '0')\n const purchaseTimestamp = parseInt(bond?.vestingStartTimestamp ?? '0')\n const now = Math.round(Date.now() / 1000)\n return purchaseTimestamp + vestingTerm - now\n}\n\nexport const getPendingVestingString = (bond?: UserBill) => {\n const timeLeftForFullyVested = getTimeLeftForFullyVested(bond)\n const vestingTime = getTimePeriods(timeLeftForFullyVested, true)\n return `${vestingTime.days}d, ${vestingTime.hours}h, ${vestingTime.minutes}m`\n}\n\nexport const getVestingTermsString = (bond?: BondsData | BillsConfig) => {\n const vestingTerm = bond?.vestingTerm ?? 0\n const vestingCliff = bond?.vestingCliff ?? 0\n if (!vestingCliff) {\n const vestingTime = getTimePeriods(vestingTerm, true)\n return `${vestingTime.days} D`\n } else if (vestingCliff) {\n // TODO: remove this hardcoded shit\n if (bond?.earnToken.symbol === 'AIX') {\n return `${getTimePeriods(vestingCliff, true).days} D`\n }\n const vestingTime = getTimePeriods(vestingTerm - vestingCliff, true)\n const vestingCliffString = getTimePeriods(vestingCliff, true)\n return `${vestingCliffString.days + vestingTime.days} D`\n }\n return '-'\n}\n\nexport const getVestingTermsTooltipString = (bond?: BondsData | BillsConfig) => {\n const vestingTerm = bond?.vestingTerm ?? 0\n const vestingCliff = bond?.vestingCliff\n if (!vestingCliff) return undefined\n const vestingTime = getTimePeriods(vestingTerm - vestingCliff, true)\n const vestingCliffString = getTimePeriods(vestingCliff, true)\n if (vestingTerm - vestingCliff === 0) {\n return `${vestingCliffString.days}-day cliff, then instant release of all tokens.`\n }\n return `${vestingCliffString.days}-day cliff + ${vestingTime.days}-day linear vesting.`\n}\n\n// Applies tier-boost and fee percentage multipliers to a wei-scale (1e18) trueBondPrice,\n// keeping the huge integer exact until the final getBalanceNumber() conversion.\nconst trueBondPriceWithFeeNumber = (\n trueBondPrice: string | undefined,\n tierBoostRate: number,\n feeInPayout: number,\n): number => {\n const priceBig = BigInt(trueBondPrice ?? '0')\n const tierAdjusted = mulDivRound(priceBig, scaleRatio((100 + tierBoostRate) / 100), RATIO_SCALE)\n const feeAdjusted = mulDivRound(tierAdjusted, scaleRatio((100 + feeInPayout) / 100), RATIO_SCALE)\n return getBalanceNumber(feeAdjusted)\n}\n\nexport const discountEarnTokenPrice = (bond: BondsData, useTiers?: boolean) => {\n const feeInPayout = bond?.feeInPayout ?? 0\n const tierBoostRate = bond?.tierBoostRate ?? 0\n const principalTokenPrice = parseFloat(bond.principalTokenPrice ?? '0')\n const trueBondPrice = findHighestTrueBondPrice(\n useTiers ? TIERS_WEIGHT[LaunchBondTiers.Legend] : '0',\n bond?.trueBondPrices,\n )?.trueBondPrice\n const trueBondPriceWithFee = trueBondPriceWithFeeNumber(trueBondPrice, tierBoostRate, feeInPayout)\n return formatNumberSI(principalTokenPrice * trueBondPriceWithFee, 3)\n}\n\nexport const discountEarnTokenPriceForUser = (bond: BondsData, useTiers?: boolean, userTier?: LaunchBondTiers) => {\n const feeInPayout = bond?.feeInPayout ?? 0\n const tierBoostRate = bond?.tierBoostRate ?? 0\n const principalTokenPrice = parseFloat(bond.principalTokenPrice ?? '0')\n const trueBondPrice = findHighestTrueBondPrice(\n useTiers && userTier ? TIERS_WEIGHT[userTier] : '0',\n bond?.trueBondPrices,\n )?.trueBondPrice\n const trueBondPriceWithFee = trueBondPriceWithFeeNumber(trueBondPrice, tierBoostRate, feeInPayout)\n return getFirstNonZeroDigits(principalTokenPrice * trueBondPriceWithFee)\n}\n\nconst SAFETY_THRESHOLD = 5 // in USD\n\n// bond?.tokensRemaining is already a human-decimal string (divided by decimals upstream);\n// bond?.maxPayout is a raw wei-scale integer.\nconst getSafetyAvailable = (bond?: BondsData, allowLowValueBonds?: boolean): number => {\n const available = Number(bond?.tokensRemaining ?? '0')\n const payoutTokenPrice = Number(bond?.payoutTokenPrice ?? 0)\n const threshold = allowLowValueBonds ? 0 : SAFETY_THRESHOLD\n const thresholdToShow = payoutTokenPrice > 0 ? threshold / payoutTokenPrice : 0\n const feeInPayoutAdjuster = (100 - (bond?.feeInPayout ?? 0)) / 100\n const safeAvailable = available * feeInPayoutAdjuster - thresholdToShow\n if (available === 0) return 0\n return safeAvailable < 0 ? 0 : safeAvailable\n}\n\nconst getSafetyPurchaseLimit = (bond?: BondsData, allowLowValueBonds?: boolean): number => {\n const threshold = allowLowValueBonds ? 0 : SAFETY_THRESHOLD\n const payoutTokenPrice = Number(bond?.payoutTokenPrice ?? 0)\n const thresholdToShow = payoutTokenPrice > 0 ? threshold / payoutTokenPrice : 0\n const maxPayout = getBalanceNumber(bond?.maxPayout ?? 0, bond?.earnToken?.decimals?.[bond?.chainId] ?? 18)\n return maxPayout - thresholdToShow\n}\n\nexport const getMaxBuy = (bond?: BondsData, allowLowValueBonds?: boolean): number => {\n const safeAvailable = getSafetyAvailable(bond, allowLowValueBonds)\n const safePurchaseLimit = getSafetyPurchaseLimit(bond, allowLowValueBonds)\n\n return safePurchaseLimit < safeAvailable ? safePurchaseLimit : safeAvailable\n}\n\nexport function formatUSDNumber(input: string): string {\n const number = Number(input)\n if (Number.isNaN(number)) return '0'\n\n // If the number is greater than 0 but less than 0.01\n if (number > 0 && number < 0.01) {\n return '< 0.01'\n }\n // If the number is greater than 1k, round to no decimals.\n if (number > 1000) {\n return number.toLocaleString('en-US', { maximumFractionDigits: 0 })\n }\n // Note: Between 1k and 0.01 show 2 decimals\n return parseFloat(toFixedString(number, 2)).toLocaleString('en-US')\n}\n\nconst youSpendUSD = (bond: BondsData, inputValue: string) => {\n return (parseFloat(inputValue) * parseFloat(bond?.principalTokenPrice ?? '0')).toString()\n}\n\n// receives depositAmount and returns the payoutTokens the user will receive. IT DOES SUBTRACT FEE IN PAYOUT\nexport const getPayoutAmount = (bond?: BondsData, inputValue?: string, userPoints?: string | null) => {\n if (!inputValue || !bond || !userPoints || !bond.trueBondPrices) return 0\n\n const bigValue = parseUnits(inputValue, 18)\n const fee = bond?.feeInPayout ?? 0\n const trueBondPriceObject = findHighestTrueBondPrice(userPoints, bond?.trueBondPrices)\n const trueBondPrice = BigInt(trueBondPriceObject?.trueBondPrice ?? '0')\n\n const reverseFeeScaled = parseUnits((fee / 100 / (1 - fee / 100)).toString(), 18)\n const trueBondPriceWithFee = trueBondPrice + mulDivRound(trueBondPrice, reverseFeeScaled, PRECISION_18)\n if (trueBondPriceWithFee === 0n) return 0\n\n const billValueScaled = mulDivRound(bigValue, PRECISION_18, trueBondPriceWithFee)\n return getBalanceNumber(billValueScaled, 18)\n}\n\nconst youGetUSD = (bond?: BondsData, inputValue?: string, userPoints?: string) => {\n if (!inputValue || !bond || !userPoints || !bond.trueBondPrices) return 0\n const payoutAmount = getPayoutAmount(bond, inputValue, userPoints)\n return payoutAmount * parseFloat(bond?.payoutTokenPrice ?? '0')\n}\n\nexport const getRawBonus = (bond?: BondsData, inputValue?: string, userPoints?: string) => {\n if (!bond || !inputValue || !userPoints) return '0'\n const premiumUSD = youGetUSD(bond, inputValue, userPoints) - parseFloat(youSpendUSD(bond, inputValue))\n return premiumUSD.toString()\n}\n\nexport const getBonusColor = (premiumString: string): string => {\n return parseFloat(premiumString) < 0 ? 'premium-negative' : 'premium-positive'\n}\n\n/**\n * Calculates the principal token amount needed to receive a target payout amount.\n * This is the reverse of getRawPayoutAmount function (does NOT include fees).\n *\n * @param bond - The bond data\n * @param targetPayoutAmount - The desired payout amount in payout tokens\n * @param userPoints - User's tier points\n * @returns The principal token amount needed, or 0 if calculation cannot be performed\n */\nexport const getPrincipalAmount = (\n bond?: BondsData,\n targetPayoutAmount?: number | string,\n userPoints?: string | null,\n): number => {\n if (!targetPayoutAmount || !bond || !userPoints || !bond.trueBondPrices) return 0\n\n const billValue = parseUnits(targetPayoutAmount.toString(), 18)\n const fee = bond?.feeInPayout ?? 0\n const trueBondPriceObject = findHighestTrueBondPrice(userPoints, bond?.trueBondPrices)\n const trueBondPrice = BigInt(trueBondPriceObject?.trueBondPrice ?? '0')\n\n if (trueBondPrice === 0n) return 0\n\n const reverseFeeScaled = parseUnits((fee / 100 / (1 - fee / 100)).toString(), 18)\n const trueBondPriceWithFee = trueBondPrice + mulDivRound(trueBondPrice, reverseFeeScaled, PRECISION_18)\n\n // Reverse the formula: bigValue = billValue * (trueBondPrice + trueBondPrice * reverseFee)\n const bigValueScaled = mulDivRound(billValue, trueBondPriceWithFee, PRECISION_18)\n\n // Convert from 18 decimals back to regular amount\n return getBalanceNumber(bigValueScaled, 18)\n}\n\nexport const getRemainingTokensString = (bond: BondsData, allowLowValueBonds?: boolean) => {\n const remainingTokens = getSafetyAvailable(bond, allowLowValueBonds)\n // const remainingTokens = parseFloat(bond?.tokensRemaining ?? '0')\n const remainingTokensUsd = remainingTokens * parseFloat(bond.payoutTokenPrice ?? '0')\n\n return `${formatNumberSI(remainingTokens, 0)} ${bond.earnToken.symbol} ($${formatNumberSI(remainingTokensUsd, 0)})`\n}\n\nexport const remainingPercentage = (bond: BondsData): number => {\n const totalMaxPayout = getBalanceNumber(bond.maxTotalPayout ?? '0', bond.earnToken.decimals?.[bond.chainId] ?? 18)\n const remainingTokens = Number(bond.tokensRemaining ?? '0')\n\n return (remainingTokens / totalMaxPayout) * 100\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"displayHelpers.js","sources":["../../src/utils/displayHelpers.ts"],"sourcesContent":["import { UserBill } from '../types/yourbonds'\nimport { getBalanceNumber } from './getBalanceNumber'\nimport { BondsData } from '../types/bonds'\nimport { getFirstNonZeroDigits } from './roundNumber'\nimport { getTimePeriods } from './getTimePeriods'\nimport { formatNumberSI } from './formatNumber'\nimport { BillsConfig, LaunchBondTiers } from '@ape.swap/apeswap-lists'\nimport { TIERS_WEIGHT } from '../state/tiers/tiers'\nimport { findHighestTrueBondPrice } from './bondPriceHelpers'\nimport { mulDivRound, parseUnits, toFixedString } from './fixedPoint'\n\nconst PRECISION_18 = 10n ** 18n\n// Scale used to carry percentage ratios (tier boost, fee) into integer math alongside\n// wei-scale trueBondPrice values, so the huge integer never round-trips through a float.\nconst RATIO_SCALE = 1_000_000_000_000n // 1e12\nconst scaleRatio = (ratio: number): bigint => parseUnits(ratio.toString(), 12)\n\nexport const claimable = (userBill?: UserBill) => {\n return getBalanceNumber(\n userBill?.pendingRewards ?? '0',\n userBill?.bond?.earnToken?.decimals?.[userBill?.bond?.chainId] ?? 18,\n )\n}\n\nexport const claimableUSD = (userBill?: UserBill) => {\n const claimableTokens = claimable(userBill)\n return claimableTokens * parseFloat(userBill?.bond?.payoutTokenPrice ?? '0')\n}\n\nexport const earnTokenPrice = (bond: BondsData) => {\n return formatNumberSI(bond?.payoutTokenPrice ?? '0')\n}\n\n// Amount of unvested (locked) tokens\nexport const pending = (userBill?: UserBill) => {\n return (\n getBalanceNumber(userBill?.payout ?? 0, userBill?.bond?.earnToken?.decimals?.[userBill?.bond?.chainId] ?? 18) -\n claimable(userBill)\n )\n}\n\nexport const pendingUSD = (userBill?: UserBill) => {\n const pendingTokens = pending(userBill)\n return pendingTokens * parseFloat(userBill?.bond?.payoutTokenPrice ?? '0')\n}\n\nexport const claimed = (userBill?: UserBill) => {\n return getBalanceNumber(\n userBill?.payoutClaimed ?? '0',\n userBill?.bond?.earnToken?.decimals?.[userBill?.bond?.chainId] ?? 18,\n )\n}\n\nexport const claimedUSD = (userBill?: UserBill) => {\n const claimedTokens = claimed(userBill)\n return claimedTokens * parseFloat(userBill?.bond?.payoutTokenPrice ?? '0')\n}\n\nexport const getPercentageVested = (bond?: UserBill) => {\n const vestingTerm = parseInt(bond?.vestingTerm ?? '0')\n const timeLeftForFullyVested = getTimeLeftForFullyVested(bond)\n if (timeLeftForFullyVested <= 0) return 100\n return ((vestingTerm - timeLeftForFullyVested) / vestingTerm) * 100\n}\n\nexport const getTimeLeftForFullyVested = (bond?: UserBill) => {\n const vestingTerm = parseInt(bond?.vestingTerm ?? '0')\n const purchaseTimestamp = parseInt(bond?.vestingStartTimestamp ?? '0')\n const now = Math.round(Date.now() / 1000)\n return purchaseTimestamp + vestingTerm - now\n}\n\nexport const getPendingVestingString = (bond?: UserBill) => {\n const timeLeftForFullyVested = getTimeLeftForFullyVested(bond)\n const vestingTime = getTimePeriods(timeLeftForFullyVested, true)\n return `${vestingTime.days}d, ${vestingTime.hours}h, ${vestingTime.minutes}m`\n}\n\n// LP staking cliffs can be shorter than a day (5 minutes on the Sepolia test campaign), so they fall back to hours, then\n// minutes, instead of reading \"0 D\"\nconst getShortTermUnit = (seconds: number) => {\n const { days, hours, minutes } = getTimePeriods(seconds, true)\n if (days > 0) return { value: days, short: 'D', long: 'day' }\n if (hours > 0) return { value: hours, short: 'H', long: 'hour' }\n return { value: minutes, short: 'Min', long: 'minute' }\n}\n\nexport const getVestingTermsString = (bond?: BondsData | BillsConfig) => {\n const vestingTerm = bond?.vestingTerm ?? 0\n const vestingCliff = bond?.vestingCliff ?? 0\n if (bond?.billType === 'lpStaking') {\n // The bonus unlocks all at once at the cliff, so the term is the cliff\n const { value, short } = getShortTermUnit(vestingTerm)\n return `${value} ${short}`\n }\n if (!vestingCliff) {\n const vestingTime = getTimePeriods(vestingTerm, true)\n return `${vestingTime.days} D`\n } else if (vestingCliff) {\n // TODO: remove this hardcoded shit\n if (bond?.earnToken.symbol === 'AIX') {\n return `${getTimePeriods(vestingCliff, true).days} D`\n }\n const vestingTime = getTimePeriods(vestingTerm - vestingCliff, true)\n const vestingCliffString = getTimePeriods(vestingCliff, true)\n return `${vestingCliffString.days + vestingTime.days} D`\n }\n return '-'\n}\n\nexport const getVestingTermsTooltipString = (bond?: BondsData | BillsConfig) => {\n const vestingTerm = bond?.vestingTerm ?? 0\n const vestingCliff = bond?.vestingCliff\n if (!vestingCliff) return undefined\n if (bond?.billType === 'lpStaking') {\n const { value, long } = getShortTermUnit(vestingCliff)\n return `${value}-${long} cliff, then instant release of all tokens.`\n }\n const vestingTime = getTimePeriods(vestingTerm - vestingCliff, true)\n const vestingCliffString = getTimePeriods(vestingCliff, true)\n if (vestingTerm - vestingCliff === 0) {\n return `${vestingCliffString.days}-day cliff, then instant release of all tokens.`\n }\n return `${vestingCliffString.days}-day cliff + ${vestingTime.days}-day linear vesting.`\n}\n\n// Applies tier-boost and fee percentage multipliers to a wei-scale (1e18) trueBondPrice,\n// keeping the huge integer exact until the final getBalanceNumber() conversion.\nconst trueBondPriceWithFeeNumber = (\n trueBondPrice: string | undefined,\n tierBoostRate: number,\n feeInPayout: number,\n): number => {\n const priceBig = BigInt(trueBondPrice ?? '0')\n const tierAdjusted = mulDivRound(priceBig, scaleRatio((100 + tierBoostRate) / 100), RATIO_SCALE)\n const feeAdjusted = mulDivRound(tierAdjusted, scaleRatio((100 + feeInPayout) / 100), RATIO_SCALE)\n return getBalanceNumber(feeAdjusted)\n}\n\nexport const discountEarnTokenPrice = (bond: BondsData, useTiers?: boolean) => {\n const feeInPayout = bond?.feeInPayout ?? 0\n const tierBoostRate = bond?.tierBoostRate ?? 0\n const principalTokenPrice = parseFloat(bond.principalTokenPrice ?? '0')\n const trueBondPrice = findHighestTrueBondPrice(\n useTiers ? TIERS_WEIGHT[LaunchBondTiers.Legend] : '0',\n bond?.trueBondPrices,\n )?.trueBondPrice\n const trueBondPriceWithFee = trueBondPriceWithFeeNumber(trueBondPrice, tierBoostRate, feeInPayout)\n return formatNumberSI(principalTokenPrice * trueBondPriceWithFee, 3)\n}\n\nexport const discountEarnTokenPriceForUser = (bond: BondsData, useTiers?: boolean, userTier?: LaunchBondTiers) => {\n const feeInPayout = bond?.feeInPayout ?? 0\n const tierBoostRate = bond?.tierBoostRate ?? 0\n const principalTokenPrice = parseFloat(bond.principalTokenPrice ?? '0')\n const trueBondPrice = findHighestTrueBondPrice(\n useTiers && userTier ? TIERS_WEIGHT[userTier] : '0',\n bond?.trueBondPrices,\n )?.trueBondPrice\n const trueBondPriceWithFee = trueBondPriceWithFeeNumber(trueBondPrice, tierBoostRate, feeInPayout)\n return getFirstNonZeroDigits(principalTokenPrice * trueBondPriceWithFee)\n}\n\nconst SAFETY_THRESHOLD = 5 // in USD\n\n// bond?.tokensRemaining is already a human-decimal string (divided by decimals upstream);\n// bond?.maxPayout is a raw wei-scale integer.\nconst getSafetyAvailable = (bond?: BondsData, allowLowValueBonds?: boolean): number => {\n const available = Number(bond?.tokensRemaining ?? '0')\n const payoutTokenPrice = Number(bond?.payoutTokenPrice ?? 0)\n const threshold = allowLowValueBonds ? 0 : SAFETY_THRESHOLD\n const thresholdToShow = payoutTokenPrice > 0 ? threshold / payoutTokenPrice : 0\n const feeInPayoutAdjuster = (100 - (bond?.feeInPayout ?? 0)) / 100\n const safeAvailable = available * feeInPayoutAdjuster - thresholdToShow\n if (available === 0) return 0\n return safeAvailable < 0 ? 0 : safeAvailable\n}\n\nconst getSafetyPurchaseLimit = (bond?: BondsData, allowLowValueBonds?: boolean): number => {\n const threshold = allowLowValueBonds ? 0 : SAFETY_THRESHOLD\n const payoutTokenPrice = Number(bond?.payoutTokenPrice ?? 0)\n const thresholdToShow = payoutTokenPrice > 0 ? threshold / payoutTokenPrice : 0\n const maxPayout = getBalanceNumber(bond?.maxPayout ?? 0, bond?.earnToken?.decimals?.[bond?.chainId] ?? 18)\n return maxPayout - thresholdToShow\n}\n\nexport const getMaxBuy = (bond?: BondsData, allowLowValueBonds?: boolean): number => {\n const safeAvailable = getSafetyAvailable(bond, allowLowValueBonds)\n const safePurchaseLimit = getSafetyPurchaseLimit(bond, allowLowValueBonds)\n\n return safePurchaseLimit < safeAvailable ? safePurchaseLimit : safeAvailable\n}\n\nexport function formatUSDNumber(input: string): string {\n const number = Number(input)\n if (Number.isNaN(number)) return '0'\n\n // If the number is greater than 0 but less than 0.01\n if (number > 0 && number < 0.01) {\n return '< 0.01'\n }\n // If the number is greater than 1k, round to no decimals.\n if (number > 1000) {\n return number.toLocaleString('en-US', { maximumFractionDigits: 0 })\n }\n // Note: Between 1k and 0.01 show 2 decimals\n return parseFloat(toFixedString(number, 2)).toLocaleString('en-US')\n}\n\nconst youSpendUSD = (bond: BondsData, inputValue: string) => {\n return (parseFloat(inputValue) * parseFloat(bond?.principalTokenPrice ?? '0')).toString()\n}\n\n// receives depositAmount and returns the payoutTokens the user will receive. IT DOES SUBTRACT FEE IN PAYOUT\nexport const getPayoutAmount = (bond?: BondsData, inputValue?: string, userPoints?: string | null) => {\n if (!inputValue || !bond || !userPoints || !bond.trueBondPrices) return 0\n\n const bigValue = parseUnits(inputValue, 18)\n const fee = bond?.feeInPayout ?? 0\n const trueBondPriceObject = findHighestTrueBondPrice(userPoints, bond?.trueBondPrices)\n const trueBondPrice = BigInt(trueBondPriceObject?.trueBondPrice ?? '0')\n\n const reverseFeeScaled = parseUnits((fee / 100 / (1 - fee / 100)).toString(), 18)\n const trueBondPriceWithFee = trueBondPrice + mulDivRound(trueBondPrice, reverseFeeScaled, PRECISION_18)\n if (trueBondPriceWithFee === 0n) return 0\n\n const billValueScaled = mulDivRound(bigValue, PRECISION_18, trueBondPriceWithFee)\n return getBalanceNumber(billValueScaled, 18)\n}\n\nconst youGetUSD = (bond?: BondsData, inputValue?: string, userPoints?: string) => {\n if (!inputValue || !bond || !userPoints || !bond.trueBondPrices) return 0\n const payoutAmount = getPayoutAmount(bond, inputValue, userPoints)\n return payoutAmount * parseFloat(bond?.payoutTokenPrice ?? '0')\n}\n\nexport const getRawBonus = (bond?: BondsData, inputValue?: string, userPoints?: string) => {\n if (!bond || !inputValue || !userPoints) return '0'\n const premiumUSD = youGetUSD(bond, inputValue, userPoints) - parseFloat(youSpendUSD(bond, inputValue))\n return premiumUSD.toString()\n}\n\nexport const getBonusColor = (premiumString: string): string => {\n return parseFloat(premiumString) < 0 ? 'premium-negative' : 'premium-positive'\n}\n\n/**\n * Calculates the principal token amount needed to receive a target payout amount.\n * This is the reverse of getRawPayoutAmount function (does NOT include fees).\n *\n * @param bond - The bond data\n * @param targetPayoutAmount - The desired payout amount in payout tokens\n * @param userPoints - User's tier points\n * @returns The principal token amount needed, or 0 if calculation cannot be performed\n */\nexport const getPrincipalAmount = (\n bond?: BondsData,\n targetPayoutAmount?: number | string,\n userPoints?: string | null,\n): number => {\n if (!targetPayoutAmount || !bond || !userPoints || !bond.trueBondPrices) return 0\n\n const billValue = parseUnits(targetPayoutAmount.toString(), 18)\n const fee = bond?.feeInPayout ?? 0\n const trueBondPriceObject = findHighestTrueBondPrice(userPoints, bond?.trueBondPrices)\n const trueBondPrice = BigInt(trueBondPriceObject?.trueBondPrice ?? '0')\n\n if (trueBondPrice === 0n) return 0\n\n const reverseFeeScaled = parseUnits((fee / 100 / (1 - fee / 100)).toString(), 18)\n const trueBondPriceWithFee = trueBondPrice + mulDivRound(trueBondPrice, reverseFeeScaled, PRECISION_18)\n\n // Reverse the formula: bigValue = billValue * (trueBondPrice + trueBondPrice * reverseFee)\n const bigValueScaled = mulDivRound(billValue, trueBondPriceWithFee, PRECISION_18)\n\n // Convert from 18 decimals back to regular amount\n return getBalanceNumber(bigValueScaled, 18)\n}\n\nexport const getRemainingTokensString = (bond: BondsData, allowLowValueBonds?: boolean) => {\n const remainingTokens = getSafetyAvailable(bond, allowLowValueBonds)\n // const remainingTokens = parseFloat(bond?.tokensRemaining ?? '0')\n const remainingTokensUsd = remainingTokens * parseFloat(bond.payoutTokenPrice ?? '0')\n\n return `${formatNumberSI(remainingTokens, 0)} ${bond.earnToken.symbol} ($${formatNumberSI(remainingTokensUsd, 0)})`\n}\n\nexport const remainingPercentage = (bond: BondsData): number => {\n const totalMaxPayout = getBalanceNumber(bond.maxTotalPayout ?? '0', bond.earnToken.decimals?.[bond.chainId] ?? 18)\n const remainingTokens = Number(bond.tokensRemaining ?? '0')\n\n return (remainingTokens / totalMaxPayout) * 100\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ const isBondSoldOut = (bill, showLowValueBonds) => {
|
|
|
17
17
|
return true;
|
|
18
18
|
return false;
|
|
19
19
|
}
|
|
20
|
+
// TODO(lp-staking): payoutTokenPrice is '0' for lpStaking bonds, so they're hidden unless showLowValueBonds; recheck once their prices are hooked up
|
|
20
21
|
const { tokensRemaining, payoutTokenPrice } = bill;
|
|
21
22
|
if (!tokensRemaining)
|
|
22
23
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/views/Bonds/utils.ts"],"sourcesContent":["import { BondsData } from '../../types/bonds'\nimport { SortOptions } from './Bonds'\nimport { getTimePeriods } from '../../utils/getTimePeriods'\nimport { LaunchBondTiers } from '@ape.swap/apeswap-lists'\nimport { TIERS_WEIGHT } from '../../state/tiers/tiers'\nimport { remainingPercentage } from '../../utils/displayHelpers'\nimport { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers'\n\nexport const isBondSoldOut = (bill: BondsData, showLowValueBonds?: boolean): boolean => {\n if (bill.soldOut) return true\n if (bill.hide) return true\n if (bill.billType === 'fcfs') {\n const now = new Date().getTime()\n const saleFinishTime = (bill?.finishTime ?? 0) * 1000\n const saleHasFinished = now > saleFinishTime || bill.finalized\n if (saleHasFinished) return true\n return false\n }\n const { tokensRemaining, payoutTokenPrice } = bill\n if (!tokensRemaining) return false\n if (showLowValueBonds) return false\n const thresholdToHide = 100 / Number(payoutTokenPrice ?? 0)\n\n const bonus = findHighestTrueBondPrice('0', bill?.trueBondPrices)?.bonusWithFee ?? 0\n\n if (bonus > 50) {\n if (bill.earnToken.symbol === 'sGOO') return false\n\n if (bill.earnToken.symbol === 'PLATE' || bill.earnToken.symbol === 'PAPER') return false\n\n //if bonus is higher than 50% for regular bonds, hide them\n return true\n }\n if (Number(tokensRemaining) <= thresholdToHide) {\n // If there's less than 100 usd bond will be hidden\n return true\n } else return false\n}\n\nexport const sortBonds = (sortConfig?: SortOptions, bonds?: BondsData[]) => {\n const bondsToSort = bonds ?? []\n\n if (!sortConfig) {\n return bondsToSort\n }\n\n return [...bondsToSort].sort((a, b) => {\n let aValue: number\n let bValue: number\n\n if (sortConfig?.key === 'arr') {\n aValue = findHighestTrueBondPrice(TIERS_WEIGHT[LaunchBondTiers.Legend], a?.trueBondPrices)?.bonusWithFee ?? 0\n bValue = findHighestTrueBondPrice(TIERS_WEIGHT[LaunchBondTiers.Legend], b?.trueBondPrices)?.bonusWithFee ?? 0\n } else if (sortConfig.key === 'tokensRemaining') {\n aValue = remainingPercentage(a)\n bValue = remainingPercentage(b)\n } else if (sortConfig.key === 'terms') {\n aValue = getTimePeriods(a.vestingTerm, true).days\n bValue = getTimePeriods(b.vestingTerm, true).days\n } else {\n aValue = findHighestTrueBondPrice(TIERS_WEIGHT[LaunchBondTiers.Legend], a?.trueBondPrices)?.bonusWithFee ?? 0\n bValue = findHighestTrueBondPrice(TIERS_WEIGHT[LaunchBondTiers.Legend], b?.trueBondPrices)?.bonusWithFee ?? 0\n }\n\n if (aValue < bValue) {\n return sortConfig.direction === 'asc' ? -1 : 1\n }\n if (aValue > bValue) {\n return sortConfig.direction === 'asc' ? 1 : -1\n }\n return 0\n })\n}\n\nexport const getDiscountColor = (discount?: number): string => {\n if (!discount) return ''\n return discount > 0 ? 'var(--ape-color-success) !important' : 'var(--ape-color-error)'\n}\n\nexport const isBondSupported = (SDKVersion: string, bondVersion: string) => {\n // Split the versions into major, minor, and patch parts\n const [major1, minor1, patch1] = SDKVersion.split('.').map(Number) ?? []\n const [major2, minor2, patch2] = bondVersion?.split('.').map(Number) ?? []\n\n // Compare major versions\n if (major1 > major2) return true\n if (major1 < major2) return false\n\n // Compare minor versions\n if (minor1 > minor2) return true\n if (minor1 < minor2) return false\n\n // Compare patch versions\n if (patch1 >= patch2) return true\n\n // If none of the above conditions are met, version1 is less\n return false\n}\n"],"names":[],"mappings":";;;;;;MAQa,aAAa,GAAG,CAAC,IAAe,EAAE,iBAA2B,KAAa;IACrF,IAAI,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,IAAI;IAC7B,IAAI,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AAC1B,IAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE;QAC5B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;QAChC,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC,IAAI,IAAI;QACrD,MAAM,eAAe,GAAG,GAAG,GAAG,cAAc,IAAI,IAAI,CAAC,SAAS;AAC9D,QAAA,IAAI,eAAe;AAAE,YAAA,OAAO,IAAI;AAChC,QAAA,OAAO,KAAK;IACd
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/views/Bonds/utils.ts"],"sourcesContent":["import { BondsData } from '../../types/bonds'\nimport { SortOptions } from './Bonds'\nimport { getTimePeriods } from '../../utils/getTimePeriods'\nimport { LaunchBondTiers } from '@ape.swap/apeswap-lists'\nimport { TIERS_WEIGHT } from '../../state/tiers/tiers'\nimport { remainingPercentage } from '../../utils/displayHelpers'\nimport { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers'\n\nexport const isBondSoldOut = (bill: BondsData, showLowValueBonds?: boolean): boolean => {\n if (bill.soldOut) return true\n if (bill.hide) return true\n if (bill.billType === 'fcfs') {\n const now = new Date().getTime()\n const saleFinishTime = (bill?.finishTime ?? 0) * 1000\n const saleHasFinished = now > saleFinishTime || bill.finalized\n if (saleHasFinished) return true\n return false\n }\n // TODO(lp-staking): payoutTokenPrice is '0' for lpStaking bonds, so they're hidden unless showLowValueBonds; recheck once their prices are hooked up\n const { tokensRemaining, payoutTokenPrice } = bill\n if (!tokensRemaining) return false\n if (showLowValueBonds) return false\n const thresholdToHide = 100 / Number(payoutTokenPrice ?? 0)\n\n const bonus = findHighestTrueBondPrice('0', bill?.trueBondPrices)?.bonusWithFee ?? 0\n\n if (bonus > 50) {\n if (bill.earnToken.symbol === 'sGOO') return false\n\n if (bill.earnToken.symbol === 'PLATE' || bill.earnToken.symbol === 'PAPER') return false\n\n //if bonus is higher than 50% for regular bonds, hide them\n return true\n }\n if (Number(tokensRemaining) <= thresholdToHide) {\n // If there's less than 100 usd bond will be hidden\n return true\n } else return false\n}\n\nexport const sortBonds = (sortConfig?: SortOptions, bonds?: BondsData[]) => {\n const bondsToSort = bonds ?? []\n\n if (!sortConfig) {\n return bondsToSort\n }\n\n return [...bondsToSort].sort((a, b) => {\n let aValue: number\n let bValue: number\n\n if (sortConfig?.key === 'arr') {\n aValue = findHighestTrueBondPrice(TIERS_WEIGHT[LaunchBondTiers.Legend], a?.trueBondPrices)?.bonusWithFee ?? 0\n bValue = findHighestTrueBondPrice(TIERS_WEIGHT[LaunchBondTiers.Legend], b?.trueBondPrices)?.bonusWithFee ?? 0\n } else if (sortConfig.key === 'tokensRemaining') {\n aValue = remainingPercentage(a)\n bValue = remainingPercentage(b)\n } else if (sortConfig.key === 'terms') {\n aValue = getTimePeriods(a.vestingTerm, true).days\n bValue = getTimePeriods(b.vestingTerm, true).days\n } else {\n aValue = findHighestTrueBondPrice(TIERS_WEIGHT[LaunchBondTiers.Legend], a?.trueBondPrices)?.bonusWithFee ?? 0\n bValue = findHighestTrueBondPrice(TIERS_WEIGHT[LaunchBondTiers.Legend], b?.trueBondPrices)?.bonusWithFee ?? 0\n }\n\n if (aValue < bValue) {\n return sortConfig.direction === 'asc' ? -1 : 1\n }\n if (aValue > bValue) {\n return sortConfig.direction === 'asc' ? 1 : -1\n }\n return 0\n })\n}\n\nexport const getDiscountColor = (discount?: number): string => {\n if (!discount) return ''\n return discount > 0 ? 'var(--ape-color-success) !important' : 'var(--ape-color-error)'\n}\n\nexport const isBondSupported = (SDKVersion: string, bondVersion: string) => {\n // Split the versions into major, minor, and patch parts\n const [major1, minor1, patch1] = SDKVersion.split('.').map(Number) ?? []\n const [major2, minor2, patch2] = bondVersion?.split('.').map(Number) ?? []\n\n // Compare major versions\n if (major1 > major2) return true\n if (major1 < major2) return false\n\n // Compare minor versions\n if (minor1 > minor2) return true\n if (minor1 < minor2) return false\n\n // Compare patch versions\n if (patch1 >= patch2) return true\n\n // If none of the above conditions are met, version1 is less\n return false\n}\n"],"names":[],"mappings":";;;;;;MAQa,aAAa,GAAG,CAAC,IAAe,EAAE,iBAA2B,KAAa;IACrF,IAAI,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,IAAI;IAC7B,IAAI,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AAC1B,IAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE;QAC5B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;QAChC,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC,IAAI,IAAI;QACrD,MAAM,eAAe,GAAG,GAAG,GAAG,cAAc,IAAI,IAAI,CAAC,SAAS;AAC9D,QAAA,IAAI,eAAe;AAAE,YAAA,OAAO,IAAI;AAChC,QAAA,OAAO,KAAK;IACd;;AAEA,IAAA,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,GAAG,IAAI;AAClD,IAAA,IAAI,CAAC,eAAe;AAAE,QAAA,OAAO,KAAK;AAClC,IAAA,IAAI,iBAAiB;AAAE,QAAA,OAAO,KAAK;IACnC,MAAM,eAAe,GAAG,GAAG,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;AAE3D,IAAA,MAAM,KAAK,GAAG,wBAAwB,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,YAAY,IAAI,CAAC;AAEpF,IAAA,IAAI,KAAK,GAAG,EAAE,EAAE;AACd,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,MAAM;AAAE,YAAA,OAAO,KAAK;AAElD,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,OAAO;AAAE,YAAA,OAAO,KAAK;;AAGxF,QAAA,OAAO,IAAI;IACb;AACA,IAAA,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,eAAe,EAAE;;AAE9C,QAAA,OAAO,IAAI;IACb;;AAAO,QAAA,OAAO,KAAK;AACrB;MAEa,SAAS,GAAG,CAAC,UAAwB,EAAE,KAAmB,KAAI;AACzE,IAAA,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;IAE/B,IAAI,CAAC,UAAU,EAAE;AACf,QAAA,OAAO,WAAW;IACpB;AAEA,IAAA,OAAO,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACpC,QAAA,IAAI,MAAc;AAClB,QAAA,IAAI,MAAc;AAElB,QAAA,IAAI,UAAU,EAAE,GAAG,KAAK,KAAK,EAAE;AAC7B,YAAA,MAAM,GAAG,wBAAwB,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,YAAY,IAAI,CAAC;AAC7G,YAAA,MAAM,GAAG,wBAAwB,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,YAAY,IAAI,CAAC;QAC/G;AAAO,aAAA,IAAI,UAAU,CAAC,GAAG,KAAK,iBAAiB,EAAE;AAC/C,YAAA,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC;AAC/B,YAAA,MAAM,GAAG,mBAAmB,CAAC,CAAC,CAAC;QACjC;AAAO,aAAA,IAAI,UAAU,CAAC,GAAG,KAAK,OAAO,EAAE;YACrC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI;YACjD,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI;QACnD;aAAO;AACL,YAAA,MAAM,GAAG,wBAAwB,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,YAAY,IAAI,CAAC;AAC7G,YAAA,MAAM,GAAG,wBAAwB,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,YAAY,IAAI,CAAC;QAC/G;AAEA,QAAA,IAAI,MAAM,GAAG,MAAM,EAAE;AACnB,YAAA,OAAO,UAAU,CAAC,SAAS,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC;QAChD;AACA,QAAA,IAAI,MAAM,GAAG,MAAM,EAAE;AACnB,YAAA,OAAO,UAAU,CAAC,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,EAAE;QAChD;AACA,QAAA,OAAO,CAAC;AACV,IAAA,CAAC,CAAC;AACJ;AAEO,MAAM,gBAAgB,GAAG,CAAC,QAAiB,KAAY;AAC5D,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,EAAE;IACxB,OAAO,QAAQ,GAAG,CAAC,GAAG,qCAAqC,GAAG,wBAAwB;AACxF;MAEa,eAAe,GAAG,CAAC,UAAkB,EAAE,WAAmB,KAAI;;IAEzE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;IACxE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;;IAG1E,IAAI,MAAM,GAAG,MAAM;AAAE,QAAA,OAAO,IAAI;IAChC,IAAI,MAAM,GAAG,MAAM;AAAE,QAAA,OAAO,KAAK;;IAGjC,IAAI,MAAM,GAAG,MAAM;AAAE,QAAA,OAAO,IAAI;IAChC,IAAI,MAAM,GAAG,MAAM;AAAE,QAAA,OAAO,KAAK;;IAGjC,IAAI,MAAM,IAAI,MAAM;AAAE,QAAA,OAAO,IAAI;;AAGjC,IAAA,OAAO,KAAK;AACd;;;;"}
|
|
@@ -22,7 +22,8 @@ const ClaimAllModal = () => {
|
|
|
22
22
|
const [selectedChain, setSelectedChain] = useState(chainId ?? (aptosAccount ? ChainId.APTOS : suiAccount ? ChainId.SUI : 56));
|
|
23
23
|
const [viewAllChains, setViewAllChains] = useState(false);
|
|
24
24
|
const { data: userOwnedBills } = useUserBonds();
|
|
25
|
-
|
|
25
|
+
// LP staking bonuses are claimed on the protocol's site, not through the bond contract's batch redeem
|
|
26
|
+
const ownedBills = userOwnedBills?.filter((bill) => parseFloat(bill?.payout) > 0 && bill?.bond?.billType !== 'lpStaking');
|
|
26
27
|
const groupedBills = ownedBills?.reduce((acc, bill) => {
|
|
27
28
|
const bondIndex = bill?.bond?.index;
|
|
28
29
|
// Check if this bond index already exists in the accumulator
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClaimAllModal.js","sources":["../../../../../src/views/YourBonds/components/ClaimAll/ClaimAllModal.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport useUserBonds from '../../../../state/bonds/useUserBonds'\nimport Flex from '../../../../components/uikit-sdk/Flex'\nimport Modal from '../../../../components/uikit-sdk/Modal'\nimport Text from '../../../../components/uikit-sdk/Text'\nimport TokenImage from '../../../../components/uikit-sdk/TokenImage'\nimport ChainOptionsList from '../../../../components/ChainOptionList/ChainOptionsList'\nimport { useSDKConfig } from '../../../../state/useSDKConfig'\nimport ChainOptionsButtons from '../../../../components/ChainOptionList/ChainOptionsButtons'\nimport { UserBill } from '../../../../types/yourbonds'\nimport { BillsConfig } from '@ape.swap/apeswap-lists'\nimport useChainAccount from '../../../../state/chainAccount/useChainAccount'\nimport { getAdapterForChain } from '../../../../adapters/registry'\nimport Arrow from '../../../../components/uikit-sdk/Svg/Icons/Arrow'\n\nconst ClaimAllModal = () => {\n const { chainId } = useChainAccount('evm')\n const { address: aptosAccount } = useChainAccount('aptos')\n const { address: suiAccount } = useChainAccount('sui')\n const SDKConfig = useSDKConfig()\n const chains = SDKConfig?.chains as number[]\n\n const [selectedChain, setSelectedChain] = useState(\n chainId ?? (aptosAccount ? ChainId.APTOS : suiAccount ? ChainId.SUI : 56),\n )\n const [viewAllChains, setViewAllChains] = useState<boolean>(false)\n const { data: userOwnedBills } = useUserBonds()\n const ownedBills = userOwnedBills?.filter((bill) => parseFloat(bill?.payout) > 0)\n\n const groupedBills = ownedBills?.reduce((acc: { bond: BillsConfig; userOwnedBills: UserBill[] }[], bill) => {\n const bondIndex = bill?.bond?.index\n\n // Check if this bond index already exists in the accumulator\n const existingGroup = acc.find((group) => group.bond.index === bondIndex)\n\n if (existingGroup) {\n // If the group already exists, add this bill to the userOwnedBills array\n existingGroup.userOwnedBills.push(bill)\n } else {\n // If it doesn't exist, create a new group\n acc.push({\n bond: bill.bond as any,\n userOwnedBills: [bill],\n })\n }\n\n return acc\n }, [])\n\n const bondsOfSelectedChain = groupedBills?.filter((group) => group.bond.chainId === selectedChain)\n // Each family's adapter renders its own claim action (summary + button) for the selected chain\n const claimAllAdapter = getAdapterForChain(selectedChain)\n\n const purchasedBillsChains = groupedBills\n ?.reduce((acc: number[], bill) => {\n if (acc.includes(bill.bond.chainId)) {\n return acc\n } else return [...acc, bill.bond.chainId]\n }, [])\n ?.sort((a, b) => a - b)\n\n // Auto-select the first chain that has bonds when the current selection has none\n useEffect(() => {\n if (purchasedBillsChains?.length && !purchasedBillsChains.includes(selectedChain)) {\n setSelectedChain(purchasedBillsChains[0])\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [purchasedBillsChains?.length])\n\n return (\n <Modal title=\"Claim All\" className=\"ape:w-[420px]\">\n {viewAllChains ? (\n <>\n <Flex className=\"ape:justify-between ape:mb-[20px]\">\n <Flex onClick={() => setViewAllChains(false)} className=\"ape:hover:cursor-pointer\">\n <Arrow width=\"10px\" direction=\"left\" />\n </Flex>\n <Text size=\"16px\" weight={300}>\n All Chain Options\n </Text>\n </Flex>\n <ChainOptionsList\n setSelectedChain={setSelectedChain}\n setViewAllChains={setViewAllChains}\n chainList={chains}\n />\n </>\n ) : (\n <Flex className=\"ape:flex-col ape:w-full\">\n <Text size=\"14px\" weight={400} className=\"ape:my-[10px]\">\n Select the chain from which you want to claim your Bonds.\n </Text>\n <ChainOptionsButtons\n setSelectedChain={setSelectedChain}\n selectedChain={selectedChain}\n setViewAllChains={setViewAllChains}\n chainList={purchasedBillsChains ?? []}\n />\n <Flex className=\"ape:w-full ape:mt-[10px] ape:bg-white3 ape:rounded-normal ape:p-[10px] ape:flex-col ape:h-[30vh] ape:overflow-y-auto\">\n {bondsOfSelectedChain && bondsOfSelectedChain?.length > 0 ? (\n bondsOfSelectedChain\n ?.filter((userBill) => userBill.bond.chainId === selectedChain)\n .map((ownedBill, index) => {\n return (\n <Flex\n key={`${ownedBill.bond.earnToken.symbol}-${index}`}\n className=\"ape:w-full ape:items-center ape:p-[5px]\"\n >\n <TokenImage symbol={ownedBill.bond.earnToken.symbol} size={30} />\n <Text className=\"ape:ml-[10px]\">\n {ownedBill.bond.earnToken.symbol}\n <Text\n as=\"span\"\n size=\"14px\"\n weight={400}\n className=\"ape:ml-[10px]\"\n style={{ color: 'var(--ape-color-text-disabled-button)' }}\n >\n ({ownedBill?.userOwnedBills?.length} Bond\n {ownedBill?.userOwnedBills && ownedBill?.userOwnedBills?.length > 1 ? 's' : ''})\n </Text>\n </Text>\n </Flex>\n )\n })\n ) : (\n <Flex\n className=\"ape:text-[14px] ape:font-normal ape:justify-center ape:mt-[10px]\"\n style={{ color: 'var(--ape-color-text-disabled-button)' }}\n >\n No bonds to claim for this chain\n </Flex>\n )}\n </Flex>\n {claimAllAdapter?.ClaimAllAction ? (\n <claimAllAdapter.ClaimAllAction chainId={selectedChain} bondsToClaim={bondsOfSelectedChain ?? []} />\n ) : (\n <Text size=\"14px\" weight={400} className=\"ape:mt-[15px]\">\n {`Claim All isn't available for this chain; claim these bonds one by one from Your Bonds.`}\n </Text>\n )}\n </Flex>\n )}\n </Modal>\n )\n}\n\nexport default ClaimAllModal\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":";;;;;;;;;;;;;;;AAgBA,MAAM,aAAa,GAAG,MAAK;IACzB,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC;IAC1C,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC;IAC1D,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC;AACtD,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,IAAA,MAAM,MAAM,GAAG,SAAS,EAAE,MAAkB;AAE5C,IAAA,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,OAAO,KAAK,YAAY,GAAG,OAAO,CAAC,KAAK,GAAG,UAAU,GAAG,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,CAC1E;IACD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC;IAClE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE;IAC/C,MAAM,UAAU,GAAG,cAAc,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAEjF,MAAM,YAAY,GAAG,UAAU,EAAE,MAAM,CAAC,CAAC,GAAwD,EAAE,IAAI,KAAI;AACzG,QAAA,MAAM,SAAS,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK;;AAGnC,QAAA,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC;QAEzE,IAAI,aAAa,EAAE;;AAEjB,YAAA,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QACzC;aAAO;;YAEL,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,IAAI,CAAC,IAAW;gBACtB,cAAc,EAAE,CAAC,IAAI,CAAC;AACvB,aAAA,CAAC;QACJ;AAEA,QAAA,OAAO,GAAG;IACZ,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,MAAM,oBAAoB,GAAG,YAAY,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,aAAa,CAAC;;AAElG,IAAA,MAAM,eAAe,GAAG,kBAAkB,CAAC,aAAa,CAAC;IAEzD,MAAM,oBAAoB,GAAG;AAC3B,UAAE,MAAM,CAAC,CAAC,GAAa,EAAE,IAAI,KAAI;QAC/B,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACnC,YAAA,OAAO,GAAG;QACZ;;YAAO,OAAO,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAC3C,CAAC,EAAE,EAAE;AACL,UAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;IAGzB,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,oBAAoB,EAAE,MAAM,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;AACjF,YAAA,gBAAgB,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAC3C;;AAEF,IAAA,CAAC,EAAE,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AAElC,IAAA,QACEA,GAAA,CAAC,KAAK,EAAA,EAAC,KAAK,EAAC,WAAW,EAAC,SAAS,EAAC,eAAe,EAAA,QAAA,EAC/C,aAAa,IACZC,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACED,IAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,mCAAmC,aACjDD,GAAA,CAAC,IAAI,EAAA,EAAC,OAAO,EAAE,MAAM,gBAAgB,CAAC,KAAK,CAAC,EAAE,SAAS,EAAC,0BAA0B,EAAA,QAAA,EAChFA,GAAA,CAAC,KAAK,EAAA,EAAC,KAAK,EAAC,MAAM,EAAC,SAAS,EAAC,MAAM,EAAA,CAAG,GAClC,EACPA,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAE,GAAG,EAAA,QAAA,EAAA,mBAAA,EAAA,CAEtB,CAAA,EAAA,CACF,EACPA,IAAC,gBAAgB,EAAA,EACf,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,MAAM,GACjB,CAAA,EAAA,CACD,KAEHC,IAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,yBAAyB,EAAA,QAAA,EAAA,CACvCD,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,2DAAA,EAAA,CAEjD,EACPA,IAAC,mBAAmB,EAAA,EAClB,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,gBAAgB,EAClC,SAAS,EAAE,oBAAoB,IAAI,EAAE,EAAA,CACrC,EACFA,GAAA,CAAC,IAAI,IAAC,SAAS,EAAC,sHAAsH,EAAA,QAAA,EACnI,oBAAoB,IAAI,oBAAoB,EAAE,MAAM,GAAG,CAAC,IACvD;AACE,0BAAE,MAAM,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,CAAC,OAAO,KAAK,aAAa;AAC7D,yBAAA,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,KAAI;wBACxB,QACEC,IAAA,CAAC,IAAI,EAAA,EAEH,SAAS,EAAC,yCAAyC,EAAA,QAAA,EAAA,CAEnDD,GAAA,CAAC,UAAU,EAAA,EAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAA,CAAI,EACjEC,KAAC,IAAI,EAAA,EAAC,SAAS,EAAC,eAAe,EAAA,QAAA,EAAA,CAC5B,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAChCA,IAAA,CAAC,IAAI,EAAA,EACH,EAAE,EAAC,MAAM,EACT,IAAI,EAAC,MAAM,EACX,MAAM,EAAE,GAAG,EACX,SAAS,EAAC,eAAe,EACzB,KAAK,EAAE,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAA,QAAA,EAAA,CAAA,GAAA,EAEvD,SAAS,EAAE,cAAc,EAAE,MAAM,EAAA,OAAA,EAClC,SAAS,EAAE,cAAc,IAAI,SAAS,EAAE,cAAc,EAAE,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,EAAA,GAAA,CAAA,EAAA,CACzE,CAAA,EAAA,CACF,CAAA,EAAA,EAhBF,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAiB7C;AAEX,oBAAA,CAAC,CAAC,KAEJD,GAAA,CAAC,IAAI,EAAA,EACH,SAAS,EAAC,kEAAkE,EAC5E,KAAK,EAAE,EAAE,KAAK,EAAE,uCAAuC,EAAE,EAAA,QAAA,EAAA,kCAAA,EAAA,CAGpD,CACR,EAAA,CACI,EACN,eAAe,EAAE,cAAc,IAC9BA,GAAA,CAAC,eAAe,CAAC,cAAc,EAAA,EAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,oBAAoB,IAAI,EAAE,EAAA,CAAI,KAEpGA,GAAA,CAAC,IAAI,EAAA,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAC,eAAe,EAAA,QAAA,EACrD,CAAA,uFAAA,CAAyF,GACrF,CACR,CAAA,EAAA,CACI,CACR,EAAA,CACK;AAEZ;;;;"}
|
|
1
|
+
{"version":3,"file":"ClaimAllModal.js","sources":["../../../../../src/views/YourBonds/components/ClaimAll/ClaimAllModal.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport useUserBonds from '../../../../state/bonds/useUserBonds'\nimport Flex from '../../../../components/uikit-sdk/Flex'\nimport Modal from '../../../../components/uikit-sdk/Modal'\nimport Text from '../../../../components/uikit-sdk/Text'\nimport TokenImage from '../../../../components/uikit-sdk/TokenImage'\nimport ChainOptionsList from '../../../../components/ChainOptionList/ChainOptionsList'\nimport { useSDKConfig } from '../../../../state/useSDKConfig'\nimport ChainOptionsButtons from '../../../../components/ChainOptionList/ChainOptionsButtons'\nimport { UserBill } from '../../../../types/yourbonds'\nimport { BillsConfig } from '@ape.swap/apeswap-lists'\nimport useChainAccount from '../../../../state/chainAccount/useChainAccount'\nimport { getAdapterForChain } from '../../../../adapters/registry'\nimport Arrow from '../../../../components/uikit-sdk/Svg/Icons/Arrow'\n\nconst ClaimAllModal = () => {\n const { chainId } = useChainAccount('evm')\n const { address: aptosAccount } = useChainAccount('aptos')\n const { address: suiAccount } = useChainAccount('sui')\n const SDKConfig = useSDKConfig()\n const chains = SDKConfig?.chains as number[]\n\n const [selectedChain, setSelectedChain] = useState(\n chainId ?? (aptosAccount ? ChainId.APTOS : suiAccount ? ChainId.SUI : 56),\n )\n const [viewAllChains, setViewAllChains] = useState<boolean>(false)\n const { data: userOwnedBills } = useUserBonds()\n // LP staking bonuses are claimed on the protocol's site, not through the bond contract's batch redeem\n const ownedBills = userOwnedBills?.filter(\n (bill) => parseFloat(bill?.payout) > 0 && bill?.bond?.billType !== 'lpStaking',\n )\n\n const groupedBills = ownedBills?.reduce((acc: { bond: BillsConfig; userOwnedBills: UserBill[] }[], bill) => {\n const bondIndex = bill?.bond?.index\n\n // Check if this bond index already exists in the accumulator\n const existingGroup = acc.find((group) => group.bond.index === bondIndex)\n\n if (existingGroup) {\n // If the group already exists, add this bill to the userOwnedBills array\n existingGroup.userOwnedBills.push(bill)\n } else {\n // If it doesn't exist, create a new group\n acc.push({\n bond: bill.bond as any,\n userOwnedBills: [bill],\n })\n }\n\n return acc\n }, [])\n\n const bondsOfSelectedChain = groupedBills?.filter((group) => group.bond.chainId === selectedChain)\n // Each family's adapter renders its own claim action (summary + button) for the selected chain\n const claimAllAdapter = getAdapterForChain(selectedChain)\n\n const purchasedBillsChains = groupedBills\n ?.reduce((acc: number[], bill) => {\n if (acc.includes(bill.bond.chainId)) {\n return acc\n } else return [...acc, bill.bond.chainId]\n }, [])\n ?.sort((a, b) => a - b)\n\n // Auto-select the first chain that has bonds when the current selection has none\n useEffect(() => {\n if (purchasedBillsChains?.length && !purchasedBillsChains.includes(selectedChain)) {\n setSelectedChain(purchasedBillsChains[0])\n }\n /* eslint-disable react-hooks/exhaustive-deps */\n }, [purchasedBillsChains?.length])\n\n return (\n <Modal title=\"Claim All\" className=\"ape:w-[420px]\">\n {viewAllChains ? (\n <>\n <Flex className=\"ape:justify-between ape:mb-[20px]\">\n <Flex onClick={() => setViewAllChains(false)} className=\"ape:hover:cursor-pointer\">\n <Arrow width=\"10px\" direction=\"left\" />\n </Flex>\n <Text size=\"16px\" weight={300}>\n All Chain Options\n </Text>\n </Flex>\n <ChainOptionsList\n setSelectedChain={setSelectedChain}\n setViewAllChains={setViewAllChains}\n chainList={chains}\n />\n </>\n ) : (\n <Flex className=\"ape:flex-col ape:w-full\">\n <Text size=\"14px\" weight={400} className=\"ape:my-[10px]\">\n Select the chain from which you want to claim your Bonds.\n </Text>\n <ChainOptionsButtons\n setSelectedChain={setSelectedChain}\n selectedChain={selectedChain}\n setViewAllChains={setViewAllChains}\n chainList={purchasedBillsChains ?? []}\n />\n <Flex className=\"ape:w-full ape:mt-[10px] ape:bg-white3 ape:rounded-normal ape:p-[10px] ape:flex-col ape:h-[30vh] ape:overflow-y-auto\">\n {bondsOfSelectedChain && bondsOfSelectedChain?.length > 0 ? (\n bondsOfSelectedChain\n ?.filter((userBill) => userBill.bond.chainId === selectedChain)\n .map((ownedBill, index) => {\n return (\n <Flex\n key={`${ownedBill.bond.earnToken.symbol}-${index}`}\n className=\"ape:w-full ape:items-center ape:p-[5px]\"\n >\n <TokenImage symbol={ownedBill.bond.earnToken.symbol} size={30} />\n <Text className=\"ape:ml-[10px]\">\n {ownedBill.bond.earnToken.symbol}\n <Text\n as=\"span\"\n size=\"14px\"\n weight={400}\n className=\"ape:ml-[10px]\"\n style={{ color: 'var(--ape-color-text-disabled-button)' }}\n >\n ({ownedBill?.userOwnedBills?.length} Bond\n {ownedBill?.userOwnedBills && ownedBill?.userOwnedBills?.length > 1 ? 's' : ''})\n </Text>\n </Text>\n </Flex>\n )\n })\n ) : (\n <Flex\n className=\"ape:text-[14px] ape:font-normal ape:justify-center ape:mt-[10px]\"\n style={{ color: 'var(--ape-color-text-disabled-button)' }}\n >\n No bonds to claim for this chain\n </Flex>\n )}\n </Flex>\n {claimAllAdapter?.ClaimAllAction ? (\n <claimAllAdapter.ClaimAllAction chainId={selectedChain} bondsToClaim={bondsOfSelectedChain ?? []} />\n ) : (\n <Text size=\"14px\" weight={400} className=\"ape:mt-[15px]\">\n {`Claim All isn't available for this chain; claim these bonds one by one from Your Bonds.`}\n </Text>\n )}\n </Flex>\n )}\n </Modal>\n )\n}\n\nexport default ClaimAllModal\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|