tokamak-staking-lib
Version:
tokamak staking library
91 lines (90 loc) • 4.65 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Calculator = exports.calculateExpectedSeigWithCommission = exports.calculateExpectedSeig = void 0;
const bn_js_1 = __importDefault(require("bn.js"));
const { toBN } = require("web3-utils");
const RAY = toBN("1000000000000000000000000000");
const SEIG_PER_BLOCK = toBN("3920000000000000000000000000");
const DEFAULT_PSEIG_RATE = toBN("400000000000000000000000000");
const DEFAULT_TOTALSUPPLY_OF_TON = toBN("50000000000000000000000000000000000");
exports.calculateExpectedSeig = (fromBlockNumber, toBlockNumber, userStakedAmount, totalStakedAmount, totalSupplyOfTON, pseigRate) => {
const seigPerBlock = SEIG_PER_BLOCK;
const blockNumbers = toBlockNumber.sub(fromBlockNumber);
const totalMaxSeig = seigPerBlock.mul(blockNumbers);
const totalBasicSeig = totalMaxSeig.mul(totalStakedAmount).div(totalSupplyOfTON);
const unstakedSeig = totalMaxSeig.sub(totalBasicSeig);
const totalPseig = unstakedSeig.mul(pseigRate).div(RAY);
const userBasicSeig = totalBasicSeig.mul(userStakedAmount).div(totalStakedAmount);
const userPseig = totalPseig.mul(userStakedAmount).div(totalStakedAmount);
return userBasicSeig.add(userPseig);
};
exports.calculateExpectedSeigWithCommission = (fromBlockNumber, toBlockNumber, userStakedAmount, totalStakedAmount, totalSupplyOfTON, pseigRate, commissionRate, isCommissionRateNegative, operatorStakedAmount, totalStakedAmountOnLayer2, isOperator) => {
if (fromBlockNumber === toBlockNumber ||
totalStakedAmount === toBN("0") ||
totalStakedAmountOnLayer2 === toBN("0")) {
return toBN("0");
}
if (commissionRate === new bn_js_1.default("0")) {
const userSeig = exports.calculateExpectedSeig(fromBlockNumber, toBlockNumber, userStakedAmount, totalStakedAmount, totalSupplyOfTON, pseigRate);
return userSeig;
}
const seigPerBlock = SEIG_PER_BLOCK;
const blockNumbers = toBlockNumber.sub(fromBlockNumber);
const totalMaxSeig = seigPerBlock.mul(blockNumbers);
const totalBasicSeig = totalMaxSeig.mul(totalStakedAmount).div(totalSupplyOfTON);
const unstakedSeig = totalMaxSeig.sub(totalBasicSeig);
const totalPseig = unstakedSeig.mul(pseigRate).div(RAY);
const totalSeigOnLayer2 = exports.calculateExpectedSeig(fromBlockNumber, toBlockNumber, totalStakedAmountOnLayer2, totalStakedAmount, totalSupplyOfTON, pseigRate);
if (isCommissionRateNegative === false) {
const commission = totalSeigOnLayer2.mul(commissionRate).div(RAY);
const restSeig = totalSeigOnLayer2.sub(commission);
if (isOperator === true) {
return restSeig.mul(operatorStakedAmount).div(totalStakedAmountOnLayer2).add(commission);
}
else {
return restSeig.mul(userStakedAmount).div(totalStakedAmountOnLayer2);
}
}
else {
const operatorRate = operatorStakedAmount.mul(RAY).div(totalStakedAmountOnLayer2);
const commission = totalSeigOnLayer2.mul(operatorRate).div(RAY).mul(commissionRate).div(RAY);
const delegatorSeigs = operatorRate === RAY
? commission
: commission.mul(RAY).div(RAY.sub(operatorRate));
const burnAmount = operatorRate === RAY
? commission
: commission.add(delegatorSeigs.mul(operatorRate).div(RAY));
if (isOperator === true) {
return totalSeigOnLayer2.add(delegatorSeigs).mul(operatorStakedAmount).div(totalStakedAmountOnLayer2).sub(burnAmount);
}
else {
return totalStakedAmountOnLayer2.add(totalSeigOnLayer2).add(delegatorSeigs).mul(userStakedAmount).div(totalStakedAmountOnLayer2).sub(userStakedAmount);
}
}
};
class Calculator {
constructor() {
this.seigPerBlock = SEIG_PER_BLOCK;
this.pseigRate = DEFAULT_PSEIG_RATE;
this.totalSupplyOfTON = DEFAULT_TOTALSUPPLY_OF_TON;
}
setSeigPerBlock(seig) {
this.seigPerBlock = seig;
}
setPseigRate(rate) {
this.pseigRate = rate;
}
setTotalSupplyOfTON(totalSupply) {
this.totalSupplyOfTON = totalSupply;
}
setTotalStakedAmount(amount) {
this.totalStakedAmount = amount;
}
getExpectedSeig(fromBlockNumber, toBlockNumber, userStakedAmount) {
return exports.calculateExpectedSeig(fromBlockNumber, toBlockNumber, userStakedAmount, this.totalStakedAmount, this.totalSupplyOfTON, this.pseigRate);
}
}
exports.Calculator = Calculator;