Skip to content

Commit dea54ef

Browse files
fix(reasonCode & amount type): used enum for reasonCodes & amount (bytes -> uint64) (#29)
Co-authored-by: Mannan Goyal <mannangoyal@luganodes.com>
1 parent b40613b commit dea54ef

2 files changed

Lines changed: 33 additions & 35 deletions

File tree

src/Pectra.sol

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,19 @@ contract Pectra {
2121
/// @dev Maximum withdrawal amount as a uint64 (representing 2048 ether in gwei)
2222
uint64 public constant MAX_WITHDRAWAL_AMOUNT = 0x1DCD6500000;
2323

24-
// Failure reason codes
25-
uint8 public constant INVALID_PUBKEY_LENGTH = 1;
26-
uint8 public constant OPERATION_FAILED = 2;
27-
uint8 public constant INVALID_AMOUNT_LENGTH = 3;
28-
uint8 public constant INVALID_AMOUNT_VALUE = 4;
29-
uint8 public constant FULL_EXIT_NOT_CONFIRMED = 5;
30-
uint8 public constant AMOUNT_EXCEEDS_MAXIMUM = 6;
31-
32-
event ConsolidationFailed(uint8 reasonCode, bytes sourcePubkey, bytes targetPubkey);
33-
event SwitchFailed(uint8 reasonCode, bytes pubkey);
34-
event ExecutionLayerExitFailed(uint8 reasonCode, bytes pubkey, bytes amount);
24+
// Failure reason codes as enum
25+
enum FailureReason {
26+
INVALID_PUBKEY_LENGTH,
27+
OPERATION_FAILED,
28+
INVALID_AMOUNT_LENGTH,
29+
INVALID_AMOUNT_VALUE,
30+
FULL_EXIT_NOT_CONFIRMED,
31+
AMOUNT_EXCEEDS_MAXIMUM
32+
}
33+
34+
event ConsolidationFailed(FailureReason reasonCode, bytes sourcePubkey, bytes targetPubkey);
35+
event SwitchFailed(FailureReason reasonCode, bytes pubkey);
36+
event ExecutionLayerExitFailed(FailureReason reasonCode, bytes pubkey, uint64 amount);
3537

3638
error Unauthorized();
3739
error InvalidTargetPubkeyLength(bytes invalidTargetPubkey);
@@ -93,14 +95,14 @@ contract Pectra {
9395

9496
for (uint256 i = 0; i < batchSize; ++i) {
9597
if (sourcePubkeys[i].length != VALIDATOR_PUBKEY_LENGTH) {
96-
emit ConsolidationFailed(INVALID_PUBKEY_LENGTH, sourcePubkeys[i], targetPubkey);
98+
emit ConsolidationFailed(FailureReason.INVALID_PUBKEY_LENGTH, sourcePubkeys[i], targetPubkey);
9799
continue;
98100
}
99101

100102
bytes memory concatenated = abi.encodePacked(sourcePubkeys[i], targetPubkey);
101103
(bool success,) = consolidationTarget.call{value: consolidationFee}(concatenated);
102104
if (!success) {
103-
emit ConsolidationFailed(OPERATION_FAILED, sourcePubkeys[i], targetPubkey);
105+
emit ConsolidationFailed(FailureReason.OPERATION_FAILED, sourcePubkeys[i], targetPubkey);
104106
continue;
105107
}
106108
}
@@ -116,14 +118,14 @@ contract Pectra {
116118

117119
for (uint256 i = 0; i < batchSize; ++i) {
118120
if (pubkeys[i].length != VALIDATOR_PUBKEY_LENGTH) {
119-
emit SwitchFailed(INVALID_PUBKEY_LENGTH, pubkeys[i]);
121+
emit SwitchFailed(FailureReason.INVALID_PUBKEY_LENGTH, pubkeys[i]);
120122
continue;
121123
}
122124

123125
bytes memory concatenated = abi.encodePacked(pubkeys[i], pubkeys[i]);
124126
(bool success,) = consolidationTarget.call{value: switchFee}(concatenated);
125127
if (!success) {
126-
emit SwitchFailed(OPERATION_FAILED, pubkeys[i]);
128+
emit SwitchFailed(FailureReason.OPERATION_FAILED, pubkeys[i]);
127129
continue;
128130
}
129131
}
@@ -146,19 +148,19 @@ contract Pectra {
146148

147149
for (uint256 i = 0; i < batchSize; ++i) {
148150
if (data[i].pubkey.length != VALIDATOR_PUBKEY_LENGTH) {
149-
emit ExecutionLayerExitFailed(INVALID_PUBKEY_LENGTH, data[i].pubkey, abi.encodePacked(data[i].amount));
151+
emit ExecutionLayerExitFailed(FailureReason.INVALID_PUBKEY_LENGTH, data[i].pubkey, data[i].amount);
150152
continue;
151153
}
152154

153155
bool isZeroAmount = data[i].amount == 0;
154156

155157
if (isZeroAmount && !data[i].isFullExit) {
156-
emit ExecutionLayerExitFailed(FULL_EXIT_NOT_CONFIRMED, data[i].pubkey, abi.encodePacked(data[i].amount));
158+
emit ExecutionLayerExitFailed(FailureReason.FULL_EXIT_NOT_CONFIRMED, data[i].pubkey, data[i].amount);
157159
continue;
158160
}
159161

160162
if (!isZeroAmount && data[i].amount > MAX_WITHDRAWAL_AMOUNT) {
161-
emit ExecutionLayerExitFailed(AMOUNT_EXCEEDS_MAXIMUM, data[i].pubkey, abi.encodePacked(data[i].amount));
163+
emit ExecutionLayerExitFailed(FailureReason.AMOUNT_EXCEEDS_MAXIMUM, data[i].pubkey, data[i].amount);
162164
continue;
163165
}
164166

@@ -167,7 +169,7 @@ contract Pectra {
167169
bytes memory concatenated = abi.encodePacked(data[i].pubkey, amountBytes);
168170
(bool success,) = exitTarget.call{value: exitFee}(concatenated);
169171
if (!success) {
170-
emit ExecutionLayerExitFailed(OPERATION_FAILED, data[i].pubkey, amountBytes);
172+
emit ExecutionLayerExitFailed(FailureReason.OPERATION_FAILED, data[i].pubkey, data[i].amount);
171173
continue;
172174
}
173175
}

test/Pectra.t.sol

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,7 @@ contract PectraTest is Test {
154154
sources[0] = new bytes(pectra.VALIDATOR_PUBKEY_LENGTH() - 1);
155155
bytes memory target = validPubkey();
156156
vm.expectEmit(true, true, true, true);
157-
uint8 reasonCode = pectra.INVALID_PUBKEY_LENGTH();
158-
emit Pectra.ConsolidationFailed(reasonCode, sources[0], target);
157+
emit Pectra.ConsolidationFailed(Pectra.FailureReason.INVALID_PUBKEY_LENGTH, sources[0], target);
159158
vm.prank(address(pectra));
160159
pectra.batchConsolidation{value: 1}(sources, target);
161160
}
@@ -168,8 +167,7 @@ contract PectraTest is Test {
168167
sources[0] = validPubkey();
169168
bytes memory target = validPubkey();
170169
vm.expectEmit(true, true, true, true);
171-
uint8 reasonCode = pectra.OPERATION_FAILED();
172-
emit Pectra.ConsolidationFailed(reasonCode, sources[0], target);
170+
emit Pectra.ConsolidationFailed(Pectra.FailureReason.OPERATION_FAILED, sources[0], target);
173171
vm.prank(address(pectra));
174172
pectra.batchConsolidation{value: 1}(sources, target);
175173
// Restore successful code.
@@ -232,8 +230,7 @@ contract PectraTest is Test {
232230
bytes[] memory pubkeys = new bytes[](1);
233231
pubkeys[0] = new bytes(pectra.VALIDATOR_PUBKEY_LENGTH() - 1); // one byte less than required
234232
vm.expectEmit(true, true, true, true);
235-
uint8 reasonCode = pectra.INVALID_PUBKEY_LENGTH();
236-
emit Pectra.SwitchFailed(reasonCode, pubkeys[0]);
233+
emit Pectra.SwitchFailed(Pectra.FailureReason.INVALID_PUBKEY_LENGTH, pubkeys[0]);
237234
vm.prank(address(pectra));
238235
pectra.batchSwitch{value: 1}(pubkeys);
239236
}
@@ -243,8 +240,7 @@ contract PectraTest is Test {
243240
bytes[] memory pubkeys = new bytes[](1);
244241
pubkeys[0] = validPubkey();
245242
vm.expectEmit(true, true, true, true);
246-
uint8 reasonCode = pectra.OPERATION_FAILED();
247-
emit Pectra.SwitchFailed(reasonCode, pubkeys[0]);
243+
emit Pectra.SwitchFailed(Pectra.FailureReason.OPERATION_FAILED, pubkeys[0]);
248244
vm.prank(address(pectra));
249245
pectra.batchSwitch{value: 1}(pubkeys);
250246
vm.etch(consolidationTarget, feeCode);
@@ -310,8 +306,7 @@ contract PectraTest is Test {
310306
data[0].amount = 0;
311307
data[0].isFullExit = true;
312308
vm.expectEmit(true, true, true, true);
313-
uint8 reasonCode = pectra.INVALID_PUBKEY_LENGTH();
314-
emit Pectra.ExecutionLayerExitFailed(reasonCode, data[0].pubkey, abi.encodePacked(data[0].amount));
309+
emit Pectra.ExecutionLayerExitFailed(Pectra.FailureReason.INVALID_PUBKEY_LENGTH, data[0].pubkey, data[0].amount);
315310
vm.prank(address(pectra));
316311
pectra.batchELExit{value: 1}(data);
317312
}
@@ -322,8 +317,9 @@ contract PectraTest is Test {
322317
data[0].amount = 0; // Zero amount
323318
data[0].isFullExit = false; // Flag set to false
324319
vm.expectEmit(true, true, true, true);
325-
uint8 reasonCode = pectra.FULL_EXIT_NOT_CONFIRMED();
326-
emit Pectra.ExecutionLayerExitFailed(reasonCode, data[0].pubkey, abi.encodePacked(data[0].amount));
320+
emit Pectra.ExecutionLayerExitFailed(
321+
Pectra.FailureReason.FULL_EXIT_NOT_CONFIRMED, data[0].pubkey, data[0].amount
322+
);
327323
vm.prank(address(pectra));
328324
pectra.batchELExit{value: 1}(data);
329325
}
@@ -336,8 +332,9 @@ contract PectraTest is Test {
336332
data[0].isFullExit = true; // Not needed but included for consistency
337333

338334
vm.expectEmit(true, true, true, true);
339-
uint8 reasonCode = pectra.AMOUNT_EXCEEDS_MAXIMUM();
340-
emit Pectra.ExecutionLayerExitFailed(reasonCode, data[0].pubkey, abi.encodePacked(data[0].amount));
335+
emit Pectra.ExecutionLayerExitFailed(
336+
Pectra.FailureReason.AMOUNT_EXCEEDS_MAXIMUM, data[0].pubkey, data[0].amount
337+
);
341338

342339
vm.prank(address(pectra));
343340
pectra.batchELExit{value: 1}(data);
@@ -350,8 +347,7 @@ contract PectraTest is Test {
350347
data[0].amount = 1000000000; // 1 ether in gwei
351348
data[0].isFullExit = true; // Not needed but included for consistency
352349
vm.expectEmit(true, true, true, true);
353-
uint8 reasonCode = pectra.OPERATION_FAILED();
354-
emit Pectra.ExecutionLayerExitFailed(reasonCode, data[0].pubkey, abi.encodePacked(data[0].amount));
350+
emit Pectra.ExecutionLayerExitFailed(Pectra.FailureReason.OPERATION_FAILED, data[0].pubkey, data[0].amount);
355351
vm.prank(address(pectra));
356352
pectra.batchELExit{value: 1}(data);
357353
vm.etch(exitTarget, feeCode);

0 commit comments

Comments
 (0)