@augustdigital/vaults
Version:
JS SDK for web3 interactions with the August Digital Lending Pools
615 lines • 33.2 kB
JavaScript
;
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