@reown/appkit-experimental 1.1.1-40d0859f0.0 → 1.1.4
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/dist/esm/exports/smart-session/index.js +3 -0
- package/dist/esm/exports/smart-session/index.js.map +1 -1
- package/dist/esm/src/smart-session/grantPermissions.js +5 -1
- package/dist/esm/src/smart-session/grantPermissions.js.map +1 -1
- package/dist/esm/src/smart-session/schema/index.js +37 -5
- package/dist/esm/src/smart-session/schema/index.js.map +1 -1
- package/dist/esm/src/smart-session/ui/permissions/wui-permission-contract-call/index.js +71 -0
- package/dist/esm/src/smart-session/ui/permissions/wui-permission-contract-call/index.js.map +1 -0
- package/dist/esm/src/smart-session/ui/permissions/wui-permission-contract-call/styles.js +11 -0
- package/dist/esm/src/smart-session/ui/permissions/wui-permission-contract-call/styles.js.map +1 -0
- package/dist/esm/src/smart-session/ui/views/w3m-smart-session-created-view/index.js +79 -0
- package/dist/esm/src/smart-session/ui/views/w3m-smart-session-created-view/index.js.map +1 -0
- package/dist/esm/src/smart-session/ui/views/w3m-smart-session-created-view/styles.js +7 -0
- package/dist/esm/src/smart-session/ui/views/w3m-smart-session-created-view/styles.js.map +1 -0
- package/dist/esm/tests/smart-session/requestValidation/mockRequest.js +14 -0
- package/dist/esm/tests/smart-session/requestValidation/mockRequest.js.map +1 -0
- package/dist/esm/tests/smart-session/requestValidation/validateCommonFields.test.js +290 -0
- package/dist/esm/tests/smart-session/requestValidation/validateCommonFields.test.js.map +1 -0
- package/dist/esm/tests/smart-session/requestValidation/validateContractCallPermission.test.js +135 -0
- package/dist/esm/tests/smart-session/requestValidation/validateContractCallPermission.test.js.map +1 -0
- package/dist/esm/tests/smart-session/requestValidation/validateERC20RecurringAllowancePermission.test.js +175 -0
- package/dist/esm/tests/smart-session/requestValidation/validateERC20RecurringAllowancePermission.test.js.map +1 -0
- package/dist/esm/tests/smart-session/requestValidation/validateNativeTokenRecurringAllowancePermission.test.js +137 -0
- package/dist/esm/tests/smart-session/requestValidation/validateNativeTokenRecurringAllowancePermission.test.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/types/exports/smart-session/index.d.ts +3 -1
- package/dist/types/src/smart-session/helper/index.d.ts +32 -2
- package/dist/types/src/smart-session/schema/index.d.ts +133 -8
- package/dist/types/src/smart-session/ui/permissions/wui-permission-contract-call/index.d.ts +20 -0
- package/dist/types/src/smart-session/ui/permissions/wui-permission-contract-call/styles.d.ts +2 -0
- package/dist/types/src/smart-session/ui/views/w3m-smart-session-created-view/index.d.ts +13 -0
- package/dist/types/src/smart-session/ui/views/w3m-smart-session-created-view/styles.d.ts +2 -0
- package/dist/types/src/smart-session/utils/TypeUtils.d.ts +18 -1
- package/dist/types/tests/smart-session/requestValidation/mockRequest.d.ts +2 -0
- package/dist/types/tests/smart-session/requestValidation/validateContractCallPermission.test.d.ts +1 -0
- package/dist/types/tests/smart-session/requestValidation/validateERC20RecurringAllowancePermission.test.d.ts +1 -0
- package/dist/types/tests/smart-session/requestValidation/validateNativeTokenRecurringAllowancePermission.test.d.ts +1 -0
- package/package.json +6 -4
- package/dist/esm/tests/smart-session/requestValidation.test.js +0 -423
- package/dist/esm/tests/smart-session/requestValidation.test.js.map +0 -1
- /package/dist/types/tests/smart-session/{requestValidation.test.d.ts → requestValidation/validateCommonFields.test.d.ts} +0 -0
|
@@ -1,2 +1,5 @@
|
|
|
1
1
|
export { grantPermissions, isSmartSessionSupported } from '../../src/smart-session/grantPermissions.js';
|
|
2
|
+
export * from '../../src/smart-session/utils/TypeUtils.js';
|
|
3
|
+
export * from '../../src/smart-session/ui/views/w3m-smart-session-created-view/index.js';
|
|
4
|
+
export * from '../../src/smart-session/ui/permissions/wui-permission-contract-call/index.js';
|
|
2
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../exports/smart-session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,6CAA6C,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../exports/smart-session/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACxB,MAAM,6CAA6C,CAAA;AAEpD,cAAc,4CAA4C,CAAA;AAG1D,cAAc,0EAA0E,CAAA;AACxF,cAAc,8EAA8E,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ChainController, ConnectionController, OptionsController } from '@reown/appkit-core';
|
|
1
|
+
import { ChainController, ConnectionController, OptionsController, RouterController } from '@reown/appkit-core';
|
|
2
2
|
import { ProviderUtil } from '@reown/appkit/store';
|
|
3
3
|
import { ConstantsUtil as CommonConstantsUtil } from '@reown/appkit-common';
|
|
4
4
|
import { assertWalletGrantPermissionsResponse, extractChainAndAddress, updateRequestSigner, validateRequest } from './helper/index.js';
|
|
@@ -27,6 +27,10 @@ export async function grantPermissions(request) {
|
|
|
27
27
|
const cosignerService = new CosignerService(projectId);
|
|
28
28
|
const addPermissionResponse = await cosignerService.addPermission(activeCaipAddress, request);
|
|
29
29
|
updateRequestSigner(request, addPermissionResponse.key);
|
|
30
|
+
RouterController.pushTransactionStack({
|
|
31
|
+
view: 'SmartSessionCreated',
|
|
32
|
+
goBack: false
|
|
33
|
+
});
|
|
30
34
|
const rawResponse = await connectionControllerClient.grantPermissions([request]);
|
|
31
35
|
const response = assertWalletGrantPermissionsResponse(rawResponse);
|
|
32
36
|
await cosignerService.activatePermissions(activeCaipAddress, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grantPermissions.js","sourceRoot":"","sources":["../../../../src/smart-session/grantPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"grantPermissions.js","sourceRoot":"","sources":["../../../../src/smart-session/grantPermissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,9 @@ export const ERROR_MESSAGES = {
|
|
|
14
14
|
INVALID_PUBLIC_KEY_FORMAT: 'Invalid public key: must start with "0x"',
|
|
15
15
|
INVALID_PERMISSIONS: 'Invalid permissions: must be a non-empty array',
|
|
16
16
|
INVALID_PERMISSIONS_TYPE: 'Invalid permissions: Expected array, received object',
|
|
17
|
-
|
|
17
|
+
INVALID_ALLOWANCE_FORMAT: 'Invalid allowance: must be a hexadecimal string starting with "0x"',
|
|
18
|
+
INVALID_START: 'Invalid start time: must be a positive integer and in the future',
|
|
19
|
+
INVALID_PERIOD: 'Invalid period: must be a positive integer',
|
|
18
20
|
INVALID_POLICIES: 'Invalid policies: must be a non-empty array',
|
|
19
21
|
INVALID_POLICIES_TYPE: 'Invalid policies: Expected array, received object',
|
|
20
22
|
INVALID_GRANT_PERMISSIONS_RESPONSE: 'Invalid grantPermissions response'
|
|
@@ -64,15 +66,45 @@ const FunctionPermissionSchema = z.object({
|
|
|
64
66
|
operation: z.nativeEnum(Operation).optional()
|
|
65
67
|
});
|
|
66
68
|
const ContractCallPermissionSchema = z.object({
|
|
67
|
-
type: z.literal('contract-call')
|
|
68
|
-
message: ERROR_MESSAGES.INVALID_PERMISSIONS_TYPE_LITERALS
|
|
69
|
-
}),
|
|
69
|
+
type: z.literal('contract-call'),
|
|
70
70
|
data: z.object({
|
|
71
71
|
address: z.string().startsWith('0x', { message: ERROR_MESSAGES.INVALID_ADDRESS }),
|
|
72
72
|
abi: z.array(z.record(z.unknown())),
|
|
73
73
|
functions: z.array(FunctionPermissionSchema)
|
|
74
74
|
})
|
|
75
75
|
});
|
|
76
|
+
const NativeTokenRecurringAllowancePermissionSchema = z.object({
|
|
77
|
+
type: z.literal('native-token-recurring-allowance'),
|
|
78
|
+
data: z.object({
|
|
79
|
+
allowance: z.string().startsWith('0x', { message: ERROR_MESSAGES.INVALID_ALLOWANCE_FORMAT }),
|
|
80
|
+
start: z
|
|
81
|
+
.number()
|
|
82
|
+
.positive({ message: ERROR_MESSAGES.INVALID_START })
|
|
83
|
+
.refine(value => value > Math.floor(Date.now() / 1000), {
|
|
84
|
+
message: ERROR_MESSAGES.INVALID_START
|
|
85
|
+
}),
|
|
86
|
+
period: z.number().positive({ message: ERROR_MESSAGES.INVALID_PERIOD })
|
|
87
|
+
})
|
|
88
|
+
});
|
|
89
|
+
const ERC20RecurringAllowancePermissionSchema = z.object({
|
|
90
|
+
type: z.literal('erc20-recurring-allowance'),
|
|
91
|
+
data: z.object({
|
|
92
|
+
token: z.string().startsWith('0x', { message: ERROR_MESSAGES.INVALID_ADDRESS }),
|
|
93
|
+
allowance: z.string().startsWith('0x', { message: ERROR_MESSAGES.INVALID_ALLOWANCE_FORMAT }),
|
|
94
|
+
start: z
|
|
95
|
+
.number()
|
|
96
|
+
.positive({ message: ERROR_MESSAGES.INVALID_START })
|
|
97
|
+
.refine(value => value > Math.floor(Date.now() / 1000), {
|
|
98
|
+
message: ERROR_MESSAGES.INVALID_START
|
|
99
|
+
}),
|
|
100
|
+
period: z.number().positive({ message: ERROR_MESSAGES.INVALID_PERIOD })
|
|
101
|
+
})
|
|
102
|
+
});
|
|
103
|
+
const PermissionSchema = z.union([
|
|
104
|
+
ContractCallPermissionSchema,
|
|
105
|
+
NativeTokenRecurringAllowancePermissionSchema,
|
|
106
|
+
ERC20RecurringAllowancePermissionSchema
|
|
107
|
+
]);
|
|
76
108
|
const PolicySchema = z.object({
|
|
77
109
|
type: z.string(),
|
|
78
110
|
data: z.record(z.unknown())
|
|
@@ -84,7 +116,7 @@ export const SmartSessionGrantPermissionsRequestSchema = z
|
|
|
84
116
|
expiry: ExpirySchema,
|
|
85
117
|
signer: SignerSchema,
|
|
86
118
|
permissions: z
|
|
87
|
-
.array(
|
|
119
|
+
.array(PermissionSchema)
|
|
88
120
|
.nonempty({ message: ERROR_MESSAGES.INVALID_PERMISSIONS }),
|
|
89
121
|
policies: z.array(PolicySchema)
|
|
90
122
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/smart-session/schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGhE,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,qBAAqB,EAAE,uBAAuB;IAC9C,oBAAoB,EAAE,4CAA4C;IAClE,eAAe,EAAE,2BAA2B;IAE5C,uBAAuB,EAAE,uCAAuC;IAChE,qBAAqB,EAAE,yEAAyE;IAEhG,eAAe,EAAE,sDAAsD;IAEvE,cAAc,EAAE,mDAAmD;IAGnE,mBAAmB,EAAE,uDAAuD;IAC5E,uBAAuB,EAAE,yBAAyB;IAClD,oBAAoB,EAAE,sDAAsD;IAC5E,yBAAyB,EAAE,0CAA0C;IAErE,mBAAmB,EAAE,gDAAgD;IACrE,wBAAwB,EAAE,sDAAsD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/smart-session/schema/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { customElement, UiHelperUtil } from '@reown/appkit-ui';
|
|
8
|
+
import { LitElement, html } from 'lit';
|
|
9
|
+
import styles from './styles.js';
|
|
10
|
+
import { property } from 'lit/decorators.js';
|
|
11
|
+
let WuiPermissionContractCall = class WuiPermissionContractCall extends LitElement {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.functions = [];
|
|
15
|
+
}
|
|
16
|
+
render() {
|
|
17
|
+
if (!this.contractAddress || !this.expiry) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return html `
|
|
21
|
+
<wui-flex flexDirection="column" padding=${['l', '0', '0', '0']} alignItems="center">
|
|
22
|
+
<wui-details-group>
|
|
23
|
+
<wui-details-group-item name="Type">
|
|
24
|
+
<wui-text variant="paragraph-400" color="fg-100"> Contract Call </wui-text>
|
|
25
|
+
</wui-details-group-item>
|
|
26
|
+
<wui-details-group-item name="Contract">
|
|
27
|
+
<wui-text variant="paragraph-400" color="fg-100">
|
|
28
|
+
${UiHelperUtil.getTruncateString({
|
|
29
|
+
string: this.contractAddress,
|
|
30
|
+
truncate: 'middle',
|
|
31
|
+
charsStart: 4,
|
|
32
|
+
charsEnd: 4
|
|
33
|
+
})}
|
|
34
|
+
</wui-text>
|
|
35
|
+
</wui-details-group-item>
|
|
36
|
+
<wui-details-group-item name="Functions">
|
|
37
|
+
<wui-text variant="paragraph-400" color="fg-100">
|
|
38
|
+
${this.functions?.map(f => f.functionName).join(', ')}
|
|
39
|
+
</wui-text>
|
|
40
|
+
</wui-details-group-item>
|
|
41
|
+
<wui-flex justifyContent="space-between">
|
|
42
|
+
<wui-text color="fg-200">Duration</wui-text>
|
|
43
|
+
<wui-flex flexDirection="column" alignItems="flex-end" gap="s">
|
|
44
|
+
<wui-text variant="paragraph-400" color="fg-100">
|
|
45
|
+
~ ${Math.round((1000 * this.expiry - Date.now()) / 1000 / 3600)} hours
|
|
46
|
+
</wui-text>
|
|
47
|
+
<wui-text variant="tiny-600" color="fg-300">
|
|
48
|
+
Expiring ${new Date(1000 * this.expiry).toDateString()}
|
|
49
|
+
</wui-text>
|
|
50
|
+
</wui-flex>
|
|
51
|
+
</wui-flex>
|
|
52
|
+
</wui-details-group>
|
|
53
|
+
</wui-flex>
|
|
54
|
+
`;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
WuiPermissionContractCall.styles = styles;
|
|
58
|
+
__decorate([
|
|
59
|
+
property({ type: Array })
|
|
60
|
+
], WuiPermissionContractCall.prototype, "functions", void 0);
|
|
61
|
+
__decorate([
|
|
62
|
+
property({ type: String })
|
|
63
|
+
], WuiPermissionContractCall.prototype, "contractAddress", void 0);
|
|
64
|
+
__decorate([
|
|
65
|
+
property({ type: Number })
|
|
66
|
+
], WuiPermissionContractCall.prototype, "expiry", void 0);
|
|
67
|
+
WuiPermissionContractCall = __decorate([
|
|
68
|
+
customElement('wui-permission-contract-call')
|
|
69
|
+
], WuiPermissionContractCall);
|
|
70
|
+
export { WuiPermissionContractCall };
|
|
71
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/smart-session/ui/permissions/wui-permission-contract-call/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGrC,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,UAAU;IAAlD;;QAI6B,cAAS,GAAgC,EAAE,CAAA;IA8C/E,CAAC;IAzCiB,MAAM;QACpB,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,IAAI,CAAA;iDACkC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;;;;;;;gBAOrD,YAAY,CAAC,iBAAiB,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,eAAe;YAC5B,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,CAAC;YACb,QAAQ,EAAE,CAAC;SACZ,CAAC;;;;;gBAKA,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;oBAO/C,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;;;2BAGpD,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE;;;;;;KAMjE,CAAA;IACH,CAAC;;AA/CsB,gCAAM,GAAG,MAAM,AAAT,CAAS;AAEJ;IAAjC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;4DAAmD;AAC1C;IAAlC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kEAAuC;AAC/B;IAAlC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yDAAuB;AANvC,yBAAyB;IADrC,aAAa,CAAC,8BAA8B,CAAC;GACjC,yBAAyB,CAkDrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../../../src/smart-session/ui/permissions/wui-permission-contract-call/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAGzB,eAAe,GAAG,CAAA;;;;;;;;CAQjB,CAAA"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { customElement } from '@reown/appkit-ui';
|
|
8
|
+
import { CoreHelperUtil, RouterController } from '@reown/appkit-core';
|
|
9
|
+
import { LitElement, html } from 'lit';
|
|
10
|
+
import styles from './styles.js';
|
|
11
|
+
import { NavigationUtil } from '@reown/appkit-common';
|
|
12
|
+
let W3mSmartSessionCreatedView = class W3mSmartSessionCreatedView extends LitElement {
|
|
13
|
+
render() {
|
|
14
|
+
return html `
|
|
15
|
+
<wui-flex
|
|
16
|
+
flexDirection="column"
|
|
17
|
+
alignItems="center"
|
|
18
|
+
gap="xxl"
|
|
19
|
+
.padding=${['0', '0', 'l', '0']}
|
|
20
|
+
>
|
|
21
|
+
${this.onboardingTemplate()}
|
|
22
|
+
<wui-link
|
|
23
|
+
@click=${() => {
|
|
24
|
+
CoreHelperUtil.openHref(NavigationUtil.URLS.FAQ, '_blank');
|
|
25
|
+
}}
|
|
26
|
+
>
|
|
27
|
+
What's a Smart Session?
|
|
28
|
+
</wui-link>
|
|
29
|
+
${this.buttonsTemplate()}
|
|
30
|
+
</wui-flex>
|
|
31
|
+
`;
|
|
32
|
+
}
|
|
33
|
+
onboardingTemplate() {
|
|
34
|
+
return html ` <wui-flex
|
|
35
|
+
flexDirection="column"
|
|
36
|
+
gap="xxl"
|
|
37
|
+
alignItems="center"
|
|
38
|
+
.padding=${['0', 'xxl', '0', 'xxl']}
|
|
39
|
+
>
|
|
40
|
+
<wui-flex gap="s" alignItems="center" justifyContent="center">
|
|
41
|
+
<wui-icon-box
|
|
42
|
+
size="xl"
|
|
43
|
+
iconcolor="fg-100"
|
|
44
|
+
backgroundcolor="inverse-100"
|
|
45
|
+
icon="clock"
|
|
46
|
+
background="opaque"
|
|
47
|
+
></wui-icon-box>
|
|
48
|
+
</wui-flex>
|
|
49
|
+
<wui-flex flexDirection="column" alignItems="center" gap="s">
|
|
50
|
+
<wui-text align="center" variant="medium-600" color="fg-100">
|
|
51
|
+
Smart Session created successfully
|
|
52
|
+
</wui-text>
|
|
53
|
+
<wui-text align="center" variant="paragraph-400" color="fg-100">
|
|
54
|
+
You can manage your session from your account settings.
|
|
55
|
+
</wui-text>
|
|
56
|
+
</wui-flex>
|
|
57
|
+
</wui-flex>`;
|
|
58
|
+
}
|
|
59
|
+
buttonsTemplate() {
|
|
60
|
+
return html `<wui-flex
|
|
61
|
+
.padding=${['0', '2l', '0', '2l']}
|
|
62
|
+
gap="s"
|
|
63
|
+
class="continue-button-container"
|
|
64
|
+
>
|
|
65
|
+
<wui-button fullWidth size="lg" borderRadius="xs" @click=${this.redirectToAccount.bind(this)}>
|
|
66
|
+
Got it!
|
|
67
|
+
</wui-button>
|
|
68
|
+
</wui-flex>`;
|
|
69
|
+
}
|
|
70
|
+
redirectToAccount() {
|
|
71
|
+
RouterController.replace('Account');
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
W3mSmartSessionCreatedView.styles = styles;
|
|
75
|
+
W3mSmartSessionCreatedView = __decorate([
|
|
76
|
+
customElement('w3m-smart-session-created-view')
|
|
77
|
+
], W3mSmartSessionCreatedView);
|
|
78
|
+
export { W3mSmartSessionCreatedView };
|
|
79
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/smart-session/ui/views/w3m-smart-session-created-view/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AACtC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAG9C,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,UAAU;IAIxC,MAAM;QACpB,OAAO,IAAI,CAAA;;;;;mBAKI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU;;UAEtC,IAAI,CAAC,kBAAkB,EAAE;;mBAEhB,GAAG,EAAE;YACZ,cAAc,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QAC5D,CAAC;;;;UAID,IAAI,CAAC,eAAe,EAAE;;KAE3B,CAAA;IACH,CAAC;IAGO,kBAAkB;QACxB,OAAO,IAAI,CAAA;;;;iBAIE,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,CAAU;;;;;;;;;;;;;;;;;;;gBAmBlC,CAAA;IACd,CAAC;IAEO,eAAe;QACrB,OAAO,IAAI,CAAA;iBACE,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAU;;;;iEAIiB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;;;gBAGlF,CAAA;IACd,CAAC;IAEO,iBAAiB;QACvB,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;;AAlEsB,iCAAM,GAAG,MAAM,AAAT,CAAS;AAD3B,0BAA0B;IADtC,aAAa,CAAC,gCAAgC,CAAC;GACnC,0BAA0B,CAoEtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../../../src/smart-session/ui/views/w3m-smart-session-created-view/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAEzB,eAAe,GAAG,CAAA;;;;CAIjB,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function mockRequest() {
|
|
2
|
+
return {
|
|
3
|
+
chainId: '0x1',
|
|
4
|
+
expiry: Date.now() + 10000,
|
|
5
|
+
signer: {
|
|
6
|
+
type: 'keys',
|
|
7
|
+
data: {
|
|
8
|
+
keys: [{ type: 'secp256k1', publicKey: '0x123456' }]
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
policies: []
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=mockRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockRequest.js","sourceRoot":"","sources":["../../../../../tests/smart-session/requestValidation/mockRequest.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,OAAO,EAAE,KAAsB;QAC/B,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;QAC1B,MAAM,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE;gBACJ,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAA2B,EAAE,CAAC;aACtE;SACF;QACD,QAAQ,EAAE,EAAE;KAC+C,CAAA;AAC/D,CAAC"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { describe, expect, it, beforeEach } from 'vitest';
|
|
2
|
+
import { validateRequest } from '../../../src/smart-session/helper/index.js';
|
|
3
|
+
import { donutContractAbi } from '../../data/abi.js';
|
|
4
|
+
import { ERROR_MESSAGES } from '../../../src/smart-session/schema/index.js';
|
|
5
|
+
import { mockRequest } from './mockRequest.js';
|
|
6
|
+
describe('Common field validation', () => {
|
|
7
|
+
let testRequest;
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
testRequest = {
|
|
10
|
+
...mockRequest(),
|
|
11
|
+
permissions: [
|
|
12
|
+
{
|
|
13
|
+
type: 'contract-call',
|
|
14
|
+
data: {
|
|
15
|
+
address: '0x2E65BAfA07238666c3b239E94F32DaD3cDD6498D',
|
|
16
|
+
abi: donutContractAbi,
|
|
17
|
+
functions: [
|
|
18
|
+
{
|
|
19
|
+
functionName: 'purchase'
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
it('should pass for a valid request', () => {
|
|
28
|
+
expect(() => validateRequest(testRequest)).not.toThrow();
|
|
29
|
+
});
|
|
30
|
+
it('should fail for missing chainId', () => {
|
|
31
|
+
const { chainId, ...requestWithoutChainId } = testRequest;
|
|
32
|
+
expect(() => validateRequest(requestWithoutChainId)).toThrow('Invalid chainId: Required');
|
|
33
|
+
});
|
|
34
|
+
describe('ChainIdSchema Validation', () => {
|
|
35
|
+
it('should pass for valid chainId', () => {
|
|
36
|
+
const request = { ...testRequest, chainId: '0x1' };
|
|
37
|
+
expect(() => validateRequest(request)).not.toThrow();
|
|
38
|
+
});
|
|
39
|
+
it.each([
|
|
40
|
+
[null, 'null'],
|
|
41
|
+
[undefined, 'undefined'],
|
|
42
|
+
[123, 'number'],
|
|
43
|
+
[{}, 'object'],
|
|
44
|
+
[[], 'array'],
|
|
45
|
+
['', 'empty string'],
|
|
46
|
+
['123456', 'string without 0x prefix'],
|
|
47
|
+
['0x', 'only 0x'],
|
|
48
|
+
['0xZZZZZZ', 'invalid hexadecimal']
|
|
49
|
+
])('should fail for %s chainId', (chainId, _description) => {
|
|
50
|
+
const request = { ...testRequest, chainId };
|
|
51
|
+
if (chainId === undefined) {
|
|
52
|
+
const { chainId, ...requestWithoutChainId } = request;
|
|
53
|
+
expect(() => validateRequest(requestWithoutChainId)).toThrow(/Invalid chainId/);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
expect(() => validateRequest(request)).toThrow(/Invalid chainId/);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
it('should handle chainIds with leading zeros', () => {
|
|
60
|
+
const request = { ...testRequest, chainId: '0x01' };
|
|
61
|
+
expect(() => validateRequest(request)).not.toThrow();
|
|
62
|
+
});
|
|
63
|
+
it('should be case insensitive for hex characters', () => {
|
|
64
|
+
const request1 = { ...testRequest, chainId: '0xaB1' };
|
|
65
|
+
const request2 = { ...testRequest, chainId: '0xAb1' };
|
|
66
|
+
expect(() => validateRequest(request1)).not.toThrow();
|
|
67
|
+
expect(() => validateRequest(request2)).not.toThrow();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('Address field validation', () => {
|
|
71
|
+
it('should pass for valid Ethereum address', () => {
|
|
72
|
+
const request = {
|
|
73
|
+
...testRequest,
|
|
74
|
+
address: '0x1234567890123456789012345678901234567890'
|
|
75
|
+
};
|
|
76
|
+
expect(() => validateRequest(request)).not.toThrow();
|
|
77
|
+
});
|
|
78
|
+
it('should pass when address is omitted', () => {
|
|
79
|
+
const { address, ...requestWithoutAddress } = testRequest;
|
|
80
|
+
expect(() => validateRequest(requestWithoutAddress)).not.toThrow();
|
|
81
|
+
});
|
|
82
|
+
it('should fail for address not starting with 0x', () => {
|
|
83
|
+
const request = {
|
|
84
|
+
...testRequest,
|
|
85
|
+
address: '1234567890123456789012345678901234567890'
|
|
86
|
+
};
|
|
87
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.INVALID_ADDRESS);
|
|
88
|
+
});
|
|
89
|
+
it('should fail for empty string address', () => {
|
|
90
|
+
const request = { ...testRequest, address: '' };
|
|
91
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.INVALID_ADDRESS);
|
|
92
|
+
});
|
|
93
|
+
it('should fail for non-string address', () => {
|
|
94
|
+
const request = { ...testRequest, address: 123 };
|
|
95
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.INVALID_ADDRESS);
|
|
96
|
+
});
|
|
97
|
+
it('should fail for null address', () => {
|
|
98
|
+
const request = { ...testRequest, address: null };
|
|
99
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.INVALID_ADDRESS);
|
|
100
|
+
});
|
|
101
|
+
it('should fail for undefined address', () => {
|
|
102
|
+
const request = { ...testRequest, address: undefined };
|
|
103
|
+
expect(() => validateRequest(request)).not.toThrow();
|
|
104
|
+
});
|
|
105
|
+
it('should be case insensitive for hex characters', () => {
|
|
106
|
+
const request = { ...testRequest, address: ('0xAbCd' + '0'.repeat(36)) };
|
|
107
|
+
expect(() => validateRequest(request)).not.toThrow();
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('Expiry field validation', () => {
|
|
111
|
+
const currentTimestamp = Math.floor(Date.now() / 1000);
|
|
112
|
+
it('should pass for a valid future expiry', () => {
|
|
113
|
+
const request = { ...testRequest, expiry: currentTimestamp + 3600 };
|
|
114
|
+
expect(() => validateRequest(request)).not.toThrow();
|
|
115
|
+
});
|
|
116
|
+
it('should fail for a negative expiry', () => {
|
|
117
|
+
const request = { ...testRequest, expiry: -1 };
|
|
118
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.INVALID_EXPIRY);
|
|
119
|
+
});
|
|
120
|
+
it('should fail for a zero expiry', () => {
|
|
121
|
+
const request = { ...testRequest, expiry: 0 };
|
|
122
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.INVALID_EXPIRY);
|
|
123
|
+
});
|
|
124
|
+
it('should fail for a past expiry', () => {
|
|
125
|
+
const request = { ...testRequest, expiry: currentTimestamp - 3600 };
|
|
126
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.INVALID_EXPIRY);
|
|
127
|
+
});
|
|
128
|
+
it('should fail for a current timestamp expiry', () => {
|
|
129
|
+
const request = { ...testRequest, expiry: currentTimestamp };
|
|
130
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.INVALID_EXPIRY);
|
|
131
|
+
});
|
|
132
|
+
it('should fail for a non-number expiry', () => {
|
|
133
|
+
const request = { ...testRequest, expiry: '1234567890' };
|
|
134
|
+
expect(() => validateRequest(request)).toThrow('Invalid expiry: Expected number, received string');
|
|
135
|
+
});
|
|
136
|
+
it('should fail for an undefined expiry', () => {
|
|
137
|
+
const { expiry, ...requestWithoutExpiry } = testRequest;
|
|
138
|
+
expect(() => validateRequest(requestWithoutExpiry)).toThrow('Invalid expiry: Required');
|
|
139
|
+
});
|
|
140
|
+
it('should fail for a null expiry', () => {
|
|
141
|
+
const request = { ...testRequest, expiry: null };
|
|
142
|
+
expect(() => validateRequest(request)).toThrow('Invalid expiry: Expected number, received null');
|
|
143
|
+
});
|
|
144
|
+
it('should pass for an expiry 1 hour in the future', () => {
|
|
145
|
+
const request = { ...testRequest, expiry: currentTimestamp + 3600 };
|
|
146
|
+
expect(() => validateRequest(request)).not.toThrow();
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
describe('Signer field validation', () => {
|
|
150
|
+
it('should fail for unsupported signer', () => {
|
|
151
|
+
const request = {
|
|
152
|
+
...testRequest,
|
|
153
|
+
signer: {
|
|
154
|
+
type: 'key',
|
|
155
|
+
data: { type: 'secp256k1', publicKey: '0x1234567890abcdef' }
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
expect(() => validateRequest(request)).toThrow();
|
|
159
|
+
});
|
|
160
|
+
it('should pass for valid multi-key signer', () => {
|
|
161
|
+
const request = {
|
|
162
|
+
...testRequest,
|
|
163
|
+
signer: {
|
|
164
|
+
type: 'keys',
|
|
165
|
+
data: {
|
|
166
|
+
keys: [
|
|
167
|
+
{ type: 'secp256k1', publicKey: '0x1234567890abcdef' },
|
|
168
|
+
{ type: 'secp256r1', publicKey: '0xabcdef1234567890' }
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
expect(() => validateRequest(request)).not.toThrow();
|
|
174
|
+
});
|
|
175
|
+
it('should fail for empty keys array in multi-key signer', () => {
|
|
176
|
+
const request = {
|
|
177
|
+
...testRequest,
|
|
178
|
+
signer: { type: 'keys', data: { keys: [] } }
|
|
179
|
+
};
|
|
180
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.INVALID_KEYS_SIGNER);
|
|
181
|
+
});
|
|
182
|
+
it('should fail for missing data in multi-key signer', () => {
|
|
183
|
+
const request = {
|
|
184
|
+
...testRequest,
|
|
185
|
+
signer: { type: 'keys' }
|
|
186
|
+
};
|
|
187
|
+
expect(() => validateRequest(request)).toThrow('Invalid signer.data: Required');
|
|
188
|
+
});
|
|
189
|
+
it('should fail for missing keys in multi-key signer', () => {
|
|
190
|
+
const request = {
|
|
191
|
+
...testRequest,
|
|
192
|
+
signer: { type: 'keys', data: {} }
|
|
193
|
+
};
|
|
194
|
+
expect(() => validateRequest(request)).toThrow('Invalid signer.data.keys: Required');
|
|
195
|
+
});
|
|
196
|
+
it('should fail for non-object signer', () => {
|
|
197
|
+
const request = {
|
|
198
|
+
...testRequest,
|
|
199
|
+
signer: 'invalid'
|
|
200
|
+
};
|
|
201
|
+
expect(() => validateRequest(request)).toThrow('Invalid signer: Expected object, received string');
|
|
202
|
+
});
|
|
203
|
+
it('should fail for null signer', () => {
|
|
204
|
+
const request = {
|
|
205
|
+
...testRequest,
|
|
206
|
+
signer: null
|
|
207
|
+
};
|
|
208
|
+
expect(() => validateRequest(request)).toThrow('Invalid signer: Expected object, received null');
|
|
209
|
+
});
|
|
210
|
+
it('should fail for signer with invalid key type', () => {
|
|
211
|
+
const request = {
|
|
212
|
+
...testRequest,
|
|
213
|
+
signer: {
|
|
214
|
+
type: 'keys',
|
|
215
|
+
data: {
|
|
216
|
+
keys: [{ type: 'invalid', publicKey: '0x1234567890abcdef' }]
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.UNSUPPORTED_KEY_TYPE);
|
|
221
|
+
});
|
|
222
|
+
it('should fail for signer with invalid public key format', () => {
|
|
223
|
+
const request = {
|
|
224
|
+
...testRequest,
|
|
225
|
+
signer: {
|
|
226
|
+
type: 'keys',
|
|
227
|
+
data: {
|
|
228
|
+
keys: [{ type: 'secp256k1', publicKey: 'invalid' }]
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.INVALID_PUBLIC_KEY_FORMAT);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
describe('Policy field validation', () => {
|
|
236
|
+
it('should pass for valid policies array', () => {
|
|
237
|
+
const request = {
|
|
238
|
+
...testRequest,
|
|
239
|
+
policies: [
|
|
240
|
+
{ type: 'someType', data: { someKey: 'someValue' } },
|
|
241
|
+
{ type: 'anotherType', data: { anotherKey: 'anotherValue' } }
|
|
242
|
+
]
|
|
243
|
+
};
|
|
244
|
+
expect(() => validateRequest(request)).not.toThrow();
|
|
245
|
+
});
|
|
246
|
+
it('should pass for empty policies array', () => {
|
|
247
|
+
const request = {
|
|
248
|
+
...testRequest,
|
|
249
|
+
policies: []
|
|
250
|
+
};
|
|
251
|
+
expect(() => validateRequest(request)).not.toThrow();
|
|
252
|
+
});
|
|
253
|
+
it('should fail for non-array policies', () => {
|
|
254
|
+
const request = {
|
|
255
|
+
...testRequest,
|
|
256
|
+
policies: { type: 'someType', data: {} }
|
|
257
|
+
};
|
|
258
|
+
expect(() => validateRequest(request)).toThrow(ERROR_MESSAGES.INVALID_POLICIES_TYPE);
|
|
259
|
+
});
|
|
260
|
+
it('should fail for policies with invalid structure', () => {
|
|
261
|
+
const request = {
|
|
262
|
+
...testRequest,
|
|
263
|
+
policies: [{ invalidKey: 'value' }]
|
|
264
|
+
};
|
|
265
|
+
expect(() => validateRequest(request)).toThrow('Invalid policies.0.type: Required; Invalid policies.0.data: Required');
|
|
266
|
+
});
|
|
267
|
+
it('should fail for policies with missing type', () => {
|
|
268
|
+
const request = {
|
|
269
|
+
...testRequest,
|
|
270
|
+
policies: [{ data: { key: 'value' } }]
|
|
271
|
+
};
|
|
272
|
+
expect(() => validateRequest(request)).toThrow('Invalid policies.0.type: Required');
|
|
273
|
+
});
|
|
274
|
+
it('should fail for policies with missing data', () => {
|
|
275
|
+
const request = {
|
|
276
|
+
...testRequest,
|
|
277
|
+
policies: [{ type: 'someType' }]
|
|
278
|
+
};
|
|
279
|
+
expect(() => validateRequest(request)).toThrow('Invalid policies.0.data: Required');
|
|
280
|
+
});
|
|
281
|
+
it('should fail for policies with non-object data', () => {
|
|
282
|
+
const request = {
|
|
283
|
+
...testRequest,
|
|
284
|
+
policies: [{ type: 'someType', data: 'invalidData' }]
|
|
285
|
+
};
|
|
286
|
+
expect(() => validateRequest(request)).toThrow('Invalid policies.0.data: Expected object, received string');
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
//# sourceMappingURL=validateCommonFields.test.js.map
|