@obolnetwork/obol-sdk 2.12.5 → 2.13.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.
- package/dist/browser/src/index.js +281 -78
- package/dist/browser/src/index.js.map +1 -1
- package/dist/cjs/src/index.js +244 -52
- package/dist/cjs/src/index.js.map +1 -1
- package/dist/cjs/src/verification/clusterLockValidationWorker.js +210 -18
- package/dist/cjs/src/verification/clusterLockValidationWorker.js.map +1 -1
- package/dist/esm/src/{chunk-L2GZF5CQ.js → chunk-EITEAAK3.js} +247 -44
- package/dist/esm/src/chunk-EITEAAK3.js.map +1 -0
- package/dist/esm/src/index.js +2 -2
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/verification/clusterLockValidationWorker.js +1 -1
- package/dist/types/src/constants.d.ts +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/verification/sszTypes.d.ts +14 -1
- package/dist/types/src/verification/v1.11.0.d.ts +29 -0
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/package.json +4 -3
- package/dist/esm/src/chunk-L2GZF5CQ.js.map +0 -1
|
@@ -98,7 +98,7 @@ import { v4 as uuidv4 } from "uuid";
|
|
|
98
98
|
// package.json
|
|
99
99
|
var package_default = {
|
|
100
100
|
name: "@obolnetwork/obol-sdk",
|
|
101
|
-
version: "2.
|
|
101
|
+
version: "2.13.0",
|
|
102
102
|
description: "A package for creating Distributed Validators using the Obol API.",
|
|
103
103
|
bugs: {
|
|
104
104
|
url: "https://github.com/obolnetwork/obol-sdk/issues"
|
|
@@ -159,7 +159,8 @@ var package_default = {
|
|
|
159
159
|
"@typescript-eslint/* stays at ^6.x \u2014 eslint-config-standard-with-typescript@43 requires plugin ^6; v8 causes peer conflict.",
|
|
160
160
|
"uuid stays at ^9.x \u2014 v11+ sets type:module (ESM-only).",
|
|
161
161
|
"viem override pins a single resolved version to prevent duplicates across @safe-global/protocol-kit.",
|
|
162
|
-
"@noble/curves replaces @chainsafe/bls \u2014 pure-JS CJS+ESM, no native addon, same ETH2 BLS12-381 spec. See CHAINSAFE_MIGRATION_PLAN.md."
|
|
162
|
+
"@noble/curves replaces @chainsafe/bls \u2014 pure-JS CJS+ESM, no native addon, same ETH2 BLS12-381 spec. See CHAINSAFE_MIGRATION_PLAN.md.",
|
|
163
|
+
"@noble/curves is in devDependencies (not dependencies) because tsup bundles it inline via noExternal. Keeping it in dependencies caused consumers to install @noble/hashes@2.2.0 (major-version 2) which shadowed @noble/hashes@1.x used by ethereum-cryptography, @coinbase/wallet-sdk, etc., breaking their @noble/curves initialisation with 'anumber is not a function'."
|
|
163
164
|
],
|
|
164
165
|
resolutions: {},
|
|
165
166
|
overrides: {
|
|
@@ -167,7 +168,6 @@ var package_default = {
|
|
|
167
168
|
},
|
|
168
169
|
dependencies: {
|
|
169
170
|
"@chainsafe/enr": "6.0.1",
|
|
170
|
-
"@noble/curves": "2.2.0",
|
|
171
171
|
"@chainsafe/ssz": "0.14.3",
|
|
172
172
|
"@metamask/eth-sig-util": "8.2.0",
|
|
173
173
|
"@safe-global/protocol-kit": "7.1.0",
|
|
@@ -182,6 +182,7 @@ var package_default = {
|
|
|
182
182
|
uuid: "9.0.1"
|
|
183
183
|
},
|
|
184
184
|
devDependencies: {
|
|
185
|
+
"@noble/curves": "2.2.0",
|
|
185
186
|
"@release-it/conventional-changelog": "11.0.0",
|
|
186
187
|
"@types/elliptic": "6.4.18",
|
|
187
188
|
"@types/jest": "29.5.14",
|
|
@@ -395,7 +396,7 @@ var signEnrPayload = (payload, chainId) => {
|
|
|
395
396
|
};
|
|
396
397
|
};
|
|
397
398
|
var DKG_ALGORITHM = "default";
|
|
398
|
-
var CONFIG_VERSION = "v1.
|
|
399
|
+
var CONFIG_VERSION = "v1.11.0";
|
|
399
400
|
var SDK_VERSION = package_default.version;
|
|
400
401
|
var DOMAIN_APPLICATION_BUILDER = "00000001";
|
|
401
402
|
var DOMAIN_DEPOSIT = "03000000";
|
|
@@ -631,7 +632,7 @@ var Base = class {
|
|
|
631
632
|
};
|
|
632
633
|
|
|
633
634
|
// src/verification/common.ts
|
|
634
|
-
import { fromHexString as
|
|
635
|
+
import { fromHexString as fromHexString7 } from "@chainsafe/ssz";
|
|
635
636
|
import elliptic from "elliptic";
|
|
636
637
|
import * as semver from "semver";
|
|
637
638
|
|
|
@@ -687,6 +688,7 @@ import {
|
|
|
687
688
|
ByteListType,
|
|
688
689
|
ByteVectorType,
|
|
689
690
|
ContainerType,
|
|
691
|
+
ListCompositeType,
|
|
690
692
|
UintNumberType
|
|
691
693
|
} from "@chainsafe/ssz";
|
|
692
694
|
var operatorAddressWrapperType = new ContainerType({
|
|
@@ -702,10 +704,25 @@ var operatorContainerType = new ContainerType({
|
|
|
702
704
|
config_signature: new ByteVectorType(65),
|
|
703
705
|
enr_signature: new ByteVectorType(65)
|
|
704
706
|
});
|
|
707
|
+
var k1SignatureListType = new ListCompositeType(
|
|
708
|
+
new ByteVectorType(65),
|
|
709
|
+
32
|
|
710
|
+
);
|
|
711
|
+
var operatorContainerTypeV1X11 = new ContainerType({
|
|
712
|
+
address: new ByteVectorType(20),
|
|
713
|
+
enr: new ByteListType(1024),
|
|
714
|
+
// This needs to be dynamic, since ENRs do not have a fixed length.
|
|
715
|
+
config_signature: k1SignatureListType,
|
|
716
|
+
enr_signature: k1SignatureListType
|
|
717
|
+
});
|
|
705
718
|
var creatorContainerType = new ContainerType({
|
|
706
719
|
address: new ByteVectorType(20),
|
|
707
720
|
config_signature: new ByteVectorType(65)
|
|
708
721
|
});
|
|
722
|
+
var creatorContainerTypeV1X11 = new ContainerType({
|
|
723
|
+
address: new ByteVectorType(20),
|
|
724
|
+
config_signature: k1SignatureListType
|
|
725
|
+
});
|
|
709
726
|
var validatorsContainerType = new ContainerType({
|
|
710
727
|
fee_recipient_address: new ByteVectorType(20),
|
|
711
728
|
withdrawal_address: new ByteVectorType(20)
|
|
@@ -713,9 +730,15 @@ var validatorsContainerType = new ContainerType({
|
|
|
713
730
|
var newCreatorContainerType = (configOnly) => {
|
|
714
731
|
return configOnly ? creatorAddressWrapperType : creatorContainerType;
|
|
715
732
|
};
|
|
733
|
+
var newCreatorContainerTypeV1X11 = (configOnly) => {
|
|
734
|
+
return configOnly ? creatorAddressWrapperType : creatorContainerTypeV1X11;
|
|
735
|
+
};
|
|
716
736
|
var newOperatorContainerType = (configOnly) => {
|
|
717
737
|
return configOnly ? operatorAddressWrapperType : operatorContainerType;
|
|
718
738
|
};
|
|
739
|
+
var newOperatorContainerTypeV1X11 = (configOnly) => {
|
|
740
|
+
return configOnly ? operatorAddressWrapperType : operatorContainerTypeV1X11;
|
|
741
|
+
};
|
|
719
742
|
var depositDataContainer = new ContainerType({
|
|
720
743
|
pubkey: new ByteVectorType(48),
|
|
721
744
|
withdrawal_credentials: new ByteVectorType(32),
|
|
@@ -757,7 +780,7 @@ import {
|
|
|
757
780
|
ByteListType as ByteListType2,
|
|
758
781
|
ByteVectorType as ByteVectorType2,
|
|
759
782
|
ContainerType as ContainerType2,
|
|
760
|
-
ListCompositeType,
|
|
783
|
+
ListCompositeType as ListCompositeType2,
|
|
761
784
|
fromHexString as fromHexString2
|
|
762
785
|
} from "@chainsafe/ssz";
|
|
763
786
|
|
|
@@ -5625,9 +5648,9 @@ var clusterDefinitionContainerTypeV1X6 = (configOnly) => {
|
|
|
5625
5648
|
threshold: new UintNumberType2(8),
|
|
5626
5649
|
dkg_algorithm: new ByteListType2(32),
|
|
5627
5650
|
fork_version: new ByteVectorType2(4),
|
|
5628
|
-
operators: new
|
|
5651
|
+
operators: new ListCompositeType2(newOperatorContainerType(configOnly), 256),
|
|
5629
5652
|
creator: newCreatorContainerType(configOnly),
|
|
5630
|
-
validators: new
|
|
5653
|
+
validators: new ListCompositeType2(validatorsContainerType, 65536)
|
|
5631
5654
|
};
|
|
5632
5655
|
if (!configOnly) {
|
|
5633
5656
|
returnedContainerType = __spreadProps(__spreadValues({}, returnedContainerType), {
|
|
@@ -5674,7 +5697,7 @@ var hashClusterDefinitionV1X6 = (cluster, configOnly) => {
|
|
|
5674
5697
|
};
|
|
5675
5698
|
var dvContainerTypeV1X6 = new ContainerType2({
|
|
5676
5699
|
distributed_public_key: new ByteVectorType2(48),
|
|
5677
|
-
public_shares: new
|
|
5700
|
+
public_shares: new ListCompositeType2(new ByteVectorType2(48), 256),
|
|
5678
5701
|
pubkey: new ByteVectorType2(48),
|
|
5679
5702
|
withdrawal_credentials: new ByteVectorType2(32),
|
|
5680
5703
|
amount: new UintNumberType2(8),
|
|
@@ -5683,7 +5706,7 @@ var dvContainerTypeV1X6 = new ContainerType2({
|
|
|
5683
5706
|
var clusterLockContainerTypeV1X6 = () => {
|
|
5684
5707
|
return new ContainerType2({
|
|
5685
5708
|
cluster_definition: clusterDefinitionContainerTypeV1X6(false),
|
|
5686
|
-
distributed_validators: new
|
|
5709
|
+
distributed_validators: new ListCompositeType2(dvContainerTypeV1X6, 65536)
|
|
5687
5710
|
});
|
|
5688
5711
|
};
|
|
5689
5712
|
var hashClusterLockV1X6 = (cluster) => {
|
|
@@ -5781,7 +5804,7 @@ import {
|
|
|
5781
5804
|
ByteListType as ByteListType3,
|
|
5782
5805
|
ByteVectorType as ByteVectorType3,
|
|
5783
5806
|
ContainerType as ContainerType3,
|
|
5784
|
-
ListCompositeType as
|
|
5807
|
+
ListCompositeType as ListCompositeType3,
|
|
5785
5808
|
fromHexString as fromHexString3
|
|
5786
5809
|
} from "@chainsafe/ssz";
|
|
5787
5810
|
var clusterDefinitionContainerTypeV1X7 = (configOnly) => {
|
|
@@ -5794,9 +5817,9 @@ var clusterDefinitionContainerTypeV1X7 = (configOnly) => {
|
|
|
5794
5817
|
threshold: new UintNumberType3(8),
|
|
5795
5818
|
dkg_algorithm: new ByteListType3(32),
|
|
5796
5819
|
fork_version: new ByteVectorType3(4),
|
|
5797
|
-
operators: new
|
|
5820
|
+
operators: new ListCompositeType3(newOperatorContainerType(configOnly), 256),
|
|
5798
5821
|
creator: newCreatorContainerType(configOnly),
|
|
5799
|
-
validators: new
|
|
5822
|
+
validators: new ListCompositeType3(validatorsContainerType, 65536)
|
|
5800
5823
|
};
|
|
5801
5824
|
if (!configOnly) {
|
|
5802
5825
|
returnedContainerType = __spreadProps(__spreadValues({}, returnedContainerType), {
|
|
@@ -5843,14 +5866,14 @@ var hashClusterDefinitionV1X7 = (cluster, configOnly) => {
|
|
|
5843
5866
|
};
|
|
5844
5867
|
var dvContainerTypeV1X7 = new ContainerType3({
|
|
5845
5868
|
distributed_public_key: new ByteVectorType3(48),
|
|
5846
|
-
public_shares: new
|
|
5869
|
+
public_shares: new ListCompositeType3(new ByteVectorType3(48), 256),
|
|
5847
5870
|
deposit_data: depositDataContainer,
|
|
5848
5871
|
builder_registration: builderRegistrationContainer
|
|
5849
5872
|
});
|
|
5850
5873
|
var clusterLockContainerTypeV1X7 = () => {
|
|
5851
5874
|
return new ContainerType3({
|
|
5852
5875
|
cluster_definition: clusterDefinitionContainerTypeV1X7(false),
|
|
5853
|
-
distributed_validators: new
|
|
5876
|
+
distributed_validators: new ListCompositeType3(dvContainerTypeV1X7, 65536)
|
|
5854
5877
|
});
|
|
5855
5878
|
};
|
|
5856
5879
|
var hashClusterLockV1X7 = (cluster) => {
|
|
@@ -15430,7 +15453,7 @@ import {
|
|
|
15430
15453
|
ByteVectorType as ByteVectorType4,
|
|
15431
15454
|
ContainerType as ContainerType4,
|
|
15432
15455
|
ListBasicType,
|
|
15433
|
-
ListCompositeType as
|
|
15456
|
+
ListCompositeType as ListCompositeType4,
|
|
15434
15457
|
fromHexString as fromHexString4
|
|
15435
15458
|
} from "@chainsafe/ssz";
|
|
15436
15459
|
var clusterDefinitionContainerTypeV1X8 = (configOnly) => {
|
|
@@ -15443,9 +15466,9 @@ var clusterDefinitionContainerTypeV1X8 = (configOnly) => {
|
|
|
15443
15466
|
threshold: new UintNumberType4(8),
|
|
15444
15467
|
dkg_algorithm: new ByteListType4(32),
|
|
15445
15468
|
fork_version: new ByteVectorType4(4),
|
|
15446
|
-
operators: new
|
|
15469
|
+
operators: new ListCompositeType4(newOperatorContainerType(configOnly), 256),
|
|
15447
15470
|
creator: newCreatorContainerType(configOnly),
|
|
15448
|
-
validators: new
|
|
15471
|
+
validators: new ListCompositeType4(validatorsContainerType, 65536),
|
|
15449
15472
|
deposit_amounts: new ListBasicType(
|
|
15450
15473
|
new UintNumberType4(8),
|
|
15451
15474
|
256
|
|
@@ -15501,14 +15524,14 @@ var hashClusterDefinitionV1X8 = (cluster, configOnly) => {
|
|
|
15501
15524
|
};
|
|
15502
15525
|
var dvContainerTypeV1X8 = new ContainerType4({
|
|
15503
15526
|
distributed_public_key: new ByteVectorType4(48),
|
|
15504
|
-
public_shares: new
|
|
15505
|
-
partial_deposit_data: new
|
|
15527
|
+
public_shares: new ListCompositeType4(new ByteVectorType4(48), 256),
|
|
15528
|
+
partial_deposit_data: new ListCompositeType4(depositDataContainer, 256),
|
|
15506
15529
|
builder_registration: builderRegistrationContainer
|
|
15507
15530
|
});
|
|
15508
15531
|
var clusterLockContainerTypeV1X8 = () => {
|
|
15509
15532
|
return new ContainerType4({
|
|
15510
15533
|
cluster_definition: clusterDefinitionContainerTypeV1X8(false),
|
|
15511
|
-
distributed_validators: new
|
|
15534
|
+
distributed_validators: new ListCompositeType4(dvContainerTypeV1X8, 65536)
|
|
15512
15535
|
});
|
|
15513
15536
|
};
|
|
15514
15537
|
var hashClusterLockV1X8 = (cluster) => {
|
|
@@ -15729,7 +15752,7 @@ import {
|
|
|
15729
15752
|
ByteVectorType as ByteVectorType5,
|
|
15730
15753
|
ContainerType as ContainerType5,
|
|
15731
15754
|
ListBasicType as ListBasicType2,
|
|
15732
|
-
ListCompositeType as
|
|
15755
|
+
ListCompositeType as ListCompositeType5,
|
|
15733
15756
|
fromHexString as fromHexString5,
|
|
15734
15757
|
BooleanType
|
|
15735
15758
|
} from "@chainsafe/ssz";
|
|
@@ -15743,9 +15766,9 @@ var clusterDefinitionContainerTypeV1X10 = (configOnly) => {
|
|
|
15743
15766
|
threshold: new UintNumberType5(8),
|
|
15744
15767
|
dkg_algorithm: new ByteListType5(32),
|
|
15745
15768
|
fork_version: new ByteVectorType5(4),
|
|
15746
|
-
operators: new
|
|
15769
|
+
operators: new ListCompositeType5(newOperatorContainerType(configOnly), 256),
|
|
15747
15770
|
creator: newCreatorContainerType(configOnly),
|
|
15748
|
-
validators: new
|
|
15771
|
+
validators: new ListCompositeType5(validatorsContainerType, 65536),
|
|
15749
15772
|
deposit_amounts: new ListBasicType2(
|
|
15750
15773
|
new UintNumberType5(8),
|
|
15751
15774
|
256
|
|
@@ -15813,14 +15836,14 @@ var hashClusterDefinitionV1X10 = (cluster, configOnly) => {
|
|
|
15813
15836
|
};
|
|
15814
15837
|
var dvContainerTypeV1X10 = new ContainerType5({
|
|
15815
15838
|
distributed_public_key: new ByteVectorType5(48),
|
|
15816
|
-
public_shares: new
|
|
15817
|
-
partial_deposit_data: new
|
|
15839
|
+
public_shares: new ListCompositeType5(new ByteVectorType5(48), 256),
|
|
15840
|
+
partial_deposit_data: new ListCompositeType5(depositDataContainer, 256),
|
|
15818
15841
|
builder_registration: builderRegistrationContainer
|
|
15819
15842
|
});
|
|
15820
15843
|
var clusterLockContainerTypeV1X10 = () => {
|
|
15821
15844
|
return new ContainerType5({
|
|
15822
15845
|
cluster_definition: clusterDefinitionContainerTypeV1X10(false),
|
|
15823
|
-
distributed_validators: new
|
|
15846
|
+
distributed_validators: new ListCompositeType5(dvContainerTypeV1X10, 65536)
|
|
15824
15847
|
});
|
|
15825
15848
|
};
|
|
15826
15849
|
var hashClusterLockV1X10 = (cluster) => {
|
|
@@ -15873,6 +15896,175 @@ var hashClusterLockV1X10 = (cluster) => {
|
|
|
15873
15896
|
};
|
|
15874
15897
|
var verifyDVV1X10 = verifyDVV1X8;
|
|
15875
15898
|
|
|
15899
|
+
// src/verification/v1.11.0.ts
|
|
15900
|
+
import {
|
|
15901
|
+
UintNumberType as UintNumberType6
|
|
15902
|
+
} from "@chainsafe/ssz/lib/type/uint.js";
|
|
15903
|
+
import {
|
|
15904
|
+
ByteListType as ByteListType6,
|
|
15905
|
+
ByteVectorType as ByteVectorType6,
|
|
15906
|
+
ContainerType as ContainerType6,
|
|
15907
|
+
ListBasicType as ListBasicType3,
|
|
15908
|
+
ListCompositeType as ListCompositeType6,
|
|
15909
|
+
fromHexString as fromHexString6,
|
|
15910
|
+
BooleanType as BooleanType2
|
|
15911
|
+
} from "@chainsafe/ssz";
|
|
15912
|
+
var splitK1SignatureList = (signature) => {
|
|
15913
|
+
const bytes = fromHexString6(signature);
|
|
15914
|
+
if (bytes.length === 0) return [];
|
|
15915
|
+
if (bytes.length % 65 !== 0) {
|
|
15916
|
+
throw new Error("Signature length must be a multiple of 65 bytes");
|
|
15917
|
+
}
|
|
15918
|
+
const chunks = [];
|
|
15919
|
+
for (let i = 0; i < bytes.length; i += 65) {
|
|
15920
|
+
chunks.push(bytes.slice(i, i + 65));
|
|
15921
|
+
}
|
|
15922
|
+
return chunks;
|
|
15923
|
+
};
|
|
15924
|
+
var clusterDefinitionContainerTypeV1X11 = (configOnly) => {
|
|
15925
|
+
let returnedContainerType = {
|
|
15926
|
+
uuid: new ByteListType6(64),
|
|
15927
|
+
name: new ByteListType6(256),
|
|
15928
|
+
version: new ByteListType6(16),
|
|
15929
|
+
timestamp: new ByteListType6(32),
|
|
15930
|
+
num_validators: new UintNumberType6(8),
|
|
15931
|
+
threshold: new UintNumberType6(8),
|
|
15932
|
+
dkg_algorithm: new ByteListType6(32),
|
|
15933
|
+
fork_version: new ByteVectorType6(4),
|
|
15934
|
+
operators: new ListCompositeType6(
|
|
15935
|
+
newOperatorContainerTypeV1X11(configOnly),
|
|
15936
|
+
256
|
|
15937
|
+
),
|
|
15938
|
+
creator: newCreatorContainerTypeV1X11(configOnly),
|
|
15939
|
+
validators: new ListCompositeType6(validatorsContainerType, 65536),
|
|
15940
|
+
deposit_amounts: new ListBasicType3(
|
|
15941
|
+
new UintNumberType6(8),
|
|
15942
|
+
256
|
|
15943
|
+
),
|
|
15944
|
+
consensus_protocol: new ByteListType6(256),
|
|
15945
|
+
target_gas_limit: new UintNumberType6(8),
|
|
15946
|
+
compounding: new BooleanType2()
|
|
15947
|
+
};
|
|
15948
|
+
if (!configOnly) {
|
|
15949
|
+
returnedContainerType = __spreadProps(__spreadValues({}, returnedContainerType), {
|
|
15950
|
+
config_hash: new ByteVectorType6(32)
|
|
15951
|
+
});
|
|
15952
|
+
}
|
|
15953
|
+
return new ContainerType6(returnedContainerType);
|
|
15954
|
+
};
|
|
15955
|
+
var hashClusterDefinitionV1X11 = (cluster, configOnly) => {
|
|
15956
|
+
const definitionType = clusterDefinitionContainerTypeV1X11(configOnly);
|
|
15957
|
+
const val = definitionType.defaultValue();
|
|
15958
|
+
val.uuid = strToUint8Array(cluster.uuid);
|
|
15959
|
+
val.name = strToUint8Array(cluster.name);
|
|
15960
|
+
val.version = strToUint8Array(cluster.version);
|
|
15961
|
+
val.timestamp = strToUint8Array(cluster.timestamp);
|
|
15962
|
+
val.num_validators = cluster.num_validators;
|
|
15963
|
+
val.threshold = cluster.threshold;
|
|
15964
|
+
val.dkg_algorithm = strToUint8Array(cluster.dkg_algorithm);
|
|
15965
|
+
val.fork_version = fromHexString6(cluster.fork_version);
|
|
15966
|
+
val.operators = cluster.operators.map((operator) => {
|
|
15967
|
+
return configOnly ? { address: fromHexString6(operator.address) } : {
|
|
15968
|
+
address: fromHexString6(operator.address),
|
|
15969
|
+
enr: strToUint8Array(operator.enr),
|
|
15970
|
+
config_signature: splitK1SignatureList(
|
|
15971
|
+
operator.config_signature
|
|
15972
|
+
),
|
|
15973
|
+
enr_signature: splitK1SignatureList(operator.enr_signature)
|
|
15974
|
+
};
|
|
15975
|
+
});
|
|
15976
|
+
val.creator = configOnly ? { address: fromHexString6(cluster.creator.address) } : {
|
|
15977
|
+
address: fromHexString6(cluster.creator.address),
|
|
15978
|
+
config_signature: splitK1SignatureList(
|
|
15979
|
+
cluster.creator.config_signature
|
|
15980
|
+
)
|
|
15981
|
+
};
|
|
15982
|
+
val.validators = cluster.validators.map((validator) => {
|
|
15983
|
+
return {
|
|
15984
|
+
fee_recipient_address: fromHexString6(validator.fee_recipient_address),
|
|
15985
|
+
withdrawal_address: fromHexString6(validator.withdrawal_address)
|
|
15986
|
+
};
|
|
15987
|
+
});
|
|
15988
|
+
if (cluster.deposit_amounts) {
|
|
15989
|
+
val.deposit_amounts = cluster.deposit_amounts.map((amount) => {
|
|
15990
|
+
return parseInt(amount);
|
|
15991
|
+
});
|
|
15992
|
+
}
|
|
15993
|
+
if (cluster.consensus_protocol) {
|
|
15994
|
+
val.consensus_protocol = strToUint8Array(cluster.consensus_protocol);
|
|
15995
|
+
}
|
|
15996
|
+
if (cluster.target_gas_limit) {
|
|
15997
|
+
val.target_gas_limit = cluster.target_gas_limit;
|
|
15998
|
+
}
|
|
15999
|
+
if (cluster.compounding) {
|
|
16000
|
+
val.compounding = cluster.compounding;
|
|
16001
|
+
}
|
|
16002
|
+
if (!configOnly) {
|
|
16003
|
+
val.config_hash = fromHexString6(cluster.config_hash);
|
|
16004
|
+
}
|
|
16005
|
+
return val;
|
|
16006
|
+
};
|
|
16007
|
+
var dvContainerTypeV1X11 = new ContainerType6({
|
|
16008
|
+
distributed_public_key: new ByteVectorType6(48),
|
|
16009
|
+
public_shares: new ListCompositeType6(new ByteVectorType6(48), 256),
|
|
16010
|
+
partial_deposit_data: new ListCompositeType6(depositDataContainer, 256),
|
|
16011
|
+
builder_registration: builderRegistrationContainer
|
|
16012
|
+
});
|
|
16013
|
+
var clusterLockContainerTypeV1X11 = () => {
|
|
16014
|
+
return new ContainerType6({
|
|
16015
|
+
cluster_definition: clusterDefinitionContainerTypeV1X11(false),
|
|
16016
|
+
distributed_validators: new ListCompositeType6(dvContainerTypeV1X11, 65536)
|
|
16017
|
+
});
|
|
16018
|
+
};
|
|
16019
|
+
var hashClusterLockV1X11 = (cluster) => {
|
|
16020
|
+
const lockType = clusterLockContainerTypeV1X11();
|
|
16021
|
+
const val = lockType.defaultValue();
|
|
16022
|
+
val.cluster_definition = hashClusterDefinitionV1X11(
|
|
16023
|
+
cluster.cluster_definition,
|
|
16024
|
+
false
|
|
16025
|
+
);
|
|
16026
|
+
val.distributed_validators = cluster.distributed_validators.map(
|
|
16027
|
+
(dValidator) => {
|
|
16028
|
+
var _a6, _b2, _c, _d, _e;
|
|
16029
|
+
return {
|
|
16030
|
+
distributed_public_key: fromHexString6(
|
|
16031
|
+
dValidator.distributed_public_key
|
|
16032
|
+
),
|
|
16033
|
+
public_shares: dValidator.public_shares.map(
|
|
16034
|
+
(publicShare) => fromHexString6(publicShare)
|
|
16035
|
+
),
|
|
16036
|
+
partial_deposit_data: dValidator.partial_deposit_data.map((depositData) => {
|
|
16037
|
+
return {
|
|
16038
|
+
pubkey: fromHexString6(depositData.pubkey),
|
|
16039
|
+
withdrawal_credentials: fromHexString6(
|
|
16040
|
+
depositData.withdrawal_credentials
|
|
16041
|
+
),
|
|
16042
|
+
amount: parseInt(depositData.amount),
|
|
16043
|
+
signature: fromHexString6(depositData.signature)
|
|
16044
|
+
};
|
|
16045
|
+
}),
|
|
16046
|
+
builder_registration: {
|
|
16047
|
+
message: {
|
|
16048
|
+
fee_recipient: fromHexString6(
|
|
16049
|
+
(_a6 = dValidator.builder_registration) == null ? void 0 : _a6.message.fee_recipient
|
|
16050
|
+
),
|
|
16051
|
+
gas_limit: (_b2 = dValidator.builder_registration) == null ? void 0 : _b2.message.gas_limit,
|
|
16052
|
+
timestamp: (_c = dValidator.builder_registration) == null ? void 0 : _c.message.timestamp,
|
|
16053
|
+
pubkey: fromHexString6(
|
|
16054
|
+
(_d = dValidator.builder_registration) == null ? void 0 : _d.message.pubkey
|
|
16055
|
+
)
|
|
16056
|
+
},
|
|
16057
|
+
signature: fromHexString6(
|
|
16058
|
+
(_e = dValidator.builder_registration) == null ? void 0 : _e.signature
|
|
16059
|
+
)
|
|
16060
|
+
}
|
|
16061
|
+
};
|
|
16062
|
+
}
|
|
16063
|
+
);
|
|
16064
|
+
return "0x" + Buffer.from(lockType.hashTreeRoot(val).buffer).toString("hex");
|
|
16065
|
+
};
|
|
16066
|
+
var verifyDVV1X11 = verifyDVV1X8;
|
|
16067
|
+
|
|
15876
16068
|
// src/verification/common.ts
|
|
15877
16069
|
var clusterConfigOrDefinitionHash = (cluster, configOnly) => {
|
|
15878
16070
|
let definitionType, val;
|
|
@@ -15897,6 +16089,11 @@ var clusterConfigOrDefinitionHash = (cluster, configOnly) => {
|
|
|
15897
16089
|
const x = "0x" + Buffer.from(definitionType.hashTreeRoot(val).buffer).toString("hex");
|
|
15898
16090
|
return x;
|
|
15899
16091
|
}
|
|
16092
|
+
if (semver.eq(cluster.version, "v1.11.0")) {
|
|
16093
|
+
definitionType = clusterDefinitionContainerTypeV1X11(configOnly);
|
|
16094
|
+
val = hashClusterDefinitionV1X11(cluster, configOnly);
|
|
16095
|
+
return "0x" + Buffer.from(definitionType.hashTreeRoot(val).buffer).toString("hex");
|
|
16096
|
+
}
|
|
15900
16097
|
throw new Error("unsupported version");
|
|
15901
16098
|
};
|
|
15902
16099
|
var clusterLockHash = (clusterLock) => {
|
|
@@ -15922,6 +16119,9 @@ var clusterLockHash = (clusterLock) => {
|
|
|
15922
16119
|
if (semver.eq(clusterLock.cluster_definition.version, "v1.10.0")) {
|
|
15923
16120
|
return hashClusterLockV1X10(clusterLock);
|
|
15924
16121
|
}
|
|
16122
|
+
if (semver.eq(clusterLock.cluster_definition.version, "v1.11.0")) {
|
|
16123
|
+
return hashClusterLockV1X11(clusterLock);
|
|
16124
|
+
}
|
|
15925
16125
|
throw new Error("unsupported version");
|
|
15926
16126
|
};
|
|
15927
16127
|
var validatePOSTConfigHashSigner = (address, signature, configHash, chainId, safeRpcUrl) => __async(null, null, function* () {
|
|
@@ -16021,8 +16221,8 @@ var computeSigningRoot = (sszObjectRoot, domain) => {
|
|
|
16021
16221
|
};
|
|
16022
16222
|
var computeDepositMsgRoot = (msg) => {
|
|
16023
16223
|
const depositMsgVal = depositMessageType.defaultValue();
|
|
16024
|
-
depositMsgVal.pubkey =
|
|
16025
|
-
depositMsgVal.withdrawal_credentials =
|
|
16224
|
+
depositMsgVal.pubkey = fromHexString7(msg.pubkey);
|
|
16225
|
+
depositMsgVal.withdrawal_credentials = fromHexString7(
|
|
16026
16226
|
msg.withdrawal_credentials
|
|
16027
16227
|
);
|
|
16028
16228
|
depositMsgVal.amount = parseInt(msg.amount);
|
|
@@ -16036,16 +16236,16 @@ var computeForkDataRoot = (currentVersion, genesisValidatorsRoot) => {
|
|
|
16036
16236
|
};
|
|
16037
16237
|
var computebuilderRegistrationMsgRoot = (msg) => {
|
|
16038
16238
|
const builderRegistrationMsgVal = builderRegistrationMessageType.defaultValue();
|
|
16039
|
-
builderRegistrationMsgVal.fee_recipient =
|
|
16239
|
+
builderRegistrationMsgVal.fee_recipient = fromHexString7(msg.fee_recipient);
|
|
16040
16240
|
builderRegistrationMsgVal.gas_limit = msg.gas_limit;
|
|
16041
16241
|
builderRegistrationMsgVal.timestamp = msg.timestamp;
|
|
16042
|
-
builderRegistrationMsgVal.pubkey =
|
|
16242
|
+
builderRegistrationMsgVal.pubkey = fromHexString7(msg.pubkey);
|
|
16043
16243
|
return Buffer.from(
|
|
16044
16244
|
builderRegistrationMessageType.hashTreeRoot(builderRegistrationMsgVal).buffer
|
|
16045
16245
|
);
|
|
16046
16246
|
};
|
|
16047
|
-
var computeDomain = (domainType, lockForkVersion, genesisValidatorsRoot =
|
|
16048
|
-
const forkVersion =
|
|
16247
|
+
var computeDomain = (domainType, lockForkVersion, genesisValidatorsRoot = fromHexString7(GENESIS_VALIDATOR_ROOT)) => {
|
|
16248
|
+
const forkVersion = fromHexString7(
|
|
16049
16249
|
lockForkVersion.substring(2, lockForkVersion.length)
|
|
16050
16250
|
);
|
|
16051
16251
|
const forkDataRoot = computeForkDataRoot(forkVersion, genesisValidatorsRoot);
|
|
@@ -16054,10 +16254,10 @@ var computeDomain = (domainType, lockForkVersion, genesisValidatorsRoot = fromHe
|
|
|
16054
16254
|
domain.set(forkDataRoot.subarray(0, 28), 4);
|
|
16055
16255
|
return domain;
|
|
16056
16256
|
};
|
|
16057
|
-
var depositDomainForFork = (forkVersion) => computeDomain(
|
|
16058
|
-
var builderDomainForFork = (forkVersion) => computeDomain(
|
|
16257
|
+
var depositDomainForFork = (forkVersion) => computeDomain(fromHexString7(DOMAIN_DEPOSIT), forkVersion);
|
|
16258
|
+
var builderDomainForFork = (forkVersion) => computeDomain(fromHexString7(DOMAIN_APPLICATION_BUILDER), forkVersion);
|
|
16059
16259
|
var validateDepositDataStructure = (distributedPublicKey, depositData, withdrawalAddress, forkVersion, compounding, precomputedDepositDomain) => {
|
|
16060
|
-
const depositDomain = precomputedDepositDomain != null ? precomputedDepositDomain : computeDomain(
|
|
16260
|
+
const depositDomain = precomputedDepositDomain != null ? precomputedDepositDomain : computeDomain(fromHexString7(DOMAIN_DEPOSIT), forkVersion);
|
|
16061
16261
|
const withdrawalPrefix = compounding ? "0x02" : "0x01";
|
|
16062
16262
|
const expectedWithdrawalCredentials = withdrawalPrefix + "0".repeat(22) + withdrawalAddress.toLowerCase().slice(2);
|
|
16063
16263
|
if (expectedWithdrawalCredentials !== depositData.withdrawal_credentials) {
|
|
@@ -16084,9 +16284,9 @@ var depositBlsCheck = (distributedPublicKey, depositData, withdrawalAddress, for
|
|
|
16084
16284
|
);
|
|
16085
16285
|
if (!valid || !depositData.signature || !depositData.pubkey) return null;
|
|
16086
16286
|
return {
|
|
16087
|
-
pubkey:
|
|
16287
|
+
pubkey: fromHexString7(depositData.pubkey),
|
|
16088
16288
|
message: message2,
|
|
16089
|
-
signature:
|
|
16289
|
+
signature: fromHexString7(depositData.signature)
|
|
16090
16290
|
};
|
|
16091
16291
|
};
|
|
16092
16292
|
var verifyDepositData = (distributedPublicKey, depositData, withdrawalAddress, forkVersion, compounding) => {
|
|
@@ -16101,15 +16301,15 @@ var verifyDepositData = (distributedPublicKey, depositData, withdrawalAddress, f
|
|
|
16101
16301
|
return { isValidDepositData: false, depositDataMsg: message2 };
|
|
16102
16302
|
}
|
|
16103
16303
|
const isValidDepositData = blsVerify(
|
|
16104
|
-
|
|
16304
|
+
fromHexString7(depositData.pubkey),
|
|
16105
16305
|
message2,
|
|
16106
|
-
|
|
16306
|
+
fromHexString7(depositData.signature)
|
|
16107
16307
|
);
|
|
16108
16308
|
return { isValidDepositData, depositDataMsg: message2 };
|
|
16109
16309
|
};
|
|
16110
16310
|
var verifyBuilderRegistration = (validator, feeRecipientAddress, forkVersion, precomputedBuilderDomain) => {
|
|
16111
16311
|
var _a6;
|
|
16112
|
-
const builderDomain = precomputedBuilderDomain != null ? precomputedBuilderDomain : computeDomain(
|
|
16312
|
+
const builderDomain = precomputedBuilderDomain != null ? precomputedBuilderDomain : computeDomain(fromHexString7(DOMAIN_APPLICATION_BUILDER), forkVersion);
|
|
16113
16313
|
if (validator.distributed_public_key !== ((_a6 = validator.builder_registration) == null ? void 0 : _a6.message.pubkey)) {
|
|
16114
16314
|
return {
|
|
16115
16315
|
isValidBuilderRegistration: false,
|
|
@@ -16145,9 +16345,9 @@ var builderBlsCheck = (validator, feeRecipientAddress, forkVersion, precomputedB
|
|
|
16145
16345
|
const sig = (_a6 = validator.builder_registration) == null ? void 0 : _a6.signature;
|
|
16146
16346
|
if (!isValidBuilderRegistration || !sig) return null;
|
|
16147
16347
|
return {
|
|
16148
|
-
pubkey:
|
|
16348
|
+
pubkey: fromHexString7(validator.distributed_public_key),
|
|
16149
16349
|
message: builderRegistrationMsg,
|
|
16150
|
-
signature:
|
|
16350
|
+
signature: fromHexString7(sig)
|
|
16151
16351
|
};
|
|
16152
16352
|
};
|
|
16153
16353
|
var verifyNodeSignatures = (clusterLock) => {
|
|
@@ -16189,6 +16389,9 @@ var verifyLockData = (clusterLock) => __async(null, null, function* () {
|
|
|
16189
16389
|
if (semver.eq(clusterLock.cluster_definition.version, "v1.10.0")) {
|
|
16190
16390
|
return yield verifyDVV1X10(clusterLock);
|
|
16191
16391
|
}
|
|
16392
|
+
if (semver.eq(clusterLock.cluster_definition.version, "v1.11.0")) {
|
|
16393
|
+
return yield verifyDVV1X11(clusterLock);
|
|
16394
|
+
}
|
|
16192
16395
|
return false;
|
|
16193
16396
|
});
|
|
16194
16397
|
var hasUniqueDistributedKeys = (clusterLock) => {
|
|
@@ -19895,11 +20098,11 @@ var Incentives = class {
|
|
|
19895
20098
|
// src/exits/exit.ts
|
|
19896
20099
|
import * as elliptic2 from "elliptic";
|
|
19897
20100
|
import {
|
|
19898
|
-
ByteVectorType as
|
|
19899
|
-
ContainerType as
|
|
19900
|
-
fromHexString as
|
|
19901
|
-
ListCompositeType as
|
|
19902
|
-
UintNumberType as
|
|
20101
|
+
ByteVectorType as ByteVectorType8,
|
|
20102
|
+
ContainerType as ContainerType8,
|
|
20103
|
+
fromHexString as fromHexString9,
|
|
20104
|
+
ListCompositeType as ListCompositeType7,
|
|
20105
|
+
UintNumberType as UintNumberType7
|
|
19903
20106
|
} from "@chainsafe/ssz";
|
|
19904
20107
|
|
|
19905
20108
|
// src/exits/ethUtils.ts
|
|
@@ -19937,15 +20140,15 @@ function getGenesisValidatorsRoot(beaconNodeApiUrl) {
|
|
|
19937
20140
|
}
|
|
19938
20141
|
|
|
19939
20142
|
// src/exits/verificationHelpers.ts
|
|
19940
|
-
import { ContainerType as
|
|
20143
|
+
import { ContainerType as ContainerType7, ByteVectorType as ByteVectorType7, fromHexString as fromHexString8 } from "@chainsafe/ssz";
|
|
19941
20144
|
var GENESIS_VALIDATOR_ROOT_HEX_STRING = "0x0000000000000000000000000000000000000000000000000000000000000000";
|
|
19942
|
-
var ForkDataType = new
|
|
19943
|
-
currentVersion: new
|
|
19944
|
-
genesisValidatorsRoot: new
|
|
20145
|
+
var ForkDataType = new ContainerType7({
|
|
20146
|
+
currentVersion: new ByteVectorType7(4),
|
|
20147
|
+
genesisValidatorsRoot: new ByteVectorType7(32)
|
|
19945
20148
|
});
|
|
19946
|
-
var SigningRootType = new
|
|
19947
|
-
objectRoot: new
|
|
19948
|
-
domain: new
|
|
20149
|
+
var SigningRootType = new ContainerType7({
|
|
20150
|
+
objectRoot: new ByteVectorType7(32),
|
|
20151
|
+
domain: new ByteVectorType7(32)
|
|
19949
20152
|
});
|
|
19950
20153
|
function computeForkDataRoot2(currentVersion, genesisValidatorsRoot) {
|
|
19951
20154
|
const forkDataVal = ForkDataType.defaultValue();
|
|
@@ -19954,7 +20157,7 @@ function computeForkDataRoot2(currentVersion, genesisValidatorsRoot) {
|
|
|
19954
20157
|
return Buffer.from(ForkDataType.hashTreeRoot(forkDataVal).buffer);
|
|
19955
20158
|
}
|
|
19956
20159
|
function computeDomain2(domainType, forkVersionString, genesisValidatorsRootOverride) {
|
|
19957
|
-
const forkVersionBytes =
|
|
20160
|
+
const forkVersionBytes = fromHexString8(
|
|
19958
20161
|
forkVersionString.substring(2, forkVersionString.length)
|
|
19959
20162
|
);
|
|
19960
20163
|
if (forkVersionBytes.length !== 4) {
|
|
@@ -19963,7 +20166,7 @@ function computeDomain2(domainType, forkVersionString, genesisValidatorsRootOver
|
|
|
19963
20166
|
if (domainType.length !== 4) {
|
|
19964
20167
|
throw new Error("Domain type must be 4 bytes");
|
|
19965
20168
|
}
|
|
19966
|
-
const actualGenesisValidatorsRoot = genesisValidatorsRootOverride != null ? genesisValidatorsRootOverride :
|
|
20169
|
+
const actualGenesisValidatorsRoot = genesisValidatorsRootOverride != null ? genesisValidatorsRootOverride : fromHexString8(GENESIS_VALIDATOR_ROOT_HEX_STRING.substring(2));
|
|
19967
20170
|
if (actualGenesisValidatorsRoot.length !== 32) {
|
|
19968
20171
|
throw new Error("genesisValidatorsRoot must be 32 bytes");
|
|
19969
20172
|
}
|
|
@@ -19995,25 +20198,25 @@ function signingRoot2(domain, messageBuffer) {
|
|
|
19995
20198
|
|
|
19996
20199
|
// src/exits/exit.ts
|
|
19997
20200
|
var DOMAIN_VOLUNTARY_EXIT = "0x04000000";
|
|
19998
|
-
var SSZExitMessageType = new
|
|
19999
|
-
epoch: new
|
|
20000
|
-
validator_index: new
|
|
20201
|
+
var SSZExitMessageType = new ContainerType8({
|
|
20202
|
+
epoch: new UintNumberType7(8),
|
|
20203
|
+
validator_index: new UintNumberType7(8)
|
|
20001
20204
|
});
|
|
20002
|
-
var SSZPartialExitsPayloadType = new
|
|
20003
|
-
partial_exits: new
|
|
20004
|
-
new
|
|
20005
|
-
public_key: new
|
|
20006
|
-
signed_exit_message: new
|
|
20007
|
-
message: new
|
|
20008
|
-
epoch: new
|
|
20009
|
-
validator_index: new
|
|
20205
|
+
var SSZPartialExitsPayloadType = new ContainerType8({
|
|
20206
|
+
partial_exits: new ListCompositeType7(
|
|
20207
|
+
new ContainerType8({
|
|
20208
|
+
public_key: new ByteVectorType8(48),
|
|
20209
|
+
signed_exit_message: new ContainerType8({
|
|
20210
|
+
message: new ContainerType8({
|
|
20211
|
+
epoch: new UintNumberType7(8),
|
|
20212
|
+
validator_index: new UintNumberType7(8)
|
|
20010
20213
|
}),
|
|
20011
|
-
signature: new
|
|
20214
|
+
signature: new ByteVectorType8(96)
|
|
20012
20215
|
})
|
|
20013
20216
|
}),
|
|
20014
20217
|
65536
|
|
20015
20218
|
),
|
|
20016
|
-
share_idx: new
|
|
20219
|
+
share_idx: new UintNumberType7(8)
|
|
20017
20220
|
});
|
|
20018
20221
|
var Exit = class _Exit {
|
|
20019
20222
|
/**
|
|
@@ -20056,7 +20259,7 @@ var Exit = class _Exit {
|
|
|
20056
20259
|
static computeExitPayloadRoot(exits) {
|
|
20057
20260
|
const sszValue = SSZPartialExitsPayloadType.defaultValue();
|
|
20058
20261
|
sszValue.partial_exits = exits.partial_exits.map((pe) => ({
|
|
20059
|
-
public_key:
|
|
20262
|
+
public_key: fromHexString9(pe.public_key),
|
|
20060
20263
|
signed_exit_message: {
|
|
20061
20264
|
message: {
|
|
20062
20265
|
epoch: _Exit.safeParseInt(pe.signed_exit_message.message.epoch),
|
|
@@ -20064,7 +20267,7 @@ var Exit = class _Exit {
|
|
|
20064
20267
|
pe.signed_exit_message.message.validator_index
|
|
20065
20268
|
)
|
|
20066
20269
|
},
|
|
20067
|
-
signature:
|
|
20270
|
+
signature: fromHexString9(pe.signed_exit_message.signature)
|
|
20068
20271
|
}
|
|
20069
20272
|
}));
|
|
20070
20273
|
sszValue.share_idx = exits.share_idx;
|
|
@@ -20114,18 +20317,18 @@ var Exit = class _Exit {
|
|
|
20114
20317
|
signedExitMessage.message
|
|
20115
20318
|
);
|
|
20116
20319
|
const exitDomain = computeDomain2(
|
|
20117
|
-
|
|
20320
|
+
fromHexString9(DOMAIN_VOLUNTARY_EXIT),
|
|
20118
20321
|
capellaForkVersionString,
|
|
20119
|
-
|
|
20322
|
+
fromHexString9(genesisValidatorsRootString)
|
|
20120
20323
|
);
|
|
20121
20324
|
const messageSigningRoot = signingRoot2(
|
|
20122
20325
|
exitDomain,
|
|
20123
20326
|
partialExitMessageBuffer
|
|
20124
20327
|
);
|
|
20125
20328
|
return blsVerify(
|
|
20126
|
-
|
|
20329
|
+
fromHexString9(publicShareKey),
|
|
20127
20330
|
messageSigningRoot,
|
|
20128
|
-
|
|
20331
|
+
fromHexString9(signedExitMessage.signature)
|
|
20129
20332
|
);
|
|
20130
20333
|
});
|
|
20131
20334
|
}
|
|
@@ -20428,7 +20631,7 @@ var Exit = class _Exit {
|
|
|
20428
20631
|
);
|
|
20429
20632
|
}
|
|
20430
20633
|
try {
|
|
20431
|
-
const sigBytes =
|
|
20634
|
+
const sigBytes = fromHexString9(cleanSigStr);
|
|
20432
20635
|
const sigIdx = parseInt(sigIdxStr, 10);
|
|
20433
20636
|
signaturesByIndex.set(sigIdx + 1, sigBytes);
|
|
20434
20637
|
} catch (err) {
|
|
@@ -21662,7 +21865,7 @@ var Client = class extends Base {
|
|
|
21662
21865
|
* @example
|
|
21663
21866
|
* ```typescript
|
|
21664
21867
|
* const updatedDef = await client.acceptClusterDefinition(
|
|
21665
|
-
* { enr: "enr:-LK4Q...", version: "v1.
|
|
21868
|
+
* { enr: "enr:-LK4Q...", version: "v1.11.0" },
|
|
21666
21869
|
* configHash,
|
|
21667
21870
|
* );
|
|
21668
21871
|
* ```
|