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

Validator Pricer Logic #260

Merged
merged 7 commits into from
Jun 1, 2024
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
2 changes: 1 addition & 1 deletion foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ optimizer = true
optimizer_runs = 200
seed = "0x1337" # uncomment / change when debugging fuzz tests
# via_ir = true
solc = "0.8.24"
solc = "0.8.26"
evm_version = "cancun"

[fmt]
Expand Down
2 changes: 1 addition & 1 deletion lib/pufETH
5 changes: 5 additions & 0 deletions script/DeployProtocolToMainnet.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import { PufferProtocolDeployment } from "./DeploymentStructs.sol";
import { SetupAccess } from "script/SetupAccess.s.sol";
import { OperationsCoordinator } from "puffer/OperationsCoordinator.sol";
import { AVSContractsRegistry } from "puffer/AVSContractsRegistry.sol";
import { ValidatorTicketPricer } from "puffer/ValidatorTicketPricer.sol";

/**
* // Check that the simulation
Expand Down Expand Up @@ -62,6 +63,7 @@ contract DeployProtocolToMainnet is Script {
ERC1967Proxy validatorTicketProxy;

AVSContractsRegistry aVSContractsRegistry;
ValidatorTicketPricer validatorTicketPricer;

// Lido
address ST_ETH = 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84;
Expand Down Expand Up @@ -118,6 +120,8 @@ contract DeployProtocolToMainnet is Script {
operationsCoordinator =
new OperationsCoordinator(PufferOracleV2(oracle), address(accessManager), BPS_VT_UPDATE_PRICE_TOLERANCE);

validatorTicketPricer = new ValidatorTicketPricer(PufferOracleV2(oracle), address(accessManager));

// Implementation of ValidatorTicket
validatorTicketImplementation = new ValidatorTicket({
guardianModule: payable(address(module)),
Expand Down Expand Up @@ -200,6 +204,7 @@ contract DeployProtocolToMainnet is Script {
moduleManager: address(moduleManagerProxy),
enclaveVerifier: address(verifier),
validatorTicket: address(validatorTicketProxy),
validatorTicketPricer: address(validatorTicketPricer),
pufferOracle: address(oracle),
operationsCoordinator: address(operationsCoordinator),
aVSContractsRegistry: address(aVSContractsRegistry),
Expand Down
4 changes: 4 additions & 0 deletions script/DeployPuffer.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { PufferVaultV2 } from "pufETH/PufferVaultV2.sol";
import { UpgradeableBeacon } from "openzeppelin/proxy/beacon/UpgradeableBeacon.sol";
import { GuardiansDeployment, PufferProtocolDeployment } from "./DeploymentStructs.sol";
import { ValidatorTicket } from "puffer/ValidatorTicket.sol";
import { ValidatorTicketPricer } from "puffer/ValidatorTicketPricer.sol";
import { OperationsCoordinator } from "puffer/OperationsCoordinator.sol";
import { PufferOracleV2 } from "puffer/PufferOracleV2.sol";
import { IPufferOracleV2 } from "puffer/interface/IPufferOracleV2.sol";
Expand Down Expand Up @@ -52,6 +53,7 @@ contract DeployPuffer is BaseScript {
UpgradeableBeacon restakingOperatorBeacon;
PufferModuleManager moduleManager;
OperationsCoordinator operationsCoordinator;
ValidatorTicketPricer validatorTicketPricer;
AVSContractsRegistry aVSContractsRegistry;

address eigenPodManager;
Expand Down Expand Up @@ -91,6 +93,7 @@ contract DeployPuffer is BaseScript {
}

operationsCoordinator = new OperationsCoordinator(PufferOracleV2(oracle), address(accessManager), 500); // 500 BPS = 5%
validatorTicketPricer = new ValidatorTicketPricer(PufferOracleV2(oracle), address(accessManager));

validatorTicketProxy = new ERC1967Proxy(address(new NoImplementation()), "");
ValidatorTicket validatorTicketImplementation = new ValidatorTicket({
Expand Down Expand Up @@ -178,6 +181,7 @@ contract DeployPuffer is BaseScript {
// return (pufferProtocol, pool, accessManager);
return PufferProtocolDeployment({
validatorTicket: address(validatorTicketProxy),
validatorTicketPricer: address(validatorTicketPricer),
pufferProtocolImplementation: address(pufferProtocolImpl),
pufferProtocol: address(proxy),
guardianModule: guardiansDeployment.guardianModule,
Expand Down
1 change: 1 addition & 0 deletions script/DeploymentStructs.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ struct PufferProtocolDeployment {
address restakingOperatorBeacon; // Beacon for Restaking Operator
address moduleManager;
address validatorTicket;
address validatorTicketPricer;
address pufferOracle;
address operationsCoordinator;
address aVSContractsRegistry;
Expand Down
114 changes: 90 additions & 24 deletions script/SetupAccess.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@ import { PufferProtocolDeployment } from "./DeploymentStructs.sol";
import { ValidatorTicket } from "puffer/ValidatorTicket.sol";
import { PufferVaultV2 } from "pufETH/PufferVaultV2.sol";
import { OperationsCoordinator } from "puffer/OperationsCoordinator.sol";
import { ValidatorTicketPricer } from "puffer/ValidatorTicketPricer.sol";
import { GenerateAccessManagerCallData } from "pufETHScript/GenerateAccessManagerCallData.sol";
import {
ROLE_ID_OPERATIONS_MULTISIG,
ROLE_ID_OPERATIONS_PAYMASTER,
ROLE_ID_PUFFER_PROTOCOL,
ROLE_ID_DAO,
ROLE_ID_OPERATIONS_COORDINATOR
ROLE_ID_OPERATIONS_COORDINATOR,
ROLE_ID_VT_PRICER
} from "pufETHScript/Roles.sol";

contract SetupAccess is BaseScript {
Expand All @@ -43,7 +45,8 @@ contract SetupAccess is BaseScript {
pufferOracleAccess: _setupPufferOracleAccess(),
moduleManagerAccess: _setupPufferModuleManagerAccess(),
roleLabels: _labelRoles(),
coordinatorAccess: _setupCoordinatorAccess()
coordinatorAccess: _setupCoordinatorAccess(),
validatorTicketAccess: _setupValidatorTicketPricerAccess()
});

bytes memory multicallData = abi.encodeCall(Multicall.multicall, (calldatas));
Expand Down Expand Up @@ -71,42 +74,50 @@ contract SetupAccess is BaseScript {
bytes[] memory pufferOracleAccess,
bytes[] memory moduleManagerAccess,
bytes[] memory roleLabels,
bytes[] memory coordinatorAccess
bytes[] memory coordinatorAccess,
bytes[] memory validatorTicketAccess
) internal view returns (bytes[] memory calldatas) {
calldatas = new bytes[](26);
calldatas = new bytes[](32);
calldatas[0] = _setupGuardianModuleRoles();
calldatas[1] = _setupEnclaveVerifierRoles();
calldatas[2] = rolesCalldatas[0];
calldatas[3] = rolesCalldatas[1];
calldatas[4] = rolesCalldatas[2];
calldatas[5] = rolesCalldatas[3];
calldatas[6] = rolesCalldatas[4];
calldatas[7] = rolesCalldatas[5];
calldatas[8] = rolesCalldatas[6];

calldatas[7] = pufferProtocolRoles[0];
calldatas[8] = pufferProtocolRoles[1];
calldatas[9] = pufferProtocolRoles[2];
calldatas[9] = pufferProtocolRoles[0];
calldatas[10] = pufferProtocolRoles[1];
calldatas[11] = pufferProtocolRoles[2];

calldatas[10] = validatorTicketRoles[0];
calldatas[11] = validatorTicketRoles[1];
calldatas[12] = validatorTicketRoles[0];
calldatas[13] = validatorTicketRoles[1];

calldatas[12] = vaultMainnetAccess[0];
calldatas[13] = vaultMainnetAccess[1];
calldatas[14] = vaultMainnetAccess[0];
calldatas[15] = vaultMainnetAccess[1];

calldatas[14] = pufferOracleAccess[0];
calldatas[15] = pufferOracleAccess[1];
calldatas[16] = pufferOracleAccess[2];
calldatas[16] = pufferOracleAccess[0];
calldatas[17] = pufferOracleAccess[1];
calldatas[18] = pufferOracleAccess[2];

calldatas[17] = moduleManagerAccess[0];
calldatas[18] = moduleManagerAccess[1];
calldatas[19] = moduleManagerAccess[2];
calldatas[19] = moduleManagerAccess[0];
calldatas[20] = moduleManagerAccess[1];
calldatas[21] = moduleManagerAccess[2];

calldatas[20] = roleLabels[0];
calldatas[21] = roleLabels[1];
calldatas[22] = roleLabels[2];
calldatas[23] = roleLabels[3];
calldatas[22] = roleLabels[0];
calldatas[23] = roleLabels[1];
calldatas[24] = roleLabels[2];
calldatas[25] = roleLabels[3];

calldatas[24] = coordinatorAccess[0];
calldatas[25] = coordinatorAccess[1];
calldatas[26] = coordinatorAccess[0];
calldatas[27] = coordinatorAccess[1];

calldatas[28] = validatorTicketAccess[0];
calldatas[29] = validatorTicketAccess[1];
calldatas[30] = validatorTicketAccess[2];
calldatas[31] = validatorTicketAccess[3];
}

function _labelRoles() internal pure returns (bytes[] memory) {
Expand Down Expand Up @@ -359,8 +370,57 @@ contract SetupAccess is BaseScript {
return calldatas;
}

function _setupValidatorTicketPricerAccess() internal view returns (bytes[] memory) {
bytes[] memory calldatas = new bytes[](4);

bytes4[] memory operationsSelectors = new bytes4[](2);
operationsSelectors[0] = ValidatorTicketPricer.setDailyMevPayoutsChangeToleranceBps.selector;
operationsSelectors[1] = ValidatorTicketPricer.setDailyConsensusRewardsChangeToleranceBps.selector;

calldatas[0] = abi.encodeWithSelector(
AccessManager.setTargetFunctionRole.selector,
pufferDeployment.validatorTicketPricer,
operationsSelectors,
ROLE_ID_OPERATIONS_MULTISIG
);

bytes4[] memory daoSelectors = new bytes4[](1);
daoSelectors[0] = ValidatorTicketPricer.setDiscountRate.selector;

calldatas[1] = abi.encodeWithSelector(
AccessManager.setTargetFunctionRole.selector,
pufferDeployment.validatorTicketPricer,
daoSelectors,
ROLE_ID_DAO
);

bytes4[] memory paymasterSelectors = new bytes4[](3);
WalidOfNow marked this conversation as resolved.
Show resolved Hide resolved
paymasterSelectors[0] = ValidatorTicketPricer.setDailyMevPayouts.selector;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You forgot to rename the variable.

paymasterSelectors[1] = ValidatorTicketPricer.setDailyConsensusRewards.selector;
paymasterSelectors[2] = ValidatorTicketPricer.setDailyRewardsAndPostMintPrice.selector;

calldatas[2] = abi.encodeWithSelector(
AccessManager.setTargetFunctionRole.selector,
pufferDeployment.validatorTicketPricer,
paymasterSelectors,
ROLE_ID_VT_PRICER
);

bytes4[] memory publicSelectors = new bytes4[](1);
publicSelectors[0] = ValidatorTicketPricer.postMintPrice.selector;

calldatas[3] = abi.encodeWithSelector(
AccessManager.setTargetFunctionRole.selector,
pufferDeployment.validatorTicketPricer,
publicSelectors,
accessManager.PUBLIC_ROLE()
);

return calldatas;
}

function _grantRoles(address DAO, address paymaster) internal view returns (bytes[] memory) {
bytes[] memory calldatas = new bytes[](5);
bytes[] memory calldatas = new bytes[](7);

calldatas[0] = abi.encodeWithSelector(AccessManager.grantRole.selector, ROLE_ID_DAO, DAO, 0);
calldatas[1] = abi.encodeWithSelector(
Expand All @@ -374,6 +434,12 @@ contract SetupAccess is BaseScript {
AccessManager.grantRole.selector, ROLE_ID_OPERATIONS_COORDINATOR, pufferDeployment.operationsCoordinator, 0
);

calldatas[5] = abi.encodeWithSelector(
AccessManager.grantRole.selector, ROLE_ID_OPERATIONS_COORDINATOR, pufferDeployment.validatorTicketPricer, 0
);

calldatas[6] = abi.encodeWithSelector(AccessManager.grantRole.selector, ROLE_ID_VT_PRICER, paymaster, 0);

return calldatas;
}
}
Loading
Loading