@ape.swap/bonds-sdk 5.1.7 → 5.1.8-test.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +2 -2
  2. package/dist/components/TokenSelectorModal/index.js +1 -3
  3. package/dist/components/TokenSelectorModal/index.js.map +1 -1
  4. package/dist/config/constants/networks.js +1 -1
  5. package/dist/config/constants/networks.js.map +1 -1
  6. package/dist/hooks/useMonitorTx.d.ts +1 -0
  7. package/dist/state/allowance/useAllowance.js +3 -3
  8. package/dist/state/allowance/useAllowance.js.map +1 -1
  9. package/dist/state/bonds/fetchBillsUser.js +12 -9
  10. package/dist/state/bonds/fetchBillsUser.js.map +1 -1
  11. package/dist/state/bonds/useBondsData.js +2 -6
  12. package/dist/state/bonds/useBondsData.js.map +1 -1
  13. package/dist/state/bonds/useUserBondsPreTGE.js +11 -11
  14. package/dist/state/bonds/useUserBondsPreTGE.js.map +1 -1
  15. package/dist/state/bonds/utils.js +23 -19
  16. package/dist/state/bonds/utils.js.map +1 -1
  17. package/dist/state/tiers/useTierPoints.d.ts +7 -0
  18. package/dist/state/tiers/useTierPoints.js +8 -1
  19. package/dist/state/tiers/useTierPoints.js.map +1 -1
  20. package/dist/state/tokenPrices/useTokenPrices.d.ts +1 -0
  21. package/dist/state/tokenPrices/useTokenPrices.js.map +1 -1
  22. package/dist/state/useSDKConfig.js +0 -1
  23. package/dist/state/useSDKConfig.js.map +1 -1
  24. package/dist/types/bondCodec.js +1 -1
  25. package/dist/types/bondIssuanceCodec.js +1 -1
  26. package/dist/types/bondPricingCodec.js +1 -1
  27. package/dist/types/bondTermCodec.js +1 -1
  28. package/dist/utils/bondPriceHelpers.js.map +1 -1
  29. package/dist/utils/convertToBigish.d.ts +2 -0
  30. package/dist/utils/convertToBigish.js +25 -0
  31. package/dist/utils/convertToBigish.js.map +1 -0
  32. package/dist/utils/multicall.js +31 -19
  33. package/dist/utils/multicall.js.map +1 -1
  34. package/dist/views/Bonds/components/ChainBanner/ChainBanner.js +1 -1
  35. package/dist/views/BuyBond/BuyComponent.js +2 -3
  36. package/dist/views/BuyBond/BuyComponent.js.map +1 -1
  37. package/dist/views/BuyBond/components/GetUpToComponent/GetUpToComponent.js +8 -3
  38. package/dist/views/BuyBond/components/GetUpToComponent/GetUpToComponent.js.map +1 -1
  39. package/dist/views/ProjectView/components/BondLeaderboard/index.js +1 -1
  40. package/dist/views/ProjectView/components/BondLeaderboard/index.js.map +1 -1
  41. package/dist/views/YourBonds/components/UserBondRow/UserBondRow.js +1 -1
  42. package/dist/views/YourBonds/components/UserBondRow/UserBondRowSolana.js +1 -1
  43. package/dist/views/YourBondsModal/YourBondsModal.js +1 -1
  44. package/dist/views/YourBondsModal/components/TransferBondModal/index.js +1 -1
  45. package/package.json +2 -4
  46. package/dist/utils/convertToTokenValue.d.ts +0 -4
  47. package/dist/utils/convertToTokenValue.js +0 -27
  48. package/dist/utils/convertToTokenValue.js.map +0 -1
  49. package/dist/utils/index.d.ts +0 -1
  50. package/dist/utils/index.js +0 -16
  51. package/dist/utils/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../src/state/bonds/utils.ts"],"sourcesContent":["import { BondsData, TrueBondPrices } from '../../types/bonds'\nimport { getBalanceNumber } from '../../utils/getBalanceNumber'\nimport { BillsConfig, BillVersion, ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport multicall from '../../utils/multicall'\nimport chunk from 'lodash-es/chunk.js'\nimport launchBondsABI_V2_4_1 from '../../config/abi/launchBond_v2_4_1.json'\nimport { SolanaCall, solanaMulticall } from '../../utils/solanaMulticall'\nimport { PublicKey } from '@solana/web3.js'\nimport { derivePda } from '../../utils/derivePda'\nimport { PROGRAM_ID } from '../../constants/solanaConstants'\nimport { BondIssuance, SolanaBondData, SolanaBondsResult } from '../../types/solanaBonds'\nimport BOND_2_4_0 from '../../config/abi/BOND_2_4_0.json'\nimport ERC20ABI from '../../config/abi/erc20.json'\nimport { reportError } from '../../utils/reportError'\nimport BigNumber from 'bignumber.js'\nimport { calculateTrueBondPrice } from '../../utils/calculateSolanaTrueBillPrice'\nimport axios from 'axios'\n\nexport const fetchBondsDataPreTGE = async (\n chain: number,\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n preTGEBonds: PreTGEConfig[],\n apiUrl?: string,\n): Promise<BondsData[]> => {\n try {\n if (!preTGEBonds?.length) return []\n const data = []\n const chainId = chain as ChainId\n\n const preTGEBondsIds: number[] = []\n const launchBondsCalls = preTGEBonds.flatMap((bond) => {\n preTGEBondsIds.push(bond.index)\n const bill = bond\n return [\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'trueBillPrice',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'terms',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'totalPrincipalBilled',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'finalized',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'minPoints',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'maxPoints',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'startVestingTimestamp',\n },\n ]\n })\n const vals = await multicall(chainId, launchBondsABI_V2_4_1, launchBondsCalls)\n const chunkSize = vals.length / preTGEBonds.length\n const chunkedBills = chunk(vals, chunkSize)\n const returnedBills = chunkedBills?.map((chunk: any, index) => {\n const bondConfig = preTGEBonds?.find((bill) => bill?.index === preTGEBondsIds[index])!\n\n const [trueBillPrice, terms, totalPrincipalBilled, finalized, minPoints, maxPoints, startVestingTimestamp] = chunk\n const [, , vestingTerm, , , initialRelease, totalRaise, maxTotalPayout] = terms\n\n const initPrice = getBalanceNumber(\n trueBillPrice,\n bondConfig?.lpToken?.decimals?.[bondConfig?.chainId as ChainId] ?? 18,\n )\n\n const lpPrice =\n tokenPrices?.[bondConfig?.chainId]?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() ===\n bondConfig?.lpToken?.address?.[bondConfig?.chainId]?.toLowerCase(),\n )?.price ?? 0\n const earnTokenPrice =\n tokenPrices?.[bondConfig?.chainId]?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() ===\n bondConfig?.earnToken?.address?.[bondConfig?.chainId]?.toLowerCase(),\n )?.price ?? 0\n\n const principalTokenPrice = lpPrice?.toString() ?? '0'\n const payoutTokenPrice = earnTokenPrice ? earnTokenPrice?.toString() : initPrice?.toString()\n\n const bonus = Math.round((bondConfig.tgePrice! / initPrice) * 100 - 100)\n\n const data: BondsData = {\n ...bondConfig,\n initialRelease: initialRelease / 10000,\n vestingTerm: vestingTerm?.toNumber(),\n trueBondPrices: [\n {\n points: '0',\n trueBondPrice: trueBillPrice?.toString(),\n bonus,\n bonusWithFee: bonus, // placeholder, wont be used\n },\n ],\n maxTotalPayout: maxTotalPayout?.toString(),\n totalPrincipalBilled: totalPrincipalBilled?.toString(),\n payoutTokenPrice,\n principalTokenPrice,\n totalRaise: totalRaise?.toString(),\n finalized: finalized[0],\n minPoints: minPoints.toString(),\n maxPoints: maxPoints.toString(),\n startVestingTimestamp: startVestingTimestamp?.toString(),\n initTime: { [bondConfig.chainId]: terms.startTime.toNumber() },\n finishTime: terms.endTime.toNumber(),\n initPrice,\n soldOut: finalized[0] || (terms.endTime.toNumber() ?? 0) < Date.now() / 1000 || bondConfig.soldOut,\n }\n return data\n })\n data.push(returnedBills)\n return data.flat()\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getLaunchBondsPublicData', preTGEBonds, chain, e },\n })\n return []\n }\n}\n\nexport const fetchBondsData = async (\n chainId: number,\n bills: BillsConfig[],\n apiUrl: string,\n tokenPrices?: TokenPrices[],\n priceApiUrl?: string,\n) => {\n if (!tokenPrices) return []\n try {\n if (chainId === ChainId.SOL) {\n const solanaCalls: SolanaCall[] = []\n const solanaBillIds: number[] = []\n for (const bill of bills) {\n const bondIssuanceAddress = bill.contractAddress[ChainId.SOL]\n if (!bondIssuanceAddress) continue\n\n solanaBillIds.push(bill.index)\n const bondIssuancePubkey = new PublicKey(bondIssuanceAddress)\n const bondTermPda = derivePda('bond_term', bondIssuancePubkey, PROGRAM_ID)\n const bondPricingPda = derivePda('bond_pricing', bondIssuancePubkey, PROGRAM_ID)\n solanaCalls.push(\n { accountAddress: bondIssuanceAddress, accountType: 'bondIssuance' },\n { accountAddress: bondTermPda.toBase58(), accountType: 'bondTerm' },\n { accountAddress: bondPricingPda.toBase58(), accountType: 'bondPricing' },\n )\n }\n // Fetch Solana bills\n const solanaResults = (await solanaMulticall(solanaCalls)) as SolanaBondsResult\n\n const solanaBills =\n solanaResults?.bondIssuance\n ?.map((bondIssuance: BondIssuance, index: number) => {\n const vestingTermDuration = Number(solanaResults.bondTerm[index]?.vestingEnd.toString())\n const bill = {\n ...bondIssuance,\n ...solanaResults.bondPricing[index],\n terms: solanaResults.bondTerm[index],\n } as SolanaBondData\n\n return [\n bill.trueBillPrice,\n bill.totalPayoutGiven,\n [bill.terms.controlVariable, vestingTermDuration, bill.terms.minimumDebt, bill.terms.maxPayout],\n bill.terms.maxTotalPayout,\n parseFloat(bill.feeInPayout.toString()),\n parseFloat(bill.feeInPrincipal.toString()) / 10000,\n false,\n undefined,\n undefined,\n solanaResults.bondPricing[index],\n solanaResults.bondTerm[index],\n ] // Map to reflect evm structure\n })\n .filter((bill: any) => typeof bill !== 'undefined') ?? []\n const allBillsIds = []\n const allBillsData = []\n if (solanaBills.length > 0) {\n allBillsIds.push(...solanaBillIds)\n allBillsData.push(...solanaBills)\n }\n return await cleanBillsData(allBillsIds, allBillsData, chainId, bills, tokenPrices, priceApiUrl)\n } else {\n const billIds: number[] = []\n const billCalls = bills.flatMap((bill) => {\n billIds.push(bill.index)\n return [\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: bill.billVersion === BillVersion.V4 ? 'trueBondPrices' : 'trueBillPrice()',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'totalPayoutGiven',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'terms',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: bill.billVersion !== BillVersion.V1 ? 'getMaxTotalPayout' : 'maxTotalPayout',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'feeInPayout',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'feeInPrincipal',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'paused',\n },\n // keep custom treasury at the very last position\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'customTreasury',\n },\n ]\n })\n const vals = await multicall(chainId, BOND_2_4_0, billCalls)\n\n // The following lines basically grab the values from customTreasury returned from bills contract and then,\n // appends the treasury contract's balance to the chunk that will be passed to cleanBillsData\n\n // appendIndex value assumes customTreasury will be at the end of the billCalls array\n const appendIndex = billCalls.length / bills.length\n const treasuryAddresses = vals\n .filter((_: any, i: number) => (i % appendIndex) + 1 === appendIndex)\n .map((customTreasury: string[]) => customTreasury[0])\n const treasuryBalanceCalls = treasuryAddresses.map((treasuryAddress: string, i: number) => ({\n address: bills?.[i]?.earnToken?.address?.[chainId as ChainId] ?? '',\n name: 'balanceOf',\n params: [treasuryAddress],\n }))\n const treasuryBalances = await multicall(chainId, ERC20ABI, treasuryBalanceCalls)\n const updatedVals = vals.reduce((acc: any, val: any, index: number) => {\n acc.push(val)\n if ((index + 1) % appendIndex === 0) {\n const pos = (index + 1) / appendIndex\n acc.push(treasuryBalances[pos - 1])\n }\n return acc\n }, [])\n\n //\n const chunkSize = updatedVals?.length / bills?.length\n const chunkedBills = chunk(updatedVals, chunkSize)\n\n return await cleanBillsData(billIds, chunkedBills, chainId, bills, tokenPrices, priceApiUrl)\n }\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getBondsData', e },\n })\n return []\n }\n}\n\nconst cleanBillsData = async (\n billIds: number[],\n chunkedBills: any[],\n chainId: ChainId,\n bills: BillsConfig[],\n tokenPrices?: TokenPrices[],\n priceApiUrl?: string,\n): Promise<BondsData[]> => {\n const data: BondsData[] = await Promise.all(\n chunkedBills?.map(async (chunk, index) => {\n const bill = bills?.find((bill) => bill?.index === billIds[index]) as BillsConfig\n\n let lpPrice = tokenPrices?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() === bill?.lpToken?.address?.[bill?.chainId]?.toLowerCase() &&\n tokenPrice?.chainId === chainId,\n )?.price\n\n if (lpPrice === undefined) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bill?.lpToken?.address?.[bill?.chainId]}&chain=${bill?.chainId}`,\n )\n console.log('Individual call for: ', bill.lpToken.symbol, '. Price: ', res.data.price)\n lpPrice = parseFloat(res.data.price ?? '0')\n } catch {\n lpPrice = 0\n }\n }\n\n let earnTokenPrice = tokenPrices?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() === bill?.earnToken?.address?.[bill?.chainId]?.toLowerCase() &&\n tokenPrice?.chainId === chainId,\n )?.price\n\n if (earnTokenPrice === undefined) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bill?.earnToken?.address?.[bill?.chainId]}&chain=${bill?.chainId}`,\n )\n console.log('Individual call for: ', bill.earnToken.symbol, '. Price: ', res.data.price)\n earnTokenPrice = parseFloat(res.data.price ?? '0')\n } catch {\n earnTokenPrice = 0\n }\n }\n\n const [\n trueBillPriceFromChunk,\n totalPayoutGiven,\n terms,\n maxTotalPayout,\n fee,\n feeInPrincipal,\n paused,\n ,\n customTreasuryBalance,\n bondPricing,\n bondTerms,\n ] = chunk\n let trueBillPrice = trueBillPriceFromChunk\n\n const feeInPayout = Number(fee / 10000)\n const [, vestingTerm, , maxPayout] = terms\n const tokensRemaining = new BigNumber(maxTotalPayout ?? '0')\n .minus(new BigNumber(totalPayoutGiven))\n .div(new BigNumber(10).pow(bill?.earnToken.decimals[bill?.chainId] ?? 18))\n .toNumber()\n const treasuryBalance = getBalanceNumber(customTreasuryBalance, bill?.earnToken?.decimals?.[bill?.chainId] ?? 18)\n\n if (chainId === ChainId.SOL) {\n const principalDecimals = bill?.lpToken.decimals[ChainId.SOL] as number\n const payoutDecimals = bill?.earnToken.decimals[ChainId.SOL] as number\n const timeStamp = Math.floor(Date.now() / 1000)\n trueBillPrice = calculateTrueBondPrice(\n bondPricing,\n bondTerms,\n timeStamp,\n principalDecimals,\n payoutDecimals,\n feeInPrincipal,\n )\n }\n\n let trueBondPrices: TrueBondPrices[] = []\n if (bill?.billVersion === BillVersion.V4) {\n trueBondPrices = trueBillPrice[0].map((data: any) => {\n return {\n points: data[2].toString(),\n trueBondPrice: data[0].toString(),\n bonus: getRawBonus(data[0].toString(), lpPrice, earnTokenPrice),\n bonusWithFee: getBonusWithFee(feeInPayout, data[0].toString(), lpPrice, earnTokenPrice),\n }\n })\n } else {\n const bonus: number = getRawBonus(trueBillPrice, lpPrice, earnTokenPrice)\n const bonusWithFee = getBonusWithFee(feeInPayout, trueBillPrice, lpPrice, earnTokenPrice)\n trueBondPrices = [\n {\n points: '0',\n trueBondPrice: trueBillPrice.toString(),\n bonus,\n bonusWithFee,\n },\n ]\n }\n const cleanedData: BondsData = {\n ...bill,\n soldOut: paused[0] ? true : bill.soldOut,\n feeInPayout,\n feeInPrincipal,\n showcaseTokenName: bill?.showcaseToken?.symbol ?? bill?.earnToken.symbol ?? '',\n trueBondPrices,\n principalTokenPrice: lpPrice?.toString(),\n payoutTokenPrice: earnTokenPrice?.toString(),\n tokensRemaining: treasuryBalance\n ? Math.min(treasuryBalance, tokensRemaining).toString()\n : tokensRemaining.toString(),\n maxTotalPayout: maxTotalPayout?.toString(),\n maxPayout: maxPayout?.toString(),\n totalPayoutGiven: totalPayoutGiven?.toString(),\n vestingTerm: typeof vestingTerm === 'number' ? vestingTerm : vestingTerm.toNumber(),\n }\n return cleanedData\n }),\n )\n return data\n}\n\nexport const getBonusWithFee = (\n feeInPayout: number,\n trueBillPrice: string,\n lpPrice: number,\n earnTokenPrice: number,\n) => {\n const fee = feeInPayout ?? 0\n const reverseFee = new BigNumber(fee / 100 / (1 - fee / 100))\n const trueBondPrice = new BigNumber(trueBillPrice).plus(new BigNumber(trueBillPrice).times(reverseFee))\n const priceUSDMinusFee = getBalanceNumber(trueBondPrice) * lpPrice\n const discountWithoutFee = ((earnTokenPrice - priceUSDMinusFee) / earnTokenPrice) * 100\n return discountWithoutFee > 0 ? (discountWithoutFee / (100 - discountWithoutFee)) * 100 : 0\n}\n\nconst getRawBonus = (trueBillPrice: any, lpPrice: number, earnTokenPrice: number) => {\n const priceUsd = getBalanceNumber(trueBillPrice.toString()) * lpPrice\n const discount: number = ((earnTokenPrice - priceUsd) / earnTokenPrice) * 100\n return discount > 0 ? (discount / (100 - discount)) * 100 : 0\n}\n"],"names":["launchBondsABI_V2_4_1","BOND_2_4_0","ERC20ABI"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../src/state/bonds/utils.ts"],"sourcesContent":["import { BondsData, TrueBondPrices } from '../../types/bonds'\nimport { getBalanceNumber } from '../../utils/getBalanceNumber'\nimport { BillsConfig, BillVersion, ChainId, PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport multicall from '../../utils/multicall'\nimport chunk from 'lodash-es/chunk.js'\nimport launchBondsABI_V2_4_1 from '../../config/abi/launchBond_v2_4_1.json'\nimport { SolanaCall, solanaMulticall } from '../../utils/solanaMulticall'\nimport { PublicKey } from '@solana/web3.js'\nimport { derivePda } from '../../utils/derivePda'\nimport { PROGRAM_ID } from '../../constants/solanaConstants'\nimport { BondIssuance, SolanaBondData, SolanaBondsResult } from '../../types/solanaBonds'\nimport BOND_2_4_0 from '../../config/abi/BOND_2_4_0.json'\nimport ERC20ABI from '../../config/abi/erc20.json'\nimport { reportError } from '../../utils/reportError'\nimport BigNumber from 'bignumber.js'\nimport { calculateTrueBondPrice } from '../../utils/calculateSolanaTrueBillPrice'\nimport axios from 'axios'\nimport { TIER_MAPPING } from '../tiers/useTierPoints'\n\nexport const fetchBondsDataPreTGE = async (\n chain: number,\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n preTGEBonds: PreTGEConfig[],\n apiUrl?: string,\n): Promise<BondsData[]> => {\n try {\n if (!preTGEBonds?.length) return []\n const data = []\n const chainId = chain as ChainId\n\n const preTGEBondsIds: number[] = []\n const launchBondsCalls = preTGEBonds.flatMap((bond) => {\n preTGEBondsIds.push(bond.index)\n const bill = bond\n return [\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'trueBillPrice',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'terms',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'totalPrincipalBilled',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'finalized',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'minPoints',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'maxPoints',\n },\n {\n address: bill.contractAddress[bill.chainId] as string,\n name: 'startVestingTimestamp',\n },\n ]\n })\n const vals = await multicall(chainId, launchBondsABI_V2_4_1, launchBondsCalls)\n const chunkSize = vals.length / preTGEBonds.length\n const chunkedBills = chunk(vals, chunkSize)\n const returnedBills = chunkedBills?.map((chunk: any, index) => {\n const bondConfig = preTGEBonds?.find((bill) => bill?.index === preTGEBondsIds[index])!\n\n const [trueBillPrice, terms, totalPrincipalBilled, finalized, minPoints, maxPoints, startVestingTimestamp] = chunk\n const [, , vestingTerm, , , initialRelease, totalRaise, maxTotalPayout] = terms\n\n const initPrice = getBalanceNumber(\n trueBillPrice,\n bondConfig?.lpToken?.decimals?.[bondConfig?.chainId as ChainId] ?? 18,\n )\n\n const lpPrice =\n tokenPrices?.[bondConfig?.chainId]?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() ===\n bondConfig?.lpToken?.address?.[bondConfig?.chainId]?.toLowerCase(),\n )?.price ?? 0\n const earnTokenPrice =\n tokenPrices?.[bondConfig?.chainId]?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() ===\n bondConfig?.earnToken?.address?.[bondConfig?.chainId]?.toLowerCase(),\n )?.price ?? 0\n\n const principalTokenPrice = lpPrice?.toString() ?? '0'\n const payoutTokenPrice = earnTokenPrice ? earnTokenPrice?.toString() : initPrice?.toString()\n\n const bonus = Math.round((bondConfig.tgePrice! / initPrice) * 100 - 100)\n\n const data: BondsData = {\n ...bondConfig,\n initialRelease: initialRelease / 10000,\n vestingTerm: parseInt(vestingTerm),\n trueBondPrices: [\n {\n points: '0',\n trueBondPrice: trueBillPrice?.toString(),\n bonus,\n bonusWithFee: bonus, // placeholder, wont be used\n },\n ],\n maxTotalPayout: maxTotalPayout?.toString(),\n totalPrincipalBilled: totalPrincipalBilled?.toString(),\n payoutTokenPrice,\n principalTokenPrice,\n totalRaise: totalRaise?.toString(),\n finalized: finalized[0],\n minPoints: minPoints.toString(),\n maxPoints: maxPoints.toString(),\n startVestingTimestamp: startVestingTimestamp?.toString(),\n initTime: { [bondConfig.chainId]: parseInt(terms[1]) },\n finishTime: parseInt(terms[0]),\n initPrice,\n soldOut: finalized[0] || (parseInt(terms[0]) ?? 0) < Date.now() / 1000 || bondConfig.soldOut,\n }\n return data\n })\n data.push(returnedBills)\n return data.flat()\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getLaunchBondsPublicData', preTGEBonds, chain, e },\n })\n return []\n }\n}\n\nexport const fetchBondsData = async (\n chainId: number,\n bills: BillsConfig[],\n apiUrl: string,\n tokenPrices?: TokenPrices[],\n priceApiUrl?: string,\n) => {\n if (!tokenPrices) return []\n try {\n if (chainId === ChainId.SOL) {\n const solanaCalls: SolanaCall[] = []\n const solanaBillIds: number[] = []\n for (const bill of bills) {\n const bondIssuanceAddress = bill.contractAddress[ChainId.SOL]\n if (!bondIssuanceAddress) continue\n\n solanaBillIds.push(bill.index)\n const bondIssuancePubkey = new PublicKey(bondIssuanceAddress)\n const bondTermPda = derivePda('bond_term', bondIssuancePubkey, PROGRAM_ID)\n const bondPricingPda = derivePda('bond_pricing', bondIssuancePubkey, PROGRAM_ID)\n solanaCalls.push(\n { accountAddress: bondIssuanceAddress, accountType: 'bondIssuance' },\n { accountAddress: bondTermPda.toBase58(), accountType: 'bondTerm' },\n { accountAddress: bondPricingPda.toBase58(), accountType: 'bondPricing' },\n )\n }\n // Fetch Solana bills\n const solanaResults = (await solanaMulticall(solanaCalls)) as SolanaBondsResult\n\n const solanaBills =\n solanaResults?.bondIssuance\n ?.map((bondIssuance: BondIssuance, index: number) => {\n const vestingTermDuration = Number(solanaResults.bondTerm[index]?.vestingEnd.toString())\n const bill = {\n ...bondIssuance,\n ...solanaResults.bondPricing[index],\n terms: solanaResults.bondTerm[index],\n } as SolanaBondData\n\n return [\n bill.trueBillPrice,\n bill.totalPayoutGiven,\n [bill.terms.controlVariable, vestingTermDuration, bill.terms.minimumDebt, bill.terms.maxPayout],\n bill.terms.maxTotalPayout,\n parseFloat(bill.feeInPayout.toString()),\n parseFloat(bill.feeInPrincipal.toString()) / 10000,\n false,\n undefined,\n undefined,\n solanaResults.bondPricing[index],\n solanaResults.bondTerm[index],\n ] // Map to reflect evm structure\n })\n .filter((bill: any) => typeof bill !== 'undefined') ?? []\n const allBillsIds = []\n const allBillsData = []\n if (solanaBills.length > 0) {\n allBillsIds.push(...solanaBillIds)\n allBillsData.push(...solanaBills)\n }\n return await cleanBillsData(allBillsIds, allBillsData, chainId, bills, tokenPrices, priceApiUrl)\n } else {\n const billIds: number[] = []\n const billCalls = bills.flatMap((bill) => {\n billIds.push(bill.index)\n return [\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: bill.billVersion === BillVersion.V4 ? 'trueBondPrices' : 'trueBillPrice()',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'totalPayoutGiven',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'terms',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: bill.billVersion !== BillVersion.V1 ? 'getMaxTotalPayout' : 'maxTotalPayout',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'feeInPayout',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'feeInPrincipal',\n },\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'paused',\n },\n // keep custom treasury at the very last position\n {\n address: bill.contractAddress[bill.chainId] ?? '',\n name: 'customTreasury',\n },\n ]\n })\n const vals = await multicall(chainId, BOND_2_4_0, billCalls)\n\n // The following lines basically grab the values from customTreasury returned from bills contract and then,\n // appends the treasury contract's balance to the chunk that will be passed to cleanBillsData\n\n // appendIndex value assumes customTreasury will be at the end of the billCalls array\n const appendIndex = billCalls.length / bills.length\n const treasuryAddresses = vals\n .filter((_: any, i: number) => (i % appendIndex) + 1 === appendIndex)\n .map((customTreasury: string[]) => customTreasury[0])\n const treasuryBalanceCalls = treasuryAddresses.map((treasuryAddress: string, i: number) => ({\n address: bills?.[i]?.earnToken?.address?.[chainId as ChainId] ?? '',\n name: 'balanceOf',\n params: [treasuryAddress],\n }))\n const treasuryBalances = await multicall(chainId, ERC20ABI, treasuryBalanceCalls)\n const updatedVals = vals.reduce((acc: any, val: any, index: number) => {\n acc.push(val)\n if ((index + 1) % appendIndex === 0) {\n const pos = (index + 1) / appendIndex\n acc.push(treasuryBalances[pos - 1])\n }\n return acc\n }, [])\n\n //\n const chunkSize = updatedVals?.length / bills?.length\n const chunkedBills = chunk(updatedVals, chunkSize)\n\n return await cleanBillsData(billIds, chunkedBills, chainId, bills, tokenPrices, priceApiUrl)\n }\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getBondsData', e },\n })\n return []\n }\n}\n\nconst cleanBillsData = async (\n billIds: number[],\n chunkedBills: any[],\n chainId: ChainId,\n bills: BillsConfig[],\n tokenPrices?: TokenPrices[],\n priceApiUrl?: string,\n): Promise<BondsData[]> => {\n const data: BondsData[] = await Promise.all(\n chunkedBills?.map(async (chunk, index) => {\n const bill = bills?.find((bill) => bill?.index === billIds[index]) as BillsConfig\n\n let principalTokenPrice = tokenPrices?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() === bill?.lpToken?.address?.[bill?.chainId]?.toLowerCase() &&\n tokenPrice?.chainId === chainId,\n )\n\n if (principalTokenPrice === undefined || !!principalTokenPrice.error) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bill?.lpToken?.address?.[bill?.chainId]}&chain=${bill?.chainId}`,\n )\n console.log('Individual call for: ', bill.lpToken.symbol, '. Price: ', res.data.price)\n principalTokenPrice = res.data\n } catch {\n console.error('Failed to fetch price for: ', bill.lpToken.symbol)\n }\n }\n\n let payoutTokenPrice = tokenPrices?.find(\n (tokenPrice) =>\n tokenPrice?.tokenAddress?.toLowerCase() === bill?.earnToken?.address?.[bill?.chainId]?.toLowerCase() &&\n tokenPrice?.chainId === chainId,\n )\n\n if (payoutTokenPrice === undefined || !!payoutTokenPrice.error) {\n try {\n // Missing token price, therefor make a single call to api to fetch it\n const res = await axios.get(\n `${priceApiUrl}/realtime/price?token=${bill?.earnToken?.address?.[bill?.chainId]}&chain=${bill?.chainId}`,\n )\n console.log('Individual call for: ', bill.earnToken.symbol, '. Price: ', res.data.price)\n payoutTokenPrice = res.data\n } catch {\n console.error('Failed to fetch price for: ', bill.earnToken.symbol)\n }\n }\n const lpPrice = principalTokenPrice?.price ?? 0\n const earnTokenPrice = payoutTokenPrice?.price ?? 0\n\n const [\n trueBillPriceFromChunk,\n totalPayoutGiven,\n terms,\n maxTotalPayout,\n fee,\n feeInPrincipal,\n paused,\n ,\n customTreasuryBalance,\n bondPricing,\n bondTerms,\n ] = chunk\n let trueBillPrice = trueBillPriceFromChunk\n\n const feeInPayout = Number(fee / 10000)\n const [, vestingTerm, , maxPayout] = terms\n const tokensRemaining = new BigNumber(maxTotalPayout ?? '0')\n .minus(new BigNumber(totalPayoutGiven))\n .div(new BigNumber(10).pow(bill?.earnToken.decimals[bill?.chainId] ?? 18))\n .toNumber()\n const treasuryBalance = getBalanceNumber(customTreasuryBalance, bill?.earnToken?.decimals?.[bill?.chainId] ?? 18)\n\n if (chainId === ChainId.SOL) {\n const principalDecimals = bill?.lpToken.decimals[ChainId.SOL] as number\n const payoutDecimals = bill?.earnToken.decimals[ChainId.SOL] as number\n const timeStamp = Math.floor(Date.now() / 1000)\n trueBillPrice = calculateTrueBondPrice(\n bondPricing,\n bondTerms,\n timeStamp,\n principalDecimals,\n payoutDecimals,\n feeInPrincipal,\n )\n }\n\n let trueBondPrices: TrueBondPrices[] = []\n if (bill?.billVersion === BillVersion.V4) {\n trueBondPrices = trueBillPrice[0].map((data: any) => {\n return {\n points: data?.points?.toString(),\n trueBondPrice: data?.trueBondPrice.toString(),\n bonus: getRawBonus(data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),\n bonusWithFee: getBonusWithFee(feeInPayout, data?.trueBondPrice.toString(), lpPrice, earnTokenPrice),\n boost: TIER_MAPPING[data?.points?.toString() as keyof typeof TIER_MAPPING],\n }\n })\n } else {\n const bonus: number = getRawBonus(trueBillPrice, lpPrice, earnTokenPrice)\n const bonusWithFee = getBonusWithFee(feeInPayout, trueBillPrice, lpPrice, earnTokenPrice)\n trueBondPrices = [\n {\n points: '0',\n trueBondPrice: trueBillPrice.toString(),\n bonus,\n bonusWithFee,\n },\n ]\n }\n const cleanedData: BondsData = {\n ...bill,\n soldOut: paused[0] ? true : bill.soldOut,\n feeInPayout,\n feeInPrincipal,\n showcaseTokenName: bill?.showcaseToken?.symbol ?? bill?.earnToken.symbol ?? '',\n trueBondPrices,\n principalTokenPrice: lpPrice?.toString(),\n payoutTokenPrice: earnTokenPrice?.toString(),\n tokensRemaining: treasuryBalance\n ? Math.min(treasuryBalance, tokensRemaining).toString()\n : tokensRemaining.toString(),\n maxTotalPayout: maxTotalPayout?.toString(),\n maxPayout: maxPayout?.toString(),\n totalPayoutGiven: totalPayoutGiven?.toString(),\n vestingTerm: typeof vestingTerm === 'number' ? vestingTerm : parseInt(vestingTerm),\n }\n return cleanedData\n }),\n )\n return data\n}\n\nexport const getBonusWithFee = (\n feeInPayout: number,\n trueBillPrice: string,\n lpPrice: number,\n earnTokenPrice: number,\n) => {\n const fee = feeInPayout ?? 0\n const reverseFee = new BigNumber(fee / 100 / (1 - fee / 100))\n const trueBondPrice = new BigNumber(trueBillPrice).plus(new BigNumber(trueBillPrice).times(reverseFee))\n const priceUSDMinusFee = getBalanceNumber(trueBondPrice) * lpPrice\n const discountWithoutFee = ((earnTokenPrice - priceUSDMinusFee) / earnTokenPrice) * 100\n return discountWithoutFee > 0 ? (discountWithoutFee / (100 - discountWithoutFee)) * 100 : 0\n}\n\nconst getRawBonus = (trueBillPrice: any, lpPrice: number, earnTokenPrice: number) => {\n const priceUsd = getBalanceNumber(trueBillPrice.toString()) * lpPrice\n const discount: number = ((earnTokenPrice - priceUsd) / earnTokenPrice) * 100\n return discount > 0 ? (discount / (100 - discount)) * 100 : 0\n}\n"],"names":["launchBondsABI_V2_4_1","BOND_2_4_0","ERC20ABI"],"mappings":"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"}
@@ -13,6 +13,13 @@ export declare const TIERS_WEIGHT: {
13
13
  4: string;
14
14
  5: string;
15
15
  };
16
+ export declare const TIER_MAPPING: {
17
+ '10000000000000000000000': LaunchBondTiers;
18
+ '50000000000000000000000': LaunchBondTiers;
19
+ '200000000000000000000000': LaunchBondTiers;
20
+ '500000000000000000000000': LaunchBondTiers;
21
+ '1000000000000000000000000': LaunchBondTiers;
22
+ };
16
23
  export declare const TIERS_NAMES: {
17
24
  null: string;
18
25
  1: string;
@@ -23,6 +23,13 @@ const TIERS_WEIGHT = {
23
23
  [LaunchBondTiers.Legend]: '500000000000000000000000',
24
24
  [LaunchBondTiers.Mythical]: '1000000000000000000000000',
25
25
  };
26
+ const TIER_MAPPING = {
27
+ '10000000000000000000000': LaunchBondTiers.Silver,
28
+ '50000000000000000000000': LaunchBondTiers.Gold,
29
+ '200000000000000000000000': LaunchBondTiers.Diamond,
30
+ '500000000000000000000000': LaunchBondTiers.Legend,
31
+ '1000000000000000000000000': LaunchBondTiers.Mythical,
32
+ };
26
33
  const TIERS_NAMES = {
27
34
  null: 'No Tier',
28
35
  [LaunchBondTiers.Silver]: 'Silver',
@@ -96,5 +103,5 @@ function useTierPoints() {
96
103
  });
97
104
  }
98
105
 
99
- export { TIERS_COLORS, TIERS_NAMES, TIERS_WEIGHT, useTierPoints as default, fetchUserPoints, getUserTier };
106
+ export { TIERS_COLORS, TIERS_NAMES, TIERS_WEIGHT, TIER_MAPPING, useTierPoints as default, fetchUserPoints, getUserTier };
100
107
  //# sourceMappingURL=useTierPoints.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTierPoints.js","sources":["../../../src/state/tiers/useTierPoints.ts"],"sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport lensContractABI from '../../config/abi/lensContract.json'\nimport { LENS_CONTRACT } from '../../config/constants/addresses'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport multicall from '../../utils/multicall'\nimport { LaunchBondTiers } from '@ape.swap/apeswap-lists'\nimport BigNumber from 'bignumber.js'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { useSDKConfig } from '../useSDKConfig'\nimport { reportError } from '../../utils/reportError'\nimport useEVMAccount from '../../hooks/accounts/useEVMAccount'\n\nexport const TIERS_COLORS = {\n [LaunchBondTiers.Silver]: 'linear-gradient(90deg, #3A3A3C 0%, #2C2C2F 100%)',\n [LaunchBondTiers.Gold]: 'linear-gradient(90deg, #BC933F 0%, #56431D 100%)',\n [LaunchBondTiers.Diamond]: 'linear-gradient(90deg, #1174A2 0%, #062B3C 100%)',\n [LaunchBondTiers.Legend]: 'linear-gradient(90deg, #6B43D7 0%, #382371 100%)',\n [LaunchBondTiers.Mythical]: 'linear-gradient(90deg, #DFA9D2 -13.84%, #790524 10.35%, #DFA9D2 38.05%, #790524 76.31%)',\n}\n\nexport const TIERS_WEIGHT = {\n [LaunchBondTiers.Silver]: '10000000000000000000000',\n [LaunchBondTiers.Gold]: '50000000000000000000000',\n [LaunchBondTiers.Diamond]: '200000000000000000000000',\n [LaunchBondTiers.Legend]: '500000000000000000000000',\n [LaunchBondTiers.Mythical]: '1000000000000000000000000',\n}\n\nexport const TIERS_NAMES = {\n null: 'No Tier',\n [LaunchBondTiers.Silver]: 'Silver',\n [LaunchBondTiers.Gold]: 'Gold',\n [LaunchBondTiers.Diamond]: 'Diamond',\n [LaunchBondTiers.Legend]: 'Legend',\n [LaunchBondTiers.Mythical]: 'Mythical',\n}\n\nexport const getUserTier = (weight?: string | null): LaunchBondTiers | null => {\n if (!weight) return null\n const weightBG = new BigNumber(weight)\n const silver = new BigNumber(TIERS_WEIGHT[LaunchBondTiers.Silver])\n const gold = new BigNumber(TIERS_WEIGHT[LaunchBondTiers.Gold])\n const diamond = new BigNumber(TIERS_WEIGHT[LaunchBondTiers.Diamond])\n const legend = new BigNumber(TIERS_WEIGHT[LaunchBondTiers.Legend])\n const mythical = new BigNumber(TIERS_WEIGHT[LaunchBondTiers.Mythical])\n\n if (weightBG.gte(mythical)) {\n return LaunchBondTiers.Mythical\n } else if (weightBG.gte(legend)) {\n return LaunchBondTiers.Legend\n } else if (weightBG.gte(diamond)) {\n return LaunchBondTiers.Diamond\n } else if (weightBG.gte(gold)) {\n return LaunchBondTiers.Gold\n } else if (weightBG.gte(silver)) {\n return LaunchBondTiers.Silver\n }\n return null\n}\n\nexport const fetchUserPoints = async (\n account?: string,\n useTiers?: boolean,\n apiUrl?: string,\n): Promise<string | null> => {\n const lensContractAddress = LENS_CONTRACT[ChainId.BSC]\n if (account && useTiers) {\n try {\n const res = await multicall(ChainId.BSC, lensContractABI, [\n {\n address: lensContractAddress,\n name: 'getEscrowWeight',\n params: [account],\n },\n ])\n return new BigNumber(res[0][0].toString()).times(2).toString()\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'fetchUserPoints', e },\n account,\n })\n return '0'\n }\n } else return '0'\n}\n\nexport default function useTierPoints() {\n const { address: account } = useEVMAccount()\n const SDKConfig = useSDKConfig()\n const apiUrl = SDKConfig?.urls?.apiV2\n return useQuery({\n queryKey: [QUERY_KEYS.TIERS, account],\n queryFn: () => fetchUserPoints(account, SDKConfig.useTiers, apiUrl),\n refetchInterval: 120000, // i.e. 2 mins\n refetchOnWindowFocus: false,\n })\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTierPoints.js","sources":["../../../src/state/tiers/useTierPoints.ts"],"sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport lensContractABI from '../../config/abi/lensContract.json'\nimport { LENS_CONTRACT } from '../../config/constants/addresses'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport multicall from '../../utils/multicall'\nimport { LaunchBondTiers } from '@ape.swap/apeswap-lists'\nimport BigNumber from 'bignumber.js'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { useSDKConfig } from '../useSDKConfig'\nimport { reportError } from '../../utils/reportError'\nimport useEVMAccount from '../../hooks/accounts/useEVMAccount'\n\nexport const TIERS_COLORS = {\n [LaunchBondTiers.Silver]: 'linear-gradient(90deg, #3A3A3C 0%, #2C2C2F 100%)',\n [LaunchBondTiers.Gold]: 'linear-gradient(90deg, #BC933F 0%, #56431D 100%)',\n [LaunchBondTiers.Diamond]: 'linear-gradient(90deg, #1174A2 0%, #062B3C 100%)',\n [LaunchBondTiers.Legend]: 'linear-gradient(90deg, #6B43D7 0%, #382371 100%)',\n [LaunchBondTiers.Mythical]: 'linear-gradient(90deg, #DFA9D2 -13.84%, #790524 10.35%, #DFA9D2 38.05%, #790524 76.31%)',\n}\n\nexport const TIERS_WEIGHT = {\n [LaunchBondTiers.Silver]: '10000000000000000000000',\n [LaunchBondTiers.Gold]: '50000000000000000000000',\n [LaunchBondTiers.Diamond]: '200000000000000000000000',\n [LaunchBondTiers.Legend]: '500000000000000000000000',\n [LaunchBondTiers.Mythical]: '1000000000000000000000000',\n}\n\nexport const TIER_MAPPING = {\n '10000000000000000000000': LaunchBondTiers.Silver,\n '50000000000000000000000': LaunchBondTiers.Gold,\n '200000000000000000000000': LaunchBondTiers.Diamond,\n '500000000000000000000000': LaunchBondTiers.Legend,\n '1000000000000000000000000': LaunchBondTiers.Mythical,\n}\n\nexport const TIERS_NAMES = {\n null: 'No Tier',\n [LaunchBondTiers.Silver]: 'Silver',\n [LaunchBondTiers.Gold]: 'Gold',\n [LaunchBondTiers.Diamond]: 'Diamond',\n [LaunchBondTiers.Legend]: 'Legend',\n [LaunchBondTiers.Mythical]: 'Mythical',\n}\n\nexport const getUserTier = (weight?: string | null): LaunchBondTiers | null => {\n if (!weight) return null\n const weightBG = new BigNumber(weight)\n const silver = new BigNumber(TIERS_WEIGHT[LaunchBondTiers.Silver])\n const gold = new BigNumber(TIERS_WEIGHT[LaunchBondTiers.Gold])\n const diamond = new BigNumber(TIERS_WEIGHT[LaunchBondTiers.Diamond])\n const legend = new BigNumber(TIERS_WEIGHT[LaunchBondTiers.Legend])\n const mythical = new BigNumber(TIERS_WEIGHT[LaunchBondTiers.Mythical])\n\n if (weightBG.gte(mythical)) {\n return LaunchBondTiers.Mythical\n } else if (weightBG.gte(legend)) {\n return LaunchBondTiers.Legend\n } else if (weightBG.gte(diamond)) {\n return LaunchBondTiers.Diamond\n } else if (weightBG.gte(gold)) {\n return LaunchBondTiers.Gold\n } else if (weightBG.gte(silver)) {\n return LaunchBondTiers.Silver\n }\n return null\n}\n\nexport const fetchUserPoints = async (\n account?: string,\n useTiers?: boolean,\n apiUrl?: string,\n): Promise<string | null> => {\n const lensContractAddress = LENS_CONTRACT[ChainId.BSC]\n if (account && useTiers) {\n try {\n const res = await multicall(ChainId.BSC, lensContractABI, [\n {\n address: lensContractAddress,\n name: 'getEscrowWeight',\n params: [account],\n },\n ])\n return new BigNumber(res[0][0].toString()).times(2).toString()\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'fetchUserPoints', e },\n account,\n })\n return '0'\n }\n } else return '0'\n}\n\nexport default function useTierPoints() {\n const { address: account } = useEVMAccount()\n const SDKConfig = useSDKConfig()\n const apiUrl = SDKConfig?.urls?.apiV2\n return useQuery({\n queryKey: [QUERY_KEYS.TIERS, account],\n queryFn: () => fetchUserPoints(account, SDKConfig.useTiers, apiUrl),\n refetchInterval: 120000, // i.e. 2 mins\n refetchOnWindowFocus: false,\n })\n}\n"],"names":[],"mappings":"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"}
@@ -10,6 +10,7 @@ export interface TokenPrices {
10
10
  priceSource: string;
11
11
  updatedAt: number;
12
12
  secondsAgoUpdated: number;
13
+ error?: string;
13
14
  }
14
15
  export default function useTokenPrices(): UseQueryResult<Partial<Record<ChainId, TokenPrices[]>>>;
15
16
  export declare const getTokenPrices: (priceApi: string, apiv2: string) => Promise<Partial<Record<ChainId, TokenPrices[]>>>;
@@ -1 +1 @@
1
- {"version":3,"file":"useTokenPrices.js","sources":["../../../src/state/tokenPrices/useTokenPrices.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport axios from 'axios'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { useSDKConfig } from '../useSDKConfig'\nimport { reportError } from '../../utils/reportError'\n\nexport interface TokenPrices {\n chainId: ChainId\n chainName: string\n tokenAddress: string\n name: string\n symbol: string\n price: number\n priceSource: string\n updatedAt: number\n secondsAgoUpdated: number\n}\n\nexport default function useTokenPrices(): UseQueryResult<Partial<Record<ChainId, TokenPrices[]>>> {\n const SDKConfig = useSDKConfig()\n const priceApi = SDKConfig?.urls?.priceApi\n const apiv2 = SDKConfig?.urls?.apiV2\n return useQuery({\n queryKey: [QUERY_KEYS.TOKEN_PRICES],\n queryFn: () => getTokenPrices(priceApi, apiv2),\n refetchInterval: 30000, // 30 sec\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n })\n}\n\nexport const getTokenPrices = async (\n priceApi: string,\n apiv2: string,\n): Promise<Partial<Record<ChainId, TokenPrices[]>>> => {\n try {\n const response = await axios.get(`${priceApi}/realtime/prices`)\n return response.data\n } catch (error) {\n reportError({\n apiUrl: apiv2,\n error,\n extraInfo: { type: 'getTokenPrices', error },\n })\n throw new Error('Error getting tokens')\n }\n}\n"],"names":[],"mappings":";;;;;;AAmBc,SAAU,cAAc,GAAA;AACpC,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,IAAA,MAAM,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,QAAQ;AAC1C,IAAA,MAAM,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,KAAK;AACpC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QACnC,OAAO,EAAE,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC9C,eAAe,EAAE,KAAK;AACtB,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA,CAAC;AACJ;AAEO,MAAM,cAAc,GAAG,OAC5B,QAAgB,EAChB,KAAa,KACuC;AACpD,IAAA,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,gBAAA,CAAkB,CAAC;QAC/D,OAAO,QAAQ,CAAC,IAAI;IACtB;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,WAAW,CAAC;AACV,YAAA,MAAM,EAAE,KAAK;YACb,KAAK;AACL,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE;AAC7C,SAAA,CAAC;AACF,QAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;IACzC;AACF;;;;"}
1
+ {"version":3,"file":"useTokenPrices.js","sources":["../../../src/state/tokenPrices/useTokenPrices.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport axios from 'axios'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { useSDKConfig } from '../useSDKConfig'\nimport { reportError } from '../../utils/reportError'\n\nexport interface TokenPrices {\n chainId: ChainId\n chainName: string\n tokenAddress: string\n name: string\n symbol: string\n price: number\n priceSource: string\n updatedAt: number\n secondsAgoUpdated: number\n error?: string\n}\n\nexport default function useTokenPrices(): UseQueryResult<Partial<Record<ChainId, TokenPrices[]>>> {\n const SDKConfig = useSDKConfig()\n const priceApi = SDKConfig?.urls?.priceApi\n const apiv2 = SDKConfig?.urls?.apiV2\n return useQuery({\n queryKey: [QUERY_KEYS.TOKEN_PRICES],\n queryFn: () => getTokenPrices(priceApi, apiv2),\n refetchInterval: 30000, // 30 sec\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n })\n}\n\nexport const getTokenPrices = async (\n priceApi: string,\n apiv2: string,\n): Promise<Partial<Record<ChainId, TokenPrices[]>>> => {\n try {\n const response = await axios.get(`${priceApi}/realtime/prices`)\n return response.data\n } catch (error) {\n reportError({\n apiUrl: apiv2,\n error,\n extraInfo: { type: 'getTokenPrices', error },\n })\n throw new Error('Error getting tokens')\n }\n}\n"],"names":[],"mappings":";;;;;;AAoBc,SAAU,cAAc,GAAA;AACpC,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,IAAA,MAAM,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,QAAQ;AAC1C,IAAA,MAAM,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,KAAK;AACpC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QACnC,OAAO,EAAE,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC9C,eAAe,EAAE,KAAK;AACtB,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA,CAAC;AACJ;AAEO,MAAM,cAAc,GAAG,OAC5B,QAAgB,EAChB,KAAa,KACuC;AACpD,IAAA,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA,EAAG,QAAQ,CAAA,gBAAA,CAAkB,CAAC;QAC/D,OAAO,QAAQ,CAAC,IAAI;IACtB;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,WAAW,CAAC;AACV,YAAA,MAAM,EAAE,KAAK;YACb,KAAK;AACL,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE;AAC7C,SAAA,CAAC;AACF,QAAA,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC;IACzC;AACF;;;;"}
@@ -40,7 +40,6 @@ const useSDKConfig = (config) => {
40
40
  };
41
41
  useEffect(() => {
42
42
  if (config?.customRPCS) {
43
- console.log('Setting custom RPCs:', config.customRPCS);
44
43
  setCustomRPCS(config.customRPCS);
45
44
  }
46
45
  }, [config?.customRPCS]);
@@ -1 +1 @@
1
- {"version":3,"file":"useSDKConfig.js","sources":["../../src/state/useSDKConfig.ts"],"sourcesContent":["import { useEffect } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../config/constants/queryKeys'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { setCustomRPCS } from '../config/constants/networks'\n\n// Prod URLS. Do not make changes here\nconst defaultUrls = {\n apiV2: 'https://api.ape.bond',\n realTimeApi: 'https://realtime-api.ape.bond',\n mainUrl: 'https://ape.bond',\n priceApi: 'https://price-api.ape.bond',\n}\n\n// Staging URLS.\nconst stagingUrls = {\n apiV2: 'https://staging-api.ape.bond',\n realTimeApi: 'https://realtime-api-staging.ape.bond',\n mainUrl: 'https://staging.ape.bond',\n priceApi: 'https://price-api.ape.bond',\n}\n\nexport interface SDKPropsDTO {\n referenceId: string\n chains: number[]\n hotBondChains?: number[]\n connector?: 'rainbowkit' | 'appkit' | 'default'\n useHotBonds?: boolean\n useTiers?: boolean\n useTGEBonds?: boolean\n useCardsView?: boolean\n showLowValueBonds?: boolean\n bondPartner?: string\n namingPreference?: 'Discount' | 'Bonus'\n urls?: Partial<Record<URLKeys, string>>\n theme?: any\n highestCompatibleVersion?: string\n blockSales?: boolean\n customBranch?: string\n highlightedBond?: string\n customRPCS?: Partial<Record<ChainId, string[]>>\n}\n\nexport interface SDKProps {\n referenceId: string\n chains: number[]\n hotBondChains: number[]\n connector?: 'rainbowkit' | 'appkit' | 'default'\n useHotBonds: boolean\n useTiers: boolean\n useTGEBonds: boolean\n showLowValueBonds: boolean\n bondPartner?: string\n namingPreference: 'Discount' | 'Bonus'\n urls: Record<URLKeys, string>\n theme?: any\n highestCompatibleVersion?: string\n evmAddress?: string\n solAddress?: string\n useCardsView?: boolean\n blockSales?: boolean\n customBranch?: string\n highlightedBond?: string\n}\n\nexport const useSDKConfig = (config?: SDKPropsDTO): SDKProps => {\n const urls = process.env.NODE_ENV === 'production' ? defaultUrls : stagingUrls\n\n const initialData: SDKProps = {\n referenceId: '',\n chains: [],\n hotBondChains: [ChainId.BSC, ChainId.MATIC],\n useHotBonds: true,\n connector: 'default',\n useTiers: false,\n useTGEBonds: false,\n showLowValueBonds: false,\n bondPartner: undefined,\n namingPreference: 'Bonus',\n useCardsView: false,\n blockSales: false,\n customBranch: '',\n ...config,\n urls: { ...urls, ...config?.urls },\n highestCompatibleVersion: '2.2.0',\n }\n\n useEffect(() => {\n if (config?.customRPCS) {\n console.log('Setting custom RPCs:', config.customRPCS)\n setCustomRPCS(config.customRPCS)\n }\n }, [config?.customRPCS])\n\n const { data } = useQuery({\n queryKey: [QUERY_KEYS.SDK_CONFIG],\n queryFn: () => {\n throw new Error('Just a hotfix for latest versions of react-query that make queryFn a required prop')\n },\n initialData,\n })\n return data as SDKProps\n}\n\nexport type URLKeys = 'apiV2' | 'realTimeApi' | 'mainUrl' | 'priceApi'\n\nexport const useURLByEnvironment = (key: URLKeys) => {\n const config = useSDKConfig()\n return config?.urls?.[key] as string\n}\n"],"names":[],"mappings":";;;;;;AAMA;AACA,MAAM,WAAW,GAAG;AAClB,IAAA,KAAK,EAAE,sBAAsB;AAC7B,IAAA,WAAW,EAAE,+BAA+B;AAC5C,IAAA,OAAO,EAAE,kBAAkB;AAC3B,IAAA,QAAQ,EAAE,4BAA4B;CACvC;AAED;AACA,MAAM,WAAW,GAAG;AAClB,IAAA,KAAK,EAAE,8BAA8B;AACrC,IAAA,WAAW,EAAE,uCAAuC;AACpD,IAAA,OAAO,EAAE,0BAA0B;AACnC,IAAA,QAAQ,EAAE,4BAA4B;CACvC;AA6CM,MAAM,YAAY,GAAG,CAAC,MAAoB,KAAc;AAC7D,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,GAAG,WAAW,GAAG,WAAW;AAE9E,IAAA,MAAM,WAAW,GAAa;AAC5B,QAAA,WAAW,EAAE,EAAE;AACf,QAAA,MAAM,EAAE,EAAE;QACV,aAAa,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC;AAC3C,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,SAAS,EAAE,SAAS;AACpB,QAAA,QAAQ,EAAE,KAAK;AACf,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,iBAAiB,EAAE,KAAK;AACxB,QAAA,WAAW,EAAE,SAAS;AACtB,QAAA,gBAAgB,EAAE,OAAO;AACzB,QAAA,YAAY,EAAE,KAAK;AACnB,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,YAAY,EAAE,EAAE;AAChB,QAAA,GAAG,MAAM;QACT,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE;AAClC,QAAA,wBAAwB,EAAE,OAAO;KAClC;IAED,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,MAAM,EAAE,UAAU,EAAE;YACtB,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,UAAU,CAAC;AACtD,YAAA,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;QAClC;AACF,IAAA,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAExB,IAAA,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;AACxB,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QACjC,OAAO,EAAE,MAAK;AACZ,YAAA,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC;QACvG,CAAC;QACD,WAAW;AACZ,KAAA,CAAC;AACF,IAAA,OAAO,IAAgB;AACzB;AAIO,MAAM,mBAAmB,GAAG,CAAC,GAAY,KAAI;AAClD,IAAA,MAAM,MAAM,GAAG,YAAY,EAAE;AAC7B,IAAA,OAAO,MAAM,EAAE,IAAI,GAAG,GAAG,CAAW;AACtC;;;;"}
1
+ {"version":3,"file":"useSDKConfig.js","sources":["../../src/state/useSDKConfig.ts"],"sourcesContent":["import { useEffect } from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../config/constants/queryKeys'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { setCustomRPCS } from '../config/constants/networks'\n\n// Prod URLS. Do not make changes here\nconst defaultUrls = {\n apiV2: 'https://api.ape.bond',\n realTimeApi: 'https://realtime-api.ape.bond',\n mainUrl: 'https://ape.bond',\n priceApi: 'https://price-api.ape.bond',\n}\n\n// Staging URLS.\nconst stagingUrls = {\n apiV2: 'https://staging-api.ape.bond',\n realTimeApi: 'https://realtime-api-staging.ape.bond',\n mainUrl: 'https://staging.ape.bond',\n priceApi: 'https://price-api.ape.bond',\n}\n\nexport interface SDKPropsDTO {\n referenceId: string\n chains: number[]\n hotBondChains?: number[]\n connector?: 'rainbowkit' | 'appkit' | 'default'\n useHotBonds?: boolean\n useTiers?: boolean\n useTGEBonds?: boolean\n useCardsView?: boolean\n showLowValueBonds?: boolean\n bondPartner?: string\n namingPreference?: 'Discount' | 'Bonus'\n urls?: Partial<Record<URLKeys, string>>\n theme?: any\n highestCompatibleVersion?: string\n blockSales?: boolean\n customBranch?: string\n highlightedBond?: string\n customRPCS?: Partial<Record<ChainId, string[]>>\n}\n\nexport interface SDKProps {\n referenceId: string\n chains: number[]\n hotBondChains: number[]\n connector?: 'rainbowkit' | 'appkit' | 'default'\n useHotBonds: boolean\n useTiers: boolean\n useTGEBonds: boolean\n showLowValueBonds: boolean\n bondPartner?: string\n namingPreference: 'Discount' | 'Bonus'\n urls: Record<URLKeys, string>\n theme?: any\n highestCompatibleVersion?: string\n evmAddress?: string\n solAddress?: string\n useCardsView?: boolean\n blockSales?: boolean\n customBranch?: string\n highlightedBond?: string\n}\n\nexport const useSDKConfig = (config?: SDKPropsDTO): SDKProps => {\n const urls = process.env.NODE_ENV === 'production' ? defaultUrls : stagingUrls\n\n const initialData: SDKProps = {\n referenceId: '',\n chains: [],\n hotBondChains: [ChainId.BSC, ChainId.MATIC],\n useHotBonds: true,\n connector: 'default',\n useTiers: false,\n useTGEBonds: false,\n showLowValueBonds: false,\n bondPartner: undefined,\n namingPreference: 'Bonus',\n useCardsView: false,\n blockSales: false,\n customBranch: '',\n ...config,\n urls: { ...urls, ...config?.urls },\n highestCompatibleVersion: '2.2.0',\n }\n\n useEffect(() => {\n if (config?.customRPCS) {\n setCustomRPCS(config.customRPCS)\n }\n }, [config?.customRPCS])\n\n const { data } = useQuery({\n queryKey: [QUERY_KEYS.SDK_CONFIG],\n queryFn: () => {\n throw new Error('Just a hotfix for latest versions of react-query that make queryFn a required prop')\n },\n initialData,\n })\n return data as SDKProps\n}\n\nexport type URLKeys = 'apiV2' | 'realTimeApi' | 'mainUrl' | 'priceApi'\n\nexport const useURLByEnvironment = (key: URLKeys) => {\n const config = useSDKConfig()\n return config?.urls?.[key] as string\n}\n"],"names":[],"mappings":";;;;;;AAMA;AACA,MAAM,WAAW,GAAG;AAClB,IAAA,KAAK,EAAE,sBAAsB;AAC7B,IAAA,WAAW,EAAE,+BAA+B;AAC5C,IAAA,OAAO,EAAE,kBAAkB;AAC3B,IAAA,QAAQ,EAAE,4BAA4B;CACvC;AAED;AACA,MAAM,WAAW,GAAG;AAClB,IAAA,KAAK,EAAE,8BAA8B;AACrC,IAAA,WAAW,EAAE,uCAAuC;AACpD,IAAA,OAAO,EAAE,0BAA0B;AACnC,IAAA,QAAQ,EAAE,4BAA4B;CACvC;AA6CM,MAAM,YAAY,GAAG,CAAC,MAAoB,KAAc;AAC7D,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,GAAG,WAAW,GAAG,WAAW;AAE9E,IAAA,MAAM,WAAW,GAAa;AAC5B,QAAA,WAAW,EAAE,EAAE;AACf,QAAA,MAAM,EAAE,EAAE;QACV,aAAa,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC;AAC3C,QAAA,WAAW,EAAE,IAAI;AACjB,QAAA,SAAS,EAAE,SAAS;AACpB,QAAA,QAAQ,EAAE,KAAK;AACf,QAAA,WAAW,EAAE,KAAK;AAClB,QAAA,iBAAiB,EAAE,KAAK;AACxB,QAAA,WAAW,EAAE,SAAS;AACtB,QAAA,gBAAgB,EAAE,OAAO;AACzB,QAAA,YAAY,EAAE,KAAK;AACnB,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,YAAY,EAAE,EAAE;AAChB,QAAA,GAAG,MAAM;QACT,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE;AAClC,QAAA,wBAAwB,EAAE,OAAO;KAClC;IAED,SAAS,CAAC,MAAK;AACb,QAAA,IAAI,MAAM,EAAE,UAAU,EAAE;AACtB,YAAA,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC;QAClC;AACF,IAAA,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAExB,IAAA,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;AACxB,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QACjC,OAAO,EAAE,MAAK;AACZ,YAAA,MAAM,IAAI,KAAK,CAAC,oFAAoF,CAAC;QACvG,CAAC;QACD,WAAW;AACZ,KAAA,CAAC;AACF,IAAA,OAAO,IAAgB;AACzB;AAIO,MAAM,mBAAmB,GAAG,CAAC,GAAY,KAAI;AAClD,IAAA,MAAM,MAAM,GAAG,YAAY,EAAE;AAC7B,IAAA,OAAO,MAAM,EAAE,IAAI,GAAG,GAAG,CAAW;AACtC;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { getAddressDecoder } from '@solana/addresses';
2
- import { getStructDecoder, fixDecoderSize, getU64Decoder, getBytesDecoder } from '@solana/codecs';
2
+ import { getStructDecoder, fixDecoderSize, getBytesDecoder, getU64Decoder } from '@solana/codecs';
3
3
  import { BOND_DISCRIMINATOR } from '../constants/solanaConstants.js';
4
4
 
5
5
  // Create the Bond account decoder
@@ -1,5 +1,5 @@
1
1
  import { getAddressDecoder } from '@solana/addresses';
2
- import { getStructDecoder, fixDecoderSize, getU32Decoder, getU8Decoder, getU64Decoder, getBytesDecoder } from '@solana/codecs';
2
+ import { getStructDecoder, fixDecoderSize, getBytesDecoder, getU32Decoder, getU8Decoder, getU64Decoder } from '@solana/codecs';
3
3
  import { BOND_ISSUANCE_DISCRIMINATOR } from '../constants/solanaConstants.js';
4
4
 
5
5
  // BondIssuance discriminator from IDL
@@ -1,4 +1,4 @@
1
- import { getStructDecoder, fixDecoderSize, getU64Decoder, getBytesDecoder } from '@solana/codecs';
1
+ import { getStructDecoder, fixDecoderSize, getBytesDecoder, getU64Decoder } from '@solana/codecs';
2
2
  import { BOND_PRICING_DISCRIMINATOR } from '../constants/solanaConstants.js';
3
3
 
4
4
  // BondPricing discriminator from IDL
@@ -1,4 +1,4 @@
1
- import { getStructDecoder, fixDecoderSize, getU64Decoder, getU8Decoder, getBytesDecoder } from '@solana/codecs';
1
+ import { getStructDecoder, fixDecoderSize, getBytesDecoder, getU64Decoder, getU8Decoder } from '@solana/codecs';
2
2
  import { BOND_TERM_DISCRIMINATOR } from '../constants/solanaConstants.js';
3
3
 
4
4
  // Create the BondTerm account decoder
@@ -1 +1 @@
1
- {"version":3,"file":"bondPriceHelpers.js","sources":["../../src/utils/bondPriceHelpers.ts"],"sourcesContent":["import BigNumber from 'bignumber.js'\r\nimport { BondsData, TrueBondPrices } from '../types/bonds'\r\n\r\n/**\r\n * Finds the highest TrueBondPrices element where userPoints is higher than points in the array.\r\n * @param userPoints - The user's points as a string representing a BigNumber.\r\n * @param trueBondPrices - Array of TrueBondPrices to analyze.\r\n * @returns The highest TrueBondPrices element where userPoints is higher than the item's points, or `undefined` if none matches.\r\n */\r\nexport const findHighestTrueBondPrice = (\r\n userPoints?: string | null,\r\n trueBondPrices?: TrueBondPrices[],\r\n): TrueBondPrices | undefined => {\r\n if (!userPoints || !trueBondPrices) return undefined\r\n\r\n const userPointsBigNumber = new BigNumber(userPoints)\r\n\r\n // Filter higher discounts that the user can't access\r\n const eligiblePrices = trueBondPrices.filter((price) => userPointsBigNumber.gte(new BigNumber(price.points)))\r\n if (!eligiblePrices || eligiblePrices.length === 0) return undefined\r\n\r\n // Find the highest points among the eligible prices\r\n return eligiblePrices.reduce((highest, current) => {\r\n const highestPoints = new BigNumber(highest.points)\r\n const currentPoints = new BigNumber(current.points)\r\n\r\n return currentPoints.isGreaterThan(highestPoints) ? current : highest\r\n })\r\n}\r\n\r\n/**\r\n * Finds the TrueBondPrices element with the highest points in the array, regardless of user points.\r\n * @param bondData - Bond Data containing an array of TrueBondPrices to analyze.\r\n * @returns The TrueBondPrices element with the highest points, or `undefined` if no data is available.\r\n */\r\nexport const findHighestTrueBondPriceUserAgnostic = (bondData?: BondsData): TrueBondPrices | undefined => {\r\n if (!bondData?.trueBondPrices?.length) return undefined\r\n\r\n return bondData.trueBondPrices.reduce((highest, current) =>\r\n new BigNumber(current.points).isGreaterThan(new BigNumber(highest.points)) ? current : highest,\r\n )\r\n}\r\n\r\n"],"names":[],"mappings":";;AAGA;;;;;AAKG;MACU,wBAAwB,GAAG,CACtC,UAA0B,EAC1B,cAAiC,KACH;AAC9B,IAAA,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc;AAAE,QAAA,OAAO,SAAS;AAEpD,IAAA,MAAM,mBAAmB,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC;;IAGrD,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,mBAAmB,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7G,IAAA,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,SAAS;;IAGpE,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,KAAI;QAChD,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QACnD,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;AAEnD,QAAA,OAAO,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,OAAO,GAAG,OAAO;AACvE,IAAA,CAAC,CAAC;AACJ;AAEA;;;;AAIG;AACI,MAAM,oCAAoC,GAAG,CAAC,QAAoB,KAAgC;AACvG,IAAA,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM;AAAE,QAAA,OAAO,SAAS;AAEvD,IAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,KACrD,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,GAAG,OAAO,CAC/F;AACH;;;;"}
1
+ {"version":3,"file":"bondPriceHelpers.js","sources":["../../src/utils/bondPriceHelpers.ts"],"sourcesContent":["import BigNumber from 'bignumber.js'\nimport { BondsData, TrueBondPrices } from '../types/bonds'\n\n/**\n * Finds the highest TrueBondPrices element where userPoints is higher than points in the array.\n * @param userPoints - The user's points as a string representing a BigNumber.\n * @param trueBondPrices - Array of TrueBondPrices to analyze.\n * @returns The highest TrueBondPrices element where userPoints is higher than the item's points, or `undefined` if none matches.\n */\nexport const findHighestTrueBondPrice = (\n userPoints?: string | null,\n trueBondPrices?: TrueBondPrices[],\n): TrueBondPrices | undefined => {\n if (!userPoints || !trueBondPrices) return undefined\n\n const userPointsBigNumber = new BigNumber(userPoints)\n\n // Filter higher discounts that the user can't access\n const eligiblePrices = trueBondPrices.filter((price) => userPointsBigNumber.gte(new BigNumber(price.points)))\n if (!eligiblePrices || eligiblePrices.length === 0) return undefined\n\n // Find the highest points among the eligible prices\n return eligiblePrices.reduce((highest, current) => {\n const highestPoints = new BigNumber(highest.points)\n const currentPoints = new BigNumber(current.points)\n\n return currentPoints.isGreaterThan(highestPoints) ? current : highest\n })\n}\n\n/**\n * Finds the TrueBondPrices element with the highest points in the array, regardless of user points.\n * @param bondData - Bond Data containing an array of TrueBondPrices to analyze.\n * @returns The TrueBondPrices element with the highest points, or `undefined` if no data is available.\n */\nexport const findHighestTrueBondPriceUserAgnostic = (bondData?: BondsData): TrueBondPrices | undefined => {\n if (!bondData?.trueBondPrices?.length) return undefined\n\n return bondData.trueBondPrices.reduce((highest, current) =>\n new BigNumber(current.points).isGreaterThan(new BigNumber(highest.points)) ? current : highest,\n )\n}\n\n"],"names":[],"mappings":";;AAGA;;;;;AAKG;MACU,wBAAwB,GAAG,CACtC,UAA0B,EAC1B,cAAiC,KACH;AAC9B,IAAA,IAAI,CAAC,UAAU,IAAI,CAAC,cAAc;AAAE,QAAA,OAAO,SAAS;AAEpD,IAAA,MAAM,mBAAmB,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC;;IAGrD,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,mBAAmB,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7G,IAAA,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,SAAS;;IAGpE,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,KAAI;QAChD,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;QACnD,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;AAEnD,QAAA,OAAO,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,GAAG,OAAO,GAAG,OAAO;AACvE,IAAA,CAAC,CAAC;AACJ;AAEA;;;;AAIG;AACI,MAAM,oCAAoC,GAAG,CAAC,QAAoB,KAAgC;AACvG,IAAA,IAAI,CAAC,QAAQ,EAAE,cAAc,EAAE,MAAM;AAAE,QAAA,OAAO,SAAS;AAEvD,IAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,KACrD,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,GAAG,OAAO,CAC/F;AACH;;;;"}
@@ -0,0 +1,2 @@
1
+ export declare function adjustDecimals(numStr: string): string;
2
+ export declare const convertToBigish: (numberString?: string, decimals?: number) => string;
@@ -0,0 +1,25 @@
1
+ import BigNumber from 'bignumber.js';
2
+
3
+ function adjustDecimals(numStr) {
4
+ const parts = numStr.split('.');
5
+ if (parts.length < 2) {
6
+ // This means the number doesn't have any decimals
7
+ return numStr;
8
+ }
9
+ if (parts[1].length > 18) {
10
+ parts[1] = parts[1].slice(0, 18); // Take the first 18 decimals
11
+ return parts[0] + '.' + parts[1];
12
+ }
13
+ else {
14
+ return numStr;
15
+ }
16
+ }
17
+ const convertToBigish = (numberString, decimals = 18) => {
18
+ if (!numberString || !decimals)
19
+ return '';
20
+ const adjustedDecimals = adjustDecimals(numberString);
21
+ return new BigNumber(adjustedDecimals).times(new BigNumber(10).pow(decimals)).toFixed(0);
22
+ };
23
+
24
+ export { adjustDecimals, convertToBigish };
25
+ //# sourceMappingURL=convertToBigish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convertToBigish.js","sources":["../../src/utils/convertToBigish.ts"],"sourcesContent":["import BigNumber from 'bignumber.js'\n\nexport function adjustDecimals(numStr: string) {\n const parts = numStr.split('.')\n if (parts.length < 2) {\n // This means the number doesn't have any decimals\n return numStr\n }\n if (parts[1].length > 18) {\n parts[1] = parts[1].slice(0, 18) // Take the first 18 decimals\n return parts[0] + '.' + parts[1]\n } else {\n return numStr\n }\n}\n\nexport const convertToBigish = (numberString?: string, decimals: number = 18) => {\n if (!numberString || !decimals) return ''\n\n const adjustedDecimals = adjustDecimals(numberString)\n\n return new BigNumber(adjustedDecimals).times(new BigNumber(10).pow(decimals)).toFixed(0)\n}\n"],"names":[],"mappings":";;AAEM,SAAU,cAAc,CAAC,MAAc,EAAA;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;AAC/B,IAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;;AAEpB,QAAA,OAAO,MAAM;IACf;IACA,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE;AACxB,QAAA,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QAChC,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;IAClC;SAAO;AACL,QAAA,OAAO,MAAM;IACf;AACF;AAEO,MAAM,eAAe,GAAG,CAAC,YAAqB,EAAE,QAAA,GAAmB,EAAE,KAAI;AAC9E,IAAA,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,EAAE;AAEzC,IAAA,MAAM,gBAAgB,GAAG,cAAc,CAAC,YAAY,CAAC;IAErD,OAAO,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1F;;;;"}
@@ -1,38 +1,50 @@
1
- import { Interface } from '@ethersproject/abi';
1
+ import { createPublicClient, http, encodeFunctionData, decodeFunctionResult } from 'viem';
2
2
  import multicallV2Abi from '../config/abi/multicallv2.json.js';
3
- import { ethers } from 'ethers';
4
3
  import chunk from 'lodash-es/chunk.js';
5
4
  import flatten from 'lodash-es/flatten.js';
6
5
  import { getRPC } from '../config/constants/networks.js';
7
6
  import { MULTICALL_V2 } from '../config/constants/addresses.js';
8
7
  import { ChainId } from '@ape.swap/apeswap-lists';
9
8
 
9
+ // Wraps decoded result in an array when the function has a single output,
10
+ // matching ethers v5 Result behavior so consuming code doesn't need to change.
11
+ // Multi-output functions already return an array from viem, so they're left as-is.
12
+ const decodeResult = (abi, functionName, data) => {
13
+ const decoded = decodeFunctionResult({ abi, functionName, data });
14
+ const fn = abi.find((item) => item.type === 'function' && item.name === functionName);
15
+ return fn?.outputs?.length === 1 ? [decoded] : decoded;
16
+ };
10
17
  // This is the legacy multicall
11
18
  // Try to use multicall hooks
12
19
  const multicall = async (chainId, abi, calls, batch, batchSize) => {
13
20
  try {
14
- if (chainId === ChainId.SOL) {
21
+ if (chainId === ChainId.SOL)
15
22
  return;
16
- }
17
23
  const multicallAddress = MULTICALL_V2[chainId];
18
- const provider = new ethers.providers.JsonRpcProvider(getRPC(chainId), chainId);
19
- const multi = new ethers.Contract(multicallAddress, multicallV2Abi, provider);
20
- const itf = new Interface(abi);
21
- const calldata = calls.map((call) => [call.address.toLowerCase(), itf.encodeFunctionData(call.name, call.params)]);
24
+ const client = createPublicClient({
25
+ transport: http(getRPC(chainId)),
26
+ });
27
+ const calldata = calls.map((call) => ({
28
+ target: call.address.toLowerCase(),
29
+ callData: encodeFunctionData({ abi: abi, functionName: call.name, args: call.params }),
30
+ }));
31
+ const aggregate = async (calldataChunk, callsChunk) => {
32
+ const [, returnData] = (await client.readContract({
33
+ address: multicallAddress,
34
+ abi: multicallV2Abi,
35
+ functionName: 'aggregate',
36
+ args: [calldataChunk],
37
+ }));
38
+ return returnData.map((data, i) => decodeResult(abi, callsChunk[i].name, data));
39
+ };
22
40
  if (batch) {
23
- const chunkedCalls = chunk(calldata, batchSize);
24
- const chunkedCallNames = chunk(calls, batchSize);
25
- const chunkedData = chunkedCalls.flatMap(async (chunkedCallSet, i) => {
26
- const { returnData } = await multi.aggregate(chunkedCallSet);
27
- return returnData.map((call, j) => itf.decodeFunctionResult(chunkedCallNames[i][j].name, call));
28
- });
29
- const resolveCall = await Promise.all(chunkedData);
30
- const flattenCalls = flatten(resolveCall);
31
- return flattenCalls;
41
+ const chunkedCalldata = chunk(calldata, batchSize);
42
+ const chunkedCalls = chunk(calls, batchSize);
43
+ const results = await Promise.all(chunkedCalls.map((callsChunk, i) => aggregate(chunkedCalldata[i], callsChunk)));
44
+ return flatten(results);
32
45
  }
33
46
  else {
34
- const { returnData } = await multi.aggregate(calldata);
35
- return returnData.map((call, i) => itf.decodeFunctionResult(calls[i].name, call));
47
+ return aggregate(calldata, calls);
36
48
  }
37
49
  }
38
50
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"multicall.js","sources":["../../src/utils/multicall.ts"],"sourcesContent":["import { Interface } from '@ethersproject/abi'\nimport multicallV2Abi from '../config/abi/multicallv2.json'\nimport { ethers } from 'ethers'\nimport chunk from 'lodash-es/chunk.js'\nimport flatten from 'lodash-es/flatten.js'\nimport { getRPC } from '../config/constants/networks'\nimport { MULTICALL_V2 } from '../config/constants/addresses'\nimport { ChainId } from '@ape.swap/apeswap-lists'\n\nexport interface Call {\n address: string // Address of the contract\n name: string // Function name on the contract (exemple: balanceOf)\n params?: any[] // Function params\n}\n\n// This is the legacy multicall\n// Try to use multicall hooks\nconst multicall = async (chainId: number, abi: any[], calls: Call[], batch?: boolean, batchSize?: number) => {\n try {\n if (chainId === ChainId.SOL) {\n return\n }\n const multicallAddress = MULTICALL_V2[chainId]\n const provider = new ethers.providers.JsonRpcProvider(getRPC(chainId as ChainId), chainId)\n const multi = new ethers.Contract(multicallAddress, multicallV2Abi, provider)\n const itf = new Interface(abi)\n const calldata = calls.map((call) => [call.address.toLowerCase(), itf.encodeFunctionData(call.name, call.params)])\n if (batch) {\n const chunkedCalls = chunk(calldata, batchSize)\n const chunkedCallNames = chunk(calls, batchSize)\n const chunkedData = chunkedCalls.flatMap(async (chunkedCallSet, i) => {\n const { returnData } = await multi.aggregate(chunkedCallSet)\n return returnData.map((call: any, j: number) => itf.decodeFunctionResult(chunkedCallNames[i][j].name, call))\n })\n const resolveCall = await Promise.all(chunkedData)\n const flattenCalls = flatten(resolveCall)\n return flattenCalls\n } else {\n const { returnData } = await multi.aggregate(calldata)\n return returnData.map((call: any, i: number) => itf.decodeFunctionResult(calls[i].name, call))\n }\n } catch (e) {\n console.error(e)\n console.error(chainId)\n console.error(calls)\n }\n}\n\nexport default multicall\n"],"names":[],"mappings":";;;;;;;;;AAeA;AACA;AACA,MAAM,SAAS,GAAG,OAAO,OAAe,EAAE,GAAU,EAAE,KAAa,EAAE,KAAe,EAAE,SAAkB,KAAI;AAC1G,IAAA,IAAI;AACF,QAAA,IAAI,OAAO,KAAK,OAAO,CAAC,GAAG,EAAE;YAC3B;QACF;AACA,QAAA,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAC;AAC9C,QAAA,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,OAAkB,CAAC,EAAE,OAAO,CAAC;AAC1F,QAAA,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,cAAc,EAAE,QAAQ,CAAC;AAC7E,QAAA,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC;AAC9B,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAClH,IAAI,KAAK,EAAE;YACT,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC;YAC/C,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC;AAChD,YAAA,MAAM,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,cAAc,EAAE,CAAC,KAAI;gBACnE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC;AAC5D,gBAAA,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,CAAS,KAAK,GAAG,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC9G,YAAA,CAAC,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;AAClD,YAAA,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;AACzC,YAAA,OAAO,YAAY;QACrB;aAAO;YACL,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC;YACtD,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,CAAS,KAAK,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChG;IACF;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,QAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;AACtB,QAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IACtB;AACF;;;;"}
1
+ {"version":3,"file":"multicall.js","sources":["../../src/utils/multicall.ts"],"sourcesContent":["import {\n createPublicClient,\n http,\n encodeFunctionData,\n decodeFunctionResult,\n type Abi,\n type Address,\n type AbiFunction,\n} from 'viem'\nimport multicallV2Abi from '../config/abi/multicallv2.json'\nimport chunk from 'lodash-es/chunk.js'\nimport flatten from 'lodash-es/flatten.js'\nimport { getRPC } from '../config/constants/networks'\nimport { MULTICALL_V2 } from '../config/constants/addresses'\nimport { ChainId } from '@ape.swap/apeswap-lists'\n\nexport interface Call {\n address: string // Address of the contract\n name: string // Function name on the contract (exemple: balanceOf)\n params?: any[] // Function params\n}\n\n// Wraps decoded result in an array when the function has a single output,\n// matching ethers v5 Result behavior so consuming code doesn't need to change.\n// Multi-output functions already return an array from viem, so they're left as-is.\nconst decodeResult = (abi: Abi, functionName: string, data: `0x${string}`) => {\n const decoded = decodeFunctionResult({ abi, functionName, data })\n const fn = abi.find((item): item is AbiFunction => item.type === 'function' && item.name === functionName)\n return fn?.outputs?.length === 1 ? [decoded] : decoded\n}\n\n// This is the legacy multicall\n// Try to use multicall hooks\nconst multicall = async (\n chainId: number,\n abi: any[],\n calls: Call[],\n batch?: boolean,\n batchSize?: number,\n): Promise<any> => {\n try {\n if (chainId === ChainId.SOL) return\n\n const multicallAddress = MULTICALL_V2[chainId] as Address\n const client = createPublicClient({\n transport: http(getRPC(chainId as ChainId)),\n })\n\n const calldata = calls.map((call) => ({\n target: call.address.toLowerCase() as Address,\n callData: encodeFunctionData({ abi: abi as Abi, functionName: call.name, args: call.params }),\n }))\n\n const aggregate = async (calldataChunk: typeof calldata, callsChunk: Call[]) => {\n const [, returnData] = (await client.readContract({\n address: multicallAddress,\n abi: multicallV2Abi as Abi,\n functionName: 'aggregate',\n args: [calldataChunk],\n })) as [bigint, readonly `0x${string}`[]]\n\n return returnData.map((data, i) => decodeResult(abi as Abi, callsChunk[i].name, data))\n }\n\n if (batch) {\n const chunkedCalldata = chunk(calldata, batchSize)\n const chunkedCalls = chunk(calls, batchSize)\n const results = await Promise.all(chunkedCalls.map((callsChunk, i) => aggregate(chunkedCalldata[i], callsChunk)))\n return flatten(results)\n } else {\n return aggregate(calldata, calls)\n }\n } catch (e) {\n console.error(e)\n console.error(chainId)\n console.error(calls)\n }\n}\n\nexport default multicall\n"],"names":[],"mappings":";;;;;;;;AAsBA;AACA;AACA;AACA,MAAM,YAAY,GAAG,CAAC,GAAQ,EAAE,YAAoB,EAAE,IAAmB,KAAI;AAC3E,IAAA,MAAM,OAAO,GAAG,oBAAoB,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACjE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAA0B,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;AAC1G,IAAA,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,OAAO;AACxD,CAAC;AAED;AACA;AACA,MAAM,SAAS,GAAG,OAChB,OAAe,EACf,GAAU,EACV,KAAa,EACb,KAAe,EACf,SAAkB,KACF;AAChB,IAAA,IAAI;AACF,QAAA,IAAI,OAAO,KAAK,OAAO,CAAC,GAAG;YAAE;AAE7B,QAAA,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,CAAY;QACzD,MAAM,MAAM,GAAG,kBAAkB,CAAC;AAChC,YAAA,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAkB,CAAC,CAAC;AAC5C,SAAA,CAAC;QAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AACpC,YAAA,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAa;YAC7C,QAAQ,EAAE,kBAAkB,CAAC,EAAE,GAAG,EAAE,GAAU,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AAC9F,SAAA,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,OAAO,aAA8B,EAAE,UAAkB,KAAI;YAC7E,MAAM,GAAG,UAAU,CAAC,IAAI,MAAM,MAAM,CAAC,YAAY,CAAC;AAChD,gBAAA,OAAO,EAAE,gBAAgB;AACzB,gBAAA,GAAG,EAAE,cAAqB;AAC1B,gBAAA,YAAY,EAAE,WAAW;gBACzB,IAAI,EAAE,CAAC,aAAa,CAAC;AACtB,aAAA,CAAC,CAAuC;YAEzC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,YAAY,CAAC,GAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACxF,QAAA,CAAC;QAED,IAAI,KAAK,EAAE;YACT,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC;YAClD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC;AAC5C,YAAA,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,KAAK,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;AACjH,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC;QACzB;aAAO;AACL,YAAA,OAAO,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC;QACnC;IACF;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAChB,QAAA,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;AACtB,QAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;IACtB;AACF;;;;"}
@@ -1,4 +1,4 @@
1
- import { jsxs, jsx, Fragment } from 'theme-ui/jsx-runtime';
1
+ import { jsxs, Fragment, jsx } from 'theme-ui/jsx-runtime';
2
2
  import Button from '../../../../components/uikit-sdk/Button/Button.js';
3
3
  import { ChainId } from '@ape.swap/apeswap-lists';
4
4
  import { variants } from '../../../../components/uikit-sdk/Button/types.js';
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs, Fragment } from 'theme-ui/jsx-runtime';
2
2
  import { useState, useCallback, useEffect } from 'react';
3
3
  import { BigNumber } from 'bignumber.js';
4
- import { adjustDecimals } from '../../utils/convertToTokenValue.js';
4
+ import { convertToBigish } from '../../utils/convertToBigish.js';
5
5
  import ABI_DEPOSIT from '../../config/abi/deposit.json.js';
6
6
  import ABI_DEPOSIT_SIG from '../../config/abi/depositSig.json.js';
7
7
  import { useChainId, useWriteContract, useSendTransaction } from 'wagmi';
@@ -180,8 +180,7 @@ const BuyComponent = ({ onDismiss, bondAddress, bondChain, handlePurchasedBond,
180
180
  });
181
181
  try {
182
182
  const maxPrice = new BigNumber(trueBondPrice ?? '0').times(102).div(100).toFixed(0); // multiply it by 1.02
183
- const rawAmount = adjustDecimals(inputValue);
184
- const amount = new BigNumber(rawAmount).times(new BigNumber(10).pow(decimals ?? 18)).toString();
183
+ const amount = convertToBigish(inputValue, decimals);
185
184
  const shouldUseSig = bondData?.billVersion === BillVersion.V4 && SDKConfig.useTiers;
186
185
  const args = shouldUseSig ? [amount, maxPrice, account, tierProofSig] : [amount, maxPrice, account];
187
186
  // const simulationResult = await simulateContract(config, {