Skip to content

Commit 9730610

Browse files
committed
feat: add crosschain risk config configuration for testnet
1 parent d6b0336 commit 9730610

File tree

9 files changed

+1363
-1
lines changed

9 files changed

+1363
-1
lines changed

simulations/vip-xxx/abi/OmnichainGovernanceExecutor.json

Lines changed: 539 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
2+
import { impersonateAccount, setBalance } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai";
3+
import { Contract, BigNumber } from "ethers";
4+
import { ethers, } from "hardhat";
5+
import { expectEvents } from "src/utils";
6+
import { forking, pretendExecutingVip, testForkedNetworkVipCommands } from "src/vip-framework";
7+
import { parseUnits } from "ethers/lib/utils";
8+
9+
import vipxxx, { ACCESS_CONTROL_MANAGER_ARBITRUMSEPOLIA, ANY_TARGET_CONTRACT, MARKET_CAP_RISK_STEWARD_ARBITRUMSEPOLIA } from "../../vips/vip-xxx/bsctestnet-crosschain";
10+
import { NETWORK_ADDRESSES } from "src/networkAddresses";
11+
import ACCESS_CONTROL_MANAGER_ABI from "./abi/AccessControlManager.json";
12+
import VENUS_RISK_STEWARD_RECEIVER_ABI from "./abi/VenusRiskStewardReceiver.json";
13+
import ISOLATED_POOL_COMPTROLLER_ABI from "./abi/IsolatedPoolComptroller.json";
14+
import OMNICHAIN_GOVERNANCE_EXECUTOR_ABI from "./abi/OmnichainGovernanceExecutor.json";
15+
16+
const { arbitrumsepolia } = NETWORK_ADDRESSES;
17+
18+
19+
forking(130235955, async () => {
20+
const provider = ethers.provider;
21+
let executor: Contract;
22+
let lastProposalReceived: BigNumber;
23+
const acm = new ethers.Contract(
24+
ACCESS_CONTROL_MANAGER_ARBITRUMSEPOLIA,
25+
ACCESS_CONTROL_MANAGER_ABI,
26+
provider,
27+
);
28+
29+
const isolatedPoolComptroller = new ethers.Contract(
30+
'0x006D44b6f5927b3eD83bD0c1C36Fb1A3BaCaC208',
31+
ISOLATED_POOL_COMPTROLLER_ABI,
32+
provider,
33+
);
34+
35+
before(async () => {
36+
executor = new ethers.Contract(
37+
arbitrumsepolia.OMNICHAIN_GOVERNANCE_EXECUTOR,
38+
OMNICHAIN_GOVERNANCE_EXECUTOR_ABI,
39+
provider,
40+
);
41+
42+
lastProposalReceived = await executor.lastProposalReceived();
43+
await pretendExecutingVip(await vipxxx());
44+
});
45+
46+
testForkedNetworkVipCommands("vipxxx Configuring Risk Stewards", await vipxxx(), {
47+
callbackAfterExecution: async txResponse => {
48+
await expectEvents(
49+
txResponse,
50+
[ACCESS_CONTROL_MANAGER_ABI, VENUS_RISK_STEWARD_RECEIVER_ABI],
51+
["PermissionGranted", "RiskParameterConfigSet"],
52+
[3, 2],
53+
);
54+
},
55+
});
56+
57+
describe("Post-VIP behavior", () => {
58+
59+
it("Proposal id should be incremented", async () => {
60+
expect(await executor.lastProposalReceived()).to.be.equals(lastProposalReceived.add(1));
61+
});
62+
63+
it("proposal should be executed", async () => {
64+
const pId = await executor.lastProposalReceived();
65+
expect(await executor.state(pId)).to.be.equals(2);
66+
});
67+
68+
it("Grants timelock permissions to setRiskParameterConfig on Market Cap Risk Steward", async () => {
69+
const supplyCapRole = ethers.utils.solidityPack(
70+
["address", "string"],
71+
[ANY_TARGET_CONTRACT, "setMarketSupplyCaps(address[],uint256[])"],
72+
);
73+
const supplyCapRoleHash = ethers.utils.keccak256(supplyCapRole);
74+
expect(await acm.hasRole(supplyCapRoleHash, MARKET_CAP_RISK_STEWARD_ARBITRUMSEPOLIA)).to.be.true;
75+
76+
const borrowCapRole = ethers.utils.solidityPack(
77+
["address", "string"],
78+
[ANY_TARGET_CONTRACT, "setMarketSupplyCaps(address[],uint256[])"],
79+
);
80+
const borrowCapRoleHash = ethers.utils.keccak256(borrowCapRole);
81+
expect(await acm.hasRole(borrowCapRoleHash, MARKET_CAP_RISK_STEWARD_ARBITRUMSEPOLIA)).to.be.true;
82+
});
83+
84+
it("Market Cap Risk Steward should be able to set supply and borrow caps on markets", async () => {
85+
await impersonateAccount(MARKET_CAP_RISK_STEWARD_ARBITRUMSEPOLIA);
86+
await setBalance(MARKET_CAP_RISK_STEWARD_ARBITRUMSEPOLIA, parseUnits("1000000", 18));
87+
88+
await expect(isolatedPoolComptroller.connect(await ethers.getSigner(MARKET_CAP_RISK_STEWARD_ARBITRUMSEPOLIA))
89+
.setMarketSupplyCaps(['0xdEFbf0F9Ab6CdDd0a1FdDC894b358D0c0a39B052'], ['160000000000']))
90+
.to.emit(isolatedPoolComptroller, "NewSupplyCap");
91+
await expect(isolatedPoolComptroller.connect(await ethers.getSigner(MARKET_CAP_RISK_STEWARD_ARBITRUMSEPOLIA))
92+
.setMarketBorrowCaps(['0xdEFbf0F9Ab6CdDd0a1FdDC894b358D0c0a39B052'], ['150000000000']))
93+
.to.emit(isolatedPoolComptroller, "NewBorrowCap");
94+
});
95+
});
96+
});

simulations/vip-xxx/basesepolia.ts

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
2+
import { impersonateAccount, setBalance } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai";
3+
import { ethers } from "hardhat";
4+
import { Contract, BigNumber } from "ethers";
5+
import { expectEvents } from "src/utils";
6+
import { forking, pretendExecutingVip, testForkedNetworkVipCommands } from "src/vip-framework";
7+
import { parseUnits } from "ethers/lib/utils";
8+
9+
import vipxxx, { ACCESS_CONTROL_MANAGER_BASESEPOLIA, ANY_TARGET_CONTRACT, MARKET_CAP_RISK_STEWARD_BASESEPOLIA } from "../../vips/vip-xxx/bsctestnet-crosschain";
10+
import { NETWORK_ADDRESSES } from "src/networkAddresses";
11+
import ACCESS_CONTROL_MANAGER_ABI from "./abi/AccessControlManager.json";
12+
import VENUS_RISK_STEWARD_RECEIVER_ABI from "./abi/VenusRiskStewardReceiver.json";
13+
import ISOLATED_POOL_COMPTROLLER_ABI from "./abi/IsolatedPoolComptroller.json";
14+
import OMNICHAIN_GOVERNANCE_EXECUTOR_ABI from "./abi/OmnichainGovernanceExecutor.json";
15+
16+
const { basesepolia } = NETWORK_ADDRESSES;
17+
18+
19+
forking(22799683, async () => {
20+
const provider = ethers.provider;
21+
let executor: Contract;
22+
let lastProposalReceived: BigNumber;
23+
const acm = new ethers.Contract(
24+
ACCESS_CONTROL_MANAGER_BASESEPOLIA,
25+
ACCESS_CONTROL_MANAGER_ABI,
26+
provider,
27+
);
28+
29+
const isolatedPoolComptroller = new ethers.Contract(
30+
'0x272795dd6c5355CF25765F36043F34014454Eb5b',
31+
ISOLATED_POOL_COMPTROLLER_ABI,
32+
provider,
33+
);
34+
35+
before(async () => {
36+
executor = new ethers.Contract(
37+
basesepolia.OMNICHAIN_GOVERNANCE_EXECUTOR,
38+
OMNICHAIN_GOVERNANCE_EXECUTOR_ABI,
39+
provider,
40+
);
41+
42+
lastProposalReceived = await executor.lastProposalReceived();
43+
await pretendExecutingVip(await vipxxx());
44+
});
45+
46+
testForkedNetworkVipCommands("vipxxx Configuring Risk Stewards", await vipxxx(), {
47+
callbackAfterExecution: async txResponse => {
48+
await expectEvents(
49+
txResponse,
50+
[ACCESS_CONTROL_MANAGER_ABI, VENUS_RISK_STEWARD_RECEIVER_ABI],
51+
["PermissionGranted", "RiskParameterConfigSet"],
52+
[3, 2],
53+
);
54+
},
55+
});
56+
57+
describe("Post-VIP behavior", () => {
58+
59+
it("Proposal id should be incremented", async () => {
60+
expect(await executor.lastProposalReceived()).to.be.equals(lastProposalReceived.add(1));
61+
});
62+
63+
it("proposal should be executed", async () => {
64+
const pId = await executor.lastProposalReceived();
65+
expect(await executor.state(pId)).to.be.equals(2);
66+
});
67+
68+
it("Grants timelock permissions to setRiskParameterConfig on Market Cap Risk Steward", async () => {
69+
const supplyCapRole = ethers.utils.solidityPack(
70+
["address", "string"],
71+
[ANY_TARGET_CONTRACT, "setMarketSupplyCaps(address[],uint256[])"],
72+
);
73+
const supplyCapRoleHash = ethers.utils.keccak256(supplyCapRole);
74+
expect(await acm.hasRole(supplyCapRoleHash, MARKET_CAP_RISK_STEWARD_BASESEPOLIA)).to.be.true;
75+
76+
const borrowCapRole = ethers.utils.solidityPack(
77+
["address", "string"],
78+
[ANY_TARGET_CONTRACT, "setMarketSupplyCaps(address[],uint256[])"],
79+
);
80+
const borrowCapRoleHash = ethers.utils.keccak256(borrowCapRole);
81+
expect(await acm.hasRole(borrowCapRoleHash, MARKET_CAP_RISK_STEWARD_BASESEPOLIA)).to.be.true;
82+
});
83+
84+
it("Market Cap Risk Steward should be able to set supply and borrow caps on markets", async () => {
85+
await impersonateAccount(MARKET_CAP_RISK_STEWARD_BASESEPOLIA);
86+
await setBalance(MARKET_CAP_RISK_STEWARD_BASESEPOLIA, parseUnits("1000000", 18));
87+
88+
await expect(isolatedPoolComptroller.connect(await ethers.getSigner(MARKET_CAP_RISK_STEWARD_BASESEPOLIA))
89+
.setMarketSupplyCaps(['0xA31D67c056Aadc2501535f2776bF1157904f810e'], ['180000000000']))
90+
.to.emit(isolatedPoolComptroller, "NewSupplyCap");
91+
await expect(isolatedPoolComptroller.connect(await ethers.getSigner(MARKET_CAP_RISK_STEWARD_BASESEPOLIA))
92+
.setMarketBorrowCaps(['0xA31D67c056Aadc2501535f2776bF1157904f810e'], ['150000000000']))
93+
.to.emit(isolatedPoolComptroller, "NewBorrowCap");
94+
});
95+
});
96+
});

simulations/vip-xxx/opbnbtestnet.ts

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
2+
import { impersonateAccount, setBalance } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai";
3+
import { ethers } from "hardhat";
4+
import { Contract, BigNumber } from "ethers";
5+
import { expectEvents } from "src/utils";
6+
import { forking, pretendExecutingVip, testForkedNetworkVipCommands } from "src/vip-framework";
7+
import { parseUnits } from "ethers/lib/utils";
8+
9+
import vipxxx, { ACCESS_CONTROL_MANAGER_OPBNBTESTNET, ANY_TARGET_CONTRACT, MARKET_CAP_RISK_STEWARD_OPBNBTESTNET } from "../../vips/vip-xxx/bsctestnet-crosschain";
10+
import { NETWORK_ADDRESSES } from "src/networkAddresses";
11+
import ACCESS_CONTROL_MANAGER_ABI from "./abi/AccessControlManager.json";
12+
import VENUS_RISK_STEWARD_RECEIVER_ABI from "./abi/VenusRiskStewardReceiver.json";
13+
import ISOLATED_POOL_COMPTROLLER_ABI from "./abi/IsolatedPoolComptroller.json";
14+
import OMNICHAIN_GOVERNANCE_EXECUTOR_ABI from "./abi/OmnichainGovernanceExecutor.json";
15+
16+
const { opbnbtestnet } = NETWORK_ADDRESSES;
17+
18+
19+
forking(54487051, async () => {
20+
const provider = ethers.provider;
21+
let executor: Contract;
22+
let lastProposalReceived: BigNumber;
23+
const acm = new ethers.Contract(
24+
ACCESS_CONTROL_MANAGER_OPBNBTESTNET,
25+
ACCESS_CONTROL_MANAGER_ABI,
26+
provider,
27+
);
28+
29+
const isolatedPoolComptroller = new ethers.Contract(
30+
'0x2FCABb31E57F010D623D8d68e1E18Aed11d5A388',
31+
ISOLATED_POOL_COMPTROLLER_ABI,
32+
provider,
33+
);
34+
35+
before(async () => {
36+
executor = new ethers.Contract(
37+
opbnbtestnet.OMNICHAIN_GOVERNANCE_EXECUTOR,
38+
OMNICHAIN_GOVERNANCE_EXECUTOR_ABI,
39+
provider,
40+
);
41+
42+
lastProposalReceived = await executor.lastProposalReceived();
43+
await pretendExecutingVip(await vipxxx());
44+
});
45+
46+
testForkedNetworkVipCommands("vipxxx Configuring Risk Stewards", await vipxxx(), {
47+
callbackAfterExecution: async txResponse => {
48+
await expectEvents(
49+
txResponse,
50+
[ACCESS_CONTROL_MANAGER_ABI, VENUS_RISK_STEWARD_RECEIVER_ABI],
51+
["PermissionGranted", "RiskParameterConfigSet"],
52+
[3, 2],
53+
);
54+
},
55+
});
56+
57+
describe("Post-VIP behavior", () => {
58+
59+
it("Proposal id should be incremented", async () => {
60+
expect(await executor.lastProposalReceived()).to.be.equals(lastProposalReceived.add(1));
61+
});
62+
63+
it("proposal should be executed", async () => {
64+
const pId = await executor.lastProposalReceived();
65+
expect(await executor.state(pId)).to.be.equals(2);
66+
});
67+
68+
it("Grants timelock permissions to setRiskParameterConfig on Market Cap Risk Steward", async () => {
69+
const supplyCapRole = ethers.utils.solidityPack(
70+
["address", "string"],
71+
[ANY_TARGET_CONTRACT, "setMarketSupplyCaps(address[],uint256[])"],
72+
);
73+
const supplyCapRoleHash = ethers.utils.keccak256(supplyCapRole);
74+
expect(await acm.hasRole(supplyCapRoleHash, MARKET_CAP_RISK_STEWARD_OPBNBTESTNET)).to.be.true;
75+
76+
const borrowCapRole = ethers.utils.solidityPack(
77+
["address", "string"],
78+
[ANY_TARGET_CONTRACT, "setMarketSupplyCaps(address[],uint256[])"],
79+
);
80+
const borrowCapRoleHash = ethers.utils.keccak256(borrowCapRole);
81+
expect(await acm.hasRole(borrowCapRoleHash, MARKET_CAP_RISK_STEWARD_OPBNBTESTNET)).to.be.true;
82+
});
83+
84+
it("Market Cap Risk Steward should be able to set supply and borrow caps on markets", async () => {
85+
await impersonateAccount(MARKET_CAP_RISK_STEWARD_OPBNBTESTNET);
86+
await setBalance(MARKET_CAP_RISK_STEWARD_OPBNBTESTNET, parseUnits("1000000", 18));
87+
88+
await expect(isolatedPoolComptroller.connect(await ethers.getSigner(MARKET_CAP_RISK_STEWARD_OPBNBTESTNET))
89+
.setMarketSupplyCaps(['0xe3923805f6E117E51f5387421240a86EF1570abC'], ['15000000000000000000000000']))
90+
.to.emit(isolatedPoolComptroller, "NewSupplyCap");
91+
await expect(isolatedPoolComptroller.connect(await ethers.getSigner(MARKET_CAP_RISK_STEWARD_OPBNBTESTNET))
92+
.setMarketBorrowCaps(['0xe3923805f6E117E51f5387421240a86EF1570abC'], ['9500000000000000000000000']))
93+
.to.emit(isolatedPoolComptroller, "NewBorrowCap");
94+
});
95+
});
96+
});

simulations/vip-xxx/opsepolia.ts

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
2+
import { impersonateAccount, setBalance } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai";
3+
import { ethers } from "hardhat";
4+
import { Contract, BigNumber } from "ethers";
5+
import { expectEvents } from "src/utils";
6+
import { forking, pretendExecutingVip, testForkedNetworkVipCommands } from "src/vip-framework";
7+
import { parseUnits } from "ethers/lib/utils";
8+
9+
import vipxxx, { ACCESS_CONTROL_MANAGER_OPSEPOLIA, ANY_TARGET_CONTRACT, MARKET_CAP_RISK_STEWARD_OPSEPOLIA } from "../../vips/vip-xxx/bsctestnet-crosschain";
10+
import { NETWORK_ADDRESSES } from "src/networkAddresses";
11+
import ACCESS_CONTROL_MANAGER_ABI from "./abi/AccessControlManager.json";
12+
import VENUS_RISK_STEWARD_RECEIVER_ABI from "./abi/VenusRiskStewardReceiver.json";
13+
import ISOLATED_POOL_COMPTROLLER_ABI from "./abi/IsolatedPoolComptroller.json";
14+
import OMNICHAIN_GOVERNANCE_EXECUTOR_ABI from "./abi/OmnichainGovernanceExecutor.json";
15+
16+
const { opsepolia } = NETWORK_ADDRESSES;
17+
18+
19+
forking(24782602, async () => {
20+
const provider = ethers.provider;
21+
let executor: Contract;
22+
let lastProposalReceived: BigNumber;
23+
const acm = new ethers.Contract(
24+
ACCESS_CONTROL_MANAGER_OPSEPOLIA,
25+
ACCESS_CONTROL_MANAGER_ABI,
26+
provider,
27+
);
28+
29+
const isolatedPoolComptroller = new ethers.Contract(
30+
'0x59d10988974223B042767aaBFb6D926863069535',
31+
ISOLATED_POOL_COMPTROLLER_ABI,
32+
provider,
33+
);
34+
35+
before(async () => {
36+
executor = new ethers.Contract(
37+
opsepolia.OMNICHAIN_GOVERNANCE_EXECUTOR,
38+
OMNICHAIN_GOVERNANCE_EXECUTOR_ABI,
39+
provider,
40+
);
41+
42+
lastProposalReceived = await executor.lastProposalReceived();
43+
await pretendExecutingVip(await vipxxx());
44+
});
45+
46+
testForkedNetworkVipCommands("vipxxx Configuring Risk Stewards", await vipxxx(), {
47+
callbackAfterExecution: async txResponse => {
48+
await expectEvents(
49+
txResponse,
50+
[ACCESS_CONTROL_MANAGER_ABI, VENUS_RISK_STEWARD_RECEIVER_ABI],
51+
["PermissionGranted", "RiskParameterConfigSet"],
52+
[3, 2],
53+
);
54+
},
55+
});
56+
57+
describe("Post-VIP behavior", () => {
58+
59+
it("Proposal id should be incremented", async () => {
60+
expect(await executor.lastProposalReceived()).to.be.equals(lastProposalReceived.add(1));
61+
});
62+
63+
it("proposal should be executed", async () => {
64+
const pId = await executor.lastProposalReceived();
65+
expect(await executor.state(pId)).to.be.equals(2);
66+
});
67+
68+
it("Grants timelock permissions to setRiskParameterConfig on Market Cap Risk Steward", async () => {
69+
const supplyCapRole = ethers.utils.solidityPack(
70+
["address", "string"],
71+
[ANY_TARGET_CONTRACT, "setMarketSupplyCaps(address[],uint256[])"],
72+
);
73+
const supplyCapRoleHash = ethers.utils.keccak256(supplyCapRole);
74+
expect(await acm.hasRole(supplyCapRoleHash, MARKET_CAP_RISK_STEWARD_OPSEPOLIA)).to.be.true;
75+
76+
const borrowCapRole = ethers.utils.solidityPack(
77+
["address", "string"],
78+
[ANY_TARGET_CONTRACT, "setMarketSupplyCaps(address[],uint256[])"],
79+
);
80+
const borrowCapRoleHash = ethers.utils.keccak256(borrowCapRole);
81+
expect(await acm.hasRole(borrowCapRoleHash, MARKET_CAP_RISK_STEWARD_OPSEPOLIA)).to.be.true;
82+
});
83+
84+
it("Market Cap Risk Steward should be able to set supply and borrow caps on markets", async () => {
85+
await impersonateAccount(MARKET_CAP_RISK_STEWARD_OPSEPOLIA);
86+
await setBalance(MARKET_CAP_RISK_STEWARD_OPSEPOLIA, parseUnits("1000000", 18));
87+
88+
await expect(isolatedPoolComptroller.connect(await ethers.getSigner(MARKET_CAP_RISK_STEWARD_OPSEPOLIA))
89+
.setMarketSupplyCaps(['0x2419606690B08060ebFd7581e0a6Ae45f1915ee9'], ['180000000000']))
90+
.to.emit(isolatedPoolComptroller, "NewSupplyCap");
91+
await expect(isolatedPoolComptroller.connect(await ethers.getSigner(MARKET_CAP_RISK_STEWARD_OPSEPOLIA))
92+
.setMarketBorrowCaps(['0x2419606690B08060ebFd7581e0a6Ae45f1915ee9'], ['150000000000']))
93+
.to.emit(isolatedPoolComptroller, "NewBorrowCap");
94+
});
95+
});
96+
});

0 commit comments

Comments
 (0)