UNPKG

blub-sdk

Version:

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

108 lines (107 loc) 3.93 kB
"use strict"; /* eslint-disable @typescript-eslint/no-explicit-any */ // Copyright (c) Blub Labs, Inc. // SPDX-License-Identifier: Apache-2.0 Object.defineProperty(exports, "__esModule", { value: true }); exports.queryUserPositionIds = queryUserPositionIds; exports.parseUserPosition = parseUserPosition; exports.queryUserPositions = queryUserPositions; exports.getUserTotalStaked = getUserTotalStaked; const sui_1 = require("../utils/sui"); async function queryUserPositionIds(client, userPositionRecordId, wallet) { const resq = await client.getDynamicFieldObject({ parentId: userPositionRecordId, name: { type: "address", value: wallet, }, }); const fields = (0, sui_1.getObjectFields)(resq); if (!fields) { throw new Error("fields is null"); } const tableId = fields.value.fields.id.id; const positionFields = await client.getDynamicFields({ parentId: tableId }); const positionIds = positionFields.data.map((item) => { return item.name.value; }); return positionIds; } async function parseUserPosition(client, fields) { const waitClaimRewardTableId = fields.waiting_claim_reward.fields.id.id; const waitClaimRewardFields = await client.getDynamicFields({ parentId: waitClaimRewardTableId, }); const waitingClaimReward = new Map(); for (const item of waitClaimRewardFields.data) { const object = await client.getObject({ id: item.objectId, options: { showContent: true }, }); const fields = (0, sui_1.getObjectFields)(object); if (!fields) { throw new Error("fields is null"); } waitingClaimReward.set(fields.name.fields.name, BigInt(fields.value)); } const rewardDebtTableId = fields.reward_debt.fields.id.id; const rewardDebtFields = await client.getDynamicFields({ parentId: rewardDebtTableId, }); const rewardDebt = new Map(); for (const item of rewardDebtFields.data) { const object = await client.getObject({ id: item.objectId, options: { showContent: true }, }); const fields = (0, sui_1.getObjectFields)(object); if (!fields) { throw new Error("fields is null"); } rewardDebt.set(fields.name.fields.name, BigInt(fields.value)); } const position = { id: fields.id.id, stakedAmount: BigInt(fields.staked_amount), rewardDebt, waitingClaimReward, }; return position; } async function queryUserPositions(client, positionIds) { const resq = await client.multiGetObjects({ ids: positionIds, options: { showContent: true }, }); const positions = []; for (const item of resq) { const fields = (0, sui_1.getObjectFields)(item); if (!fields) { throw new Error("fields is null"); } const position = await parseUserPosition(client, fields); positions.push(position); } return positions; } /** * Returns the total staked amount for a given user by summing all valid positions. * * @param client - SuiClient instance * @param userPositionRecordId - The global position record object ID * @param wallet - User wallet address * @returns Total staked amount as a BigInt */ async function getUserTotalStaked(client, userPositionRecordId, wallet) { const positionIds = await queryUserPositionIds(client, userPositionRecordId, wallet); if (!positionIds || positionIds.length === 0) return BigInt(0); const userPositions = await queryUserPositions(client, positionIds); if (!userPositions || userPositions.length === 0) return BigInt(0); return userPositions.reduce((total, position) => { return position.stakedAmount > BigInt(0) ? total + position.stakedAmount : total; }, BigInt(0)); }