UNPKG

@mstable/protocol

Version:
162 lines 9.72 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.musdUpgradeBlock = void 0; /* eslint-disable no-await-in-loop */ /* eslint-disable no-restricted-syntax */ require("ts-node/register"); require("tsconfig-paths/register"); const config_1 = require("hardhat/config"); const generated_1 = require("types/generated"); const math_1 = require("@utils/math"); const MusdEth__factory_1 = require("types/generated/factories/MusdEth__factory"); const MusdLegacy__factory_1 = require("types/generated/factories/MusdLegacy__factory"); const storage_utils_1 = require("./utils/storage-utils"); const snap_utils_1 = require("./utils/snap-utils"); const tokens_1 = require("./utils/tokens"); const quantity_formatters_1 = require("./utils/quantity-formatters"); const rates_utils_1 = require("./utils/rates-utils"); const utils_1 = require("./utils"); const networkAddressFactory_1 = require("./utils/networkAddressFactory"); const mUsdBassets = [tokens_1.sUSD, tokens_1.USDC, tokens_1.DAI, tokens_1.USDT]; const mUsdPolygonBassets = [tokens_1.PUSDC, tokens_1.PDAI, tokens_1.PUSDT]; // major mUSD upgrade to MusdV3 that changes the ABI exports.musdUpgradeBlock = 12094376; const getMasset = (signer, networkName, block) => { if (networkName === "polygon_mainnet") { return generated_1.Masset__factory.connect(tokens_1.PmUSD.address, signer); } if (networkName === "polygon_testnet") { return generated_1.Masset__factory.connect(tokens_1.MmUSD.address, signer); } if (networkName === "ropsten") { return MusdEth__factory_1.MusdEth__factory.connect(tokens_1.RmUSD.address, signer); } // The block mUSD was upgraded to the latest Masset with contract name (Musdv3) if (block < exports.musdUpgradeBlock) { return MusdLegacy__factory_1.MusdLegacy__factory.connect(tokens_1.mUSD.address, signer); } return MusdEth__factory_1.MusdEth__factory.connect(tokens_1.mUSD.address, signer); }; config_1.task("mUSD-storage", "Dumps mUSD's storage data") .addOptionalParam("block", "Block number to get storage from. (default: current block)", 0, config_1.types.int) .addOptionalParam("type", "Type of storage to report. token, basset, config or all.", "all", config_1.types.string) .setAction(async (taskArgs, hre) => { const signer = await utils_1.getSigner(hre); const blockNumber = taskArgs.block ? taskArgs.block : await hre.ethers.provider.getBlockNumber(); console.log(`Block number ${blockNumber}`); const mAsset = getMasset(signer, hre.network.name, blockNumber); if (["token", "all"].includes(taskArgs.type)) await storage_utils_1.dumpTokenStorage(mAsset, blockNumber); if (["basset", "all"].includes(taskArgs.type)) await storage_utils_1.dumpBassetStorage(mAsset, blockNumber); if (["config", "all"].includes(taskArgs.type)) await storage_utils_1.dumpConfigStorage(mAsset, blockNumber); }); config_1.task("mUSD-snap", "Snaps mUSD") .addOptionalParam("from", "Block to query transaction events from. (default: deployment block)", 12094461, config_1.types.int) .addOptionalParam("to", "Block to query transaction events to. (default: current block)", 0, config_1.types.int) .setAction(async (taskArgs, hre) => { const signer = await utils_1.getSigner(hre); const chain = networkAddressFactory_1.getChain(hre); const { network, ethers } = hre; let exposedValidator; if (!["mainnet", "polygon_mainnet"].includes(network.name)) { console.log("Not a mainnet chain"); const LogicFactory = await ethers.getContractFactory("MassetLogic"); const logicLib = await LogicFactory.deploy(); const linkedAddress = { libraries: { MassetLogic: logicLib.address, }, }; const massetFactory = await ethers.getContractFactory("ExposedMassetLogic", linkedAddress); exposedValidator = await massetFactory.deploy(); } const { fromBlock, toBlock } = await snap_utils_1.getBlockRange(hre.ethers, taskArgs.from, taskArgs.to); const mAsset = getMasset(signer, network.name, toBlock.blockNumber); const savingsManagerAddress = networkAddressFactory_1.getChainAddress("SavingsManager", chain); const savingsManager = generated_1.SavingsManager__factory.connect(savingsManagerAddress, signer); const bAssets = network.name.includes("polygon") ? mUsdPolygonBassets : mUsdBassets; let accounts = []; if (chain === tokens_1.Chain.mainnet) { accounts = [ { name: "imUSD", address: tokens_1.mUSD.savings, }, { name: "Iron Bank", address: "0xbe86e8918dfc7d3cb10d295fc220f941a1470c5c", }, { name: "Curve mUSD", address: "0x8474ddbe98f5aa3179b3b3f5942d724afcdec9f6", }, { name: "mStable DAO", address: "0x3dd46846eed8D147841AE162C8425c08BD8E1b41", }, { name: "Balancer ETH/mUSD 50/50 #2", address: "0xe036cce08cf4e23d33bc6b18e53caf532afa8513", }, ]; } else if (chain === tokens_1.Chain.polygon) { accounts = [ { name: "imUSD", address: tokens_1.PmUSD.savings, }, ]; } const mintSummary = await snap_utils_1.getMints(bAssets, mAsset, fromBlock.blockNumber, toBlock.blockNumber, quantity_formatters_1.usdFormatter); const mintMultiSummary = await snap_utils_1.getMultiMints(bAssets, mAsset, fromBlock.blockNumber, toBlock.blockNumber, quantity_formatters_1.usdFormatter); const swapSummary = await snap_utils_1.getSwaps(bAssets, mAsset, fromBlock.blockNumber, toBlock.blockNumber, quantity_formatters_1.usdFormatter); const redeemSummary = await snap_utils_1.getRedemptions(bAssets, mAsset, fromBlock.blockNumber, toBlock.blockNumber, quantity_formatters_1.usdFormatter); const redeemMultiSummary = await snap_utils_1.getMultiRedemptions(bAssets, mAsset, fromBlock.blockNumber, toBlock.blockNumber, quantity_formatters_1.usdFormatter); await snap_utils_1.snapConfig(mAsset, toBlock.blockNumber); await snap_utils_1.getBasket(mAsset, bAssets.map((b) => b.symbol), "mUSD", quantity_formatters_1.usdFormatter, toBlock.blockNumber, undefined, exposedValidator); const balances = await snap_utils_1.getBalances(mAsset, accounts, quantity_formatters_1.usdFormatter, toBlock.blockNumber); await snap_utils_1.getCollectedInterest(bAssets, mAsset, savingsManager, fromBlock, toBlock, quantity_formatters_1.usdFormatter, balances.save); await snap_utils_1.snapSave("mUSD", signer, chain, toBlock.blockNumber); snap_utils_1.outputFees(mintSummary, mintMultiSummary, swapSummary, redeemSummary, redeemMultiSummary, balances, fromBlock.blockTime, toBlock.blockTime, quantity_formatters_1.usdFormatter); }); config_1.task("mUSD-rates", "mUSD rate comparison to Curve") .addOptionalParam("block", "Block number to compare rates at. (default: current block)", 0, config_1.types.int) .addOptionalParam("swapSize", "Swap size to compare rates with Curve", 10000, config_1.types.float) .setAction(async (taskArgs, hre) => { const signer = await utils_1.getSigner(hre); const chain = networkAddressFactory_1.getChain(hre); const block = await snap_utils_1.getBlock(hre.ethers, taskArgs.block); const mAsset = await getMasset(signer, hre.network.name, block.blockNumber); console.log(`\nGetting rates for mUSD at block ${block.blockNumber}, ${block.blockTime}`); const bAssets = chain === tokens_1.Chain.polygon ? mUsdPolygonBassets : mUsdBassets; console.log(" Qty Input Output Qty Out Rate Output Rate Diff Arb$"); await rates_utils_1.getSwapRates(bAssets, bAssets, mAsset, block.blockNumber, quantity_formatters_1.usdFormatter, math_1.BN.from(taskArgs.swapSize), chain); await snap_utils_1.snapConfig(mAsset, block.blockNumber); }); config_1.task("mUSD-BassetAdded", "Lists the BassetAdded events from a mAsset") .addOptionalParam("masset", "Token symbol of mAsset. eg mUSD or mBTC", "mUSD", config_1.types.string) .addOptionalParam("from", "Block to query transaction events from. (default: deployment block)", 10148031, config_1.types.int) .addOptionalParam("to", "Block to query transaction events to. (default: current block)", 0, config_1.types.int) .setAction(async (taskArgs, hre) => { const signer = await utils_1.getSigner(hre); const chain = await networkAddressFactory_1.getChain(hre); const { fromBlock, toBlock } = await snap_utils_1.getBlockRange(hre.ethers, taskArgs.from, taskArgs.to); const mAsset = await getMasset(signer, hre.network.name, toBlock.blockNumber); const massetManagerAddress = networkAddressFactory_1.getChainAddress("MassetManager", chain); const manager = generated_1.MassetManager__factory.connect(massetManagerAddress, signer); const filter = await manager.filters.BassetAdded(); filter.address = mAsset.address; const logs = await mAsset.queryFilter(filter, fromBlock.blockNumber, toBlock.blockNumber); console.log(`${await mAsset.symbol()} ${mAsset.address}`); if (logs.length === 0) console.error(`Failed to find any BassetAdded events between blocks ${fromBlock.blockNumber} and ${toBlock.blockNumber}`); // eslint-disable-next-line @typescript-eslint/no-explicit-any logs.forEach((log) => { console.log(`Basset added at block ${log.blockNumber} in tx ${log.blockHash}`); }); }); module.exports = {}; //# sourceMappingURL=mUSD.js.map