Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
2a4e501
Implemented flow to trigger validators exit
eladiosch May 13, 2025
d5b1a1e
Added role to trigger validators exit
eladiosch May 14, 2025
607aa38
Removed references to enclave in PufferProtocol and adapted tests (WIP)
eladiosch May 14, 2025
03e6b6d
Changed unused enclave variables to deprecated. Removed unused code
eladiosch May 16, 2025
0a81b7e
Removed getPayload function
eladiosch May 16, 2025
bddc349
Adapted remaining failing tests
eladiosch May 16, 2025
1f7b508
Added tests for new flow
eladiosch May 16, 2025
f5f8a40
forge fmt
eladiosch May 16, 2025
8c82c52
Changed flow from triggerValidatorsExit to requestWithdrawal
eladiosch May 26, 2025
8926347
Added fee to PufferProtocol.requestWithdrawal
eladiosch May 27, 2025
7000731
Refactored fee return to modifier
eladiosch May 27, 2025
01ba5b2
Implemented consolidation flow
eladiosch May 27, 2025
acd617c
Changed withdrawal credentials to type 2
eladiosch May 28, 2025
d6d18be
Changed callStake to deposit directly to beacon chain contract
eladiosch May 28, 2025
a64a585
validator tickets -> validation time
bxmmm1 May 29, 2025
3d7aaae
Added relation pubkey => module+index in storage
eladiosch May 29, 2025
8937e08
provision flow (WIP)
eladiosch May 30, 2025
3d35d5f
forge fmt
eladiosch May 30, 2025
b7e7d56
Removed return excess fee flow
eladiosch May 30, 2025
199b7d2
Use moduleName + indices in withdrawal and consolidation flows
eladiosch May 30, 2025
b0e59aa
Implemented upgrading validators to type2 in PMM
eladiosch May 30, 2025
cb996fa
forge fmt
eladiosch May 30, 2025
4ae75c3
Added accounting to consolidation flow
eladiosch Jun 2, 2025
7f0f5c2
update natspec, remove buggy code
bxmmm1 Jun 4, 2025
8bb6958
Adapted requestWithdrawal and batchHandleWithdrawals
eladiosch Jun 5, 2025
aeed0e2
Adapted some comments and updated ValidatorKeyData
eladiosch Jun 6, 2025
717a387
Fixed oracle call
eladiosch Jun 6, 2025
d162236
Adapted tests and refactor batchHandleWithdrawals
eladiosch Jun 6, 2025
5f3132e
Spell error
eladiosch Jun 6, 2025
8d365bd
Set PufferProtocol as payable to fix provisionNode
eladiosch Jun 9, 2025
d7ccb26
Removed placeholder value from Oracle
eladiosch Jun 9, 2025
28790a0
Fixed failing tests + writing new ones
eladiosch Jun 9, 2025
a76adec
forge fmt
eladiosch Jun 9, 2025
7883612
Added signature check to downsize, and changed burn. Restored old oracle
eladiosch Jun 10, 2025
141628f
forge fmt
eladiosch Jun 10, 2025
40b352c
Added numBatches to ValidatorKeyRegistered event
eladiosch Jun 11, 2025
c6cbc18
forge fmt
eladiosch Jun 11, 2025
7b29240
resolve conflicts + minor changes
bxmmm1 Jun 12, 2025
efb9440
fix validator exits
bxmmm1 Jun 12, 2025
9c42d19
update the test
bxmmm1 Jun 13, 2025
5a9bd38
codespell
bxmmm1 Jun 13, 2025
e2158ec
Merge pull request #116 from PufferFinance/feature/remove-vt
eladiosch Jun 20, 2025
1fca25b
Improved IProtocol natspec and naming. Slight optimization in protocol
eladiosch Jun 23, 2025
8282259
Added comments and small refactor
eladiosch Jun 24, 2025
95811ed
forge fmt
eladiosch Jun 24, 2025
e8cc1a9
Removed duplicated code
eladiosch Jun 24, 2025
c1cdf1e
Fixed wrong comment
eladiosch Jun 24, 2025
991d558
Added numBatches param to relevant events
eladiosch Jun 24, 2025
1f36dca
FIxed param bug in _getVTBurnAmount, added checks to _useVTOrValidati…
eladiosch Jun 26, 2025
079872a
Removed min amount from _getVTBurnAmount
eladiosch Jun 27, 2025
09690ce
Reworked signatures (tests not adapted)
eladiosch Jul 1, 2025
9b62be5
Adapted one script and test handler
eladiosch Jul 1, 2025
6b187f7
Adapted tests to new func sigs
eladiosch Jul 2, 2025
899b73e
Refactors to fix stack too deep
eladiosch Jul 2, 2025
f392b1b
fmt
eladiosch Jul 2, 2025
a71569f
Added min and max for depositVT. Added numBatches when needed
eladiosch Jul 2, 2025
86afa4b
Removed unused function
eladiosch Jul 3, 2025
202c7f1
Created PufferLogic contract and adapted existing ones (WIP)
eladiosch Jul 7, 2025
0b4a2b8
Adapted previous tests and improved signatures
eladiosch Jul 7, 2025
37fff25
Changed ProtocolLogic structure. Moved more logic to ext contract (WIP)
eladiosch Jul 7, 2025
27dea10
Fixed and simplify delegatecalls
eladiosch Jul 8, 2025
50536f7
Refactor delegatecalls and small fixes
eladiosch Jul 8, 2025
7b53076
Refactor PufferConstants to PufferProtocolBase and moved more logic t…
eladiosch Jul 8, 2025
ec3e5fe
forge fmt
eladiosch Jul 8, 2025
9d2251f
Removed flow to deposit VT with Permit
eladiosch Jul 10, 2025
c104f39
Added tests to increase coverage
eladiosch Jul 10, 2025
48c5b53
forge fmt
eladiosch Jul 10, 2025
4e44801
Refactored interfaces and adapted tests (protocol WIP)
eladiosch Jul 14, 2025
eab8cfc
Changed approach of the delegatecall to logic contract
eladiosch Jul 14, 2025
495ac9d
Removed selector constants
eladiosch Jul 15, 2025
bf0c713
Added some natspec to the fallback function
eladiosch Jul 15, 2025
a19d9a0
Moved logic from GuardianModule to Protocol to avoid re-deploying con…
eladiosch Jul 15, 2025
5501856
forge fmt
eladiosch Jul 15, 2025
f3dafab
Added basic checks to withdrawValidationTime and added missing natspec
eladiosch Jul 15, 2025
8d546b1
forge fmt
eladiosch Jul 15, 2025
522f503
Update mainnet-contracts/src/PufferProtocol.sol
eladiosch Jul 16, 2025
e7fb64e
Update mainnet-contracts/src/PufferProtocol.sol
eladiosch Jul 16, 2025
76a3233
Update mainnet-contracts/src/PufferProtocol.sol
eladiosch Jul 16, 2025
c90f5da
Update mainnet-contracts/src/PufferProtocol.sol
eladiosch Jul 16, 2025
e181e10
Update mainnet-contracts/src/PufferProtocolLogic.sol
eladiosch Jul 16, 2025
fad967d
Update mainnet-contracts/src/PufferProtocol.sol
eladiosch Jul 16, 2025
b982b2e
Using modifier (with require) to check deadlines
eladiosch Jul 16, 2025
3c16eb3
Changed reverts to require and refactored to avoid stack too deep
eladiosch Jul 16, 2025
3599a63
Added restricted for the Logic contract and improved natspec
eladiosch Jul 16, 2025
59f2899
Merge pull request #119 from PufferFinance/external-protocol-logic
eladiosch Jul 28, 2025
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
91 changes: 76 additions & 15 deletions mainnet-contracts/docs/PufferProtocol.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,11 @@ The `PufferProtocol` serves as the central contract and fulfills three key funct
9. **Completion and Restaking**: Once the Beacon chain recognizes the validator, a withdrawal credentials merkle proof is submitted back to EigenLayer to enable the restaking of the validator's ETH.



## Registering a validator
### 1. Prepare Bond and VTs
NoOps are required to deposit pufETH and Validator Tickets (VTs) to register a validator. The amount of pufETH depends on the use of an anti-slasher enclave:
NoOps are required to send enough ETH to cover for the validator bond and the validation time.

- **With an enclave**: 1 ETH worth of pufETH is required.
- **Without an enclave**: 2 ETH worth of pufETH is required.
1.5 ETH is the bond amount required. + 30 days of validation time.

<!-- ![Pre-Registration](./images/node-operator-pre-register.png) -->

Expand All @@ -41,11 +39,47 @@ The `PufferProtocol` contract mandates a minimum number of VTs at registration,
> function registerValidatorKey(
> ValidatorKeyData calldata data,
> bytes32 moduleName,
> Permit calldata pufETHPermit,
> Permit calldata vtPermit
> uint256 totalEpochsValidated,
> bytes[] calldata vtConsumptionSignature
> )
> ```

Before calling `registerValidatorKey`, Node Operators must first obtain their VT consumption data from the Puffer Backend API. This data includes:
- Total epochs validated by their active validators
- A signature from the Guardians verifying this data

```mermaid
sequenceDiagram
participant NodeOperator
participant PufferBackend
participant PufferProtocol
participant Paymaster
participant PufferVault
participant PufferModule

rect rgb(0, 208, 255)
NodeOperator->>PufferBackend: Request VT consumption data (API CALL)
PufferBackend-->>NodeOperator: Return VT consumption & signatures
end

rect rgb(25, 202, 84)
NodeOperator->>PufferProtocol: registerValidatorKey(data, moduleName, totalEpochsValidated, vtConsumptionSignature)
PufferProtocol->>PufferProtocol: _checkValidatorRegistrationInputs()
PufferProtocol->>PufferProtocol: _settleVTAccounting()
PufferProtocol->>PufferVault: depositETH() - converts ETH bond to pufETH for the NoOp
PufferProtocol->>PufferProtocol: Store validator data
end

Note over Paymaster: If there is liquidity and the registration is valid

rect rgb(25, 202, 199)
Paymaster->>PufferProtocol: provisionNode()
PufferProtocol->>PufferVault: transferETH(32 ETH, pufferModule)
PufferProtocol->>PufferModule: callStake()
PufferModule->>BeaconChain: 32 ETH
end
```

The NoOp must supply the following `ValidatorKeyData` struct created off-chain:

- **`bytes blsPubKey`**: [BLS public key](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/keys/) generated by the NoOp.
Expand All @@ -70,7 +104,6 @@ This function allows flexibility in how pufETH and VTs are supplied. Options inc
- Transferring pufETH and VTs using Permit messages or prior approve transactions.
- Combining both methods (e.g., minting pufETH and transferring VTs).


#### Registration side effects
Successful registration adds the validator to the `PufferModule` queue. Guardians verify the data and manage keyshare custody. Once verified, they provision the validator with 32 ETH from the `PufferVault` to deploy to the `PufferModule's` `EigenPod`.

Expand All @@ -90,7 +123,7 @@ The `provisionNode` function executes several critical steps in one atomic trans
- It updates the `_numberOfActivePufferValidators` counter on the `PufferOracleV2` contract, reflecting the addition of a new validator on the beacon chain.

#### Impact on pufETH Conversion Rate
- The provisioning of a validator involves transferring 32 ETH out of the PufferVault, which could negatively affect the pufETH:ETH conversion rate. To prevent this, the vault calculation includes the ETH amount locked as reported by `PUFFER_ORACLE.getLockedEthAmount()`. When provisioning occurs, the oracle contracts reported locked ETH amount is increased by 32 ETH. This adjustment ensures that the vault's exchange rate remains unchanged, despite the outflow of funds. For a more detailed explanation, refer to the [`PufferOracleV2`](./PufferOracleV2.md) documentation.
- The provisioning of a validator involves transferring 32 ETH out of the PufferVault, which could negatively affect the pufETH:ETH conversion rate. To prevent this, the vault calculation includes the ETH amount locked as reported by `PUFFER_ORACLE.getLockedEthAmount()`. When provisioning occurs, the oracle contract's reported locked ETH amount is increased by 32 ETH. This adjustment ensures that the vault's exchange rate remains unchanged, despite the outflow of funds. For a more detailed explanation, refer to the [`PufferOracleV2`](./PufferOracleV2.md) documentation.

## Restaking a validator
Once a validator is onboarded into a `PufferModule` and their validator is observable from the Beacon chain, their Beacon chain ETH is restaked. This process involves delegating the validator's ETH to a [`RestakingOperator`](./RestakingOperator.md), as determined by the DAO.
Expand All @@ -110,7 +143,7 @@ Guardians, utilizing their enclaves, are authorized to sign and broadcast volunt
- If the Node Operator fails to replenish their VTs after their locked amount has expired.

#### After exiting
Post-exit, the exited validators ETH will be redirected to the `PufferModule's` `EigenPod`. The [`PufferModuleManager`](./PufferModuleManager.md) oversees the full withdrawal process on EigenLayer, which involves Merkle proofs and queueing, to transfer the ETH back to the `PufferModule`.
Post-exit, the exited validator's ETH will be redirected to the `PufferModule's` `EigenPod`. The [`PufferModuleManager`](./PufferModuleManager.md) oversees the full withdrawal process on EigenLayer, which involves Merkle proofs and queueing, to transfer the ETH back to the `PufferModule`.

The Guardians then execute `batchHandleWithdrawals()` on the `PufferProtocol`, which returns pufETH bonds to NoOps, burns their consumed VTs, and performs necessary [accounting](./PufferOracleV2.md). The process addresses three potential scenarios:

Expand All @@ -121,7 +154,7 @@ The Guardians then execute `batchHandleWithdrawals()` on the `PufferProtocol`, w

**Insufficient Withdrawal** (*withdrawalAmount* < 32 ETH):
- The entire *withdrawalAmount* is transferred back to the `PufferVault`.
- The missing ETH (32 ETH - *withdrawalAmount*) is burned from the NoOps bond.
- The missing ETH (32 ETH - *withdrawalAmount*) is burned from the NoOp's bond.
- The NoOp receives the remainder of their bond, assuming losses due to inactivity penalties do not exceed the bond itself.

**Validator Was Slashed**:
Expand All @@ -130,9 +163,37 @@ The Guardians then execute `batchHandleWithdrawals()` on the `PufferProtocol`, w

In all scenarios, the `_numberOfActivePufferValidators` count on the `PufferOracleV2` contract is decremented atomically, reducing the locked ETH amount by 32 ETH per exited validator to maintain the pufETH conversion rate.

### Depositing Validation Time

Valiadtion time gives the node operator ability to keep operating their validator. If they run out of validation time, they will be ejected from the beacon chain. To prevent that from happening, they can deposit validation time. In the previous iteration of the protocol, validation time was represented as ERC20 token Validator Tickets (VTs). This is no longer the case, and the protocol now uses native ETH to represent validation time. The drawback of the previous design was that the node operator was left with VT tokens if ejected early because of the liquidity need for the protocol, and that forced them to sell their VT tokens on secondary markets for a lower price. The new design returns the ETH they deposit to the protocol, if they are ejected early. If they want to keep operating their validator, they can deposit more validation time. To do that, they can call the `depositValidationTime` function and send some amount of ETH to the protocol. That ETH is accounted for in the `PufferProtocol` contract, and the node operator can withdraw if when they exit all of their validators.

```mermaid
sequenceDiagram
participant NodeOperator
participant PufferBackend
participant PufferProtocol

rect rgb(0, 208, 255)
NodeOperator->>PufferBackend: Request VT consumption data (API CALL)
PufferBackend-->>NodeOperator: Return VT consumption & signatures
end

rect rgb(25, 202, 84)
NodeOperator->>PufferProtocol: depositValidationTime(node, vtConsumptionAmount, vtConsumptionSignature)
PufferProtocol->>PufferProtocol: _settleVTAccounting()
end
```

## Managing Validator Tickets (VT)
#### Understanding VT Consumption
Each validator operated by a NoOp consumes one VT per day. While the `getValidatorTicketsBalance()` function returns the total amount of VTs initially deposited by the NoOp, it does not reflect the real-time balance of VTs. This is due to the prohibitive gas costs associated with continually updating VT balances on-chain.

Each validator operated by a NoOp consumes one VT per day. The VT consumption is tracked off-chain by the Guardians and verified through signatures. When registering a new validator, the NoOp must:

1. Query the Puffer Backend API to obtain:
- Total epochs validated by their active validators
- Guardian signatures verifying this data

This off-chain tracking approach is used to minimize gas costs while maintaining accurate VT consumption records. The `depositValidationTime` function is used to deposit validation time to the protocol. It is important to note that the calculation of the legaxy VT / new Validation Time is done off-chain, and per epoch. Currently, 1 day is equivalent to 225 epochs.

#### Off-Chain Tracking and Visualizing VTs
To efficiently manage VT consumption without incurring high on-chain costs, Guardians track VT usage off-chain. NoOps can access up-to-date VT consumption information through frontend interfaces, which provide a clear view of their current VT status.
Expand All @@ -141,12 +202,12 @@ To efficiently manage VT consumption without incurring high on-chain costs, Guar
Maintaining active validators requires more than just the initial deposit of a minimum of 28 VTs at registration. To ensure continuous operation and prevent ejection from the network, NoOp must periodically top up their VT balance. This is crucial as running out of VTs could lead to a validator being deactivated.

#### Depositing Additional VTs
NoOps can replenish their VT supply by executing the `depositValidatorTickets(permit, nodeOperator)` function. This allows them to add VTs to their account, ensuring their validators can continue to operate without interruption. Note that the `PufferProtocol` tracks validators by wallet address, so only one function call is needed to top up VTs across all of your validators.
NoOps can replenish their VT supply by executing the `depositValidatorTickets(permit, nodeOperator)` function (legacy function) or the `depositValidationTime(node, vtConsumptionAmount, vtConsumptionSignature)`. This allows them to add VTs/Validation Time to their account, ensuring their validators can continue to operate without interruption. Note that the `PufferProtocol` tracks validators by wallet address, so only one function call is needed to top up VTs across all of your validators.

It's important for NoOps to monitor their VT consumption regularly and respond proactively to avoid disruptions in their validator operations.

#### Withdrawing VTs
Since VT consumption is tracked off-chain, withdrawing excess VTs, `withdrawValidatorTickets` can only be called when the NoOp has no active or pending validators. In future protocol upgrades, ZKPs will be used to allow VTs to be withdrawn while validators are still active.
Since VT consumption is tracked off-chain, withdrawing excess VTs, `withdrawValidatorTickets` can only be called when the NoOp has no active or pending validators (legacy function), the same logic applies to `withdrawValidationTime`. In future protocol upgrades, ZKPs will be used to allow VTs to be withdrawn while validators are still active.

## Validator Rewards in Puffer
#### Overview of Rewards
Expand All @@ -156,7 +217,7 @@ In the Puffer protocol, NoOps receive 100% of the consensus and execution reward
When NoOps employ tools like MEV-Boost, execution rewards are directly sent to their designated wallet addresses. This is specified through the `fee recipient` parameter. Unlike other protocols there is no need to share these rewards with the protocol.

#### Consensus Rewards
Consensus rewards are directed to the validators withdrawal credentials, which are linked to `EigenPods`. These rewards accumulate and, following an upcoming EigenLayer upgrade that improves partial withdrawal gas-efficiency, will be accessible for claiming through the [PufferModules](./PufferModule.md#consensus-rewards).
Consensus rewards are directed to the validators' withdrawal credentials, which are linked to `EigenPods`. These rewards accumulate and, following an upcoming EigenLayer upgrade that improves partial withdrawal gas-efficiency, will be accessible for claiming through the [PufferModules](./PufferModule.md#consensus-rewards).

#### Restaking Rewards
Beyond the direct rewards from consensus and execution, Puffer validators also benefit from a share of the protocol's restaking rewards. Similar to consensus rewards, these restaking rewards are set to become claimable in future updates to EigenLayer, enhancing the overall profitability and incentive for NoOps within the Puffer ecosystem.
Restaking rewards are claimed by the Puffer, they are periodically converted to ETH and then deposited to PufferVault. That is how Puffer is able to achieve higher yield compared to other protocols.
2 changes: 1 addition & 1 deletion mainnet-contracts/foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ optimizer = true
optimizer_runs = 200
evm_version = "cancun" # is live on mainnet
seed = "0x1337"
solc = "0.8.28"
solc = "0.8.30"
# via_ir = true

[fmt]
Expand Down
8 changes: 5 additions & 3 deletions mainnet-contracts/script/DeployEverything.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,11 @@ contract DeployEverything is BaseScript {
puffETHDeployment.accessManager, guardiansDeployment.guardianModule, puffETHDeployment.pufferVault
);

PufferProtocolDeployment memory pufferDeployment =
new DeployPuffer().run(guardiansDeployment, puffETHDeployment.pufferVault, pufferOracle);
address revenueDepositor = _deployRevenueDepositor(puffETHDeployment);

PufferProtocolDeployment memory pufferDeployment = new DeployPuffer().run(
guardiansDeployment, puffETHDeployment.pufferVault, pufferOracle, payable(revenueDepositor)
);

pufferDeployment.pufferDepositor = puffETHDeployment.pufferDepositor;
pufferDeployment.pufferVault = puffETHDeployment.pufferVault;
Expand All @@ -61,7 +64,6 @@ contract DeployEverything is BaseScript {
pufferDeployment.timelock = puffETHDeployment.timelock;

BridgingDeployment memory bridgingDeployment = new DeployPufETHBridging().run(puffETHDeployment);
address revenueDepositor = _deployRevenueDepositor(puffETHDeployment);
pufferDeployment.revenueDepositor = revenueDepositor;

new UpgradePufETH().run(puffETHDeployment, pufferOracle, revenueDepositor);
Expand Down
35 changes: 26 additions & 9 deletions mainnet-contracts/script/DeployPuffer.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import { RewardsCoordinatorMock } from "../test/mocks/RewardsCoordinatorMock.sol
import { EigenAllocationManagerMock } from "../test/mocks/EigenAllocationManagerMock.sol";
import { RestakingOperatorController } from "../src/RestakingOperatorController.sol";
import { RestakingOperatorController } from "../src/RestakingOperatorController.sol";
import { PufferProtocolLogic } from "../src/PufferProtocolLogic.sol";
/**
* @title DeployPuffer
* @author Puffer Finance
Expand Down Expand Up @@ -68,11 +69,12 @@ contract DeployPuffer is BaseScript {
address treasury;
address operationsMultisig;

function run(GuardiansDeployment calldata guardiansDeployment, address pufferVault, address oracle)
public
broadcast
returns (PufferProtocolDeployment memory)
{
function run(
GuardiansDeployment calldata guardiansDeployment,
address pufferVault,
address oracle,
address payable revenueDepositor
) public broadcast returns (PufferProtocolDeployment memory) {
accessManager = AccessManager(guardiansDeployment.accessManager);

if (isMainnet()) {
Expand Down Expand Up @@ -161,7 +163,8 @@ contract DeployPuffer is BaseScript {
guardianModule: GuardianModule(payable(guardiansDeployment.guardianModule)),
moduleManager: address(moduleManagerProxy),
oracle: IPufferOracleV2(oracle),
beaconDepositContract: getStakingContract()
beaconDepositContract: getStakingContract(),
pufferRevenueDistributor: payable(revenueDepositor)
});
}

Expand All @@ -179,8 +182,21 @@ contract DeployPuffer is BaseScript {
address(moduleManager), abi.encodeCall(moduleManager.initialize, (address(accessManager)))
);

PufferProtocolLogic pufferProtocolLogic = new PufferProtocolLogic({
pufferVault: PufferVaultV5(payable(pufferVault)),
validatorTicket: ValidatorTicket(address(validatorTicketProxy)),
guardianModule: GuardianModule(payable(guardiansDeployment.guardianModule)),
moduleManager: address(moduleManagerProxy),
oracle: IPufferOracleV2(oracle),
beaconDepositContract: getStakingContract(),
pufferRevenueDistributor: payable(revenueDepositor)
});

// Initialize the Pool
pufferProtocol.initialize({ accessManager: address(accessManager) });
pufferProtocol.initialize({
accessManager: address(accessManager),
pufferProtocolLogic: address(pufferProtocolLogic)
});

vm.label(address(accessManager), "AccessManager");
vm.label(address(operationsCoordinator), "OperationsCoordinator");
Expand Down Expand Up @@ -214,8 +230,9 @@ contract DeployPuffer is BaseScript {
pufferVault: address(0), // overwritten in DeployEverything
pufferDepositor: address(0), // overwritten in DeployEverything
weth: address(0), // overwritten in DeployEverything
revenueDepositor: address(0) // overwritten in DeployEverything
});
revenueDepositor: address(0), // overwritten in DeployEverything
pufferProtocolLogic: address(pufferProtocolLogic)
});
}

function getStakingContract() internal returns (address) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ contract DeployPufferModuleImplementation is DeployerHelper {
vm.startBroadcast();

PufferModule newImpl = new PufferModule({
protocol: PufferProtocol(_getPufferProtocol()),
protocol: PufferProtocol(payable(_getPufferProtocol())),
eigenPodManager: _getEigenPodManager(),
delegationManager: IDelegationManager(_getDelegationManager()),
moduleManager: PufferModuleManager(payable(_getPufferModuleManager())),
Expand All @@ -51,7 +51,7 @@ contract DeployPufferModuleImplementation is DeployerHelper {
vm.startPrank(_getPaymaster());

PufferModule newImpl = new PufferModule({
protocol: PufferProtocol(_getPufferProtocol()),
protocol: PufferProtocol(payable(_getPufferProtocol())),
eigenPodManager: _getEigenPodManager(),
delegationManager: IDelegationManager(_getDelegationManager()),
moduleManager: PufferModuleManager(payable(_getPufferModuleManager())),
Expand Down
Loading
Loading