diff --git a/script/integration/SymbioticCoreInit.sol b/script/integration/SymbioticCoreInit.sol index 839e1de9..e515287a 100644 --- a/script/integration/SymbioticCoreInit.sol +++ b/script/integration/SymbioticCoreInit.sol @@ -14,6 +14,8 @@ import {IERC5267} from "@openzeppelin/contracts/interfaces/IERC5267.sol"; import {SafeERC20, IERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; +import {VmSafe} from "forge-std/Vm.sol"; + contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { using SafeERC20 for IERC20; using Math for uint256; @@ -51,8 +53,6 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { uint256 public SYMBIOTIC_CORE_MIN_OPERATOR_NETWORK_SHARES = 1000; uint256 public SYMBIOTIC_CORE_MAX_OPERATOR_NETWORK_SHARES = 1e18; - address public SYMBIOTIC_CORE_OWNER = address(0); - SymbioticCoreConstants.Core public symbioticCore; function run( @@ -78,22 +78,29 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { symbioticCore = SymbioticCoreConstants.core(); } else { // non-deterministic deployment (uses standard create) + (Vm.CallerMode callerMode,, address deployer) = vm.readCallers(); + if (callerMode == VmSafe.CallerMode.Broadcast) { + vm.stopBroadcast(); + } + if (callerMode != VmSafe.CallerMode.RecurrentBroadcast) { + vm.startBroadcast(deployer); + } ISymbioticVaultFactory vaultFactory = ISymbioticVaultFactory( deployCode( string.concat(SYMBIOTIC_CORE_PROJECT_ROOT, "out/VaultFactory.sol/VaultFactory.json"), - abi.encode(SYMBIOTIC_CORE_OWNER == address(0) ? address(this) : SYMBIOTIC_CORE_OWNER) + abi.encode(deployer) ) ); ISymbioticDelegatorFactory delegatorFactory = ISymbioticDelegatorFactory( deployCode( string.concat(SYMBIOTIC_CORE_PROJECT_ROOT, "out/DelegatorFactory.sol/DelegatorFactory.json"), - abi.encode(SYMBIOTIC_CORE_OWNER == address(0) ? address(this) : SYMBIOTIC_CORE_OWNER) + abi.encode(deployer) ) ); ISymbioticSlasherFactory slasherFactory = ISymbioticSlasherFactory( deployCode( string.concat(SYMBIOTIC_CORE_PROJECT_ROOT, "out/SlasherFactory.sol/SlasherFactory.json"), - abi.encode(SYMBIOTIC_CORE_OWNER == address(0) ? address(this) : SYMBIOTIC_CORE_OWNER) + abi.encode(deployer) ) ); ISymbioticNetworkRegistry networkRegistry = ISymbioticNetworkRegistry( @@ -251,6 +258,9 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { operatorNetworkOptInService: operatorNetworkOptInService, vaultConfigurator: vaultConfigurator }); + if (callerMode != VmSafe.CallerMode.RecurrentBroadcast) { + vm.stopBroadcast(); + } } } @@ -277,7 +287,11 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { function _getVault_SymbioticCore( address collateral ) internal virtual returns (address) { - address owner = tx.origin; + (Vm.CallerMode callerMode,, address owner) = vm.readCallers(); + if (callerMode == VmSafe.CallerMode.Broadcast || callerMode == VmSafe.CallerMode.RecurrentBroadcast) { + vm.stopBroadcast(); + } + uint48 epochDuration = 7 days; uint48 vetoDuration = 1 days; @@ -287,7 +301,7 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { operatorNetworkSharesSetRoleHolders[0] = owner; (address vault,,) = _createVault_SymbioticCore({ symbioticCore: symbioticCore, - who: tx.origin, + who: owner, version: 1, owner: owner, vaultParams: abi.encode( @@ -327,6 +341,9 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { }) ) }); + if (callerMode == VmSafe.CallerMode.RecurrentBroadcast) { + vm.startBroadcast(owner); + } return vault; } @@ -447,9 +464,13 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { ); } + (Vm.CallerMode callerMode,, address deployer) = vm.readCallers(); + if (callerMode == VmSafe.CallerMode.Broadcast || callerMode == VmSafe.CallerMode.RecurrentBroadcast) { + vm.stopBroadcast(); + } (address vault,,) = _createVault_SymbioticCore({ symbioticCore: symbioticCore, - who: tx.origin, + who: deployer, version: 1, owner: owner, vaultParams: vaultParams, @@ -465,6 +486,9 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { _setDepositorWhitelistStatus_SymbioticCore(owner, vault, whitelistedDepositors[i], true); } } + if (callerMode == VmSafe.CallerMode.RecurrentBroadcast) { + vm.startBroadcast(deployer); + } return vault; } @@ -512,8 +536,12 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { } uint64 slasherIndex = _randomPick_Symbiotic(slasherTypes); - return _getVault_SymbioticCore( - operators.length == 0 ? tx.origin : _randomPick_Symbiotic(operators), + (Vm.CallerMode callerMode,, address deployer) = vm.readCallers(); + if (callerMode == VmSafe.CallerMode.Broadcast || callerMode == VmSafe.CallerMode.RecurrentBroadcast) { + vm.stopBroadcast(); + } + address vault = _getVault_SymbioticCore( + operators.length == 0 ? deployer : _randomPick_Symbiotic(operators), collateral, 0x000000000000000000000000000000000000dEaD, epochDuration, @@ -526,6 +554,10 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { slasherIndex, vetoDuration ); + if (callerMode == VmSafe.CallerMode.RecurrentBroadcast) { + vm.startBroadcast(deployer); + } + return vault; } function _vaultValidating_SymbioticCore(address vault, bytes32 subnetwork) internal virtual returns (bool) { diff --git a/script/integration/SymbioticInit.sol b/script/integration/SymbioticInit.sol index 1582cbff..bdcf55b9 100644 --- a/script/integration/SymbioticInit.sol +++ b/script/integration/SymbioticInit.sol @@ -101,15 +101,31 @@ contract SymbioticInit is Script, SymbioticCounter { } function _deal_Symbiotic(address token, address to, uint256 give) public virtual { - vm.startBroadcast(tx.origin); + (Vm.CallerMode callerMode,, address txOrigin) = vm.readCallers(); + if (callerMode == VmSafe.CallerMode.Broadcast) { + vm.stopBroadcast(); + } + if (callerMode != VmSafe.CallerMode.RecurrentBroadcast) { + vm.startBroadcast(txOrigin); + } IERC20(token).safeTransfer(to, give); - vm.stopBroadcast(); + if (callerMode != VmSafe.CallerMode.RecurrentBroadcast) { + vm.stopBroadcast(); + } } function _deal_Symbiotic(address to, uint256 give) public virtual { - vm.startBroadcast(tx.origin); + (Vm.CallerMode callerMode,, address txOrigin) = vm.readCallers(); + if (callerMode == VmSafe.CallerMode.Broadcast) { + vm.stopBroadcast(); + } + if (callerMode != VmSafe.CallerMode.RecurrentBroadcast) { + vm.startBroadcast(txOrigin); + } to.call{value: give}(""); - vm.stopBroadcast(); + if (callerMode != VmSafe.CallerMode.RecurrentBroadcast) { + vm.stopBroadcast(); + } } function _vmWalletToAddress_Symbiotic( diff --git a/script/integration/examples/OnboardNetwork.s.sol b/script/integration/examples/OnboardNetwork.s.sol index c7fdfd3a..c0feecbe 100644 --- a/script/integration/examples/OnboardNetwork.s.sol +++ b/script/integration/examples/OnboardNetwork.s.sol @@ -41,7 +41,8 @@ contract OnboardNetworkScript is SymbioticCoreInit { SYMBIOTIC_CORE_DELEGATOR_TYPES = [0, 2]; - address NETWORK = tx.origin; + (,, address txOrigin) = vm.readCallers(); + address NETWORK = txOrigin; uint96 IDENTIFIER = 0; bytes32 SUBNETWORK = NETWORK.subnetwork(IDENTIFIER); address COLLATERAL = SymbioticCoreConstants.wstETH(); @@ -51,13 +52,13 @@ contract OnboardNetworkScript is SymbioticCoreInit { super.run(seed); if (COLLATERAL == SymbioticCoreConstants.wstETH()) { - uint256 balanceBefore = IERC20(COLLATERAL).balanceOf(tx.origin); + uint256 balanceBefore = IERC20(COLLATERAL).balanceOf(txOrigin); uint256 requiredAmount = _normalizeForToken_Symbiotic(SYMBIOTIC_CORE_TOKENS_TO_SET_TIMES_1e18, COLLATERAL) * SYMBIOTIC_CORE_NUMBER_OF_STAKERS; if (balanceBefore < requiredAmount) { address stETH = IwstETH(COLLATERAL).stETH(); uint256 toSend = IwstETH(COLLATERAL).getStETHByWstETH(requiredAmount - balanceBefore) * 101 / 100; - vm.startBroadcast(tx.origin); + vm.startBroadcast(txOrigin); stETH.call{value: toSend}(""); IERC20(stETH).forceApprove(COLLATERAL, toSend); IwstETH(COLLATERAL).wrap(toSend); diff --git a/test/integration/SymbioticCoreInit.sol b/test/integration/SymbioticCoreInit.sol index aaeb162e..9f2ac012 100644 --- a/test/integration/SymbioticCoreInit.sol +++ b/test/integration/SymbioticCoreInit.sol @@ -51,8 +51,6 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { uint256 public SYMBIOTIC_CORE_MIN_OPERATOR_NETWORK_SHARES = 1000; uint256 public SYMBIOTIC_CORE_MAX_OPERATOR_NETWORK_SHARES = 1e18; - address public SYMBIOTIC_CORE_OWNER = address(0); - SymbioticCoreConstants.Core public symbioticCore; function setUp() public virtual override { @@ -76,22 +74,29 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { symbioticCore = SymbioticCoreConstants.core(); } else { // non-deterministic deployment (uses standard create) + (VmSafe.CallerMode callerMode,, address deployer) = vm.readCallers(); + if (callerMode == VmSafe.CallerMode.Prank) { + vm.stopPrank(); + } + if (callerMode != VmSafe.CallerMode.RecurrentPrank) { + vm.startPrank(deployer); + } ISymbioticVaultFactory vaultFactory = ISymbioticVaultFactory( deployCode( string.concat(SYMBIOTIC_CORE_PROJECT_ROOT, "out/VaultFactory.sol/VaultFactory.json"), - abi.encode(SYMBIOTIC_CORE_OWNER == address(0) ? address(this) : SYMBIOTIC_CORE_OWNER) + abi.encode(deployer) ) ); ISymbioticDelegatorFactory delegatorFactory = ISymbioticDelegatorFactory( deployCode( string.concat(SYMBIOTIC_CORE_PROJECT_ROOT, "out/DelegatorFactory.sol/DelegatorFactory.json"), - abi.encode(SYMBIOTIC_CORE_OWNER == address(0) ? address(this) : SYMBIOTIC_CORE_OWNER) + abi.encode(deployer) ) ); ISymbioticSlasherFactory slasherFactory = ISymbioticSlasherFactory( deployCode( string.concat(SYMBIOTIC_CORE_PROJECT_ROOT, "out/SlasherFactory.sol/SlasherFactory.json"), - abi.encode(SYMBIOTIC_CORE_OWNER == address(0) ? address(this) : SYMBIOTIC_CORE_OWNER) + abi.encode(deployer) ) ); ISymbioticNetworkRegistry networkRegistry = ISymbioticNetworkRegistry( @@ -249,6 +254,9 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { operatorNetworkOptInService: operatorNetworkOptInService, vaultConfigurator: vaultConfigurator }); + if (callerMode != VmSafe.CallerMode.RecurrentPrank) { + vm.stopPrank(); + } } } @@ -275,7 +283,11 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { function _getVault_SymbioticCore( address collateral ) internal virtual returns (address) { - address owner = address(this); + (Vm.CallerMode callerMode,, address owner) = vm.readCallers(); + if (callerMode == VmSafe.CallerMode.Prank || callerMode == VmSafe.CallerMode.RecurrentPrank) { + vm.stopPrank(); + } + uint48 epochDuration = 7 days; uint48 vetoDuration = 1 days; @@ -285,7 +297,7 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { operatorNetworkSharesSetRoleHolders[0] = owner; (address vault,,) = _createVault_SymbioticCore({ symbioticCore: symbioticCore, - who: address(this), + who: owner, version: 1, owner: owner, vaultParams: abi.encode( @@ -325,6 +337,9 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { }) ) }); + if (callerMode == VmSafe.CallerMode.RecurrentPrank) { + vm.startPrank(owner); + } return vault; } @@ -445,9 +460,13 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { ); } + (Vm.CallerMode callerMode,, address deployer) = vm.readCallers(); + if (callerMode == VmSafe.CallerMode.Prank || callerMode == VmSafe.CallerMode.RecurrentPrank) { + vm.stopPrank(); + } (address vault,,) = _createVault_SymbioticCore({ symbioticCore: symbioticCore, - who: address(this), + who: deployer, version: 1, owner: owner, vaultParams: vaultParams, @@ -463,6 +482,9 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { _setDepositorWhitelistStatus_SymbioticCore(owner, vault, whitelistedDepositors[i], true); } } + if (callerMode == VmSafe.CallerMode.RecurrentPrank) { + vm.startPrank(owner); + } return vault; } @@ -510,8 +532,12 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { } uint64 slasherIndex = _randomPick_Symbiotic(slasherTypes); - return _getVault_SymbioticCore( - operators.length == 0 ? address(this) : _randomPick_Symbiotic(operators), + (Vm.CallerMode callerMode,, address deployer) = vm.readCallers(); + if (callerMode == VmSafe.CallerMode.Prank || callerMode == VmSafe.CallerMode.RecurrentPrank) { + vm.stopPrank(); + } + address vault = _getVault_SymbioticCore( + operators.length == 0 ? deployer : _randomPick_Symbiotic(operators), collateral, 0x000000000000000000000000000000000000dEaD, epochDuration, @@ -524,6 +550,10 @@ contract SymbioticCoreInit is SymbioticInit, SymbioticCoreBindings { slasherIndex, vetoDuration ); + if (callerMode == VmSafe.CallerMode.RecurrentPrank) { + vm.startPrank(deployer); + } + return vault; } function _vaultValidating_SymbioticCore(address vault, bytes32 subnetwork) internal virtual returns (bool) {