Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: OWR V2 #153

Merged
merged 14 commits into from
Feb 3, 2025
23 changes: 23 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"semi": false,
"singleQuote": true,
"printWidth": 80,
"endOfLine": "auto",
"tabWidth": 2,
"trailingComma": "all",
"plugins": ["prettier-plugin-solidity"],
"overrides": [
{
"files": "*.sol",
"options": {
"parser": "solidity-parse",
"printWidth": 120,
"tabWidth": 2,
"useTabs": false,
"singleQuote": false,
"bracketSpacing": false
}
}
]
}

1 change: 1 addition & 0 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ remappings = [
solc_version = '0.8.19'
gas_reports = ["*"]
fs_permissions = [{ access = "read-write", path = "./"}]
evm_version = "shanghai"
KaloyanTanev marked this conversation as resolved.
Show resolved Hide resolved

[rpc_endpoints]
mainnet = "${MAINNET_RPC_URL}"
Expand Down
40 changes: 40 additions & 0 deletions script/CreateOWRV2.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "forge-std/Script.sol";
import {OptimisticWithdrawalRecipientV2Factory} from "../src/owr/OptimisticWithdrawalRecipientV2Factory.sol";

//
// This script creates a new OptimisticWithdrawalRecipientV2 contract.
// To run this script, the following environment variables must be set:
// - PRIVATE_KEY: the private key of the account that will deploy the contract
// Example usage:
// forge script script/CreateOWRecipientScript.s.sol --sig "run(address)" \
// --rpc-url https://rpc.pectra-devnet-5.ethpandaops.io/ --broadcast "<factory_address>"
//
contract CreateOWRecipientScript is Script {
function run(address deployedOWRV2Factory) external {
uint256 privKey = vm.envUint("PRIVATE_KEY");

vm.startBroadcast(privKey);

OptimisticWithdrawalRecipientV2Factory factory = OptimisticWithdrawalRecipientV2Factory(deployedOWRV2Factory);

address recoveryAddress = msg.sender;
address principalRecipient = msg.sender;
address rewardsRecipient = msg.sender;
uint256 trancheThreshold = 16 ether;
address owner = msg.sender;

// Call the createOWRecipient function
factory.createOWRecipient(
recoveryAddress,
principalRecipient,
rewardsRecipient,
trancheThreshold,
owner
);

vm.stopBroadcast();
}
}
26 changes: 26 additions & 0 deletions script/DistributeFunds.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "forge-std/Script.sol";
import {OptimisticWithdrawalRecipientV2} from "src/owr/OptimisticWithdrawalRecipientV2.sol";

//
// This script calls distributeFunds() for a OptimisticWithdrawalRecipientV2 contract.
// To run this script, the following environment variables must be set:
// - PRIVATE_KEY: the private key of the account that will deploy the contract
// Example usage:
// forge script script/DistributeFunds.s.sol --sig "run(address)" \
// --rpc-url https://rpc.pectra-devnet-5.ethpandaops.io/ --broadcast "<owrv2_address>"
//
contract DistributeFunds is Script {
function run(address deployedOWRV2) external {
uint256 privKey = vm.envUint("PRIVATE_KEY");

vm.startBroadcast(privKey);

OptimisticWithdrawalRecipientV2 owr = OptimisticWithdrawalRecipientV2(deployedOWRV2);
owr.distributeFunds();

vm.stopBroadcast();
}
}
44 changes: 44 additions & 0 deletions script/OWRV2FactoryScript.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "forge-std/Script.sol";
import {OptimisticWithdrawalRecipientV2Factory} from "src/owr/OptimisticWithdrawalRecipientV2Factory.sol";

//
// This script deploys a new OptimisticWithdrawalRecipientV2Factory contract.
// To run this script, the following environment variables must be set:
// - PRIVATE_KEY: the private key of the account that will deploy the contract
// Please set ensReverseRegistrar before running this script.
// Example usage:
// forge script script/OWRV2FactoryScript.s.sol --sig "run(string)"
// --rpc-url https://rpc.pectra-devnet-5.ethpandaops.io/ --broadcast "demo"
//
contract OWRV2FactoryScript is Script {
// From https://github.com/ethereum/EIPs/blob/d96625a4dcbbe2572fa006f062bd02b4582eefd5/EIPS/eip-7251.md#execution-layer
address constant consolidationSysContract = 0x00431F263cE400f4455c2dCf564e53007Ca4bbBb;
// From https://github.com/ethereum/EIPs/blob/d96625a4dcbbe2572fa006f062bd02b4582eefd5/EIPS/eip-7002.md#configuration
address constant withdrawalSysContract = 0x0c15F14308530b7CDB8460094BbB9cC28b9AaaAA;

// TBD
address ensReverseRegistrar = address(0x0);

function run(string calldata name) external {
uint256 privKey = vm.envUint("PRIVATE_KEY");

if (ensReverseRegistrar == address(0x0)) {
revert("ensReverseRegistrar not set");
}

vm.startBroadcast(privKey);

new OptimisticWithdrawalRecipientV2Factory{salt: keccak256(bytes(name))}(
name,
ensReverseRegistrar,
msg.sender,
consolidationSysContract,
withdrawalSysContract
);

vm.stopBroadcast();
}
}
33 changes: 33 additions & 0 deletions script/RequestConsolidation.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "forge-std/Script.sol";
import {OptimisticWithdrawalRecipientV2} from "src/owr/OptimisticWithdrawalRecipientV2.sol";

//
// This script calls requestConsolidation() for a OptimisticWithdrawalRecipientV2 contract.
// To run this script, the following environment variables must be set:
// - PRIVATE_KEY: the private key of the account that will deploy the contract
// Example usage:
// forge script script/RequestConsolidation.s.sol --sig "run(address,bytes,bytes)" \
// --rpc-url https://rpc.pectra-devnet-5.ethpandaops.io/ --broadcast \
// "<owrv2_address>" "<src_pubkey>" "<dst_pubkey>"
//
contract RequestConsolidation is Script {
function run(address owrv2, bytes calldata src, bytes calldata dst) external {
uint256 privKey = vm.envUint("PRIVATE_KEY");

vm.startBroadcast(privKey);

OptimisticWithdrawalRecipientV2 owr = OptimisticWithdrawalRecipientV2(owrv2);

// Call the function on the deployed contract
bytes[] memory sourcePubKeys = new bytes[](1);
sourcePubKeys[0] = src;

// Estimated total gas used for script: 162523
owr.requestConsolidation{value: 100 wei}(sourcePubKeys, dst);

vm.stopBroadcast();
}
}
35 changes: 35 additions & 0 deletions script/RequestWithdrawal.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "forge-std/Script.sol";
import {OptimisticWithdrawalRecipientV2} from "src/owr/OptimisticWithdrawalRecipientV2.sol";

//
// This script calls requestWithdrawal() for a OptimisticWithdrawalRecipientV2 contract.
// To run this script, the following environment variables must be set:
// - PRIVATE_KEY: the private key of the account that will deploy the contract
// Example usage:
// forge script script/RequestWithdrawal.s.sol --sig "run(address,bytes,bytes)" \
// --rpc-url https://rpc.pectra-devnet-5.ethpandaops.io/ --broadcast \
// "<owrv2_address>" "<pubkey>" "<amount_gwei>"
//
contract RequestWithdrawal is Script {
function run(address owrv2, bytes calldata pubkey, uint64 amount) external {
uint256 privKey = vm.envUint("PRIVATE_KEY");

vm.startBroadcast(privKey);

OptimisticWithdrawalRecipientV2 owr = OptimisticWithdrawalRecipientV2(owrv2);

bytes[] memory pubKeys = new bytes[](1);
pubKeys[0] = pubkey;

uint64[] memory amounts = new uint64[](1);
amounts[0] = amount;

// Estimated total gas used for script: 219325
owr.requestWithdrawal{value: 100 wei}(pubKeys, amounts);

vm.stopBroadcast();
}
}
23 changes: 23 additions & 0 deletions script/SystemContractFees.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "forge-std/Script.sol";
import "forge-std/console.sol";

contract SystemContractFees is Script {
// From https://github.com/ethereum/EIPs/blob/d96625a4dcbbe2572fa006f062bd02b4582eefd5/EIPS/eip-7251.md#execution-layer
address constant consolidationSysContract = 0x00431F263cE400f4455c2dCf564e53007Ca4bbBb;
// From https://github.com/ethereum/EIPs/blob/d96625a4dcbbe2572fa006f062bd02b4582eefd5/EIPS/eip-7002.md#configuration
address constant withdrawalSysContract = 0x0c15F14308530b7CDB8460094BbB9cC28b9AaaAA;

function run() view external {
(bool ok1, bytes memory consolidationFeeData) = consolidationSysContract.staticcall('');
require(ok1, 'Failed to get consolidation fee');

(bool ok2, bytes memory withdrawalFeeData) = withdrawalSysContract.staticcall('');
require(ok2, 'Failed to get withdrawal fee');

console.log('Consolidation Fee: ', uint256(bytes32(consolidationFeeData)));
console.log('Withdrawal Fee: ', uint256(bytes32(withdrawalFeeData)));
}
}
Loading