Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
3ac8cdd
init
pankajjagtapp Jan 22, 2026
7811d33
refactor: Update PriorityWithdrawalQueue contract to improve withdraw…
pankajjagtapp Jan 28, 2026
73b0ed4
refactor: Update LiquidityPool contract to use immutable priorityWith…
pankajjagtapp Jan 28, 2026
fe06cb4
refactor: Update LiquidityPool and PriorityWithdrawalQueue tests for …
pankajjagtapp Jan 28, 2026
59c6819
refactor: Optimize
pankajjagtapp Jan 28, 2026
27daab0
refactor: Enhance LiquidityPool and PriorityWithdrawalQueue for impro…
pankajjagtapp Jan 28, 2026
f199f40
refactor: Simplify PriorityWithdrawalQueue contract
pankajjagtapp Jan 28, 2026
3a27a08
refactor: Update PriorityWithdrawalQueue to use immutable MIN_DELAY
pankajjagtapp Jan 28, 2026
d31e074
refactor: Clean up PriorityWithdrawalQueue contract by removing redun…
pankajjagtapp Jan 28, 2026
1152b54
refactor: Updated claimWithdraw and batchClaimWithdraw functions to …
pankajjagtapp Jan 29, 2026
365b62e
refactor: Improve cancellation logic in PriorityWithdrawalQueue contract
pankajjagtapp Jan 29, 2026
1c07a43
feat: Add minAmountOut parameter for withdrawal requests
pankajjagtapp Jan 29, 2026
89c23e7
refactor: Eliminated ethAmountLockedForPriorityWithdrawal and related…
pankajjagtapp Jan 29, 2026
30d87da
revert: liquidityPool updated checks
pankajjagtapp Jan 29, 2026
307698f
feat: Integrate PriorityWithdrawalQueue into EtherFiRedemptionManager
pankajjagtapp Jan 29, 2026
80b99a3
feat: Updated the permit handling logic to revert with a specific err…
pankajjagtapp Jan 29, 2026
7385ac9
feat: Add deployment and transaction scripts for PriorityWithdrawalQueue
pankajjagtapp Feb 2, 2026
61b4d23
Merge remote-tracking branch 'origin/master' into pankaj/feat/priorit…
pankajjagtapp Feb 2, 2026
ac99058
refactor: Update test setups and scripts to fix broken tests
pankajjagtapp Feb 2, 2026
79386cd
feat: Integrate EtherFiRedemptionManager into deployment and transact…
pankajjagtapp Feb 2, 2026
288d12b
audit fix -> H-01, H-02, M-02
pankajjagtapp Feb 18, 2026
c5cc902
audit fix: L-01 Incorrect Event Argument in RemainderHandled
pankajjagtapp Feb 18, 2026
3e61412
audit fix: L-02 => Non-Idempotent CREATE2 Deploy Can DoS Deployment S…
pankajjagtapp Feb 18, 2026
8d299e1
audit fix: I-01 => Rounding Loss in Treasury Split Calculation
pankajjagtapp Feb 18, 2026
c44e471
audit fix: I-03 =>Unused OwnableUpgradeable Inheritance
pankajjagtapp Feb 18, 2026
8d2111e
audit fix: I-04 => Inaccurate NatSpec in invalidateRequests
pankajjagtapp Feb 18, 2026
f11cdd6
audit fix: I-05. Batch Claim Bypasses User Balance Check
pankajjagtapp Feb 18, 2026
4afb260
audit fix: I-06. Potential Gas Griefing in claimWithdraw
pankajjagtapp Feb 18, 2026
cebb37a
audit fix: I-08. Deployment/Upgrade Scripts Print Inaccurate Logs
pankajjagtapp Feb 18, 2026
84ce16f
fix tests as per the new changes
pankajjagtapp Feb 18, 2026
bfb5dbd
audit fix: L-03. requestWithdrawWithPermit Can Be Griefed via Permit …
pankajjagtapp Feb 19, 2026
4e35487
audit fix: M-01. PriorityWithdrawalQueue Ignores Liquidity Pool Withd…
pankajjagtapp Feb 25, 2026
6a3448e
refactor: update error handling and minAmountOut logic in PriorityWit…
pankajjagtapp Feb 26, 2026
040eb3c
refactor: rename minAmountOut to amountWithFee in PriorityWithdrawalQ…
pankajjagtapp Feb 26, 2026
17a5375
fix: return 0 for claimable amount if request is not finalized or not…
pankajjagtapp Feb 26, 2026
3b6b81b
feat: enhance liquidity withdrawal logic to account for priority queu…
pankajjagtapp Feb 26, 2026
40d643e
Merge pull request #362 from etherfi-protocol/pankaj/priority-queue-f…
pankajjagtapp Feb 26, 2026
3c53b44
Merge branch 'master' into pankaj/feat/priority-withdrawal-queue
pankajjagtapp Feb 26, 2026
80d78f2
feat: add deployment scripts and verification functions
pankajjagtapp Feb 27, 2026
3f39933
fix: minor bug fixes
pankajjagtapp Feb 27, 2026
d21731b
feat: add new audit report for Certora on Priority Queue
pankajjagtapp Feb 27, 2026
0ba348c
feat: add UUPSProxy integration for priority withdrawal queue verific…
pankajjagtapp Mar 2, 2026
34c219a
feat: add weETH withdrawal functionality to PriorityWithdrawalQueue
pankajjagtapp Mar 5, 2026
d381b7a
feat: implement weETH withdrawal request handling and permit function…
pankajjagtapp Mar 5, 2026
7fc5100
feat: update deployment and transaction scripts to include weETH and …
pankajjagtapp Mar 5, 2026
ec1482b
Merge pull request #374 from etherfi-protocol/pankaj/feat/weETH-suppo…
pankajjagtapp Mar 5, 2026
30dfc30
feat: add priority withdrawal queue address and update treasury refer…
pankajjagtapp Mar 5, 2026
2ab0f0b
feat: add new deployment files for EtherFiRedemptionManager, Liquidit…
pankajjagtapp Mar 5, 2026
7d4c977
chore: remove outdated Certora audit report and add new report for Pr…
pankajjagtapp Mar 11, 2026
3c5d76b
feat: add new script and JSON configuration for setting priority queu…
pankajjagtapp Mar 11, 2026
a169db3
refactor: update pubkey and legacy ID in EL-withdrawals test, comment…
pankajjagtapp Mar 16, 2026
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
Binary file added audits/2026.03.05 - Certora - Priority Queue.pdf
Binary file not shown.
17 changes: 17 additions & 0 deletions deployment/EtherFiRedemptionManager/2026-03-05-20-22-35.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"contractName": "EtherFiRedemptionManager",
"deploymentParameters": {
"factory": "0x356d1B83970CeF2018F2c9337cDdb67dff5AEF99",
"salt": "0x7fc5100aa09ac0c9236907fe0330a15cb0fda6f8000000000000000000000000",
"constructorArgs": {
"_liquidityPool": "0x308861A430be4cce5502d0A12724771Fc6DaF216",
"_eEth": "0x35fA164735182de50811E8e2E824cFb9B6118ac2",
"_weEth": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee",
"_treasury": "0x2f5301a3D59388c509C65f8698f521377D41Fd0F",
"_roleRegistry": "0x62247D29B4B9BECf4BB73E0c722cf6445cfC7cE9",
"_etherFiRestaker": "0x1B7a4C3797236A1C37f8741c0Be35c2c72736fFf",
"_priorityWithdrawalQueue": "0x35e7D6feF6f72aDd3c3e39dEc6d9CCc29e3345FA"
}
},
"deployedAddress": "0x6BD191582F40012b2f2cdf66bD3D32bDe41191F7"
}
11 changes: 11 additions & 0 deletions deployment/LiquidityPool/2026-03-05-20-22-35.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"contractName": "LiquidityPool",
"deploymentParameters": {
"factory": "0x356d1B83970CeF2018F2c9337cDdb67dff5AEF99",
"salt": "0x7fc5100aa09ac0c9236907fe0330a15cb0fda6f8000000000000000000000000",
"constructorArgs": {
"_priorityWithdrawalQueue": "0x35e7D6feF6f72aDd3c3e39dEc6d9CCc29e3345FA"
}
},
"deployedAddress": "0x83bc649fCdb2c8DA146b2154a559ddEDf937eF12"
}
16 changes: 16 additions & 0 deletions deployment/PriorityWithdrawalQueue/2026-03-05-20-17-23.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"contractName": "PriorityWithdrawalQueue",
"deploymentParameters": {
"factory": "0x356d1B83970CeF2018F2c9337cDdb67dff5AEF99",
"salt": "0x7fc5100aa09ac0c9236907fe0330a15cb0fda6f8000000000000000000000000",
"constructorArgs": {
"_liquidityPool": "0x308861A430be4cce5502d0A12724771Fc6DaF216",
"_eETH": "0x35fA164735182de50811E8e2E824cFb9B6118ac2",
"_weETH": "0xCd5fE23C85820F7B72D0926FC9b05b43E359b7ee",
"_roleRegistry": "0x62247D29B4B9BECf4BB73E0c722cf6445cfC7cE9",
"_treasury": "0x2f5301a3D59388c509C65f8698f521377D41Fd0F",
"_minDelay": "3600"
}
},
"deployedAddress": "0x554B2a0c78840bBD4fDB24e198cdD93f99E29456"
}
12 changes: 12 additions & 0 deletions deployment/UUPSProxy/2026-03-05-20-22-35.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"contractName": "UUPSProxy",
"deploymentParameters": {
"factory": "0x356d1B83970CeF2018F2c9337cDdb67dff5AEF99",
"salt": "0x7fc5100aa09ac0c9236907fe0330a15cb0fda6f8000000000000000000000000",
"constructorArgs": {
"_implementation": "0x554B2a0c78840bBD4fDB24e198cdD93f99E29456",
"_data": "0x8129fc1c"
}
},
"deployedAddress": "0x35e7D6feF6f72aDd3c3e39dEc6d9CCc29e3345FA"
}
1 change: 1 addition & 0 deletions script/deploys/Deployed.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ contract Deployed {
address public constant ETHERFI_NODES_MANAGER = 0x8B71140AD2e5d1E7018d2a7f8a288BD3CD38916F;
address public constant ETHERFI_REDEMPTION_MANAGER = 0xDadEf1fFBFeaAB4f68A9fD181395F68b4e4E7Ae0;
address public constant WEETH_WITHDRAW_ADAPTER = 0xFbfe6b9cEe0E555Bad7e2E7309EFFC75200cBE38;
address public constant PRIORITY_WITHDRAWAL_QUEUE = 0x35e7D6feF6f72aDd3c3e39dEc6d9CCc29e3345FA;

// Oracle
address public constant ETHERFI_ORACLE = 0x57AaF0004C716388B21795431CD7D5f9D3Bb6a41;
Expand Down
4 changes: 2 additions & 2 deletions script/upgrades/CrossPodApproval/transactions.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -256,13 +256,13 @@ contract CrossPodApprovalScript is Script, Deployed, Utils {
}

function verifyBytecode() internal {
LiquidityPool newLiquidityPoolImplementation = new LiquidityPool();
// LiquidityPool newLiquidityPoolImplementation = new LiquidityPool();
EtherFiNodesManager newEtherFiNodesManagerImplementation = new EtherFiNodesManager(
address(STAKING_MANAGER),
address(ROLE_REGISTRY),
address(ETHERFI_RATE_LIMITER)
);
contractCodeChecker.verifyContractByteCodeMatch(liquidityPoolImpl, address(newLiquidityPoolImplementation));
// contractCodeChecker.verifyContractByteCodeMatch(liquidityPoolImpl, address(newLiquidityPoolImplementation));
contractCodeChecker.verifyContractByteCodeMatch(etherFiNodesManagerImpl, address(newEtherFiNodesManagerImplementation));

console2.log("[OK] Bytecode verified successfully");
Expand Down
213 changes: 213 additions & 0 deletions script/upgrades/priority-queue/SetPriorityQueueParams.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.27;

import "forge-std/Script.sol";
import "forge-std/console2.sol";
import "../../utils/utils.sol";
import "../../../src/helpers/EtherFiOperationParameters.sol";

// Generate direct calldata for Operations Params updates:
// forge script script/upgrades/priority-queue/SetPriorityQueueParams.s.sol --fork-url $MAINNET_RPC_URL -vvvv
contract SetPriorityQueueParams is Script, Utils {
EtherFiOperationParameters internal constant _OPERATION_PARAMS =
EtherFiOperationParameters(payable(ETHERFI_OPERATION_PARAMETERS));

string internal constant _PRIORITY_WITHDRAWAL = "PRIORITY_WITHDRAWAL";
string internal constant _PRIORITY_USERS_FEE_BPS = "PRIORITY_USERS_FEE_BPS";
string internal constant _ORACLE = "ORACLE";
string internal constant _ESTIMATED_WD_TIME_SECONDS = "14400";
string internal constant _TEST_PRIORITY_USER = "0x6b6c4414f9fF7B1684380bc421A8b7036C040383";
address internal constant _PANKAJ_LEDGER = 0x1B7Fd9679B2678F7e01897E0A3BA9aF18dF4f71e;

function run() external {
_printCalldata();
_writeGnosisTxFiles();
_simulateOnFork();
}

function _printCalldata() internal view {
bytes memory a1 = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagAdmin.selector,
_PRIORITY_WITHDRAWAL,
ETHERFI_OPERATING_ADMIN,
true
);
bytes memory a2 = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagAdmin.selector,
_PRIORITY_USERS_FEE_BPS,
ETHERFI_OPERATING_ADMIN,
true
);
bytes memory a3 = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagAdmin.selector,
_ORACLE,
_PANKAJ_LEDGER,
true
);

bytes memory c1 = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_WITHDRAWAL,
"AUTO_FULFILL_LIMIT_ETH",
"5000"
);
bytes memory c2 = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_WITHDRAWAL,
"DAILY_CAP_PER_USER_ETH",
"10000"
);
bytes memory c3 = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_WITHDRAWAL,
"WEEKLY_CAP_PER_USER_ETH",
"50000"
);
bytes memory c4 = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_WITHDRAWAL,
"FINALIZED_NOT_CLAIMED_EXPIRY_DAYS",
"5"
);
bytes memory c5 = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_WITHDRAWAL,
"ESTIMATED_WD_TIME",
_ESTIMATED_WD_TIME_SECONDS
);
bytes memory c6 = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_USERS_FEE_BPS,
_TEST_PRIORITY_USER,
"100"
);

console2.log("Target (all direct calls):", address(_OPERATION_PARAMS));
console2.log("");

console2.log("A1) updateTagAdmin(PRIORITY_WITHDRAWAL, ETHERFI_OPERATING_ADMIN, true)");
console2.logBytes(a1);
console2.log("");

console2.log("A2) updateTagAdmin(PRIORITY_USERS_FEE_BPS, ETHERFI_OPERATING_ADMIN, true)");
console2.logBytes(a2);
console2.log("");

console2.log("A3) updateTagAdmin(ORACLE, 0x1B7Fd9679B2678F7e01897E0A3BA9aF18dF4f71e, true)");
console2.logBytes(a3);
console2.log("");

console2.log("1) PRIORITY_WITHDRAWAL.AUTO_FULFILL_LIMIT_ETH = 5000");
console2.logBytes(c1);
console2.log("");

console2.log("2) PRIORITY_WITHDRAWAL.DAILY_CAP_PER_USER_ETH = 10000");
console2.logBytes(c2);
console2.log("");

console2.log("3) PRIORITY_WITHDRAWAL.WEEKLY_CAP_PER_USER_ETH = 50000");
console2.logBytes(c3);
console2.log("");

console2.log("4) PRIORITY_WITHDRAWAL.FINALIZED_NOT_CLAIMED_EXPIRY_DAYS = 5");
console2.logBytes(c4);
console2.log("");

console2.log("5) PRIORITY_WITHDRAWAL.ESTIMATED_WD_TIME = 14400");
console2.logBytes(c5);
console2.log("");

console2.log("6) PRIORITY_USERS_FEE_BPS[0x6b6c4414f9fF7B1684380bc421A8b7036C040383] = 100");
console2.logBytes(c6);
}

function _simulateOnFork() internal {
vm.startPrank(ETHERFI_OPERATING_ADMIN);
_OPERATION_PARAMS.updateTagAdmin(_PRIORITY_WITHDRAWAL, ETHERFI_OPERATING_ADMIN, true);
_OPERATION_PARAMS.updateTagAdmin(_PRIORITY_USERS_FEE_BPS, ETHERFI_OPERATING_ADMIN, true);
_OPERATION_PARAMS.updateTagAdmin(_ORACLE, _PANKAJ_LEDGER, true);
_OPERATION_PARAMS.updateTagKeyValue(_PRIORITY_WITHDRAWAL, "AUTO_FULFILL_LIMIT_ETH", "5000");
_OPERATION_PARAMS.updateTagKeyValue(_PRIORITY_WITHDRAWAL, "DAILY_CAP_PER_USER_ETH", "10000");
_OPERATION_PARAMS.updateTagKeyValue(_PRIORITY_WITHDRAWAL, "WEEKLY_CAP_PER_USER_ETH", "50000");
_OPERATION_PARAMS.updateTagKeyValue(_PRIORITY_WITHDRAWAL, "FINALIZED_NOT_CLAIMED_EXPIRY_DAYS", "5");
_OPERATION_PARAMS.updateTagKeyValue(_PRIORITY_WITHDRAWAL, "ESTIMATED_WD_TIME", _ESTIMATED_WD_TIME_SECONDS);
_OPERATION_PARAMS.updateTagKeyValue(_PRIORITY_USERS_FEE_BPS, _TEST_PRIORITY_USER, "100");
vm.stopPrank();
}

function _writeGnosisTxFiles() internal {
address[] memory targets = new address[](9);
uint256[] memory values = new uint256[](9);
bytes[] memory data = new bytes[](9);

for (uint256 i = 0; i < 9; i++) {
targets[i] = address(_OPERATION_PARAMS);
values[i] = 0;
}

data[0] = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagAdmin.selector,
_PRIORITY_WITHDRAWAL,
ETHERFI_OPERATING_ADMIN,
true
);
data[1] = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagAdmin.selector,
_PRIORITY_USERS_FEE_BPS,
ETHERFI_OPERATING_ADMIN,
true
);
data[2] = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagAdmin.selector,
_ORACLE,
_PANKAJ_LEDGER,
true
);
data[3] = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_WITHDRAWAL,
"AUTO_FULFILL_LIMIT_ETH",
"5000"
);
data[4] = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_WITHDRAWAL,
"DAILY_CAP_PER_USER_ETH",
"10000"
);
data[5] = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_WITHDRAWAL,
"WEEKLY_CAP_PER_USER_ETH",
"50000"
);
data[6] = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_WITHDRAWAL,
"FINALIZED_NOT_CLAIMED_EXPIRY_DAYS",
"5"
);
data[7] = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_WITHDRAWAL,
"ESTIMATED_WD_TIME",
_ESTIMATED_WD_TIME_SECONDS
);
data[8] = abi.encodeWithSelector(
EtherFiOperationParameters.updateTagKeyValue.selector,
_PRIORITY_USERS_FEE_BPS,
_TEST_PRIORITY_USER,
"100"
);

writeSafeJson(
"script/upgrades/priority-queue",
"set-priority-queue-params.json",
ETHERFI_OPERATING_ADMIN,
targets,
values,
data,
1
);
}
}
Loading
Loading