@obolnetwork/obol-sdk 2.11.13 → 2.12.0

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.
@@ -0,0 +1,50 @@
1
+ import {
2
+ blsRecoverDistributedPubkeyFromShares,
3
+ blsVerifyExtraShares,
4
+ blsVerifyMultiple
5
+ } from "../chunk-267HIPEB.js";
6
+
7
+ // src/verification/lockWorker.ts
8
+ import { parentPort, workerData } from "worker_threads";
9
+ import { fromHexString } from "@chainsafe/ssz";
10
+ function verifyShareBindingChunk(input) {
11
+ const { shares, distributedKeys, threshold } = input;
12
+ if (shares.length !== distributedKeys.length) return false;
13
+ for (let i = 0; i < shares.length; i++) {
14
+ const sharesBytes = shares[i].map((s) => fromHexString(s));
15
+ const dkBytes = fromHexString(distributedKeys[i]);
16
+ const recovered = blsRecoverDistributedPubkeyFromShares(
17
+ sharesBytes,
18
+ threshold
19
+ );
20
+ if (!recovered) return false;
21
+ if (recovered.length !== dkBytes.length) return false;
22
+ for (let j = 0; j < recovered.length; j++) {
23
+ if (recovered[j] !== dkBytes[j]) return false;
24
+ }
25
+ if (!blsVerifyExtraShares(sharesBytes, threshold, dkBytes)) {
26
+ return false;
27
+ }
28
+ }
29
+ return true;
30
+ }
31
+ function verifyBatchChunk(input) {
32
+ return blsVerifyMultiple(
33
+ input.pubkeys,
34
+ input.messages,
35
+ input.aggregateSignature
36
+ );
37
+ }
38
+ function dispatch(input) {
39
+ if (input.mode === "shareBinding") return verifyShareBindingChunk(input);
40
+ if (input.mode === "verifyBatch") return verifyBatchChunk(input);
41
+ return false;
42
+ }
43
+ if (parentPort) {
44
+ try {
45
+ parentPort.postMessage(dispatch(workerData));
46
+ } catch (e) {
47
+ parentPort.postMessage(false);
48
+ }
49
+ }
50
+ //# sourceMappingURL=lockWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/verification/lockWorker.ts"],"sourcesContent":["// Worker entry point loaded by parallelPool via Node's worker_threads.\n//\n// Two modes (dispatched on workerData.mode):\n// 'shareBinding' — Lagrange + extra-share verification for a validator chunk.\n// 'verifyBatch' — blsVerifyMultiple on a (pubkeys, messages, aggregateSig)\n// chunk of the deposit+builder batch.\n//\n// Both modes return a simple boolean; main thread combines results.\n\nimport { parentPort, workerData } from 'node:worker_threads';\nimport { fromHexString } from '@chainsafe/ssz';\nimport {\n blsRecoverDistributedPubkeyFromShares,\n blsVerifyExtraShares,\n blsVerifyMultiple,\n} from '../blsUtils.js';\n\nexport interface ShareBindingInput {\n mode: 'shareBinding';\n shares: string[][];\n distributedKeys: string[];\n threshold: number;\n}\n\nexport interface VerifyBatchInput {\n mode: 'verifyBatch';\n pubkeys: Uint8Array[];\n messages: Uint8Array[];\n aggregateSignature: Uint8Array;\n}\n\nexport type WorkerInput = ShareBindingInput | VerifyBatchInput;\n\nfunction verifyShareBindingChunk(input: ShareBindingInput): boolean {\n const { shares, distributedKeys, threshold } = input;\n if (shares.length !== distributedKeys.length) return false;\n\n for (let i = 0; i < shares.length; i++) {\n const sharesBytes = shares[i].map(s => fromHexString(s));\n const dkBytes = fromHexString(distributedKeys[i]);\n\n const recovered = blsRecoverDistributedPubkeyFromShares(\n sharesBytes,\n threshold,\n );\n if (!recovered) return false;\n if (recovered.length !== dkBytes.length) return false;\n for (let j = 0; j < recovered.length; j++) {\n if (recovered[j] !== dkBytes[j]) return false;\n }\n if (!blsVerifyExtraShares(sharesBytes, threshold, dkBytes)) {\n return false;\n }\n }\n return true;\n}\n\nfunction verifyBatchChunk(input: VerifyBatchInput): boolean {\n return blsVerifyMultiple(\n input.pubkeys,\n input.messages,\n input.aggregateSignature,\n );\n}\n\nfunction dispatch(input: WorkerInput): boolean {\n if (input.mode === 'shareBinding') return verifyShareBindingChunk(input);\n if (input.mode === 'verifyBatch') return verifyBatchChunk(input);\n return false;\n}\n\nif (parentPort) {\n try {\n parentPort.postMessage(dispatch(workerData as WorkerInput));\n } catch {\n parentPort.postMessage(false);\n }\n}\n"],"mappings":";;;;;;;AASA,SAAS,YAAY,kBAAkB;AACvC,SAAS,qBAAqB;AAuB9B,SAAS,wBAAwB,OAAmC;AAClE,QAAM,EAAE,QAAQ,iBAAiB,UAAU,IAAI;AAC/C,MAAI,OAAO,WAAW,gBAAgB,OAAQ,QAAO;AAErD,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,cAAc,OAAO,CAAC,EAAE,IAAI,OAAK,cAAc,CAAC,CAAC;AACvD,UAAM,UAAU,cAAc,gBAAgB,CAAC,CAAC;AAEhD,UAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,UAAW,QAAO;AACvB,QAAI,UAAU,WAAW,QAAQ,OAAQ,QAAO;AAChD,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAI,UAAU,CAAC,MAAM,QAAQ,CAAC,EAAG,QAAO;AAAA,IAC1C;AACA,QAAI,CAAC,qBAAqB,aAAa,WAAW,OAAO,GAAG;AAC1D,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAkC;AAC1D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEA,SAAS,SAAS,OAA6B;AAC7C,MAAI,MAAM,SAAS,eAAgB,QAAO,wBAAwB,KAAK;AACvE,MAAI,MAAM,SAAS,cAAe,QAAO,iBAAiB,KAAK;AAC/D,SAAO;AACT;AAEA,IAAI,YAAY;AACd,MAAI;AACF,eAAW,YAAY,SAAS,UAAyB,CAAC;AAAA,EAC5D,SAAQ;AACN,eAAW,YAAY,KAAK;AAAA,EAC9B;AACF;","names":[]}
@@ -0,0 +1,10 @@
1
+ import {
2
+ verifyBatchParallel,
3
+ verifySharesBinding
4
+ } from "../chunk-OYZHSNKR.js";
5
+ import "../chunk-267HIPEB.js";
6
+ export {
7
+ verifyBatchParallel,
8
+ verifySharesBinding
9
+ };
10
+ //# sourceMappingURL=parallelPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -2,3 +2,5 @@ export declare function blsVerify(pubkey: Uint8Array, message: Uint8Array, signa
2
2
  export declare function blsVerifyAggregate(pubkeys: Uint8Array[], message: Uint8Array, signature: Uint8Array): boolean;
3
3
  export declare function blsVerifyMultiple(pubkeys: Uint8Array[], messages: Uint8Array[], signature: Uint8Array): boolean;
4
4
  export declare function blsAggregateSignatures(signatures: Uint8Array[]): Uint8Array;
5
+ export declare function blsRecoverDistributedPubkeyFromShares(pubshares: Uint8Array[], threshold: number): Uint8Array | null;
6
+ export declare function blsVerifyExtraShares(pubshares: Uint8Array[], threshold: number, distributedPubkey: Uint8Array): boolean;
@@ -28,4 +28,13 @@ export declare const verifyBuilderRegistration: (validator: DistributedValidator
28
28
  };
29
29
  export declare const verifyNodeSignatures: (clusterLock: ClusterLock) => boolean;
30
30
  export declare const signingRoot: (domain: Uint8Array, messageBuffer: Buffer) => Uint8Array;
31
+ /**
32
+ * Returns true iff every validator's distributed_public_key is unique across
33
+ * the lock. Normalizes hex case (charon emits lowercase today, but mixed-case
34
+ * copies shouldn't sneak through). Exported so it can be unit-tested
35
+ * independently of the rest of validateClusterLock — a tampered lock that
36
+ * trips a downstream check (signature_aggregate, node sigs) cannot isolate
37
+ * this branch.
38
+ */
39
+ export declare const hasUniqueDistributedKeys: (clusterLock: ClusterLock) => boolean;
31
40
  export declare const isValidClusterLock: (clusterLock: ClusterLock, safeRpcUrl?: SafeRpcUrl) => Promise<boolean>;
@@ -0,0 +1,13 @@
1
+ export interface ShareBindingInput {
2
+ mode: 'shareBinding';
3
+ shares: string[][];
4
+ distributedKeys: string[];
5
+ threshold: number;
6
+ }
7
+ export interface VerifyBatchInput {
8
+ mode: 'verifyBatch';
9
+ pubkeys: Uint8Array[];
10
+ messages: Uint8Array[];
11
+ aggregateSignature: Uint8Array;
12
+ }
13
+ export type WorkerInput = ShareBindingInput | VerifyBatchInput;
@@ -0,0 +1,2 @@
1
+ export declare function verifySharesBinding(shares: string[][], distributedKeys: string[], threshold: number): Promise<boolean>;
2
+ export declare function verifyBatchParallel(pubkeys: Uint8Array[], messages: Uint8Array[], signatures: Uint8Array[]): Promise<boolean>;
@@ -1 +1 @@
1
- {"root":["../../tsup.config.ts","../../src/ajv.ts","../../src/base.ts","../../src/blsUtils.ts","../../src/bytecodes.ts","../../src/constants.ts","../../src/errors.ts","../../src/index.ts","../../src/schema.ts","../../src/services.ts","../../src/types.ts","../../src/utils.ts","../../src/abi/BatchDeposit.ts","../../src/abi/MerkleDistributorWithDeadline.ts","../../src/abi/Multicall3.ts","../../src/abi/OVM.ts","../../src/abi/OWR.ts","../../src/abi/SplitMain.ts","../../src/abi/splitV2FactoryAbi.ts","../../src/eoa/eoa.ts","../../src/eoa/eoaHelpers.ts","../../src/exits/ethUtils.ts","../../src/exits/exit.ts","../../src/exits/verificationHelpers.ts","../../src/incentives/incentiveHelpers.ts","../../src/incentives/incentives.ts","../../src/splits/splitHelpers.ts","../../src/splits/splits.ts","../../src/verification/common.ts","../../src/verification/signature-validator.ts","../../src/verification/sszTypes.ts","../../src/verification/v1.10.0.ts","../../src/verification/v1.6.0.ts","../../src/verification/v1.7.0.ts","../../src/verification/v1.8.0.ts","../../test/fixtures.ts","../../test/client/ajv.spec.ts","../../test/client/methods.spec.ts","../../test/eoa/eoa.spec.ts","../../test/exit/ethUtils.spec.ts","../../test/exit/exit.spec.ts","../../test/exit/verificationHelpers.spec.ts","../../test/incentives/incentives.spec.ts","../../test/splits/splits.spec.ts"],"version":"5.9.3"}
1
+ {"root":["../../tsup.config.ts","../../src/ajv.ts","../../src/base.ts","../../src/blsUtils.ts","../../src/bytecodes.ts","../../src/constants.ts","../../src/errors.ts","../../src/index.ts","../../src/schema.ts","../../src/services.ts","../../src/types.ts","../../src/utils.ts","../../src/abi/BatchDeposit.ts","../../src/abi/MerkleDistributorWithDeadline.ts","../../src/abi/Multicall3.ts","../../src/abi/OVM.ts","../../src/abi/OWR.ts","../../src/abi/SplitMain.ts","../../src/abi/splitV2FactoryAbi.ts","../../src/eoa/eoa.ts","../../src/eoa/eoaHelpers.ts","../../src/exits/ethUtils.ts","../../src/exits/exit.ts","../../src/exits/verificationHelpers.ts","../../src/incentives/incentiveHelpers.ts","../../src/incentives/incentives.ts","../../src/splits/splitHelpers.ts","../../src/splits/splits.ts","../../src/verification/common.ts","../../src/verification/lockWorker.ts","../../src/verification/parallelPool.ts","../../src/verification/signature-validator.ts","../../src/verification/sszTypes.ts","../../src/verification/v1.10.0.ts","../../src/verification/v1.6.0.ts","../../src/verification/v1.7.0.ts","../../src/verification/v1.8.0.ts","../../test/fixtures.ts","../../test/client/ajv.spec.ts","../../test/client/methods.spec.ts","../../test/eoa/eoa.spec.ts","../../test/exit/ethUtils.spec.ts","../../test/exit/exit.spec.ts","../../test/exit/verificationHelpers.spec.ts","../../test/incentives/incentives.spec.ts","../../test/splits/splits.spec.ts","../../test/verification/parallelPool.spec.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@obolnetwork/obol-sdk",
3
- "version": "2.11.13",
3
+ "version": "2.12.0",
4
4
  "description": "A package for creating Distributed Validators using the Obol API.",
5
5
  "bugs": {
6
6
  "url": "https://github.com/obolnetwork/obol-sdk/issues"