From ab39bad61bd3557ed89b4cb42c2b5070854148e9 Mon Sep 17 00:00:00 2001 From: Rayerleier <1045643889@qq.com> Date: Mon, 2 Dec 2024 16:43:52 +0800 Subject: [PATCH] fixed: vault and network mixed up in NetworkMiddleware.sol --- script/Setup.sol | 62 ++++++++--------- script/SetupNetworkMiddleware.sol | 112 +++++++++++++++--------------- src/iBTC_NetworkMiddleware.sol | 10 ++- test/iBTC_NetworkMiddleware.t.sol | 47 +++++++++---- 4 files changed, 127 insertions(+), 104 deletions(-) diff --git a/script/Setup.sol b/script/Setup.sol index 9700e1a..2136db7 100644 --- a/script/Setup.sol +++ b/script/Setup.sol @@ -1,38 +1,38 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.25; +// // SPDX-License-Identifier: UNLICENSED +// pragma solidity 0.8.25; -import {Script} from "forge-std/Script.sol"; -import {NetworkMiddleware} from "src/iBTC_NetworkMiddleware.sol"; +// import {Script} from "forge-std/Script.sol"; +// import {NetworkMiddleware} from "src/iBTC_NetworkMiddleware.sol"; -contract Setup is Script { - function run( - address network, - address owner, - uint48 epochDuration, - address[] memory vaults, - address[] memory operators, - bytes32[] memory keys, - address operatorRegistry, - address vaultRegistry, - address operatorNetworkOptIn - ) external { - require(operators.length == keys.length, "inconsistent length"); - vm.startBroadcast(); +// contract Setup is Script { +// function run( +// address network, +// address owner, +// uint48 epochDuration, +// address[] memory vaults, +// address[] memory operators, +// bytes32[] memory keys, +// address operatorRegistry, +// address vaultRegistry, +// address operatorNetworkOptIn +// ) external { +// require(operators.length == keys.length, "inconsistent length"); +// vm.startBroadcast(); - uint48 minSlashingWindow = epochDuration; // we dont use this +// uint48 minSlashingWindow = epochDuration; // we dont use this - NetworkMiddleware middleware = new NetworkMiddleware( - network, operatorRegistry, vaultRegistry, operatorNetworkOptIn, owner, epochDuration, minSlashingWindow - ); +// NetworkMiddleware middleware = new NetworkMiddleware( +// network, operatorRegistry, vaultRegistry, operatorNetworkOptIn, owner, epochDuration, minSlashingWindow +// ); - for (uint256 i = 0; i < vaults.length; ++i) { - middleware.registerVault(vaults[i]); - } +// for (uint256 i = 0; i < vaults.length; ++i) { +// middleware.registerVault(vaults[i]); +// } - for (uint256 i = 0; i < operators.length; ++i) { - middleware.registerOperator(operators[i], keys[i]); - } +// for (uint256 i = 0; i < operators.length; ++i) { +// middleware.registerOperator(operators[i], keys[i]); +// } - vm.stopBroadcast(); - } -} +// vm.stopBroadcast(); +// } +// } diff --git a/script/SetupNetworkMiddleware.sol b/script/SetupNetworkMiddleware.sol index 913dbee..7d041fe 100644 --- a/script/SetupNetworkMiddleware.sol +++ b/script/SetupNetworkMiddleware.sol @@ -1,56 +1,56 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity 0.8.25; - -import {Script} from "forge-std/Script.sol"; -import {NetworkMiddleware} from "src/iBTC_NetworkMiddleware.sol"; - -contract SetupNetworkMiddleware is Script { - // Using anvil's default addresses - address constant NETWORK = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; // first address - address constant OWNER = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; // second address - uint48 constant EPOCH_DURATION = 7 days; - uint48 constant SLASHING_WINDOW = 8 days; - - // Registry addresses (Sepolia) - address constant OPERATOR_REGISTRY = 0x6F75a4ffF97326A00e52662d82EA4FdE86a2C548; - address constant NETWORK_REGISTRY = 0x7d03b7343BF8d5cEC7C0C27ecE084a20113D15C9; - address constant NETWORK_OPTIN = 0x58973d16FFA900D11fC22e5e2B6840d9f7e13401; - - // Initial operators and their keys (if any) - address[] operators; - bytes32[] keys; - - // Initial vaults (if any) - address[] vaults; - - function setUp() public { - // Add any initial operators and their keys - // operators.push(address(0)); - // keys.push(bytes32(0)); - - // Add any initial vaults - // vaults.push(address(0)); - } - - function run() external { - require(operators.length == keys.length, "inconsistent length"); - require(NETWORK != address(0), "set network address"); - require(OWNER != address(0), "set owner address"); - - vm.startBroadcast(); - - NetworkMiddleware middleware = new NetworkMiddleware( - NETWORK, OPERATOR_REGISTRY, NETWORK_REGISTRY, NETWORK_OPTIN, OWNER, EPOCH_DURATION, SLASHING_WINDOW - ); - - for (uint256 i = 0; i < vaults.length; ++i) { - middleware.registerVault(vaults[i]); - } - - for (uint256 i = 0; i < operators.length; ++i) { - middleware.registerOperator(operators[i], keys[i]); - } - - vm.stopBroadcast(); - } -} +// // SPDX-License-Identifier: UNLICENSED +// pragma solidity 0.8.25; + +// import {Script} from "forge-std/Script.sol"; +// import {NetworkMiddleware} from "src/iBTC_NetworkMiddleware.sol"; + +// contract SetupNetworkMiddleware is Script { +// // Using anvil's default addresses +// address constant NETWORK = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; // first address +// address constant OWNER = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; // second address +// uint48 constant EPOCH_DURATION = 7 days; +// uint48 constant SLASHING_WINDOW = 8 days; + +// // Registry addresses (Sepolia) +// address constant OPERATOR_REGISTRY = 0x6F75a4ffF97326A00e52662d82EA4FdE86a2C548; +// address constant NETWORK_REGISTRY = 0x7d03b7343BF8d5cEC7C0C27ecE084a20113D15C9; +// address constant NETWORK_OPTIN = 0x58973d16FFA900D11fC22e5e2B6840d9f7e13401; + +// // Initial operators and their keys (if any) +// address[] operators; +// bytes32[] keys; + +// // Initial vaults (if any) +// address[] vaults; + +// function setUp() public { +// // Add any initial operators and their keys +// // operators.push(address(0)); +// // keys.push(bytes32(0)); + +// // Add any initial vaults +// // vaults.push(address(0)); +// } + +// function run() external { +// require(operators.length == keys.length, "inconsistent length"); +// require(NETWORK != address(0), "set network address"); +// require(OWNER != address(0), "set owner address"); + +// vm.startBroadcast(); + +// NetworkMiddleware middleware = new NetworkMiddleware( +// NETWORK, OPERATOR_REGISTRY, NETWORK_REGISTRY, NETWORK_OPTIN, OWNER, EPOCH_DURATION, SLASHING_WINDOW +// ); + +// for (uint256 i = 0; i < vaults.length; ++i) { +// middleware.registerVault(vaults[i]); +// } + +// for (uint256 i = 0; i < operators.length; ++i) { +// middleware.registerOperator(operators[i], keys[i]); +// } + +// vm.stopBroadcast(); +// } +// } diff --git a/src/iBTC_NetworkMiddleware.sol b/src/iBTC_NetworkMiddleware.sol index 7e0cbbb..763e551 100644 --- a/src/iBTC_NetworkMiddleware.sol +++ b/src/iBTC_NetworkMiddleware.sol @@ -31,6 +31,7 @@ contract NetworkMiddleware is SimpleKeyRegistry32, Ownable { error OperatorNotRegistred(); error OperarorGracePeriodNotPassed(); error OperatorAlreadyRegistred(); + error OperatorNotEnoughStaked(); error VaultAlreadyRegistred(); error VaultEpochTooShort(); @@ -50,8 +51,10 @@ contract NetworkMiddleware is SimpleKeyRegistry32, Ownable { address public immutable NETWORK; address public immutable OPERATOR_REGISTRY; + address public immutable NETWORK_REGISTRY; address public immutable VAULT_REGISTRY; address public immutable OPERATOR_NET_OPTIN; + address public immutable OPERATOR_VAULT_OPTIN; address public immutable OWNER; uint48 public immutable EPOCH_DURATION; uint48 public immutable SLASHING_WINDOW; @@ -62,7 +65,7 @@ contract NetworkMiddleware is SimpleKeyRegistry32, Ownable { mapping(uint48 => uint256) public totalStakeCache; mapping(uint48 => bool) public totalStakeCached; - mapping(uint48 => mapping(address => uint256)) public operatorStakeCache; + mapping(uint48 epoch => mapping(address operator => uint256 amounts)) public operatorStakeCache; EnumerableMap.AddressToUintMap private operators; EnumerableMap.AddressToUintMap private vaults; @@ -78,8 +81,10 @@ contract NetworkMiddleware is SimpleKeyRegistry32, Ownable { constructor( address _network, address _operatorRegistry, + address _networkRegistry, address _vaultRegistry, address _operatorNetOptin, + address _operatorVaultOptin, address _owner, uint48 _epochDuration, uint48 _slashingWindow @@ -93,6 +98,7 @@ contract NetworkMiddleware is SimpleKeyRegistry32, Ownable { NETWORK = _network; OWNER = _owner; OPERATOR_REGISTRY = _operatorRegistry; + NETWORK_REGISTRY = _networkRegistry; VAULT_REGISTRY = _vaultRegistry; OPERATOR_NET_OPTIN = _operatorNetOptin; SLASHING_WINDOW = _slashingWindow; @@ -154,7 +160,6 @@ contract NetworkMiddleware is SimpleKeyRegistry32, Ownable { } updateKey(operator, key); - operators.add(operator); operators.enable(operator); } @@ -191,6 +196,7 @@ contract NetworkMiddleware is SimpleKeyRegistry32, Ownable { operators.remove(operator); } + // NOTICE: WHY we need to register Vautl? should it be network? function registerVault( address vault ) external onlyOwner { diff --git a/test/iBTC_NetworkMiddleware.t.sol b/test/iBTC_NetworkMiddleware.t.sol index 8469edf..010078f 100644 --- a/test/iBTC_NetworkMiddleware.t.sol +++ b/test/iBTC_NetworkMiddleware.t.sol @@ -29,12 +29,13 @@ contract iBTC_NetworkMiddlewareTest is Test { address constant VAULT_FACTORY = 0x407A039D94948484D356eFB765b3c74382A050B4; address constant DELEGATOR_FACTORY = 0x890CA3f95E0f40a79885B7400926544B2214B03f; address constant SLASHER_FACTORY = 0xbf34bf75bb779c383267736c53a4ae86ac7bB299; - address constant OPERATOR_NET_OPTIN = 0x58973d16FFA900D11fC22e5e2B6840d9f7e13401; + address constant NEWTORK_OPTIN_SERVICE = 0x58973d16FFA900D11fC22e5e2B6840d9f7e13401; + address constant VAULT_OPTIN_SERVICE = 0x95CC0a052ae33941877c9619835A233D21D57351; uint256 constant MAX_WITHDRAW_AMOUNT = 1e9; uint256 constant MIN_WITHDRAW_AMOUNT = 1e4; - address constant NETWORK = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; - address constant OWNER = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; + address constant NETWORK = 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266; // first address network should be a multisig contract + address constant OWNER = 0x70997970C51812dc3A010C7d01b50e0d17dc79C8; // second address uint48 constant EPOCH_DURATION = 7 days; // uint48 constant NETWORK_EPOCH = 5 days; uint48 constant SLASHING_WINDOW = 7 days; @@ -45,6 +46,8 @@ contract iBTC_NetworkMiddlewareTest is Test { address[] vaults; + OptInService network_optIn_service; + OptInService vault_optIn_service; NetworkMiddleware public iBTC_middleware; BurnerRouter public burner; VaultConfigurator public vaultConfigurator; @@ -131,27 +134,33 @@ contract iBTC_NetworkMiddlewareTest is Test { } vm.stopPrank(); - vm.prank(vault_); - NetworkRegistry(NETWORK_REGISTRY).registerNetwork(); - // vm.prank(NETWORK); + network_optIn_service = OptInService(NEWTORK_OPTIN_SERVICE); + vault_optIn_service = OptInService(VAULT_OPTIN_SERVICE); + //NOTICE + // vm.prank(vault_); // NetworkRegistry(NETWORK_REGISTRY).registerNetwork(); + vm.prank(NETWORK); + NetworkRegistry(NETWORK_REGISTRY).registerNetwork(); vaults.push(vault_); vm.startPrank(OWNER); iBTC_middleware = new NetworkMiddleware( - vault_, OPERATOR_REGISTRY, NETWORK_REGISTRY, OPERATOR_NET_OPTIN, OWNER, EPOCH_DURATION, SLASHING_WINDOW + NETWORK, + OPERATOR_REGISTRY, + NETWORK_REGISTRY, + VAULT_FACTORY, + NEWTORK_OPTIN_SERVICE, + VAULT_OPTIN_SERVICE, + OWNER, + EPOCH_DURATION, + SLASHING_WINDOW ); - for (uint256 i = 0; i < vaults.length; ++i) { - iBTC_middleware.registerVault(vaults[i]); - } - for (uint256 i = 0; i < operators.length; ++i) { - iBTC_middleware.registerOperator(operators[i], keys[i]); - } vm.stopPrank(); console.log("Vault: ", vault_); console.log("Delegator: ", delegator_); console.log("Slasher: ", slasher_); + assertEq(IVault(vault_).slasher(), slasher_); vm.startPrank(address(iBTC_middleware)); NetworkRegistry(NETWORK_REGISTRY).registerNetwork(); @@ -164,7 +173,7 @@ contract iBTC_NetworkMiddlewareTest is Test { bytes32 key = keccak256(abi.encodePacked("operator_key")); vm.startPrank(operator); OperatorRegistry(OPERATOR_REGISTRY).registerOperator(); - OptInService(OPERATOR_NET_OPTIN).optIn(vaults[0]); + network_optIn_service.optIn(NETWORK); vm.stopPrank(); vm.startPrank(OWNER); iBTC_middleware.registerOperator(operator, key); @@ -197,7 +206,6 @@ contract iBTC_NetworkMiddlewareTest is Test { function testRegisterVault() public { vm.startPrank(OWNER); - vm.expectRevert(); iBTC_middleware.registerVault(vaults[0]); bool isVaultRegistered = iBTC_middleware.isVaultRegistered(vaults[0]); @@ -207,6 +215,7 @@ contract iBTC_NetworkMiddlewareTest is Test { } function testPauseAndUnpauseVault() public { + testRegisterVault(); vm.startPrank(OWNER); iBTC_middleware.pauseVault(vaults[0]); @@ -233,6 +242,7 @@ contract iBTC_NetworkMiddlewareTest is Test { uint48 epoch = iBTC_middleware.getCurrentEpoch(); vm.startPrank(address(iBTC_middleware)); + // NOTE figure out how to stake some into it. iBTC_middleware.calcAndCacheStakes(epoch); vm.stopPrank(); @@ -248,4 +258,11 @@ contract iBTC_NetworkMiddlewareTest is Test { vm.stopPrank(); } + + function testOptInVault() public { + testRegisterOperator(); + address operator = address(0x1234); + vm.prank(operator); + vault_optIn_service.optIn(vaults[0]); + } }