diff --git a/multisig/proposals/arbitrumone/vip-010/index.ts b/multisig/proposals/arbitrumone/vip-010/index.ts index 4fdf25b77..9e3fbbe37 100644 --- a/multisig/proposals/arbitrumone/vip-010/index.ts +++ b/multisig/proposals/arbitrumone/vip-010/index.ts @@ -12,11 +12,6 @@ const vip010 = () => { signature: "_setPendingAdmin(address)", params: [arbitrumone.NORMAL_TIMELOCK], }, - { - target: arbitrumone.XVS_VAULT_PROXY, - signature: "_setPendingAdmin(address)", - params: [arbitrumone.NORMAL_TIMELOCK], - }, // Revoke permissions { diff --git a/multisig/proposals/ethereum/vip-053/index.ts b/multisig/proposals/ethereum/vip-053/index.ts new file mode 100644 index 000000000..1c9bcffdb --- /dev/null +++ b/multisig/proposals/ethereum/vip-053/index.ts @@ -0,0 +1,40 @@ +import { NETWORK_ADDRESSES } from "src/networkAddresses"; +import { makeProposal } from "src/utils"; + +const { ethereum } = NETWORK_ADDRESSES; + +export const ETHEREUM_ACM = "0x230058da2D23eb8836EC5DB7037ef7250c56E25E"; + +const vip053 = () => { + return makeProposal([ + { + target: ethereum.XVS_VAULT_PROXY, + signature: "_setPendingAdmin(address)", + params: [ethereum.NORMAL_TIMELOCK], + }, + + // Revoke permissions + { + target: ETHEREUM_ACM, + signature: "revokeCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "add(address,uint256,address,uint256,uint256)", ethereum.GUARDIAN], + }, + { + target: ETHEREUM_ACM, + signature: "revokeCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "set(address,uint256,uint256)", ethereum.GUARDIAN], + }, + { + target: ETHEREUM_ACM, + signature: "revokeCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "setRewardAmountPerBlockOrSecond(address,uint256)", ethereum.GUARDIAN], + }, + { + target: ETHEREUM_ACM, + signature: "revokeCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "setWithdrawalLockingPeriod(address,uint256,uint256)", ethereum.GUARDIAN], + }, + ]); +}; + +export default vip053; \ No newline at end of file diff --git a/multisig/simulations/ethereum/vip-053/abi/XVSVault.json b/multisig/simulations/ethereum/vip-053/abi/XVSVault.json new file mode 100644 index 000000000..ae277bb2b --- /dev/null +++ b/multisig/simulations/ethereum/vip-053/abi/XVSVault.json @@ -0,0 +1 @@ +[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChangedV2","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChangedV2","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ExecutedWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAccessControlManager","type":"address"},{"indexed":false,"internalType":"address","name":"newAccessControlManager","type":"address"}],"name":"NewAccessControlManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IPrime","name":"oldPrimeToken","type":"address"},{"indexed":true,"internalType":"contract IPrime","name":"newPrimeToken","type":"address"},{"indexed":false,"internalType":"address","name":"oldPrimeRewardToken","type":"address"},{"indexed":false,"internalType":"address","name":"newPrimeRewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldPrimePoolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrimePoolId","type":"uint256"}],"name":"NewPrimeToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoints","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlockOrSecond","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockPeriod","type":"uint256"}],"name":"PoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldAllocPoints","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAllocPoints","type":"uint256"}],"name":"PoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RequestedWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newReward","type":"uint256"}],"name":"RewardAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldXvs","type":"address"},{"indexed":false,"internalType":"address","name":"oldStore","type":"address"},{"indexed":false,"internalType":"address","name":"newXvs","type":"address"},{"indexed":false,"internalType":"address","name":"newStore","type":"address"}],"name":"StoreUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":true,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldOwedAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newOwedAmount","type":"uint256"}],"name":"VaultDebtUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"VaultPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"VaultResumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPeriod","type":"uint256"}],"name":"WithdrawalLockingPeriodUpdated","type":"event"},{"constant":true,"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_LOCK_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SECONDS_PER_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract XVSVaultProxy","name":"xvsVaultProxy","type":"address"}],"name":"_become","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"accessControlManager","outputs":[{"internalType":"contract IAccessControlManagerV5","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IBEP20","name":"_token","type":"address"},{"internalType":"uint256","name":"_rewardPerBlockOrSecond","type":"uint256"},{"internalType":"uint256","name":"_lockPeriod","type":"uint256"}],"name":"add","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"blocksOrSecondsPerYear","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlockOrSecond","type":"uint32"},{"internalType":"uint96","name":"votes","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"claim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"executeWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getBlockNumberOrTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getEligibleWithdrawalAmount","outputs":[{"internalType":"uint256","name":"withdrawalAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumberOrSecond","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getRequestedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"pendingWithdrawals","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getWithdrawalRequests","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint128","name":"lockedUntil","type":"uint128"},{"internalType":"uint128","name":"afterUpgrade","type":"uint128"}],"internalType":"struct XVSVaultStorageV1.WithdrawalRequest[]","name":"","type":"tuple[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"timeBased_","type":"bool"},{"internalType":"uint256","name":"blocksPerYear_","type":"uint256"}],"name":"initializeTimeManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isStakedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isTimeBased","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"pendingRewardTransfers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingWithdrawalsBeforeUpgrade","outputs":[{"internalType":"uint256","name":"beforeUpgradeWithdrawalAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingXVSVaultImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfos","outputs":[{"internalType":"contract IBEP20","name":"token","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlockOrSecond","type":"uint256"},{"internalType":"uint256","name":"accRewardPerShare","type":"uint256"},{"internalType":"uint256","name":"lockPeriod","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"rewardToken","type":"address"}],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"primePoolId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"primeRewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"primeToken","outputs":[{"internalType":"contract IPrime","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"requestWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"resume","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"rewardTokenAmountsPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardTokenAmountsPerBlockOrSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newAccessControlAddress","type":"address"}],"name":"setAccessControl","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IPrime","name":"_primeToken","type":"address"},{"internalType":"address","name":"_primeRewardToken","type":"address"},{"internalType":"uint256","name":"_primePoolId","type":"uint256"}],"name":"setPrimeToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardAmount","type":"uint256"}],"name":"setRewardAmountPerBlockOrSecond","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_newPeriod","type":"uint256"}],"name":"setWithdrawalLockingPeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_xvs","type":"address"},{"internalType":"address","name":"_xvsStore","type":"address"}],"name":"setXvsStore","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalAllocPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalPendingWithdrawals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"vaultPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"xvsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"xvsStore","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}] diff --git a/multisig/simulations/ethereum/vip-053/index.ts b/multisig/simulations/ethereum/vip-053/index.ts new file mode 100644 index 000000000..a9f86c640 --- /dev/null +++ b/multisig/simulations/ethereum/vip-053/index.ts @@ -0,0 +1,37 @@ +import { expect } from "chai"; +import { Contract } from "ethers"; +import { ethers } from "hardhat"; +import { NETWORK_ADDRESSES } from "src/networkAddresses"; +import { forking, pretendExecutingVip } from "src/vip-framework"; + +import vip053 from "../../../proposals/ethereum/vip-053"; +import XVS_VAULT_ABI from "./abi/XVSVault.json"; + +const { ethereum } = NETWORK_ADDRESSES; + +const NORMAL_TIMELOCK = ethereum.NORMAL_TIMELOCK; + +forking(20482219, async () => { + const provider = ethers.provider; + let xvsVault: Contract; + + describe("Pre-VIP behavior", async () => { + before(async () => { + xvsVault = new ethers.Contract(ethereum.XVS_VAULT_PROXY, XVS_VAULT_ABI, provider); + }); + + it("should have no pending owner", async () => { + expect(await xvsVault.pendingAdmin()).to.equal(ethers.constants.AddressZero); + }); + }); + + describe("Post-VIP behavior", async () => { + before(async () => { + await pretendExecutingVip(await vip053()); + }); + + it("correct pending owner", async () => { + expect(await xvsVault.pendingAdmin()).to.equal(NORMAL_TIMELOCK); + }); + }); +}); \ No newline at end of file diff --git a/simulations/vip-349/abi/XVSVaultProxy.json b/simulations/vip-349/abi/XVSVaultProxy.json new file mode 100644 index 000000000..c908d481c --- /dev/null +++ b/simulations/vip-349/abi/XVSVaultProxy.json @@ -0,0 +1 @@ +[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"error","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"info","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"detail","type":"uint256"}],"name":"Failure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldImplementation","type":"address"},{"indexed":false,"internalType":"address","name":"newImplementation","type":"address"}],"name":"NewImplementation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPendingAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"NewPendingAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPendingImplementation","type":"address"},{"indexed":false,"internalType":"address","name":"newPendingImplementation","type":"address"}],"name":"NewPendingImplementation","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[],"name":"_acceptAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"_acceptImplementation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"_setPendingAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newPendingImplementation","type":"address"}],"name":"_setPendingImplementation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingXVSVaultImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}] diff --git a/simulations/vip-349/arbitrumone.ts b/simulations/vip-349/arbitrumone.ts index 9e2625d09..aceff017a 100644 --- a/simulations/vip-349/arbitrumone.ts +++ b/simulations/vip-349/arbitrumone.ts @@ -1,5 +1,4 @@ import { expect } from "chai"; -import { Contract } from "ethers"; import { ethers } from "hardhat"; import { NETWORK_ADDRESSES } from "src/networkAddresses"; import { expectEvents } from "src/utils"; @@ -8,22 +7,27 @@ import { forking, pretendExecutingVip, testForkedNetworkVipCommands } from "src/ import vip010 from "../../multisig/proposals/arbitrumone/vip-010"; import vip349 from "../../vips/vip-349/bscmainnet"; import ACCESS_CONTROL_MANAGER_ABI from "./abi/AccessControlManager_ABI.json"; +import XVS_VAULT_PROXY_ABI from "./abi/XVSVaultProxy.json"; const { arbitrumone } = NETWORK_ADDRESSES; forking(230362555, async () => { const provider = ethers.provider; + const xvsVaultProxy = new ethers.Contract(arbitrumone.XVS_VAULT_PROXY, XVS_VAULT_PROXY_ABI, provider); before(async () => { await pretendExecutingVip(await vip010()); }); - testForkedNetworkVipCommands("vip349 configures XVS Vault admin", await vip349(), { + testForkedNetworkVipCommands("vip349", await vip349(), { callbackAfterExecution: async txResponse => { - await expectEvents(txResponse, [ACCESS_CONTROL_MANAGER_ABI], ["PermissionGranted"], [10]); + await expectEvents(txResponse, [ACCESS_CONTROL_MANAGER_ABI], ["PermissionGranted"], [6]); }, }); describe("Post-VIP behaviour", async () => { + it("should have the correct pending owner", async () => { + expect(await xvsVaultProxy.admin()).to.equal(arbitrumone.NORMAL_TIMELOCK); + }); }); }); \ No newline at end of file diff --git a/simulations/vip-349/ethereum.ts b/simulations/vip-349/ethereum.ts new file mode 100644 index 000000000..8bfa6a42a --- /dev/null +++ b/simulations/vip-349/ethereum.ts @@ -0,0 +1,33 @@ +import { expect } from "chai"; +import { ethers } from "hardhat"; +import { NETWORK_ADDRESSES } from "src/networkAddresses"; +import { expectEvents } from "src/utils"; +import { forking, pretendExecutingVip, testForkedNetworkVipCommands } from "src/vip-framework"; + +import vip053 from "../../multisig/proposals/ethereum/vip-053"; +import vip349 from "../../vips/vip-349/bscmainnet"; +import ACCESS_CONTROL_MANAGER_ABI from "./abi/AccessControlManager_ABI.json"; +import XVS_VAULT_PROXY_ABI from "./abi/XVSVaultProxy.json"; + +const { ethereum } = NETWORK_ADDRESSES; + +forking(20482219, async () => { + const provider = ethers.provider; + const xvsVaultProxy = new ethers.Contract(ethereum.XVS_VAULT_PROXY, XVS_VAULT_PROXY_ABI, provider); + + before(async () => { + await pretendExecutingVip(await vip053()); + }); + + testForkedNetworkVipCommands("vip349", await vip349(), { + callbackAfterExecution: async txResponse => { + await expectEvents(txResponse, [ACCESS_CONTROL_MANAGER_ABI], ["PermissionGranted"], [6]); + }, + }); + + describe("Post-VIP behaviour", async () => { + it("should have the correct pending owner", async () => { + expect(await xvsVaultProxy.admin()).to.equal(ethereum.NORMAL_TIMELOCK); + }); + }); +}); \ No newline at end of file diff --git a/simulations/vip-350/abi/AccessControlManager_ABI.json b/simulations/vip-350/abi/AccessControlManager_ABI.json new file mode 100644 index 000000000..92a2de297 --- /dev/null +++ b/simulations/vip-350/abi/AccessControlManager_ABI.json @@ -0,0 +1,157 @@ +[ + { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "account", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "contractAddress", "type": "address" }, + { "indexed": false, "internalType": "string", "name": "functionSig", "type": "string" } + ], + "name": "PermissionGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "account", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "contractAddress", "type": "address" }, + { "indexed": false, "internalType": "string", "name": "functionSig", "type": "string" } + ], + "name": "PermissionRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, + { "indexed": true, "internalType": "bytes32", "name": "previousAdminRole", "type": "bytes32" }, + { "indexed": true, "internalType": "bytes32", "name": "newAdminRole", "type": "bytes32" } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, + { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, + { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes32", "name": "role", "type": "bytes32" }], + "name": "getRoleAdmin", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "contractAddress", "type": "address" }, + { "internalType": "string", "name": "functionSig", "type": "string" }, + { "internalType": "address", "name": "accountToPermit", "type": "address" } + ], + "name": "giveCallPermission", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "role", "type": "bytes32" }, + { "internalType": "address", "name": "account", "type": "address" } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "account", "type": "address" }, + { "internalType": "address", "name": "contractAddress", "type": "address" }, + { "internalType": "string", "name": "functionSig", "type": "string" } + ], + "name": "hasPermission", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "role", "type": "bytes32" }, + { "internalType": "address", "name": "account", "type": "address" } + ], + "name": "hasRole", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "account", "type": "address" }, + { "internalType": "string", "name": "functionSig", "type": "string" } + ], + "name": "isAllowedToCall", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "role", "type": "bytes32" }, + { "internalType": "address", "name": "account", "type": "address" } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "contractAddress", "type": "address" }, + { "internalType": "string", "name": "functionSig", "type": "string" }, + { "internalType": "address", "name": "accountToRevoke", "type": "address" } + ], + "name": "revokeCallPermission", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "bytes32", "name": "role", "type": "bytes32" }, + { "internalType": "address", "name": "account", "type": "address" } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" }], + "name": "supportsInterface", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/simulations/vip-350/abi/XVSVaultProxy.json b/simulations/vip-350/abi/XVSVaultProxy.json new file mode 100644 index 000000000..c908d481c --- /dev/null +++ b/simulations/vip-350/abi/XVSVaultProxy.json @@ -0,0 +1 @@ +[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"error","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"info","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"detail","type":"uint256"}],"name":"Failure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldImplementation","type":"address"},{"indexed":false,"internalType":"address","name":"newImplementation","type":"address"}],"name":"NewImplementation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPendingAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"NewPendingAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldPendingImplementation","type":"address"},{"indexed":false,"internalType":"address","name":"newPendingImplementation","type":"address"}],"name":"NewPendingImplementation","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[],"name":"_acceptAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"_acceptImplementation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"_setPendingAdmin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newPendingImplementation","type":"address"}],"name":"_setPendingImplementation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingXVSVaultImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}] diff --git a/simulations/vip-350/arbitrumone.ts b/simulations/vip-350/arbitrumone.ts new file mode 100644 index 000000000..60ba2e45e --- /dev/null +++ b/simulations/vip-350/arbitrumone.ts @@ -0,0 +1,25 @@ +import { expect } from "chai"; +import { ethers } from "hardhat"; +import { NETWORK_ADDRESSES } from "src/networkAddresses"; +import { expectEvents } from "src/utils"; +import { forking, pretendExecutingVip, testForkedNetworkVipCommands } from "src/vip-framework"; + +import vip010 from "../../multisig/proposals/arbitrumone/vip-010"; +import vip350 from "../../vips/vip-350/bscmainnet"; +import ACCESS_CONTROL_MANAGER_ABI from "./abi/AccessControlManager_ABI.json"; + +const { arbitrumone } = NETWORK_ADDRESSES; + +forking(230362555, async () => { + const provider = ethers.provider; + + before(async () => { + await pretendExecutingVip(await vip010()); + }); + + testForkedNetworkVipCommands("vip350", await vip350(), { + callbackAfterExecution: async txResponse => { + await expectEvents(txResponse, [ACCESS_CONTROL_MANAGER_ABI], ["PermissionGranted"], [6]); + }, + }); +}); \ No newline at end of file diff --git a/simulations/vip-350/ethereum.ts b/simulations/vip-350/ethereum.ts new file mode 100644 index 000000000..837a9c30a --- /dev/null +++ b/simulations/vip-350/ethereum.ts @@ -0,0 +1,25 @@ +import { expect } from "chai"; +import { ethers } from "hardhat"; +import { NETWORK_ADDRESSES } from "src/networkAddresses"; +import { expectEvents } from "src/utils"; +import { forking, pretendExecutingVip, testForkedNetworkVipCommands } from "src/vip-framework"; + +import vip053 from "../../multisig/proposals/ethereum/vip-053"; +import vip350 from "../../vips/vip-350/bscmainnet"; +import ACCESS_CONTROL_MANAGER_ABI from "./abi/AccessControlManager_ABI.json"; + +const { ethereum } = NETWORK_ADDRESSES; + +forking(20482317, async () => { + const provider = ethers.provider; + + before(async () => { + await pretendExecutingVip(await vip053()); + }); + + testForkedNetworkVipCommands("vip350", await vip350(), { + callbackAfterExecution: async txResponse => { + await expectEvents(txResponse, [ACCESS_CONTROL_MANAGER_ABI], ["PermissionGranted"], [6]); + }, + }); +}); \ No newline at end of file diff --git a/vips/vip-349/bscmainnet.ts b/vips/vip-349/bscmainnet.ts index 398199ae4..ab4a164ee 100644 --- a/vips/vip-349/bscmainnet.ts +++ b/vips/vip-349/bscmainnet.ts @@ -11,7 +11,7 @@ export const OPBNBMAINNET_ACM = "0xA60Deae5344F1152426cA440fb6552eA0e3005D6"; const vip349 = () => { const meta = { version: "v2", - title: "VIP-349 Accept ownership & Give permissions of XVS Vault to Normal Timelock", + title: "VIP-332 accept ownership & give permissions of oracle to Normal Timelock", description: `### Description`, forDescription: "I agree that Venus Protocol should proceed with this proposal", againstDescription: "I do not think that Venus Protocol should proceed with this proposal", @@ -26,10 +26,10 @@ const vip349 = () => { dstChainId: LzChainId.arbitrumone, }, { - target: arbitrumone.XVS_VAULT_PROXY, + target: ethereum.XVS_VAULT_PROXY, signature: "_acceptAdmin()", params: [], - dstChainId: LzChainId.arbitrumone, + dstChainId: LzChainId.ethereum, }, // Normal Timelock Permissions @@ -69,10 +69,46 @@ const vip349 = () => { params: [arbitrumone.XVS_VAULT_PROXY, "setWithdrawalLockingPeriod(address,uint256,uint256)", arbitrumone.NORMAL_TIMELOCK], dstChainId: LzChainId.arbitrumone, }, + + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "pause()", ethereum.NORMAL_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "resume()", ethereum.NORMAL_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "add(address,uint256,address,uint256,uint256)", ethereum.NORMAL_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "set(address,uint256,uint256)", ethereum.NORMAL_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "setRewardAmountPerBlockOrSecond(address,uint256)", ethereum.NORMAL_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "setWithdrawalLockingPeriod(address,uint256,uint256)", ethereum.NORMAL_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, ], meta, ProposalType.REGULAR, - ) + ); }; - export default vip349; \ No newline at end of file diff --git a/vips/vip-350/bscmainnet.ts b/vips/vip-350/bscmainnet.ts index e284f2aea..22e016aec 100644 --- a/vips/vip-350/bscmainnet.ts +++ b/vips/vip-350/bscmainnet.ts @@ -8,10 +8,18 @@ export const ARBITRUM_ONE_ACM = "0xD9dD18EB0cf10CbA837677f28A8F9Bda4bc2b157"; export const ETHEREUM_ACM = "0x230058da2D23eb8836EC5DB7037ef7250c56E25E"; export const OPBNBMAINNET_ACM = "0xA60Deae5344F1152426cA440fb6552eA0e3005D6"; -const vip349 = () => { +export const ARBITRUM_ONE_FASTTRACK_TIMELOCK = "0x2286a9B2a5246218f2fC1F380383f45BDfCE3E04"; +export const ETHEREUM_FASTTRACK_TIMELOCK = "0x8764F50616B62a99A997876C2DEAaa04554C5B2E"; +export const OPBNBMAINNET_FASTTRACK_TIMELOCK = "0xEdD04Ecef0850e834833789576A1d435e7207C0d"; + +export const ARBITRUM_ONE_CRITICAL_TIMELOCK = "0x181E4f8F21D087bF02Ea2F64D5e550849FBca674"; +export const ETHEREUM_CRITICAL_TIMELOCK = "0xeB9b85342c34F65af734C7bd4a149c86c472bC00"; +export const OPBNBMAINNET_CRITICAL_TIMELOCK = "0xA7DD2b15B24377296F11c702e758cd9141AB34AA"; + +const vip350 = () => { const meta = { version: "v2", - title: "VIP-349 Accept ownership & Give permissions of XVS Vault to Normal Timelock", + title: "VIP-332 accept ownership & give permissions of oracle to Normal Timelock", description: `### Description`, forDescription: "I agree that Venus Protocol should proceed with this proposal", againstDescription: "I do not think that Venus Protocol should proceed with this proposal", @@ -23,43 +31,83 @@ const vip349 = () => { { target: ARBITRUM_ONE_ACM, signature: "giveCallPermission(address,string,address)", - params: [arbitrumone.XVS_VAULT_PROXY, "pause()", arbitrumone.NORMAL_TIMELOCK], + params: [arbitrumone.XVS_VAULT_PROXY, "pause()", ARBITRUM_ONE_FASTTRACK_TIMELOCK], dstChainId: LzChainId.arbitrumone, }, { target: ARBITRUM_ONE_ACM, signature: "giveCallPermission(address,string,address)", - params: [arbitrumone.XVS_VAULT_PROXY, "resume()", arbitrumone.NORMAL_TIMELOCK], + params: [arbitrumone.XVS_VAULT_PROXY, "resume()", ARBITRUM_ONE_FASTTRACK_TIMELOCK], dstChainId: LzChainId.arbitrumone, }, { target: ARBITRUM_ONE_ACM, signature: "giveCallPermission(address,string,address)", - params: [arbitrumone.XVS_VAULT_PROXY, "setRewardAmountPerBlockOrSecond(address,uint256)", arbitrumone.NORMAL_TIMELOCK], + params: [arbitrumone.XVS_VAULT_PROXY, "setRewardAmountPerBlockOrSecond(address,uint256)", ARBITRUM_ONE_FASTTRACK_TIMELOCK], dstChainId: LzChainId.arbitrumone, }, + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "pause()", ETHEREUM_FASTTRACK_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "resume()", ETHEREUM_FASTTRACK_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "setRewardAmountPerBlockOrSecond(address,uint256)", ETHEREUM_FASTTRACK_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, + + // Critical Timelock Permissions { target: ARBITRUM_ONE_ACM, signature: "giveCallPermission(address,string,address)", - params: [arbitrumone.XVS_VAULT_PROXY, "pause()", arbitrumone.NORMAL_TIMELOCK], + params: [arbitrumone.XVS_VAULT_PROXY, "pause()", ARBITRUM_ONE_CRITICAL_TIMELOCK], dstChainId: LzChainId.arbitrumone, }, { target: ARBITRUM_ONE_ACM, signature: "giveCallPermission(address,string,address)", - params: [arbitrumone.XVS_VAULT_PROXY, "resume()", arbitrumone.NORMAL_TIMELOCK], + params: [arbitrumone.XVS_VAULT_PROXY, "resume()", ARBITRUM_ONE_CRITICAL_TIMELOCK], dstChainId: LzChainId.arbitrumone, }, { target: ARBITRUM_ONE_ACM, signature: "giveCallPermission(address,string,address)", - params: [arbitrumone.XVS_VAULT_PROXY, "setRewardAmountPerBlockOrSecond(address,uint256)", arbitrumone.NORMAL_TIMELOCK], + params: [arbitrumone.XVS_VAULT_PROXY, "setRewardAmountPerBlockOrSecond(address,uint256)", ARBITRUM_ONE_CRITICAL_TIMELOCK], dstChainId: LzChainId.arbitrumone, }, - ] - ) -}; -export default vip349; \ No newline at end of file + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "pause()", ETHEREUM_CRITICAL_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "resume()",ETHEREUM_CRITICAL_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, + { + target: ETHEREUM_ACM, + signature: "giveCallPermission(address,string,address)", + params: [ethereum.XVS_VAULT_PROXY, "setRewardAmountPerBlockOrSecond(address,uint256)", ETHEREUM_CRITICAL_TIMELOCK], + dstChainId: LzChainId.ethereum, + }, + ], + meta, + ProposalType.REGULAR, + ); +}; +export default vip350; \ No newline at end of file