@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.
- package/LICENSE +190 -0
- package/dist/esm/exports/index.js +2 -0
- package/dist/esm/exports/index.js.map +1 -0
- package/dist/esm/exports/smart-session/index.js +2 -0
- package/dist/esm/exports/smart-session/index.js.map +1 -0
- package/dist/esm/src/smart-session/grantPermissions.js +77 -0
- package/dist/esm/src/smart-session/grantPermissions.js.map +1 -0
- package/dist/esm/src/smart-session/helper/index.js +79 -0
- package/dist/esm/src/smart-session/helper/index.js.map +1 -0
- package/dist/esm/src/smart-session/schema/index.js +92 -0
- package/dist/esm/src/smart-session/schema/index.js.map +1 -0
- package/dist/esm/src/smart-session/utils/ConstantUtils.js +5 -0
- package/dist/esm/src/smart-session/utils/ConstantUtils.js.map +1 -0
- package/dist/esm/src/smart-session/utils/CosignerService.js +62 -0
- package/dist/esm/src/smart-session/utils/CosignerService.js.map +1 -0
- package/dist/esm/src/smart-session/utils/ERC5792Types.js +2 -0
- package/dist/esm/src/smart-session/utils/ERC5792Types.js.map +1 -0
- package/dist/esm/src/smart-session/utils/TypeUtils.js +12 -0
- package/dist/esm/src/smart-session/utils/TypeUtils.js.map +1 -0
- package/dist/esm/tests/data/abi.js +16 -0
- package/dist/esm/tests/data/abi.js.map +1 -0
- package/dist/esm/tests/smart-session/CosignerService.test.js +130 -0
- package/dist/esm/tests/smart-session/CosignerService.test.js.map +1 -0
- package/dist/esm/tests/smart-session/grantPermissions.test.js +252 -0
- package/dist/esm/tests/smart-session/grantPermissions.test.js.map +1 -0
- package/dist/esm/tests/smart-session/requestValidation.test.js +423 -0
- package/dist/esm/tests/smart-session/requestValidation.test.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/dist/types/exports/index.d.ts +0 -0
- package/dist/types/exports/smart-session/index.d.ts +2 -0
- package/dist/types/src/smart-session/grantPermissions.d.ts +5 -0
- package/dist/types/src/smart-session/helper/index.d.ts +61 -0
- package/dist/types/src/smart-session/schema/index.d.ts +265 -0
- package/dist/types/src/smart-session/utils/ConstantUtils.d.ts +4 -0
- package/dist/types/src/smart-session/utils/CosignerService.d.ts +19 -0
- package/dist/types/src/smart-session/utils/ERC5792Types.d.ts +20 -0
- package/dist/types/src/smart-session/utils/TypeUtils.d.ts +80 -0
- package/dist/types/tests/data/abi.d.ts +11 -0
- package/dist/types/tests/smart-session/CosignerService.test.d.ts +1 -0
- package/dist/types/tests/smart-session/grantPermissions.test.d.ts +1 -0
- package/dist/types/tests/smart-session/requestValidation.test.d.ts +1 -0
- package/package.json +70 -0
- 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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"}
|