UNPKG

@augustdigital/vaults

Version:

JS SDK for web3 interactions with the August Digital Lending Pools

615 lines 33.2 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getVault = getVault; exports.getVaultLoans = getVaultLoans; exports.getVaultAllocations = getVaultAllocations; exports.getVaultAvailableRedemptions = getVaultAvailableRedemptions; exports.getVaultRedemptionHistory = getVaultRedemptionHistory; exports.getVaultPositions = getVaultPositions; exports.getVaultApy = getVaultApy; exports.getRewardsStakingPositions = getRewardsStakingPositions; const abis_1 = require("@augustdigital/abis"); const utils_1 = require("@augustdigital/utils"); const ethers_1 = require("ethers"); const services_1 = require("@augustdigital/services"); const utils_2 = require("./utils"); function getVault(_a) { return __awaiter(this, arguments, void 0, function* ({ vault, loans = false, allocations = false, options, }) { var _b; const provider = (0, utils_1.createProvider)(options.rpcUrl); let returnedVault; try { if ((0, ethers_1.isAddress)(vault)) { const tokenizedVault = (_b = (yield (0, utils_1.fetchTokenizedVaults)(vault))) === null || _b === void 0 ? void 0 : _b[0]; if (tokenizedVault.status === 'closed' && tokenizedVault.is_visible === false) { console.log('#getVault::closed:', tokenizedVault.vault_name); return null; } const vaultContract = (0, utils_1.createContract)({ address: vault, abi: abis_1.ABI_LENDING_POOL_V2, provider, }); const vaultContractCalls = yield Promise.all(utils_2.POOL_FUNCTIONS.map((f) => { if (f === 'symbol') { return (0, utils_1.getSymbol)(provider, vault); } if (f === 'decimals') { return (0, utils_1.getDecimals)(provider, vault); } return vaultContract[f](); })); const formattedContractCalls = vaultContractCalls.reduce((acc, curr, i) => { let val; if (utils_2.POOL_FUNCTIONS[i] === 'totalSupply' || utils_2.POOL_FUNCTIONS[i] === 'totalAssets' || utils_2.POOL_FUNCTIONS[i] === 'globalLoansAmount' || utils_2.POOL_FUNCTIONS[i] === 'maxSupply') { val = (0, utils_1.toNormalizedBn)(curr, vaultContractCalls[0]); } else if (utils_2.POOL_FUNCTIONS[i] === 'getTotalLoansDeployed') { val = (0, utils_1.toNormalizedBn)(curr, 0); } else if (utils_2.POOL_FUNCTIONS[i] === 'withdrawalFee') { val = (0, utils_1.toNormalizedBn)(curr, 2); } else if (utils_2.POOL_FUNCTIONS[i] === 'decimals') { val = Number(curr.toString()); } else if (utils_2.POOL_FUNCTIONS[i] === 'loansOperator') { val = '0x4DCb388488622e47683EAd1a147947140a31e485'; } else { val = curr; } return Object.assign(Object.assign({}, acc), { [utils_2.POOL_FUNCTIONS[i]]: val }); }, {}); const returnObj = yield (0, utils_2.buildFormattedVault)(provider, tokenizedVault, formattedContractCalls); returnedVault = returnObj; } } catch (err) { console.error(`#getVault::${vault}:`, err); throw new Error(`#getVault::${vault}:${err === null || err === void 0 ? void 0 : err.message}`); } if (loans) { try { returnedVault = Object.assign(Object.assign({}, returnedVault), { loans: yield getVaultLoans(returnedVault, options) }); } catch (e) { console.error(`getVault::${returnedVault.symbol}:`, e === null || e === void 0 ? void 0 : e.message); } } if (allocations) { try { returnedVault = Object.assign(Object.assign({}, returnedVault), { allocations: yield getVaultAllocations(vault, options) }); } catch (e) { console.error(`getVault::${returnedVault.symbol}:`, e === null || e === void 0 ? void 0 : e.message); } } return returnedVault; }); } function getVaultLoans(vault, options) { return __awaiter(this, void 0, void 0, function* () { var _a, _b; const vaultAddress = typeof vault === 'string' ? vault : vault.address; const isOldLendingPool = utils_1.OLD_LENDING_POOLS.includes(vaultAddress); if (!isOldLendingPool) return []; try { let poolTotalSupply; let poolDecimals; const tokenizedVault = (_a = (yield (0, utils_1.fetchTokenizedVaults)(vaultAddress))) === null || _a === void 0 ? void 0 : _a[0]; const chainId = (options === null || options === void 0 ? void 0 : options.chainId) || (tokenizedVault === null || tokenizedVault === void 0 ? void 0 : tokenizedVault.chain); const provider = (0, utils_1.createProvider)(options.rpcUrl); const tokenizedVaultLoans = yield (0, utils_1.fetchTokenizedVaultLoans)(vaultAddress, chainId); if (typeof vault === 'string') { const poolContract = (0, utils_1.createContract)({ provider, address: vaultAddress, abi: abis_1.ABI_LENDING_POOL_V2, }); [poolTotalSupply, poolDecimals] = yield Promise.all([ poolContract.totalSupply(), (0, utils_1.getDecimals)(provider, vaultAddress), ]); poolTotalSupply = BigInt(poolTotalSupply).toString(); poolDecimals = Number(poolDecimals); } else { poolTotalSupply = vault.totalSupply.raw; poolDecimals = vault.decimals; } const newLoans = (yield Promise.all((_b = (Array.isArray(tokenizedVaultLoans) ? tokenizedVaultLoans : [])) === null || _b === void 0 ? void 0 : _b.map((l) => __awaiter(this, void 0, void 0, function* () { const borrower = l.borrower; const allocation = l.principal_amount / Number((0, ethers_1.formatUnits)(poolTotalSupply, poolDecimals)); const loanFeeRate = yield (0, utils_1.getLoanOracleFeeRate)(provider, 'LOAN.REPAY.INTERESTS', l.address, chainId); const loanApr = Number(l.apr || 0) / 100; const loanAprAfterFees = loanApr * (1 - loanFeeRate / 100); const isIdleCapital = utils_1.IDLE_CAPITAL_BORROWER_ADDRESS.includes(borrower); const newLoanObj = { vault: vaultAddress, address: l.address, lender: l.lender, borrower: l.borrower, state: l.state, totalRepaid: l.total_repaid, principalToken: l.principal_token, principalAmount: l.principal_amount, interestAmount: l.interest_amount, upcomingPayment: { amount: l.upcoming_payment.amount, dueDate: l.upcoming_payment.due_date, }, apr: loanAprAfterFees, initialPrincipalAmount: l.initial_principal_amount, deployedDate: l.deployed_date, isIdleCapital, paymentInterval: l.payment_interval, allocation, }; return newLoanObj; })))).filter((l) => l !== undefined); return newLoans; } catch (e) { console.error('#getVaultLoans:', e); throw new Error(`#getVaultLoans::${vault}:${e === null || e === void 0 ? void 0 : e.message}`); } }); } function getVaultAllocations(vault, options) { return __awaiter(this, void 0, void 0, function* () { var _a; let protocolExposure = []; let tokenExposure = []; let cefiExposure = []; let cefiBorrowerResponses = {}; let otcPositions = {}; let defiPerBorrower = {}; let exposurePerCategory = { supplying: [], borrowing: [], wallet: [], walletBalance: 0, cefiBalance: 0, defiBalance: 0, lending: [], loanBalance: 0 }; let netValue = { value: 0 }; let uniqueBorrowers; const isOldLendingPool = utils_1.OLD_LENDING_POOLS.includes(vault); const tokenizedVault = (_a = (yield (0, utils_1.fetchTokenizedVaults)(vault))) === null || _a === void 0 ? void 0 : _a[0]; try { if (isOldLendingPool) { const loans = yield getVaultLoans(vault, options); uniqueBorrowers = [...new Set(loans.map((l) => l.borrower))]; } else { uniqueBorrowers = tokenizedVault.subaccounts.map((s) => s.address); } } catch (e) { console.error('#getVaultAllocations::borrowers:', e); } for (const borrower of uniqueBorrowers) { if (vault === "0x828BC5895b78b2fb591018Ca5bDC2064742D6D0f") { const loans = yield (0, utils_1.fetchAugustWithKey)(options.augustKey, utils_1.WEBSERVER_ENDPOINTS.subaccount.loans(borrower)); if (loans.status === 200) { const loansRes = (yield loans.json()); exposurePerCategory.lending = loansRes; exposurePerCategory.loanBalance = loansRes.reduce((sum, item) => sum + item.principal_amount, 0); } } try { const debankRes = yield (0, utils_1.fetchDebankResponse)(borrower); (0, utils_1.parseVaultLevelDebank)(debankRes, protocolExposure, tokenExposure, borrower, exposurePerCategory, netValue); const debankPerLoan = (0, utils_1.parseLoanLevelDebank)(debankRes); defiPerBorrower[borrower] = debankPerLoan; } catch (e) { console.error('#getVaultAllocations::debank:', e); } try { const cefiResponse = yield (0, utils_1.fetchAugustWithKey)(options.augustKey, utils_1.WEBSERVER_ENDPOINTS.subaccount.cefi(borrower)); if (cefiResponse.status !== 200) { console.error('#getVaultAllocations::cefi:', cefiResponse.status, cefiResponse.statusText); } if (cefiResponse.status === 200) { const cefiRes = (yield cefiResponse.json()); cefiBorrowerResponses[borrower] = cefiRes; cefiExposure = cefiRes; } } catch (e) { console.error('#getVaultAllocations::cefi:', e); } try { const otcResponse = yield (0, utils_1.fetchAugustWithKey)(options.augustKey, utils_1.WEBSERVER_ENDPOINTS.subaccount.otc_positions(borrower)); if (otcResponse.status !== 200) { console.error('#getVaultAllocations::otc:', otcResponse.status, otcResponse.statusText); } if (otcResponse.status === 200) { const otcRes = (yield otcResponse.json()); otcPositions[borrower] = otcRes; } } catch (e) { console.error('#getVaultAllocations::otc:', e); } } const walletBalance = exposurePerCategory.wallet.reduce((sum, item) => sum + item.amount, 0); const defiBalance = protocolExposure.reduce((sum, item) => sum + item.netUsdValue, 0); const cefiBalance = cefiExposure.reduce((sum, item) => sum + item.value, 0); exposurePerCategory.walletBalance = walletBalance; exposurePerCategory.defiBalance = defiBalance; exposurePerCategory.cefiBalance = cefiBalance; netValue.value += cefiBalance; return { defi: protocolExposure, cefi: cefiExposure, otc: otcPositions, tokens: tokenExposure, defiPerBorrower, exposurePerCategory, netValue: netValue.value }; }); } function getVaultAvailableRedemptions(_a) { return __awaiter(this, arguments, void 0, function* ({ vault, wallet, options, }) { var _b, _c, _d; try { const provider = (0, utils_1.createProvider)(options.rpcUrl); const tokenizedVault = (_b = (yield (0, utils_1.fetchTokenizedVaults)(vault))) === null || _b === void 0 ? void 0 : _b[0]; if (!tokenizedVault) { return { availableRedemptions: [], pendingRedemptions: [] }; } const poolContract = (0, utils_1.createContract)({ address: vault, abi: abis_1.ABI_LENDING_POOL_V2, provider, }); const { withdrawalRequesteds, withdrawalProcesseds } = yield (0, services_1.getSubgraphAllWithdrawals)(vault, provider); const decimals = yield (0, utils_1.getDecimals)(provider, vault); const availableRedemptions = []; const pendingRedemptions = []; for (const ev of withdrawalRequesteds) { if (!ev || typeof ev !== 'object') { console.warn('#getVaultAvailableRedemptions: Skipping invalid event:', ev); continue; } if (!ev.year || !ev.month || !ev.day || !ev.receiverAddr) { console.warn('#getVaultAvailableRedemptions: Skipping event with missing required properties:', ev); continue; } const fullDate = new Date(Number(ev.year), Number(ev.month) - 1, Number(ev.day)); const foundRedemptionAgainstClaim = withdrawalProcesseds.find((h) => new Date(h.processedOn).toDateString() === fullDate.toDateString() && h.receiverAddr === ev.receiverAddr); if (wallet) { if (((_c = ev === null || ev === void 0 ? void 0 : ev.receiverAddr) === null || _c === void 0 ? void 0 : _c.toLowerCase()) === wallet.toLowerCase()) { const alreadyRedeemed = availableRedemptions.find((red) => BigInt(red.day.raw) === BigInt(ev.day) && BigInt(red.month.raw) === BigInt(ev.month) && BigInt(red.year.raw) === BigInt(ev.year)); if (!(foundRedemptionAgainstClaim && alreadyRedeemed)) { try { const trueClaimableAmount = yield ((_d = poolContract === null || poolContract === void 0 ? void 0 : poolContract.getClaimableAmountByReceiver) === null || _d === void 0 ? void 0 : _d.call(poolContract, BigInt(ev.year), BigInt(ev.month), BigInt(ev.day), (0, ethers_1.getAddress)(wallet))); if (trueClaimableAmount > BigInt(0)) { availableRedemptions.push({ id: ev.transactionHash_ || ev.id, hash: ev.transactionHash_ || ev.id, timestamp: Number(ev.timestamp_), receiver: ev.receiverAddr, day: (0, utils_1.toNormalizedBn)(ev.day, 0), month: (0, utils_1.toNormalizedBn)(ev.month, 0), year: (0, utils_1.toNormalizedBn)(ev.year, 0), amount: (0, utils_1.toNormalizedBn)(trueClaimableAmount, decimals), date: fullDate, vault, }); } pendingRedemptions.push({ id: ev.transactionHash_ || ev.id, hash: ev.transactionHash_ || ev.id, timestamp: Number(ev.timestamp_), receiver: ev.receiverAddr, day: (0, utils_1.toNormalizedBn)(ev.day, 0), month: (0, utils_1.toNormalizedBn)(ev.month, 0), year: (0, utils_1.toNormalizedBn)(ev.year, 0), amount: (0, utils_1.toNormalizedBn)(trueClaimableAmount || BigInt(0), decimals), date: fullDate, vault, }); } catch (contractError) { console.error('#getVaultAvailableRedemptions: Contract call failed:', contractError); pendingRedemptions.push({ id: ev.transactionHash_ || ev.id, hash: ev.transactionHash_ || ev.id, timestamp: Number(ev.timestamp_), receiver: ev.receiverAddr, day: (0, utils_1.toNormalizedBn)(ev.day, 0), month: (0, utils_1.toNormalizedBn)(ev.month, 0), year: (0, utils_1.toNormalizedBn)(ev.year, 0), amount: (0, utils_1.toNormalizedBn)(BigInt(0), decimals), date: fullDate, vault, }); } } } } else { if (!!foundRedemptionAgainstClaim) { availableRedemptions.push({ id: ev.transactionHash_ || ev.id, hash: ev.transactionHash_ || ev.id, timestamp: Number(ev.timestamp_), receiver: ev.receiverAddr, day: (0, utils_1.toNormalizedBn)(ev.day, 0), month: (0, utils_1.toNormalizedBn)(ev.month, 0), year: (0, utils_1.toNormalizedBn)(ev.year, 0), amount: (0, utils_1.toNormalizedBn)(ev.assets || BigInt(0), decimals), date: fullDate, vault, }); } } } if (options.env === 'DEV') console.log('#getVaultAvailableRedemptions:', availableRedemptions.slice(0, 3)); return { availableRedemptions, pendingRedemptions }; } catch (e) { console.error('#getVaultAvailableRedemptions:', e); return { availableRedemptions: [], pendingRedemptions: [] }; } }); } function getVaultRedemptionHistory(_a) { return __awaiter(this, arguments, void 0, function* ({ vault, wallet, options, }) { var _b; try { const provider = (0, utils_1.createProvider)(options.rpcUrl); const tokenizedVault = (_b = (yield (0, utils_1.fetchTokenizedVaults)(vault))) === null || _b === void 0 ? void 0 : _b[0]; if (!tokenizedVault) { return []; } const chainId = tokenizedVault.chain; const poolContract = (0, utils_1.createContract)({ address: vault, abi: abis_1.ABI_LENDING_POOL_V2, provider, }); let logPromises = []; const currentBlock = yield provider.getBlockNumber(); let startingBlock = currentBlock - (0, utils_2.determineBlockSkipInternal)(chainId); let endBlock = currentBlock; const cutoffBlock = currentBlock - (0, utils_2.determineBlockCutoff)(chainId); while (endBlock >= cutoffBlock) { const logBloomsPromises = poolContract.queryFilter('WithdrawalProcessed', BigInt(startingBlock), BigInt(endBlock)); logPromises.push(logBloomsPromises); startingBlock -= (0, utils_2.determineBlockSkipInternal)(chainId); endBlock -= (0, utils_2.determineBlockSkipInternal)(chainId); } const logs = (yield Promise.all(logPromises.flat())).flat(); const iface = new ethers_1.ethers.Interface([ 'event WithdrawalProcessed (uint256 assetsAmount, uint256 processedOn, address receiverAddr, uint256 requestedOn)', ]); const events = logs.map((log) => iface.parseLog(log)); const decimals = yield (0, utils_1.getDecimals)(provider, vault); const redemptions = []; events === null || events === void 0 ? void 0 : events.forEach((ev) => { var _a; if (!(ev === null || ev === void 0 ? void 0 : ev.args)) return; const [assetsAmount, processedOn, receiverAddr, requestedOn] = ev.args; if (wallet) { if (((_a = String(receiverAddr)) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === wallet.toLowerCase()) { redemptions.push({ receiver: receiverAddr, amount: (0, utils_1.toNormalizedBn)(assetsAmount, decimals), processed: new Date(Number(processedOn) * 1000), requested: new Date(Number(requestedOn) * 1000), vault, }); } } else { redemptions.push({ receiver: receiverAddr, amount: (0, utils_1.toNormalizedBn)(assetsAmount, decimals), processed: new Date(Number(processedOn) * 1000), requested: new Date(Number(requestedOn) * 1000), vault, }); } }); if (options.env === 'DEV') console.log('#getVaultRedemptionHistory:', redemptions.slice(0, 3)); return redemptions; } catch (e) { console.error('#getVaultRedemptionHistory:', e); return []; } }); } function getVaultPositions(_a) { return __awaiter(this, arguments, void 0, function* ({ vault, wallet, options, }) { try { const tokenizedVaults = yield (0, utils_1.fetchTokenizedVaults)(vault ? vault : undefined); if (!tokenizedVaults || tokenizedVaults.length === 0) { return []; } const promises = yield Promise.all(tokenizedVaults.map((v) => __awaiter(this, void 0, void 0, function* () { try { const provider = (0, utils_1.createProvider)(options.rpcUrl); const decimals = yield (0, utils_1.getDecimals)(provider, vault); const poolContract = (0, utils_1.createContract)({ provider, abi: abis_1.ABI_LENDING_POOL_V2, address: v.address, }); const bal = yield poolContract.balanceOf(wallet); const balance = (0, utils_1.toNormalizedBn)(bal || 0, decimals); const { availableRedemptions, pendingRedemptions } = yield getVaultAvailableRedemptions({ vault: v.address, wallet, options, }); function renderStatus() { if (availableRedemptions === null || availableRedemptions === void 0 ? void 0 : availableRedemptions.length) return 'REDEEM'; if (BigInt(balance.raw) > BigInt(0)) return 'STAKED'; return 'PENDING'; } const aggregateAvailableRedemptions = availableRedemptions === null || availableRedemptions === void 0 ? void 0 : availableRedemptions.reduce((acc, curr) => acc + BigInt(curr.amount.raw), BigInt(0)); return { vault, status: renderStatus(), availableRedemptions, pendingRedemptions, redeemable: (0, utils_1.toNormalizedBn)(aggregateAvailableRedemptions, decimals), walletBalance: balance, }; } catch (vaultError) { console.error(`#getVaultPositions: Error processing vault ${v.address}:`, vaultError); return { vault, status: 'PENDING', availableRedemptions: [], pendingRedemptions: [], redeemable: (0, utils_1.toNormalizedBn)(BigInt(0), 18), walletBalance: (0, utils_1.toNormalizedBn)(BigInt(0), 18), }; } }))); return promises.flat(); } catch (e) { console.error('#getVaultPositions:', e); throw new Error(`#getVaultPositions::${vault}:${e === null || e === void 0 ? void 0 : e.message}`); } }); } function getVaultApy(_a) { return __awaiter(this, arguments, void 0, function* ({ vault }) { var _b, _c; try { const tokenizedVault = (_b = (yield (0, utils_1.fetchTokenizedVaults)(vault))) === null || _b === void 0 ? void 0 : _b[0]; return ((_c = tokenizedVault === null || tokenizedVault === void 0 ? void 0 : tokenizedVault.reported_apy) === null || _c === void 0 ? void 0 : _c.apy) || 0; } catch (e) { console.error('#getVaultApy:', e); throw new Error(`#getVaultApy::${vault}:${e === null || e === void 0 ? void 0 : e.message}`); } }); } function getRewardsStakingPositions(_a) { return __awaiter(this, arguments, void 0, function* ({ rpcUrl, wallet, }) { var _b; const REWARDS_CHAIN = 43114; const REWARDS_SYMBOL = 'AVAX'; const REWARDS_DECIMALS = 18; const REWARDS_NAME = 'Avalanche'; const APR_MULTIPLIER = 31536000; const UP_AUSD_SYMBOL = 'upAUSD'; try { const provider = (0, utils_1.createProvider)(rpcUrl); const chainId = Number((_b = (yield provider.getNetwork())) === null || _b === void 0 ? void 0 : _b.chainId); if (chainId !== REWARDS_CHAIN) { console.warn('#getStakingPositions: no rewards distributor on chain_id', chainId); return []; } if (wallet && !(0, ethers_1.isAddress)(wallet)) { console.warn('#getStakingPositions: wallet passed is not a valid address', wallet); return []; } const rewardDistributorAddresses = (0, utils_1.REWARD_DISTRIBUTOR_ADDRESS)(chainId); const positions = yield Promise.all(rewardDistributorAddresses.map((contract, i) => __awaiter(this, void 0, void 0, function* () { const rewardContract = (0, utils_1.createContract)({ address: contract, provider: provider, abi: abis_1.ABI_REWARD_DISTRIBUTOR, }); const totalStaked = yield rewardContract.totalStaked(); const rewardsPerSecond = yield rewardContract.rewardsPerSecond(); const stakingTokenCalls = ['decimals', 'symbol', 'name', 'totalSupply']; const stakingTokenAddress = (yield rewardContract.stakingToken()); const stakingTokenContract = (0, utils_1.createContract)({ address: stakingTokenAddress, provider: provider, abi: abis_1.ABI_ERC20, }); const [decimals, symbol, name, totalSupply] = yield Promise.all(stakingTokenCalls.map((staking) => stakingTokenContract[staking]())); let balance; let earned; if (wallet) { const formattedWallet = (0, ethers_1.getAddress)(wallet); balance = yield rewardContract.balanceOf(formattedWallet); earned = yield rewardContract.earned(formattedWallet); } const rewardTokenPriceInUsd = yield (0, utils_1.fetchTokenPrice)(REWARDS_SYMBOL); const normalizedRewardTokenPrice = (0, utils_1.toNormalizedBn)(rewardTokenPriceInUsd); const normalizedTotalStakedInPool = (0, utils_1.toNormalizedBn)(totalStaked, decimals); const normalizedRedeemable = (0, utils_1.toNormalizedBn)(earned, REWARDS_DECIMALS); const normalizedRewardsPerSecond = (0, utils_1.toNormalizedBn)(rewardsPerSecond, REWARDS_DECIMALS); const normalizedTotalStakedBalance = (0, utils_1.toNormalizedBn)(balance, decimals); const rewardTokenPriceToMultiply = symbol === UP_AUSD_SYMBOL ? Number(normalizedRewardTokenPrice === null || normalizedRewardTokenPrice === void 0 ? void 0 : normalizedRewardTokenPrice.normalized) : 1; const STAKED_APR = ((Number(normalizedRewardsPerSecond === null || normalizedRewardsPerSecond === void 0 ? void 0 : normalizedRewardsPerSecond.normalized) * APR_MULTIPLIER * rewardTokenPriceToMultiply) / (Number(normalizedTotalStakedInPool === null || normalizedTotalStakedInPool === void 0 ? void 0 : normalizedTotalStakedInPool.normalized) * Number(1))) * 100; const MAX_APR = ((Number(normalizedRewardsPerSecond === null || normalizedRewardsPerSecond === void 0 ? void 0 : normalizedRewardsPerSecond.normalized) * APR_MULTIPLIER * rewardTokenPriceToMultiply) / (Number(normalizedTotalStakedInPool === null || normalizedTotalStakedInPool === void 0 ? void 0 : normalizedTotalStakedInPool.normalized) * Number(1))) * 100; const activePosition = { id: String(i), rewardToken: { decimals: REWARDS_DECIMALS, symbol: REWARDS_SYMBOL, address: ethers_1.ZeroAddress, chain: REWARDS_CHAIN, redeemable: normalizedRedeemable, usd: normalizedRewardTokenPrice, name: REWARDS_NAME, }, stakingToken: { decimals: Number(decimals), symbol: symbol, address: stakingTokenAddress, chain: REWARDS_CHAIN, totalStaked: normalizedTotalStakedBalance, usd: normalizedRewardTokenPrice, totalSupply: normalizedTotalStakedInPool, name: name, }, rewardDistributor: contract, rewardPerSecond: (0, utils_1.toNormalizedBn)(rewardsPerSecond), apy: STAKED_APR, maxApy: MAX_APR, chainId: REWARDS_CHAIN, }; return activePosition; }))); return positions; } catch (e) { console.error('#getStakingPositions:', e); } }); } //# sourceMappingURL=getters.js.map