@reown/appkit-experimental 1.1.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.
Files changed (43) hide show
  1. package/LICENSE +190 -0
  2. package/dist/esm/exports/index.js +2 -0
  3. package/dist/esm/exports/index.js.map +1 -0
  4. package/dist/esm/exports/smart-session/index.js +2 -0
  5. package/dist/esm/exports/smart-session/index.js.map +1 -0
  6. package/dist/esm/src/smart-session/grantPermissions.js +77 -0
  7. package/dist/esm/src/smart-session/grantPermissions.js.map +1 -0
  8. package/dist/esm/src/smart-session/helper/index.js +79 -0
  9. package/dist/esm/src/smart-session/helper/index.js.map +1 -0
  10. package/dist/esm/src/smart-session/schema/index.js +92 -0
  11. package/dist/esm/src/smart-session/schema/index.js.map +1 -0
  12. package/dist/esm/src/smart-session/utils/ConstantUtils.js +5 -0
  13. package/dist/esm/src/smart-session/utils/ConstantUtils.js.map +1 -0
  14. package/dist/esm/src/smart-session/utils/CosignerService.js +62 -0
  15. package/dist/esm/src/smart-session/utils/CosignerService.js.map +1 -0
  16. package/dist/esm/src/smart-session/utils/ERC5792Types.js +2 -0
  17. package/dist/esm/src/smart-session/utils/ERC5792Types.js.map +1 -0
  18. package/dist/esm/src/smart-session/utils/TypeUtils.js +12 -0
  19. package/dist/esm/src/smart-session/utils/TypeUtils.js.map +1 -0
  20. package/dist/esm/tests/data/abi.js +16 -0
  21. package/dist/esm/tests/data/abi.js.map +1 -0
  22. package/dist/esm/tests/smart-session/CosignerService.test.js +130 -0
  23. package/dist/esm/tests/smart-session/CosignerService.test.js.map +1 -0
  24. package/dist/esm/tests/smart-session/grantPermissions.test.js +252 -0
  25. package/dist/esm/tests/smart-session/grantPermissions.test.js.map +1 -0
  26. package/dist/esm/tests/smart-session/requestValidation.test.js +423 -0
  27. package/dist/esm/tests/smart-session/requestValidation.test.js.map +1 -0
  28. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  29. package/dist/types/exports/index.d.ts +0 -0
  30. package/dist/types/exports/smart-session/index.d.ts +2 -0
  31. package/dist/types/src/smart-session/grantPermissions.d.ts +5 -0
  32. package/dist/types/src/smart-session/helper/index.d.ts +61 -0
  33. package/dist/types/src/smart-session/schema/index.d.ts +265 -0
  34. package/dist/types/src/smart-session/utils/ConstantUtils.d.ts +4 -0
  35. package/dist/types/src/smart-session/utils/CosignerService.d.ts +19 -0
  36. package/dist/types/src/smart-session/utils/ERC5792Types.d.ts +20 -0
  37. package/dist/types/src/smart-session/utils/TypeUtils.d.ts +80 -0
  38. package/dist/types/tests/data/abi.d.ts +11 -0
  39. package/dist/types/tests/smart-session/CosignerService.test.d.ts +1 -0
  40. package/dist/types/tests/smart-session/grantPermissions.test.d.ts +1 -0
  41. package/dist/types/tests/smart-session/requestValidation.test.d.ts +1 -0
  42. package/package.json +70 -0
  43. package/readme.md +23 -0
@@ -0,0 +1,130 @@
1
+ import { describe, expect, it, beforeAll, beforeEach } from 'vitest';
2
+ import axios from 'axios';
3
+ import MockAdapter from 'axios-mock-adapter';
4
+ import { sendCoSignerRequest, CoSignerApiError, CosignerService } from '../../src/smart-session/utils/CosignerService';
5
+ import { ConstantsUtil } from '../../src/smart-session/utils/ConstantUtils';
6
+ const mock = new MockAdapter(axios);
7
+ describe('CoSigner API Tests', () => {
8
+ const projectId = 'test-project-id';
9
+ const mockAddress = '0x1234567890123456789012345678901234567890';
10
+ let cosigner;
11
+ beforeAll(() => {
12
+ cosigner = new CosignerService(projectId);
13
+ });
14
+ beforeEach(() => {
15
+ mock.reset();
16
+ });
17
+ const mockAddPermissionRequest = {
18
+ chainId: '0x1',
19
+ expiry: Math.floor(Date.now() / 1000) + 3600,
20
+ signer: {
21
+ type: 'keys',
22
+ data: {
23
+ keys: [{ type: 'secp256k1', publicKey: '0x123456' }]
24
+ }
25
+ },
26
+ permissions: [
27
+ {
28
+ type: 'contract-call',
29
+ data: {
30
+ address: '0x2E65BAfA07238666c3b239E94F32DaD3cDD6498D',
31
+ abi: [],
32
+ functions: []
33
+ }
34
+ }
35
+ ],
36
+ policies: []
37
+ };
38
+ const mockActivatePermissionsRequest = {
39
+ ...mockAddPermissionRequest,
40
+ pci: 'test-pci',
41
+ context: '0xtest-context'
42
+ };
43
+ describe('sendCoSignerRequest', () => {
44
+ const mockUrl = 'https://example.com';
45
+ const mockHeaders = { 'Content-Type': 'application/json' };
46
+ it('should successfully send a request and return the response', async () => {
47
+ const mockResponse = {
48
+ pci: 'test-pci',
49
+ key: {
50
+ type: 'secp256k1',
51
+ publicKey: '0xtest-key'
52
+ }
53
+ };
54
+ mock.onPost(mockUrl).reply(200, mockResponse);
55
+ const response = await sendCoSignerRequest({
56
+ url: mockUrl,
57
+ request: mockAddPermissionRequest,
58
+ headers: mockHeaders,
59
+ queryParams: { projectId }
60
+ });
61
+ expect(response).toEqual(mockResponse);
62
+ });
63
+ it('should throw CoSignerApiError with a response status and message for 4xx errors', async () => {
64
+ mock.onPost(mockUrl).reply(400, { error: 'Bad Request' });
65
+ await expect(sendCoSignerRequest({
66
+ url: mockUrl,
67
+ request: mockAddPermissionRequest,
68
+ headers: mockHeaders,
69
+ queryParams: { projectId }
70
+ })).rejects.toThrow(CoSignerApiError);
71
+ });
72
+ it('should throw CoSignerApiError for network errors', async () => {
73
+ mock.onPost(mockUrl).networkError();
74
+ await expect(sendCoSignerRequest({
75
+ url: mockUrl,
76
+ request: mockAddPermissionRequest,
77
+ headers: mockHeaders,
78
+ queryParams: { projectId }
79
+ })).rejects.toThrow(CoSignerApiError);
80
+ });
81
+ });
82
+ describe('CosignerService', () => {
83
+ describe('addPermission', () => {
84
+ it('should successfully add a permission', async () => {
85
+ const mockResponse = {
86
+ pci: 'test-pci',
87
+ key: {
88
+ type: 'secp256k1',
89
+ publicKey: '0xtest-key'
90
+ }
91
+ };
92
+ mock
93
+ .onPost(`${ConstantsUtil.COSIGNER_BASE_URL}/${encodeURIComponent(mockAddress)}`)
94
+ .reply(200, mockResponse);
95
+ const result = await cosigner.addPermission(mockAddress, mockAddPermissionRequest);
96
+ expect(result).toEqual(mockResponse);
97
+ });
98
+ it('should handle addPermission error and throw CoSignerApiError', async () => {
99
+ mock
100
+ .onPost(`${ConstantsUtil.COSIGNER_BASE_URL}/${encodeURIComponent(mockAddress)}`)
101
+ .reply(400, { error: 'Bad Request' });
102
+ await expect(cosigner.addPermission(mockAddress, mockAddPermissionRequest)).rejects.toThrow(CoSignerApiError);
103
+ });
104
+ });
105
+ describe('activatePermissions', () => {
106
+ it('should activate permissions successfully', async () => {
107
+ mock
108
+ .onPost(`${ConstantsUtil.COSIGNER_BASE_URL}/${encodeURIComponent(mockAddress)}/activate`)
109
+ .reply(200);
110
+ await expect(cosigner.activatePermissions(mockAddress, mockActivatePermissionsRequest)).resolves.toBeUndefined();
111
+ });
112
+ it('should handle activatePermissions error and throw CoSignerApiError', async () => {
113
+ mock
114
+ .onPost(`${ConstantsUtil.COSIGNER_BASE_URL}/${encodeURIComponent(mockAddress)}/activate`)
115
+ .reply(400, { error: 'Bad Request' });
116
+ await expect(cosigner.activatePermissions(mockAddress, mockActivatePermissionsRequest)).rejects.toThrow(CoSignerApiError);
117
+ });
118
+ });
119
+ });
120
+ describe('CosignerService Constructor', () => {
121
+ it('should throw an error if projectId is not provided', () => {
122
+ expect(() => new CosignerService('')).toThrow('Project ID must be provided');
123
+ });
124
+ it('should create an instance with a valid projectId', () => {
125
+ const instance = new CosignerService('valid-project-id');
126
+ expect(instance).toBeInstanceOf(CosignerService);
127
+ });
128
+ });
129
+ });
130
+ //# sourceMappingURL=CosignerService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CosignerService.test.js","sourceRoot":"","sources":["../../../../tests/smart-session/CosignerService.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,252 @@
1
+ import { describe, expect, it, beforeEach, vi } from 'vitest';
2
+ import { grantPermissions } from '../../src/smart-session/grantPermissions';
3
+ import { ChainController, ConnectionController, OptionsController } from '@reown/appkit-core';
4
+ import { ProviderUtil } from '@reown/appkit/store';
5
+ import { CosignerService } from '../../src/smart-session/utils/CosignerService';
6
+ import { extractChainAndAddress, isValidSupportedCaipAddress, assertWalletGrantPermissionsResponse } from '../../src/smart-session/helper/index.js';
7
+ import { donutContractAbi } from '../data/abi';
8
+ import { ERROR_MESSAGES } from '../../src/smart-session/schema';
9
+ vi.mock('@reown/appkit-core');
10
+ vi.mock('@reown/appkit/store');
11
+ vi.mock('../../src/smart-session/utils/CosignerService');
12
+ describe('grantPermissions', () => {
13
+ let mockRequest;
14
+ const expiry = Date.now() + 1000;
15
+ beforeEach(() => {
16
+ ;
17
+ (mockRequest = {
18
+ address: '0x1234567890123456789012345678901234567890',
19
+ chainId: '0x1',
20
+ expiry: expiry,
21
+ signer: {
22
+ type: 'keys',
23
+ data: {
24
+ keys: [{ type: 'secp256k1', publicKey: '0x123456' }]
25
+ }
26
+ },
27
+ permissions: [
28
+ {
29
+ type: 'contract-call',
30
+ data: {
31
+ address: '0x2E65BAfA07238666c3b239E94F32DaD3cDD6498D',
32
+ abi: donutContractAbi,
33
+ functions: [
34
+ {
35
+ functionName: 'purchase'
36
+ }
37
+ ]
38
+ }
39
+ }
40
+ ],
41
+ policies: []
42
+ }),
43
+ vi.resetAllMocks();
44
+ vi.mocked(OptionsController.state).projectId = 'test-project-id';
45
+ vi.mocked(ChainController.state).activeCaipAddress =
46
+ 'eip155:1:0x1234567890123456789012345678901234567890';
47
+ vi.mocked(ProviderUtil).getProvider = vi.fn().mockReturnValue({
48
+ session: {
49
+ namespaces: {
50
+ eip155: {
51
+ methods: ['wallet_grantPermissions']
52
+ }
53
+ }
54
+ }
55
+ });
56
+ vi.mocked(CosignerService.prototype.addPermission).mockResolvedValue({
57
+ pci: 'test-pci',
58
+ key: {
59
+ type: 'secp256k1',
60
+ publicKey: '0xtest-key'
61
+ }
62
+ });
63
+ vi.mocked(ConnectionController._getClient).mockReturnValue({
64
+ getCapabilities: vi.fn().mockResolvedValue({
65
+ '0x1': {
66
+ permissions: {
67
+ supported: true,
68
+ permissionTypes: ['contract-call'],
69
+ signerTypes: ['keys'],
70
+ policyTypes: []
71
+ }
72
+ }
73
+ }),
74
+ grantPermissions: vi.fn().mockResolvedValue({
75
+ permissions: [
76
+ {
77
+ type: 'contract-call',
78
+ data: {
79
+ address: '0x2E65BAfA07238666c3b239E94F32DaD3cDD6498D',
80
+ abi: donutContractAbi,
81
+ functions: [
82
+ {
83
+ functionName: 'purchase'
84
+ }
85
+ ]
86
+ }
87
+ }
88
+ ],
89
+ signer: {
90
+ type: 'keys',
91
+ data: {
92
+ keys: [
93
+ { type: 'secp256k1', publicKey: '0xtest-key' },
94
+ { type: 'secp256k1', publicKey: '0x123456' }
95
+ ]
96
+ }
97
+ },
98
+ context: '0xcontext',
99
+ expiry: expiry,
100
+ address: '0x1234567890123456789012345678901234567890',
101
+ chainId: '0x1'
102
+ })
103
+ });
104
+ vi.mocked(CosignerService.prototype.activatePermissions).mockResolvedValue(undefined);
105
+ });
106
+ it('should successfully grant permissions and invoke required methods', async () => {
107
+ const result = await grantPermissions(mockRequest);
108
+ expect(result).toEqual({
109
+ permissions: [
110
+ {
111
+ type: 'contract-call',
112
+ data: {
113
+ address: '0x2E65BAfA07238666c3b239E94F32DaD3cDD6498D',
114
+ abi: donutContractAbi,
115
+ functions: [
116
+ {
117
+ functionName: 'purchase'
118
+ }
119
+ ]
120
+ }
121
+ }
122
+ ],
123
+ context: 'test-pci',
124
+ expiry: expiry,
125
+ address: '0x1234567890123456789012345678901234567890',
126
+ chainId: '0x1'
127
+ });
128
+ expect(CosignerService.prototype.addPermission).toHaveBeenCalledWith('eip155:1:0x1234567890123456789012345678901234567890', mockRequest);
129
+ expect(CosignerService.prototype.activatePermissions).toHaveBeenCalled();
130
+ });
131
+ it('should throw an error for unsupported namespace', async () => {
132
+ vi.mocked(ChainController.state).activeCaipAddress = undefined;
133
+ await expect(grantPermissions(mockRequest)).rejects.toThrow(ERROR_MESSAGES.UNSUPPORTED_NAMESPACE);
134
+ });
135
+ it('should throw an error when grantPermissions returns null', async () => {
136
+ vi.mocked(ConnectionController._getClient).mockReturnValueOnce({
137
+ getCapabilities: vi.fn().mockResolvedValue({
138
+ '0x1': {
139
+ permissions: {
140
+ supported: true,
141
+ permissionTypes: ['contract-call'],
142
+ signerTypes: ['keys'],
143
+ policyTypes: []
144
+ }
145
+ }
146
+ }),
147
+ grantPermissions: vi.fn().mockResolvedValue(null)
148
+ });
149
+ await expect(grantPermissions(mockRequest)).rejects.toThrow(ERROR_MESSAGES.NO_RESPONSE_RECEIVED);
150
+ });
151
+ it('should handle network errors', async () => {
152
+ vi.mocked(CosignerService.prototype.addPermission).mockRejectedValue(new Error('Network error'));
153
+ await expect(grantPermissions(mockRequest)).rejects.toThrow('Network error');
154
+ });
155
+ it('should throw an error for invalid chainId format', async () => {
156
+ const invalidRequest = { ...mockRequest, chainId: '1' };
157
+ await expect(grantPermissions(invalidRequest)).rejects.toThrow(ERROR_MESSAGES.INVALID_CHAIN_ID_FORMAT);
158
+ });
159
+ it('should throw an error for invalid expiry', async () => {
160
+ const invalidRequest = { ...mockRequest, expiry: -1 };
161
+ await expect(grantPermissions(invalidRequest)).rejects.toThrow(ERROR_MESSAGES.INVALID_EXPIRY);
162
+ });
163
+ it('should throw an error for empty permissions', async () => {
164
+ const invalidRequest = { ...mockRequest, permissions: [] };
165
+ await expect(grantPermissions(invalidRequest)).rejects.toThrow(ERROR_MESSAGES.INVALID_PERMISSIONS);
166
+ });
167
+ it('should throw an error for invalid policies', async () => {
168
+ const invalidRequest = { ...mockRequest, policies: {} };
169
+ await expect(grantPermissions(invalidRequest)).rejects.toThrow(ERROR_MESSAGES.INVALID_POLICIES_TYPE);
170
+ });
171
+ it('should throw an error for invalid signer', async () => {
172
+ const invalidRequest = { ...mockRequest, signer: null };
173
+ await expect(grantPermissions(invalidRequest)).rejects.toThrow();
174
+ });
175
+ it('should throw an error for invalid signer type', async () => {
176
+ const invalidRequest = { ...mockRequest, signer: { type: {}, data: {} } };
177
+ await expect(grantPermissions(invalidRequest)).rejects.toThrow();
178
+ });
179
+ it('should successfully update the signer in request for valid key signer', async () => {
180
+ await grantPermissions(mockRequest);
181
+ expect(mockRequest.signer).toEqual({
182
+ type: 'keys',
183
+ data: {
184
+ keys: [
185
+ { type: 'secp256k1', publicKey: '0xtest-key' },
186
+ { type: 'secp256k1', publicKey: '0x123456' }
187
+ ]
188
+ }
189
+ });
190
+ });
191
+ it('should not modify the signer in request if signer type is already "keys"', async () => {
192
+ mockRequest.signer = {
193
+ type: 'keys',
194
+ data: { keys: [{ type: 'secp256k1', publicKey: '0xexisting-key' }] }
195
+ };
196
+ await grantPermissions(mockRequest);
197
+ expect(mockRequest.signer).toEqual({
198
+ type: 'keys',
199
+ data: {
200
+ keys: [
201
+ { type: 'secp256k1', publicKey: '0xtest-key' },
202
+ { type: 'secp256k1', publicKey: '0xexisting-key' }
203
+ ]
204
+ }
205
+ });
206
+ });
207
+ it('should throw an error when CosignerService addPermission fails', async () => {
208
+ vi.mocked(CosignerService.prototype.addPermission).mockRejectedValue(new Error('Cosigner error'));
209
+ await expect(grantPermissions(mockRequest)).rejects.toThrow('Cosigner error');
210
+ });
211
+ it('should throw an error when ConnectionController grantPermissions fails', async () => {
212
+ vi.mocked(ConnectionController._getClient).mockReturnValueOnce({
213
+ getCapabilities: vi.fn().mockResolvedValue({
214
+ '0x1': {
215
+ permissions: {
216
+ supported: true,
217
+ permissionTypes: ['contract-call'],
218
+ signerTypes: ['keys'],
219
+ policyTypes: []
220
+ }
221
+ }
222
+ }),
223
+ grantPermissions: vi.fn().mockRejectedValue(new Error('Connection error'))
224
+ });
225
+ await expect(grantPermissions(mockRequest)).rejects.toThrow('Connection error');
226
+ });
227
+ it('should return undefined for an invalid address in extractAddress', () => {
228
+ const invalidCaipAddress = 'eip155:1:invalid-address';
229
+ const result = extractChainAndAddress(invalidCaipAddress);
230
+ expect(result).toBeUndefined();
231
+ });
232
+ it('should return a valid 0x-prefixed address from extractAddress', () => {
233
+ const validCaipAddress = 'eip155:1:0x1234567890123456789012345678901234567890';
234
+ const result = extractChainAndAddress(validCaipAddress);
235
+ expect(result?.address).toEqual('0x1234567890123456789012345678901234567890');
236
+ });
237
+ it('should return true for a valid CAIP address in isValidSupportedCaipAddress', () => {
238
+ const validCaipAddress = 'eip155:1:0x1234567890123456789012345678901234567890';
239
+ const isValid = isValidSupportedCaipAddress(validCaipAddress);
240
+ expect(isValid).toBe(true);
241
+ });
242
+ it('should return false for an invalid CAIP address in isValidSupportedCaipAddress', () => {
243
+ const invalidCaipAddress = 'invalid:namespace:0x1234567890123456789012345678901234567890';
244
+ const isValid = isValidSupportedCaipAddress(invalidCaipAddress);
245
+ expect(isValid).toBe(false);
246
+ });
247
+ it('should throw an error for an invalid response in assertWalletGrantPermissionsResponse', () => {
248
+ const invalidResponse = { invalid: 'data' };
249
+ expect(() => assertWalletGrantPermissionsResponse(invalidResponse)).toThrow(ERROR_MESSAGES.INVALID_GRANT_PERMISSIONS_RESPONSE);
250
+ });
251
+ });
252
+ //# sourceMappingURL=grantPermissions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grantPermissions.test.js","sourceRoot":"","sources":["../../../../tests/smart-session/grantPermissions.test.ts"],"names":[],"mappings":"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"}