UNPKG

blub-sdk

Version:

A modular SDK for interacting with the BLUB ecosystem on the Sui blockchain.

69 lines (68 loc) 2.88 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getStakingSummary = getStakingSummary; const client_1 = require("../../utils/client"); const config_1 = require("../../utils/config"); const rewards_1 = require("../../utils/rewards"); const StakingRepository_1 = require("./StakingRepository"); const objectIds = (0, config_1.getStakingObjectIds)("mainnet"); /** * Returns a full staking summary for the given wallet: * - total staked amount * - every position (id, staked amount) * - pending rewards for each coinType listed in `rewardCoins` */ async function getStakingSummary(wallet) { const rewardCoinMap = new Map(); rewards_1.rewardCoins.forEach((c) => { rewardCoinMap.set(c.coinType, { symbol: c.symbol, coinType: c.coinType, logoUrl: c.logoUrl, decimals: c.decimals, monthlyReward: c.monthlyReward, }); }); const rewardManager = await (0, StakingRepository_1.queryRewardManager)(client_1.defaultSuiClient, objectIds.REWARD_MANAGER_ID); if (!rewardManager) throw new Error("Failed to load reward manager."); const userPositionsRecordId = rewardManager.userPositionsRecordId; const totalStaked = await (0, StakingRepository_1._getUserTotalStaked)(client_1.defaultSuiClient, userPositionsRecordId, wallet); const positionIds = await (0, StakingRepository_1._queryUserPositionIds)(client_1.defaultSuiClient, userPositionsRecordId, wallet); if (!positionIds || positionIds.length === 0) { return { totalStaked, positions: [] }; } const userPositions = await (0, StakingRepository_1._getPositions)(positionIds); if (!userPositions || userPositions.length === 0) { return { totalStaked, positions: [] }; } const positionsWithRewards = []; for (const pos of userPositions) { const rewards = await Promise.all(rewards_1.rewardCoins.map(async (coin) => { try { const [pending] = await (0, StakingRepository_1._calculatePendingReward)(wallet, { position: pos.id, coinType: coin.coinType }, objectIds.BLUB_STAKING_PACKAGE_ID, client_1.defaultSuiClient); const raw = pending?.pendingReward ?? BigInt(0); return { ...coin, pendingReward: Number(raw) / 10 ** coin.decimals, }; } catch (err) { console.warn(`Error calculating reward for ${coin.symbol}`, err); return { ...coin, pendingReward: 0, }; } })); positionsWithRewards.push({ positionId: pos.id, staked: pos.stakedAmount, rewards, }); } return { totalStaked, positions: positionsWithRewards, }; }