blub-sdk
Version:
A modular SDK for interacting with the BLUB ecosystem on the Sui blockchain.
108 lines (107 loc) • 3.93 kB
JavaScript
;
/* 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));
}