@charterlabs/rhinestone-sdk 0.2.9 → 0.3.1

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 (122) hide show
  1. package/dist/src/accounts/error.d.ts +8 -1
  2. package/dist/src/accounts/error.d.ts.map +1 -1
  3. package/dist/src/accounts/error.js +10 -1
  4. package/dist/src/accounts/index.d.ts +11 -11
  5. package/dist/src/accounts/index.d.ts.map +1 -1
  6. package/dist/src/accounts/index.js +71 -53
  7. package/dist/src/accounts/kernel.d.ts +3 -5
  8. package/dist/src/accounts/kernel.d.ts.map +1 -1
  9. package/dist/src/accounts/kernel.js +10 -18
  10. package/dist/src/accounts/kernel.test.js +10 -3
  11. package/dist/src/accounts/nexus.d.ts +5 -7
  12. package/dist/src/accounts/nexus.d.ts.map +1 -1
  13. package/dist/src/accounts/nexus.js +112 -59
  14. package/dist/src/accounts/nexus.test.js +10 -3
  15. package/dist/src/accounts/passport.d.ts +4 -7
  16. package/dist/src/accounts/passport.d.ts.map +1 -1
  17. package/dist/src/accounts/passport.js +0 -91
  18. package/dist/src/accounts/safe.d.ts +9 -4
  19. package/dist/src/accounts/safe.d.ts.map +1 -1
  20. package/dist/src/accounts/safe.js +110 -39
  21. package/dist/src/accounts/safe.test.js +10 -3
  22. package/dist/src/accounts/signing/common.d.ts +3 -3
  23. package/dist/src/accounts/signing/common.d.ts.map +1 -1
  24. package/dist/src/accounts/signing/common.js +36 -3
  25. package/dist/src/accounts/signing/message.js +2 -2
  26. package/dist/src/accounts/signing/typedData.d.ts.map +1 -1
  27. package/dist/src/accounts/signing/typedData.js +3 -3
  28. package/dist/src/accounts/startale.d.ts +2 -4
  29. package/dist/src/accounts/startale.d.ts.map +1 -1
  30. package/dist/src/accounts/startale.js +2 -5
  31. package/dist/src/accounts/utils.d.ts.map +1 -1
  32. package/dist/src/accounts/utils.js +10 -3
  33. package/dist/src/accounts/walletClient.d.ts.map +1 -1
  34. package/dist/src/accounts/walletClient.js +6 -0
  35. package/dist/src/actions/compact.d.ts +3 -2
  36. package/dist/src/actions/compact.d.ts.map +1 -1
  37. package/dist/src/actions/compact.js +1 -0
  38. package/dist/src/actions/deployment.d.ts +19 -0
  39. package/dist/src/actions/deployment.d.ts.map +1 -0
  40. package/dist/src/actions/deployment.js +78 -0
  41. package/dist/src/actions/index.d.ts +4 -11
  42. package/dist/src/actions/index.d.ts.map +1 -1
  43. package/dist/src/actions/index.js +12 -0
  44. package/dist/src/actions/smart-sessions.d.ts +7 -8
  45. package/dist/src/actions/smart-sessions.d.ts.map +1 -1
  46. package/dist/src/actions/smart-sessions.js +7 -4
  47. package/dist/src/errors/index.d.ts +2 -2
  48. package/dist/src/errors/index.d.ts.map +1 -1
  49. package/dist/src/errors/index.js +2 -1
  50. package/dist/src/execution/compact.d.ts +12 -17
  51. package/dist/src/execution/compact.d.ts.map +1 -1
  52. package/dist/src/execution/compact.js +10 -16
  53. package/dist/src/execution/index.d.ts +6 -6
  54. package/dist/src/execution/index.d.ts.map +1 -1
  55. package/dist/src/execution/index.js +16 -27
  56. package/dist/src/execution/permit2.d.ts +12 -17
  57. package/dist/src/execution/permit2.d.ts.map +1 -1
  58. package/dist/src/execution/permit2.js +10 -16
  59. package/dist/src/execution/singleChainOps.d.ts +15 -3
  60. package/dist/src/execution/singleChainOps.d.ts.map +1 -1
  61. package/dist/src/execution/singleChainOps.js +17 -3
  62. package/dist/src/execution/utils.d.ts +32 -10
  63. package/dist/src/execution/utils.d.ts.map +1 -1
  64. package/dist/src/execution/utils.js +121 -108
  65. package/dist/src/index.d.ts +23 -7
  66. package/dist/src/index.d.ts.map +1 -1
  67. package/dist/src/index.js +36 -6
  68. package/dist/src/modules/abi/smart-session-emissary.d.ts +696 -0
  69. package/dist/src/modules/abi/smart-session-emissary.d.ts.map +1 -0
  70. package/dist/src/modules/abi/smart-session-emissary.js +565 -0
  71. package/dist/src/modules/chain-abstraction.d.ts +5 -0
  72. package/dist/src/modules/chain-abstraction.d.ts.map +1 -0
  73. package/dist/src/modules/chain-abstraction.js +7 -0
  74. package/dist/src/modules/common.d.ts +10 -2
  75. package/dist/src/modules/common.d.ts.map +1 -1
  76. package/dist/src/modules/common.js +10 -0
  77. package/dist/src/modules/index.d.ts +3 -9
  78. package/dist/src/modules/index.d.ts.map +1 -1
  79. package/dist/src/modules/index.js +24 -8
  80. package/dist/src/modules/index.test.js +3 -9
  81. package/dist/src/modules/legacy.d.ts +10 -0
  82. package/dist/src/modules/legacy.d.ts.map +1 -0
  83. package/dist/src/modules/legacy.js +65 -0
  84. package/dist/src/modules/validators/core.d.ts.map +1 -1
  85. package/dist/src/modules/validators/core.js +2 -0
  86. package/dist/src/modules/validators/index.d.ts +2 -2
  87. package/dist/src/modules/validators/index.d.ts.map +1 -1
  88. package/dist/src/modules/validators/index.js +1 -6
  89. package/dist/src/modules/validators/smart-sessions.d.ts +105 -20
  90. package/dist/src/modules/validators/smart-sessions.d.ts.map +1 -1
  91. package/dist/src/modules/validators/smart-sessions.js +199 -435
  92. package/dist/src/orchestrator/client.d.ts +7 -3
  93. package/dist/src/orchestrator/client.d.ts.map +1 -1
  94. package/dist/src/orchestrator/client.js +3 -13
  95. package/dist/src/orchestrator/index.d.ts +2 -2
  96. package/dist/src/orchestrator/index.d.ts.map +1 -1
  97. package/dist/src/orchestrator/index.js +2 -1
  98. package/dist/src/orchestrator/registry.d.ts +2 -1
  99. package/dist/src/orchestrator/registry.d.ts.map +1 -1
  100. package/dist/src/orchestrator/registry.js +28 -8
  101. package/dist/src/orchestrator/registry.test.js +13 -0
  102. package/dist/src/orchestrator/types.d.ts +11 -12
  103. package/dist/src/orchestrator/types.d.ts.map +1 -1
  104. package/dist/src/orchestrator/types.js +1 -7
  105. package/dist/src/types.d.ts +47 -25
  106. package/dist/src/types.d.ts.map +1 -1
  107. package/dist/src/utils/index.d.ts +24 -1
  108. package/dist/src/utils/index.d.ts.map +1 -1
  109. package/dist/src/utils/index.js +58 -0
  110. package/dist/test/utils/utils.d.ts +5 -0
  111. package/dist/test/utils/utils.d.ts.map +1 -0
  112. package/dist/test/utils/utils.js +20 -0
  113. package/package.json +33 -3
  114. package/dist/src/execution/smart-session.d.ts +0 -13
  115. package/dist/src/execution/smart-session.d.ts.map +0 -1
  116. package/dist/src/execution/smart-session.js +0 -178
  117. package/dist/src/modules/omni-account.d.ts +0 -8
  118. package/dist/src/modules/omni-account.d.ts.map +0 -1
  119. package/dist/src/modules/omni-account.js +0 -13
  120. package/dist/src/modules/validators/smart-sessions.test.d.ts +0 -2
  121. package/dist/src/modules/validators/smart-sessions.test.d.ts.map +0 -1
  122. package/dist/src/modules/validators/smart-sessions.test.js +0 -222
@@ -1,5 +1,63 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.experimental_getModuleSetup = void 0;
4
+ exports.experimental_getV0InitData = experimental_getV0InitData;
5
+ exports.experimental_getRhinestoneInitData = experimental_getRhinestoneInitData;
6
+ exports.toViewOnlyAccount = toViewOnlyAccount;
7
+ const accounts_1 = require("viem/accounts");
8
+ const accounts_2 = require("../accounts");
4
9
  const modules_1 = require("../modules");
5
10
  Object.defineProperty(exports, "experimental_getModuleSetup", { enumerable: true, get: function () { return modules_1.getSetup; } });
11
+ function experimental_getV0InitData(config) {
12
+ const initCode = (0, accounts_2.getV0InitCode)(config);
13
+ if (!initCode) {
14
+ throw new Error('Init code not available');
15
+ }
16
+ if (!('factory' in initCode)) {
17
+ throw new Error('Factory not available');
18
+ }
19
+ const { factory, factoryData } = initCode;
20
+ const address = (0, accounts_2.getAddress)(config);
21
+ return {
22
+ address,
23
+ factory,
24
+ factoryData,
25
+ intentExecutorInstalled: true,
26
+ };
27
+ }
28
+ function experimental_getRhinestoneInitData(config) {
29
+ const initCode = (0, accounts_2.getInitCode)(config);
30
+ if (!initCode) {
31
+ throw new Error('Init code not available');
32
+ }
33
+ const address = (0, accounts_2.getAddress)(config);
34
+ if ('factory' in initCode) {
35
+ const { factory, factoryData } = initCode;
36
+ return {
37
+ address,
38
+ factory,
39
+ factoryData,
40
+ intentExecutorInstalled: true,
41
+ };
42
+ }
43
+ else {
44
+ return {
45
+ address,
46
+ };
47
+ }
48
+ }
49
+ function toViewOnlyAccount(address) {
50
+ const errorMessage = 'Signing is not supported for view-only accounts';
51
+ return (0, accounts_1.toAccount)({
52
+ address,
53
+ signMessage: async () => {
54
+ throw new Error(errorMessage);
55
+ },
56
+ signTypedData: async () => {
57
+ throw new Error(errorMessage);
58
+ },
59
+ signTransaction: async () => {
60
+ throw new Error(errorMessage);
61
+ },
62
+ });
63
+ }
@@ -0,0 +1,5 @@
1
+ import type { Chain } from 'viem';
2
+ declare function getForkUrl(chain: Chain): string;
3
+ declare function assertNotNull<T>(value: T | null): asserts value is T;
4
+ export { getForkUrl, assertNotNull };
5
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../test/utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,MAAM,CAAA;AAIjC,iBAAS,UAAU,CAAC,KAAK,EAAE,KAAK,UAU/B;AAED,iBAAS,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAE7D;AAED,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,CAAA"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getForkUrl = getForkUrl;
4
+ exports.assertNotNull = assertNotNull;
5
+ const chains_1 = require("viem/chains");
6
+ const vitest_1 = require("vitest");
7
+ function getForkUrl(chain) {
8
+ // @ts-ignore
9
+ const alchemyApiKey = import.meta.env.VITE_ALCHEMY_API_KEY;
10
+ if (!alchemyApiKey) {
11
+ throw new Error('VITE_ALCHEMY_API_KEY is not set');
12
+ }
13
+ if (chain.id === chains_1.base.id) {
14
+ return `https://base-mainnet.g.alchemy.com/v2/${alchemyApiKey}`;
15
+ }
16
+ throw new Error(`Unsupported chain: ${chain.id}`);
17
+ }
18
+ function assertNotNull(value) {
19
+ (0, vitest_1.expect)(value).not.toBeNull();
20
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@charterlabs/rhinestone-sdk",
3
- "version": "0.2.9",
3
+ "version": "0.3.1",
4
4
  "description": "Rhinestone SDK for Charter Labs",
5
5
  "author": {
6
6
  "name": "Charter Labs",
@@ -89,6 +89,36 @@
89
89
  "types": "./dist/src/errors/index.d.ts",
90
90
  "import": "./dist/src/errors/index.js",
91
91
  "require": "./dist/src/errors/index.js"
92
+ },
93
+ "./dist/src/utils": {
94
+ "types": "./dist/src/utils/index.d.ts",
95
+ "import": "./dist/src/utils/index.js",
96
+ "require": "./dist/src/utils/index.js"
97
+ },
98
+ "./dist/src/orchestrator": {
99
+ "types": "./dist/src/orchestrator/index.d.ts",
100
+ "import": "./dist/src/orchestrator/index.js",
101
+ "require": "./dist/src/orchestrator/index.js"
102
+ },
103
+ "./dist/src/orchestrator/types": {
104
+ "types": "./dist/src/orchestrator/types.d.ts",
105
+ "import": "./dist/src/orchestrator/types.js",
106
+ "require": "./dist/src/orchestrator/types.js"
107
+ },
108
+ "./dist/src/execution/compact": {
109
+ "types": "./dist/src/execution/compact.d.ts",
110
+ "import": "./dist/src/execution/compact.js",
111
+ "require": "./dist/src/execution/compact.js"
112
+ },
113
+ "./dist/src/execution/permit2": {
114
+ "types": "./dist/src/execution/permit2.d.ts",
115
+ "import": "./dist/src/execution/permit2.js",
116
+ "require": "./dist/src/execution/permit2.js"
117
+ },
118
+ "./dist/src/execution/singleChainOps": {
119
+ "types": "./dist/src/execution/singleChainOps.d.ts",
120
+ "import": "./dist/src/execution/singleChainOps.js",
121
+ "require": "./dist/src/execution/singleChainOps.js"
92
122
  }
93
123
  },
94
124
  "files": [
@@ -106,11 +136,11 @@
106
136
  "access": "public"
107
137
  },
108
138
  "dependencies": {
109
- "@rhinestone/shared-configs": "^1.4.17",
139
+ "@rhinestone/shared-configs": "^1.4.45",
110
140
  "ox": "^0.9.11",
111
141
  "solady": "^0.1.26"
112
142
  },
113
143
  "peerDependencies": {
114
- "viem": "^2.28.0"
144
+ "viem": "^2.38.0"
115
145
  }
116
146
  }
@@ -1,13 +0,0 @@
1
- import { type Chain, type Hex } from 'viem';
2
- import { type EnableSessionData } from '../modules/validators/smart-sessions';
3
- import type { RhinestoneConfig, Session } from '../types';
4
- interface SessionDetails {
5
- signature: Hex;
6
- nonces: bigint[];
7
- enableSessionData: EnableSessionData;
8
- }
9
- declare function getSessionDetails(config: RhinestoneConfig, sessions: Session[], sessionIndex: number, initialNonces?: bigint[], signature?: Hex): Promise<SessionDetails>;
10
- declare function enableSmartSession(chain: Chain, config: RhinestoneConfig, session: Session): Promise<void>;
11
- export { enableSmartSession, getSessionDetails };
12
- export type { SessionDetails };
13
- //# sourceMappingURL=smart-session.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smart-session.d.ts","sourceRoot":"","sources":["../../../execution/smart-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EAEV,KAAK,GAAG,EAIT,MAAM,MAAM,CAAA;AAiBb,OAAO,EACL,KAAK,iBAAiB,EAKvB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAGzD,UAAU,cAAc;IACtB,SAAS,EAAE,GAAG,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,iBAAiB,EAAE,iBAAiB,CAAA;CACrC;AA6CD,iBAAe,iBAAiB,CAC9B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,MAAM,EAAE,EACxB,SAAS,CAAC,EAAE,GAAG,GACd,OAAO,CAAC,cAAc,CAAC,CAiHzB;AA+BD,iBAAe,kBAAkB,CAC/B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,OAAO,iBA2BjB;AAED,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;AAChD,YAAY,EAAE,cAAc,EAAE,CAAA"}
@@ -1,178 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.enableSmartSession = enableSmartSession;
4
- exports.getSessionDetails = getSessionDetails;
5
- const viem_1 = require("viem");
6
- const accounts_1 = require("../accounts");
7
- const utils_1 = require("../accounts/utils");
8
- const validators_1 = require("../modules/validators");
9
- const smart_sessions_1 = require("../modules/validators/smart-sessions");
10
- const error_1 = require("./error");
11
- const smartSessionTypes = {
12
- PolicyData: [
13
- { name: 'policy', type: 'address' },
14
- { name: 'initData', type: 'bytes' },
15
- ],
16
- ActionData: [
17
- { name: 'actionTargetSelector', type: 'bytes4' },
18
- { name: 'actionTarget', type: 'address' },
19
- { name: 'actionPolicies', type: 'PolicyData[]' },
20
- ],
21
- ERC7739Context: [
22
- { name: 'appDomainSeparator', type: 'bytes32' },
23
- { name: 'contentName', type: 'string[]' },
24
- ],
25
- ERC7739Data: [
26
- { name: 'allowedERC7739Content', type: 'ERC7739Context[]' },
27
- { name: 'erc1271Policies', type: 'PolicyData[]' },
28
- ],
29
- SignedPermissions: [
30
- { name: 'permitGenericPolicy', type: 'bool' },
31
- { name: 'permitAdminAccess', type: 'bool' },
32
- { name: 'ignoreSecurityAttestations', type: 'bool' },
33
- { name: 'permitERC4337Paymaster', type: 'bool' },
34
- { name: 'userOpPolicies', type: 'PolicyData[]' },
35
- { name: 'erc7739Policies', type: 'ERC7739Data' },
36
- { name: 'actions', type: 'ActionData[]' },
37
- ],
38
- SignedSession: [
39
- { name: 'account', type: 'address' },
40
- { name: 'permissions', type: 'SignedPermissions' },
41
- { name: 'sessionValidator', type: 'address' },
42
- { name: 'sessionValidatorInitData', type: 'bytes' },
43
- { name: 'salt', type: 'bytes32' },
44
- { name: 'smartSession', type: 'address' },
45
- { name: 'nonce', type: 'uint256' },
46
- ],
47
- ChainSession: [
48
- { name: 'chainId', type: 'uint64' },
49
- { name: 'session', type: 'SignedSession' },
50
- ],
51
- MultiChainSession: [{ name: 'sessionsAndChainIds', type: 'ChainSession[]' }],
52
- };
53
- async function getSessionDetails(config, sessions, sessionIndex, initialNonces, signature) {
54
- const chains = sessions
55
- .map((session) => session.chain)
56
- .filter((chain) => !!chain);
57
- if (chains.length !== sessions.length) {
58
- throw new error_1.SessionChainRequiredError();
59
- }
60
- const accountAddress = (0, accounts_1.getAddress)(config);
61
- const publicClients = chains.map((chain) => (0, viem_1.createPublicClient)({
62
- chain,
63
- transport: (0, utils_1.createTransport)(chain, config.provider),
64
- }));
65
- const sessionDatas = sessions.map((session) => (0, smart_sessions_1.getSmartSessionData)(session));
66
- const sessionNonces = await Promise.all(sessions.map((session, index) => initialNonces?.[index] ??
67
- getSessionNonce(publicClients[index], accountAddress, (0, validators_1.getPermissionId)(session))));
68
- const signedSessions = sessionDatas.map((session, index) => ({
69
- account: accountAddress,
70
- permissions: {
71
- permitGenericPolicy: session.actions.some((action) => action.actionTarget === smart_sessions_1.SMART_SESSIONS_FALLBACK_TARGET_FLAG &&
72
- action.actionTargetSelector ===
73
- smart_sessions_1.SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG),
74
- permitAdminAccess: session.actions.some((action) => action.actionTargetSelector ===
75
- smart_sessions_1.SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION),
76
- ignoreSecurityAttestations: false,
77
- permitERC4337Paymaster: session.permitERC4337Paymaster,
78
- userOpPolicies: session.userOpPolicies,
79
- erc7739Policies: session.erc7739Policies,
80
- actions: session.actions,
81
- },
82
- sessionValidator: session.sessionValidator,
83
- sessionValidatorInitData: session.sessionValidatorInitData,
84
- salt: session.salt,
85
- smartSession: validators_1.SMART_SESSIONS_VALIDATOR_ADDRESS,
86
- nonce: sessionNonces[index],
87
- }));
88
- const chainDigests = signedSessions.map((session, index) => ({
89
- chainId: BigInt(chains[index].id),
90
- sessionDigest: (0, viem_1.hashStruct)({
91
- types: smartSessionTypes,
92
- primaryType: 'SignedSession',
93
- data: session,
94
- }),
95
- }));
96
- const typedData = {
97
- domain: {
98
- name: 'SmartSession',
99
- version: '1',
100
- },
101
- types: smartSessionTypes,
102
- primaryType: 'MultiChainSession',
103
- message: {
104
- sessionsAndChainIds: signedSessions.map((session, index) => ({
105
- chainId: BigInt(chains[index].id),
106
- session,
107
- })),
108
- },
109
- };
110
- const chain = sessions[sessionIndex].chain;
111
- if (!chain) {
112
- throw new error_1.SessionChainRequiredError();
113
- }
114
- const validator = {
115
- address: sessionDatas[sessionIndex].sessionValidator,
116
- isRoot: false,
117
- };
118
- const sessionSignature = signature ??
119
- (await (0, accounts_1.getTypedDataPackedSignature)(config, undefined, chain, validator, typedData));
120
- return {
121
- nonces: sessionNonces,
122
- signature: sessionSignature,
123
- enableSessionData: {
124
- chainDigestIndex: sessionIndex,
125
- hashesAndChainIds: chainDigests.map((chainDigest) => ({
126
- chainId: BigInt(chainDigest.chainId),
127
- sessionDigest: chainDigest.sessionDigest,
128
- })),
129
- sessionToEnable: sessionDatas[sessionIndex],
130
- signature: sessionSignature,
131
- },
132
- };
133
- }
134
- async function getSessionNonce(client, account, permissionId) {
135
- const nonce = await client.readContract({
136
- address: validators_1.SMART_SESSIONS_VALIDATOR_ADDRESS,
137
- abi: [
138
- {
139
- type: 'function',
140
- name: 'getNonce',
141
- inputs: [
142
- {
143
- name: 'permissionId',
144
- type: 'bytes32',
145
- internalType: 'PermissionId',
146
- },
147
- { name: 'account', type: 'address', internalType: 'address' },
148
- ],
149
- outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],
150
- stateMutability: 'view',
151
- },
152
- ],
153
- functionName: 'getNonce',
154
- args: [permissionId, account],
155
- });
156
- return nonce;
157
- }
158
- async function enableSmartSession(chain, config, session) {
159
- const publicClient = (0, viem_1.createPublicClient)({
160
- chain,
161
- transport: (0, utils_1.createTransport)(chain, config.provider),
162
- });
163
- const address = (0, accounts_1.getAddress)(config);
164
- const isEnabled = await (0, validators_1.isSessionEnabled)(publicClient, address, (0, validators_1.getPermissionId)(session));
165
- if (isEnabled) {
166
- return;
167
- }
168
- const enableSessionCall = await (0, validators_1.getEnableSessionCall)(session);
169
- const smartAccount = await (0, accounts_1.getSmartAccount)(config, publicClient, chain);
170
- const bundlerClient = (0, utils_1.getBundlerClient)(config, publicClient);
171
- const opHash = await bundlerClient.sendUserOperation({
172
- account: smartAccount,
173
- calls: [enableSessionCall],
174
- });
175
- await bundlerClient.waitForUserOperationReceipt({
176
- hash: opHash,
177
- });
178
- }
@@ -1,8 +0,0 @@
1
- import type { Address } from 'viem';
2
- declare const HOOK_ADDRESS: Address;
3
- declare const TARGET_MODULE_ADDRESS: Address;
4
- declare const SAME_CHAIN_MODULE_ADDRESS: Address;
5
- declare const INTENT_EXECUTOR_ADDRESS: Address;
6
- declare const INTENT_EXECUTOR_ADDRESS_DEV: Address;
7
- export { HOOK_ADDRESS, TARGET_MODULE_ADDRESS, SAME_CHAIN_MODULE_ADDRESS, INTENT_EXECUTOR_ADDRESS, INTENT_EXECUTOR_ADDRESS_DEV, };
8
- //# sourceMappingURL=omni-account.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"omni-account.d.ts","sourceRoot":"","sources":["../../../modules/omni-account.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,QAAA,MAAM,YAAY,EAAE,OAAsD,CAAA;AAC1E,QAAA,MAAM,qBAAqB,EAAE,OACiB,CAAA;AAC9C,QAAA,MAAM,yBAAyB,EAAE,OACa,CAAA;AAE9C,QAAA,MAAM,uBAAuB,EAAE,OACe,CAAA;AAC9C,QAAA,MAAM,2BAA2B,EAAE,OACW,CAAA;AAE9C,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,2BAA2B,GAC5B,CAAA"}
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.INTENT_EXECUTOR_ADDRESS_DEV = exports.INTENT_EXECUTOR_ADDRESS = exports.SAME_CHAIN_MODULE_ADDRESS = exports.TARGET_MODULE_ADDRESS = exports.HOOK_ADDRESS = void 0;
4
- const HOOK_ADDRESS = '0x0000000000f6Ed8Be424d673c63eeFF8b9267420';
5
- exports.HOOK_ADDRESS = HOOK_ADDRESS;
6
- const TARGET_MODULE_ADDRESS = '0x0000000000E5a37279A001301A837a91b5de1D5E';
7
- exports.TARGET_MODULE_ADDRESS = TARGET_MODULE_ADDRESS;
8
- const SAME_CHAIN_MODULE_ADDRESS = '0x000000000043ff16d5776c7F0f65Ec485C17Ca04';
9
- exports.SAME_CHAIN_MODULE_ADDRESS = SAME_CHAIN_MODULE_ADDRESS;
10
- const INTENT_EXECUTOR_ADDRESS = '0x00000000005aD9ce1f5035FD62CA96CEf16AdAAF';
11
- exports.INTENT_EXECUTOR_ADDRESS = INTENT_EXECUTOR_ADDRESS;
12
- const INTENT_EXECUTOR_ADDRESS_DEV = '0xbf9b5b917a83f8adac17b0752846d41d8d7b7e17';
13
- exports.INTENT_EXECUTOR_ADDRESS_DEV = INTENT_EXECUTOR_ADDRESS_DEV;
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=smart-sessions.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"smart-sessions.test.d.ts","sourceRoot":"","sources":["../../../../modules/validators/smart-sessions.test.ts"],"names":[],"mappings":""}
@@ -1,222 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const viem_1 = require("viem");
4
- const vitest_1 = require("vitest");
5
- const consts_1 = require("../../../test/consts");
6
- const smart_sessions_1 = require("../abi/smart-sessions");
7
- const common_1 = require("../common");
8
- const smart_sessions_2 = require("./smart-sessions");
9
- (0, vitest_1.describe)('Smart Sessions', () => {
10
- (0, vitest_1.describe)('Permission ID', () => {
11
- (0, vitest_1.test)('default', () => {
12
- (0, vitest_1.expect)((0, smart_sessions_2.getPermissionId)({
13
- owners: {
14
- type: 'ecdsa',
15
- accounts: [consts_1.accountA, consts_1.accountB],
16
- },
17
- })).toBe('0xd3b39024e437b4cac278e33965b9a9326e81ee46bd45d890adbfc8eb45412fa1');
18
- });
19
- (0, vitest_1.test)('with salt', () => {
20
- (0, vitest_1.expect)((0, smart_sessions_2.getPermissionId)({
21
- owners: {
22
- type: 'ecdsa',
23
- accounts: [consts_1.accountA, consts_1.accountB],
24
- },
25
- salt: '0x97340e1cfff3319c76ef22b2bc9d3231071d550125d68c9d4a8972823f166320',
26
- })).toBe('0xeb47b4699298a847a0f6fb7365e56aefcc95630e7d0e3d9ca5917620c7dc3d08');
27
- });
28
- });
29
- (0, vitest_1.describe)('Smart Session Validator', () => {
30
- (0, vitest_1.test)('no session', () => {
31
- (0, vitest_1.expect)((0, smart_sessions_2.getSmartSessionValidator)({
32
- owners: {
33
- type: 'ecdsa',
34
- accounts: [consts_1.accountA],
35
- },
36
- })).toBeNull();
37
- });
38
- (0, vitest_1.test)('empty session list', () => {
39
- (0, vitest_1.expect)((0, smart_sessions_2.getSmartSessionValidator)({
40
- owners: {
41
- type: 'ecdsa',
42
- accounts: [consts_1.accountA],
43
- },
44
- sessions: [],
45
- })).not.toBeNull();
46
- });
47
- (0, vitest_1.test)('single session', () => {
48
- const validator = (0, smart_sessions_2.getSmartSessionValidator)({
49
- owners: {
50
- type: 'ecdsa',
51
- accounts: [consts_1.accountA],
52
- },
53
- sessions: [
54
- {
55
- owners: {
56
- type: 'ecdsa',
57
- accounts: [consts_1.accountA],
58
- },
59
- },
60
- ],
61
- });
62
- (0, vitest_1.expect)(validator).not.toBeNull();
63
- (0, vitest_1.expect)(validator?.type).toEqual(common_1.MODULE_TYPE_ID_VALIDATOR);
64
- (0, vitest_1.expect)(validator && (0, viem_1.isAddress)(validator.address)).toEqual(true);
65
- });
66
- });
67
- (0, vitest_1.describe)('Enable Session Call', () => {
68
- vitest_1.vi.mock('viem', async (importOriginal) => {
69
- const actual = await importOriginal();
70
- return {
71
- // @ts-ignore
72
- ...actual,
73
- createPublicClient: vitest_1.vi.fn().mockReturnValue({
74
- readContract: vitest_1.vi.fn(),
75
- }),
76
- };
77
- });
78
- const client = viem_1.createPublicClient;
79
- client.mockImplementation((_) => {
80
- return {
81
- readContract: (params) => {
82
- if (params.functionName === 'DOMAIN_SEPARATOR') {
83
- return '0xf5f6dfa751763cc5278cba45d03ea9797c1660b2cb7f5ffd188fa3e8523abdca';
84
- }
85
- throw new Error('Unknown function call');
86
- },
87
- };
88
- });
89
- const TARGET = '0x063DFbDb1610EC7BbfA1fFBE603Ac5aA1B67a935';
90
- const SELECTOR = '0x12345678';
91
- const FALLBACK_TARGET = '0x0000000000000000000000000000000000000001';
92
- const FALLBACK_SELECTOR = '0x00000001';
93
- (0, vitest_1.test)('default', async () => {
94
- const call = await (0, smart_sessions_2.getEnableSessionCall)({
95
- owners: {
96
- type: 'ecdsa',
97
- accounts: [consts_1.accountA],
98
- },
99
- });
100
- const sessionData = toSessionData(call);
101
- // Should have a fallback action
102
- (0, vitest_1.expect)(sessionData.actions.some((action) => action.actionTarget === FALLBACK_TARGET &&
103
- action.actionTargetSelector === FALLBACK_SELECTOR)).toEqual(true);
104
- });
105
- (0, vitest_1.test)('with action', async () => {
106
- const call = await (0, smart_sessions_2.getEnableSessionCall)({
107
- owners: {
108
- type: 'ecdsa',
109
- accounts: [consts_1.accountA],
110
- },
111
- actions: [
112
- {
113
- target: TARGET,
114
- selector: SELECTOR,
115
- },
116
- ],
117
- });
118
- const sessionData = toSessionData(call);
119
- // Should have the action
120
- (0, vitest_1.expect)(sessionData.actions.some((action) => action.actionTarget === TARGET &&
121
- action.actionTargetSelector === SELECTOR)).toEqual(true);
122
- // Should not have the fallback action
123
- (0, vitest_1.expect)(sessionData.actions.some((action) => action.actionTarget === FALLBACK_TARGET &&
124
- action.actionTargetSelector === FALLBACK_SELECTOR)).toEqual(false);
125
- });
126
- (0, vitest_1.test)('with policy', async () => {
127
- const call = await (0, smart_sessions_2.getEnableSessionCall)({
128
- owners: {
129
- type: 'ecdsa',
130
- accounts: [consts_1.accountA],
131
- },
132
- policies: [
133
- {
134
- type: 'sudo',
135
- },
136
- {
137
- type: 'universal-action',
138
- rules: [
139
- {
140
- condition: 'equal',
141
- calldataOffset: 0n,
142
- referenceValue: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
143
- },
144
- ],
145
- },
146
- ],
147
- });
148
- const sessionData = toSessionData(call);
149
- // Should have two policies
150
- (0, vitest_1.expect)(sessionData.userOpPolicies.length).toEqual(2);
151
- (0, vitest_1.expect)((0, viem_1.isAddress)(sessionData.userOpPolicies[0].policy)).toEqual(true);
152
- (0, vitest_1.expect)((0, viem_1.isHex)(sessionData.userOpPolicies[0].initData)).toEqual(true);
153
- (0, vitest_1.expect)((0, viem_1.isAddress)(sessionData.userOpPolicies[1].policy)).toEqual(true);
154
- (0, vitest_1.expect)((0, viem_1.isHex)(sessionData.userOpPolicies[1].initData)).toEqual(true);
155
- });
156
- (0, vitest_1.test)('with action policy', async () => {
157
- const call = await (0, smart_sessions_2.getEnableSessionCall)({
158
- owners: {
159
- type: 'ecdsa',
160
- accounts: [consts_1.accountA],
161
- },
162
- actions: [
163
- {
164
- target: TARGET,
165
- selector: SELECTOR,
166
- policies: [
167
- {
168
- type: 'sudo',
169
- },
170
- {
171
- type: 'universal-action',
172
- rules: [
173
- {
174
- condition: 'equal',
175
- calldataOffset: 0n,
176
- referenceValue: '0xd8da6bf26964af9d7eed9e03e53415d37aa96045',
177
- },
178
- ],
179
- },
180
- ],
181
- },
182
- ],
183
- });
184
- const sessionData = toSessionData(call);
185
- // Should have the action
186
- const action = sessionData.actions.find((action) => action.actionTarget === TARGET &&
187
- action.actionTargetSelector === SELECTOR);
188
- (0, vitest_1.expect)(action).toBeDefined();
189
- if (!action) {
190
- throw new Error('No action');
191
- }
192
- // Should have 2 policies
193
- const actionPolicies = action.actionPolicies;
194
- (0, vitest_1.expect)(actionPolicies.length).toEqual(2);
195
- (0, vitest_1.expect)((0, viem_1.isAddress)(actionPolicies[0].policy)).toEqual(true);
196
- (0, vitest_1.expect)((0, viem_1.isHex)(actionPolicies[0].initData)).toEqual(true);
197
- (0, vitest_1.expect)((0, viem_1.isAddress)(actionPolicies[1].policy)).toEqual(true);
198
- (0, vitest_1.expect)((0, viem_1.isHex)(actionPolicies[1].initData)).toEqual(true);
199
- });
200
- function toSessionData(call) {
201
- (0, vitest_1.expect)((0, viem_1.isHex)(call.data)).toEqual(true);
202
- (0, vitest_1.expect)((0, viem_1.isAddress)(call.to)).toEqual(true);
203
- const decoded = (0, viem_1.decodeFunctionData)({
204
- abi: smart_sessions_1.enableSessionsAbi,
205
- data: call.data,
206
- });
207
- (0, vitest_1.expect)(decoded.functionName).toEqual('enableSessions');
208
- (0, vitest_1.expect)(decoded.args.length).toEqual(1);
209
- (0, vitest_1.expect)(decoded.args[0].length).toEqual(1);
210
- const session = decoded.args[0][0];
211
- return session;
212
- }
213
- });
214
- (0, vitest_1.describe)('Encode Smart Session Signature', () => {
215
- (0, vitest_1.test)('use mode', () => {
216
- const permissionId = '0xd3b39024e437b4cac278e33965b9a9326e81ee46bd45d890adbfc8eb45412fa1';
217
- const signature = '0xabcdef';
218
- const sessionSignature = (0, smart_sessions_2.encodeSmartSessionSignature)(smart_sessions_2.SMART_SESSION_MODE_USE, permissionId, signature);
219
- (0, vitest_1.expect)(sessionSignature).toEqual('0x00d3b39024e437b4cac278e33965b9a9326e81ee46bd45d890adbfc8eb45412fa1abcdef');
220
- });
221
- });
222
- });