Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
[submodule "lib/forge-std"]
path = lib/forge-std
url = https://github.com/foundry-rs/forge-std
[submodule "lib/openzeppelin-contracts"]
path = lib/openzeppelin-contracts
url = https://github.com/OpenZeppelin/openzeppelin-contracts
[submodule "lib/openzeppelin-contracts-upgradeable"]
path = lib/openzeppelin-contracts-upgradeable
url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable
[submodule "lib/openzeppelin-contracts"]
path = lib/openzeppelin-contracts
url = https://github.com/OpenZeppelin/openzeppelin-contracts
17 changes: 13 additions & 4 deletions foundry.lock
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
{
"lib/forge-std": {
"rev": "8e40513d678f392f398620b3ef2b418648b33e89"
"tag": {
"name": "v1.12.0",
"rev": "7117c90c8cf6c68e5acce4f09a6b24715cea4de6"
}
},
"lib/openzeppelin-contracts": {
"rev": "dbb6104ce834628e473d2173bbc9d47f81a9eec3"
"tag": {
"name": "v5.4.0",
"rev": "c64a1edb67b6e3f4a15cca8909c9482ad33a02b0"
}
},
"lib/openzeppelin-contracts-upgradeable": {
"rev": "723f8cab09cdae1aca9ec9cc1cfa040c2d4b06c1"
"tag": {
"name": "v5.4.0",
"rev": "e725abddf1e01cf05ace496e950fc8e243cc7cab"
}
}
}
}
2 changes: 1 addition & 1 deletion lib/openzeppelin-contracts
2 changes: 1 addition & 1 deletion lib/openzeppelin-contracts-upgradeable
22 changes: 22 additions & 0 deletions script/test/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Script Test Harness

## Universal_Delegator

### Start Anvil

```bash
anvil --chain-id 31337
```

Copy the private key of Anvil account #0 from the Anvil output.

### Deploy a UniversalDelegator for the UI

```bash
forge script script/test/UniversalDelegator.s.sol:UniversalDelegatorUiSetup \
--rpc-url http://127.0.0.1:8545 \
--private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
--broadcast
```

The script prints `UniversalDelegator instance (proxy)` — paste that address into the UI configurator.
109 changes: 109 additions & 0 deletions script/test/UniversalDelegator.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {Script} from "forge-std/Script.sol";
import {console2} from "forge-std/console2.sol";

import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";

import {Registry} from "../../src/contracts/common/Registry.sol";
import {UniversalDelegator} from "../../src/contracts/delegator/UniversalDelegator.sol";

import {IBaseDelegator} from "../../src/interfaces/delegator/IBaseDelegator.sol";
import {IUniversalDelegator} from "../../src/interfaces/delegator/IUniversalDelegator.sol";
import {IEntity} from "../../src/interfaces/common/IEntity.sol";

contract MutableRegistry is Registry {
function addEntity(address entity_) external {
_addEntity(entity_);
}
}

contract MockOptInService {
function isOptedInAt(address, address, uint48, bytes calldata) external pure returns (bool) {
return true;
}

function isOptedIn(address, address) external pure returns (bool) {
return true;
}
}

contract MockVaultForUniversalDelegator {
uint256 public activeStake;
uint48 public epochDurationInit;
uint48 public epochDuration;
address public slasher;

constructor(uint256 activeStake_, uint48 epochDuration_, address slasher_) {
activeStake = activeStake_;
epochDurationInit = uint48(block.timestamp);
epochDuration = epochDuration_;
slasher = slasher_;
}

function activeStakeAt(uint48, bytes memory) external view returns (uint256) {
return activeStake;
}

function setActiveStake(uint256 nextActiveStake) external {
activeStake = nextActiveStake;
}
}

// Local UI setup (anvil):
// forge script script/test/UniversalDelegator.s.sol:UniversalDelegatorUiSetup --rpc-url http://127.0.0.1:8545 --private-key <ANVIL_KEY> --broadcast
contract UniversalDelegatorUiSetup is Script {
function run() external {
vm.startBroadcast();
(,, address broadcaster) = vm.readCallers();

MutableRegistry registry = new MutableRegistry();
MockOptInService optInService = new MockOptInService();

MockVaultForUniversalDelegator vault = new MockVaultForUniversalDelegator({
activeStake_: 1000 ether, epochDuration_: 1 days, slasher_: address(0)
});
registry.addEntity(address(vault));

UniversalDelegator implementation = new UniversalDelegator({
networkRegistry: address(registry),
vaultFactory: address(registry),
operatorVaultOptInService: address(optInService),
operatorNetworkOptInService: address(optInService),
delegatorFactory: address(0),
entityType: 0
});

IBaseDelegator.BaseParams memory baseParams = IBaseDelegator.BaseParams({
defaultAdminRoleHolder: broadcaster, hook: address(0), hookSetRoleHolder: broadcaster
});
IUniversalDelegator.InitParams memory initParams = IUniversalDelegator.InitParams({
baseParams: baseParams,
createSlotRoleHolder: broadcaster,
setIsSharedRoleHolder: broadcaster,
setSizeRoleHolder: broadcaster,
setShareRoleHolder: broadcaster,
swapSlotsRoleHolder: broadcaster,
assignNetworkRoleHolder: broadcaster,
unassignNetworkRoleHolder: broadcaster,
assignOperatorRoleHolder: broadcaster,
unassignOperatorRoleHolder: broadcaster
});

bytes memory initCalldata =
abi.encodeCall(IEntity.initialize, (abi.encode(address(vault), abi.encode(initParams))));
ERC1967Proxy delegatorProxy = new ERC1967Proxy(address(implementation), initCalldata);
address delegator = address(delegatorProxy);

vm.stopBroadcast();

console2.log("Role holder/admin:", broadcaster);
console2.log("Vault (mock):", address(vault));
console2.log("Vault activeStake:", vault.activeStake());
console2.log("Vault epochDuration:", uint256(vault.epochDuration()));
console2.log("VaultFactory registry (mock):", address(registry));
console2.log("UniversalDelegator implementation:", address(implementation));
console2.log("UniversalDelegator instance (proxy):", delegator);
}
}
20 changes: 8 additions & 12 deletions script/utils/interfaces/ICreateX.sol
Original file line number Diff line number Diff line change
Expand Up @@ -77,12 +77,10 @@ interface ICreateX {
payable
returns (address newContract);

function deployCreate2AndInit(
bytes memory initCode,
bytes memory data,
Values memory values,
address refundAddress
) external payable returns (address newContract);
function deployCreate2AndInit(bytes memory initCode, bytes memory data, Values memory values, address refundAddress)
external
payable
returns (address newContract);

function deployCreate2AndInit(bytes memory initCode, bytes memory data, Values memory values)
external
Expand Down Expand Up @@ -124,12 +122,10 @@ interface ICreateX {
payable
returns (address newContract);

function deployCreate3AndInit(
bytes memory initCode,
bytes memory data,
Values memory values,
address refundAddress
) external payable returns (address newContract);
function deployCreate3AndInit(bytes memory initCode, bytes memory data, Values memory values, address refundAddress)
external
payable
returns (address newContract);

function deployCreate3AndInit(bytes memory initCode, bytes memory data, Values memory values)
external
Expand Down
Loading