@flarenetwork/flare-stake-tool
Version:
Utilities for staking on the Flare network
158 lines • 7 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.fetchMirrorFunds = fetchMirrorFunds;
const ethersV5_1 = require("ethersV5");
const contracts_1 = require("./constants/contracts");
const context_1 = require("./context");
const flarejs_1 = require("@flarenetwork/flarejs");
const settings = __importStar(require("./settings"));
const ethereumjs_util_1 = require("ethereumjs-util");
async function getContractAddress(network, contractName) {
const rpcUrl = (0, context_1.rpcUrlFromNetworkConfig)(network);
const provider = new ethersV5_1.ethers.providers.JsonRpcProvider(rpcUrl);
if (network != "flare" && network != "costwo" && network != "songbird" && network != "coston") {
throw new Error("Invalid network passed");
}
const contract = new ethersV5_1.ethers.Contract(contracts_1.defaultContractAddresses.FlareContractRegistry[network], contracts_1.flareContractRegistryABI, provider);
const result = await contract.getContractAddressByName(contractName);
if (result !== (0, ethereumjs_util_1.zeroAddress)())
return result;
const defaultAddress = contracts_1.defaultContractAddresses[contractName]?.[network];
if (defaultAddress)
return defaultAddress;
throw new Error("Contract Address not found");
}
////////// MIRROR FUND /////////
// fetches current validator info
const fetchValidatorInfo = async (ctx) => {
const pvmapi = new flarejs_1.pvm.PVMApi(settings.URL[ctx.config.hrp]);
const validator = await pvmapi.getCurrentValidators();
return validator;
};
// fetches pending validator info
const fetchPendingValidatorInfo = async (ctx) => {
const pvmapi = new flarejs_1.pvm.PVMApi(settings.URL[ctx.config.hrp]);
const pendingValidator = await pvmapi.getPendingValidators();
return pendingValidator;
};
// fetches the delegation stake (from both current and pending validator) for the current user
const fetchDelegateStake = async (ctx, validatorFunction) => {
const validatorsInfo = await validatorFunction(ctx);
const validatorsData = validatorsInfo.validators;
let userStake = [];
if (!ctx.pAddressBech32) {
throw new Error("pAddressBech32 is not set in the context");
}
for (let i = 0; i < validatorsData.length; i++) {
const validatorData = validatorsData[i];
// get validators
if (validatorData.validationRewardOwner && validatorData.validationRewardOwner.addresses.includes(ctx.pAddressBech32)) {
const startDate = new Date(parseInt(validatorData.startTime) * 1000);
const endDate = new Date(parseInt(validatorData.endTime) * 1000);
userStake.push({
type: "validator",
nodeID: validatorData.nodeID,
stakeAmount: parseFloat(validatorData.stakeAmount) / 1e9,
startTime: startDate,
endTime: endDate,
});
}
// get delegators
for (let j = 0; j < (validatorData.delegators && validatorData.delegators?.length); j++) {
if (validatorData.delegators[j] &&
validatorData.delegators[j].rewardOwner.addresses.includes(ctx.pAddressBech32)) {
const startDate = new Date(parseInt(validatorData.delegators[j].startTime) * 1000);
const endDate = new Date(parseInt(validatorData.delegators[j].endTime) * 1000);
userStake.push({
type: "delegator",
nodeID: validatorData.nodeID,
stakeAmount: parseFloat(validatorData.delegators[j].stakeAmount) / 1e9,
startTime: startDate,
endTime: endDate,
});
}
}
}
return userStake;
};
// calculates the total amount of delegation
const getTotalFromDelegation = (data) => {
let total = 0;
for (let i = 0; i < data.length; i++) {
total += data[i].stakeAmount;
}
return total;
};
/**
* @description returns the mirror fund details
* @param ctx - context
* @returns - total mirror funds and funds with start and end time
*/
async function fetchMirrorFunds(ctx) {
// fetch from the contract
// TODO: implement from contract (mirrored) and split to two (mirrored and directly from p-chai
// const rpcUrl = rpcUrlFromNetworkConfig(ctx.config.hrp);
// const pChainStakeMirrorContractAddress = await getContractAddress(
// ctx.config.hrp,
// pChainStakeMirror,
// );
// const provider = new ethers.providers.JsonRpcProvider(rpcUrl);
// const abi = getPChainStakeMirrorABI() as ethers.ContractInterface;
// const contract = new ethers.Contract(
// pChainStakeMirrorContractAddress,
// abi,
// provider,
// );
// const stakedAmount = await contract.balanceOf(ctx.cAddressHex);
// const stakedAmountInFLR = parseFloat(
// integerToDecimal(stakedAmount.toString(), 18),
// );
// fetch from the chain
const delegationToCurrentValidator = await fetchDelegateStake(ctx, fetchValidatorInfo);
const delegationToPendingValidator = await fetchDelegateStake(ctx, fetchPendingValidatorInfo);
const totalDelegatedAmount = getTotalFromDelegation(delegationToCurrentValidator)
+
getTotalFromDelegation(delegationToPendingValidator);
const totalInFLR = parseFloat(totalDelegatedAmount.toString());
return {
"Total Mirrored Amount": `${totalInFLR} FLR`,
"Mirror Funds Details": [
...delegationToCurrentValidator,
...delegationToPendingValidator,
],
};
}
//# sourceMappingURL=contracts.js.map