@exromany/lido-csm-sdk
Version:
[](https://github.com/lidofinance/lido-csm-sdk/blob/main/LICENSE.txt) [](h
72 lines • 3.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.computeStatuses = void 0;
const index_js_1 = require("../common/index.js");
const index_js_2 = require("../common/utils/index.js");
const isWithdrawn = (ctx) => ctx.keyIndex < ctx.info.totalWithdrawnKeys;
const isDeposited = (ctx) => ctx.keyIndex < ctx.info.totalDepositedKeys;
const isVetted = (ctx) => ctx.keyIndex < ctx.info.totalVettedKeys;
const getUnvettedStatus = (ctx) => {
if (isVetted(ctx))
return null;
if (ctx.duplicates?.includes(ctx.pubkey))
return index_js_1.KEY_STATUS.DUPLICATED;
if (ctx.prefilled?.status)
return index_js_1.KEY_STATUS.DUPLICATED;
if (ctx.keyIndex === ctx.info.totalVettedKeys)
return index_js_1.KEY_STATUS.INVALID;
return index_js_1.KEY_STATUS.UNCHECKED;
};
const getVettedStatus = (ctx) => {
if (isDeposited(ctx))
return null;
if (ctx.info.enqueuedCount < ctx.info.depositableValidatorsCount) {
return index_js_1.KEY_STATUS.NON_QUEUED;
}
return index_js_1.KEY_STATUS.DEPOSITABLE;
};
const getDepositedStatus = (ctx) => {
if (isWithdrawn(ctx) || ctx.withdrawalSubmitted?.includes(ctx.pubkey)) {
return index_js_1.KEY_STATUS.WITHDRAWN;
}
if (ctx.prefilled?.status)
return ctx.prefilled.status;
return ctx.hasCLStatuses ? index_js_1.KEY_STATUS.ACTIVATION_PENDING : index_js_1.KEY_STATUS.ACTIVE;
};
const getLifecycleStatus = (ctx) => getUnvettedStatus(ctx) ?? getVettedStatus(ctx) ?? getDepositedStatus(ctx);
const checkSlashed = (ctx) => isDeposited(ctx) && !!ctx.prefilled?.slashed;
const checkWithStrikes = (ctx) => isDeposited(ctx) && ctx.hasStrikes;
const checkEjectable = (ctx) => isDeposited(ctx) &&
((ctx.prefilled?.status === index_js_1.KEY_STATUS.ACTIVE &&
ctx.prefilled.activationEpoch < ctx.ejectableEpoch) ||
!ctx.hasCLStatuses);
const checkExitRequested = (ctx) => isDeposited(ctx) &&
ctx.requestedToExit.some((key) => (0, index_js_2.compareLowercase)(ctx.pubkey, key));
const checkUnbonded = (ctx) => ctx.unboundCount > 0 &&
ctx.info.totalAddedKeys - ctx.keyIndex < ctx.unboundCount;
const computeStatuses = (ctx) => {
const statuses = [];
const lifecycle = getLifecycleStatus(ctx);
statuses.push(lifecycle);
const isSlashed = checkSlashed(ctx);
if (isSlashed)
statuses.push(index_js_1.KEY_STATUS.SLASHED);
const canHaveAdditionalStatuses = ![
index_js_1.KEY_STATUS.WITHDRAWN,
index_js_1.KEY_STATUS.WITHDRAWAL_PENDING,
index_js_1.KEY_STATUS.EXITING,
].includes(lifecycle);
if (canHaveAdditionalStatuses) {
if (!isSlashed && checkExitRequested(ctx))
statuses.push(index_js_1.KEY_STATUS.EXIT_REQUESTED);
if (!isSlashed && checkEjectable(ctx))
statuses.push(index_js_1.KEY_STATUS.EJECTABLE);
if (checkWithStrikes(ctx))
statuses.push(index_js_1.KEY_STATUS.WITH_STRIKES);
if (checkUnbonded(ctx))
statuses.push(index_js_1.KEY_STATUS.UNBONDED);
}
return statuses;
};
exports.computeStatuses = computeStatuses;
//# sourceMappingURL=compute-statuses.js.map