Skip to content

Commit

Permalink
Merge pull request #434 from VenusProtocol/feat/lbtc
Browse files Browse the repository at this point in the history
[VEN-2940]: Add simulations for LBTC support
  • Loading branch information
kkirka authored Dec 5, 2024
2 parents 7dde94d + b32655d commit 12b3ddc
Show file tree
Hide file tree
Showing 18 changed files with 5,762 additions and 4 deletions.
28 changes: 28 additions & 0 deletions multisig/proposals/ethereum/vip-071/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { parseUnits } from "ethers/lib/utils";
import { NETWORK_ADDRESSES } from "src/networkAddresses";
import { makeProposal } from "src/utils";

const { VTREASURY, NORMAL_TIMELOCK } = NETWORK_ADDRESSES.ethereum;

export const LBTC = "0x8236a87084f8B84306f72007F36F2618A5634494";
export const WBTC = "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599";
export const WBTC_RECEIVER = "0xCb09Ab3F6254437d225Ed3CABEBe0949782E2372";
const INITIAL_SUPPLY = parseUnits("0.106", 8);
const WBTC_TO_TRANSFER = parseUnits("0.006", 8);

export const vip071 = () => {
return makeProposal([
{
target: VTREASURY,
signature: "withdrawTreasuryToken(address,uint256,address)",
params: [LBTC, INITIAL_SUPPLY, NORMAL_TIMELOCK],
},
{
target: VTREASURY,
signature: "withdrawTreasuryToken(address,uint256,address)",
params: [WBTC, WBTC_TO_TRANSFER, WBTC_RECEIVER],
},
]);
};

export default vip071;
295 changes: 295 additions & 0 deletions multisig/simulations/ethereum/vip-071/abi/erc20.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,295 @@
[
{
"inputs": [
{ "internalType": "string", "name": "name_", "type": "string" },
{ "internalType": "string", "name": "symbol_", "type": "string" }
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "address", "name": "owner", "type": "address" },
{ "indexed": true, "internalType": "address", "name": "spender", "type": "address" },
{ "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" }
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{ "indexed": false, "internalType": "address", "name": "userAddress", "type": "address" },
{ "indexed": false, "internalType": "address payable", "name": "relayerAddress", "type": "address" },
{ "indexed": false, "internalType": "bytes", "name": "functionSignature", "type": "bytes" }
],
"name": "MetaTransactionExecuted",
"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"
},
{
"anonymous": false,
"inputs": [
{ "indexed": true, "internalType": "address", "name": "from", "type": "address" },
{ "indexed": true, "internalType": "address", "name": "to", "type": "address" },
{ "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" }
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "ERC712_VERSION",
"outputs": [{ "internalType": "string", "name": "", "type": "string" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "PREDICATE_ROLE",
"outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "owner", "type": "address" },
{ "internalType": "address", "name": "spender", "type": "address" }
],
"name": "allowance",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "spender", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "approve",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [{ "internalType": "address", "name": "account", "type": "address" }],
"name": "balanceOf",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "spender", "type": "address" },
{ "internalType": "uint256", "name": "subtractedValue", "type": "uint256" }
],
"name": "decreaseAllowance",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "userAddress", "type": "address" },
{ "internalType": "bytes", "name": "functionSignature", "type": "bytes" },
{ "internalType": "bytes32", "name": "sigR", "type": "bytes32" },
{ "internalType": "bytes32", "name": "sigS", "type": "bytes32" },
{ "internalType": "uint8", "name": "sigV", "type": "uint8" }
],
"name": "executeMetaTransaction",
"outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "getChainId",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "pure",
"type": "function"
},
{
"inputs": [],
"name": "getDomainSeperator",
"outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [{ "internalType": "address", "name": "user", "type": "address" }],
"name": "getNonce",
"outputs": [{ "internalType": "uint256", "name": "nonce", "type": "uint256" }],
"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": "bytes32", "name": "role", "type": "bytes32" },
{ "internalType": "uint256", "name": "index", "type": "uint256" }
],
"name": "getRoleMember",
"outputs": [{ "internalType": "address", "name": "", "type": "address" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [{ "internalType": "bytes32", "name": "role", "type": "bytes32" }],
"name": "getRoleMemberCount",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "bytes32", "name": "role", "type": "bytes32" },
{ "internalType": "address", "name": "account", "type": "address" }
],
"name": "grantRole",
"outputs": [],
"stateMutability": "nonpayable",
"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": "spender", "type": "address" },
{ "internalType": "uint256", "name": "addedValue", "type": "uint256" }
],
"name": "increaseAllowance",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "user", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "mint",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [{ "internalType": "string", "name": "", "type": "string" }],
"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": "bytes32", "name": "role", "type": "bytes32" },
{ "internalType": "address", "name": "account", "type": "address" }
],
"name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [{ "internalType": "string", "name": "", "type": "string" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "recipient", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "transfer",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{ "internalType": "address", "name": "sender", "type": "address" },
{ "internalType": "address", "name": "recipient", "type": "address" },
{ "internalType": "uint256", "name": "amount", "type": "uint256" }
],
"name": "transferFrom",
"outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
"stateMutability": "nonpayable",
"type": "function"
}
]
37 changes: 37 additions & 0 deletions multisig/simulations/ethereum/vip-071/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { expect } from "chai";
import { BigNumber } from "ethers";
import { parseUnits } from "ethers/lib/utils";
import { ethers } from "hardhat";
import { NETWORK_ADDRESSES } from "src/networkAddresses";
import { forking, pretendExecutingVip } from "src/vip-framework";

import vip071, { LBTC, WBTC, WBTC_RECEIVER } from "../../../proposals/ethereum/vip-071";
import ERC20_ABI from "./abi/erc20.json";

const { NORMAL_TIMELOCK, VTREASURY } = NETWORK_ADDRESSES.ethereum;

forking(21285800, async () => {
const lbtc = new ethers.Contract(LBTC, ERC20_ABI, ethers.provider);
const wbtc = new ethers.Contract(WBTC, ERC20_ABI, ethers.provider);
let wbtcReceiverBalanceBefore: BigNumber;

before(async () => {
wbtcReceiverBalanceBefore = await wbtc.balanceOf(WBTC_RECEIVER);
});

describe("Post-VIP behavior", async () => {
before(async () => {
await pretendExecutingVip(await vip071());
});

it("transfers initial supply from treasury to normal timelock", async () => {
expect(await lbtc.balanceOf(NORMAL_TIMELOCK)).to.equal(parseUnits("0.106", 8));
expect(await lbtc.balanceOf(VTREASURY)).to.equal(0);
});

it(`transfers 0.006 WBTC to ${WBTC_RECEIVER}`, async () => {
const wbtcReceiverBalanceAfter = await wbtc.balanceOf(WBTC_RECEIVER);
expect(wbtcReceiverBalanceAfter.sub(wbtcReceiverBalanceBefore)).to.equal(parseUnits("0.006", 8));
});
});
});
Loading

0 comments on commit 12b3ddc

Please sign in to comment.