@lodestar/state-transition 1.39.0-dev.7ac2136122 → 1.39.0-dev.83fa4f530e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/block/processWithdrawals.d.ts +3 -3
- package/lib/block/processWithdrawals.d.ts.map +1 -1
- package/lib/block/processWithdrawals.js +152 -105
- package/lib/block/processWithdrawals.js.map +1 -1
- package/lib/signatureSets/proposer.d.ts +3 -4
- package/lib/signatureSets/proposer.d.ts.map +1 -1
- package/lib/signatureSets/proposer.js +5 -6
- package/lib/signatureSets/proposer.js.map +1 -1
- package/package.json +7 -7
- package/src/block/processWithdrawals.ts +230 -135
- package/src/signatureSets/proposer.ts +6 -7
|
@@ -3,9 +3,9 @@ import { capella } from "@lodestar/types";
|
|
|
3
3
|
import { CachedBeaconStateCapella, CachedBeaconStateElectra, CachedBeaconStateGloas } from "../types.js";
|
|
4
4
|
export declare function processWithdrawals(fork: ForkSeq, state: CachedBeaconStateCapella | CachedBeaconStateElectra | CachedBeaconStateGloas, payload?: capella.FullOrBlindedExecutionPayload): void;
|
|
5
5
|
export declare function getExpectedWithdrawals(fork: ForkSeq, state: CachedBeaconStateCapella | CachedBeaconStateElectra | CachedBeaconStateGloas): {
|
|
6
|
-
|
|
7
|
-
sampledValidators: number;
|
|
8
|
-
processedPartialWithdrawalsCount: number;
|
|
6
|
+
expectedWithdrawals: capella.Withdrawal[];
|
|
9
7
|
processedBuilderWithdrawalsCount: number;
|
|
8
|
+
processedPartialWithdrawalsCount: number;
|
|
9
|
+
processedValidatorSweepCount: number;
|
|
10
10
|
};
|
|
11
11
|
//# sourceMappingURL=processWithdrawals.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processWithdrawals.d.ts","sourceRoot":"","sources":["../../src/block/processWithdrawals.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EAMR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAiB,OAAO,EAAM,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAC,wBAAwB,EAAE,wBAAwB,EAAE,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAUvG,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,GAAG,sBAAsB,EACnF,OAAO,CAAC,EAAE,OAAO,CAAC,6BAA6B,GAC9C,IAAI,
|
|
1
|
+
{"version":3,"file":"processWithdrawals.d.ts","sourceRoot":"","sources":["../../src/block/processWithdrawals.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,OAAO,EAMR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAiB,OAAO,EAAM,MAAM,iBAAiB,CAAC;AAE7D,OAAO,EAAC,wBAAwB,EAAE,wBAAwB,EAAE,sBAAsB,EAAC,MAAM,aAAa,CAAC;AAUvG,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,GAAG,sBAAsB,EACnF,OAAO,CAAC,EAAE,OAAO,CAAC,6BAA6B,GAC9C,IAAI,CAuFN;AAkND,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,GAAG,sBAAsB,GAClF;IACD,mBAAmB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;IAC1C,gCAAgC,EAAE,MAAM,CAAC;IACzC,gCAAgC,EAAE,MAAM,CAAC;IACzC,4BAA4B,EAAE,MAAM,CAAC;CACtC,CA6DA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { byteArrayEquals } from "@chainsafe/ssz";
|
|
2
2
|
import { FAR_FUTURE_EPOCH, ForkSeq, MAX_EFFECTIVE_BALANCE, MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP, MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP, MAX_WITHDRAWALS_PER_PAYLOAD, MIN_ACTIVATION_BALANCE, } from "@lodestar/params";
|
|
3
3
|
import { ssz } from "@lodestar/types";
|
|
4
|
-
import {
|
|
4
|
+
import { toRootHex } from "@lodestar/utils";
|
|
5
5
|
import { isBuilderPaymentWithdrawable, isParentBlockFull } from "../util/gloas.js";
|
|
6
6
|
import { decreaseBalance, getMaxEffectiveBalance, hasEth1WithdrawalCredential, hasExecutionWithdrawalCredential, isCapellaPayloadHeader, } from "../util/index.js";
|
|
7
7
|
export function processWithdrawals(fork, state, payload) {
|
|
@@ -9,9 +9,10 @@ export function processWithdrawals(fork, state, payload) {
|
|
|
9
9
|
if (fork >= ForkSeq.gloas && !isParentBlockFull(state)) {
|
|
10
10
|
return;
|
|
11
11
|
}
|
|
12
|
-
// processedPartialWithdrawalsCount is withdrawals coming from EL since electra (EIP-7002)
|
|
13
12
|
// processedBuilderWithdrawalsCount is withdrawals coming from builder payment since gloas (EIP-7732)
|
|
14
|
-
|
|
13
|
+
// processedPartialWithdrawalsCount is withdrawals coming from EL since electra (EIP-7002)
|
|
14
|
+
// processedValidatorSweepCount is withdrawals coming from validator sweep
|
|
15
|
+
const { expectedWithdrawals, processedBuilderWithdrawalsCount, processedPartialWithdrawalsCount } = getExpectedWithdrawals(fork, state);
|
|
15
16
|
const numWithdrawals = expectedWithdrawals.length;
|
|
16
17
|
// After gloas, withdrawals are verified later in processExecutionPayloadEnvelope
|
|
17
18
|
if (fork < ForkSeq.gloas) {
|
|
@@ -37,11 +38,9 @@ export function processWithdrawals(fork, state, payload) {
|
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
|
-
|
|
41
|
-
const withdrawal = expectedWithdrawals[i];
|
|
42
|
-
decreaseBalance(state, withdrawal.validatorIndex, Number(withdrawal.amount));
|
|
43
|
-
}
|
|
41
|
+
applyWithdrawals(state, expectedWithdrawals);
|
|
44
42
|
if (fork >= ForkSeq.electra) {
|
|
43
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.0/specs/electra/beacon-chain.md#new-update_pending_partial_withdrawals
|
|
45
44
|
const stateElectra = state;
|
|
46
45
|
stateElectra.pendingPartialWithdrawals = stateElectra.pendingPartialWithdrawals.sliceFrom(processedPartialWithdrawalsCount);
|
|
47
46
|
}
|
|
@@ -61,10 +60,12 @@ export function processWithdrawals(fork, state, payload) {
|
|
|
61
60
|
]);
|
|
62
61
|
}
|
|
63
62
|
// Update the nextWithdrawalIndex
|
|
63
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.0/specs/capella/beacon-chain.md#new-update_next_withdrawal_index
|
|
64
64
|
const latestWithdrawal = expectedWithdrawals.at(-1);
|
|
65
65
|
if (latestWithdrawal) {
|
|
66
66
|
state.nextWithdrawalIndex = latestWithdrawal.index + 1;
|
|
67
67
|
}
|
|
68
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.0/specs/capella/beacon-chain.md#new-update_next_withdrawal_validator_index
|
|
68
69
|
// Update the nextWithdrawalValidatorIndex
|
|
69
70
|
if (latestWithdrawal && expectedWithdrawals.length === MAX_WITHDRAWALS_PER_PAYLOAD) {
|
|
70
71
|
// All slots filled, nextWithdrawalValidatorIndex should be validatorIndex having next turn
|
|
@@ -77,110 +78,119 @@ export function processWithdrawals(fork, state, payload) {
|
|
|
77
78
|
(state.nextWithdrawalValidatorIndex + MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP) % state.validators.length;
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
throw new Error(`getExpectedWithdrawals not supported at forkSeq=${fork} < ForkSeq.capella`);
|
|
83
|
-
}
|
|
81
|
+
function getBuilderWithdrawals(state, withdrawalIndex, balanceAfterWithdrawals) {
|
|
82
|
+
const builderWithdrawals = [];
|
|
84
83
|
const epoch = state.epochCtx.epoch;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
: stateGloas.builderPendingWithdrawals.getReadonly(i);
|
|
104
|
-
if (withdrawal.withdrawableEpoch > epoch || withdrawals.length + 1 === MAX_WITHDRAWALS_PER_PAYLOAD) {
|
|
105
|
-
break;
|
|
84
|
+
const allBuilderPendingWithdrawals = state.builderPendingWithdrawals.length <= MAX_WITHDRAWALS_PER_PAYLOAD
|
|
85
|
+
? state.builderPendingWithdrawals.getAllReadonly()
|
|
86
|
+
: null;
|
|
87
|
+
let processedCount = 0;
|
|
88
|
+
for (let i = 0; i < state.builderPendingWithdrawals.length; i++) {
|
|
89
|
+
const withdrawal = allBuilderPendingWithdrawals
|
|
90
|
+
? allBuilderPendingWithdrawals[i]
|
|
91
|
+
: state.builderPendingWithdrawals.getReadonly(i);
|
|
92
|
+
if (withdrawal.withdrawableEpoch > epoch || builderWithdrawals.length === MAX_WITHDRAWALS_PER_PAYLOAD) {
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
if (isBuilderPaymentWithdrawable(state, withdrawal)) {
|
|
96
|
+
const builderIndex = withdrawal.builderIndex;
|
|
97
|
+
const builder = state.validators.get(withdrawal.builderIndex);
|
|
98
|
+
let balance = balanceAfterWithdrawals.get(builderIndex);
|
|
99
|
+
if (balance === undefined) {
|
|
100
|
+
balance = state.balances.get(builderIndex);
|
|
101
|
+
balanceAfterWithdrawals.set(builderIndex, balance);
|
|
106
102
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const builder = state.validators.get(withdrawal.builderIndex);
|
|
111
|
-
let withdrawableBalance = 0;
|
|
112
|
-
if (builder.slashed) {
|
|
113
|
-
withdrawableBalance = balance < withdrawal.amount ? balance : withdrawal.amount;
|
|
114
|
-
}
|
|
115
|
-
else if (balance > MIN_ACTIVATION_BALANCE) {
|
|
116
|
-
withdrawableBalance =
|
|
117
|
-
balance - MIN_ACTIVATION_BALANCE < withdrawal.amount ? balance - MIN_ACTIVATION_BALANCE : withdrawal.amount;
|
|
118
|
-
}
|
|
119
|
-
if (withdrawableBalance > 0) {
|
|
120
|
-
withdrawals.push({
|
|
121
|
-
index: withdrawalIndex,
|
|
122
|
-
validatorIndex: withdrawal.builderIndex,
|
|
123
|
-
address: withdrawal.feeRecipient,
|
|
124
|
-
amount: BigInt(withdrawableBalance),
|
|
125
|
-
});
|
|
126
|
-
withdrawalIndex++;
|
|
127
|
-
withdrawnBalances.set(withdrawal.builderIndex, totalWithdrawn + withdrawableBalance);
|
|
128
|
-
}
|
|
103
|
+
let withdrawableBalance = 0;
|
|
104
|
+
if (builder.slashed) {
|
|
105
|
+
withdrawableBalance = balance < withdrawal.amount ? balance : withdrawal.amount;
|
|
129
106
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (isPostElectra) {
|
|
134
|
-
// In pre-gloas, partialWithdrawalBound == MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP
|
|
135
|
-
const partialWithdrawalBound = Math.min(withdrawals.length + MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP, MAX_WITHDRAWALS_PER_PAYLOAD - 1);
|
|
136
|
-
const stateElectra = state;
|
|
137
|
-
// MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP = 8, PENDING_PARTIAL_WITHDRAWALS_LIMIT: 134217728 so we should only call getAllReadonly() if it makes sense
|
|
138
|
-
// pendingPartialWithdrawals comes from EIP-7002 smart contract where it takes fee so it's more likely than not validator is in correct condition to withdraw
|
|
139
|
-
// also we may break early if withdrawableEpoch > epoch
|
|
140
|
-
const allPendingPartialWithdrawals = stateElectra.pendingPartialWithdrawals.length <= partialWithdrawalBound
|
|
141
|
-
? stateElectra.pendingPartialWithdrawals.getAllReadonly()
|
|
142
|
-
: null;
|
|
143
|
-
// EIP-7002: Execution layer triggerable withdrawals
|
|
144
|
-
for (let i = 0; i < stateElectra.pendingPartialWithdrawals.length; i++) {
|
|
145
|
-
const withdrawal = allPendingPartialWithdrawals
|
|
146
|
-
? allPendingPartialWithdrawals[i]
|
|
147
|
-
: stateElectra.pendingPartialWithdrawals.getReadonly(i);
|
|
148
|
-
if (withdrawal.withdrawableEpoch > epoch || withdrawals.length === partialWithdrawalBound) {
|
|
149
|
-
break;
|
|
107
|
+
else if (balance > MIN_ACTIVATION_BALANCE) {
|
|
108
|
+
withdrawableBalance =
|
|
109
|
+
balance - MIN_ACTIVATION_BALANCE < withdrawal.amount ? balance - MIN_ACTIVATION_BALANCE : withdrawal.amount;
|
|
150
110
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
const balance = state.balances.get(withdrawal.validatorIndex) - totalWithdrawn;
|
|
154
|
-
if (validator.exitEpoch === FAR_FUTURE_EPOCH &&
|
|
155
|
-
validator.effectiveBalance >= MIN_ACTIVATION_BALANCE &&
|
|
156
|
-
balance > MIN_ACTIVATION_BALANCE) {
|
|
157
|
-
const balanceOverMinActivationBalance = BigInt(balance - MIN_ACTIVATION_BALANCE);
|
|
158
|
-
const withdrawableBalance = balanceOverMinActivationBalance < withdrawal.amount ? balanceOverMinActivationBalance : withdrawal.amount;
|
|
159
|
-
withdrawals.push({
|
|
111
|
+
if (withdrawableBalance > 0) {
|
|
112
|
+
builderWithdrawals.push({
|
|
160
113
|
index: withdrawalIndex,
|
|
161
|
-
validatorIndex: withdrawal.
|
|
162
|
-
address:
|
|
163
|
-
amount: withdrawableBalance,
|
|
114
|
+
validatorIndex: withdrawal.builderIndex,
|
|
115
|
+
address: withdrawal.feeRecipient,
|
|
116
|
+
amount: BigInt(withdrawableBalance),
|
|
164
117
|
});
|
|
165
118
|
withdrawalIndex++;
|
|
166
|
-
|
|
119
|
+
balanceAfterWithdrawals.set(builderIndex, balance - withdrawableBalance);
|
|
167
120
|
}
|
|
168
|
-
processedPartialWithdrawalsCount++;
|
|
169
121
|
}
|
|
122
|
+
processedCount++;
|
|
170
123
|
}
|
|
171
|
-
|
|
172
|
-
|
|
124
|
+
return { builderWithdrawals, withdrawalIndex, processedCount };
|
|
125
|
+
}
|
|
126
|
+
function getPendingPartialWithdrawals(state, withdrawalIndex, numPriorWithdrawal, balanceAfterWithdrawals) {
|
|
127
|
+
const epoch = state.epochCtx.epoch;
|
|
128
|
+
const pendingPartialWithdrawals = [];
|
|
129
|
+
const validators = state.validators;
|
|
130
|
+
// In pre-gloas, partialWithdrawalBound == MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP
|
|
131
|
+
const partialWithdrawalBound = Math.min(numPriorWithdrawal + MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP, MAX_WITHDRAWALS_PER_PAYLOAD - 1);
|
|
132
|
+
// MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP = 8, PENDING_PARTIAL_WITHDRAWALS_LIMIT: 134217728 so we should only call getAllReadonly() if it makes sense
|
|
133
|
+
// pendingPartialWithdrawals comes from EIP-7002 smart contract where it takes fee so it's more likely than not validator is in correct condition to withdraw
|
|
134
|
+
// also we may break early if withdrawableEpoch > epoch
|
|
135
|
+
const allPendingPartialWithdrawals = state.pendingPartialWithdrawals.length <= partialWithdrawalBound
|
|
136
|
+
? state.pendingPartialWithdrawals.getAllReadonly()
|
|
137
|
+
: null;
|
|
138
|
+
// EIP-7002: Execution layer triggerable withdrawals
|
|
139
|
+
let processedCount = 0;
|
|
140
|
+
for (let i = 0; i < state.pendingPartialWithdrawals.length; i++) {
|
|
141
|
+
const withdrawal = allPendingPartialWithdrawals
|
|
142
|
+
? allPendingPartialWithdrawals[i]
|
|
143
|
+
: state.pendingPartialWithdrawals.getReadonly(i);
|
|
144
|
+
if (withdrawal.withdrawableEpoch > epoch ||
|
|
145
|
+
pendingPartialWithdrawals.length + numPriorWithdrawal === partialWithdrawalBound) {
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
const validatorIndex = withdrawal.validatorIndex;
|
|
149
|
+
const validator = validators.getReadonly(validatorIndex);
|
|
150
|
+
let balance = balanceAfterWithdrawals.get(validatorIndex);
|
|
151
|
+
if (balance === undefined) {
|
|
152
|
+
balance = state.balances.get(validatorIndex);
|
|
153
|
+
balanceAfterWithdrawals.set(validatorIndex, balance);
|
|
154
|
+
}
|
|
155
|
+
if (validator.exitEpoch === FAR_FUTURE_EPOCH &&
|
|
156
|
+
validator.effectiveBalance >= MIN_ACTIVATION_BALANCE &&
|
|
157
|
+
balance > MIN_ACTIVATION_BALANCE) {
|
|
158
|
+
const balanceOverMinActivationBalance = BigInt(balance - MIN_ACTIVATION_BALANCE);
|
|
159
|
+
const withdrawableBalance = balanceOverMinActivationBalance < withdrawal.amount ? balanceOverMinActivationBalance : withdrawal.amount;
|
|
160
|
+
pendingPartialWithdrawals.push({
|
|
161
|
+
index: withdrawalIndex,
|
|
162
|
+
validatorIndex,
|
|
163
|
+
address: validator.withdrawalCredentials.subarray(12),
|
|
164
|
+
amount: withdrawableBalance,
|
|
165
|
+
});
|
|
166
|
+
withdrawalIndex++;
|
|
167
|
+
balanceAfterWithdrawals.set(validatorIndex, balance - Number(withdrawableBalance));
|
|
168
|
+
}
|
|
169
|
+
processedCount++;
|
|
170
|
+
}
|
|
171
|
+
return { pendingPartialWithdrawals, withdrawalIndex, processedCount };
|
|
172
|
+
}
|
|
173
|
+
function getValidatorsSweepWithdrawals(fork, state, withdrawalIndex, numPriorWithdrawal, balanceAfterWithdrawals) {
|
|
174
|
+
const sweepWithdrawals = [];
|
|
175
|
+
const epoch = state.epochCtx.epoch;
|
|
176
|
+
const { validators, balances, nextWithdrawalValidatorIndex } = state;
|
|
177
|
+
const isPostElectra = fork >= ForkSeq.electra;
|
|
178
|
+
const validatorsLimit = Math.min(state.validators.length, MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP);
|
|
179
|
+
let processedCount = 0;
|
|
173
180
|
// Just run a bounded loop max iterating over all withdrawals
|
|
174
181
|
// however breaks out once we have MAX_WITHDRAWALS_PER_PAYLOAD
|
|
175
|
-
for (n = 0; n <
|
|
182
|
+
for (let n = 0; n < validatorsLimit; n++) {
|
|
183
|
+
if (sweepWithdrawals.length + numPriorWithdrawal === MAX_WITHDRAWALS_PER_PAYLOAD) {
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
176
186
|
// Get next validator in turn
|
|
177
187
|
const validatorIndex = (nextWithdrawalValidatorIndex + n) % validators.length;
|
|
178
188
|
const validator = validators.getReadonly(validatorIndex);
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
189
|
+
let balance = balanceAfterWithdrawals.get(validatorIndex);
|
|
190
|
+
if (balance === undefined) {
|
|
191
|
+
balance = balances.get(validatorIndex);
|
|
192
|
+
balanceAfterWithdrawals.set(validatorIndex, balance);
|
|
193
|
+
}
|
|
184
194
|
const { withdrawableEpoch, withdrawalCredentials, effectiveBalance } = validator;
|
|
185
195
|
const hasWithdrawableCredentials = isPostElectra
|
|
186
196
|
? hasExecutionWithdrawalCredential(withdrawalCredentials)
|
|
@@ -188,37 +198,74 @@ export function getExpectedWithdrawals(fork, state) {
|
|
|
188
198
|
// early skip for balance = 0 as its now more likely that validator has exited/slashed with
|
|
189
199
|
// balance zero than not have withdrawal credentials set
|
|
190
200
|
if (balance === 0 || !hasWithdrawableCredentials) {
|
|
201
|
+
processedCount++;
|
|
191
202
|
continue;
|
|
192
203
|
}
|
|
193
204
|
// capella full withdrawal
|
|
194
205
|
if (withdrawableEpoch <= epoch) {
|
|
195
|
-
|
|
206
|
+
sweepWithdrawals.push({
|
|
196
207
|
index: withdrawalIndex,
|
|
197
208
|
validatorIndex,
|
|
198
209
|
address: validator.withdrawalCredentials.subarray(12),
|
|
199
210
|
amount: BigInt(balance),
|
|
200
211
|
});
|
|
201
212
|
withdrawalIndex++;
|
|
202
|
-
|
|
213
|
+
balanceAfterWithdrawals.set(validatorIndex, 0);
|
|
203
214
|
}
|
|
204
215
|
else if (effectiveBalance === (isPostElectra ? getMaxEffectiveBalance(withdrawalCredentials) : MAX_EFFECTIVE_BALANCE) &&
|
|
205
216
|
balance > effectiveBalance) {
|
|
206
217
|
// capella partial withdrawal
|
|
207
218
|
const partialAmount = balance - effectiveBalance;
|
|
208
|
-
|
|
219
|
+
sweepWithdrawals.push({
|
|
209
220
|
index: withdrawalIndex,
|
|
210
221
|
validatorIndex,
|
|
211
222
|
address: validator.withdrawalCredentials.subarray(12),
|
|
212
223
|
amount: BigInt(partialAmount),
|
|
213
224
|
});
|
|
214
225
|
withdrawalIndex++;
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
// Break if we have enough to pack the block
|
|
218
|
-
if (withdrawals.length >= MAX_WITHDRAWALS_PER_PAYLOAD) {
|
|
219
|
-
break;
|
|
226
|
+
balanceAfterWithdrawals.set(validatorIndex, balance - partialAmount);
|
|
220
227
|
}
|
|
228
|
+
processedCount++;
|
|
229
|
+
}
|
|
230
|
+
return { sweepWithdrawals, processedCount };
|
|
231
|
+
}
|
|
232
|
+
function applyWithdrawals(state, withdrawals) {
|
|
233
|
+
for (const withdrawal of withdrawals) {
|
|
234
|
+
decreaseBalance(state, withdrawal.validatorIndex, Number(withdrawal.amount));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
export function getExpectedWithdrawals(fork, state) {
|
|
238
|
+
if (fork < ForkSeq.capella) {
|
|
239
|
+
throw new Error(`getExpectedWithdrawals not supported at forkSeq=${fork} < ForkSeq.capella`);
|
|
240
|
+
}
|
|
241
|
+
let withdrawalIndex = state.nextWithdrawalIndex;
|
|
242
|
+
const expectedWithdrawals = [];
|
|
243
|
+
// Map to track balances after applying withdrawals
|
|
244
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.0/specs/capella/beacon-chain.md#new-get_balance_after_withdrawals
|
|
245
|
+
const balanceAfterWithdrawals = new Map();
|
|
246
|
+
// partialWithdrawalsCount is withdrawals coming from EL since electra (EIP-7002)
|
|
247
|
+
let processedPartialWithdrawalsCount = 0;
|
|
248
|
+
// builderWithdrawalsCount is withdrawals coming from builder payments since Gloas (EIP-7732)
|
|
249
|
+
let processedBuilderWithdrawalsCount = 0;
|
|
250
|
+
if (fork >= ForkSeq.gloas) {
|
|
251
|
+
const { builderWithdrawals, withdrawalIndex: newWithdrawalIndex, processedCount, } = getBuilderWithdrawals(state, withdrawalIndex, balanceAfterWithdrawals);
|
|
252
|
+
expectedWithdrawals.push(...builderWithdrawals);
|
|
253
|
+
withdrawalIndex = newWithdrawalIndex;
|
|
254
|
+
processedBuilderWithdrawalsCount = processedCount;
|
|
255
|
+
}
|
|
256
|
+
if (fork >= ForkSeq.electra) {
|
|
257
|
+
const { pendingPartialWithdrawals, withdrawalIndex: newWithdrawalIndex, processedCount, } = getPendingPartialWithdrawals(state, withdrawalIndex, expectedWithdrawals.length, balanceAfterWithdrawals);
|
|
258
|
+
expectedWithdrawals.push(...pendingPartialWithdrawals);
|
|
259
|
+
withdrawalIndex = newWithdrawalIndex;
|
|
260
|
+
processedPartialWithdrawalsCount = processedCount;
|
|
221
261
|
}
|
|
222
|
-
|
|
262
|
+
const { sweepWithdrawals, processedCount: processedValidatorSweepCount } = getValidatorsSweepWithdrawals(fork, state, withdrawalIndex, expectedWithdrawals.length, balanceAfterWithdrawals);
|
|
263
|
+
expectedWithdrawals.push(...sweepWithdrawals);
|
|
264
|
+
return {
|
|
265
|
+
expectedWithdrawals,
|
|
266
|
+
processedBuilderWithdrawalsCount,
|
|
267
|
+
processedPartialWithdrawalsCount,
|
|
268
|
+
processedValidatorSweepCount,
|
|
269
|
+
};
|
|
223
270
|
}
|
|
224
271
|
//# sourceMappingURL=processWithdrawals.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"processWithdrawals.js","sourceRoot":"","sources":["../../src/block/processWithdrawals.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"processWithdrawals.js","sourceRoot":"","sources":["../../src/block/processWithdrawals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { BeaconConfig } from "@lodestar/config";
|
|
2
|
-
import { SignedBeaconBlock, SignedBlindedBeaconBlock, phase0 } from "@lodestar/types";
|
|
2
|
+
import { SignedBeaconBlock, SignedBlindedBeaconBlock, Slot, phase0 } from "@lodestar/types";
|
|
3
3
|
import { Index2PubkeyCache } from "../cache/pubkeyCache.js";
|
|
4
|
-
import { CachedBeaconStateAllForks } from "../types.js";
|
|
5
4
|
import { ISignatureSet } from "../util/signatureSets.js";
|
|
6
5
|
export declare function verifyProposerSignature(config: BeaconConfig, index2pubkey: Index2PubkeyCache, signedBlock: SignedBeaconBlock | SignedBlindedBeaconBlock): boolean;
|
|
7
6
|
export declare function getBlockProposerSignatureSet(config: BeaconConfig, index2pubkey: Index2PubkeyCache, signedBlock: SignedBeaconBlock | SignedBlindedBeaconBlock): ISignatureSet;
|
|
8
|
-
export declare function getBlockHeaderProposerSignatureSetByParentStateSlot(index2pubkey: Index2PubkeyCache,
|
|
9
|
-
export declare function getBlockHeaderProposerSignatureSetByHeaderSlot(
|
|
7
|
+
export declare function getBlockHeaderProposerSignatureSetByParentStateSlot(config: BeaconConfig, index2pubkey: Index2PubkeyCache, parentStateSlot: Slot, signedBlockHeader: phase0.SignedBeaconBlockHeader): ISignatureSet;
|
|
8
|
+
export declare function getBlockHeaderProposerSignatureSetByHeaderSlot(config: BeaconConfig, index2pubkey: Index2PubkeyCache, signedBlockHeader: phase0.SignedBeaconBlockHeader): ISignatureSet;
|
|
10
9
|
//# sourceMappingURL=proposer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposer.d.ts","sourceRoot":"","sources":["../../src/signatureSets/proposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAC,iBAAiB,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"proposer.d.ts","sourceRoot":"","sources":["../../src/signatureSets/proposer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAC,iBAAiB,EAAE,wBAAwB,EAAE,IAAI,EAAwB,MAAM,EAAM,MAAM,iBAAiB,CAAC;AACrH,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAC,aAAa,EAAuC,MAAM,0BAA0B,CAAC;AAE7F,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,iBAAiB,EAC/B,WAAW,EAAE,iBAAiB,GAAG,wBAAwB,GACxD,OAAO,CAGT;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,iBAAiB,EAC/B,WAAW,EAAE,iBAAiB,GAAG,wBAAwB,GACxD,aAAa,CAgBf;AAED,wBAAgB,mDAAmD,CACjE,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,iBAAiB,EAC/B,eAAe,EAAE,IAAI,EACrB,iBAAiB,EAAE,MAAM,CAAC,uBAAuB,iBAGlD;AAED,wBAAgB,8CAA8C,CAC5D,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,iBAAiB,EAC/B,iBAAiB,EAAE,MAAM,CAAC,uBAAuB,iBAGlD"}
|
|
@@ -21,14 +21,13 @@ export function getBlockProposerSignatureSet(config, index2pubkey, signedBlock)
|
|
|
21
21
|
signature: signedBlock.signature,
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
|
-
export function getBlockHeaderProposerSignatureSetByParentStateSlot(index2pubkey,
|
|
25
|
-
return getBlockHeaderProposerSignatureSet(
|
|
24
|
+
export function getBlockHeaderProposerSignatureSetByParentStateSlot(config, index2pubkey, parentStateSlot, signedBlockHeader) {
|
|
25
|
+
return getBlockHeaderProposerSignatureSet(config, index2pubkey, signedBlockHeader, parentStateSlot);
|
|
26
26
|
}
|
|
27
|
-
export function getBlockHeaderProposerSignatureSetByHeaderSlot(
|
|
28
|
-
return getBlockHeaderProposerSignatureSet(
|
|
27
|
+
export function getBlockHeaderProposerSignatureSetByHeaderSlot(config, index2pubkey, signedBlockHeader) {
|
|
28
|
+
return getBlockHeaderProposerSignatureSet(config, index2pubkey, signedBlockHeader, signedBlockHeader.message.slot);
|
|
29
29
|
}
|
|
30
|
-
function getBlockHeaderProposerSignatureSet(
|
|
31
|
-
const { config } = state;
|
|
30
|
+
function getBlockHeaderProposerSignatureSet(config, index2pubkey, signedBlockHeader, domainSlot) {
|
|
32
31
|
const domain = config.getDomain(domainSlot, DOMAIN_BEACON_PROPOSER, signedBlockHeader.message.slot);
|
|
33
32
|
return {
|
|
34
33
|
type: SignatureSetType.single,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposer.js","sourceRoot":"","sources":["../../src/signatureSets/proposer.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,sBAAsB,EAAC,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAoD,oBAAoB,EAAU,GAAG,EAAC,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"proposer.js","sourceRoot":"","sources":["../../src/signatureSets/proposer.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,sBAAsB,EAAC,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAoD,oBAAoB,EAAU,GAAG,EAAC,MAAM,iBAAiB,CAAC;AAErH,OAAO,EAAC,kBAAkB,EAAC,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAgB,gBAAgB,EAAE,kBAAkB,EAAC,MAAM,0BAA0B,CAAC;AAE7F,MAAM,UAAU,uBAAuB,CACrC,MAAoB,EACpB,YAA+B,EAC/B,WAAyD;IAEzD,MAAM,YAAY,GAAG,4BAA4B,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IACrF,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,MAAoB,EACpB,YAA+B,EAC/B,WAAyD;IAEzD,oHAAoH;IACpH,0GAA0G;IAC1G,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,sBAAsB,EAAE,SAAS,CAAC,CAAC;IAE9E,MAAM,SAAS,GAAG,oBAAoB,CAAC,WAAW,CAAC,OAAO,CAAC;QACzD,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,kBAAkB;QAC/E,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC;IAE9D,OAAO;QACL,IAAI,EAAE,gBAAgB,CAAC,MAAM;QAC7B,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC;QACvD,WAAW,EAAE,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;QACvE,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mDAAmD,CACjE,MAAoB,EACpB,YAA+B,EAC/B,eAAqB,EACrB,iBAAiD;IAEjD,OAAO,kCAAkC,CAAC,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,8CAA8C,CAC5D,MAAoB,EACpB,YAA+B,EAC/B,iBAAiD;IAEjD,OAAO,kCAAkC,CAAC,MAAM,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACrH,CAAC;AAED,SAAS,kCAAkC,CACzC,MAAoB,EACpB,YAA+B,EAC/B,iBAAiD,EACjD,UAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,sBAAsB,EAAE,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpG,OAAO;QACL,IAAI,EAAE,gBAAgB,CAAC,MAAM;QAC7B,MAAM,EAAE,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,aAAa,CAAC;QAC7D,WAAW,EAAE,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC;QAChG,SAAS,EAAE,iBAAiB,CAAC,SAAS;KACvC,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"bugs": {
|
|
12
12
|
"url": "https://github.com/ChainSafe/lodestar/issues"
|
|
13
13
|
},
|
|
14
|
-
"version": "1.39.0-dev.
|
|
14
|
+
"version": "1.39.0-dev.83fa4f530e",
|
|
15
15
|
"type": "module",
|
|
16
16
|
"exports": {
|
|
17
17
|
".": {
|
|
@@ -62,14 +62,14 @@
|
|
|
62
62
|
"@chainsafe/pubkey-index-map": "^3.0.0",
|
|
63
63
|
"@chainsafe/ssz": "^1.2.2",
|
|
64
64
|
"@chainsafe/swap-or-not-shuffle": "^1.2.1",
|
|
65
|
-
"@lodestar/config": "^1.39.0-dev.
|
|
66
|
-
"@lodestar/params": "^1.39.0-dev.
|
|
67
|
-
"@lodestar/types": "^1.39.0-dev.
|
|
68
|
-
"@lodestar/utils": "^1.39.0-dev.
|
|
65
|
+
"@lodestar/config": "^1.39.0-dev.83fa4f530e",
|
|
66
|
+
"@lodestar/params": "^1.39.0-dev.83fa4f530e",
|
|
67
|
+
"@lodestar/types": "^1.39.0-dev.83fa4f530e",
|
|
68
|
+
"@lodestar/utils": "^1.39.0-dev.83fa4f530e",
|
|
69
69
|
"bigint-buffer": "^1.1.5"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
|
-
"@lodestar/api": "^1.39.0-dev.
|
|
72
|
+
"@lodestar/api": "^1.39.0-dev.83fa4f530e"
|
|
73
73
|
},
|
|
74
74
|
"keywords": [
|
|
75
75
|
"ethereum",
|
|
@@ -77,5 +77,5 @@
|
|
|
77
77
|
"beacon",
|
|
78
78
|
"blockchain"
|
|
79
79
|
],
|
|
80
|
-
"gitHead": "
|
|
80
|
+
"gitHead": "d3034acf66651c2a33dc7f8ebc179ff1ae238fc4"
|
|
81
81
|
}
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
MIN_ACTIVATION_BALANCE,
|
|
10
10
|
} from "@lodestar/params";
|
|
11
11
|
import {ValidatorIndex, capella, ssz} from "@lodestar/types";
|
|
12
|
-
import {
|
|
12
|
+
import {toRootHex} from "@lodestar/utils";
|
|
13
13
|
import {CachedBeaconStateCapella, CachedBeaconStateElectra, CachedBeaconStateGloas} from "../types.js";
|
|
14
14
|
import {isBuilderPaymentWithdrawable, isParentBlockFull} from "../util/gloas.ts";
|
|
15
15
|
import {
|
|
@@ -30,13 +30,11 @@ export function processWithdrawals(
|
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
// processedPartialWithdrawalsCount is withdrawals coming from EL since electra (EIP-7002)
|
|
34
33
|
// processedBuilderWithdrawalsCount is withdrawals coming from builder payment since gloas (EIP-7732)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
} = getExpectedWithdrawals(fork, state);
|
|
34
|
+
// processedPartialWithdrawalsCount is withdrawals coming from EL since electra (EIP-7002)
|
|
35
|
+
// processedValidatorSweepCount is withdrawals coming from validator sweep
|
|
36
|
+
const {expectedWithdrawals, processedBuilderWithdrawalsCount, processedPartialWithdrawalsCount} =
|
|
37
|
+
getExpectedWithdrawals(fork, state);
|
|
40
38
|
const numWithdrawals = expectedWithdrawals.length;
|
|
41
39
|
|
|
42
40
|
// After gloas, withdrawals are verified later in processExecutionPayloadEnvelope
|
|
@@ -68,12 +66,10 @@ export function processWithdrawals(
|
|
|
68
66
|
}
|
|
69
67
|
}
|
|
70
68
|
|
|
71
|
-
|
|
72
|
-
const withdrawal = expectedWithdrawals[i];
|
|
73
|
-
decreaseBalance(state, withdrawal.validatorIndex, Number(withdrawal.amount));
|
|
74
|
-
}
|
|
69
|
+
applyWithdrawals(state, expectedWithdrawals);
|
|
75
70
|
|
|
76
71
|
if (fork >= ForkSeq.electra) {
|
|
72
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.0/specs/electra/beacon-chain.md#new-update_pending_partial_withdrawals
|
|
77
73
|
const stateElectra = state as CachedBeaconStateElectra;
|
|
78
74
|
stateElectra.pendingPartialWithdrawals = stateElectra.pendingPartialWithdrawals.sliceFrom(
|
|
79
75
|
processedPartialWithdrawalsCount
|
|
@@ -97,13 +93,14 @@ export function processWithdrawals(
|
|
|
97
93
|
...remainingWithdrawals,
|
|
98
94
|
]);
|
|
99
95
|
}
|
|
100
|
-
|
|
101
96
|
// Update the nextWithdrawalIndex
|
|
97
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.0/specs/capella/beacon-chain.md#new-update_next_withdrawal_index
|
|
102
98
|
const latestWithdrawal = expectedWithdrawals.at(-1);
|
|
103
99
|
if (latestWithdrawal) {
|
|
104
100
|
state.nextWithdrawalIndex = latestWithdrawal.index + 1;
|
|
105
101
|
}
|
|
106
102
|
|
|
103
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.0/specs/capella/beacon-chain.md#new-update_next_withdrawal_validator_index
|
|
107
104
|
// Update the nextWithdrawalValidatorIndex
|
|
108
105
|
if (latestWithdrawal && expectedWithdrawals.length === MAX_WITHDRAWALS_PER_PAYLOAD) {
|
|
109
106
|
// All slots filled, nextWithdrawalValidatorIndex should be validatorIndex having next turn
|
|
@@ -116,142 +113,163 @@ export function processWithdrawals(
|
|
|
116
113
|
}
|
|
117
114
|
}
|
|
118
115
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
processedPartialWithdrawalsCount: number;
|
|
126
|
-
processedBuilderWithdrawalsCount: number;
|
|
127
|
-
} {
|
|
128
|
-
if (fork < ForkSeq.capella) {
|
|
129
|
-
throw new Error(`getExpectedWithdrawals not supported at forkSeq=${fork} < ForkSeq.capella`);
|
|
130
|
-
}
|
|
131
|
-
|
|
116
|
+
function getBuilderWithdrawals(
|
|
117
|
+
state: CachedBeaconStateGloas,
|
|
118
|
+
withdrawalIndex: number,
|
|
119
|
+
balanceAfterWithdrawals: Map<ValidatorIndex, number>
|
|
120
|
+
): {builderWithdrawals: capella.Withdrawal[]; withdrawalIndex: number; processedCount: number} {
|
|
121
|
+
const builderWithdrawals: capella.Withdrawal[] = [];
|
|
132
122
|
const epoch = state.epochCtx.epoch;
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const allBuilderPendingWithdrawals =
|
|
149
|
-
stateGloas.builderPendingWithdrawals.length <= MAX_WITHDRAWALS_PER_PAYLOAD
|
|
150
|
-
? stateGloas.builderPendingWithdrawals.getAllReadonly()
|
|
151
|
-
: null;
|
|
123
|
+
const allBuilderPendingWithdrawals =
|
|
124
|
+
state.builderPendingWithdrawals.length <= MAX_WITHDRAWALS_PER_PAYLOAD
|
|
125
|
+
? state.builderPendingWithdrawals.getAllReadonly()
|
|
126
|
+
: null;
|
|
127
|
+
|
|
128
|
+
let processedCount = 0;
|
|
129
|
+
for (let i = 0; i < state.builderPendingWithdrawals.length; i++) {
|
|
130
|
+
const withdrawal = allBuilderPendingWithdrawals
|
|
131
|
+
? allBuilderPendingWithdrawals[i]
|
|
132
|
+
: state.builderPendingWithdrawals.getReadonly(i);
|
|
133
|
+
|
|
134
|
+
if (withdrawal.withdrawableEpoch > epoch || builderWithdrawals.length === MAX_WITHDRAWALS_PER_PAYLOAD) {
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
152
137
|
|
|
153
|
-
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
: stateGloas.builderPendingWithdrawals.getReadonly(i);
|
|
138
|
+
if (isBuilderPaymentWithdrawable(state, withdrawal)) {
|
|
139
|
+
const builderIndex = withdrawal.builderIndex;
|
|
140
|
+
const builder = state.validators.get(withdrawal.builderIndex);
|
|
157
141
|
|
|
158
|
-
|
|
159
|
-
|
|
142
|
+
let balance = balanceAfterWithdrawals.get(builderIndex);
|
|
143
|
+
if (balance === undefined) {
|
|
144
|
+
balance = state.balances.get(builderIndex);
|
|
145
|
+
balanceAfterWithdrawals.set(builderIndex, balance);
|
|
160
146
|
}
|
|
161
147
|
|
|
162
|
-
|
|
163
|
-
const totalWithdrawn = withdrawnBalances.getOrDefault(withdrawal.builderIndex);
|
|
164
|
-
const balance = state.balances.get(withdrawal.builderIndex) - totalWithdrawn;
|
|
165
|
-
const builder = state.validators.get(withdrawal.builderIndex);
|
|
166
|
-
|
|
167
|
-
let withdrawableBalance = 0;
|
|
148
|
+
let withdrawableBalance = 0;
|
|
168
149
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
150
|
+
if (builder.slashed) {
|
|
151
|
+
withdrawableBalance = balance < withdrawal.amount ? balance : withdrawal.amount;
|
|
152
|
+
} else if (balance > MIN_ACTIVATION_BALANCE) {
|
|
153
|
+
withdrawableBalance =
|
|
154
|
+
balance - MIN_ACTIVATION_BALANCE < withdrawal.amount ? balance - MIN_ACTIVATION_BALANCE : withdrawal.amount;
|
|
155
|
+
}
|
|
175
156
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
}
|
|
157
|
+
if (withdrawableBalance > 0) {
|
|
158
|
+
builderWithdrawals.push({
|
|
159
|
+
index: withdrawalIndex,
|
|
160
|
+
validatorIndex: withdrawal.builderIndex,
|
|
161
|
+
address: withdrawal.feeRecipient,
|
|
162
|
+
amount: BigInt(withdrawableBalance),
|
|
163
|
+
});
|
|
164
|
+
withdrawalIndex++;
|
|
165
|
+
balanceAfterWithdrawals.set(builderIndex, balance - withdrawableBalance);
|
|
186
166
|
}
|
|
187
|
-
processedBuilderWithdrawalsCount++;
|
|
188
167
|
}
|
|
168
|
+
processedCount++;
|
|
189
169
|
}
|
|
190
170
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
const partialWithdrawalBound = Math.min(
|
|
194
|
-
withdrawals.length + MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP,
|
|
195
|
-
MAX_WITHDRAWALS_PER_PAYLOAD - 1
|
|
196
|
-
);
|
|
197
|
-
const stateElectra = state as CachedBeaconStateElectra;
|
|
171
|
+
return {builderWithdrawals, withdrawalIndex, processedCount};
|
|
172
|
+
}
|
|
198
173
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
174
|
+
function getPendingPartialWithdrawals(
|
|
175
|
+
state: CachedBeaconStateElectra,
|
|
176
|
+
withdrawalIndex: number,
|
|
177
|
+
numPriorWithdrawal: number,
|
|
178
|
+
balanceAfterWithdrawals: Map<ValidatorIndex, number>
|
|
179
|
+
): {pendingPartialWithdrawals: capella.Withdrawal[]; withdrawalIndex: number; processedCount: number} {
|
|
180
|
+
const epoch = state.epochCtx.epoch;
|
|
181
|
+
const pendingPartialWithdrawals: capella.Withdrawal[] = [];
|
|
182
|
+
const validators = state.validators;
|
|
183
|
+
|
|
184
|
+
// In pre-gloas, partialWithdrawalBound == MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP
|
|
185
|
+
const partialWithdrawalBound = Math.min(
|
|
186
|
+
numPriorWithdrawal + MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP,
|
|
187
|
+
MAX_WITHDRAWALS_PER_PAYLOAD - 1
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
// MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP = 8, PENDING_PARTIAL_WITHDRAWALS_LIMIT: 134217728 so we should only call getAllReadonly() if it makes sense
|
|
191
|
+
// pendingPartialWithdrawals comes from EIP-7002 smart contract where it takes fee so it's more likely than not validator is in correct condition to withdraw
|
|
192
|
+
// also we may break early if withdrawableEpoch > epoch
|
|
193
|
+
const allPendingPartialWithdrawals =
|
|
194
|
+
state.pendingPartialWithdrawals.length <= partialWithdrawalBound
|
|
195
|
+
? state.pendingPartialWithdrawals.getAllReadonly()
|
|
196
|
+
: null;
|
|
197
|
+
|
|
198
|
+
// EIP-7002: Execution layer triggerable withdrawals
|
|
199
|
+
let processedCount = 0;
|
|
200
|
+
for (let i = 0; i < state.pendingPartialWithdrawals.length; i++) {
|
|
201
|
+
const withdrawal = allPendingPartialWithdrawals
|
|
202
|
+
? allPendingPartialWithdrawals[i]
|
|
203
|
+
: state.pendingPartialWithdrawals.getReadonly(i);
|
|
204
|
+
if (
|
|
205
|
+
withdrawal.withdrawableEpoch > epoch ||
|
|
206
|
+
pendingPartialWithdrawals.length + numPriorWithdrawal === partialWithdrawalBound
|
|
207
|
+
) {
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
215
210
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
validator.effectiveBalance >= MIN_ACTIVATION_BALANCE &&
|
|
223
|
-
balance > MIN_ACTIVATION_BALANCE
|
|
224
|
-
) {
|
|
225
|
-
const balanceOverMinActivationBalance = BigInt(balance - MIN_ACTIVATION_BALANCE);
|
|
226
|
-
const withdrawableBalance =
|
|
227
|
-
balanceOverMinActivationBalance < withdrawal.amount ? balanceOverMinActivationBalance : withdrawal.amount;
|
|
228
|
-
withdrawals.push({
|
|
229
|
-
index: withdrawalIndex,
|
|
230
|
-
validatorIndex: withdrawal.validatorIndex,
|
|
231
|
-
address: validator.withdrawalCredentials.subarray(12),
|
|
232
|
-
amount: withdrawableBalance,
|
|
233
|
-
});
|
|
234
|
-
withdrawalIndex++;
|
|
235
|
-
withdrawnBalances.set(withdrawal.validatorIndex, totalWithdrawn + Number(withdrawableBalance));
|
|
236
|
-
}
|
|
237
|
-
processedPartialWithdrawalsCount++;
|
|
211
|
+
const validatorIndex = withdrawal.validatorIndex;
|
|
212
|
+
const validator = validators.getReadonly(validatorIndex);
|
|
213
|
+
let balance = balanceAfterWithdrawals.get(validatorIndex);
|
|
214
|
+
if (balance === undefined) {
|
|
215
|
+
balance = state.balances.get(validatorIndex);
|
|
216
|
+
balanceAfterWithdrawals.set(validatorIndex, balance);
|
|
238
217
|
}
|
|
218
|
+
|
|
219
|
+
if (
|
|
220
|
+
validator.exitEpoch === FAR_FUTURE_EPOCH &&
|
|
221
|
+
validator.effectiveBalance >= MIN_ACTIVATION_BALANCE &&
|
|
222
|
+
balance > MIN_ACTIVATION_BALANCE
|
|
223
|
+
) {
|
|
224
|
+
const balanceOverMinActivationBalance = BigInt(balance - MIN_ACTIVATION_BALANCE);
|
|
225
|
+
const withdrawableBalance =
|
|
226
|
+
balanceOverMinActivationBalance < withdrawal.amount ? balanceOverMinActivationBalance : withdrawal.amount;
|
|
227
|
+
pendingPartialWithdrawals.push({
|
|
228
|
+
index: withdrawalIndex,
|
|
229
|
+
validatorIndex,
|
|
230
|
+
address: validator.withdrawalCredentials.subarray(12),
|
|
231
|
+
amount: withdrawableBalance,
|
|
232
|
+
});
|
|
233
|
+
withdrawalIndex++;
|
|
234
|
+
balanceAfterWithdrawals.set(validatorIndex, balance - Number(withdrawableBalance));
|
|
235
|
+
}
|
|
236
|
+
processedCount++;
|
|
239
237
|
}
|
|
240
238
|
|
|
241
|
-
|
|
242
|
-
|
|
239
|
+
return {pendingPartialWithdrawals, withdrawalIndex, processedCount};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
function getValidatorsSweepWithdrawals(
|
|
243
|
+
fork: ForkSeq,
|
|
244
|
+
state: CachedBeaconStateCapella | CachedBeaconStateElectra | CachedBeaconStateGloas,
|
|
245
|
+
withdrawalIndex: number,
|
|
246
|
+
numPriorWithdrawal: number,
|
|
247
|
+
balanceAfterWithdrawals: Map<ValidatorIndex, number>
|
|
248
|
+
): {sweepWithdrawals: capella.Withdrawal[]; processedCount: number} {
|
|
249
|
+
const sweepWithdrawals: capella.Withdrawal[] = [];
|
|
250
|
+
const epoch = state.epochCtx.epoch;
|
|
251
|
+
const {validators, balances, nextWithdrawalValidatorIndex} = state;
|
|
252
|
+
const isPostElectra = fork >= ForkSeq.electra;
|
|
253
|
+
|
|
254
|
+
const validatorsLimit = Math.min(state.validators.length, MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP);
|
|
255
|
+
let processedCount = 0;
|
|
243
256
|
// Just run a bounded loop max iterating over all withdrawals
|
|
244
257
|
// however breaks out once we have MAX_WITHDRAWALS_PER_PAYLOAD
|
|
245
|
-
for (n = 0; n <
|
|
258
|
+
for (let n = 0; n < validatorsLimit; n++) {
|
|
259
|
+
if (sweepWithdrawals.length + numPriorWithdrawal === MAX_WITHDRAWALS_PER_PAYLOAD) {
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
|
|
246
263
|
// Get next validator in turn
|
|
247
264
|
const validatorIndex = (nextWithdrawalValidatorIndex + n) % validators.length;
|
|
248
265
|
|
|
249
266
|
const validator = validators.getReadonly(validatorIndex);
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
267
|
+
let balance = balanceAfterWithdrawals.get(validatorIndex);
|
|
268
|
+
if (balance === undefined) {
|
|
269
|
+
balance = balances.get(validatorIndex);
|
|
270
|
+
balanceAfterWithdrawals.set(validatorIndex, balance);
|
|
271
|
+
}
|
|
272
|
+
|
|
255
273
|
const {withdrawableEpoch, withdrawalCredentials, effectiveBalance} = validator;
|
|
256
274
|
const hasWithdrawableCredentials = isPostElectra
|
|
257
275
|
? hasExecutionWithdrawalCredential(withdrawalCredentials)
|
|
@@ -259,40 +277,117 @@ export function getExpectedWithdrawals(
|
|
|
259
277
|
// early skip for balance = 0 as its now more likely that validator has exited/slashed with
|
|
260
278
|
// balance zero than not have withdrawal credentials set
|
|
261
279
|
if (balance === 0 || !hasWithdrawableCredentials) {
|
|
280
|
+
processedCount++;
|
|
262
281
|
continue;
|
|
263
282
|
}
|
|
264
283
|
|
|
265
284
|
// capella full withdrawal
|
|
266
285
|
if (withdrawableEpoch <= epoch) {
|
|
267
|
-
|
|
286
|
+
sweepWithdrawals.push({
|
|
268
287
|
index: withdrawalIndex,
|
|
269
288
|
validatorIndex,
|
|
270
289
|
address: validator.withdrawalCredentials.subarray(12),
|
|
271
290
|
amount: BigInt(balance),
|
|
272
291
|
});
|
|
273
292
|
withdrawalIndex++;
|
|
274
|
-
|
|
293
|
+
balanceAfterWithdrawals.set(validatorIndex, 0);
|
|
275
294
|
} else if (
|
|
276
295
|
effectiveBalance === (isPostElectra ? getMaxEffectiveBalance(withdrawalCredentials) : MAX_EFFECTIVE_BALANCE) &&
|
|
277
296
|
balance > effectiveBalance
|
|
278
297
|
) {
|
|
279
298
|
// capella partial withdrawal
|
|
280
299
|
const partialAmount = balance - effectiveBalance;
|
|
281
|
-
|
|
300
|
+
sweepWithdrawals.push({
|
|
282
301
|
index: withdrawalIndex,
|
|
283
302
|
validatorIndex,
|
|
284
303
|
address: validator.withdrawalCredentials.subarray(12),
|
|
285
304
|
amount: BigInt(partialAmount),
|
|
286
305
|
});
|
|
287
306
|
withdrawalIndex++;
|
|
288
|
-
|
|
307
|
+
balanceAfterWithdrawals.set(validatorIndex, balance - partialAmount);
|
|
289
308
|
}
|
|
309
|
+
processedCount++;
|
|
310
|
+
}
|
|
290
311
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
312
|
+
return {sweepWithdrawals, processedCount};
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
function applyWithdrawals(
|
|
316
|
+
state: CachedBeaconStateCapella | CachedBeaconStateElectra | CachedBeaconStateGloas,
|
|
317
|
+
withdrawals: capella.Withdrawal[]
|
|
318
|
+
): void {
|
|
319
|
+
for (const withdrawal of withdrawals) {
|
|
320
|
+
decreaseBalance(state, withdrawal.validatorIndex, Number(withdrawal.amount));
|
|
295
321
|
}
|
|
322
|
+
}
|
|
296
323
|
|
|
297
|
-
|
|
324
|
+
export function getExpectedWithdrawals(
|
|
325
|
+
fork: ForkSeq,
|
|
326
|
+
state: CachedBeaconStateCapella | CachedBeaconStateElectra | CachedBeaconStateGloas
|
|
327
|
+
): {
|
|
328
|
+
expectedWithdrawals: capella.Withdrawal[];
|
|
329
|
+
processedBuilderWithdrawalsCount: number;
|
|
330
|
+
processedPartialWithdrawalsCount: number;
|
|
331
|
+
processedValidatorSweepCount: number;
|
|
332
|
+
} {
|
|
333
|
+
if (fork < ForkSeq.capella) {
|
|
334
|
+
throw new Error(`getExpectedWithdrawals not supported at forkSeq=${fork} < ForkSeq.capella`);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
let withdrawalIndex = state.nextWithdrawalIndex;
|
|
338
|
+
|
|
339
|
+
const expectedWithdrawals: capella.Withdrawal[] = [];
|
|
340
|
+
// Map to track balances after applying withdrawals
|
|
341
|
+
// https://github.com/ethereum/consensus-specs/blob/v1.7.0-alpha.0/specs/capella/beacon-chain.md#new-get_balance_after_withdrawals
|
|
342
|
+
const balanceAfterWithdrawals = new Map<ValidatorIndex, number>();
|
|
343
|
+
// partialWithdrawalsCount is withdrawals coming from EL since electra (EIP-7002)
|
|
344
|
+
let processedPartialWithdrawalsCount = 0;
|
|
345
|
+
// builderWithdrawalsCount is withdrawals coming from builder payments since Gloas (EIP-7732)
|
|
346
|
+
let processedBuilderWithdrawalsCount = 0;
|
|
347
|
+
|
|
348
|
+
if (fork >= ForkSeq.gloas) {
|
|
349
|
+
const {
|
|
350
|
+
builderWithdrawals,
|
|
351
|
+
withdrawalIndex: newWithdrawalIndex,
|
|
352
|
+
processedCount,
|
|
353
|
+
} = getBuilderWithdrawals(state as CachedBeaconStateGloas, withdrawalIndex, balanceAfterWithdrawals);
|
|
354
|
+
|
|
355
|
+
expectedWithdrawals.push(...builderWithdrawals);
|
|
356
|
+
withdrawalIndex = newWithdrawalIndex;
|
|
357
|
+
processedBuilderWithdrawalsCount = processedCount;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
if (fork >= ForkSeq.electra) {
|
|
361
|
+
const {
|
|
362
|
+
pendingPartialWithdrawals,
|
|
363
|
+
withdrawalIndex: newWithdrawalIndex,
|
|
364
|
+
processedCount,
|
|
365
|
+
} = getPendingPartialWithdrawals(
|
|
366
|
+
state as CachedBeaconStateElectra,
|
|
367
|
+
withdrawalIndex,
|
|
368
|
+
expectedWithdrawals.length,
|
|
369
|
+
balanceAfterWithdrawals
|
|
370
|
+
);
|
|
371
|
+
|
|
372
|
+
expectedWithdrawals.push(...pendingPartialWithdrawals);
|
|
373
|
+
withdrawalIndex = newWithdrawalIndex;
|
|
374
|
+
processedPartialWithdrawalsCount = processedCount;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
const {sweepWithdrawals, processedCount: processedValidatorSweepCount} = getValidatorsSweepWithdrawals(
|
|
378
|
+
fork,
|
|
379
|
+
state,
|
|
380
|
+
withdrawalIndex,
|
|
381
|
+
expectedWithdrawals.length,
|
|
382
|
+
balanceAfterWithdrawals
|
|
383
|
+
);
|
|
384
|
+
|
|
385
|
+
expectedWithdrawals.push(...sweepWithdrawals);
|
|
386
|
+
|
|
387
|
+
return {
|
|
388
|
+
expectedWithdrawals,
|
|
389
|
+
processedBuilderWithdrawalsCount,
|
|
390
|
+
processedPartialWithdrawalsCount,
|
|
391
|
+
processedValidatorSweepCount,
|
|
392
|
+
};
|
|
298
393
|
}
|
|
@@ -2,7 +2,6 @@ import {BeaconConfig} from "@lodestar/config";
|
|
|
2
2
|
import {DOMAIN_BEACON_PROPOSER} from "@lodestar/params";
|
|
3
3
|
import {SignedBeaconBlock, SignedBlindedBeaconBlock, Slot, isBlindedBeaconBlock, phase0, ssz} from "@lodestar/types";
|
|
4
4
|
import {Index2PubkeyCache} from "../cache/pubkeyCache.js";
|
|
5
|
-
import {CachedBeaconStateAllForks} from "../types.js";
|
|
6
5
|
import {computeSigningRoot} from "../util/index.js";
|
|
7
6
|
import {ISignatureSet, SignatureSetType, verifySignatureSet} from "../util/signatureSets.js";
|
|
8
7
|
|
|
@@ -38,28 +37,28 @@ export function getBlockProposerSignatureSet(
|
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
export function getBlockHeaderProposerSignatureSetByParentStateSlot(
|
|
40
|
+
config: BeaconConfig,
|
|
41
41
|
index2pubkey: Index2PubkeyCache,
|
|
42
|
-
|
|
42
|
+
parentStateSlot: Slot,
|
|
43
43
|
signedBlockHeader: phase0.SignedBeaconBlockHeader
|
|
44
44
|
) {
|
|
45
|
-
return getBlockHeaderProposerSignatureSet(
|
|
45
|
+
return getBlockHeaderProposerSignatureSet(config, index2pubkey, signedBlockHeader, parentStateSlot);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
export function getBlockHeaderProposerSignatureSetByHeaderSlot(
|
|
49
|
+
config: BeaconConfig,
|
|
49
50
|
index2pubkey: Index2PubkeyCache,
|
|
50
|
-
headState: CachedBeaconStateAllForks,
|
|
51
51
|
signedBlockHeader: phase0.SignedBeaconBlockHeader
|
|
52
52
|
) {
|
|
53
|
-
return getBlockHeaderProposerSignatureSet(
|
|
53
|
+
return getBlockHeaderProposerSignatureSet(config, index2pubkey, signedBlockHeader, signedBlockHeader.message.slot);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
function getBlockHeaderProposerSignatureSet(
|
|
57
|
+
config: BeaconConfig,
|
|
57
58
|
index2pubkey: Index2PubkeyCache,
|
|
58
|
-
state: CachedBeaconStateAllForks,
|
|
59
59
|
signedBlockHeader: phase0.SignedBeaconBlockHeader,
|
|
60
60
|
domainSlot: Slot
|
|
61
61
|
): ISignatureSet {
|
|
62
|
-
const {config} = state;
|
|
63
62
|
const domain = config.getDomain(domainSlot, DOMAIN_BEACON_PROPOSER, signedBlockHeader.message.slot);
|
|
64
63
|
|
|
65
64
|
return {
|