Skip to content

Commit

Permalink
updated tests
Browse files Browse the repository at this point in the history
  • Loading branch information
vadiminc committed Dec 10, 2023
1 parent 82b8c14 commit ee77a26
Show file tree
Hide file tree
Showing 7 changed files with 257 additions and 0 deletions.
35 changes: 35 additions & 0 deletions src/lib/KeyShares/__test__/KeyShares.bytes.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { KeySharesItem } from '../../../main';

import mockKeySharesItemWithOperators from './mock-key-shares/item-with-operators.json';

let keySharesItem: KeySharesItem;

describe('KeyShares.buildSharesFromBytes', () => {
beforeAll(async () => {
keySharesItem = new KeySharesItem();
});

it('should correctly build shares from valid bytes and operator count', () => {
const bytes = mockKeySharesItemWithOperators.payload.sharesData;
const operatorCount = mockKeySharesItemWithOperators.payload.operatorIds.length;

const result = keySharesItem.buildSharesFromBytes(bytes, operatorCount);

expect(result.sharesPublicKeys).toHaveLength(operatorCount);
expect(result.encryptedKeys).toHaveLength(operatorCount);
});

it('should handle invalid byte string format', () => {
const invalidBytes = 'not a valid hex string';
const operatorCount = 4;

expect(() => keySharesItem.buildSharesFromBytes(invalidBytes, operatorCount)).toThrow();
});

it('should handle invalid operator count', () => {
const bytes = mockKeySharesItemWithOperators.payload.sharesData;
const invalidOperatorCount = -1;

expect(() => keySharesItem.buildSharesFromBytes(bytes, invalidOperatorCount)).toThrow();
});
});
71 changes: 71 additions & 0 deletions src/lib/KeyShares/__test__/KeyShares.json.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import { KeyShares, KeySharesItem } from '../../../main';

import mockKeyShares from './mock-key-shares/multi-shares.json';
import mockKeySharesInvalidStruct from './mock-key-shares/multi-shares-invalid-struct.json';
import mockKeySharesItemEmpty from './mock-key-shares/item-empty.json';
import mockKeySharesItemWithOperators from './mock-key-shares/item-with-operators.json';

let keySharesItem: KeySharesItem;
let keyShares: KeyShares;

describe('KeyShares.fromJson/toJson', () => {
beforeAll(async () => {
keyShares = new KeyShares();
keySharesItem = new KeySharesItem();
});

it('Should create empty data with version', async () => {
const keySharesString = keySharesItem.toJson();
const keySharesObject = JSON.parse(keySharesString);
expect(keySharesObject.data.operators).toEqual(mockKeySharesItemEmpty.data.operators);
expect(keySharesObject.data.publicKey).toEqual(mockKeySharesItemEmpty.data.publicKey);
expect(keySharesObject.payload).toEqual(mockKeySharesItemEmpty.payload);
});

it('Should not throw error the semantic versioning test', async () => {
expect(async() => await KeySharesItem.fromJson(mockKeySharesItemWithOperators)).not.toThrowError();
});

it('Should create multi-shares file', async () => {
keyShares.add(keySharesItem);
keyShares.toJson();
});

it('should add a KeyShares item', () => {
const item = new KeySharesItem();
keyShares.add(item);
expect(keyShares.list()).toContain(item);
});

it('should serialize to JSON', () => {
const json = keyShares.toJson();
expect(json).toBeDefined();
expect(typeof json).toBe('string');
});

it('should create KeyShares from valid JSON', async () => {
const keyShares = await KeyShares.fromJson(mockKeyShares);
expect(keyShares).toBeInstanceOf(KeyShares);
expect(keyShares.list().length).toEqual(mockKeyShares.shares.length);
});

it('should throw error on invalid JSON format', async () => {
await expect(KeyShares.fromJson(mockKeySharesInvalidStruct)).rejects.toThrow();
});

it('should throw error on version incompatibility', async () => {
const incompatibleVersionJson = {
...mockKeyShares,
version: 'v2.0.0'
};
await expect(KeyShares.fromJson(incompatibleVersionJson)).rejects.toThrow(/does not have the same version.*as supported by ssv-keys/);
});

it('should throw error on invalid shares data', async () => {
const invalidSharesJson = {
...mockKeyShares,
shares: [{ "invalid": "data" }],
};
await expect(KeyShares.fromJson(invalidSharesJson)).rejects.toThrow();
});
});
62 changes: 62 additions & 0 deletions src/lib/KeyShares/__test__/KeyShares.validate.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { KeySharesItem, SSVKeysException } from '../../../main';

import mockKeySharesItemWithOperators from './mock-key-shares/item-with-operators.json';

let keySharesItem: KeySharesItem;

describe('KeyShares.validateSingleShares', () => {
beforeAll(async () => {
keySharesItem = new KeySharesItem();
});

it('should validate successfully with correct inputs', async () => {
const shares = mockKeySharesItemWithOperators.payload.sharesData;
const fromSignatureData = {
ownerNonce: mockKeySharesItemWithOperators.data.ownerNonce,
publicKey: mockKeySharesItemWithOperators.data.publicKey,
ownerAddress: mockKeySharesItemWithOperators.data.ownerAddress,
};

await expect(keySharesItem.validateSingleShares(shares, fromSignatureData)).resolves.toBeUndefined();
});

it('should throw error for invalid owner nonce', async () => {
const shares = mockKeySharesItemWithOperators.payload.sharesData;
const fromSignatureData = {
ownerNonce: -1, // Invalid nonce
publicKey: mockKeySharesItemWithOperators.data.publicKey,
ownerAddress: mockKeySharesItemWithOperators.data.ownerAddress,
};

await expect(keySharesItem.validateSingleShares(shares, fromSignatureData)).rejects.toThrow('Owner nonce is not positive integer');
});

it('should throw BLS error for invalid signature', async () => {
const invalidSignature = '0x123'; // An altered or incorrectly generated signature
const fromSignatureData = {
ownerNonce: 2,
publicKey: mockKeySharesItemWithOperators.data.publicKey,
ownerAddress: mockKeySharesItemWithOperators.data.ownerAddress,
};

await expect(keySharesItem.validateSingleShares(invalidSignature, fromSignatureData)).rejects.toThrowError();
});

it('should throw SSVKeysException error type', async () => {
const signature = mockKeySharesItemWithOperators.payload.sharesData;
const fromSignatureData = {
ownerNonce: mockKeySharesItemWithOperators.data.ownerNonce + 1,
publicKey: mockKeySharesItemWithOperators.data.publicKey,
ownerAddress: mockKeySharesItemWithOperators.data.ownerAddress,
};

try {
await keySharesItem.validateSingleShares(signature, fromSignatureData);
fail('Expected method to throw SSVKeysException error');
} catch (error: any) {
expect(error).toBeInstanceOf(SSVKeysException);
expect(error.name).toBe('SingleSharesSignatureInvalid');
expect(error.message).toBe('Single shares signature is invalid');
}
});
});
8 changes: 8 additions & 0 deletions src/lib/KeyShares/__test__/mock-key-shares/item-empty.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"data": {
"publicKey": null,
"operators": null,
"shares": null
},
"payload": {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
{
"data": {
"ownerNonce": 1,
"ownerAddress": "0x81592c3de184a3e2c0dcb5a261bc107bfa91f494",
"publicKey": "0xa063fa1434f4ae9bb63488cd79e2f76dea59e0e2d6cdec7236c2bb49ffb37da37cb7966be74eca5a171f659fee7bc501",
"operators": [
{
"id": 5,
"operatorKey": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdHhHZEx6QVBnR0hhYWVoYUN6a0YKTmdiSmZ6WndCQnlsVFhMdWxPc3ErMzA2NCtBUFNQZHh3YmVXalpPRWpvWC9rRy9EaHNUVmw5eGw0SktUdWxpQwpYdlpMZXRpd3ZuM3RYQTFTKzNGTnJLZ1FjNFBnSHppd1RKL01yMEdyRzFyYWpvYm9VMGVETU5Hbi8zL3BRdk1WCks5bFNuY1QyaFhLbW1PdDdtQUUyK3ltT0JOZDhKU3g5NnA3ajFWdDNwc2d4ZzJMTUU0Nnd2dEpPVyswUWdNVDMKSDNEVjVSTWZWUlU4Z29nUFptbjNYRUR4RUJLZUtmaFZHVjlYNmFhcXkvU2Y4aEo3aG16eVcrQ3F1bkFYYWUySwo5ZDdSL0g0dStZcGovaU5NYkNQNi9GOGlIOCtQbWRyTmtUUFRPakwrb05HZVlNSVB3L1hYVStZbkhzcGp4SjRMCnBRSURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K"
},
{
"id": 6,
"operatorKey": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeFArYkhwYS85WlhJUkJUR0JFWmcKN2hxa1Rra0VRUnZnTFJTV0E3K2cwbHkvVlpUczlFVTBjcXZFNURvUmxseVhrTHNVcnplOTZaOFJPNllmNC9LZQpta3hudk1YeHFUanlITGNkWlhIN1pFMmhWUnZRRVA3TE9hL3RCRHFYYVlHVklZbEYwWWIrVlFhSUczbGg4QmpCClN2ZE9rVERwblJLU1g2Z0ZnTTZVMy9FcFQyVlZRR1Y3VjIrNTF0YlM4WGJpUVQ3OTdwZmpBVEU4VmZseXBPUFIKYU5PREpjWnBlWjFjR0JCMWVJTUlGMlFGMFBCdGQzZ1ZVbDU5RFBHRFRZSUh2VnRrdkhSVHR3a1hOS2EveXV3SApnb1JhZjE4SDZTRy9vazFUM0l4WFYwdk1GdGlvUDJGWVh6UlNzaDBTcnlBR255azB0MElKb0JPMzBtZjFUeXZxCmN3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K"
},
{
"id": 7,
"operatorKey": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBem9hb09qQWIvVTQ3QitTWit6WUYKcm5TNHBMbUZnL2RYc3pCYWpaSm5zTWJoSzZISHFCdnZwRXZHWHpsU1Q3R3lWTDVQbzVaNEVSQzdPdXBHK2JQWQptQTgwNXZPb3FqYmNkVVlwclgyb1c4K1V1aFZJdUwyd2QvQXJqRDFScUc5eUV6WkRuUVdDdmplaElTQ1NXWFNPCmppbWxTbkpPZTd1Z0hwOXJWRkh3bVlwNGQyOWRBWFc2YTJZdndDRm1oVE9mdUMrSVNESzJTck9JWC9hVnZ5ekgKMU1OY0VmUTNaSGxjYmZQMDdTMVNqN25WYWhqM1hVUEIyMDMxOTRpQU9zcVRaOVFuU3NUamtydGF1MW1SV21aMQpFNm9nYTNJQ2t0YWs5M2FqcElYV3JKUzMwVERtSDhPckpKanVoQm4zaXRrK1o1Szg5SEdXa3FLME1wN2tYOGxPCi93SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K"
},
{
"id": 8,
"operatorKey": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcWMwUjlWRm9pM1NIeDl2alppb1gKRllwNFhkRjB2emRRRjRLRnozVklYaU5US3Vzck5mSW0zSm1FbWlSQmw4RmRvTmliRC9SZFc1YkFRUzN1UE5MRApGdHZVZ2p3bXBFNEdvcUpmSXZSWENWK2ROamcyNDU5aW44UnlkK0FUbm5qZXRYYWFSN3JNUlIreDRrcVlONkR4CkZoc2llZGgrZG0xTXNtMTRzc2FhMmZ3TExXamlzMDhTZlJZcXhjVHVCd24zUzFFajUwZzVrRG1RRmVyWUxBY2EKSXFOaFNsc0ZJZE50dHFkMUdSR3o0SFFPQmcyQk9iWWdwNEhEZTFLb0xmREdyMHNzRWFZMnRoeVZZOE9FaHh3YgpwUE1NTEk3NmFpUHdJQUsyM1MzWHZLS3ZtRXc1T1FFM0ptWXJrRDFDMTdoRGNWdUxkODV4YnZFSUFENms3b0NJCnB3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K"
}
]
},
"payload": {
"publicKey": "0xa063fa1434f4ae9bb63488cd79e2f76dea59e0e2d6cdec7236c2bb49ffb37da37cb7966be74eca5a171f659fee7bc501",
"operatorIds": [
5,
6,
7,
8
],
"sharesData": "0xaf4ddbf3c8151aee4c6b6607411b95d89f4f7b523702175275e42ab4ff31f42dc3086c2b3f7036c62b6afe828049c62d11453a62e052d6377545264112a327c12832925fdd0519fab77187b11012f2dec30aa69b9c37f818067de12975e62f2994cea87c658901ea00149e2b04ff14a57fe19e9487e6f91442cbf2142543c9aae0959a0c4a6dd67941bec2310b89f93fa00b29a17b86d76c5e1eda34df10c3fe65283413fd105333f76ee4029a457158a9fb33d1ef93abf811e70dcdccef4f1f84e2b44fc937863d8be4cef0f5584f4af14ec950f2d1dbb7301b3f316565985a9ea1676c1277e9280467adb6d9a69f0580d3a4a9c4b8b6b5f9753b51abac9f23397f5d50217785cb5245106f99f4e821d1f762c87f13b45ea7ebe4adeffd7d28345b3c9fae58be5f662ba9fe610fc7ae0197e748c296542b94bc965df25bc8e2c924ccb8642e1f78399cb4d6a7f9b6441d448f3236ca51a2f3209d357c31988b5de6f37842a53b01441a71ea867fcea0ca1333dff92fbff10bc4cc78e7d16efd2792fdbcb01f0499033d822ed3676755b7e5393210746f495225299c23ac651489445f9e2310b1e71ba4886dffa3facfac65900c0519a0a71889d5fd677267b2e97c62c2a4470a3b8ea4b31fbdfb6617c52d3d99c6050732cf77c3a00003cc2d66bbe1f5671a8ab0d4e7eb6cb7ed21bfb770aec5f73e536b452450c57befbbea1f89a4272a2f7c9ba9c5ea1deb071c435bf277ce85afb173776526fdefa6bbd66b425cc4b5fb0448460b79c5edd52329f2f7edb8abe015cbe719963426495155516c12db98f16f1d9fe29d7bd23dd441b3e61b7e4a7a0deaf90f2a1aadd2d5630cabce5a1ca280e605286544af01b06837927ba262f1c9b7347d0cc0a44b0d084d33861d75b675529dc58a34fdfae236b9c7a70f039398c278fb8f5b2d1cfd05eba7d1507c0aaec953cc13c9387e8317f35dc5b2e4ed0b9699778ad0fcb5045b0cda99aa8d0f76e5b86e684cdbe890785771a7c5aa31f800068c0caa6b73f3bebff8cc00cbf7cc072c58cce010b05a97dcccb3d3fda0ce924c7cb49242f9cab42d4715cb92c6b87c543ca55ba5f3c4eb5ba52a30c5910ddc9fed95c610e34993aed0c27ec938f446ef2d3080926510f1559aff2cf3e05617c6f6ef89b20bf9cf7bc5052503f11403383b73b9030d3b5e3169170de9625f91c3581edd65a7009475d4d190ec26e786ba1ba340d3f6057e6c068d12e2444feee4120ab861b78251e1523e8481c03385e0938d012b492e9de4a2d4be31d5c8a9d054a253a0e8574ecede2b4dcea1ad36d1c4158860d7e0dd6442194abc5549c9018a1f8474dcadcec09bdc94f172529ff21d4a500321b10be2d716dc10b6d8840c0aa611f7a1a1baeae34745a7de3832214f1aa3a7a858b9f6183033729380f5a64bfd7237bb0b16fe05614a6a406eff066b8f35fe8f477e45713453b0d75776a5c3823503f50a7d858d95184953193cc9ca6c8d40fbfd19c514b618749866ab2a6695e4a97a6eb747c0c9bb704a62ee5b3a9938b2a5f485ceaa859f5949281badd93b4935a014a4546f73d3ae29191c13ca930276fe364a11d51de47825996ee6510f520150141113aec6752130e0934c430224f1713c6f2b0a31d94e28eaeaef6cd153a4f42bf6e60c10fcf424323e416cb60a63d310dd4c674d14bf8e1b6634ab7db3e23927d7531c81b8315d4b0c4a08b2c1386f249a8ef3db3d27f8198ada220794212614e581300302d8f5acc34498f8f24935ad9286fcf810ba4ab8278d9d543fc742f080ef596f319451ecf269223da00968532d46a6ca73848ed1b23e88fc5437a8e6bd"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"version": "v1.0.6",
"createdAt": "2023-12-10T09:46:49.972Z",
"shock": []
}
41 changes: 41 additions & 0 deletions src/lib/KeyShares/__test__/mock-key-shares/multi-shares.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"version": "v1.0.6",
"createdAt": "2023-12-10T09:46:49.972Z",
"shares": [
{
"data": {
"ownerNonce": 1,
"ownerAddress": "0x81592c3de184a3e2c0dcb5a261bc107bfa91f494",
"publicKey": "0xa063fa1434f4ae9bb63488cd79e2f76dea59e0e2d6cdec7236c2bb49ffb37da37cb7966be74eca5a171f659fee7bc501",
"operators": [
{
"id": 123,
"operatorKey": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdHhHZEx6QVBnR0hhYWVoYUN6a0YKTmdiSmZ6WndCQnlsVFhMdWxPc3ErMzA2NCtBUFNQZHh3YmVXalpPRWpvWC9rRy9EaHNUVmw5eGw0SktUdWxpQwpYdlpMZXRpd3ZuM3RYQTFTKzNGTnJLZ1FjNFBnSHppd1RKL01yMEdyRzFyYWpvYm9VMGVETU5Hbi8zL3BRdk1WCks5bFNuY1QyaFhLbW1PdDdtQUUyK3ltT0JOZDhKU3g5NnA3ajFWdDNwc2d4ZzJMTUU0Nnd2dEpPVyswUWdNVDMKSDNEVjVSTWZWUlU4Z29nUFptbjNYRUR4RUJLZUtmaFZHVjlYNmFhcXkvU2Y4aEo3aG16eVcrQ3F1bkFYYWUySwo5ZDdSL0g0dStZcGovaU5NYkNQNi9GOGlIOCtQbWRyTmtUUFRPakwrb05HZVlNSVB3L1hYVStZbkhzcGp4SjRMCnBRSURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K"
},
{
"id": 456,
"operatorKey": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeFArYkhwYS85WlhJUkJUR0JFWmcKN2hxa1Rra0VRUnZnTFJTV0E3K2cwbHkvVlpUczlFVTBjcXZFNURvUmxseVhrTHNVcnplOTZaOFJPNllmNC9LZQpta3hudk1YeHFUanlITGNkWlhIN1pFMmhWUnZRRVA3TE9hL3RCRHFYYVlHVklZbEYwWWIrVlFhSUczbGg4QmpCClN2ZE9rVERwblJLU1g2Z0ZnTTZVMy9FcFQyVlZRR1Y3VjIrNTF0YlM4WGJpUVQ3OTdwZmpBVEU4VmZseXBPUFIKYU5PREpjWnBlWjFjR0JCMWVJTUlGMlFGMFBCdGQzZ1ZVbDU5RFBHRFRZSUh2VnRrdkhSVHR3a1hOS2EveXV3SApnb1JhZjE4SDZTRy9vazFUM0l4WFYwdk1GdGlvUDJGWVh6UlNzaDBTcnlBR255azB0MElKb0JPMzBtZjFUeXZxCmN3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K"
},
{
"id": 777,
"operatorKey": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcWMwUjlWRm9pM1NIeDl2alppb1gKRllwNFhkRjB2emRRRjRLRnozVklYaU5US3Vzck5mSW0zSm1FbWlSQmw4RmRvTmliRC9SZFc1YkFRUzN1UE5MRApGdHZVZ2p3bXBFNEdvcUpmSXZSWENWK2ROamcyNDU5aW44UnlkK0FUbm5qZXRYYWFSN3JNUlIreDRrcVlONkR4CkZoc2llZGgrZG0xTXNtMTRzc2FhMmZ3TExXamlzMDhTZlJZcXhjVHVCd24zUzFFajUwZzVrRG1RRmVyWUxBY2EKSXFOaFNsc0ZJZE50dHFkMUdSR3o0SFFPQmcyQk9iWWdwNEhEZTFLb0xmREdyMHNzRWFZMnRoeVZZOE9FaHh3YgpwUE1NTEk3NmFpUHdJQUsyM1MzWHZLS3ZtRXc1T1FFM0ptWXJrRDFDMTdoRGNWdUxkODV4YnZFSUFENms3b0NJCnB3SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K"
},
{
"id": 789,
"operatorKey": "LS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBem9hb09qQWIvVTQ3QitTWit6WUYKcm5TNHBMbUZnL2RYc3pCYWpaSm5zTWJoSzZISHFCdnZwRXZHWHpsU1Q3R3lWTDVQbzVaNEVSQzdPdXBHK2JQWQptQTgwNXZPb3FqYmNkVVlwclgyb1c4K1V1aFZJdUwyd2QvQXJqRDFScUc5eUV6WkRuUVdDdmplaElTQ1NXWFNPCmppbWxTbkpPZTd1Z0hwOXJWRkh3bVlwNGQyOWRBWFc2YTJZdndDRm1oVE9mdUMrSVNESzJTck9JWC9hVnZ5ekgKMU1OY0VmUTNaSGxjYmZQMDdTMVNqN25WYWhqM1hVUEIyMDMxOTRpQU9zcVRaOVFuU3NUamtydGF1MW1SV21aMQpFNm9nYTNJQ2t0YWs5M2FqcElYV3JKUzMwVERtSDhPckpKanVoQm4zaXRrK1o1Szg5SEdXa3FLME1wN2tYOGxPCi93SURBUUFCCi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS0K"
}
]
},
"payload": {
"publicKey": "0xa063fa1434f4ae9bb63488cd79e2f76dea59e0e2d6cdec7236c2bb49ffb37da37cb7966be74eca5a171f659fee7bc501",
"operatorIds": [
123,
456,
777,
789
],
"sharesData": "0xaf4ddbf3c8151aee4c6b6607411b95d89f4f7b523702175275e42ab4ff31f42dc3086c2b3f7036c62b6afe828049c62d11453a62e052d6377545264112a327c12832925fdd0519fab77187b11012f2dec30aa69b9c37f818067de12975e62f29a0f9bc7c0273b8d41919820cb50ab4a35f2bba0b3714abe0256488a21f9e70e4d80f3597a38a4790f7359bc1756a7431ad54fbeef349310fbac54f6994d3599fed08dfbab076362f912e8aecf0228c13ba40ce217c220ecb544bcb937508d08bb6d586ec731c51ab86f414edb982132000a8b97ddd2b74a14a8eaa6ec0f57b57ce87b18c37852547d41c01674a99df47a6cf0cce322c1e362852bea14cf0ca23fd851cec29991c70cdaf3f086b0d2b23a89c05b0b8684c335bc52fc700f275314a532131734b5c1a383f11a82e75acbacf1e4476bfedb4bdcdee7ae72323d08b0c0e7f26b5504e511c698654be6c11e466e2507ed26f949bfb5fcc65504d78d412eefce41f858366ac628d4eb5f0ad899df27bbe0c76ed576c53b56a9d27d067e9714e98bbd4f0816d0153d84daad22fe6b24a302fa3e4cf9f7ae1079a3bdad88624180ceb674e2c34406b66a619900edb83f9c3c73816c220835bc16c891c75f2f84be032532d34ed0fa740033c4dd553274eadf690ecc448462069e953992ecbb912270fbe1aeb0394e83303a4d9127928754d892f0addc820ea29e0111fe7cbd464c8af6956df329598742e3b3ec21bacff460a7e19728c7eb87fd649f06b8e68afe2c21e13857e08da966a2a0cb6b58236b4c16f15bc70272ce31ccc0e28648965bbd7287c2facb42d842ed22cd626a918ef44aadcdc596cdfba22e91ec36069dfb5ab8130136daaa27aa61440ac048e14a12a742550179c0f41866635a4d042f7ee15db13ff90d1c4e509dc2fab1daaba2cf887da47acaf93c07e7111b5d6cd0ccda50b4e3f992f7d6eee728be0909c175b5aa076f4f59f6dd24d7aa7c341fda714e51564443c4a2cf64e6be9b5d5b7aeb5ea8945fe12d090b4b84b1bb633c35479e529609652dd928457e5eafdbb8c5e18dffa31389ff4358b5fbdeec2a6f526b2fd260501cc48d912b31b876960f57081d19d01bfd59d977fe8e7a34d190445bfa4f004eb8b71c5bd9fe8e4bac0c09fc56b4c4cb057fae64171035c43cf416da614c257728499a8f4d0669180ed91494eee3c08a73b45cff0b0116bf557f0fba590846030a5ca6baf195232432a853b8bd51617b707b6995b4f37fe81012c3452bb154a1fb2c5af374df3d16a1d29087122f4ee395b5ed72be843d285a128a7a12cd66a6c88430e77e5c14a6ec59363fd35365441fcf11ea842df787066d4f45e30ff3fcf2d06c18f9ec0654d6511ce58281ed00cbf4d823050238534dd3c8dbb2c48d7a77cfbdafa7850577ce16befbb79830f2034572e5a41f1b726217085e16b56dfdb5ec2dc0a6e34007943ad57817a44d3df85d897366fcbe7c408cacb4990ce4139b498a4533eff4f2563e37a93582ea17e94f4ed867e10edaf27622ef01af778d52722ad5596c3c36e2585a9c7b171f3b53b2585b79b51e2e7df633f8f795ec90a38ada96d3f83a66301ef937f4eabfd82eccdce1cc85d0ed8ed870c525d234a3cb3e6cfc14e25f0a97408ae86bfa1184613e109df8ec6b495e2cc8b68095440ffc9035b04ea53bba0450855473b0034cbf65e877e4bfae0e1ecb5c6048a1385161663a6468b7c434ccc340849b15e8875a455e01acac1c4a40069a69194ac74eca3593fa8a499672a5df2003061d0f2c542dc8cbabbba896bda2eda54eba1d05da61c9100b3494911de2a97609af970d005ced3aa0251d856"
}
}
]
}

0 comments on commit ee77a26

Please sign in to comment.