From 42dc5391cd695d845e6a869602c04166702f63a7 Mon Sep 17 00:00:00 2001 From: markolazic01 Date: Tue, 7 Jul 2026 20:17:29 +0200 Subject: [PATCH] feat: add getBuildersLength() binding --- bindings/napi/BeaconStateView.zig | 7 +++++++ bindings/src/index.d.ts | 1 + bindings/test/beaconStateView.test.ts | 6 ++++++ src/fork_types/any_beacon_state.zig | 10 ++++++++++ 4 files changed, 24 insertions(+) diff --git a/bindings/napi/BeaconStateView.zig b/bindings/napi/BeaconStateView.zig index 80a24982e..133053723 100644 --- a/bindings/napi/BeaconStateView.zig +++ b/bindings/napi/BeaconStateView.zig @@ -723,6 +723,13 @@ pub fn getAllValidators(self: *const BeaconStateView) !js.Array { return js_types.wrap(js.Array, result); } +/// Get the number of builders in the registry (Gloas+). Throws on pre-Gloas states. +pub fn getBuildersLength(self: *const BeaconStateView) !js.Number { + const cached_state = try self.requireState(); + const count = try cached_state.state.buildersLength(); + return js.Number.from(count); +} + /// Get all balances in the registry. pub fn getAllBalances(self: *const BeaconStateView) !js.Array { const env = js.env(); diff --git a/bindings/src/index.d.ts b/bindings/src/index.d.ts index 1e18464e3..730b08fea 100644 --- a/bindings/src/index.d.ts +++ b/bindings/src/index.d.ts @@ -269,6 +269,7 @@ export declare class BeaconStateView { getBalance(index: number): number; getValidator(index: number): Validator; getAllValidators(): Validator[]; + getBuildersLength(): number; getAllBalances(): number[]; getValidatorsByStatus(statuses: Set, currentEpoch: number): Validator[]; // TODO wrong function diff --git a/bindings/test/beaconStateView.test.ts b/bindings/test/beaconStateView.test.ts index 3a60d7e36..8b82ed112 100644 --- a/bindings/test/beaconStateView.test.ts +++ b/bindings/test/beaconStateView.test.ts @@ -450,6 +450,12 @@ describe("BeaconStateView", () => { }); }); + describe("gloas+ fields", () => { + it("getBuildersLength should throw on a pre-Gloas state", () => { + expect(() => state.getBuildersLength()).toThrow(); + }); + }); + describe("block and state roots", () => { it("getBlockRoot should return 32 bytes", () => { const blockRoot = state.getBlockRoot(state.epoch - 1); diff --git a/src/fork_types/any_beacon_state.zig b/src/fork_types/any_beacon_state.zig index 3cf890d02..c3d9015aa 100644 --- a/src/fork_types/any_beacon_state.zig +++ b/src/fork_types/any_beacon_state.zig @@ -382,6 +382,16 @@ pub const AnyBeaconState = union(ForkSeq) { try self.setEth1DepositIndex(try self.eth1DepositIndex() + 1); } + pub fn buildersLength(self: *AnyBeaconState) !usize { + return switch (self.*) { + .phase0, .altair, .bellatrix, .capella, .deneb, .electra, .fulu => error.InvalidAtFork, + inline else => |state| { + var builders_view = try state.getReadonly("builders"); + return builders_view.length(); + }, + }; + } + pub fn validators(self: *AnyBeaconState) !*ct.phase0.Validators.TreeView { return switch (self.*) { inline else => |state| try state.get("validators"),