UNPKG

@mstable/protocol

Version:
244 lines 16.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const config_1 = require("hardhat/config"); const generated_1 = require("types/generated"); const math_1 = require("@utils/math"); const units_1 = require("@ethersproject/units"); const constants_1 = require("@utils/constants"); const signerFactory_1 = require("./utils/signerFactory"); const deploy_utils_1 = require("./utils/deploy-utils"); const networkAddressFactory_1 = require("./utils/networkAddressFactory"); const quantity_formatters_1 = require("./utils/quantity-formatters"); const snap_utils_1 = require("./utils/snap-utils"); config_1.subtask("staked-snap", "Dumps a user's staking token details.") .addOptionalParam("asset", "Symbol of staking token. MTA or mBPT", "MTA", config_1.types.string) .addParam("user", "Address or contract name of user", undefined, config_1.types.string) .addOptionalParam("block", "Block number to compare rates at. (default: current block)", 0, config_1.types.int) .setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre); const chain = networkAddressFactory_1.getChain(hre); const userAddress = networkAddressFactory_1.resolveAddress(taskArgs.user, chain); const stakingTokenAddress = networkAddressFactory_1.resolveAddress(taskArgs.asset, chain, "vault"); const stakingToken = generated_1.StakedTokenBPT__factory.connect(stakingTokenAddress, signer); const block = await snap_utils_1.getBlock(hre.ethers, taskArgs.block); const callOverride = { blockTag: block.blockNumber, }; const [rawBalance, cooldownBalance] = await stakingToken.rawBalanceOf(userAddress, callOverride); const boostedBalance = await stakingToken.balanceOf(userAddress, callOverride); const votes = await stakingToken.getVotes(userAddress, callOverride); const delegatedVotes = votes.sub(boostedBalance); const effectiveMultiplier = rawBalance.gt(0) ? boostedBalance.mul(10000).div(rawBalance) : math_1.BN.from(0); const delegatee = await stakingToken.delegates(userAddress, callOverride); const priceCoeff = taskArgs.asset === "MTA" ? math_1.BN.from(10000) : await stakingToken.priceCoefficient(); const earnedRewards = await stakingToken.earned(userAddress, callOverride); console.log(`Raw balance ${quantity_formatters_1.usdFormatter(rawBalance)}`); console.log(`Boosted balance ${quantity_formatters_1.usdFormatter(boostedBalance)}`); console.log(`Delegated votes ${quantity_formatters_1.usdFormatter(delegatedVotes)}`); console.log(`Cooldown balance ${quantity_formatters_1.usdFormatter(cooldownBalance)}`); console.log(`Voting power ${quantity_formatters_1.usdFormatter(votes)}`); console.log(`Earned Rewards ${quantity_formatters_1.usdFormatter(earnedRewards)}`); const balanceData = await stakingToken.balanceData(userAddress, callOverride); // Multipliers console.log("\nMultipliers"); console.log(`Time ${units_1.formatUnits(balanceData.timeMultiplier + 100, 2)}`); console.log(`Quest ${units_1.formatUnits(balanceData.questMultiplier + 100, 2)}`); console.log(`MTA Price coefficient ${units_1.formatUnits(priceCoeff, 4)}`); console.log(`Effective multiplier ${units_1.formatUnits(effectiveMultiplier, 4)}`); if (balanceData.cooldownTimestamp > 0) { const cooldownEnds = balanceData.cooldownTimestamp + constants_1.ONE_WEEK.mul(3).toNumber(); console.log(`\nCooldown ends ${new Date(cooldownEnds * 1000)}`); console.log(`Cooldown units ${quantity_formatters_1.usdFormatter(balanceData.cooldownUnits)}`); } console.log(`\nDelegatee ${delegatee}`); }); config_1.task("staked-snap").setAction(async (_, __, runSuper) => { await runSuper(); }); config_1.subtask("staked-stake", "Stake MTA or mBPT in V2 Staking Token") .addOptionalParam("asset", "Symbol of staking token. MTA or mBPT", "MTA", config_1.types.string) .addParam("amount", "Amount of tokens to be staked without the token decimals.", undefined, config_1.types.float) .addParam("delegate", "Address or contract name the voting power will be delegated to.", undefined, config_1.types.string) .addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", config_1.types.string) .setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre, taskArgs.speed, false); const chain = networkAddressFactory_1.getChain(hre); const stakingTokenAddress = networkAddressFactory_1.resolveAddress(taskArgs.asset, chain, "vault"); const stakingToken = generated_1.StakedToken__factory.connect(stakingTokenAddress, signer); const stakeAmount = math_1.simpleToExactAmount(taskArgs.amount); let tx; if (taskArgs.delegate) { const delegateAddress = networkAddressFactory_1.resolveAddress(taskArgs.delegate, chain); tx = await stakingToken["stake(uint256,address)"](stakeAmount, delegateAddress); } else { tx = await stakingToken["stake(uint256)"](stakeAmount); } await deploy_utils_1.logTxDetails(tx, `Stake ${taskArgs.amount} ${taskArgs.symbol}`); }); config_1.task("staked-stake").setAction(async (_, __, runSuper) => { await runSuper(); }); config_1.subtask("staked-cooldown-start", "Start cooldown of V2 staking token") .addOptionalParam("asset", "Symbol of staking token. MTA or mBPT", "MTA", config_1.types.string) .addParam("amount", "Amount to of token to be staked without the token decimals.", undefined, config_1.types.float) .addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", config_1.types.string) .setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre, taskArgs.speed, false); const chain = networkAddressFactory_1.getChain(hre); const stakingTokenAddress = networkAddressFactory_1.resolveAddress(taskArgs.asset, chain, "vault"); const stakingToken = generated_1.StakedToken__factory.connect(stakingTokenAddress, signer); const cooldownAmount = math_1.simpleToExactAmount(taskArgs.amount); const tx = await stakingToken.startCooldown(cooldownAmount); await deploy_utils_1.logTxDetails(tx, `Start cooldown for ${taskArgs.amount} ${taskArgs.asset} tokens`); }); config_1.task("staked-cooldown-start").setAction(async (_, __, runSuper) => { await runSuper(); }); config_1.subtask("staked-cooldown-end", "End cooldown of V2 staking token") .addOptionalParam("asset", "Symbol of staking token. MTA or mBPT", "MTA", config_1.types.string) .addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", config_1.types.string) .setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre, taskArgs.speed, false); const chain = networkAddressFactory_1.getChain(hre); const stakingTokenAddress = networkAddressFactory_1.resolveAddress(taskArgs.asset, chain, "vault"); const stakingToken = generated_1.StakedToken__factory.connect(stakingTokenAddress, signer); const tx = await stakingToken.endCooldown(); await deploy_utils_1.logTxDetails(tx, `End cooldown for ${taskArgs.asset} tokens`); }); config_1.task("staked-cooldown-end").setAction(async (_, __, runSuper) => { await runSuper(); }); config_1.subtask("staked-withdraw", "Withdraw MTA or mBPT in V2 Staking Token") .addOptionalParam("asset", "Symbol of staking token. MTA or mBPT", "MTA", config_1.types.string) .addParam("amount", "Amount to of token to be staked without the token decimals.", undefined, config_1.types.float) .addOptionalParam("recipient", "Address or contract name that will receive the withdrawn tokens.", undefined, config_1.types.string) .addOptionalParam("fee", "True if withdraw fee to be taken from the amount. False if received amount to equal with withdraw amount.", true, config_1.types.boolean) .addOptionalParam("cooldown", "False if not exiting from a previous cooldown. True if previous cooldown to be ended.", false, config_1.types.boolean) .addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", config_1.types.string) .setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre, taskArgs.speed, false); const chain = networkAddressFactory_1.getChain(hre); const stakingTokenAddress = networkAddressFactory_1.resolveAddress(taskArgs.asset, chain, "vault"); const stakingToken = generated_1.StakedToken__factory.connect(stakingTokenAddress, signer); const withdrawAmount = math_1.simpleToExactAmount(taskArgs.amount); const recipientAddress = taskArgs.recipient ? networkAddressFactory_1.resolveAddress(taskArgs.recipient, chain) : await signer.getAddress(); const tx = await stakingToken.withdraw(withdrawAmount, recipientAddress, taskArgs.fee, taskArgs.fee); await deploy_utils_1.logTxDetails(tx, `Withdraw ${taskArgs.amount} ${taskArgs.symbol}`); }); config_1.task("staked-withdraw").setAction(async (_, __, runSuper) => { await runSuper(); }); config_1.subtask("staked-claim", "Claim MTA rewards from V2 staking token") .addOptionalParam("recipient", "Address or contract name that will receive the MTA rewards.", undefined, config_1.types.string) .addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", config_1.types.string) .setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre, taskArgs.speed, false); const chain = networkAddressFactory_1.getChain(hre); const stakingTokenAddress = networkAddressFactory_1.resolveAddress("MTA", chain, "vault"); const stakingToken = generated_1.StakedToken__factory.connect(stakingTokenAddress, signer); let tx; if (taskArgs.recipient) { const recipientAddress = taskArgs.recipient ? networkAddressFactory_1.resolveAddress(taskArgs.recipient, chain) : await signer.getAddress(); tx = await stakingToken["claimReward(address)"](recipientAddress); } else { tx = await stakingToken["claimReward()"](); } const receipt = await deploy_utils_1.logTxDetails(tx, `Claim earned MTA rewards`); console.log(`Claimed ${units_1.formatUnits(receipt.events[0].args[2])} MTA rewards`); }); config_1.task("staked-claim").setAction(async (_, __, runSuper) => { await runSuper(); }); config_1.subtask("staked-compound", "Stake any earned MTA rewards") .addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", config_1.types.string) .setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre, taskArgs.speed, false); const chain = networkAddressFactory_1.getChain(hre); const stakingTokenAddress = networkAddressFactory_1.resolveAddress("MTA", chain, "vault"); const stakingToken = generated_1.StakedTokenMTA__factory.connect(stakingTokenAddress, signer); const tx = await stakingToken.compoundRewards(); const receipt = await deploy_utils_1.logTxDetails(tx, "Stake earned MTA rewards"); console.log(`Staked ${units_1.formatUnits(receipt.events[0].args[2])} MTA rewards`); }); config_1.task("staked-compound").setAction(async (_, __, runSuper) => { await runSuper(); }); config_1.subtask("staked-delegate", "Delegate V2 Staking Tokens") .addOptionalParam("asset", "Symbol of staking token. MTA or mBPT", "MTA", config_1.types.string) .addParam("delegate", "Address or contract name the voting power will be delegated to.", undefined, config_1.types.string) .addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", config_1.types.string) .setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre, taskArgs.speed, false); const chain = networkAddressFactory_1.getChain(hre); const stakingTokenAddress = networkAddressFactory_1.resolveAddress(taskArgs.asset, chain, "vault"); const stakingToken = generated_1.StakedToken__factory.connect(stakingTokenAddress, signer); const delegateAddress = networkAddressFactory_1.resolveAddress(taskArgs.delegate, chain); const tx = await stakingToken.delegate(delegateAddress); await deploy_utils_1.logTxDetails(tx, `Delegate voting power to ${taskArgs.delegate}`); }); config_1.task("staked-delegate").setAction(async (_, __, runSuper) => { await runSuper(); }); config_1.subtask("staked-update-price-coeff", "Updates the price coefficient on the staked mBPT Token.") .addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", config_1.types.string) .setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre, taskArgs.speed, false); const chain = networkAddressFactory_1.getChain(hre); const stakingTokenAddress = networkAddressFactory_1.resolveAddress("mBPT", chain, "vault"); const stakingToken = generated_1.StakedTokenBPT__factory.connect(stakingTokenAddress, signer); const tx = await stakingToken.fetchPriceCoefficient(); await deploy_utils_1.logTxDetails(tx, `update price coefficient`); }); config_1.task("staked-update-price-coeff").setAction(async (_, __, runSuper) => { await runSuper(); }); config_1.subtask("staked-price-coeff", "Checks the price coefficient on the staked mBPT Token.").setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre); const chain = networkAddressFactory_1.getChain(hre); const stakingTokenAddress = networkAddressFactory_1.resolveAddress("mBPT", chain, "vault"); const stakingToken = generated_1.StakedTokenBPT__factory.connect(stakingTokenAddress, signer); const oldPrice = (await stakingToken.priceCoefficient()).toNumber(); const newPrice = (await stakingToken.getProspectivePriceCoefficient()).toNumber(); const diffPercentage = ((newPrice - oldPrice) * 100) / oldPrice; console.log(`Old price ${oldPrice}, new price, diff ${newPrice} ${diffPercentage}%`); }); config_1.task("staked-price-coeff").setAction(async (_, __, runSuper) => { await runSuper(); }); config_1.subtask("staked-fees", "Converts fees accrued in BPT to MTA, before depositing to the rewards contract.") .addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", config_1.types.string) .setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre, taskArgs.speed, false); const chain = networkAddressFactory_1.getChain(hre); const stakingTokenAddress = networkAddressFactory_1.resolveAddress("mBPT", chain, "vault"); const stakingToken = generated_1.StakedTokenBPT__factory.connect(stakingTokenAddress, signer); const feesBPT = await stakingToken.pendingBPTFees(); if (feesBPT.lt(math_1.simpleToExactAmount(100))) { console.log(`Only ${feesBPT} mBPT in fees so will not convert to MTA`); return; } const tx = await stakingToken.convertFees(); await deploy_utils_1.logTxDetails(tx, `convert mBPT to fees`); }); config_1.task("staked-fees").setAction(async (_, __, runSuper) => { await runSuper(); }); config_1.subtask("staked-time", "Updates a user's time multiplier.") .addParam("user", "Address or contract name of user", undefined, config_1.types.string) .addOptionalParam("asset", "Symbol of staking token. MTA or mBPT", "MTA", config_1.types.string) .addOptionalParam("speed", "Defender Relayer speed param: 'safeLow' | 'average' | 'fast' | 'fastest'", "average", config_1.types.string) .setAction(async (taskArgs, hre) => { const signer = await signerFactory_1.getSigner(hre, taskArgs.speed, false); const chain = networkAddressFactory_1.getChain(hre); const stakingTokenAddress = networkAddressFactory_1.resolveAddress("MTA", chain, "vault"); const stakingToken = generated_1.StakedToken__factory.connect(stakingTokenAddress, signer); const userAddress = networkAddressFactory_1.resolveAddress(taskArgs.user, chain); const tx = await stakingToken.reviewTimestamp(userAddress); await deploy_utils_1.logTxDetails(tx, `update time multiplier`); }); config_1.task("staked-time").setAction(async (_, __, runSuper) => { await runSuper(); }); //# sourceMappingURL=stakingV2.js.map