Skip to content

Commit

Permalink
add VT to the protocol
Browse files Browse the repository at this point in the history
  • Loading branch information
bxmmm1 committed Jan 29, 2024
1 parent e38585e commit 440dd4a
Show file tree
Hide file tree
Showing 11 changed files with 350 additions and 69 deletions.
18 changes: 18 additions & 0 deletions script/DeployPuffer.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ import { IDelegationManager } from "eigenlayer/interfaces/IDelegationManager.sol
import { AccessManager } from "openzeppelin/access/manager/AccessManager.sol";
import { PufferVaultMainnet } from "pufETH/PufferVaultMainnet.sol";
import { UpgradeableBeacon } from "openzeppelin/proxy/beacon/UpgradeableBeacon.sol";
import { FixedPointMathLib } from "solady/utils/FixedPointMathLib.sol";
import { GuardiansDeployment, PufferProtocolDeployment } from "./DeploymentStructs.sol";
import { ValidatorTicket } from "puffer/ValidatorTicket.sol";
import { IWETH } from "pufETH/interface/Other/IWETH.sol";

/**
Expand All @@ -42,6 +44,7 @@ contract DeployPuffer is BaseScript {
PufferProtocol pufferProtocolImpl;
AccessManager accessManager;
ERC1967Proxy proxy;
ERC1967Proxy validatorTicketProxy;
PufferProtocol pufferProtocol;
PufferPool pool;
WithdrawalPool withdrawalPool;
Expand Down Expand Up @@ -85,6 +88,17 @@ contract DeployPuffer is BaseScript {
delegationManager = vm.envOr("DELEGATION_MANAGER", address(new DelegationManagerMock()));
}

validatorTicketProxy = new ERC1967Proxy(address(new NoImplementation()), "");
ValidatorTicket validatorTicketImplementation = new ValidatorTicket(payable(treasury));

NoImplementation(payable(address(validatorTicketProxy))).upgradeToAndCall(
address(validatorTicketImplementation),
abi.encodeCall(
ValidatorTicket.initialize,
(address(accessManager), 5 * FixedPointMathLib.WAD, 5 * 1e17, 0.01 ether) //todo recheck 5% treasury, 0.5% guardians
)
);

// UUPS proxy for PufferProtocol
proxy = new ERC1967Proxy(address(new NoImplementation()), "");
{
Expand Down Expand Up @@ -119,6 +133,7 @@ contract DeployPuffer is BaseScript {
// Puffer Service implementation
pufferProtocolImpl = new PufferProtocol({
pufferVault: PufferVaultMainnet(payable(pufferVault)),
validatorTicket: ValidatorTicket(address(validatorTicketProxy)),
weth: IWETH(weth),
guardianModule: GuardianModule(payable(guardiansDeployment.guardianModule)),
treasury: treasury,
Expand Down Expand Up @@ -162,6 +177,8 @@ contract DeployPuffer is BaseScript {
});

vm.label(address(accessManager), "AccessManager");
vm.label(address(validatorTicketProxy), "ValidatorTicketProxy");
vm.label(address(validatorTicketImplementation), "ValidatorTicketImplementation");
vm.label(address(proxy), "PufferProtocolProxy");
vm.label(address(pufferProtocolImpl), "PufferProtocolImplementation");
vm.label(address(pool), "PufferPool");
Expand All @@ -185,6 +202,7 @@ contract DeployPuffer is BaseScript {
vm.writeJson(finalJson, "./output/puffer.json");
// return (pufferProtocol, pool, accessManager);
return PufferProtocolDeployment({
validatorTicket: address(validatorTicketProxy),
pufferProtocolImplementation: address(pufferProtocolImpl),
NoRestakingModule: address(noRestaking),
pufferPool: address(pool),
Expand Down
1 change: 1 addition & 0 deletions script/DeploymentStructs.sol
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ struct PufferProtocolDeployment {
address pauser;
address beacon; // Beacon for Puffer modules
address moduleFactory;
address validatorTicket;
address pufferDepositor; // from pufETH repository (dependency)
address pufferVault; // from pufETH repository (dependency)
address stETH; // from pufETH repository (dependency)
Expand Down
37 changes: 35 additions & 2 deletions script/SetupAccess.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import { IPufferModule } from "puffer/interface/IPufferModule.sol";
import { UpgradeableBeacon } from "openzeppelin/proxy/beacon/UpgradeableBeacon.sol";
import { EnclaveVerifier } from "puffer/EnclaveVerifier.sol";
import { PufferProtocolDeployment } from "./DeploymentStructs.sol";
import { ValidatorTicket } from "puffer/ValidatorTicket.sol";
import { UUPSUpgradeable } from "openzeppelin-upgradeable/proxy/utils/UUPSUpgradeable.sol";

uint64 constant ROLE_ID_PUFFER_PROTOCOL = 1;
uint64 constant ROLE_ID_DAO = 77;
Expand All @@ -32,8 +34,9 @@ contract SetupAccess is BaseScript {
bytes[] memory pufferProtocolRoles = _setupPufferProtocolRoles();
bytes[] memory pufferPoolRoles = _setupPufferPoolRoles();
bytes[] memory noRestakingModuleRoles = _setupNoRestakingModuleRoles();
bytes[] memory validatorTicketRoles = _setupValidatorTicketsAccess();

bytes[] memory calldatas = new bytes[](15);
bytes[] memory calldatas = new bytes[](17);
calldatas[0] = _setupGuardianModuleRoles();
calldatas[1] = _setupEnclaveVerifierRoles();
calldatas[2] = _setupWithdrawalPoolRoles();
Expand All @@ -53,11 +56,41 @@ contract SetupAccess is BaseScript {
calldatas[13] = noRestakingModuleRoles[1];
calldatas[14] = noRestakingModuleRoles[2];

calldatas[15] = validatorTicketRoles[0];
calldatas[16] = validatorTicketRoles[1];

// calldatas[16] = _setupPauser();

accessManager.multicall(calldatas);
}

function _setupValidatorTicketsAccess() internal returns (bytes[] memory) {
bytes[] memory calldatas = new bytes[](2);

bytes4[] memory selectors = new bytes4[](5);
selectors[0] = ValidatorTicket.transferETHToPufferVault.selector;
selectors[1] = ValidatorTicket.transferETHToGuardians.selector;
selectors[2] = ValidatorTicket.setProtocolFeeRate.selector;
selectors[3] = ValidatorTicket.setMintPrice.selector;
selectors[4] = UUPSUpgradeable.upgradeToAndCall.selector;

calldatas[0] = abi.encodeWithSelector(
AccessManager.setTargetFunctionRole.selector, pufferDeployment.validatorTicket, selectors, ROLE_ID_DAO
);

bytes4[] memory publicSelectors = new bytes4[](1);
publicSelectors[0] = ValidatorTicket.purchaseValidatorTicket.selector;

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

return calldatas;
}

function _setupPauser() internal view returns (bytes memory) {
bytes4[] memory selectors = new bytes4[](1);
selectors[0] = AccessManager.setTargetClosed.selector;
Expand Down Expand Up @@ -186,7 +219,7 @@ contract SetupAccess is BaseScript {
selectors[3] = PufferProtocol.setModuleWeights.selector;
selectors[4] = PufferProtocol.setValidatorLimitPerInterval.selector;
selectors[5] = PufferProtocol.changeModule.selector;
selectors[6] = bytes4(hex"4f1ef286"); // signature for UUPS.upgradeToAndCall(address newImplementation, bytes memory data)
selectors[6] = UUPSUpgradeable.upgradeToAndCall.selector;
selectors[7] = PufferProtocol.setGuardiansFeeRate.selector;
selectors[8] = PufferProtocol.setValidatorLimitPerModule.selector;

Expand Down
2 changes: 2 additions & 0 deletions script/UpgradeProtocol.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { PufferProtocol } from "puffer/PufferProtocol.sol";
import { PufferPool } from "puffer/PufferPool.sol";
import { GuardianModule } from "puffer/GuardianModule.sol";
import { PufferVaultMainnet } from "pufETH/PufferVaultMainnet.sol";
import { ValidatorTicket } from "puffer/ValidatorTicket.sol";
import { IWETH } from "pufETH/interface/Other/IWETH.sol";

/**
Expand All @@ -21,6 +22,7 @@ contract UpgradeProtocol is BaseScript {

PufferProtocol newImplementation = new PufferProtocol({
pufferVault: PufferVaultMainnet(payable(address(0))),
validatorTicket: ValidatorTicket((address(0))),
weth: IWETH(address(0)),
guardianModule: GuardianModule(payable(0xd4c8730F555F9E9d969BC37280805104c1B039A1)),
treasury: payable(0x61A44645326846F9b5d9c6f91AD27C3aD28EA390),
Expand Down
10 changes: 9 additions & 1 deletion src/PufferProtocol.sol
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { FixedPointMathLib } from "solady/utils/FixedPointMathLib.sol";
import { SafeTransferLib } from "solady/utils/SafeTransferLib.sol";
import { SafeCastLib } from "solady/utils/SafeCastLib.sol";
import { PufferVaultMainnet } from "pufETH/PufferVaultMainnet.sol";
import { ValidatorTicket } from "puffer/ValidatorTicket.sol";
import { IWETH } from "pufETH/interface/Other/IWETH.sol";

/**
Expand Down Expand Up @@ -75,6 +76,11 @@ contract PufferProtocol is IPufferProtocol, AccessManagedUpgradeable, UUPSUpgrad
*/
IGuardianModule public immutable override GUARDIAN_MODULE;

/**
* @inheritdoc IPufferProtocol
*/
ValidatorTicket public immutable VALIDATOR_TICKET;

/**
* @inheritdoc IPufferProtocol
*/
Expand All @@ -92,13 +98,15 @@ contract PufferProtocol is IPufferProtocol, AccessManagedUpgradeable, UUPSUpgrad
IWETH weth,
IGuardianModule guardianModule,
address payable treasury,
address moduleFactory
address moduleFactory,
ValidatorTicket validatorTicket
) payable {
TREASURY = treasury;
GUARDIAN_MODULE = guardianModule;
PUFFER_VAULT = PufferVaultMainnet(payable(address(pufferVault)));
WETH = weth;
PUFFER_MODULE_FACTORY = IPufferModuleFactory(moduleFactory);
VALIDATOR_TICKET = validatorTicket;
_disableInitializers();
}

Expand Down
Loading

0 comments on commit 440dd4a

Please sign in to comment.