@obolnetwork/obol-sdk 1.0.15 → 1.0.17
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/README.md +6 -3
- package/dist/cjs/package.json +11 -6
- package/dist/cjs/src/ajv.js +27 -0
- package/dist/cjs/src/constants.js +8 -4
- package/dist/cjs/src/index.js +21 -18
- package/dist/cjs/src/schema.js +8 -0
- package/dist/cjs/src/services.js +1 -1
- package/dist/cjs/src/utils.js +3 -3
- package/dist/cjs/src/verification/common.js +19 -7
- package/dist/cjs/src/verification/termsAndConditions.js +1 -1
- package/dist/cjs/src/verification/v1.6.0.js +1 -1
- package/dist/cjs/src/verification/v1.7.0.js +3 -3
- package/dist/cjs/src/verification/v1.8.0.js +3 -3
- package/dist/cjs/test/fixtures.js +71 -82
- package/dist/cjs/test/methods.test.js +54 -27
- package/dist/esm/package.json +11 -6
- package/dist/esm/src/ajv.js +27 -0
- package/dist/esm/src/base.js +1 -1
- package/dist/esm/src/constants.js +7 -3
- package/dist/esm/src/index.js +22 -19
- package/dist/esm/src/schema.js +8 -0
- package/dist/esm/src/services.js +1 -1
- package/dist/esm/src/utils.js +3 -3
- package/dist/esm/src/verification/common.js +27 -15
- package/dist/esm/src/verification/sszTypes.js +1 -1
- package/dist/esm/src/verification/termsAndConditions.js +1 -1
- package/dist/esm/src/verification/v1.6.0.js +5 -5
- package/dist/esm/src/verification/v1.7.0.js +8 -8
- package/dist/esm/src/verification/v1.8.0.js +8 -8
- package/dist/esm/test/fixtures.js +71 -82
- package/dist/esm/test/methods.test.js +55 -28
- package/dist/types/src/constants.d.ts +3 -1
- package/dist/types/src/index.d.ts +11 -9
- package/dist/types/src/schema.d.ts +8 -0
- package/dist/types/src/services.d.ts +1 -1
- package/dist/types/src/types.d.ts +18 -18
- package/package.json +12 -7
- package/src/ajv.ts +38 -7
- package/src/base.ts +22 -18
- package/src/constants.ts +42 -36
- package/src/errors.ts +4 -4
- package/src/index.ts +96 -84
- package/src/schema.ts +10 -2
- package/src/services.ts +7 -7
- package/src/types.ts +65 -65
- package/src/utils.ts +17 -17
- package/src/verification/common.ts +374 -333
- package/src/verification/sszTypes.ts +60 -51
- package/src/verification/termsAndConditions.ts +16 -14
- package/src/verification/v1.6.0.ts +214 -184
- package/src/verification/v1.7.0.ts +268 -233
- package/src/verification/v1.8.0.ts +266 -225
package/dist/esm/src/schema.js
CHANGED
|
@@ -52,6 +52,14 @@ export const definitionSchema = {
|
|
|
52
52
|
required: ['fee_recipient_address', 'withdrawal_address'],
|
|
53
53
|
},
|
|
54
54
|
},
|
|
55
|
+
deposit_amounts: {
|
|
56
|
+
type: 'array',
|
|
57
|
+
items: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
pattern: '^[0-9]+$',
|
|
60
|
+
},
|
|
61
|
+
validDepositAmounts: true,
|
|
62
|
+
},
|
|
55
63
|
},
|
|
56
64
|
required: ['name', 'operators', 'validators'],
|
|
57
65
|
};
|
package/dist/esm/src/services.js
CHANGED
|
@@ -15,7 +15,7 @@ import { isValidClusterLock } from './verification/common.js';
|
|
|
15
15
|
* @throws on missing keys or values.
|
|
16
16
|
*
|
|
17
17
|
* An example of how to use validateClusterLock:
|
|
18
|
-
* [validateClusterLock](https://github.com/ObolNetwork/obol-sdk-examples/blob/main/TS-Example/index.ts)
|
|
18
|
+
* [validateClusterLock](https://github.com/ObolNetwork/obol-sdk-examples/blob/main/TS-Example/index.ts#L127)
|
|
19
19
|
*/
|
|
20
20
|
export const validateClusterLock = (lock) => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
21
|
try {
|
package/dist/esm/src/utils.js
CHANGED
|
@@ -8,7 +8,7 @@ export const strToUint8Array = (str) => {
|
|
|
8
8
|
export const definitionFlow = (clusterDefinition) => {
|
|
9
9
|
if (clusterDefinition.creator.address &&
|
|
10
10
|
clusterDefinition.creator.config_signature &&
|
|
11
|
-
clusterDefinition.operators.every(
|
|
11
|
+
clusterDefinition.operators.every(operator => {
|
|
12
12
|
return (operator.address &&
|
|
13
13
|
operator.config_signature &&
|
|
14
14
|
operator.enr &&
|
|
@@ -18,7 +18,7 @@ export const definitionFlow = (clusterDefinition) => {
|
|
|
18
18
|
}
|
|
19
19
|
else if (clusterDefinition.creator.address &&
|
|
20
20
|
clusterDefinition.creator.config_signature &&
|
|
21
|
-
clusterDefinition.operators.every(
|
|
21
|
+
clusterDefinition.operators.every(operator => {
|
|
22
22
|
return (!operator.address &&
|
|
23
23
|
!operator.config_signature &&
|
|
24
24
|
operator.enr &&
|
|
@@ -28,7 +28,7 @@ export const definitionFlow = (clusterDefinition) => {
|
|
|
28
28
|
}
|
|
29
29
|
else if (!clusterDefinition.creator.address &&
|
|
30
30
|
!clusterDefinition.creator.config_signature &&
|
|
31
|
-
clusterDefinition.operators.every(
|
|
31
|
+
clusterDefinition.operators.every(operator => {
|
|
32
32
|
return (!operator.address &&
|
|
33
33
|
!operator.config_signature &&
|
|
34
34
|
operator.enr &&
|
|
@@ -7,20 +7,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import { fromHexString
|
|
10
|
+
import { fromHexString } from '@chainsafe/ssz';
|
|
11
11
|
import elliptic from 'elliptic';
|
|
12
|
-
import { init
|
|
13
|
-
import { FORK_MAPPING } from '../types.js';
|
|
12
|
+
import { init } from '@chainsafe/bls';
|
|
13
|
+
import { FORK_MAPPING, } from '../types.js';
|
|
14
14
|
import * as semver from 'semver';
|
|
15
|
-
import { clusterDefinitionContainerTypeV1X6, hashClusterDefinitionV1X6, hashClusterLockV1X6, verifyDVV1X6 } from './v1.6.0.js';
|
|
16
|
-
import { clusterDefinitionContainerTypeV1X7, hashClusterDefinitionV1X7, hashClusterLockV1X7, verifyDVV1X7 } from './v1.7.0.js';
|
|
15
|
+
import { clusterDefinitionContainerTypeV1X6, hashClusterDefinitionV1X6, hashClusterLockV1X6, verifyDVV1X6, } from './v1.6.0.js';
|
|
16
|
+
import { clusterDefinitionContainerTypeV1X7, hashClusterDefinitionV1X7, hashClusterLockV1X7, verifyDVV1X7, } from './v1.7.0.js';
|
|
17
17
|
import { ethers } from 'ethers';
|
|
18
|
-
import { DOMAIN_APPLICATION_BUILDER, DOMAIN_DEPOSIT, DefinitionFlow, GENESIS_VALIDATOR_ROOT, signCreatorConfigHashPayload, signEnrPayload, signOperatorConfigHashPayload } from '../constants.js';
|
|
18
|
+
import { DOMAIN_APPLICATION_BUILDER, DOMAIN_DEPOSIT, DefinitionFlow, GENESIS_VALIDATOR_ROOT, signCreatorConfigHashPayload, signEnrPayload, signOperatorConfigHashPayload, } from '../constants.js';
|
|
19
19
|
import { SignTypedDataVersion, TypedDataUtils } from '@metamask/eth-sig-util';
|
|
20
|
-
import { builderRegistrationMessageType, depositMessageType, forkDataType, signingRootType } from './sszTypes.js';
|
|
20
|
+
import { builderRegistrationMessageType, depositMessageType, forkDataType, signingRootType, } from './sszTypes.js';
|
|
21
21
|
import { definitionFlow, hexWithout0x } from '../utils.js';
|
|
22
22
|
import { ENR } from '@chainsafe/discv5';
|
|
23
|
-
import { clusterDefinitionContainerTypeV1X8, hashClusterDefinitionV1X8, hashClusterLockV1X8, verifyDVV1X8 } from './v1.8.0.js';
|
|
23
|
+
import { clusterDefinitionContainerTypeV1X8, hashClusterDefinitionV1X8, hashClusterLockV1X8, verifyDVV1X8, } from './v1.8.0.js';
|
|
24
24
|
// cluster-definition hash
|
|
25
25
|
/**
|
|
26
26
|
* @param cluster The cluster configuration or the cluster definition
|
|
@@ -32,17 +32,20 @@ export const clusterConfigOrDefinitionHash = (cluster, configOnly) => {
|
|
|
32
32
|
if (semver.eq(cluster.version, 'v1.6.0')) {
|
|
33
33
|
definitionType = clusterDefinitionContainerTypeV1X6(configOnly);
|
|
34
34
|
val = hashClusterDefinitionV1X6(cluster, configOnly);
|
|
35
|
-
return ('0x' +
|
|
35
|
+
return ('0x' +
|
|
36
|
+
Buffer.from(definitionType.hashTreeRoot(val).buffer).toString('hex'));
|
|
36
37
|
}
|
|
37
38
|
if (semver.eq(cluster.version, 'v1.7.0')) {
|
|
38
39
|
definitionType = clusterDefinitionContainerTypeV1X7(configOnly);
|
|
39
40
|
val = hashClusterDefinitionV1X7(cluster, configOnly);
|
|
40
|
-
return ('0x' +
|
|
41
|
+
return ('0x' +
|
|
42
|
+
Buffer.from(definitionType.hashTreeRoot(val).buffer).toString('hex'));
|
|
41
43
|
}
|
|
42
44
|
if (semver.eq(cluster.version, 'v1.8.0')) {
|
|
43
45
|
definitionType = clusterDefinitionContainerTypeV1X8(configOnly);
|
|
44
46
|
val = hashClusterDefinitionV1X8(cluster, configOnly);
|
|
45
|
-
return ('0x' +
|
|
47
|
+
return ('0x' +
|
|
48
|
+
Buffer.from(definitionType.hashTreeRoot(val).buffer).toString('hex'));
|
|
46
49
|
}
|
|
47
50
|
throw new Error('unsupported version');
|
|
48
51
|
};
|
|
@@ -112,7 +115,7 @@ const verifyDefinitionSignatures = (clusterDefinition, definitionType) => {
|
|
|
112
115
|
if (definitionType === DefinitionFlow.Solo) {
|
|
113
116
|
return true;
|
|
114
117
|
}
|
|
115
|
-
return clusterDefinition.operators.every(
|
|
118
|
+
return clusterDefinition.operators.every(operator => {
|
|
116
119
|
const configSigner = getPUTConfigHashSigner(operator.config_signature, clusterDefinition.config_hash, FORK_MAPPING[clusterDefinition.fork_version]);
|
|
117
120
|
const enrSigner = getEnrSigner(operator.enr_signature, operator.enr, FORK_MAPPING[clusterDefinition.fork_version]);
|
|
118
121
|
if (configSigner !== operator.address.toLowerCase() ||
|
|
@@ -188,15 +191,24 @@ export const verifyBuilderRegistration = (validator, feeRecipientAddress, forkVe
|
|
|
188
191
|
const builderDomain = computeDomain(fromHexString(DOMAIN_APPLICATION_BUILDER), forkVersion);
|
|
189
192
|
if (validator.distributed_public_key !==
|
|
190
193
|
((_a = validator.builder_registration) === null || _a === void 0 ? void 0 : _a.message.pubkey)) {
|
|
191
|
-
return {
|
|
194
|
+
return {
|
|
195
|
+
isValidBuilderRegistration: false,
|
|
196
|
+
builderRegistrationMsg: new Uint8Array(0),
|
|
197
|
+
};
|
|
192
198
|
}
|
|
193
199
|
if (feeRecipientAddress.toLowerCase() !==
|
|
194
200
|
validator.builder_registration.message.fee_recipient.toLowerCase()) {
|
|
195
|
-
return {
|
|
201
|
+
return {
|
|
202
|
+
isValidBuilderRegistration: false,
|
|
203
|
+
builderRegistrationMsg: new Uint8Array(0),
|
|
204
|
+
};
|
|
196
205
|
}
|
|
197
206
|
const builderRegistrationMessageBuffer = computebuilderRegistrationMsgRoot(validator.builder_registration.message);
|
|
198
207
|
const builderRegistrationMessage = signingRoot(builderDomain, builderRegistrationMessageBuffer);
|
|
199
|
-
return {
|
|
208
|
+
return {
|
|
209
|
+
isValidBuilderRegistration: true,
|
|
210
|
+
builderRegistrationMsg: builderRegistrationMessage,
|
|
211
|
+
};
|
|
200
212
|
};
|
|
201
213
|
export const verifyNodeSignatures = (clusterLock) => {
|
|
202
214
|
const ec = new elliptic.ec('secp256k1');
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ByteListType, ByteVectorType, ContainerType, UintNumberType } from '@chainsafe/ssz';
|
|
1
|
+
import { ByteListType, ByteVectorType, ContainerType, UintNumberType, } from '@chainsafe/ssz';
|
|
2
2
|
export const operatorAddressWrapperType = new ContainerType({
|
|
3
3
|
address: new ByteVectorType(20),
|
|
4
4
|
});
|
|
@@ -23,7 +23,7 @@ export const hashTermsAndConditions = () => __awaiter(void 0, void 0, void 0, fu
|
|
|
23
23
|
terms_and_conditions_hash: new ByteListType(Number.MAX_SAFE_INTEGER),
|
|
24
24
|
});
|
|
25
25
|
const termsHasVal = termsType.defaultValue();
|
|
26
|
-
termsHasVal.terms_and_conditions_hash = strToUint8Array(data === null || data === void 0 ? void 0 : data.text);
|
|
26
|
+
termsHasVal.terms_and_conditions_hash = strToUint8Array(data === null || data === void 0 ? void 0 : data.text.replace(/[^a-zA-Z0-9]/g, ''));
|
|
27
27
|
return ('0x' +
|
|
28
28
|
Buffer.from(termsType.hashTreeRoot(termsHasVal).buffer).toString('hex'));
|
|
29
29
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { UintNumberType } from '@chainsafe/ssz/lib/type/uint';
|
|
1
|
+
import { UintNumberType, } from '@chainsafe/ssz/lib/type/uint';
|
|
2
2
|
import { strToUint8Array } from '../utils';
|
|
3
|
-
import { newCreatorContainerType, newOperatorContainerType, validatorsContainerType } from './sszTypes';
|
|
4
|
-
import { ByteListType, ByteVectorType, ContainerType, ListCompositeType, fromHexString } from '@chainsafe/ssz';
|
|
3
|
+
import { newCreatorContainerType, newOperatorContainerType, validatorsContainerType, } from './sszTypes';
|
|
4
|
+
import { ByteListType, ByteVectorType, ContainerType, ListCompositeType, fromHexString, } from '@chainsafe/ssz';
|
|
5
5
|
import { verifyDepositData } from './common';
|
|
6
|
-
import { aggregateSignatures, verifyAggregate, verifyMultiple } from '@chainsafe/bls';
|
|
6
|
+
import { aggregateSignatures, verifyAggregate, verifyMultiple, } from '@chainsafe/bls';
|
|
7
7
|
/**
|
|
8
8
|
* Returns the containerized cluster definition
|
|
9
9
|
* @param cluster ClusterDefinition to calculate the type from
|
|
@@ -56,7 +56,7 @@ export const hashClusterDefinitionV1X6 = (cluster, configOnly) => {
|
|
|
56
56
|
address: fromHexString(cluster.creator.address),
|
|
57
57
|
config_signature: fromHexString(cluster.creator.config_signature),
|
|
58
58
|
};
|
|
59
|
-
val.validators = cluster.validators.map(
|
|
59
|
+
val.validators = cluster.validators.map(validator => {
|
|
60
60
|
return {
|
|
61
61
|
fee_recipient_address: fromHexString(validator.fee_recipient_address),
|
|
62
62
|
withdrawal_address: fromHexString(validator.withdrawal_address),
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { UintNumberType } from '@chainsafe/ssz/lib/type/uint';
|
|
1
|
+
import { UintNumberType, } from '@chainsafe/ssz/lib/type/uint';
|
|
2
2
|
import { strToUint8Array } from '../utils';
|
|
3
|
-
import { builderRegistrationContainer, depositDataContainer, newCreatorContainerType, newOperatorContainerType, validatorsContainerType } from './sszTypes';
|
|
4
|
-
import { ByteListType, ByteVectorType, ContainerType, ListCompositeType, fromHexString } from '@chainsafe/ssz';
|
|
5
|
-
import { verifyBuilderRegistration, verifyDepositData, verifyNodeSignatures } from './common';
|
|
6
|
-
import { aggregateSignatures, verifyAggregate, verifyMultiple } from '@chainsafe/bls';
|
|
3
|
+
import { builderRegistrationContainer, depositDataContainer, newCreatorContainerType, newOperatorContainerType, validatorsContainerType, } from './sszTypes';
|
|
4
|
+
import { ByteListType, ByteVectorType, ContainerType, ListCompositeType, fromHexString, } from '@chainsafe/ssz';
|
|
5
|
+
import { verifyBuilderRegistration, verifyDepositData, verifyNodeSignatures, } from './common';
|
|
6
|
+
import { aggregateSignatures, verifyAggregate, verifyMultiple, } from '@chainsafe/bls';
|
|
7
7
|
/**
|
|
8
8
|
* Returns the containerized cluster definition
|
|
9
9
|
* @param cluster ClusterDefinition to calculate the type from
|
|
@@ -56,7 +56,7 @@ export const hashClusterDefinitionV1X7 = (cluster, configOnly) => {
|
|
|
56
56
|
address: fromHexString(cluster.creator.address),
|
|
57
57
|
config_signature: fromHexString(cluster.creator.config_signature),
|
|
58
58
|
};
|
|
59
|
-
val.validators = cluster.validators.map(
|
|
59
|
+
val.validators = cluster.validators.map(validator => {
|
|
60
60
|
return {
|
|
61
61
|
fee_recipient_address: fromHexString(validator.fee_recipient_address),
|
|
62
62
|
withdrawal_address: fromHexString(validator.withdrawal_address),
|
|
@@ -92,11 +92,11 @@ export const hashClusterLockV1X7 = (cluster) => {
|
|
|
92
92
|
const val = lockType.defaultValue();
|
|
93
93
|
// Check if we can replace with definition_hash
|
|
94
94
|
val.cluster_definition = hashClusterDefinitionV1X7(cluster.cluster_definition, false);
|
|
95
|
-
val.distributed_validators = cluster.distributed_validators.map(
|
|
95
|
+
val.distributed_validators = cluster.distributed_validators.map(dValidator => {
|
|
96
96
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
97
97
|
return {
|
|
98
98
|
distributed_public_key: fromHexString(dValidator.distributed_public_key),
|
|
99
|
-
public_shares: dValidator.public_shares.map(
|
|
99
|
+
public_shares: dValidator.public_shares.map(publicShare => fromHexString(publicShare)),
|
|
100
100
|
deposit_data: {
|
|
101
101
|
pubkey: fromHexString((_a = dValidator.deposit_data) === null || _a === void 0 ? void 0 : _a.pubkey),
|
|
102
102
|
withdrawal_credentials: fromHexString((_b = dValidator.deposit_data) === null || _b === void 0 ? void 0 : _b.withdrawal_credentials),
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { UintNumberType } from '@chainsafe/ssz/lib/type/uint';
|
|
1
|
+
import { UintNumberType, } from '@chainsafe/ssz/lib/type/uint';
|
|
2
2
|
import { strToUint8Array } from '../utils';
|
|
3
|
-
import { builderRegistrationContainer, depositDataContainer, newCreatorContainerType, newOperatorContainerType, validatorsContainerType } from './sszTypes';
|
|
4
|
-
import { ByteListType, ByteVectorType, ContainerType, ListBasicType, ListCompositeType, fromHexString } from '@chainsafe/ssz';
|
|
5
|
-
import { verifyBuilderRegistration, verifyDepositData, verifyNodeSignatures } from './common';
|
|
6
|
-
import { aggregateSignatures, verifyAggregate, verifyMultiple } from '@chainsafe/bls';
|
|
3
|
+
import { builderRegistrationContainer, depositDataContainer, newCreatorContainerType, newOperatorContainerType, validatorsContainerType, } from './sszTypes';
|
|
4
|
+
import { ByteListType, ByteVectorType, ContainerType, ListBasicType, ListCompositeType, fromHexString, } from '@chainsafe/ssz';
|
|
5
|
+
import { verifyBuilderRegistration, verifyDepositData, verifyNodeSignatures, } from './common';
|
|
6
|
+
import { aggregateSignatures, verifyAggregate, verifyMultiple, } from '@chainsafe/bls';
|
|
7
7
|
/**
|
|
8
8
|
* Returns the containerized cluster definition
|
|
9
9
|
* @param cluster ClusterDefinition to calculate the type from
|
|
@@ -57,7 +57,7 @@ export const hashClusterDefinitionV1X8 = (cluster, configOnly) => {
|
|
|
57
57
|
address: fromHexString(cluster.creator.address),
|
|
58
58
|
config_signature: fromHexString(cluster.creator.config_signature),
|
|
59
59
|
};
|
|
60
|
-
val.validators = cluster.validators.map(
|
|
60
|
+
val.validators = cluster.validators.map(validator => {
|
|
61
61
|
return {
|
|
62
62
|
fee_recipient_address: fromHexString(validator.fee_recipient_address),
|
|
63
63
|
withdrawal_address: fromHexString(validator.withdrawal_address),
|
|
@@ -140,8 +140,8 @@ export const verifyDVV1X8 = (clusterLock) => {
|
|
|
140
140
|
pubShares.push(fromHexString(element));
|
|
141
141
|
}
|
|
142
142
|
// Deposit Data Verification
|
|
143
|
-
for (
|
|
144
|
-
const depositData =
|
|
143
|
+
for (const element of validator.partial_deposit_data) {
|
|
144
|
+
const depositData = element;
|
|
145
145
|
const { isValidDepositData, depositDataMsg } = verifyDepositData(distributedPublicKey, depositData, clusterLock.cluster_definition.validators[i].withdrawal_address, clusterLock.cluster_definition.fork_version);
|
|
146
146
|
if (!isValidDepositData) {
|
|
147
147
|
return false;
|
|
@@ -184,133 +184,122 @@ export const clusterConfigV1X8 = {
|
|
|
184
184
|
withdrawal_address: '0xE0C5ceA4D3869F156717C66E188Ae81C80914a6e',
|
|
185
185
|
},
|
|
186
186
|
],
|
|
187
|
-
deposit_amounts: [
|
|
188
|
-
'8000000000',
|
|
189
|
-
'16000000000',
|
|
190
|
-
'8000000000'
|
|
191
|
-
],
|
|
187
|
+
deposit_amounts: ['8000000000', '16000000000', '8000000000'],
|
|
192
188
|
};
|
|
193
189
|
export const clusterLockV1X8 = {
|
|
194
190
|
cluster_definition: {
|
|
195
|
-
name: '
|
|
191
|
+
name: 'xxxx',
|
|
196
192
|
creator: {
|
|
197
|
-
address: '
|
|
198
|
-
config_signature: '
|
|
193
|
+
address: '0x86B8145c98e5BD25BA722645b15eD65f024a87EC',
|
|
194
|
+
config_signature: '0xd30b182fadbc2c5b2bb3f3f6ed6ac2588f297ceb610ed5509bf3e5a25a9b30c70f8a09ef1d2c8e1dbe5ff441299fe66ec677734cc08beec87e94b7effcb089701b',
|
|
199
195
|
},
|
|
200
196
|
operators: [
|
|
201
197
|
{
|
|
202
|
-
address: '
|
|
203
|
-
enr: 'enr:-
|
|
204
|
-
config_signature: '
|
|
205
|
-
enr_signature: '
|
|
198
|
+
address: '0x86B8145c98e5BD25BA722645b15eD65f024a87EC',
|
|
199
|
+
enr: 'enr:-HW4QLlrtMjFLGkFT1bwdGbvZQlH8hLi0M2g44JAxEYP3BZmYpcsy9Q56HPPD87fMucjvLv4-obEFacpsg0ehRilbHeAgmlkgnY0iXNlY3AyNTZrMaEDRaa5o2aSgqyFq_ERZcQTztrOij1mFtXX1bJuVI6ieak',
|
|
200
|
+
config_signature: '0x3df771ecfc9ae2d01da9249dc636a42893e48759c0fa5c51f5e5e14f3ea4513233d1e3bbdd0e11d4b67c8a907201fd08225a75a1e2d6f510a439d6b15f0c36341c',
|
|
201
|
+
enr_signature: '0x3fe2a124dabe3d517e4c274074b3529d36d9528ca6fa8a4e74ef356f86a07c1462fe72a5336421c2647be7babc4ce1835c2101133e0779cf81d4a8d8cb9fe5591c',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
address: '0xC35CfCd67b9C27345a54EDEcC1033F2284148c81',
|
|
205
|
+
enr: 'enr:-Iu4QNbiUUUwT18LynBbVPJhNxvzQsaSpUr40mQTWscnZaqKb6vAlvV8j-eDDR3E0wjMQumGRbGm2IAb5_k4bVWJiVGAgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQPOiodUji0ohgJb5sNK1hgv8g6xO5_znZz3NkkBkyYyKIN0Y3CCDhqDdWRwgg4u',
|
|
206
|
+
config_signature: '0x12d19d6fc4c1a5d9e7be09f47c2f2357dd89f47aba8ae0185f5345e08bcc3adc324bdd51e68a12c3ca34c604d786cfde5f0798aa928dac496edb16c70e7086551b',
|
|
207
|
+
enr_signature: '0xa3d49832dfaf0ad87c5796f9bc151009343da70b91fd53bee3645baa63d001d3207662da8f67b3a20f2ee30c9cacb24a5719a78dc24e030c8ac93e7b3b46bf881b',
|
|
206
208
|
},
|
|
207
209
|
{
|
|
208
|
-
address: '
|
|
209
|
-
enr: 'enr:-
|
|
210
|
-
config_signature: '
|
|
211
|
-
enr_signature: '
|
|
210
|
+
address: '0x33807D6F1DCe44b9C599fFE03640762A6F08C496',
|
|
211
|
+
enr: 'enr:-Iu4QJyserRukhG0Vgi2csu7GjpHYUGufNEbZ8Q7ZBrcZUb0KqpL5QzHonkh1xxHlxatTxrIcX_IS5J3SEWR_sa0ptGAgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQMAUgEqczOjevyculnUIofhCj0DkgJudErM7qCYIvIkzIN0Y3CCDhqDdWRwgg4u',
|
|
212
|
+
config_signature: '0x665d287c46921aad0dde389291b982f24dbbeb4b7ce5ee7bbc4a7d1fb55134f7136889eb3ce70208a7f276b9d4aefb1fbc6159476934567e5bf11765b2c9649b1b',
|
|
213
|
+
enr_signature: '0xc32d5ea29569b01354d48ddaf56df1481a5ae618ffb47602ef40e0e77357de5f23a5258923be5fa06ecce20f5692847860c25c38b97a4e306c94decd99c0519a1b',
|
|
212
214
|
},
|
|
213
215
|
{
|
|
214
|
-
address: '
|
|
215
|
-
enr: 'enr:-
|
|
216
|
-
config_signature: '
|
|
217
|
-
enr_signature: '
|
|
218
|
-
}
|
|
216
|
+
address: '0xc6e76F72Ea672FAe05C357157CfC37720F0aF26f',
|
|
217
|
+
enr: 'enr:-HW4QKJTwXC6Chw6zbnA3HFZi6Jo0DkIgjKy4eUBpsSOGnAeWE6ChEjEyk_6R6Qrm7jI-iqfs3_HYxiKde8vFgvHHrCAgmlkgnY0iXNlY3AyNTZrMaECfFKQH4spdZCHqrKVz1Q02xYla6J_RQECDNNYBRWdzv8',
|
|
218
|
+
config_signature: '0x610f7be9c7c38878cde1cb391de08eee2f86e62f31f450843b4e37164e738fc8769046e53ad1f018f54ddaf858ff372d22169702c60d68bda19c96fdd20150b61c',
|
|
219
|
+
enr_signature: '0xe2977c79f63b8fe6cb6551efec0cf69041c7f4aaa8ea338997a397450ee946023b03ccb70ad3cc97b1319e1eea9f7472a2ca161bc8b33acdcde689d84c7e771c1b',
|
|
220
|
+
},
|
|
219
221
|
],
|
|
220
|
-
uuid: '
|
|
222
|
+
uuid: 'bc2fec0c-0b8b-4415-bf48-1e96b07f50eb',
|
|
221
223
|
version: 'v1.8.0',
|
|
222
|
-
timestamp: '2024-
|
|
224
|
+
timestamp: '2024-05-24T15:04:08.322Z',
|
|
223
225
|
num_validators: 2,
|
|
224
226
|
threshold: 3,
|
|
225
227
|
validators: [
|
|
226
228
|
{
|
|
227
|
-
fee_recipient_address: '
|
|
228
|
-
withdrawal_address: '
|
|
229
|
+
fee_recipient_address: '0x7aC193bF9a9C6e6DD6302969E8Ea6EdF6df490d8',
|
|
230
|
+
withdrawal_address: '0x9e0AC0078F10d28E875577bb3A4A9EDAB60c03EC',
|
|
229
231
|
},
|
|
230
232
|
{
|
|
231
|
-
fee_recipient_address: '
|
|
232
|
-
withdrawal_address: '
|
|
233
|
-
}
|
|
234
|
-
],
|
|
235
|
-
dkg_algorithm: 'frost',
|
|
236
|
-
fork_version: '0x00001020',
|
|
237
|
-
deposit_amounts: [
|
|
238
|
-
'8000000000',
|
|
239
|
-
'16000000000',
|
|
240
|
-
'8000000000'
|
|
233
|
+
fee_recipient_address: '0x7aC193bF9a9C6e6DD6302969E8Ea6EdF6df490d8',
|
|
234
|
+
withdrawal_address: '0x9e0AC0078F10d28E875577bb3A4A9EDAB60c03EC',
|
|
235
|
+
},
|
|
241
236
|
],
|
|
242
|
-
|
|
243
|
-
|
|
237
|
+
dkg_algorithm: 'default',
|
|
238
|
+
fork_version: '0x01017000',
|
|
239
|
+
deposit_amounts: ['32000000000'],
|
|
240
|
+
config_hash: '0xb2601f51d277f699acb8ea3b9fb4fc68087c0f1f2c6ae83d00fdd853a6cddb31',
|
|
241
|
+
definition_hash: '0x2a9d52b1dd13fd91661d81e3786512ffdcc3689e2ec97105add153f543c642b4',
|
|
244
242
|
},
|
|
245
243
|
distributed_validators: [
|
|
246
244
|
{
|
|
247
|
-
distributed_public_key: '
|
|
245
|
+
distributed_public_key: '0xa33ae80f967a669d8df3ae769acc114577fab185d53e10154b0b50cc0cf9b9f35e466a318f174e8cecdc12173d95cb27',
|
|
248
246
|
public_shares: [
|
|
249
|
-
'
|
|
250
|
-
'
|
|
251
|
-
'
|
|
247
|
+
'0x849db297f690a26e76d5930f99eac9e3f95d9232256d6e39124fe071745b43c8b5418c733b06683aa240a2a0e44b9b8f',
|
|
248
|
+
'0xa1051bf5692153d5bc418946763bb5c82780a05e97bd5b258ea7abe6705047628edd8277366f6b5d0469abfee18988d9',
|
|
249
|
+
'0x87d0342e5dc49a0a0c8f08ec011da3bd859a333bfc46ddd0a194485aa5aa954b7c18d05a2c1ae148d4dc45331101f496',
|
|
250
|
+
'0xa4fa0e971e1a5e38ebe89c6457bc9316b3dd0933660b17e1c717ac148f8340a5db20d867c7a24758c701f6b6bec4d552',
|
|
252
251
|
],
|
|
253
252
|
builder_registration: {
|
|
254
253
|
message: {
|
|
255
|
-
fee_recipient: '
|
|
254
|
+
fee_recipient: '0x7ac193bf9a9c6e6dd6302969e8ea6edf6df490d8',
|
|
256
255
|
gas_limit: 30000000,
|
|
257
|
-
timestamp:
|
|
258
|
-
pubkey: '
|
|
256
|
+
timestamp: 1696000704,
|
|
257
|
+
pubkey: '0xa33ae80f967a669d8df3ae769acc114577fab185d53e10154b0b50cc0cf9b9f35e466a318f174e8cecdc12173d95cb27',
|
|
259
258
|
},
|
|
260
|
-
signature: '
|
|
259
|
+
signature: '0xb39977fe7c45bab28cfd1bcf356a71b0557187a75e0dfa0facaf5eddba05988c0da85800a4b4528704df44f280913ebc125eb3f9c091d6dd220c92dfcc3c80bc7a9ed2f1b96bffaeaa1053cf117b02b48eb755139c5623b6e61dd92c27d15813',
|
|
261
260
|
},
|
|
262
261
|
partial_deposit_data: [
|
|
263
262
|
{
|
|
264
|
-
pubkey: '
|
|
265
|
-
withdrawal_credentials: '
|
|
266
|
-
amount: '
|
|
267
|
-
signature: '
|
|
263
|
+
pubkey: '0xa33ae80f967a669d8df3ae769acc114577fab185d53e10154b0b50cc0cf9b9f35e466a318f174e8cecdc12173d95cb27',
|
|
264
|
+
withdrawal_credentials: '0x0100000000000000000000009e0ac0078f10d28e875577bb3a4a9edab60c03ec',
|
|
265
|
+
amount: '32000000000',
|
|
266
|
+
signature: '0x9861022ca71cf18aad49a201b023356b8c5ca090086614b681cb84a54327caeff53c0a71c5f55f49976114bb86de2ad6052d174d7948e6c8a924d9bfbbbc2181fad967d818454c6c4f7cffb7bb93dc2c4f4c87fc5598cb4582fa08eff0c7bc08',
|
|
268
267
|
},
|
|
269
|
-
|
|
270
|
-
pubkey: '0x87382e8cc3e2c9c2d03ac1af7ae0bcc1be468c596a8a8b8059153ca9ce7746d459dd0603858e858355cb96d67a2a87a7',
|
|
271
|
-
withdrawal_credentials: '0x01000000000000000000000081855ad8681d0d86d1e91e00167939cb6694d2c4',
|
|
272
|
-
amount: '16000000000',
|
|
273
|
-
signature: '0xac5bcb369e8dde110604f6ae829a3432f82a99b0a996e15f4be6426acbe690a1aadb4b365d8b10a36737b2cd8c7f561214d4e4df3626cc9664f663111d15efbd8d18cffff5c3eff407fe2cc478244caea7f9f2afee83a0ae8aa2587365b8e54a'
|
|
274
|
-
}
|
|
275
|
-
]
|
|
268
|
+
],
|
|
276
269
|
},
|
|
277
270
|
{
|
|
278
|
-
distributed_public_key: '
|
|
271
|
+
distributed_public_key: '0xaa888bf805bec7da7ac18dea3afefbf5b8510cbf76367229dab830b3ecdd4533b9d50fb9fcb454df5cbe08e4b31e8479',
|
|
279
272
|
public_shares: [
|
|
280
|
-
'
|
|
281
|
-
'
|
|
282
|
-
'
|
|
273
|
+
'0x8279ae646839d946a622d096296ffcccd289e8c49ea2308560bbb731c63d4b49ea46db817a955e47634edbded4919d82',
|
|
274
|
+
'0xa8a12b5b645b015c55515b3220395e015fc051c58bf243e1b638770652c67f863852f9190e3e182aa86b99823b4cf28d',
|
|
275
|
+
'0xb0c557f812060bb1c409e5324c7b54f35fee8f1180c714e60784f7df6a58e3ba3da6cc8b3cebc01975f9f41efcd777cb',
|
|
276
|
+
'0xa7a8576c3b21221f2a6adefc41b4c1f979ee0761e9a7ff50d30434d1a0c4e7fc505b308636801925e698286b802de421',
|
|
283
277
|
],
|
|
284
278
|
builder_registration: {
|
|
285
279
|
message: {
|
|
286
|
-
fee_recipient: '
|
|
280
|
+
fee_recipient: '0x7ac193bf9a9c6e6dd6302969e8ea6edf6df490d8',
|
|
287
281
|
gas_limit: 30000000,
|
|
288
|
-
timestamp:
|
|
289
|
-
pubkey: '
|
|
282
|
+
timestamp: 1696000704,
|
|
283
|
+
pubkey: '0xaa888bf805bec7da7ac18dea3afefbf5b8510cbf76367229dab830b3ecdd4533b9d50fb9fcb454df5cbe08e4b31e8479',
|
|
290
284
|
},
|
|
291
|
-
signature: '
|
|
285
|
+
signature: '0x8dcb54028adb8f5601b6ab20ded381dabb6739b3e506df795a279043997908c7d38a68b8e8dda27516165f18e437a84603935bfefc1a83befbd1a90ac43fcc7fb0eed81122852a2ee71fef414aa8879198da239527036b0eaebcdc88d6eca3d1',
|
|
292
286
|
},
|
|
293
287
|
partial_deposit_data: [
|
|
294
288
|
{
|
|
295
|
-
pubkey: '
|
|
296
|
-
withdrawal_credentials: '
|
|
297
|
-
amount: '
|
|
298
|
-
signature: '
|
|
289
|
+
pubkey: '0xaa888bf805bec7da7ac18dea3afefbf5b8510cbf76367229dab830b3ecdd4533b9d50fb9fcb454df5cbe08e4b31e8479',
|
|
290
|
+
withdrawal_credentials: '0x0100000000000000000000009e0ac0078f10d28e875577bb3a4a9edab60c03ec',
|
|
291
|
+
amount: '32000000000',
|
|
292
|
+
signature: '0x95ee68e5191d34e10f567ab0f565cd927211b29be9ab830d39bf74d0486aee7bff78d8fe12d455cb40ec707378eea1040a9d80806f82afa58295de9d4db2dccc48cfaf3c98e9020c6b5c8a9aacf5bbfc7e316871f505000304d9d39b7ad5c5d8',
|
|
299
293
|
},
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
withdrawal_credentials: '0x0100000000000000000000005fb90badb37c5821b6d95526a41a9504680b4e7c',
|
|
303
|
-
amount: '16000000000',
|
|
304
|
-
signature: '0x94d9db7b4527e6eb308d387f168089a51d1deffc2c985faf1f7f8e82fbc9cb93c7f10c6a7bbca4fc25a1cfc95de28432037cf7727c1db0ad6d1fb0f1813d5904fba4ab8aebfeccfcded2f915bd48fb46155131b24adb0ba5e764d7ff6d3c82a5'
|
|
305
|
-
}
|
|
306
|
-
]
|
|
307
|
-
}
|
|
294
|
+
],
|
|
295
|
+
},
|
|
308
296
|
],
|
|
309
|
-
signature_aggregate: '
|
|
310
|
-
lock_hash: '
|
|
297
|
+
signature_aggregate: '0x81ab6319191e3b9065f14231a71fe480b4a45e5e5db4a064faa19a31d04b9cb55fa88b8aa3c966b054b97ae7db2233ee060ae333c5ca3a55ed16b9a3de1894087901cb2d3a177de1cd40030c93301c23ca3edd28dfd1ad04e210b7e2c7625f89',
|
|
298
|
+
lock_hash: '0x186e7e61fb49373d9034d101f2f08429cb379bfcc2f7fa5e9598e8a14ae13ed7',
|
|
311
299
|
node_signatures: [
|
|
312
|
-
'
|
|
313
|
-
'
|
|
314
|
-
'
|
|
315
|
-
|
|
300
|
+
'0xd4b1b6f7b363015b9d1c1c4f199fffc3f9238b7326fdfc5059b175519b05c90a022a18bf2e3eae7d7b0e833384131c2e7be17cc78f6ca23644ae345904dc2d2601',
|
|
301
|
+
'0xc186f930d8d281ab3999fb0ff62b5d96045a4e2330d9d8b300d5d1014f6b4bd925d9c2fedbb53047a49d4008f82600f46e1131b981222c5e423c12b1c9fd544900',
|
|
302
|
+
'0xbc0831fa82b1a70e17eb4fe6f79249a8f5aab1d1f196dd07e32766eb27e72354757d7146b64fca4ad4efa554f7a5d4e7ef835aab6348e9afa37c9eeab069ff4e01',
|
|
303
|
+
'0x0135f307831fa58ff64f9af46e00b92e2375162646af88f6991ba6f98a8c262f2c41846af59da68eadb8ff9c94db42ee8005bd4236e5897635573db2911460aa00',
|
|
304
|
+
],
|
|
316
305
|
};
|