@ape.swap/bonds-sdk 6.2.9 → 6.2.11
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/README.md +2 -5
- package/dist/components/Carousel/index.d.ts +8 -0
- package/dist/components/Carousel/index.js +151 -0
- package/dist/components/Carousel/index.js.map +1 -0
- package/dist/components/Carousel/styles.d.ts +35 -0
- package/dist/components/Carousel/styles.js +40 -0
- package/dist/components/Carousel/styles.js.map +1 -0
- package/dist/components/uikit-sdk/Svg/Icons/L1X.d.ts +4 -0
- package/dist/components/uikit-sdk/Svg/Icons/L1X.js +8 -0
- package/dist/components/uikit-sdk/Svg/Icons/L1X.js.map +1 -0
- package/dist/config/constants/addresses.js +1 -0
- package/dist/config/constants/addresses.js.map +1 -1
- package/dist/config/constants/chains.js +6 -0
- package/dist/config/constants/chains.js.map +1 -1
- package/dist/config/constants/networks.js +1 -0
- package/dist/config/constants/networks.js.map +1 -1
- package/dist/hooks/useSendReferenceId.js +2 -2
- package/dist/hooks/useSendReferenceId.js.map +1 -1
- package/dist/state/bondApiStats/useGetBondApiStats.js +2 -3
- package/dist/state/bondApiStats/useGetBondApiStats.js.map +1 -1
- package/dist/state/bonds/fetchBondsData/cleanBillsData.js +7 -7
- package/dist/state/bonds/fetchBondsData/cleanBillsData.js.map +1 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataAptos.js +5 -5
- package/dist/state/bonds/fetchBondsData/fetchBondsDataAptos.js.map +1 -1
- package/dist/state/bonds/fetchBondsData/fetchBondsDataSui.js +5 -5
- package/dist/state/bonds/fetchBondsData/fetchBondsDataSui.js.map +1 -1
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsAptos.js +5 -5
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsAptos.js.map +1 -1
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsEVM.js +7 -7
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsEVM.js.map +1 -1
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSOL.js +7 -7
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSOL.js.map +1 -1
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSUI.js +5 -5
- package/dist/state/bonds/fetchUsersBonds/fetchUsersBondsSUI.js.map +1 -1
- package/dist/state/bonds/useBondsData.js +3 -3
- package/dist/state/bonds/useBondsData.js.map +1 -1
- package/dist/state/bonds/useBondsList.js +2 -3
- package/dist/state/bonds/useBondsList.js.map +1 -1
- package/dist/state/bonds/useBondsListPreTGE.js +2 -3
- package/dist/state/bonds/useBondsListPreTGE.js.map +1 -1
- package/dist/state/bonds/useTierProofSignature.js +3 -3
- package/dist/state/bonds/useTierProofSignature.js.map +1 -1
- package/dist/state/bonds/useUserBonds.js +4 -4
- package/dist/state/bonds/useUserBonds.js.map +1 -1
- package/dist/state/hotBonds/useHotBonds.js +3 -3
- package/dist/state/hotBonds/useHotBonds.js.map +1 -1
- package/dist/state/recommendations/useGetBondRecommendations.js +2 -2
- package/dist/state/recommendations/useGetBondRecommendations.js.map +1 -1
- package/dist/state/tokenPrices/useTokenPrices.js +2 -3
- package/dist/state/tokenPrices/useTokenPrices.js.map +1 -1
- package/dist/state/zap/useAptosZapQuote.js +2 -3
- package/dist/state/zap/useAptosZapQuote.js.map +1 -1
- package/dist/state/zap/useSoulZapBondQuote.js +3 -3
- package/dist/state/zap/useSoulZapBondQuote.js.map +1 -1
- package/dist/state/zap/useSuiZapQuote.js +2 -3
- package/dist/state/zap/useSuiZapQuote.js.map +1 -1
- package/dist/utils/httpClient.d.ts +11 -0
- package/dist/utils/httpClient.js +48 -0
- package/dist/utils/httpClient.js.map +1 -0
- package/dist/views/Bonds/components/BondRows/ActiveBondRows.js +1 -2
- package/dist/views/Bonds/components/BondRows/ActiveBondRows.js.map +1 -1
- package/dist/views/Bonds/components/HotBondCards/index.js +3 -26
- package/dist/views/Bonds/components/HotBondCards/index.js.map +1 -1
- package/dist/views/BuyBond/BuyComponentSui.js +2 -3
- package/dist/views/BuyBond/BuyComponentSui.js.map +1 -1
- package/dist/views/YourBondsModal/components/LinkShare/utils.js +8 -7
- package/dist/views/YourBondsModal/components/LinkShare/utils.js.map +1 -1
- package/package.json +2 -5
- package/dist/contexts/SwiperProvider.d.ts +0 -12
- package/dist/contexts/SwiperProvider.js +0 -21
- package/dist/contexts/SwiperProvider.js.map +0 -1
- package/dist/hooks/useSwiper.d.ts +0 -2
- package/dist/hooks/useSwiper.js +0 -13
- package/dist/hooks/useSwiper.js.map +0 -1
- package/dist/utils/getDotPos.d.ts +0 -1
- package/dist/utils/getDotPos.js +0 -12
- package/dist/utils/getDotPos.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchUsersBondsSOL.js","sources":["../../../../src/state/bonds/fetchUsersBonds/fetchUsersBondsSOL.ts"],"sourcesContent":["import { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { UserBill, UserOwnedBillsData } from '../../../types/yourbonds'\nimport { Connection, PublicKey, Transaction, TransactionInstruction } from '@solana/web3.js'\nimport { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { HeliusApiResponse, HeliusAsset } from '../../../types/helius'\nimport { getBondAccountSolana } from '../../../utils/getSolanaAccount'\nimport { getU64Codec } from '@solana/kit'\nimport { CLAIMABLE_PAYOUT_DISCRIMINATOR, PROGRAM_ID } from '../../../constants/solanaConstants'\nimport { Buffer } from 'buffer'\nimport { getRPC, HELIUS_SOL_RPC } from '../../../config/constants/networks'\nimport axios from 'axios'\nimport { PRICE_API_URL } from '../../../config/constants/variables'\n\nexport async function fetchUsersBondsSOL(\n user: string,\n bondData: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserOwnedBillsData[]> {\n if (!user) return []\n try {\n console.time('fetchUserBondsSOL')\n const results: UserOwnedBillsData[] = []\n\n const userBase58 = new PublicKey(user).toBase58()\n\n const connection = new Connection(getRPC(ChainId.SOL), 'confirmed')\n\n const collections: string[] = bondData.map((bond) => bond.billNnftAddress[ChainId.SOL]!)\n\n const allOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: '1',\n method: 'searchAssets',\n params: {\n ownerAddress: userBase58,\n collections,\n },\n }),\n }\n const allResponse = await fetch(HELIUS_SOL_RPC, allOptions)\n const allData: HeliusApiResponse = await allResponse.json()\n const allUserAssets: HeliusAsset[] = allData.result.items\n\n for (const bond of bondData) {\n if (bond.chainId !== ChainId.SOL || !bond.contractAddress[ChainId.SOL]) continue\n const bondIssuancePda = new PublicKey(bond.contractAddress[ChainId.SOL])\n const userBills: UserBill[] = []\n const collection = bond.billNnftAddress[ChainId.SOL]\n\n let principalTokenPrice = tokenPrices?.[ChainId.SOL]?.find?.(\n (t) => t?.tokenAddress?.toLowerCase() === bond?.lpToken?.address?.[ChainId.SOL]?.toLowerCase(),\n )?.price\n let payoutTokenPrice = tokenPrices?.[ChainId.SOL]?.find?.(\n (t) => t?.tokenAddress?.toLowerCase() === bond?.earnToken?.address?.[ChainId.SOL]?.toLowerCase(),\n )?.price\n\n if (principalTokenPrice === undefined) {\n const res = await axios.get(\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.data.price)\n principalTokenPrice = parseFloat(res.data.price ?? '0')\n }\n if (payoutTokenPrice === undefined) {\n const res = await axios.get(\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.data.price)\n payoutTokenPrice = parseFloat(res.data.price ?? '0')\n }\n\n const userAssets = allUserAssets.filter((asset) => {\n return asset.authorities[0].address.toLowerCase() === bond.contractAddress[ChainId.SOL]?.toLowerCase()\n })\n\n for (const asset of userAssets) {\n const nftMint = new PublicKey(asset.id)\n\n const [bondPda] = PublicKey.findProgramAddressSync(\n [new TextEncoder().encode('bond'), bondIssuancePda.toBuffer(), nftMint.toBuffer()],\n PROGRAM_ID,\n )\n\n if (!bondPda) {\n console.error(`Could not fetch bond PDA for mint ${nftMint.toBase58()}`)\n continue\n }\n\n try {\n const [bondTermPda] = PublicKey.findProgramAddressSync(\n [new TextEncoder().encode('bond_term'), bondIssuancePda.toBuffer()],\n PROGRAM_ID,\n )\n\n const [bondAccounts, pendingRewards] = await Promise.all([\n getBondAccountSolana([bondPda.toBase58()]),\n calculatePendingRewards(connection, bondPda, bondTermPda, bondIssuancePda, nftMint),\n ])\n\n if (!bondAccounts?.length) {\n console.error(`Could not fetch bond account for mint ${nftMint.toBase58()}`)\n continue\n }\n\n const bondAccount = bondAccounts[0]\n const id = asset.content.metadata.name\n const idTrimmed: string = id.split('-')[1]?.trim()\n userBills.push({\n address: bondPda.toBase58(),\n id: idTrimmed,\n asset: nftMint.toBase58(),\n // vesting: bondAccount.vesting.toString(),\n vestingTerm: bondAccount.vestingTerm.toString(),\n payout: (bondAccount.payout - bondAccount.payoutClaimed).toString(),\n totalPayout: bondAccount.payout.toString(),\n truePricePaid: bondAccount.truePricePaid.toString(),\n lastBlockTimestamp: bondAccount.lastClaimTimestamp.toString(),\n vestingStartTimestamp: bondAccount.vestingStartTimestamp.toString(),\n pendingRewards,\n billNftAddress: collection as string,\n payoutClaimed: bondAccount.payoutClaimed.toString(),\n bond: {\n ...bond,\n payoutTokenPrice: payoutTokenPrice?.toString(),\n principalTokenPrice: principalTokenPrice?.toString(),\n },\n })\n // ULTRA HOT FIX :( until we can figure out a multicall strategy\n await new Promise((r) => setTimeout(r, 10))\n } catch (e) {\n console.log(e)\n console.error(`Could not fetch bond PDA for mint ${nftMint.toBase58()}`)\n }\n }\n results.push({\n index: bond.index,\n userOwnedBills: userBills,\n })\n }\n console.timeEnd('fetchUserBondsSOL')\n return results\n } catch (err) {\n console.error('Error fetching assets by collection:', err)\n return []\n }\n}\n\nasync function calculatePendingRewards(\n connection: Connection,\n bondPda: PublicKey,\n bondTermPda: PublicKey,\n bondIssuancePda: PublicKey,\n nftMint: PublicKey,\n): Promise<string> {\n try {\n const u64Codec = getU64Codec()\n\n const currentTimestamp = Math.floor(Date.now() / 1000)\n\n const encodedTimestamp = u64Codec.encode(BigInt(currentTimestamp))\n\n // Instruction data\n const instructionData = Buffer.concat([CLAIMABLE_PAYOUT_DISCRIMINATOR, Buffer.from(encodedTimestamp)])\n\n // Accounts\n const keys = [\n { pubkey: bondPda, isSigner: false, isWritable: true },\n { pubkey: bondTermPda, isSigner: false, isWritable: false },\n { pubkey: bondIssuancePda, isSigner: false, isWritable: false },\n { pubkey: nftMint, isSigner: false, isWritable: false },\n ]\n\n // Instruction\n const instruction = new TransactionInstruction({\n keys,\n programId: PROGRAM_ID,\n data: instructionData,\n })\n\n // Transaction\n const transaction = new Transaction()\n const userPublicKey = new PublicKey('11111111111111111111111111111112') // Dummy public key for fee payer\n transaction.feePayer = userPublicKey\n transaction.add(instruction)\n\n // Simulate\n const simulation = await connection.simulateTransaction(transaction)\n\n // Extract return value\n const returnData = simulation.value.returnData\n if (returnData) {\n const [data, encoding] = returnData.data\n if (encoding !== 'base64') {\n throw new Error(`Unexpected return data encoding: ${encoding}`)\n }\n\n const decodedData = Buffer.from(data, 'base64')\n return decodedData.readBigUInt64LE(0).toString()\n }\n\n // Fallback\n return '0'\n } catch (error) {\n console.error('Error calculating pending rewards:', error)\n return '0'\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fetchUsersBondsSOL.js","sources":["../../../../src/state/bonds/fetchUsersBonds/fetchUsersBondsSOL.ts"],"sourcesContent":["import { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport { UserBill, UserOwnedBillsData } from '../../../types/yourbonds'\nimport { Connection, PublicKey, Transaction, TransactionInstruction } from '@solana/web3.js'\nimport { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { HeliusApiResponse, HeliusAsset } from '../../../types/helius'\nimport { getBondAccountSolana } from '../../../utils/getSolanaAccount'\nimport { getU64Codec } from '@solana/kit'\nimport { CLAIMABLE_PAYOUT_DISCRIMINATOR, PROGRAM_ID } from '../../../constants/solanaConstants'\nimport { Buffer } from 'buffer'\nimport { getRPC, HELIUS_SOL_RPC } from '../../../config/constants/networks'\nimport { apiGet } from '../../../utils/httpClient'\nimport { PRICE_API_URL } from '../../../config/constants/variables'\n\nexport async function fetchUsersBondsSOL(\n user: string,\n bondData: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserOwnedBillsData[]> {\n if (!user) return []\n try {\n console.time('fetchUserBondsSOL')\n const results: UserOwnedBillsData[] = []\n\n const userBase58 = new PublicKey(user).toBase58()\n\n const connection = new Connection(getRPC(ChainId.SOL), 'confirmed')\n\n const collections: string[] = bondData.map((bond) => bond.billNnftAddress[ChainId.SOL]!)\n\n const allOptions = {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: '1',\n method: 'searchAssets',\n params: {\n ownerAddress: userBase58,\n collections,\n },\n }),\n }\n const allResponse = await fetch(HELIUS_SOL_RPC, allOptions)\n const allData: HeliusApiResponse = await allResponse.json()\n const allUserAssets: HeliusAsset[] = allData.result.items\n\n for (const bond of bondData) {\n if (bond.chainId !== ChainId.SOL || !bond.contractAddress[ChainId.SOL]) continue\n const bondIssuancePda = new PublicKey(bond.contractAddress[ChainId.SOL])\n const userBills: UserBill[] = []\n const collection = bond.billNnftAddress[ChainId.SOL]\n\n let principalTokenPrice = tokenPrices?.[ChainId.SOL]?.find?.(\n (t) => t?.tokenAddress?.toLowerCase() === bond?.lpToken?.address?.[ChainId.SOL]?.toLowerCase(),\n )?.price\n let payoutTokenPrice = tokenPrices?.[ChainId.SOL]?.find?.(\n (t) => t?.tokenAddress?.toLowerCase() === bond?.earnToken?.address?.[ChainId.SOL]?.toLowerCase(),\n )?.price\n\n if (principalTokenPrice === undefined) {\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 }\n if (payoutTokenPrice === undefined) {\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 }\n\n const userAssets = allUserAssets.filter((asset) => {\n return asset.authorities[0].address.toLowerCase() === bond.contractAddress[ChainId.SOL]?.toLowerCase()\n })\n\n for (const asset of userAssets) {\n const nftMint = new PublicKey(asset.id)\n\n const [bondPda] = PublicKey.findProgramAddressSync(\n [new TextEncoder().encode('bond'), bondIssuancePda.toBuffer(), nftMint.toBuffer()],\n PROGRAM_ID,\n )\n\n if (!bondPda) {\n console.error(`Could not fetch bond PDA for mint ${nftMint.toBase58()}`)\n continue\n }\n\n try {\n const [bondTermPda] = PublicKey.findProgramAddressSync(\n [new TextEncoder().encode('bond_term'), bondIssuancePda.toBuffer()],\n PROGRAM_ID,\n )\n\n const [bondAccounts, pendingRewards] = await Promise.all([\n getBondAccountSolana([bondPda.toBase58()]),\n calculatePendingRewards(connection, bondPda, bondTermPda, bondIssuancePda, nftMint),\n ])\n\n if (!bondAccounts?.length) {\n console.error(`Could not fetch bond account for mint ${nftMint.toBase58()}`)\n continue\n }\n\n const bondAccount = bondAccounts[0]\n const id = asset.content.metadata.name\n const idTrimmed: string = id.split('-')[1]?.trim()\n userBills.push({\n address: bondPda.toBase58(),\n id: idTrimmed,\n asset: nftMint.toBase58(),\n // vesting: bondAccount.vesting.toString(),\n vestingTerm: bondAccount.vestingTerm.toString(),\n payout: (bondAccount.payout - bondAccount.payoutClaimed).toString(),\n totalPayout: bondAccount.payout.toString(),\n truePricePaid: bondAccount.truePricePaid.toString(),\n lastBlockTimestamp: bondAccount.lastClaimTimestamp.toString(),\n vestingStartTimestamp: bondAccount.vestingStartTimestamp.toString(),\n pendingRewards,\n billNftAddress: collection as string,\n payoutClaimed: bondAccount.payoutClaimed.toString(),\n bond: {\n ...bond,\n payoutTokenPrice: payoutTokenPrice?.toString(),\n principalTokenPrice: principalTokenPrice?.toString(),\n },\n })\n // ULTRA HOT FIX :( until we can figure out a multicall strategy\n await new Promise((r) => setTimeout(r, 10))\n } catch (e) {\n console.log(e)\n console.error(`Could not fetch bond PDA for mint ${nftMint.toBase58()}`)\n }\n }\n results.push({\n index: bond.index,\n userOwnedBills: userBills,\n })\n }\n console.timeEnd('fetchUserBondsSOL')\n return results\n } catch (err) {\n console.error('Error fetching assets by collection:', err)\n return []\n }\n}\n\nasync function calculatePendingRewards(\n connection: Connection,\n bondPda: PublicKey,\n bondTermPda: PublicKey,\n bondIssuancePda: PublicKey,\n nftMint: PublicKey,\n): Promise<string> {\n try {\n const u64Codec = getU64Codec()\n\n const currentTimestamp = Math.floor(Date.now() / 1000)\n\n const encodedTimestamp = u64Codec.encode(BigInt(currentTimestamp))\n\n // Instruction data\n const instructionData = Buffer.concat([CLAIMABLE_PAYOUT_DISCRIMINATOR, Buffer.from(encodedTimestamp)])\n\n // Accounts\n const keys = [\n { pubkey: bondPda, isSigner: false, isWritable: true },\n { pubkey: bondTermPda, isSigner: false, isWritable: false },\n { pubkey: bondIssuancePda, isSigner: false, isWritable: false },\n { pubkey: nftMint, isSigner: false, isWritable: false },\n ]\n\n // Instruction\n const instruction = new TransactionInstruction({\n keys,\n programId: PROGRAM_ID,\n data: instructionData,\n })\n\n // Transaction\n const transaction = new Transaction()\n const userPublicKey = new PublicKey('11111111111111111111111111111112') // Dummy public key for fee payer\n transaction.feePayer = userPublicKey\n transaction.add(instruction)\n\n // Simulate\n const simulation = await connection.simulateTransaction(transaction)\n\n // Extract return value\n const returnData = simulation.value.returnData\n if (returnData) {\n const [data, encoding] = returnData.data\n if (encoding !== 'base64') {\n throw new Error(`Unexpected return data encoding: ${encoding}`)\n }\n\n const decodedData = Buffer.from(data, 'base64')\n return decodedData.readBigUInt64LE(0).toString()\n }\n\n // Fallback\n return '0'\n } catch (error) {\n console.error('Error calculating pending rewards:', error)\n return '0'\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;AAaO,eAAe,kBAAkB,CACtC,IAAY,EACZ,QAAuB,EACvB,WAAoD,EAAA;AAEpD,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,EAAE;AACpB,IAAA,IAAI;AACF,QAAA,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACjC,MAAM,OAAO,GAAyB,EAAE;QAExC,MAAM,UAAU,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;AAEjD,QAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC;QAEnE,MAAM,WAAW,GAAa,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAE,CAAC;AAExF,QAAA,MAAM,UAAU,GAAG;AACjB,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;AAC/C,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;AACnB,gBAAA,OAAO,EAAE,KAAK;AACd,gBAAA,EAAE,EAAE,GAAG;AACP,gBAAA,MAAM,EAAE,cAAc;AACtB,gBAAA,MAAM,EAAE;AACN,oBAAA,YAAY,EAAE,UAAU;oBACxB,WAAW;AACZ,iBAAA;aACF,CAAC;SACH;QACD,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,cAAc,EAAE,UAAU,CAAC;AAC3D,QAAA,MAAM,OAAO,GAAsB,MAAM,WAAW,CAAC,IAAI,EAAE;AAC3D,QAAA,MAAM,aAAa,GAAkB,OAAO,CAAC,MAAM,CAAC,KAAK;AAEzD,QAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AAC3B,YAAA,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE;AACxE,YAAA,MAAM,eAAe,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxE,MAAM,SAAS,GAAe,EAAE;YAChC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC;AAEpD,YAAA,IAAI,mBAAmB,GAAG,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,GACxD,CAAC,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,CAC/F,EAAE,KAAK;AACR,YAAA,IAAI,gBAAgB,GAAG,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,GACrD,CAAC,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,CACjG,EAAE,KAAK;AAER,YAAA,IAAI,mBAAmB,KAAK,SAAS,EAAE;gBACrC,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;AACA,YAAA,IAAI,gBAAgB,KAAK,SAAS,EAAE;gBAClC,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;YAEA,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,KAAI;gBAChD,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE;AACxG,YAAA,CAAC,CAAC;AAEF,YAAA,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE;gBAC9B,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;AAEvC,gBAAA,MAAM,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,sBAAsB,CAChD,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,EAClF,UAAU,CACX;gBAED,IAAI,CAAC,OAAO,EAAE;oBACZ,OAAO,CAAC,KAAK,CAAC,CAAA,kCAAA,EAAqC,OAAO,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;oBACxE;gBACF;AAEA,gBAAA,IAAI;oBACF,MAAM,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,sBAAsB,CACpD,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,EACnE,UAAU,CACX;oBAED,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACvD,wBAAA,oBAAoB,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;wBAC1C,uBAAuB,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,CAAC;AACpF,qBAAA,CAAC;AAEF,oBAAA,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE;wBACzB,OAAO,CAAC,KAAK,CAAC,CAAA,sCAAA,EAAyC,OAAO,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;wBAC5E;oBACF;AAEA,oBAAA,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC;oBACnC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI;AACtC,oBAAA,MAAM,SAAS,GAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;oBAClD,SAAS,CAAC,IAAI,CAAC;AACb,wBAAA,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;AAC3B,wBAAA,EAAE,EAAE,SAAS;AACb,wBAAA,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE;;AAEzB,wBAAA,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,QAAQ,EAAE;AAC/C,wBAAA,MAAM,EAAE,CAAC,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,aAAa,EAAE,QAAQ,EAAE;AACnE,wBAAA,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE;AAC1C,wBAAA,aAAa,EAAE,WAAW,CAAC,aAAa,CAAC,QAAQ,EAAE;AACnD,wBAAA,kBAAkB,EAAE,WAAW,CAAC,kBAAkB,CAAC,QAAQ,EAAE;AAC7D,wBAAA,qBAAqB,EAAE,WAAW,CAAC,qBAAqB,CAAC,QAAQ,EAAE;wBACnE,cAAc;AACd,wBAAA,cAAc,EAAE,UAAoB;AACpC,wBAAA,aAAa,EAAE,WAAW,CAAC,aAAa,CAAC,QAAQ,EAAE;AACnD,wBAAA,IAAI,EAAE;AACJ,4BAAA,GAAG,IAAI;AACP,4BAAA,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE;AAC9C,4BAAA,mBAAmB,EAAE,mBAAmB,EAAE,QAAQ,EAAE;AACrD,yBAAA;AACF,qBAAA,CAAC;;AAEF,oBAAA,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7C;gBAAE,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;oBACd,OAAO,CAAC,KAAK,CAAC,CAAA,kCAAA,EAAqC,OAAO,CAAC,QAAQ,EAAE,CAAA,CAAE,CAAC;gBAC1E;YACF;YACA,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,gBAAA,cAAc,EAAE,SAAS;AAC1B,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC;AACpC,QAAA,OAAO,OAAO;IAChB;IAAE,OAAO,GAAG,EAAE;AACZ,QAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC;AAC1D,QAAA,OAAO,EAAE;IACX;AACF;AAEA,eAAe,uBAAuB,CACpC,UAAsB,EACtB,OAAkB,EAClB,WAAsB,EACtB,eAA0B,EAC1B,OAAkB,EAAA;AAElB,IAAA,IAAI;AACF,QAAA,MAAM,QAAQ,GAAG,WAAW,EAAE;AAE9B,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAEtD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;;AAGlE,QAAA,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,8BAA8B,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;;AAGtG,QAAA,MAAM,IAAI,GAAG;YACX,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;YACtD,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;YAC3D,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;YAC/D,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE;SACxD;;AAGD,QAAA,MAAM,WAAW,GAAG,IAAI,sBAAsB,CAAC;YAC7C,IAAI;AACJ,YAAA,SAAS,EAAE,UAAU;AACrB,YAAA,IAAI,EAAE,eAAe;AACtB,SAAA,CAAC;;AAGF,QAAA,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE;QACrC,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAA;AACvE,QAAA,WAAW,CAAC,QAAQ,GAAG,aAAa;AACpC,QAAA,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;;QAG5B,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,mBAAmB,CAAC,WAAW,CAAC;;AAGpE,QAAA,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU;QAC9C,IAAI,UAAU,EAAE;YACd,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,IAAI;AACxC,YAAA,IAAI,QAAQ,KAAK,QAAQ,EAAE;AACzB,gBAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,CAAA,CAAE,CAAC;YACjE;YAEA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;YAC/C,OAAO,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAClD;;AAGA,QAAA,OAAO,GAAG;IACZ;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC;AAC1D,QAAA,OAAO,GAAG;IACZ;AACF;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
2
2
|
import { SUI_PLACEHOLDER_BILL_IMAGE, SUI_PACKAGE_ID } from '../../../constants/suiConstants.js';
|
|
3
3
|
import { getSuiClient } from '../../../utils/suiHelpers.js';
|
|
4
|
-
import
|
|
4
|
+
import { apiGet } from '../../../utils/httpClient.js';
|
|
5
5
|
import { PRICE_API_URL } from '../../../config/constants/variables.js';
|
|
6
6
|
|
|
7
7
|
// =============================================================================
|
|
@@ -137,8 +137,8 @@ async function fetchUsersBondsSUI(user, bondData, tokenPrices) {
|
|
|
137
137
|
let payoutPrice = suiPrices.find((t) => t.tokenAddress.toLowerCase() === payoutAddr)?.price;
|
|
138
138
|
if (principalPrice === undefined) {
|
|
139
139
|
try {
|
|
140
|
-
const res = await
|
|
141
|
-
principalPrice = parseFloat(res.
|
|
140
|
+
const res = await apiGet(`${PRICE_API_URL}/realtime/price?token=${bond.lpToken.address[suiKey]}&chain=${suiKey}`);
|
|
141
|
+
principalPrice = parseFloat(res.price ?? '0');
|
|
142
142
|
}
|
|
143
143
|
catch {
|
|
144
144
|
principalPrice = 0;
|
|
@@ -146,8 +146,8 @@ async function fetchUsersBondsSUI(user, bondData, tokenPrices) {
|
|
|
146
146
|
}
|
|
147
147
|
if (payoutPrice === undefined) {
|
|
148
148
|
try {
|
|
149
|
-
const res = await
|
|
150
|
-
payoutPrice = parseFloat(res.
|
|
149
|
+
const res = await apiGet(`${PRICE_API_URL}/realtime/price?token=${bond.earnToken.address[suiKey]}&chain=${suiKey}`);
|
|
150
|
+
payoutPrice = parseFloat(res.price ?? '0');
|
|
151
151
|
}
|
|
152
152
|
catch {
|
|
153
153
|
payoutPrice = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchUsersBondsSUI.js","sources":["../../../../src/state/bonds/fetchUsersBonds/fetchUsersBondsSUI.ts"],"sourcesContent":["// =============================================================================\n// fetchUserOwnedSuiBonds — user bills fetcher for the Sui chain\n// =============================================================================\n//\n// On-chain first: reads user bills directly from Sui objects (no api-v2\n// dependency). Uses:\n//\n// getOwnedObjects(user, BondNFT filter) → [BondNFT objects]\n// Each BondNFT has fields: bill_id, bond_market, uri\n// getDynamicFieldObject(market.bills, bill_id) → Bill struct\n// Bill fields: payout, payout_claimed, vesting_term, vesting_start_timestamp,\n// last_claim_timestamp, true_price_paid\n\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport type { UserOwnedBillsData, UserBill } from '../../../types/yourbonds'\nimport type { BondsData } from '../../../types/bonds'\nimport type { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { SUI_PACKAGE_ID, SUI_PLACEHOLDER_BILL_IMAGE } from '../../../constants/suiConstants'\nimport { getSuiClient } from '../../../utils/suiHelpers'\nimport axios from 'axios'\nimport { PRICE_API_URL } from '../../../config/constants/variables'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ninterface SuiBondNftFields {\n bill_id: string\n bond_market: string\n uri: string\n}\n\ninterface SuiBillFields {\n payout: string\n payout_claimed: string\n vesting_term: string\n vesting_start_timestamp: string\n last_claim_timestamp: string\n true_price_paid: string\n}\n\n/**\n * Fetch all BondNFT objects owned by a user address.\n * Returns the parsed content fields for each NFT.\n */\nasync function fetchUserBondNfts(userAddress: string): Promise<{ objectId: string; fields: SuiBondNftFields }[]> {\n const client = getSuiClient()\n const structType = `${SUI_PACKAGE_ID}::bond_nft::BondNFT`\n\n const results: { objectId: string; fields: SuiBondNftFields }[] = []\n let cursor: string | null | undefined = undefined\n let hasNextPage = true\n\n while (hasNextPage) {\n const response = await client.getOwnedObjects({\n owner: userAddress,\n filter: { StructType: structType },\n options: { showContent: true },\n cursor: cursor ?? undefined,\n })\n\n for (const item of response.data) {\n if (!item.data?.content || item.data.content.dataType !== 'moveObject') continue\n const fields = item.data.content.fields as unknown as SuiBondNftFields\n results.push({ objectId: item.data.objectId, fields })\n }\n\n hasNextPage = response.hasNextPage\n cursor = response.nextCursor\n }\n\n return results\n}\n\n/**\n * Read a single Bill from a BondMarket's `bills` Table by bill_id.\n *\n * The BondMarket is a shared object whose `bills` field is a `Table<u64, Bill>`.\n * Sui stores Table entries as dynamic fields on the Table's UID. We first read\n * the BondMarket object to get the Table's object ID, then query the dynamic\n * field for the specific bill_id.\n */\nasync function readBillFromMarket(\n marketObjectId: string,\n billId: string,\n): Promise<SuiBillFields & { cliffPeriod: number }> {\n const client = getSuiClient()\n\n // Step 1: Read the BondMarket object to find the `bills` Table object ID.\n // The `bills` field in a Move struct with `Table<u64, Bill>` is stored as an\n // object ID in the parent object's fields.\n const marketObj = await client.getObject({\n id: marketObjectId,\n options: { showContent: true },\n })\n\n if (!marketObj.data?.content || marketObj.data.content.dataType !== 'moveObject') {\n throw new Error(`[Sui] BondMarket ${marketObjectId} not found or not a Move object`)\n }\n\n const marketFields = marketObj.data.content.fields as Record<string, any>\n // Table fields in Sui are serialised as { id: { id: \"0x...\" }, size: N }\n const billsTableId = marketFields?.bills?.fields?.id?.id ?? marketFields?.bills?.id?.id\n if (!billsTableId) {\n throw new Error(`[Sui] Could not extract bills table ID from BondMarket ${marketObjectId}`)\n }\n\n // Step 2: Read the dynamic field for this bill_id from the Table.\n const billObj = await client.getDynamicFieldObject({\n parentId: billsTableId,\n name: { type: 'u64', value: billId },\n })\n\n if (!billObj.data?.content || billObj.data.content.dataType !== 'moveObject') {\n throw new Error(`[Sui] Bill ${billId} not found in market ${marketObjectId}`)\n }\n\n // The dynamic field value is nested under `fields.value` (or `fields.value.fields`\n // depending on serialisation depth).\n const dfFields = billObj.data.content.fields as Record<string, any>\n const billValue = dfFields?.value?.fields ?? dfFields?.value ?? dfFields\n\n // Extract cliff period from the market's vesting_config\n const vestingConfig = marketFields?.vesting_config\n const cliffPeriod = vestingConfig?.variant === 'CliffLinear' ? Number(vestingConfig?.fields?.cliff_period ?? 0) : 0\n\n return { ...(billValue as SuiBillFields), cliffPeriod }\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\nexport async function fetchUsersBondsSUI(\n user: string | undefined,\n bondData: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserOwnedBillsData[]> {\n if (!user) return []\n\n // Build one `UserOwnedBillsData` per known bond config. We always return\n // the outer shell so downstream code (`getUserBonds` in useUserBonds.ts)\n // can match bills back to their bond config.\n const suiKey = ChainId.SUI\n const suiPrices = tokenPrices?.[suiKey] ?? []\n\n // Index bonds by lowercased market address for O(1) lookup when matching\n // NFTs back to their market.\n const bondsByMarket = new Map<string, BillsConfig>()\n for (const bond of bondData) {\n const marketAddr = bond.contractAddress[suiKey]\n if (marketAddr) bondsByMarket.set(marketAddr.toLowerCase(), bond)\n }\n\n // Seed the result with empty shells so every bond is represented.\n const result: UserOwnedBillsData[] = bondData.map((bond) => ({\n index: bond.index,\n userOwnedBills: [] as UserBill[],\n }))\n const indexByBondIndex = new Map<number, UserOwnedBillsData>()\n for (const entry of result) indexByBondIndex.set(entry.index, entry)\n\n try {\n const nfts = await fetchUserBondNfts(user)\n if (nfts.length === 0) return result\n\n // For each BondNFT the user owns, resolve its market, read the bill data,\n // and compute vesting progress. NFTs whose market is not in our bondData\n // are silently skipped (they belong to a market the SDK isn't configured\n // to display).\n await Promise.all(\n nfts.map(async (nft) => {\n try {\n const { fields } = nft\n const billId = String(fields.bill_id)\n const marketAddr = fields.bond_market\n\n const bond = bondsByMarket.get(marketAddr.toLowerCase())\n if (!bond) return\n\n const billInfo = await readBillFromMarket(marketAddr, billId)\n\n const principalAddr = bond.lpToken.address[suiKey]?.toLowerCase()\n const payoutAddr = bond.earnToken.address[suiKey]?.toLowerCase()\n let principalPrice = suiPrices.find((t) => t.tokenAddress.toLowerCase() === principalAddr)?.price\n let payoutPrice = suiPrices.find((t) => t.tokenAddress.toLowerCase() === payoutAddr)?.price\n\n if (principalPrice === undefined) {\n try {\n const res = await axios.get(\n `${PRICE_API_URL}/realtime/price?token=${bond.lpToken.address[suiKey]}&chain=${suiKey}`,\n )\n principalPrice = parseFloat(res.data.price ?? '0')\n } catch {\n principalPrice = 0\n }\n }\n if (payoutPrice === undefined) {\n try {\n const res = await axios.get(\n `${PRICE_API_URL}/realtime/price?token=${bond.earnToken.address[suiKey]}&chain=${suiKey}`,\n )\n payoutPrice = parseFloat(res.data.price ?? '0')\n } catch {\n payoutPrice = 0\n }\n }\n\n const payoutTotal = String(billInfo.payout ?? '0')\n const payoutClaimed = String(billInfo.payout_claimed ?? '0')\n const payoutRemaining = (BigInt(payoutTotal) - BigInt(payoutClaimed)).toString()\n const vestingStart = String(billInfo.vesting_start_timestamp ?? '0')\n const lastClaim = String(billInfo.last_claim_timestamp ?? vestingStart)\n\n // Compute vesting progress client-side using the same curve as the contract.\n // Supports both Linear and CliffLinear vesting configurations.\n const nowSeconds = Math.floor(Date.now() / 1000)\n const vestingTerm = parseInt(String(billInfo.vesting_term ?? '0'))\n const vestingStartNum = parseInt(vestingStart)\n const cliffPeriod = billInfo.cliffPeriod ?? 0\n const elapsed = Math.max(0, nowSeconds - vestingStartNum)\n\n let totalVested: number\n if (cliffPeriod > 0) {\n // CliffLinear: nothing vests until cliff passes, then linear over remaining term\n if (elapsed < cliffPeriod) {\n totalVested = 0\n } else if (elapsed >= vestingTerm) {\n totalVested = parseInt(payoutTotal)\n } else {\n const elapsedAfterCliff = elapsed - cliffPeriod\n const vestingAfterCliff = vestingTerm - cliffPeriod\n totalVested =\n vestingAfterCliff > 0\n ? Math.floor((parseInt(payoutTotal) * elapsedAfterCliff) / vestingAfterCliff)\n : parseInt(payoutTotal)\n }\n } else {\n // Linear: standard proportional vesting\n const vestedFraction = vestingTerm > 0 ? Math.min(1, elapsed / vestingTerm) : 1\n totalVested = Math.floor(parseFloat(payoutTotal) * vestedFraction)\n }\n\n const claimable = Math.max(0, totalVested - parseInt(payoutClaimed))\n\n // Compute human-readable amounts for the modal display.\n const payoutDecimals = bond.earnToken.decimals[suiKey] ?? 9\n const principalDecimals = bond.lpToken.decimals[suiKey] ?? 9\n const payoutHuman = parseFloat(payoutTotal) / 10 ** payoutDecimals\n // Reconstruct deposit from payout and true_price_paid:\n // price = principal_amount * 1e8 / payout_amount -> principal = payout * price / 1e8\n const truePricePaid = parseFloat(String(billInfo.true_price_paid ?? '0'))\n const depositAtomic = (parseFloat(payoutTotal) * truePricePaid) / 1e12\n const depositHuman = depositAtomic / 10 ** principalDecimals\n const depositUSD = depositHuman * (principalPrice ?? 0)\n\n const userBill: UserBill = {\n // `UserBill.address` is used by the SDK's claim flow. On Sui, this\n // is the BondNFT object ID that the user passes to `bond::claim`.\n address: nft.objectId,\n id: billId,\n vestingTerm: String(billInfo.vesting_term ?? '0'),\n payout: payoutRemaining,\n totalPayout: payoutTotal,\n truePricePaid: String(billInfo.true_price_paid ?? '0'),\n lastBlockTimestamp: String(lastClaim),\n vestingStartTimestamp: String(vestingStart),\n pendingRewards: String(claimable),\n billNftAddress: bond.billNnftAddress[suiKey] ?? '',\n payoutClaimed,\n nftData: {\n tokenId: 0,\n billNftId: parseInt(billId),\n processing: false,\n image: SUI_PLACEHOLDER_BILL_IMAGE,\n // Populate `data` so YourBondsModal can display Deposit/Bond Value.\n // api-v2 won't enrich Sui bills, so we compute from on-chain data.\n data: {\n dollarValue: depositUSD,\n payout: payoutHuman,\n billContract: marketAddr,\n billNftAddress: bond.billNnftAddress[suiKey] ?? '',\n billNftId: parseInt(billId),\n blockNumber: 0,\n bondArtCollection: '',\n bondPartner: '',\n bondVersion: bond.version ?? '',\n chainId: suiKey,\n createTransactionHash: '',\n createdAddressOwner: user,\n createdAt: parseInt(String(vestingStart)),\n deposit: depositHuman,\n expires: parseInt(String(vestingStart)) + parseInt(String(billInfo.vesting_term ?? '0')),\n pairName: `${bond.lpToken.symbol}-${bond.earnToken.symbol}`,\n payoutToken: bond.earnToken.address[suiKey] ?? '',\n payoutTokenData: {\n address: bond.earnToken.address[suiKey] ?? '',\n name: bond.earnToken.symbol,\n symbol: bond.earnToken.symbol,\n decimals: bond.earnToken.decimals,\n },\n payoutTokenPrice: (payoutPrice ?? 0).toString(),\n principalToken: bond.lpToken.address[suiKey] ?? '',\n token0: {\n address: bond.lpToken.address[suiKey] ?? '',\n symbol: bond.lpToken.symbol,\n name: bond.lpToken.symbol,\n decimals: bond.lpToken.decimals,\n },\n token1: {\n address: bond.earnToken.address[suiKey] ?? '',\n symbol: bond.earnToken.symbol,\n name: bond.earnToken.symbol,\n decimals: bond.earnToken.decimals,\n },\n type: bond.billType ?? 'reserve',\n vestingPeriodSeconds: parseInt(String(billInfo.vesting_term ?? '0')),\n },\n },\n bond: {\n ...bond,\n payoutTokenPrice: payoutPrice?.toString(),\n principalTokenPrice: principalPrice?.toString(),\n } as BondsData,\n }\n\n const entry = indexByBondIndex.get(bond.index)\n entry?.userOwnedBills.push(userBill)\n } catch (billErr) {\n console.warn(`[Sui] Failed to read bill from NFT ${nft.objectId}`, billErr)\n }\n }),\n )\n } catch (e) {\n console.warn(`[Sui] Failed to list user bills for ${user}`, e)\n }\n\n return result\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fetchUsersBondsSUI.js","sources":["../../../../src/state/bonds/fetchUsersBonds/fetchUsersBondsSUI.ts"],"sourcesContent":["// =============================================================================\n// fetchUserOwnedSuiBonds — user bills fetcher for the Sui chain\n// =============================================================================\n//\n// On-chain first: reads user bills directly from Sui objects (no api-v2\n// dependency). Uses:\n//\n// getOwnedObjects(user, BondNFT filter) → [BondNFT objects]\n// Each BondNFT has fields: bill_id, bond_market, uri\n// getDynamicFieldObject(market.bills, bill_id) → Bill struct\n// Bill fields: payout, payout_claimed, vesting_term, vesting_start_timestamp,\n// last_claim_timestamp, true_price_paid\n\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport type { UserOwnedBillsData, UserBill } from '../../../types/yourbonds'\nimport type { BondsData } from '../../../types/bonds'\nimport type { TokenPrices } from '../../tokenPrices/useTokenPrices'\nimport { SUI_PACKAGE_ID, SUI_PLACEHOLDER_BILL_IMAGE } from '../../../constants/suiConstants'\nimport { getSuiClient } from '../../../utils/suiHelpers'\nimport { apiGet } from '../../../utils/httpClient'\nimport { PRICE_API_URL } from '../../../config/constants/variables'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ninterface SuiBondNftFields {\n bill_id: string\n bond_market: string\n uri: string\n}\n\ninterface SuiBillFields {\n payout: string\n payout_claimed: string\n vesting_term: string\n vesting_start_timestamp: string\n last_claim_timestamp: string\n true_price_paid: string\n}\n\n/**\n * Fetch all BondNFT objects owned by a user address.\n * Returns the parsed content fields for each NFT.\n */\nasync function fetchUserBondNfts(userAddress: string): Promise<{ objectId: string; fields: SuiBondNftFields }[]> {\n const client = getSuiClient()\n const structType = `${SUI_PACKAGE_ID}::bond_nft::BondNFT`\n\n const results: { objectId: string; fields: SuiBondNftFields }[] = []\n let cursor: string | null | undefined = undefined\n let hasNextPage = true\n\n while (hasNextPage) {\n const response = await client.getOwnedObjects({\n owner: userAddress,\n filter: { StructType: structType },\n options: { showContent: true },\n cursor: cursor ?? undefined,\n })\n\n for (const item of response.data) {\n if (!item.data?.content || item.data.content.dataType !== 'moveObject') continue\n const fields = item.data.content.fields as unknown as SuiBondNftFields\n results.push({ objectId: item.data.objectId, fields })\n }\n\n hasNextPage = response.hasNextPage\n cursor = response.nextCursor\n }\n\n return results\n}\n\n/**\n * Read a single Bill from a BondMarket's `bills` Table by bill_id.\n *\n * The BondMarket is a shared object whose `bills` field is a `Table<u64, Bill>`.\n * Sui stores Table entries as dynamic fields on the Table's UID. We first read\n * the BondMarket object to get the Table's object ID, then query the dynamic\n * field for the specific bill_id.\n */\nasync function readBillFromMarket(\n marketObjectId: string,\n billId: string,\n): Promise<SuiBillFields & { cliffPeriod: number }> {\n const client = getSuiClient()\n\n // Step 1: Read the BondMarket object to find the `bills` Table object ID.\n // The `bills` field in a Move struct with `Table<u64, Bill>` is stored as an\n // object ID in the parent object's fields.\n const marketObj = await client.getObject({\n id: marketObjectId,\n options: { showContent: true },\n })\n\n if (!marketObj.data?.content || marketObj.data.content.dataType !== 'moveObject') {\n throw new Error(`[Sui] BondMarket ${marketObjectId} not found or not a Move object`)\n }\n\n const marketFields = marketObj.data.content.fields as Record<string, any>\n // Table fields in Sui are serialised as { id: { id: \"0x...\" }, size: N }\n const billsTableId = marketFields?.bills?.fields?.id?.id ?? marketFields?.bills?.id?.id\n if (!billsTableId) {\n throw new Error(`[Sui] Could not extract bills table ID from BondMarket ${marketObjectId}`)\n }\n\n // Step 2: Read the dynamic field for this bill_id from the Table.\n const billObj = await client.getDynamicFieldObject({\n parentId: billsTableId,\n name: { type: 'u64', value: billId },\n })\n\n if (!billObj.data?.content || billObj.data.content.dataType !== 'moveObject') {\n throw new Error(`[Sui] Bill ${billId} not found in market ${marketObjectId}`)\n }\n\n // The dynamic field value is nested under `fields.value` (or `fields.value.fields`\n // depending on serialisation depth).\n const dfFields = billObj.data.content.fields as Record<string, any>\n const billValue = dfFields?.value?.fields ?? dfFields?.value ?? dfFields\n\n // Extract cliff period from the market's vesting_config\n const vestingConfig = marketFields?.vesting_config\n const cliffPeriod = vestingConfig?.variant === 'CliffLinear' ? Number(vestingConfig?.fields?.cliff_period ?? 0) : 0\n\n return { ...(billValue as SuiBillFields), cliffPeriod }\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\nexport async function fetchUsersBondsSUI(\n user: string | undefined,\n bondData: BillsConfig[],\n tokenPrices: Partial<Record<ChainId, TokenPrices[]>>,\n): Promise<UserOwnedBillsData[]> {\n if (!user) return []\n\n // Build one `UserOwnedBillsData` per known bond config. We always return\n // the outer shell so downstream code (`getUserBonds` in useUserBonds.ts)\n // can match bills back to their bond config.\n const suiKey = ChainId.SUI\n const suiPrices = tokenPrices?.[suiKey] ?? []\n\n // Index bonds by lowercased market address for O(1) lookup when matching\n // NFTs back to their market.\n const bondsByMarket = new Map<string, BillsConfig>()\n for (const bond of bondData) {\n const marketAddr = bond.contractAddress[suiKey]\n if (marketAddr) bondsByMarket.set(marketAddr.toLowerCase(), bond)\n }\n\n // Seed the result with empty shells so every bond is represented.\n const result: UserOwnedBillsData[] = bondData.map((bond) => ({\n index: bond.index,\n userOwnedBills: [] as UserBill[],\n }))\n const indexByBondIndex = new Map<number, UserOwnedBillsData>()\n for (const entry of result) indexByBondIndex.set(entry.index, entry)\n\n try {\n const nfts = await fetchUserBondNfts(user)\n if (nfts.length === 0) return result\n\n // For each BondNFT the user owns, resolve its market, read the bill data,\n // and compute vesting progress. NFTs whose market is not in our bondData\n // are silently skipped (they belong to a market the SDK isn't configured\n // to display).\n await Promise.all(\n nfts.map(async (nft) => {\n try {\n const { fields } = nft\n const billId = String(fields.bill_id)\n const marketAddr = fields.bond_market\n\n const bond = bondsByMarket.get(marketAddr.toLowerCase())\n if (!bond) return\n\n const billInfo = await readBillFromMarket(marketAddr, billId)\n\n const principalAddr = bond.lpToken.address[suiKey]?.toLowerCase()\n const payoutAddr = bond.earnToken.address[suiKey]?.toLowerCase()\n let principalPrice = suiPrices.find((t) => t.tokenAddress.toLowerCase() === principalAddr)?.price\n let payoutPrice = suiPrices.find((t) => t.tokenAddress.toLowerCase() === payoutAddr)?.price\n\n if (principalPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond.lpToken.address[suiKey]}&chain=${suiKey}`,\n )\n principalPrice = parseFloat(res.price ?? '0')\n } catch {\n principalPrice = 0\n }\n }\n if (payoutPrice === undefined) {\n try {\n const res = await apiGet<{ price: string }>(\n `${PRICE_API_URL}/realtime/price?token=${bond.earnToken.address[suiKey]}&chain=${suiKey}`,\n )\n payoutPrice = parseFloat(res.price ?? '0')\n } catch {\n payoutPrice = 0\n }\n }\n\n const payoutTotal = String(billInfo.payout ?? '0')\n const payoutClaimed = String(billInfo.payout_claimed ?? '0')\n const payoutRemaining = (BigInt(payoutTotal) - BigInt(payoutClaimed)).toString()\n const vestingStart = String(billInfo.vesting_start_timestamp ?? '0')\n const lastClaim = String(billInfo.last_claim_timestamp ?? vestingStart)\n\n // Compute vesting progress client-side using the same curve as the contract.\n // Supports both Linear and CliffLinear vesting configurations.\n const nowSeconds = Math.floor(Date.now() / 1000)\n const vestingTerm = parseInt(String(billInfo.vesting_term ?? '0'))\n const vestingStartNum = parseInt(vestingStart)\n const cliffPeriod = billInfo.cliffPeriod ?? 0\n const elapsed = Math.max(0, nowSeconds - vestingStartNum)\n\n let totalVested: number\n if (cliffPeriod > 0) {\n // CliffLinear: nothing vests until cliff passes, then linear over remaining term\n if (elapsed < cliffPeriod) {\n totalVested = 0\n } else if (elapsed >= vestingTerm) {\n totalVested = parseInt(payoutTotal)\n } else {\n const elapsedAfterCliff = elapsed - cliffPeriod\n const vestingAfterCliff = vestingTerm - cliffPeriod\n totalVested =\n vestingAfterCliff > 0\n ? Math.floor((parseInt(payoutTotal) * elapsedAfterCliff) / vestingAfterCliff)\n : parseInt(payoutTotal)\n }\n } else {\n // Linear: standard proportional vesting\n const vestedFraction = vestingTerm > 0 ? Math.min(1, elapsed / vestingTerm) : 1\n totalVested = Math.floor(parseFloat(payoutTotal) * vestedFraction)\n }\n\n const claimable = Math.max(0, totalVested - parseInt(payoutClaimed))\n\n // Compute human-readable amounts for the modal display.\n const payoutDecimals = bond.earnToken.decimals[suiKey] ?? 9\n const principalDecimals = bond.lpToken.decimals[suiKey] ?? 9\n const payoutHuman = parseFloat(payoutTotal) / 10 ** payoutDecimals\n // Reconstruct deposit from payout and true_price_paid:\n // price = principal_amount * 1e8 / payout_amount -> principal = payout * price / 1e8\n const truePricePaid = parseFloat(String(billInfo.true_price_paid ?? '0'))\n const depositAtomic = (parseFloat(payoutTotal) * truePricePaid) / 1e12\n const depositHuman = depositAtomic / 10 ** principalDecimals\n const depositUSD = depositHuman * (principalPrice ?? 0)\n\n const userBill: UserBill = {\n // `UserBill.address` is used by the SDK's claim flow. On Sui, this\n // is the BondNFT object ID that the user passes to `bond::claim`.\n address: nft.objectId,\n id: billId,\n vestingTerm: String(billInfo.vesting_term ?? '0'),\n payout: payoutRemaining,\n totalPayout: payoutTotal,\n truePricePaid: String(billInfo.true_price_paid ?? '0'),\n lastBlockTimestamp: String(lastClaim),\n vestingStartTimestamp: String(vestingStart),\n pendingRewards: String(claimable),\n billNftAddress: bond.billNnftAddress[suiKey] ?? '',\n payoutClaimed,\n nftData: {\n tokenId: 0,\n billNftId: parseInt(billId),\n processing: false,\n image: SUI_PLACEHOLDER_BILL_IMAGE,\n // Populate `data` so YourBondsModal can display Deposit/Bond Value.\n // api-v2 won't enrich Sui bills, so we compute from on-chain data.\n data: {\n dollarValue: depositUSD,\n payout: payoutHuman,\n billContract: marketAddr,\n billNftAddress: bond.billNnftAddress[suiKey] ?? '',\n billNftId: parseInt(billId),\n blockNumber: 0,\n bondArtCollection: '',\n bondPartner: '',\n bondVersion: bond.version ?? '',\n chainId: suiKey,\n createTransactionHash: '',\n createdAddressOwner: user,\n createdAt: parseInt(String(vestingStart)),\n deposit: depositHuman,\n expires: parseInt(String(vestingStart)) + parseInt(String(billInfo.vesting_term ?? '0')),\n pairName: `${bond.lpToken.symbol}-${bond.earnToken.symbol}`,\n payoutToken: bond.earnToken.address[suiKey] ?? '',\n payoutTokenData: {\n address: bond.earnToken.address[suiKey] ?? '',\n name: bond.earnToken.symbol,\n symbol: bond.earnToken.symbol,\n decimals: bond.earnToken.decimals,\n },\n payoutTokenPrice: (payoutPrice ?? 0).toString(),\n principalToken: bond.lpToken.address[suiKey] ?? '',\n token0: {\n address: bond.lpToken.address[suiKey] ?? '',\n symbol: bond.lpToken.symbol,\n name: bond.lpToken.symbol,\n decimals: bond.lpToken.decimals,\n },\n token1: {\n address: bond.earnToken.address[suiKey] ?? '',\n symbol: bond.earnToken.symbol,\n name: bond.earnToken.symbol,\n decimals: bond.earnToken.decimals,\n },\n type: bond.billType ?? 'reserve',\n vestingPeriodSeconds: parseInt(String(billInfo.vesting_term ?? '0')),\n },\n },\n bond: {\n ...bond,\n payoutTokenPrice: payoutPrice?.toString(),\n principalTokenPrice: principalPrice?.toString(),\n } as BondsData,\n }\n\n const entry = indexByBondIndex.get(bond.index)\n entry?.userOwnedBills.push(userBill)\n } catch (billErr) {\n console.warn(`[Sui] Failed to read bill from NFT ${nft.objectId}`, billErr)\n }\n }),\n )\n } catch (e) {\n console.warn(`[Sui] Failed to list user bills for ${user}`, e)\n }\n\n return result\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useQuery } from '@tanstack/react-query';
|
|
2
2
|
import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
|
|
3
|
-
import
|
|
3
|
+
import { apiGet } from '../../utils/httpClient.js';
|
|
4
4
|
import useTokenPrices from '../tokenPrices/useTokenPrices.js';
|
|
5
5
|
import useBondsList from './useBondsList.js';
|
|
6
6
|
import { ChainId } from '@ape.swap/apeswap-lists';
|
|
@@ -39,8 +39,8 @@ const calculateBondsData = async (queryClient) => {
|
|
|
39
39
|
let evmSolBondsData = [];
|
|
40
40
|
try {
|
|
41
41
|
// For EVM & SOL we first try to fetch from realtime, if it fails we trigger the fallback strategy.
|
|
42
|
-
const realTimeApiResponse = await
|
|
43
|
-
evmSolBondsData = realTimeApiResponse.
|
|
42
|
+
const realTimeApiResponse = await apiGet(`${realTimeApiUrl}/bonds`);
|
|
43
|
+
evmSolBondsData = realTimeApiResponse.bonds.filter((bond) => chains.includes(bond.chainId));
|
|
44
44
|
}
|
|
45
45
|
catch {
|
|
46
46
|
// Fallback strategy
|
|
@@ -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
|
|
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 '../bonds/useBondsListPreTGE'\nimport { fetchBondsDataPreTGE } from './fetchBondsData/fetchBondsDataPreTGE'\nimport { fetchBondsDataEVM } from './fetchBondsData/fetchBondsDataEVM'\nimport { fetchBondsDataAptos } from './fetchBondsData/fetchBondsDataAptos'\nimport { fetchBondsDataSUI } from './fetchBondsData/fetchBondsDataSui'\nimport { fetchBondsDataSOL } from './fetchBondsData/fetchBondsDataSOL'\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 // ----------------------- Step 2 -----------------------\n // Fetch EVM & SOL data from realtime\n let evmSolBondsData: BondsData[] = []\n\n try {\n // For EVM & SOL we first try to fetch from realtime, if it fails we trigger the fallback strategy.\n const realTimeApiResponse = await apiGet<{ bonds: BondsData[] }>(`${realTimeApiUrl}/bonds`)\n evmSolBondsData = realTimeApiResponse.bonds.filter((bond: BondsData) => chains.includes(bond.chainId))\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) => c !== ChainId.APTOS && c !== ChainId.SUI)\n .map(async (chainId: ChainId) => {\n if (!bondList[chainId]) return []\n return chainId === ChainId.SOL\n ? await fetchBondsDataSOL(bondList[chainId], apiUrl, tokenPrices[chainId])\n : await fetchBondsDataEVM(chainId, bondList[chainId], apiUrl, tokenPrices[chainId])\n }),\n ...chains.map(async (chainId: ChainId) => {\n const filteredBonds = preTGEList?.filter((bond) => bond.chainId === chainId) ?? []\n return await fetchBondsDataPreTGE(chainId, tokenPrices, filteredBonds, apiUrl)\n }),\n ])\n console.timeEnd('Fallback BondsData')\n evmSolBondsData = billData.flat()\n }\n\n // ----------------------- Step 3 -----------------------\n // Fetch Aptos & Sui Bonds data\n let aptosBonds: BondsData[] = []\n let suiBonds: BondsData[] = []\n const includesAptos = chains.includes(ChainId.APTOS)\n const includesSui = chains.includes(ChainId.SUI)\n\n if (includesAptos || includesSui) {\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 if (includesAptos && includesSui) {\n const [aptos, sui] = await Promise.all([\n fetchBondsDataAptos(bondList[ChainId.APTOS], tokenPrices[ChainId.APTOS]),\n fetchBondsDataSUI(bondList[ChainId.SUI], tokenPrices[ChainId.SUI]),\n ])\n aptosBonds = aptos\n suiBonds = sui\n } else if (includesAptos) {\n aptosBonds = await fetchBondsDataAptos(bondList[ChainId.APTOS], tokenPrices[ChainId.APTOS])\n } else if (includesSui) {\n suiBonds = await fetchBondsDataSUI(bondList[ChainId.SUI], tokenPrices[ChainId.SUI])\n }\n } catch (e) {\n console.error(e)\n }\n }\n\n return [...evmSolBondsData, ...aptosBonds, ...suiBonds]\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useQuery } from '@tanstack/react-query';
|
|
2
2
|
import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
|
|
3
|
-
import
|
|
3
|
+
import { apiGet } from '../../utils/httpClient.js';
|
|
4
4
|
import { BillVersion } from '@ape.swap/apeswap-lists';
|
|
5
5
|
import { ACF_TO_ABOND } from '../../config/constants/addresses.js';
|
|
6
6
|
|
|
@@ -16,8 +16,7 @@ function useBondsList() {
|
|
|
16
16
|
const getBondsList = async (queryClient) => {
|
|
17
17
|
const { urls, customBranch, chains } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]);
|
|
18
18
|
const realTimeApiURL = urls['realTimeApi'];
|
|
19
|
-
const
|
|
20
|
-
const bondList = response.data;
|
|
19
|
+
const bondList = await apiGet(`${realTimeApiURL}/utils/bonds${customBranch ? `?branch=${customBranch}` : ''}`);
|
|
21
20
|
return bondList.reduce((acc, bond) => {
|
|
22
21
|
// Exclude ACF to ABOND bonds, fixed price bonds, and migration bonds
|
|
23
22
|
if (bond.contractAddress[bond.chainId]?.toLowerCase() === ACF_TO_ABOND.toLowerCase() ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBondsList.js","sources":["../../../src/state/bonds/useBondsList.ts"],"sourcesContent":["import { QueryClient, useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport
|
|
1
|
+
{"version":3,"file":"useBondsList.js","sources":["../../../src/state/bonds/useBondsList.ts"],"sourcesContent":["import { QueryClient, useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { apiGet } from '../../utils/httpClient'\nimport { BillsConfig, BillVersion, ChainId } from '@ape.swap/apeswap-lists'\nimport { SDKProps } from '../useSDKConfig'\nimport { ACF_TO_ABOND } from '../../config/constants/addresses'\n\nexport default function useBondsList(): UseQueryResult<Record<ChainId, BillsConfig[]>> {\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_LIST],\n queryFn: ({ client }) => getBondsList(client),\n staleTime: Infinity,\n refetchInterval: 600000, // 10 min\n refetchOnWindowFocus: false,\n })\n}\n\nconst getBondsList = async (queryClient: QueryClient): Promise<Record<ChainId, BillsConfig[]>> => {\n const { urls, customBranch, chains } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiURL = urls['realTimeApi']\n\n const bondList = await apiGet<BillsConfig[]>(\n `${realTimeApiURL}/utils/bonds${customBranch ? `?branch=${customBranch}` : ''}`,\n )\n return bondList.reduce(\n (acc, bond) => {\n // Exclude ACF to ABOND bonds, fixed price bonds, and migration bonds\n if (\n bond.contractAddress[bond.chainId]?.toLowerCase() === ACF_TO_ABOND.toLowerCase() ||\n bond.billVersion === BillVersion.FixedPrice ||\n bond.billType === 'migration'\n ) {\n return acc\n }\n\n // Only process bonds that belong to the chains selected by the user\n if (chains.includes(bond.chainId)) {\n // Initialize acc[bond.chainId] if it doesn't exist yet\n if (!acc[bond.chainId]) {\n acc[bond.chainId] = []\n }\n\n // Safely push the bond to the array\n acc[bond.chainId].push(bond)\n }\n return acc\n },\n {} as Record<number, BillsConfig[]>,\n )\n}\n"],"names":[],"mappings":";;;;;;AAOc,SAAU,YAAY,GAAA;AAClC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QACjC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,YAAY,CAAC,MAAM,CAAC;AAC7C,QAAA,SAAS,EAAE,QAAQ;QACnB,eAAe,EAAE,MAAM;AACvB,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA,CAAC;AACJ;AAEA,MAAM,YAAY,GAAG,OAAO,WAAwB,KAA6C;AAC/F,IAAA,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAa;AACrG,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;IAE1C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAC3B,CAAA,EAAG,cAAc,eAAe,YAAY,GAAG,CAAA,QAAA,EAAW,YAAY,CAAA,CAAE,GAAG,EAAE,CAAA,CAAE,CAChF;IACD,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,GAAG,EAAE,IAAI,KAAI;;AAEZ,QAAA,IACE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,YAAY,CAAC,WAAW,EAAE;AAChF,YAAA,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,UAAU;AAC3C,YAAA,IAAI,CAAC,QAAQ,KAAK,WAAW,EAC7B;AACA,YAAA,OAAO,GAAG;QACZ;;QAGA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;;YAEjC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACtB,gBAAA,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACxB;;YAGA,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC9B;AACA,QAAA,OAAO,GAAG;IACZ,CAAC,EACD,EAAmC,CACpC;AACH,CAAC;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useQueryClient, useQuery } from '@tanstack/react-query';
|
|
2
2
|
import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
|
|
3
|
-
import
|
|
3
|
+
import { apiGet } from '../../utils/httpClient.js';
|
|
4
4
|
|
|
5
5
|
function useBondsListPreTGE() {
|
|
6
6
|
const queryClient = useQueryClient();
|
|
@@ -15,8 +15,7 @@ function useBondsListPreTGE() {
|
|
|
15
15
|
const getPreTGEList = async (queryClient) => {
|
|
16
16
|
const { urls, customBranch } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]);
|
|
17
17
|
const realTimeApiURL = urls['realTimeApi'];
|
|
18
|
-
|
|
19
|
-
return response.data;
|
|
18
|
+
return apiGet(`${realTimeApiURL}/utils/pre-tge-bonds${customBranch ? `?branch=${customBranch}` : ''}`);
|
|
20
19
|
};
|
|
21
20
|
|
|
22
21
|
export { useBondsListPreTGE as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBondsListPreTGE.js","sources":["../../../src/state/bonds/useBondsListPreTGE.ts"],"sourcesContent":["import { QueryClient, useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport
|
|
1
|
+
{"version":3,"file":"useBondsListPreTGE.js","sources":["../../../src/state/bonds/useBondsListPreTGE.ts"],"sourcesContent":["import { QueryClient, useQuery, useQueryClient, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { apiGet } from '../../utils/httpClient'\nimport { PreTGEConfig } from '@ape.swap/apeswap-lists'\nimport { SDKProps } from '../useSDKConfig'\n\nexport default function useBondsListPreTGE(): UseQueryResult<PreTGEConfig[]> {\n const queryClient = useQueryClient()\n return useQuery({\n queryKey: [QUERY_KEYS.BONDS_LIST_PRE_TGE],\n queryFn: () => getPreTGEList(queryClient),\n staleTime: Infinity,\n refetchInterval: 300000, // 5 min\n refetchOnWindowFocus: false,\n })\n}\n\nconst getPreTGEList = async (queryClient: QueryClient): Promise<PreTGEConfig[]> => {\n const { urls, customBranch } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const realTimeApiURL = urls['realTimeApi']\n return apiGet<PreTGEConfig[]>(\n `${realTimeApiURL}/utils/pre-tge-bonds${customBranch ? `?branch=${customBranch}` : ''}`,\n )\n}\n"],"names":[],"mappings":";;;;AAMc,SAAU,kBAAkB,GAAA;AACxC,IAAA,MAAM,WAAW,GAAG,cAAc,EAAE;AACpC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC;AACzC,QAAA,OAAO,EAAE,MAAM,aAAa,CAAC,WAAW,CAAC;AACzC,QAAA,SAAS,EAAE,QAAQ;QACnB,eAAe,EAAE,MAAM;AACvB,QAAA,oBAAoB,EAAE,KAAK;AAC5B,KAAA,CAAC;AACJ;AAEA,MAAM,aAAa,GAAG,OAAO,WAAwB,KAA6B;AAChF,IAAA,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAa;AAC7F,IAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC;AAC1C,IAAA,OAAO,MAAM,CACX,CAAA,EAAG,cAAc,CAAA,oBAAA,EAAuB,YAAY,GAAG,CAAA,QAAA,EAAW,YAAY,EAAE,GAAG,EAAE,CAAA,CAAE,CACxF;AACH,CAAC;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useQuery } from '@tanstack/react-query';
|
|
2
2
|
import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
|
|
3
|
-
import
|
|
3
|
+
import { apiPost } from '../../utils/httpClient.js';
|
|
4
4
|
import { useSDKConfig } from '../useSDKConfig.js';
|
|
5
5
|
import { reportError } from '../../utils/reportError.js';
|
|
6
6
|
import useEVMAccount from '../../hooks/accounts/useEVMAccount.js';
|
|
@@ -25,8 +25,8 @@ const getTierProofSig = async (apiAddress, account, bondAddress, chainId) => {
|
|
|
25
25
|
bond: bondAddress, // Use the bondAddress
|
|
26
26
|
chainId: chainId, // Use the specified chainId (Polygon)
|
|
27
27
|
};
|
|
28
|
-
const response = await
|
|
29
|
-
return response.
|
|
28
|
+
const response = await apiPost(`${apiAddress}/tier-signature`, requestBody);
|
|
29
|
+
return response.tierProofSignature;
|
|
30
30
|
}
|
|
31
31
|
catch (e) {
|
|
32
32
|
reportError({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTierProofSignature.js","sources":["../../../src/state/bonds/useTierProofSignature.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport
|
|
1
|
+
{"version":3,"file":"useTierProofSignature.js","sources":["../../../src/state/bonds/useTierProofSignature.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { apiPost } from '../../utils/httpClient'\nimport { useSDKConfig } from '../useSDKConfig'\nimport { ChainId } from '@ape.swap/apeswap-lists'\nimport { reportError } from '../../utils/reportError'\nimport useEVMAccount from '../../hooks/accounts/useEVMAccount'\n\nexport default function useTierProofSignature(\n bondAddress?: string,\n chainId?: ChainId,\n isUserRestricted?: boolean,\n): UseQueryResult<string | null> {\n const { address: account } = useEVMAccount()\n const SDKConfig = useSDKConfig()\n const apiAddress = SDKConfig?.urls?.apiV2\n\n return useQuery({\n queryKey: [QUERY_KEYS.TIER_PROOF_SIG, account, bondAddress, chainId, isUserRestricted],\n queryFn: () => getTierProofSig(apiAddress, account!, bondAddress!, chainId!),\n refetchOnWindowFocus: false,\n retry: 1,\n refetchInterval: 1800000, // 30 mins\n enabled: !!bondAddress && !!account && !!apiAddress && !!chainId && SDKConfig.useTiers && !isUserRestricted,\n })\n}\n\nconst getTierProofSig = async (\n apiAddress: string,\n account: string,\n bondAddress: string,\n chainId: ChainId,\n): Promise<string | null> => {\n try {\n const requestBody = {\n user: account, // Use the account as the \"user\" parameter\n bond: bondAddress, // Use the bondAddress\n chainId: chainId, // Use the specified chainId (Polygon)\n }\n\n const response = await apiPost<{ tierProofSignature: string }>(`${apiAddress}/tier-signature`, requestBody)\n return response.tierProofSignature\n } catch (e) {\n reportError({\n apiUrl: apiAddress,\n error: e,\n extraInfo: { type: 'getTierProofSig', bondAddress, e },\n chainId,\n account,\n })\n return null\n }\n}\n"],"names":[],"mappings":";;;;;;;AAQc,SAAU,qBAAqB,CAC3C,WAAoB,EACpB,OAAiB,EACjB,gBAA0B,EAAA;IAE1B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,EAAE;AAC5C,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,IAAA,MAAM,UAAU,GAAG,SAAS,EAAE,IAAI,EAAE,KAAK;AAEzC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,gBAAgB,CAAC;AACtF,QAAA,OAAO,EAAE,MAAM,eAAe,CAAC,UAAU,EAAE,OAAQ,EAAE,WAAY,EAAE,OAAQ,CAAC;AAC5E,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,KAAK,EAAE,CAAC;QACR,eAAe,EAAE,OAAO;QACxB,OAAO,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,IAAI,SAAS,CAAC,QAAQ,IAAI,CAAC,gBAAgB;AAC5G,KAAA,CAAC;AACJ;AAEA,MAAM,eAAe,GAAG,OACtB,UAAkB,EAClB,OAAe,EACf,WAAmB,EACnB,OAAgB,KACU;AAC1B,IAAA,IAAI;AACF,QAAA,MAAM,WAAW,GAAG;YAClB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,OAAO;SACjB;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAiC,CAAA,EAAG,UAAU,CAAA,eAAA,CAAiB,EAAE,WAAW,CAAC;QAC3G,OAAO,QAAQ,CAAC,kBAAkB;IACpC;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,WAAW,CAAC;AACV,YAAA,MAAM,EAAE,UAAU;AAClB,YAAA,KAAK,EAAE,CAAC;YACR,SAAS,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,EAAE;YACtD,OAAO;YACP,OAAO;AACR,SAAA,CAAC;AACF,QAAA,OAAO,IAAI;IACb;AACF,CAAC;;;;"}
|
|
@@ -8,7 +8,7 @@ import useEVMAccount from '../../hooks/accounts/useEVMAccount.js';
|
|
|
8
8
|
import useSOLAccount from '../../hooks/accounts/useSOLAccount.js';
|
|
9
9
|
import useAPTAccount from '../../hooks/accounts/useAPTAccount.js';
|
|
10
10
|
import useSUIAccount from '../../hooks/accounts/useSUIAccount.js';
|
|
11
|
-
import
|
|
11
|
+
import { apiPost } from '../../utils/httpClient.js';
|
|
12
12
|
import { fetchUsersBondsSOL } from './fetchUsersBonds/fetchUsersBondsSOL.js';
|
|
13
13
|
import { fetchUsersBondsAptos } from './fetchUsersBonds/fetchUsersBondsAptos.js';
|
|
14
14
|
import { fetchUsersBondsSUI } from './fetchUsersBonds/fetchUsersBondsSUI.js';
|
|
@@ -84,9 +84,9 @@ const getUserBonds = async (account, solanaAccount, aptosAccount, suiAccount, bo
|
|
|
84
84
|
acc[key].billIds.push(parseInt(data.id));
|
|
85
85
|
return acc;
|
|
86
86
|
}, {}));
|
|
87
|
-
let
|
|
87
|
+
let responseData;
|
|
88
88
|
try {
|
|
89
|
-
|
|
89
|
+
responseData = await apiPost(`${apiUrl}/bills/multi-batch`, body, { timeoutMs: 40000 });
|
|
90
90
|
}
|
|
91
91
|
catch (e) {
|
|
92
92
|
console.error(e);
|
|
@@ -98,7 +98,7 @@ const getUserBonds = async (account, solanaAccount, aptosAccount, suiAccount, bo
|
|
|
98
98
|
const enrichedData = onChainData.map((userBond) => {
|
|
99
99
|
if (userBond.bond?.chainId === ChainId.APTOS || userBond.bond?.chainId === ChainId.SUI)
|
|
100
100
|
return userBond;
|
|
101
|
-
const nftDataResponse =
|
|
101
|
+
const nftDataResponse = responseData?.find((nft) => {
|
|
102
102
|
const contract = nft.contract.toLowerCase();
|
|
103
103
|
const chain = nft.chainId;
|
|
104
104
|
// API uses contractAddress for Solana bonds instead of NFT Address
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUserBonds.js","sources":["../../../src/state/bonds/useUserBonds.ts"],"sourcesContent":["import { QueryClient, useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport useBondsList from './useBondsList'\nimport { UserBill, UserBillNftData } from '../../types/yourbonds'\nimport { SDKProps } from '../useSDKConfig'\nimport useTokenPrices, { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport { reportError } from '../../utils/reportError'\nimport useEVMAccount from '../../hooks/accounts/useEVMAccount'\nimport useSOLAccount from '../../hooks/accounts/useSOLAccount'\nimport useAPTAccount from '../../hooks/accounts/useAPTAccount'\nimport useSUIAccount from '../../hooks/accounts/useSUIAccount'\nimport axios from 'axios'\nimport { fetchUsersBondsSOL } from './fetchUsersBonds/fetchUsersBondsSOL'\nimport { fetchUsersBondsAptos } from './fetchUsersBonds/fetchUsersBondsAptos'\nimport { fetchUsersBondsSUI } from './fetchUsersBonds/fetchUsersBondsSUI'\nimport { fetchUsersBondsEVM } from './fetchUsersBonds/fetchUsersBondsEVM'\n\nexport default function useUserBonds(): UseQueryResult<UserBill[]> {\n // First fetch the full list of bonds\n const { data: bondList } = useBondsList()\n const { address: addressEVM } = useEVMAccount()\n const { publicKey } = useSOLAccount()\n const addressSOL = publicKey?.toBase58()\n const { address: addressAptos } = useAPTAccount()\n const { address: addressSUI } = useSUIAccount()\n const { data: tokenPrices } = useTokenPrices()\n return useQuery({\n queryKey: [\n QUERY_KEYS.USER_BONDS,\n addressEVM,\n addressSOL,\n addressAptos,\n addressSUI,\n Object.keys(tokenPrices ?? {})?.length ?? null,\n ],\n queryFn: ({ client }) => getUserBonds(addressEVM!, addressSOL!, addressAptos!, addressSUI!, bondList!, client),\n enabled: !!bondList && !!(addressEVM || addressSOL || addressAptos || addressSUI) && !!tokenPrices,\n refetchInterval: 120000,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n retry: 1,\n })\n}\n\nexport const getUserBonds = async (\n account: string,\n solanaAccount: string,\n aptosAccount: string,\n suiAccount: string,\n bondList: Record<ChainId, BillsConfig[]>,\n queryClient: QueryClient,\n): Promise<UserBill[]> => {\n const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const apiUrl = urls['apiV2']\n const tokenPrices: Partial<Record<ChainId, TokenPrices[]>> = queryClient?.getQueryData([QUERY_KEYS.TOKEN_PRICES])!\n\n try {\n const results = await Promise.allSettled(\n chains\n .filter((chain: ChainId) => bondList[chain])\n .map((chain: ChainId) => {\n if (chain === ChainId.SOL) {\n return fetchUsersBondsSOL(solanaAccount, bondList[chain], tokenPrices)\n } else if (chain === ChainId.APTOS) {\n return fetchUsersBondsAptos(aptosAccount, bondList[chain], tokenPrices)\n } else if (chain === ChainId.SUI) {\n return fetchUsersBondsSUI(suiAccount, bondList[chain], tokenPrices)\n } else return fetchUsersBondsEVM(chain, account, bondList[chain], tokenPrices)\n }),\n )\n\n // Filter out only fulfilled promises\n const fulfilledResults = results\n .filter((result): result is PromiseFulfilledResult<any> => result.status === 'fulfilled')\n .map((result) => result.value)\n\n const onChainData: UserBill[] = fulfilledResults.flat().flatMap((result) => result.userOwnedBills)\n\n // Prepare body for batch API call\n // api-v2 won't support Aptos/Sui. Bills are read on-chain, no /bills/multi-batch\n // enrichment. Aptos/Sui bills use the placeholder image from their constants.\n const body = Object.values(\n onChainData\n .filter((data) => data?.bond?.chainId !== ChainId.APTOS && data?.bond?.chainId !== ChainId.SUI)\n .reduce(\n (acc, data) => {\n const contract =\n data?.bond?.chainId === ChainId.SOL ? data.bond.contractAddress[data.bond.chainId] : data.billNftAddress\n const key = `${data?.bond?.chainId}-${contract}`\n\n if (!acc[key]) {\n acc[key] = {\n chainId: data?.bond?.chainId as number,\n contract: contract as string,\n billIds: [],\n }\n }\n\n acc[key].billIds.push(parseInt(data.id))\n return acc\n },\n {} as Record<string, { chainId: number; contract: string; billIds: number[] }>,\n ),\n )\n let response\n\n try {\n response = await axios.post(`${apiUrl}/bills/multi-batch`, body, { timeout: 40000 })\n } catch (e) {\n console.error(e)\n return onChainData\n }\n // Enrich on-chain data with API data.\n // Aptos/Sui bills are not sent to api-v2 (no support), so keep their existing\n // nftData populated by fetchBillsUser{Aptos,Sui} instead of overwriting with undefined.\n const enrichedData: UserBill[] = onChainData.map((userBond) => {\n if (userBond.bond?.chainId === ChainId.APTOS || userBond.bond?.chainId === ChainId.SUI) return userBond\n\n const nftDataResponse = response.data?.find((nft: any) => {\n const contract = nft.contract.toLowerCase()\n const chain = nft.chainId\n\n // API uses contractAddress for Solana bonds instead of NFT Address\n const contractToCompare =\n chain === ChainId.SOL ? userBond.bond?.contractAddress[ChainId.SOL] : userBond.billNftAddress\n return contractToCompare?.toLowerCase() === contract && userBond.bond?.chainId === chain\n })\n const nftData: UserBillNftData | undefined = nftDataResponse?.bills?.find(\n (billApiData: UserBillNftData) => billApiData.tokenId === parseInt(userBond.id),\n )\n return {\n ...userBond,\n nftData,\n }\n })\n\n return enrichedData\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getUserBonds', bondList, chains, e },\n account,\n })\n throw new Error('Failed to fetch user bonds')\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useUserBonds.js","sources":["../../../src/state/bonds/useUserBonds.ts"],"sourcesContent":["import { QueryClient, useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { BillsConfig, ChainId } from '@ape.swap/apeswap-lists'\nimport useBondsList from './useBondsList'\nimport { UserBill, UserBillNftData } from '../../types/yourbonds'\nimport { SDKProps } from '../useSDKConfig'\nimport useTokenPrices, { TokenPrices } from '../tokenPrices/useTokenPrices'\nimport { reportError } from '../../utils/reportError'\nimport useEVMAccount from '../../hooks/accounts/useEVMAccount'\nimport useSOLAccount from '../../hooks/accounts/useSOLAccount'\nimport useAPTAccount from '../../hooks/accounts/useAPTAccount'\nimport useSUIAccount from '../../hooks/accounts/useSUIAccount'\nimport { apiPost } from '../../utils/httpClient'\nimport { fetchUsersBondsSOL } from './fetchUsersBonds/fetchUsersBondsSOL'\nimport { fetchUsersBondsAptos } from './fetchUsersBonds/fetchUsersBondsAptos'\nimport { fetchUsersBondsSUI } from './fetchUsersBonds/fetchUsersBondsSUI'\nimport { fetchUsersBondsEVM } from './fetchUsersBonds/fetchUsersBondsEVM'\n\nexport default function useUserBonds(): UseQueryResult<UserBill[]> {\n // First fetch the full list of bonds\n const { data: bondList } = useBondsList()\n const { address: addressEVM } = useEVMAccount()\n const { publicKey } = useSOLAccount()\n const addressSOL = publicKey?.toBase58()\n const { address: addressAptos } = useAPTAccount()\n const { address: addressSUI } = useSUIAccount()\n const { data: tokenPrices } = useTokenPrices()\n return useQuery({\n queryKey: [\n QUERY_KEYS.USER_BONDS,\n addressEVM,\n addressSOL,\n addressAptos,\n addressSUI,\n Object.keys(tokenPrices ?? {})?.length ?? null,\n ],\n queryFn: ({ client }) => getUserBonds(addressEVM!, addressSOL!, addressAptos!, addressSUI!, bondList!, client),\n enabled: !!bondList && !!(addressEVM || addressSOL || addressAptos || addressSUI) && !!tokenPrices,\n refetchInterval: 120000,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n retry: 1,\n })\n}\n\nexport const getUserBonds = async (\n account: string,\n solanaAccount: string,\n aptosAccount: string,\n suiAccount: string,\n bondList: Record<ChainId, BillsConfig[]>,\n queryClient: QueryClient,\n): Promise<UserBill[]> => {\n const { chains, urls } = queryClient?.getQueryData([QUERY_KEYS.SDK_CONFIG]) as SDKProps\n const apiUrl = urls['apiV2']\n const tokenPrices: Partial<Record<ChainId, TokenPrices[]>> = queryClient?.getQueryData([QUERY_KEYS.TOKEN_PRICES])!\n\n try {\n const results = await Promise.allSettled(\n chains\n .filter((chain: ChainId) => bondList[chain])\n .map((chain: ChainId) => {\n if (chain === ChainId.SOL) {\n return fetchUsersBondsSOL(solanaAccount, bondList[chain], tokenPrices)\n } else if (chain === ChainId.APTOS) {\n return fetchUsersBondsAptos(aptosAccount, bondList[chain], tokenPrices)\n } else if (chain === ChainId.SUI) {\n return fetchUsersBondsSUI(suiAccount, bondList[chain], tokenPrices)\n } else return fetchUsersBondsEVM(chain, account, bondList[chain], tokenPrices)\n }),\n )\n\n // Filter out only fulfilled promises\n const fulfilledResults = results\n .filter((result): result is PromiseFulfilledResult<any> => result.status === 'fulfilled')\n .map((result) => result.value)\n\n const onChainData: UserBill[] = fulfilledResults.flat().flatMap((result) => result.userOwnedBills)\n\n // Prepare body for batch API call\n // api-v2 won't support Aptos/Sui. Bills are read on-chain, no /bills/multi-batch\n // enrichment. Aptos/Sui bills use the placeholder image from their constants.\n const body = Object.values(\n onChainData\n .filter((data) => data?.bond?.chainId !== ChainId.APTOS && data?.bond?.chainId !== ChainId.SUI)\n .reduce(\n (acc, data) => {\n const contract =\n data?.bond?.chainId === ChainId.SOL ? data.bond.contractAddress[data.bond.chainId] : data.billNftAddress\n const key = `${data?.bond?.chainId}-${contract}`\n\n if (!acc[key]) {\n acc[key] = {\n chainId: data?.bond?.chainId as number,\n contract: contract as string,\n billIds: [],\n }\n }\n\n acc[key].billIds.push(parseInt(data.id))\n return acc\n },\n {} as Record<string, { chainId: number; contract: string; billIds: number[] }>,\n ),\n )\n let responseData\n\n try {\n responseData = await apiPost<any[]>(`${apiUrl}/bills/multi-batch`, body, { timeoutMs: 40000 })\n } catch (e) {\n console.error(e)\n return onChainData\n }\n // Enrich on-chain data with API data.\n // Aptos/Sui bills are not sent to api-v2 (no support), so keep their existing\n // nftData populated by fetchBillsUser{Aptos,Sui} instead of overwriting with undefined.\n const enrichedData: UserBill[] = onChainData.map((userBond) => {\n if (userBond.bond?.chainId === ChainId.APTOS || userBond.bond?.chainId === ChainId.SUI) return userBond\n\n const nftDataResponse = responseData?.find((nft: any) => {\n const contract = nft.contract.toLowerCase()\n const chain = nft.chainId\n\n // API uses contractAddress for Solana bonds instead of NFT Address\n const contractToCompare =\n chain === ChainId.SOL ? userBond.bond?.contractAddress[ChainId.SOL] : userBond.billNftAddress\n return contractToCompare?.toLowerCase() === contract && userBond.bond?.chainId === chain\n })\n const nftData: UserBillNftData | undefined = nftDataResponse?.bills?.find(\n (billApiData: UserBillNftData) => billApiData.tokenId === parseInt(userBond.id),\n )\n return {\n ...userBond,\n nftData,\n }\n })\n\n return enrichedData\n } catch (e) {\n console.error(e)\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getUserBonds', bondList, chains, e },\n account,\n })\n throw new Error('Failed to fetch user bonds')\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useQuery } from '@tanstack/react-query';
|
|
2
2
|
import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
|
|
3
|
-
import
|
|
3
|
+
import { apiGet } from '../../utils/httpClient.js';
|
|
4
4
|
import { STRAPI_URL } from '../../config/constants/variables.js';
|
|
5
5
|
import { reportError } from '../../utils/reportError.js';
|
|
6
6
|
import { useSDKConfig, useURLByEnvironment } from '../useSDKConfig.js';
|
|
@@ -36,8 +36,8 @@ function useHotBonds() {
|
|
|
36
36
|
}
|
|
37
37
|
const getHotBondsContracts = async (apiUrl) => {
|
|
38
38
|
try {
|
|
39
|
-
const response = await
|
|
40
|
-
return response.
|
|
39
|
+
const response = await apiGet(`${STRAPI_URL}/hot-bonds`);
|
|
40
|
+
return response.map((bond) => bond.BondAddress.toLowerCase());
|
|
41
41
|
}
|
|
42
42
|
catch (e) {
|
|
43
43
|
reportError({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useHotBonds.js","sources":["../../../src/state/hotBonds/useHotBonds.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport
|
|
1
|
+
{"version":3,"file":"useHotBonds.js","sources":["../../../src/state/hotBonds/useHotBonds.ts"],"sourcesContent":["import { useQuery, UseQueryResult } from '@tanstack/react-query'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { apiGet } from '../../utils/httpClient'\nimport { BondsData } from '../../types/bonds'\nimport { STRAPI_URL } from '../../config/constants/variables'\nimport { reportError } from '../../utils/reportError'\nimport { useSDKConfig, useURLByEnvironment } from '../useSDKConfig'\nimport useBondsData from '../bonds/useBondsData'\nimport { findHighestTrueBondPrice } from '../../utils/bondPriceHelpers'\nimport { TIERS_WEIGHT } from '../tiers/useTierPoints'\nimport { LaunchBondTiers } from '@ape.swap/apeswap-lists'\nimport { isBondSoldOut } from '../../views/Bonds/utils'\n\nexport function useHotBondContracts() {\n const apiUrl = useURLByEnvironment('apiV2')\n return useQuery({\n queryKey: [QUERY_KEYS.HOT_BONDS_CONTRACTS],\n queryFn: () => getHotBondsContracts(apiUrl),\n staleTime: Infinity,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n retry: 1,\n })\n}\n\nexport default function useHotBonds(): UseQueryResult<BondsData[]> {\n const { showLowValueBonds } = useSDKConfig()\n const { data: bondsData } = useBondsData()\n const { data: hotBondContracts } = useHotBondContracts()\n return useQuery({\n queryKey: [QUERY_KEYS.HOT_BONDS, bondsData?.length, hotBondContracts?.length, showLowValueBonds],\n queryFn: () => getHotBonds(bondsData!, hotBondContracts!, showLowValueBonds),\n refetchOnWindowFocus: false,\n refetchInterval: 30000,\n enabled: !!bondsData && bondsData.length > 0 && !!hotBondContracts && hotBondContracts.length > 0,\n retry: 0,\n })\n}\n\nconst getHotBondsContracts = async (apiUrl: string): Promise<string[]> => {\n try {\n const response = await apiGet<{ BondAddress: string }[]>(`${STRAPI_URL}/hot-bonds`)\n return response.map((bond) => bond.BondAddress.toLowerCase())\n } catch (e) {\n reportError({\n apiUrl,\n error: e,\n extraInfo: { type: 'getHotBondsContracts', e },\n })\n return []\n }\n}\n\nconst getHotBonds = async (\n bondsData: BondsData[],\n hotBondContracts: string[],\n showLowValueBonds: boolean,\n): Promise<BondsData[]> => {\n const sortAndFilterBonds = (bonds: BondsData[]) =>\n bonds\n ?.sort(\n (a, b) =>\n (findHighestTrueBondPrice(TIERS_WEIGHT[LaunchBondTiers.Legend], b?.trueBondPrices)?.bonus ?? 0) -\n (findHighestTrueBondPrice(TIERS_WEIGHT[LaunchBondTiers.Legend], a?.trueBondPrices)?.bonus ?? 0),\n )\n ?.filter((bond) => {\n const bonus = findHighestTrueBondPrice(TIERS_WEIGHT[LaunchBondTiers.Legend], bond?.trueBondPrices)?.bonus\n return bonus && bonus > 0 && bonus < 50\n })\n\n const hotBonds = bondsData.filter(\n (bond) =>\n hotBondContracts.includes(bond?.contractAddress?.[bond?.chainId]?.toLowerCase() ?? '') &&\n !isBondSoldOut(bond, showLowValueBonds),\n )\n\n const filteredHotBonds = sortAndFilterBonds(hotBonds) ?? []\n const filteredBondsData =\n sortAndFilterBonds(bondsData.filter((bond) => !isBondSoldOut(bond, showLowValueBonds))) ?? []\n\n return [...filteredHotBonds, ...filteredBondsData].slice(0, 3)\n}\n"],"names":[],"mappings":";;;;;;;;;;;;SAagB,mBAAmB,GAAA;AACjC,IAAA,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC;AAC3C,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC;AAC1C,QAAA,OAAO,EAAE,MAAM,oBAAoB,CAAC,MAAM,CAAC;AAC3C,QAAA,SAAS,EAAE,QAAQ;AACnB,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,cAAc,EAAE,KAAK;AACrB,QAAA,KAAK,EAAE,CAAC;AACT,KAAA,CAAC;AACJ;AAEc,SAAU,WAAW,GAAA;AACjC,IAAA,MAAM,EAAE,iBAAiB,EAAE,GAAG,YAAY,EAAE;IAC5C,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,YAAY,EAAE;IAC1C,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,EAAE;AACxD,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,CAAC;QAChG,OAAO,EAAE,MAAM,WAAW,CAAC,SAAU,EAAE,gBAAiB,EAAE,iBAAiB,CAAC;AAC5E,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,eAAe,EAAE,KAAK;AACtB,QAAA,OAAO,EAAE,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC;AACjG,QAAA,KAAK,EAAE,CAAC;AACT,KAAA,CAAC;AACJ;AAEA,MAAM,oBAAoB,GAAG,OAAO,MAAc,KAAuB;AACvE,IAAA,IAAI;QACF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAA4B,CAAA,EAAG,UAAU,CAAA,UAAA,CAAY,CAAC;AACnF,QAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;IAC/D;IAAE,OAAO,CAAC,EAAE;AACV,QAAA,WAAW,CAAC;YACV,MAAM;AACN,YAAA,KAAK,EAAE,CAAC;AACR,YAAA,SAAS,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,EAAE;AAC/C,SAAA,CAAC;AACF,QAAA,OAAO,EAAE;IACX;AACF,CAAC;AAED,MAAM,WAAW,GAAG,OAClB,SAAsB,EACtB,gBAA0B,EAC1B,iBAA0B,KACF;AACxB,IAAA,MAAM,kBAAkB,GAAG,CAAC,KAAkB,KAC5C;UACI,IAAI,CACJ,CAAC,CAAC,EAAE,CAAC,KACH,CAAC,wBAAwB,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;AAC9F,SAAC,wBAAwB,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;AAEnG,UAAE,MAAM,CAAC,CAAC,IAAI,KAAI;AAChB,QAAA,MAAM,KAAK,GAAG,wBAAwB,CAAC,YAAY,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,KAAK;QACzG,OAAO,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;AACzC,IAAA,CAAC,CAAC;AAEN,IAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAC/B,CAAC,IAAI,KACH,gBAAgB,CAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACtF,QAAA,CAAC,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAC1C;IAED,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,EAAE;IAC3D,MAAM,iBAAiB,GACrB,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE;AAE/F,IAAA,OAAO,CAAC,GAAG,gBAAgB,EAAE,GAAG,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAChE,CAAC;;;;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useQuery } from '@tanstack/react-query';
|
|
2
|
-
import
|
|
2
|
+
import { apiGet } from '../../utils/httpClient.js';
|
|
3
3
|
import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
|
|
4
4
|
import { useURLByEnvironment, useSDKConfig } from '../useSDKConfig.js';
|
|
5
5
|
|
|
6
6
|
const getBondRecommendations = async (apiV2URL, user, contract, limit, chains) => {
|
|
7
|
-
const
|
|
7
|
+
const data = await apiGet(`${apiV2URL}/recommendations/bonds?user=${user}&contract=${contract}&limit=${limit}&chains=${chains}`);
|
|
8
8
|
return data?.bonds;
|
|
9
9
|
};
|
|
10
10
|
function useGetBondRecommendations(user, contract, limit = '3') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGetBondRecommendations.js","sources":["../../../src/state/recommendations/useGetBondRecommendations.ts"],"sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport
|
|
1
|
+
{"version":3,"file":"useGetBondRecommendations.js","sources":["../../../src/state/recommendations/useGetBondRecommendations.ts"],"sourcesContent":["import { useQuery } from '@tanstack/react-query'\nimport { apiGet } from '../../utils/httpClient'\nimport { QUERY_KEYS } from '../../config/constants/queryKeys'\nimport { useSDKConfig, useURLByEnvironment } from '../useSDKConfig'\n\nexport interface BondRecommendation {\n chainId: number\n type: string\n principalToken: string\n principalTokenName: string\n payoutToken: string\n payoutTokenName: string\n billAddress: string\n discount: number\n bonus: number\n link: string\n billNftAddress: string\n initTime: number\n soldOut: boolean\n hide: boolean\n maxTotalPayout: number\n totalPayoutGiven: number\n tokensRemaining: number\n showcaseToken: string\n showcaseTokenName: string\n vestingTerm: number\n earnTokenPrice: number\n priceUsd: number\n tags: string[]\n arr: number\n}\n\nconst getBondRecommendations = async (\n apiV2URL: string,\n user?: string,\n contract?: string,\n limit?: string,\n chains?: number[],\n): Promise<BondRecommendation[]> => {\n const data = await apiGet<{ bonds: BondRecommendation[] }>(\n `${apiV2URL}/recommendations/bonds?user=${user}&contract=${contract}&limit=${limit}&chains=${chains}`,\n )\n return data?.bonds\n}\n\nexport default function useGetBondRecommendations(user?: string, contract?: string, limit: string = '3') {\n const apiV2URL = useURLByEnvironment('apiV2')\n const SDKConfig = useSDKConfig()\n return useQuery({\n queryKey: [`${QUERY_KEYS.BOND_RECOMMENDATIONS}-${contract}-${limit}-${SDKConfig.chains}`],\n queryFn: () => getBondRecommendations(apiV2URL, user, contract, limit, SDKConfig.chains),\n staleTime: Infinity,\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n })\n}\n"],"names":[],"mappings":";;;;;AAgCA,MAAM,sBAAsB,GAAG,OAC7B,QAAgB,EAChB,IAAa,EACb,QAAiB,EACjB,KAAc,EACd,MAAiB,KACgB;AACjC,IAAA,MAAM,IAAI,GAAG,MAAM,MAAM,CACvB,GAAG,QAAQ,CAAA,4BAAA,EAA+B,IAAI,CAAA,UAAA,EAAa,QAAQ,CAAA,OAAA,EAAU,KAAK,WAAW,MAAM,CAAA,CAAE,CACtG;IACD,OAAO,IAAI,EAAE,KAAK;AACpB,CAAC;AAEa,SAAU,yBAAyB,CAAC,IAAa,EAAE,QAAiB,EAAE,KAAA,GAAgB,GAAG,EAAA;AACrG,IAAA,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC;AAC7C,IAAA,MAAM,SAAS,GAAG,YAAY,EAAE;AAChC,IAAA,OAAO,QAAQ,CAAC;AACd,QAAA,QAAQ,EAAE,CAAC,CAAA,EAAG,UAAU,CAAC,oBAAoB,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,SAAS,CAAC,MAAM,EAAE,CAAC;AACzF,QAAA,OAAO,EAAE,MAAM,sBAAsB,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;AACxF,QAAA,SAAS,EAAE,QAAQ;AACnB,QAAA,oBAAoB,EAAE,KAAK;AAC3B,QAAA,cAAc,EAAE,KAAK;AACtB,KAAA,CAAC;AACJ;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useQuery } from '@tanstack/react-query';
|
|
2
|
-
import
|
|
2
|
+
import { apiGet } from '../../utils/httpClient.js';
|
|
3
3
|
import { QUERY_KEYS } from '../../config/constants/queryKeys.js';
|
|
4
4
|
import { useSDKConfig } from '../useSDKConfig.js';
|
|
5
5
|
import { reportError } from '../../utils/reportError.js';
|
|
@@ -18,8 +18,7 @@ function useTokenPrices() {
|
|
|
18
18
|
}
|
|
19
19
|
const getTokenPrices = async (apiv2) => {
|
|
20
20
|
try {
|
|
21
|
-
|
|
22
|
-
return response.data;
|
|
21
|
+
return await apiGet(`${PRICE_API_URL}/realtime/prices`);
|
|
23
22
|
}
|
|
24
23
|
catch (error) {
|
|
25
24
|
reportError({
|