UNPKG

tokamak-staking-lib

Version:
91 lines (90 loc) 4.65 kB
"use strict"; 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;