UNPKG

@mstable/protocol

Version:
257 lines 14.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.deploySplitRevenueBuyBack = exports.deployRevenueBuyBack = exports.deployBridgeForwarder = exports.deployVotiumBribeForwarder = exports.deployDisperseForwarder = exports.deployL2BridgeRecipients = exports.deployL2EmissionsController = exports.deployBasicForwarder = exports.deployEmissionsController = void 0; const generated_1 = require("types/generated"); const deploy_utils_1 = require("./deploy-utils"); const etherscan_1 = require("./etherscan"); const networkAddressFactory_1 = require("./networkAddressFactory"); const tokens_1 = require("./tokens"); const deployEmissionsController = async (signer, hre) => { const chain = networkAddressFactory_1.getChain(hre); const nexusAddress = networkAddressFactory_1.resolveAddress("Nexus", chain); const proxyAdminAddress = networkAddressFactory_1.resolveAddress("DelayedProxyAdmin", chain); const mtaAddress = networkAddressFactory_1.resolveAddress("MTA", chain); const mtaStakingAddress = networkAddressFactory_1.resolveAddress("StakedTokenMTA", chain); const mbptStakingAddress = networkAddressFactory_1.resolveAddress("StakedTokenBPT", chain); let dialRecipients; let caps; let notifies; if (chain === tokens_1.Chain.mainnet) { dialRecipients = [ mtaStakingAddress, mbptStakingAddress, networkAddressFactory_1.resolveAddress("mUSD", chain, "vault"), networkAddressFactory_1.resolveAddress("mBTC", chain, "vault"), networkAddressFactory_1.resolveAddress("GUSD", chain, "vault"), networkAddressFactory_1.resolveAddress("BUSD", chain, "vault"), networkAddressFactory_1.resolveAddress("alUSD", chain, "vault"), networkAddressFactory_1.resolveAddress("RAI", chain, "vault"), networkAddressFactory_1.resolveAddress("FEI", chain, "vault"), networkAddressFactory_1.resolveAddress("HBTC", chain, "vault"), networkAddressFactory_1.resolveAddress("tBTCv2", chain, "vault"), // 10 ]; caps = dialRecipients.map((_, i) => { if (i < 2) return 10; return 0; }); notifies = dialRecipients.map(() => true); } else if (chain === tokens_1.Chain.ropsten) { dialRecipients = [ mtaStakingAddress, mbptStakingAddress, networkAddressFactory_1.resolveAddress("mUSD", chain, "vault"), networkAddressFactory_1.resolveAddress("mBTC", chain, "vault"), ]; caps = [10, 10, 0, 0]; notifies = [true, true, true, true]; } else { throw Error("Chain must be mainnet or Ropsten"); } const defaultConfig = { A: -166000000000000, B: 168479942061125, C: -168479942061125, D: 166000000000000, EPOCHS: 312, }; // Deploy logic contract const constructorArguments = [nexusAddress, mtaAddress, defaultConfig]; const emissionsControllerImpl = await deploy_utils_1.deployContract(new generated_1.EmissionsController__factory(signer), "EmissionsController Implementation", constructorArguments); // Deploy proxy and initialize const initializeData = emissionsControllerImpl.interface.encodeFunctionData("initialize", [ dialRecipients, caps, notifies, [mtaStakingAddress, mbptStakingAddress], ]); const proxy = await deploy_utils_1.deployContract(new generated_1.AssetProxy__factory(signer), "AssetProxy", [ emissionsControllerImpl.address, proxyAdminAddress, initializeData, ]); const emissionsController = new generated_1.EmissionsController__factory(signer).attach(proxy.address); await etherscan_1.verifyEtherscan(hre, { address: emissionsControllerImpl.address, constructorArguments, contract: "contracts/emissions/EmissionsController.sol:EmissionsController", }); return emissionsController; }; exports.deployEmissionsController = deployEmissionsController; const deployBasicForwarder = async (signer, emissionsControllerAddress, recipient, hre, owner) => { const chain = networkAddressFactory_1.getChain(hre); const nexusAddress = networkAddressFactory_1.resolveAddress("Nexus", chain); const rewardsAddress = networkAddressFactory_1.resolveAddress("MTA", chain); const recipientAddress = networkAddressFactory_1.resolveAddress(recipient, chain); const ownerAddress = owner ? networkAddressFactory_1.resolveAddress(owner, chain) : undefined; const constructorArguments = [nexusAddress, rewardsAddress]; const forwarder = await deploy_utils_1.deployContract(new generated_1.BasicRewardsForwarder__factory(signer), "BasicRewardsForwarder", [ nexusAddress, rewardsAddress, ]); const tx1 = await forwarder.initialize(emissionsControllerAddress, recipientAddress); await deploy_utils_1.logTxDetails(tx1, "initialize"); if (ownerAddress) { const tx2 = await forwarder.transferOwnership(ownerAddress); await deploy_utils_1.logTxDetails(tx2, "transferOwnership"); } await etherscan_1.verifyEtherscan(hre, { address: forwarder.address, constructorArguments, contract: "contracts/emissions/BasicRewardsForwarder.sol:BasicRewardsForwarder", }); return forwarder; }; exports.deployBasicForwarder = deployBasicForwarder; const deployL2EmissionsController = async (signer, hre) => { const chain = networkAddressFactory_1.getChain(hre); const nexusAddress = networkAddressFactory_1.resolveAddress("Nexus", chain); const proxyAdminAddress = networkAddressFactory_1.resolveAddress("DelayedProxyAdmin", chain); const mtaAddress = networkAddressFactory_1.resolveAddress("MTA", chain); // Deploy logic contract const constructorArguments = [nexusAddress, mtaAddress]; const l2EmissionsControllerImpl = await deploy_utils_1.deployContract(new generated_1.L2EmissionsController__factory(signer), "L2EmissionsController Implementation", constructorArguments); // Deploy proxy and initialize const initializeData = l2EmissionsControllerImpl.interface.encodeFunctionData("initialize", []); const proxy = await deploy_utils_1.deployContract(new generated_1.AssetProxy__factory(signer), "AssetProxy", [ l2EmissionsControllerImpl.address, proxyAdminAddress, initializeData, ]); const l2EmissionsController = new generated_1.L2EmissionsController__factory(signer).attach(proxy.address); await etherscan_1.verifyEtherscan(hre, { address: l2EmissionsControllerImpl.address, constructorArguments, contract: "contracts/emissions/L2EmissionsController.sol:L2EmissionsController", }); return l2EmissionsController; }; exports.deployL2EmissionsController = deployL2EmissionsController; const deployL2BridgeRecipients = async (signer, hre, l2EmissionsControllerAddress) => { const chain = networkAddressFactory_1.getChain(hre); const mtaAddress = networkAddressFactory_1.resolveAddress("MTA", chain); const constructorArguments = [mtaAddress, l2EmissionsControllerAddress]; const bridgeRecipient = await deploy_utils_1.deployContract(new generated_1.L2BridgeRecipient__factory(signer), "L2BridgeRecipient", [ mtaAddress, l2EmissionsControllerAddress, ]); await etherscan_1.verifyEtherscan(hre, { address: bridgeRecipient.address, constructorArguments, contract: "contracts/emissions/L2BridgeRecipient.sol:L2BridgeRecipient", }); return bridgeRecipient; }; exports.deployL2BridgeRecipients = deployL2BridgeRecipients; const deployDisperseForwarder = async (signer, hre) => { const chain = networkAddressFactory_1.getChain(hre); const nexusAddress = networkAddressFactory_1.resolveAddress("Nexus", chain); const disperseAddress = networkAddressFactory_1.resolveAddress("Disperse", chain); const mtaAddress = networkAddressFactory_1.resolveAddress("MTA", chain); const constructorArguments = [nexusAddress, mtaAddress, disperseAddress]; const disperseForwarder = await deploy_utils_1.deployContract(new generated_1.DisperseForwarder__factory(signer), "DisperseForwarder", constructorArguments); await etherscan_1.verifyEtherscan(hre, { address: disperseForwarder.address, constructorArguments, contract: "contracts/emissions/DisperseForwarder.sol:DisperseForwarder", }); return disperseForwarder; }; exports.deployDisperseForwarder = deployDisperseForwarder; const deployVotiumBribeForwarder = async (signer, hre) => { const chain = networkAddressFactory_1.getChain(hre); const nexusAddress = networkAddressFactory_1.resolveAddress("Nexus", chain); const votiumBribeAddress = networkAddressFactory_1.resolveAddress("VotiumBribe", chain); const mtaAddress = networkAddressFactory_1.resolveAddress("MTA", chain); const constructorArguments = [nexusAddress, mtaAddress, votiumBribeAddress]; const votiumBribeForwarder = await deploy_utils_1.deployContract(new generated_1.VotiumBribeForwarder__factory(signer), "VotiumBribeForwarder", constructorArguments); await etherscan_1.verifyEtherscan(hre, { address: votiumBribeForwarder.address, constructorArguments, contract: "contracts/emissions/VotiumBribeForwarder.sol:VotiumBribeForwarder", }); return votiumBribeForwarder; }; exports.deployVotiumBribeForwarder = deployVotiumBribeForwarder; const deployBridgeForwarder = async (signer, hre, bridgeRecipientAddress, _emissionsControllerAddress) => { const chain = networkAddressFactory_1.getChain(hre); const nexusAddress = networkAddressFactory_1.resolveAddress("Nexus", chain); const mtaAddress = networkAddressFactory_1.resolveAddress("MTA", chain); const proxyAdminAddress = networkAddressFactory_1.resolveAddress("DelayedProxyAdmin", chain); const tokenBridgeAddress = networkAddressFactory_1.resolveAddress("PolygonPoSBridge", chain); const rootChainManagerAddress = networkAddressFactory_1.resolveAddress("PolygonRootChainManager", chain); const emissionsControllerAddress = _emissionsControllerAddress || networkAddressFactory_1.resolveAddress("EmissionsController", chain); const constructorArguments = [nexusAddress, mtaAddress, tokenBridgeAddress, rootChainManagerAddress, bridgeRecipientAddress]; const bridgeForwarderImpl = await deploy_utils_1.deployContract(new generated_1.BridgeForwarder__factory(signer), "Vault Bridge Forwarder", constructorArguments); // Deploy proxy and initialize const initializeData = bridgeForwarderImpl.interface.encodeFunctionData("initialize", [emissionsControllerAddress]); const proxy = await deploy_utils_1.deployContract(new generated_1.AssetProxy__factory(signer), "AssetProxy", [ bridgeForwarderImpl.address, proxyAdminAddress, initializeData, ]); const bridgeForwarder = new generated_1.BridgeForwarder__factory(signer).attach(proxy.address); console.log(`\nSet bridgeForwarder to ${bridgeForwarder.address}`); console.log(`Governor calls EmissionsController.addDial ${emissionsControllerAddress} with params:`); console.log(`recipient ${bridgeForwarder.address}, cap 0, notify true`); await etherscan_1.verifyEtherscan(hre, { address: bridgeForwarderImpl.address, constructorArguments, contract: "contracts/emissions/BridgeForwarder.sol:BridgeForwarder", }); return bridgeForwarder; }; exports.deployBridgeForwarder = deployBridgeForwarder; const deployRevenueBuyBack = async (signer, hre, _emissionsControllerAddress) => { const chain = networkAddressFactory_1.getChain(hre); const nexusAddress = networkAddressFactory_1.resolveAddress("Nexus", chain); const mtaAddress = networkAddressFactory_1.resolveAddress("MTA", chain); const uniswapRouterAddress = networkAddressFactory_1.resolveAddress("UniswapRouterV3", chain); const emissionsControllerAddress = _emissionsControllerAddress || networkAddressFactory_1.resolveAddress("EmissionsController", chain); // Deploy RevenueBuyBack const constructorArguments = [ nexusAddress, mtaAddress, uniswapRouterAddress, emissionsControllerAddress, ]; const revenueBuyBack = await deploy_utils_1.deployContract(new generated_1.RevenueBuyBack__factory(signer), "RevenueBuyBack", constructorArguments); const tx = await revenueBuyBack.initialize([0, 1]); await deploy_utils_1.logTxDetails(tx, "RevenueBuyBack.initialize"); await etherscan_1.verifyEtherscan(hre, { address: revenueBuyBack.address, constructorArguments, contract: "contracts/buy-and-make/RevenueBuyBack.sol:RevenueBuyBack", }); return revenueBuyBack; }; exports.deployRevenueBuyBack = deployRevenueBuyBack; const deploySplitRevenueBuyBack = async (signer, hre, protocolFee) => { const chain = networkAddressFactory_1.getChain(hre); const nexusAddress = networkAddressFactory_1.resolveAddress("Nexus", chain); const mtaAddress = networkAddressFactory_1.resolveAddress("MTA", chain); const uniswapRouterAddress = networkAddressFactory_1.resolveAddress("UniswapRouterV3", chain); const emissionsControllerAddress = networkAddressFactory_1.resolveAddress("EmissionsController", chain); const treasuryAddress = networkAddressFactory_1.resolveAddress("mStableDAO", chain); // Deploy RevenueBuyBack const constructorArguments = [ nexusAddress, mtaAddress, uniswapRouterAddress, emissionsControllerAddress, ]; const revenueBuyBack = await deploy_utils_1.deployContract(new generated_1.RevenueSplitBuyBack__factory(signer), "RevenueSplitBuyBack", constructorArguments); const tx = await revenueBuyBack.initialize([0, 1], treasuryAddress, protocolFee); await deploy_utils_1.logTxDetails(tx, "RevenueSplitBuyBack.initialize"); await etherscan_1.verifyEtherscan(hre, { address: revenueBuyBack.address, constructorArguments, contract: "contracts/buy-and-make/RevenueSplitBuyBack.sol:RevenueSplitBuyBack", }); return revenueBuyBack; }; exports.deploySplitRevenueBuyBack = deploySplitRevenueBuyBack; //# sourceMappingURL=emissions-utils.js.map