blub-sdk
Version:
A modular SDK for interacting with the BLUB ecosystem on the Sui blockchain.
69 lines (68 loc) • 2.88 kB
JavaScript
;
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,
};
}