From e1bd29c46ceaa19ddd439199ef0fda89a24cfacd Mon Sep 17 00:00:00 2001 From: cwsnt Date: Fri, 13 Dec 2024 22:33:46 +0700 Subject: [PATCH 1/3] fix: basset removal --- contracts/masset/BasketManagerV3.sol | 7 +- dist/hardhat.config.js | 5 +- dist/hardhat.config.js.map | 2 +- tests/masset/TestBasketManagerV3.spec.ts | 91 +++++++++++++++++++++++- 4 files changed, 100 insertions(+), 5 deletions(-) diff --git a/contracts/masset/BasketManagerV3.sol b/contracts/masset/BasketManagerV3.sol index 2a36e7c..c89dddd 100644 --- a/contracts/masset/BasketManagerV3.sol +++ b/contracts/masset/BasketManagerV3.sol @@ -373,14 +373,19 @@ contract BasketManagerV3 is OwnableUpgradeable, ERC1967UpgradeUpgradeable { factorMap[_basset] = 0; uint256 index; + bool found = false; for (uint256 i = 0; i < bassetsArray.length - 1; i++) { if (bassetsArray[i] == _basset) { index = i; + found = true; break; } } - bassetsArray[index] = bassetsArray[bassetsArray.length - 1]; + if(found) { + bassetsArray[index] = bassetsArray[bassetsArray.length - 1]; + } + bassetsArray.pop(); emit BassetRemoved(_basset); diff --git a/dist/hardhat.config.js b/dist/hardhat.config.js index 0a5a790..e23e391 100644 --- a/dist/hardhat.config.js +++ b/dist/hardhat.config.js @@ -40,7 +40,10 @@ require("hardhat-contract-sizer"); require("@openzeppelin/hardhat-upgrades"); require("@nomiclabs/hardhat-solhint"); require("./tasks"); -require("node_modules/sovrynsmartcontracts/hardhat/tasks/multisig"); +//@todo - resolve conflicts in "sovrynsmartcontracts": "git+https://github.com/DistributedCollective/Sovryn-smart-contracts.git" +// install the package +// uncomment the line below to use multisig scripts from the core repo +// import "node_modules/sovrynsmartcontracts/hardhat/tasks/multisig"; /* * Test hardhat forking with patched hardhat * diff --git a/dist/hardhat.config.js.map b/dist/hardhat.config.js.map index 9db7a38..332314d 100644 --- a/dist/hardhat.config.js.map +++ b/dist/hardhat.config.js.map @@ -1 +1 @@ -{"version":3,"file":"hardhat.config.js","sourceRoot":"","sources":["../hardhat.config.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"hardhat.config.js","sourceRoot":"","sources":["../hardhat.config.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/tests/masset/TestBasketManagerV3.spec.ts b/tests/masset/TestBasketManagerV3.spec.ts index 78e96b6..5ac2ae3 100644 --- a/tests/masset/TestBasketManagerV3.spec.ts +++ b/tests/masset/TestBasketManagerV3.spec.ts @@ -696,10 +696,18 @@ contract("BasketManagerV3", async (accounts) => { from: owner, }); + mockToken2 = await MockERC20.new("", "", 18, sa.dummy1, tokens(1000), { + from: owner, + }); + await basketManager.initialize(massetManagerMock, { from: owner }); await basketManager.addBasset(mockToken1.address, 1, 10, 100, false, { from: owner, }); + + await basketManager.addBasset(mockToken2.address, 1, 10, 100, false, { + from: owner, + }); }); context("should fail", async () => { @@ -728,7 +736,37 @@ contract("BasketManagerV3", async (accounts) => { context("should succeed", async () => { it("with all valid params", async () => { - const bassetToRemove = mockToken1.address; + const allCurrentlyActiveBassets = await basketManager.getBassets(); + const initialBassetLength = allCurrentlyActiveBassets.length; + + const bassetToRemove = allCurrentlyActiveBassets[0]; + + const bassetsListBefore = await basketManager.getBassets(); + expect(bassetsListBefore).to.contain(bassetToRemove); + + const { receipt } = await basketManager.removeBasset(bassetToRemove, { + from: owner, + }); + + const isValid = await basketManager.isValidBasset(bassetToRemove); + expect(isValid).to.equal(false); + + const bassetsListAfter = await basketManager.getBassets(); + expect(bassetsListAfter).not.to.contain(bassetToRemove); + + const latestBassetLength = bassetsListAfter.length; + expect(latestBassetLength + 1).to.equal(initialBassetLength); + + await expectEvent(receipt, "BassetRemoved", { basset: bassetToRemove }); + }); + + it("successfully removed the last index of basset", async () => { + const allCurrentlyActiveBassets = await basketManager.getBassets(); + const initialBassetLength = allCurrentlyActiveBassets.length; + + expect(allCurrentlyActiveBassets) + + const bassetToRemove = allCurrentlyActiveBassets[allCurrentlyActiveBassets.length - 1]; const bassetsListBefore = await basketManager.getBassets(); expect(bassetsListBefore).to.contain(bassetToRemove); @@ -743,8 +781,57 @@ contract("BasketManagerV3", async (accounts) => { const bassetsListAfter = await basketManager.getBassets(); expect(bassetsListAfter).not.to.contain(bassetToRemove); + const latestBassetLength = bassetsListAfter.length; + expect(latestBassetLength + 1).to.equal(initialBassetLength); + await expectEvent(receipt, "BassetRemoved", { basset: bassetToRemove }); }); + + it("successfully removed the last index of basset with 1 basset list only", async () => { + const allCurrentlyActiveBassets = await basketManager.getBassets(); + const initialBassetLength = allCurrentlyActiveBassets.length; + + expect(allCurrentlyActiveBassets) + + const bassetToRemove = allCurrentlyActiveBassets[allCurrentlyActiveBassets.length - 1]; + + const bassetsListBefore = await basketManager.getBassets(); + expect(bassetsListBefore).to.contain(bassetToRemove); + + const tx = await basketManager.removeBasset(bassetToRemove, { + from: owner, + }); + + let isValid = await basketManager.isValidBasset(bassetToRemove); + expect(isValid).to.equal(false); + + let bassetsListAfter = await basketManager.getBassets(); + expect(bassetsListAfter).not.to.contain(bassetToRemove); + + let latestBassetLength = bassetsListAfter.length; + expect(latestBassetLength + 1).to.equal(initialBassetLength); + + await expectEvent(tx.receipt, "BassetRemoved", { basset: bassetToRemove }); + + + /** remove last basset */ + const lastActiveBassets = await basketManager.getBassets(); + expect(lastActiveBassets.length).to.equal(1); + const tx2 = await basketManager.removeBasset(lastActiveBassets[0], { + from: owner, + }); + + isValid = await basketManager.isValidBasset(lastActiveBassets[0]); + expect(isValid).to.equal(false); + + bassetsListAfter = await basketManager.getBassets(); + expect(bassetsListAfter).not.to.contain(lastActiveBassets[0]); + + latestBassetLength = bassetsListAfter.length; + expect(latestBassetLength).to.equal(0); + + await expectEvent(tx2.receipt, "BassetRemoved", { basset: lastActiveBassets[0] }); + }); }); }); -}); +}); \ No newline at end of file From 31d29e946641e98872021c69bd85b57a5dc17fe1 Mon Sep 17 00:00:00 2001 From: cwsnt Date: Wed, 18 Dec 2024 17:48:01 +0700 Subject: [PATCH 2/3] added sip script --- tasks/sips/args/SIPArgs.ts | 86 +++++++++++- tests-onchain/sip-0086.test.ts | 230 +++++++++++++++++++++++++++++++++ 2 files changed, 315 insertions(+), 1 deletion(-) create mode 100644 tests-onchain/sip-0086.test.ts diff --git a/tasks/sips/args/SIPArgs.ts b/tasks/sips/args/SIPArgs.ts index f181ce4..2bab3d2 100644 --- a/tasks/sips/args/SIPArgs.ts +++ b/tasks/sips/args/SIPArgs.ts @@ -199,12 +199,96 @@ const SIPSOV3564 = async (hre): Promise => { return args; }; +const sip0086 = async ( + hre: HardhatRuntimeEnvironment +): Promise => { + // Replace BasketManagerV3, MassetManager, FeesManager + const { + ethers, + deployments: { get }, + network, + } = hre; + + const proxyAdmin = await ethers.getContract("MyntAdminProxy"); + + const targetContractsList = [ + "BasketManagerV3", + ]; + + const deploymentProxies = await Promise.all( + targetContractsList.map(async (val) => { + return (await get(val)).address; + }) + ); + + const deploymentImplementations = await Promise.all( + targetContractsList.map(async (val) => { + return (await get(val)).implementation; + }) + ); + + const targetsProxyAdmin = Array(deploymentProxies.length).fill( + proxyAdmin.address + ); + + // VALIDATE DEPLOYMENTS + const errorLog: string[] = []; + await Promise.all( + deploymentProxies.map(async (proxyAddress, index) => { + if ( + (await proxyAdmin.getProxyImplementation(proxyAddress)) === + deploymentImplementations[index] + ) { + errorLog.push( + `Implementation ${targetContractsList[index]} has not changed: ${deploymentImplementations[index]}` + ); + } + }) + ); + if (errorLog.length > 0) { + logger.error(errorLog); + if ( + (network.tags.mainnet || network.tags.testnet) && + !network.tags["forked"] + ) { + throw Error("^"); + } + } + + // CALC SIP ARGS + const datas = deploymentProxies.map((val, index) => { + return ethers.utils.defaultAbiCoder.encode( + ["address", "address"], + [deploymentProxies[index], deploymentImplementations[index]] + ); + }); + + const signatures = Array(deploymentProxies.length).fill( + "upgrade(address,address)" + ); + + const args: ISipArgument = { + args: { + targets: targetsProxyAdmin, + values: Array(deploymentProxies.length).fill(0), + signatures: signatures, + data: datas, + description: + "SIP-0086: Update removeBasset function in BasketManager Mynt, Details: , sha256: ", // @todo update the description + }, + governorName: "GovernorOwner", + }; + + return args; +}; + const sipArgs = { SampleSIP01, SIPSetMassetManagerProxy, SIPSetBasketManagerProxy, sip0072, - SIPSOV3564 + SIPSOV3564, + sip0086, }; export default sipArgs; diff --git a/tests-onchain/sip-0086.test.ts b/tests-onchain/sip-0086.test.ts new file mode 100644 index 0000000..6c0d883 --- /dev/null +++ b/tests-onchain/sip-0086.test.ts @@ -0,0 +1,230 @@ +// first run a local forked mainnet node in a separate terminal window: +// npx hardhat node --fork https://mainnet-dev.sovryn.app/rpc --no-deploy +// now run the test: +// npx hardhat test tests-onchain/sip-0086.test.ts --network rskForkedMainnet +const chai = require("chai"); +const { expect } = chai; + +import { + mine, + mineUpTo, + time, + setBalance, + reset, + SnapshotRestorer, + takeSnapshot, +} from "@nomicfoundation/hardhat-network-helpers"; +import { JsonRpcSigner } from "@ethersproject/providers"; +import hre from "hardhat"; + +const { + ethers, + deployments, + deployments: { createFixture }, +} = hre; + +const MAX_DURATION = ethers.BigNumber.from(24 * 60 * 60).mul(1092); +const ONE_RBTC = ethers.utils.parseEther("1.0"); + +describe("SIP-0086 onchain test", () => { + const getImpersonatedSignerFromJsonRpcProvider = async ( + addressToImpersonate + ) => { + //await impersonateAccount(addressToImpersonate); + //await ethers.provider.send("hardhat_impersonateAccount", [addressToImpersonate]); + //return await ethers.getSigner(addressToImpersonate); + const provider = new ethers.providers.JsonRpcProvider( + "http://localhost:8545" + ); + await provider.send("hardhat_impersonateAccount", [addressToImpersonate]); + //return await ethers.getSigner(addressToImpersonate); + return provider.getSigner(addressToImpersonate); + }; + + const setupTest = createFixture(async ({ deployments, getNamedAccounts }) => { + let { deployer } = await getNamedAccounts(); + + if (!deployer) { + deployer = (await ethers.getSigners())[0].address; + } + + console.log("deployer:", deployer); + + const deployerSigner = await ethers.getSigner(deployer); + await setBalance(deployer, ONE_RBTC.mul(10)); + /*await deployments.fixture(["StakingModules", "StakingModulesProxy"], { + keepExistingDeployments: true, + }); // start from a fresh deployments + */ + const stakingProxy = await ethers.getContract("StakingProxy", deployer); + const stakingModulesProxy = await ethers.getContract( + "StakingModulesProxy", + deployer + ); + + const god = await deployments.get("GovernorOwner"); + const governorOwner = await ethers.getContract("GovernorOwner"); + /*const governorOwner = await ethers.getContractAt( + "GovernorAlpha", + god.address, + deployerSigner + );*/ + const governorOwnerSigner: JsonRpcSigner = + (await getImpersonatedSignerFromJsonRpcProvider( + god.address + )) as JsonRpcSigner; + + await setBalance(governorOwnerSigner._address, ONE_RBTC); + const timelockOwner = await ethers.getContract( + "TimelockOwner", + governorOwnerSigner + ); + + const timelockOwnerSigner: JsonRpcSigner = + (await getImpersonatedSignerFromJsonRpcProvider( + timelockOwner.address + )) as JsonRpcSigner; + await setBalance(timelockOwnerSigner._address, ONE_RBTC); + + const multisigSigner: JsonRpcSigner = + (await getImpersonatedSignerFromJsonRpcProvider( + ( + await deployments.get("MultiSigWallet") + ).address + )) as JsonRpcSigner; + // + return { + deployer, + deployerSigner, + stakingProxy, + stakingModulesProxy, + governorOwner, + governorOwnerSigner, + timelockOwner, + timelockOwnerSigner, + multisigSigner, + }; + }); + let snapshot: SnapshotRestorer; + before(async () => { + await reset("https://mainnet-dev.sovryn.app/rpc", 5911035); + snapshot = await takeSnapshot(); + }); + async () => { + await snapshot.restore(); + }; + + it("SIP-0086 is executable", async () => { + if (!hre.network.tags["forked"]) return; + const { + deployer, + deployerSigner, + stakingProxy, + governorOwner, + timelockOwnerSigner, + multisigSigner, + } = await setupTest(); + // loadFixtureAfterEach = true; + // CREATE PROPOSAL + //console.log("deploying new contracts..."); + // await deployments.fixture( + // [ + // "BasketManager", + // "MassetManager", + // "FeesManager", + // "FeesVault", + // "MocIntegration", + // ], + // { + // keepExistingDeployments: true, + // } + // ); + //console.log("DONE deploying new contracts..."); + const sov = await ethers.getContract("SOV", timelockOwnerSigner); + const whaleAmount = (await sov.totalSupply()).mul(ethers.BigNumber.from(5)); + await sov.mint(deployerSigner.address, whaleAmount); + + /* + const quorumVotes = await governorOwner.quorumVotes(); + console.log('quorumVotes:', quorumVotes); + */ + await sov + .connect(deployerSigner) + .approve(stakingProxy.address, whaleAmount); + //const stakeABI = (await hre.artifacts.readArtifact("IStaking")).abi; + const stakeABI = (await deployments.getArtifact("IStaking")).abi; + // const stakeABI = (await ethers.getContractFactory("IStaking")).interface; + // alternatively for stakeABI can be used human readable ABI: + /*const stakeABI = [ + 'function stake(uint96 amount,uint256 until,address stakeFor,address delegatee)', + 'function pauseUnpause(bool _pause)', + 'function paused() view returns (bool)' + ];*/ + const staking = await ethers.getContractAt( + stakeABI, + stakingProxy.address, + deployerSigner + ); + /*const multisigSigner = await getImpersonatedSignerFromJsonRpcProvider( + ( + await get("MultiSigWallet") + ).address + );*/ + if (await staking.paused()) + await staking.connect(multisigSigner).pauseUnpause(false); + const kickoffTS = await stakingProxy.kickoffTS(); + await staking.stake( + whaleAmount, + kickoffTS.add(MAX_DURATION), + deployer, + deployer + ); + await mine(); + + // CREATE PROPOSAL AND VERIFY + const proposalIdBeforeSIP = await governorOwner.proposalCount(); + await hre.run("mynt-sips:create", { + argsFunc: "sip0086", + }); + const proposalId = await governorOwner.latestProposalIds(deployer); + expect( + proposalId.toNumber(), + "Proposal was not created. Check the SIP creation is not commented out." + ).equals(proposalIdBeforeSIP.toNumber() + 1); + + // VOTE FOR PROPOSAL + console.log("voting for proposal"); + await mine(); + await governorOwner.connect(deployerSigner).castVote(proposalId, true); + + // QUEUE PROPOSAL + let proposal = await governorOwner.proposals(proposalId); + + await mineUpTo(proposal.endBlock); + await mine(); + + await governorOwner.queue(proposalId); + + // EXECUTE PROPOSAL + proposal = await governorOwner.proposals(proposalId); + await time.increaseTo(proposal.eta); + console.log("executing proposal"); + await expect(governorOwner.execute(proposalId)) + .to.emit(governorOwner, "ProposalExecuted") + .withArgs(proposalId); + + // VALIDATE EXECUTION + expect((await governorOwner.proposals(proposalId)).executed).to.be.true; + + const { + deployments: { get }, + } = hre; + const bmProxyDeployment = await get("BasketManagerV3_Proxy"); + const bmDeployment = await get("BasketManagerV3"); + + const myntAdminProxy = await ethers.getContract("MyntAdminProxy"); + expect( + await myntAdminProxy.getProxyImplementation(bmProxyDeployment.address) + ).to.equal(bmDeployment.implementation); + }); +}); From a4d3b615253dae32d596209572bbc73f56c758f5 Mon Sep 17 00:00:00 2001 From: cwsnt Date: Wed, 18 Dec 2024 20:59:33 +0700 Subject: [PATCH 3/3] move the sip to sovryn core repo --- tasks/sips/args/SIPArgs.ts | 86 +----------- tests-onchain/sip-0086.test.ts | 230 --------------------------------- 2 files changed, 1 insertion(+), 315 deletions(-) delete mode 100644 tests-onchain/sip-0086.test.ts diff --git a/tasks/sips/args/SIPArgs.ts b/tasks/sips/args/SIPArgs.ts index 2bab3d2..f181ce4 100644 --- a/tasks/sips/args/SIPArgs.ts +++ b/tasks/sips/args/SIPArgs.ts @@ -199,96 +199,12 @@ const SIPSOV3564 = async (hre): Promise => { return args; }; -const sip0086 = async ( - hre: HardhatRuntimeEnvironment -): Promise => { - // Replace BasketManagerV3, MassetManager, FeesManager - const { - ethers, - deployments: { get }, - network, - } = hre; - - const proxyAdmin = await ethers.getContract("MyntAdminProxy"); - - const targetContractsList = [ - "BasketManagerV3", - ]; - - const deploymentProxies = await Promise.all( - targetContractsList.map(async (val) => { - return (await get(val)).address; - }) - ); - - const deploymentImplementations = await Promise.all( - targetContractsList.map(async (val) => { - return (await get(val)).implementation; - }) - ); - - const targetsProxyAdmin = Array(deploymentProxies.length).fill( - proxyAdmin.address - ); - - // VALIDATE DEPLOYMENTS - const errorLog: string[] = []; - await Promise.all( - deploymentProxies.map(async (proxyAddress, index) => { - if ( - (await proxyAdmin.getProxyImplementation(proxyAddress)) === - deploymentImplementations[index] - ) { - errorLog.push( - `Implementation ${targetContractsList[index]} has not changed: ${deploymentImplementations[index]}` - ); - } - }) - ); - if (errorLog.length > 0) { - logger.error(errorLog); - if ( - (network.tags.mainnet || network.tags.testnet) && - !network.tags["forked"] - ) { - throw Error("^"); - } - } - - // CALC SIP ARGS - const datas = deploymentProxies.map((val, index) => { - return ethers.utils.defaultAbiCoder.encode( - ["address", "address"], - [deploymentProxies[index], deploymentImplementations[index]] - ); - }); - - const signatures = Array(deploymentProxies.length).fill( - "upgrade(address,address)" - ); - - const args: ISipArgument = { - args: { - targets: targetsProxyAdmin, - values: Array(deploymentProxies.length).fill(0), - signatures: signatures, - data: datas, - description: - "SIP-0086: Update removeBasset function in BasketManager Mynt, Details: , sha256: ", // @todo update the description - }, - governorName: "GovernorOwner", - }; - - return args; -}; - const sipArgs = { SampleSIP01, SIPSetMassetManagerProxy, SIPSetBasketManagerProxy, sip0072, - SIPSOV3564, - sip0086, + SIPSOV3564 }; export default sipArgs; diff --git a/tests-onchain/sip-0086.test.ts b/tests-onchain/sip-0086.test.ts deleted file mode 100644 index 6c0d883..0000000 --- a/tests-onchain/sip-0086.test.ts +++ /dev/null @@ -1,230 +0,0 @@ -// first run a local forked mainnet node in a separate terminal window: -// npx hardhat node --fork https://mainnet-dev.sovryn.app/rpc --no-deploy -// now run the test: -// npx hardhat test tests-onchain/sip-0086.test.ts --network rskForkedMainnet -const chai = require("chai"); -const { expect } = chai; - -import { - mine, - mineUpTo, - time, - setBalance, - reset, - SnapshotRestorer, - takeSnapshot, -} from "@nomicfoundation/hardhat-network-helpers"; -import { JsonRpcSigner } from "@ethersproject/providers"; -import hre from "hardhat"; - -const { - ethers, - deployments, - deployments: { createFixture }, -} = hre; - -const MAX_DURATION = ethers.BigNumber.from(24 * 60 * 60).mul(1092); -const ONE_RBTC = ethers.utils.parseEther("1.0"); - -describe("SIP-0086 onchain test", () => { - const getImpersonatedSignerFromJsonRpcProvider = async ( - addressToImpersonate - ) => { - //await impersonateAccount(addressToImpersonate); - //await ethers.provider.send("hardhat_impersonateAccount", [addressToImpersonate]); - //return await ethers.getSigner(addressToImpersonate); - const provider = new ethers.providers.JsonRpcProvider( - "http://localhost:8545" - ); - await provider.send("hardhat_impersonateAccount", [addressToImpersonate]); - //return await ethers.getSigner(addressToImpersonate); - return provider.getSigner(addressToImpersonate); - }; - - const setupTest = createFixture(async ({ deployments, getNamedAccounts }) => { - let { deployer } = await getNamedAccounts(); - - if (!deployer) { - deployer = (await ethers.getSigners())[0].address; - } - - console.log("deployer:", deployer); - - const deployerSigner = await ethers.getSigner(deployer); - await setBalance(deployer, ONE_RBTC.mul(10)); - /*await deployments.fixture(["StakingModules", "StakingModulesProxy"], { - keepExistingDeployments: true, - }); // start from a fresh deployments - */ - const stakingProxy = await ethers.getContract("StakingProxy", deployer); - const stakingModulesProxy = await ethers.getContract( - "StakingModulesProxy", - deployer - ); - - const god = await deployments.get("GovernorOwner"); - const governorOwner = await ethers.getContract("GovernorOwner"); - /*const governorOwner = await ethers.getContractAt( - "GovernorAlpha", - god.address, - deployerSigner - );*/ - const governorOwnerSigner: JsonRpcSigner = - (await getImpersonatedSignerFromJsonRpcProvider( - god.address - )) as JsonRpcSigner; - - await setBalance(governorOwnerSigner._address, ONE_RBTC); - const timelockOwner = await ethers.getContract( - "TimelockOwner", - governorOwnerSigner - ); - - const timelockOwnerSigner: JsonRpcSigner = - (await getImpersonatedSignerFromJsonRpcProvider( - timelockOwner.address - )) as JsonRpcSigner; - await setBalance(timelockOwnerSigner._address, ONE_RBTC); - - const multisigSigner: JsonRpcSigner = - (await getImpersonatedSignerFromJsonRpcProvider( - ( - await deployments.get("MultiSigWallet") - ).address - )) as JsonRpcSigner; - // - return { - deployer, - deployerSigner, - stakingProxy, - stakingModulesProxy, - governorOwner, - governorOwnerSigner, - timelockOwner, - timelockOwnerSigner, - multisigSigner, - }; - }); - let snapshot: SnapshotRestorer; - before(async () => { - await reset("https://mainnet-dev.sovryn.app/rpc", 5911035); - snapshot = await takeSnapshot(); - }); - async () => { - await snapshot.restore(); - }; - - it("SIP-0086 is executable", async () => { - if (!hre.network.tags["forked"]) return; - const { - deployer, - deployerSigner, - stakingProxy, - governorOwner, - timelockOwnerSigner, - multisigSigner, - } = await setupTest(); - // loadFixtureAfterEach = true; - // CREATE PROPOSAL - //console.log("deploying new contracts..."); - // await deployments.fixture( - // [ - // "BasketManager", - // "MassetManager", - // "FeesManager", - // "FeesVault", - // "MocIntegration", - // ], - // { - // keepExistingDeployments: true, - // } - // ); - //console.log("DONE deploying new contracts..."); - const sov = await ethers.getContract("SOV", timelockOwnerSigner); - const whaleAmount = (await sov.totalSupply()).mul(ethers.BigNumber.from(5)); - await sov.mint(deployerSigner.address, whaleAmount); - - /* - const quorumVotes = await governorOwner.quorumVotes(); - console.log('quorumVotes:', quorumVotes); - */ - await sov - .connect(deployerSigner) - .approve(stakingProxy.address, whaleAmount); - //const stakeABI = (await hre.artifacts.readArtifact("IStaking")).abi; - const stakeABI = (await deployments.getArtifact("IStaking")).abi; - // const stakeABI = (await ethers.getContractFactory("IStaking")).interface; - // alternatively for stakeABI can be used human readable ABI: - /*const stakeABI = [ - 'function stake(uint96 amount,uint256 until,address stakeFor,address delegatee)', - 'function pauseUnpause(bool _pause)', - 'function paused() view returns (bool)' - ];*/ - const staking = await ethers.getContractAt( - stakeABI, - stakingProxy.address, - deployerSigner - ); - /*const multisigSigner = await getImpersonatedSignerFromJsonRpcProvider( - ( - await get("MultiSigWallet") - ).address - );*/ - if (await staking.paused()) - await staking.connect(multisigSigner).pauseUnpause(false); - const kickoffTS = await stakingProxy.kickoffTS(); - await staking.stake( - whaleAmount, - kickoffTS.add(MAX_DURATION), - deployer, - deployer - ); - await mine(); - - // CREATE PROPOSAL AND VERIFY - const proposalIdBeforeSIP = await governorOwner.proposalCount(); - await hre.run("mynt-sips:create", { - argsFunc: "sip0086", - }); - const proposalId = await governorOwner.latestProposalIds(deployer); - expect( - proposalId.toNumber(), - "Proposal was not created. Check the SIP creation is not commented out." - ).equals(proposalIdBeforeSIP.toNumber() + 1); - - // VOTE FOR PROPOSAL - console.log("voting for proposal"); - await mine(); - await governorOwner.connect(deployerSigner).castVote(proposalId, true); - - // QUEUE PROPOSAL - let proposal = await governorOwner.proposals(proposalId); - - await mineUpTo(proposal.endBlock); - await mine(); - - await governorOwner.queue(proposalId); - - // EXECUTE PROPOSAL - proposal = await governorOwner.proposals(proposalId); - await time.increaseTo(proposal.eta); - console.log("executing proposal"); - await expect(governorOwner.execute(proposalId)) - .to.emit(governorOwner, "ProposalExecuted") - .withArgs(proposalId); - - // VALIDATE EXECUTION - expect((await governorOwner.proposals(proposalId)).executed).to.be.true; - - const { - deployments: { get }, - } = hre; - const bmProxyDeployment = await get("BasketManagerV3_Proxy"); - const bmDeployment = await get("BasketManagerV3"); - - const myntAdminProxy = await ethers.getContract("MyntAdminProxy"); - expect( - await myntAdminProxy.getProxyImplementation(bmProxyDeployment.address) - ).to.equal(bmDeployment.implementation); - }); -});