@human-protocol/sdk 1.0.2 → 1.0.3

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.
Files changed (71) hide show
  1. package/README.md +1 -1
  2. package/dist/constants.d.ts +46 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +203 -0
  5. package/dist/decorators.d.ts +2 -0
  6. package/dist/decorators.d.ts.map +1 -0
  7. package/dist/decorators.js +17 -0
  8. package/dist/enums.d.ts +17 -0
  9. package/dist/enums.d.ts.map +1 -0
  10. package/dist/enums.js +20 -0
  11. package/dist/error.d.ts +196 -0
  12. package/dist/error.d.ts.map +1 -0
  13. package/dist/error.js +229 -0
  14. package/dist/escrow.d.ts +176 -0
  15. package/dist/escrow.d.ts.map +1 -0
  16. package/dist/escrow.js +590 -0
  17. package/dist/index.d.ts +10 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +33 -0
  20. package/dist/init.d.ts +13 -0
  21. package/dist/init.d.ts.map +1 -0
  22. package/dist/init.js +35 -0
  23. package/dist/interfaces.d.ts +44 -0
  24. package/dist/interfaces.d.ts.map +1 -0
  25. package/dist/interfaces.js +2 -0
  26. package/dist/kvstore.d.ts +40 -0
  27. package/dist/kvstore.d.ts.map +1 -0
  28. package/dist/kvstore.js +106 -0
  29. package/dist/queries.d.ts +4 -0
  30. package/dist/queries.d.ts.map +1 -0
  31. package/dist/queries.js +22 -0
  32. package/dist/staking.d.ts +121 -0
  33. package/dist/staking.d.ts.map +1 -0
  34. package/dist/staking.js +381 -0
  35. package/dist/storage.d.ts +48 -0
  36. package/dist/storage.d.ts.map +1 -0
  37. package/dist/storage.js +164 -0
  38. package/dist/types.d.ts +123 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +35 -0
  41. package/dist/utils.d.ts +32 -0
  42. package/dist/utils.d.ts.map +1 -0
  43. package/dist/utils.js +99 -0
  44. package/package.json +4 -7
  45. package/src/constants.ts +221 -4
  46. package/src/decorators.ts +21 -0
  47. package/src/enums.ts +16 -0
  48. package/src/error.ts +295 -18
  49. package/src/escrow.ts +754 -0
  50. package/src/index.ts +14 -1
  51. package/src/init.ts +45 -0
  52. package/src/interfaces.ts +50 -0
  53. package/src/kvstore.ts +93 -0
  54. package/src/queries.ts +18 -0
  55. package/src/staking.ts +421 -0
  56. package/src/storage.ts +159 -131
  57. package/src/types.ts +36 -586
  58. package/src/utils.ts +80 -142
  59. package/test/escrow.test.ts +1339 -0
  60. package/test/init.test.ts +88 -0
  61. package/test/kvstore.test.ts +208 -0
  62. package/test/staking.test.ts +640 -0
  63. package/test/storage.test.ts +422 -0
  64. package/test/utils/constants.ts +38 -1
  65. package/example/simple-existing-job.ts +0 -86
  66. package/example/simple-new-job-public.ts +0 -74
  67. package/example/simple-new-job.ts +0 -72
  68. package/src/job.ts +0 -977
  69. package/src/logger.ts +0 -29
  70. package/test/job.test.ts +0 -716
  71. package/test/utils/manifest.ts +0 -33
@@ -0,0 +1,88 @@
1
+ import { describe, test, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import {
3
+ ErrorInitProviderDoesNotExist,
4
+ ErrorInitUnsupportedChainID,
5
+ } from '../src/error';
6
+ import { FAKE_NETWORK_NAME, FAKE_NETWORK } from './utils/constants';
7
+
8
+ import { ethers } from 'ethers';
9
+ import InitClient from '../src/init';
10
+ import { IClientParams } from '../src/interfaces';
11
+ import { ChainId } from '../src/enums';
12
+
13
+ describe('InitClient', () => {
14
+ const provider = new ethers.providers.JsonRpcProvider();
15
+ let mockProvider: any;
16
+ let mockSigner: any;
17
+
18
+ beforeEach(async () => {
19
+ mockSigner = {
20
+ ...provider.getSigner(),
21
+ getNetwork: vi.fn().mockReturnValue({
22
+ name: FAKE_NETWORK_NAME,
23
+ chainId: ChainId.POLYGON_MUMBAI,
24
+ }),
25
+ getAddress: vi.fn().mockReturnValue(ethers.constants.AddressZero),
26
+ };
27
+
28
+ mockProvider = {
29
+ getNetwork: vi.fn().mockReturnValue({
30
+ name: FAKE_NETWORK_NAME,
31
+ chainId: ChainId.POLYGON_MUMBAI,
32
+ }),
33
+ getAddress: vi.fn().mockReturnValue(ethers.constants.AddressZero),
34
+ };
35
+ });
36
+
37
+ afterEach(() => {
38
+ vi.restoreAllMocks();
39
+ });
40
+
41
+ describe('getParams', () => {
42
+ test('should throw an error if Signer provider does not exist', async () => {
43
+ const invalidSigner = ethers.Wallet.createRandom();
44
+ await expect(InitClient.getParams(invalidSigner)).rejects.toThrow(
45
+ ErrorInitProviderDoesNotExist
46
+ );
47
+ });
48
+
49
+ test('should throw an error if chainId is not supported', async () => {
50
+ const invalidNetwork = { name: FAKE_NETWORK_NAME, chainId: ChainId.ALL };
51
+ mockProvider.getNetwork.mockResolvedValueOnce(invalidNetwork);
52
+
53
+ await expect(InitClient.getParams(mockProvider)).rejects.toThrow(
54
+ ErrorInitUnsupportedChainID
55
+ );
56
+ });
57
+
58
+ test('should return the client parameters for a Signer', async () => {
59
+ const expectedClientParams: IClientParams = {
60
+ signerOrProvider: mockSigner,
61
+ network: FAKE_NETWORK,
62
+ };
63
+
64
+ InitClient.getParams = vi
65
+ .fn()
66
+ .mockImplementation(() => Promise.resolve(expectedClientParams));
67
+
68
+ const clientParams = await InitClient.getParams(mockSigner);
69
+
70
+ expect(clientParams).toEqual(expectedClientParams);
71
+ });
72
+
73
+ test('should return the client parameters for a Provider', async () => {
74
+ const expectedClientParams: IClientParams = {
75
+ signerOrProvider: mockProvider,
76
+ network: FAKE_NETWORK,
77
+ };
78
+
79
+ InitClient.getParams = vi
80
+ .fn()
81
+ .mockImplementation(() => Promise.resolve(expectedClientParams));
82
+
83
+ const clientParams = await InitClient.getParams(mockProvider);
84
+
85
+ expect(clientParams).toEqual(expectedClientParams);
86
+ });
87
+ });
88
+ });
@@ -0,0 +1,208 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { describe, test, expect, vi, beforeEach, beforeAll } from 'vitest';
3
+ import { Signer, ethers } from 'ethers';
4
+ import KVStoreClient from '../src/kvstore';
5
+ import {
6
+ ErrorInvalidAddress,
7
+ ErrorKVStoreArrayLength,
8
+ ErrorKVStoreEmptyKey,
9
+ ErrorSigner,
10
+ } from '../src/error';
11
+ import InitClient from '../src/init';
12
+ import { ChainId } from '../src/enums';
13
+ import { NETWORKS } from '../src/constants';
14
+ import { NetworkData } from '../src/types';
15
+
16
+ vi.mock('../src/init');
17
+
18
+ describe('KVStoreClient', () => {
19
+ let provider: ethers.providers.JsonRpcProvider;
20
+ let signer: Signer;
21
+ let network: NetworkData | undefined;
22
+ let kvStoreClient: any;
23
+ let mockKVStoreContract: any;
24
+ let mockGetClientParams: any;
25
+
26
+ beforeAll(async () => {
27
+ provider = new ethers.providers.JsonRpcProvider();
28
+ signer = provider.getSigner();
29
+ network = NETWORKS[ChainId.LOCALHOST];
30
+ mockGetClientParams = InitClient.getParams as jest.Mock;
31
+ });
32
+
33
+ beforeEach(async () => {
34
+ mockGetClientParams.mockResolvedValue({
35
+ signerOrProvider: signer,
36
+ network,
37
+ });
38
+ kvStoreClient = new KVStoreClient(await InitClient.getParams(signer));
39
+ mockKVStoreContract = {
40
+ ...kvStoreClient.contract,
41
+ set: vi.fn(),
42
+ setBulk: vi.fn(),
43
+ get: vi.fn(),
44
+ address: network?.kvstoreAddress,
45
+ };
46
+ kvStoreClient.contract = mockKVStoreContract;
47
+ });
48
+
49
+ describe('set', () => {
50
+ test('should throw an error if key is empty', async () => {
51
+ const setSpy = vi.spyOn(kvStoreClient, 'set');
52
+ await expect(kvStoreClient.set('', 'test')).rejects.toThrow(
53
+ ErrorKVStoreEmptyKey
54
+ );
55
+ expect(setSpy).toHaveBeenCalledWith('', 'test');
56
+ });
57
+
58
+ test('should set the key-value pair if both key and value are provided', async () => {
59
+ mockKVStoreContract.set.mockResolvedValue(null);
60
+ expect(kvStoreClient.set('key1', 'value1')).resolves.toBeUndefined();
61
+ expect(mockKVStoreContract.set).toHaveBeenCalledWith('key1', 'value1');
62
+ });
63
+
64
+ test('should throw an error when attempting to set a value without signer', async () => {
65
+ mockGetClientParams.mockResolvedValue({
66
+ signerOrProvider: provider,
67
+ network,
68
+ });
69
+ kvStoreClient = new KVStoreClient(await InitClient.getParams(provider));
70
+
71
+ await expect(kvStoreClient.set('key1', 'value1')).rejects.toThrow(
72
+ ErrorSigner
73
+ );
74
+ });
75
+
76
+ test('should throw an error when a network error occurs', async () => {
77
+ mockKVStoreContract.set.mockRejectedValue(
78
+ new Error('could not detect network')
79
+ );
80
+
81
+ await expect(kvStoreClient.set('key1', 'value1')).rejects.toThrow(
82
+ Error('Failed to set value: could not detect network')
83
+ );
84
+
85
+ expect(mockKVStoreContract.set).toHaveBeenCalledWith('key1', 'value1');
86
+ });
87
+ });
88
+
89
+ describe('setBulk', () => {
90
+ test('should throw an error if keys and values arrays are not of the same length', async () => {
91
+ const setBulkSpy = vi.spyOn(kvStoreClient, 'setBulk');
92
+ await expect(
93
+ kvStoreClient.setBulk(['key1', 'key2'], ['value1'])
94
+ ).rejects.toThrow(ErrorKVStoreArrayLength);
95
+ expect(setBulkSpy).toHaveBeenCalledWith(['key1', 'key2'], ['value1']);
96
+ });
97
+
98
+ test('should throw an error if any of the keys is empty', async () => {
99
+ const setBulkSpy = vi.spyOn(kvStoreClient, 'setBulk');
100
+ await expect(
101
+ kvStoreClient.setBulk(['key1', ''], ['value1', 'value2'])
102
+ ).rejects.toThrow(ErrorKVStoreEmptyKey);
103
+ expect(setBulkSpy).toHaveBeenCalledWith(
104
+ ['key1', ''],
105
+ ['value1', 'value2']
106
+ );
107
+ });
108
+
109
+ test('should set the key-value pairs if both keys and values arrays are provided correctly', async () => {
110
+ mockKVStoreContract.setBulk.mockResolvedValue(null);
111
+ expect(
112
+ kvStoreClient.setBulk(['key1', 'key2'], ['value1', 'value2'])
113
+ ).resolves.resolves.toBeUndefined();
114
+ expect(mockKVStoreContract.setBulk).toHaveBeenCalledWith(
115
+ ['key1', 'key2'],
116
+ ['value1', 'value2']
117
+ );
118
+ });
119
+
120
+ test('should throw an error when attempting to set values without signer', async () => {
121
+ mockGetClientParams.mockResolvedValue({
122
+ provider,
123
+ network,
124
+ });
125
+ kvStoreClient = new KVStoreClient(await InitClient.getParams(provider));
126
+
127
+ await expect(
128
+ kvStoreClient.setBulk(['key1', 'key2'], ['value1', 'value2'])
129
+ ).rejects.toThrow(ErrorSigner);
130
+ });
131
+
132
+ test('should throw an error if a network error occurs', async () => {
133
+ mockKVStoreContract.setBulk.mockRejectedValue(
134
+ new Error('could not detect network')
135
+ );
136
+ await expect(
137
+ kvStoreClient.setBulk(['key1', 'key2'], ['value1', 'value2'])
138
+ ).rejects.toThrow(
139
+ new Error('Failed to set bulk values: could not detect network')
140
+ );
141
+ expect(mockKVStoreContract.setBulk).toHaveBeenCalledWith(
142
+ ['key1', 'key2'],
143
+ ['value1', 'value2']
144
+ );
145
+ });
146
+ });
147
+
148
+ describe('get', () => {
149
+ test('should throw an error if key is empty', async () => {
150
+ await expect(
151
+ kvStoreClient.get('0x42d75a16b04a02d1abd7f2386b1c5b567bc7ef71', '')
152
+ ).rejects.toThrow(ErrorKVStoreEmptyKey);
153
+ });
154
+
155
+ test('should throw an error if address is not valid', async () => {
156
+ await expect(
157
+ kvStoreClient.get('invalid_address', 'key1')
158
+ ).rejects.toThrow(ErrorInvalidAddress);
159
+ });
160
+
161
+ test('should return empty string if both address and key are valid and address does not set any value', async () => {
162
+ const getSpy = vi.spyOn(kvStoreClient, 'get').mockResolvedValue('');
163
+ const result = await kvStoreClient.get(
164
+ '0x42d75a16b04a02d1abd7f2386b1c5b567bc7ef71',
165
+ 'key1'
166
+ );
167
+ expect(result).toBe('');
168
+ expect(getSpy).toHaveBeenCalledWith(
169
+ '0x42d75a16b04a02d1abd7f2386b1c5b567bc7ef71',
170
+ 'key1'
171
+ );
172
+ });
173
+
174
+ test('should return value if both address and key are valid and address set a value', async () => {
175
+ mockKVStoreContract.get.mockResolvedValue('value1');
176
+
177
+ const getSpy = vi.spyOn(kvStoreClient, 'get');
178
+ const result = await kvStoreClient.get(
179
+ '0x42d75a16b04a02d1abd7f2386b1c5b567bc7ef71',
180
+ 'key1'
181
+ );
182
+ expect(result).toBe('value1');
183
+ expect(getSpy).toHaveBeenCalledWith(
184
+ '0x42d75a16b04a02d1abd7f2386b1c5b567bc7ef71',
185
+ 'key1'
186
+ );
187
+ expect(mockKVStoreContract.get).toHaveBeenCalledWith(
188
+ '0x42d75a16b04a02d1abd7f2386b1c5b567bc7ef71',
189
+ 'key1'
190
+ );
191
+ });
192
+
193
+ test('should throw an error if a network error occurs', async () => {
194
+ mockKVStoreContract.get.mockRejectedValue(
195
+ new Error('could not detect network')
196
+ );
197
+
198
+ await expect(
199
+ kvStoreClient.get('0x42d75a16b04a02d1abd7f2386b1c5b567bc7ef71', 'key1')
200
+ ).rejects.toThrow(Error('Failed to get value: could not detect network'));
201
+
202
+ expect(mockKVStoreContract.get).toHaveBeenCalledWith(
203
+ '0x42d75a16b04a02d1abd7f2386b1c5b567bc7ef71',
204
+ 'key1'
205
+ );
206
+ });
207
+ });
208
+ });