@charterlabs/rhinestone-sdk 0.3.1 → 0.3.2
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/README.md +31 -200
- package/dist/src/accounts/index.d.ts +3 -2
- package/dist/src/accounts/index.d.ts.map +1 -1
- package/dist/src/accounts/index.js +14 -6
- package/dist/src/accounts/signing/common.d.ts.map +1 -1
- package/dist/src/accounts/signing/common.js +9 -18
- package/dist/src/actions/compact.d.ts +2 -1
- package/dist/src/actions/compact.d.ts.map +1 -1
- package/dist/src/actions/compact.js +3 -1
- package/dist/src/actions/smart-sessions.d.ts +11 -1
- package/dist/src/actions/smart-sessions.d.ts.map +1 -1
- package/dist/src/actions/smart-sessions.js +33 -0
- package/dist/src/errors/index.d.ts +2 -2
- package/dist/src/errors/index.d.ts.map +1 -1
- package/dist/src/errors/index.js +2 -1
- package/dist/src/execution/compact.d.ts +3 -1
- package/dist/src/execution/compact.d.ts.map +1 -1
- package/dist/src/execution/compact.js +5 -1
- package/dist/src/execution/error.d.ts +1 -0
- package/dist/src/execution/error.d.ts.map +1 -1
- package/dist/src/execution/index.d.ts +3 -3
- package/dist/src/execution/index.d.ts.map +1 -1
- package/dist/src/execution/index.js +16 -11
- package/dist/src/execution/utils.d.ts +9 -7
- package/dist/src/execution/utils.d.ts.map +1 -1
- package/dist/src/execution/utils.js +85 -14
- package/dist/src/index.d.ts +6 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +13 -11
- package/dist/src/modules/index.d.ts +2 -2
- package/dist/src/modules/index.d.ts.map +1 -1
- package/dist/src/modules/index.js +2 -1
- package/dist/src/modules/validators/core.d.ts +2 -1
- package/dist/src/modules/validators/core.d.ts.map +1 -1
- package/dist/src/modules/validators/core.js +4 -3
- package/dist/src/modules/validators/smart-sessions.d.ts +9 -5
- package/dist/src/modules/validators/smart-sessions.d.ts.map +1 -1
- package/dist/src/modules/validators/smart-sessions.js +383 -22
- package/dist/src/orchestrator/client.d.ts +2 -7
- package/dist/src/orchestrator/client.d.ts.map +1 -1
- package/dist/src/orchestrator/client.js +49 -43
- package/dist/src/orchestrator/error.d.ts +11 -1
- package/dist/src/orchestrator/error.d.ts.map +1 -1
- package/dist/src/orchestrator/error.js +16 -1
- package/dist/src/orchestrator/index.d.ts +4 -4
- package/dist/src/orchestrator/index.d.ts.map +1 -1
- package/dist/src/orchestrator/index.js +2 -1
- package/dist/src/orchestrator/registry.d.ts +1 -1
- package/dist/src/orchestrator/registry.d.ts.map +1 -1
- package/dist/src/orchestrator/registry.js +3 -14
- package/dist/src/orchestrator/registry.test.js +5 -1
- package/dist/src/orchestrator/types.d.ts +26 -4
- package/dist/src/orchestrator/types.d.ts.map +1 -1
- package/dist/src/orchestrator/types.js +15 -1
- package/dist/src/types.d.ts +30 -11
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type Address, type Hex, type TypedDataDefinition } from 'viem';
|
|
2
|
-
import type { RhinestoneAccountConfig, Session } from '../../types';
|
|
2
|
+
import type { ProviderConfig, RhinestoneAccountConfig, Session, SignerSet } from '../../types';
|
|
3
3
|
import { type Module } from '../common';
|
|
4
|
+
import { SMART_SESSION_EMISSARY_ADDRESS } from './core';
|
|
4
5
|
interface SessionData {
|
|
5
6
|
sessionValidator: Address;
|
|
6
7
|
sessionValidatorInitData: Hex;
|
|
@@ -29,7 +30,7 @@ interface PolicyData {
|
|
|
29
30
|
policy: Address;
|
|
30
31
|
initData: Hex;
|
|
31
32
|
}
|
|
32
|
-
type SmartSessionModeType = typeof SMART_SESSION_MODE_USE | typeof SMART_SESSION_MODE_ENABLE
|
|
33
|
+
type SmartSessionModeType = typeof SMART_SESSION_MODE_USE | typeof SMART_SESSION_MODE_ENABLE;
|
|
33
34
|
interface ChainDigest {
|
|
34
35
|
chainId: bigint;
|
|
35
36
|
sessionDigest: Hex;
|
|
@@ -158,14 +159,17 @@ declare const types: {
|
|
|
158
159
|
readonly type: "ChainSession[]";
|
|
159
160
|
}];
|
|
160
161
|
};
|
|
161
|
-
declare const SMART_SESSION_EMISSARY_ADDRESS: Address;
|
|
162
162
|
declare const SMART_SESSION_MODE_USE = "0x00";
|
|
163
163
|
declare const SMART_SESSION_MODE_ENABLE = "0x01";
|
|
164
|
-
declare const SMART_SESSION_MODE_UNSAFE_ENABLE = "0x02";
|
|
165
164
|
declare const SMART_SESSIONS_FALLBACK_TARGET_FLAG: Address;
|
|
166
165
|
declare const SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG: Hex;
|
|
167
166
|
declare const SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION: Hex;
|
|
167
|
+
declare function packSignature(signers: SignerSet & {
|
|
168
|
+
type: 'experimental_session';
|
|
169
|
+
}, validatorSignature: Hex): Hex;
|
|
168
170
|
declare function getSessionDetails(account: Address, sessions: Session[]): Promise<SessionDetails>;
|
|
171
|
+
declare function isSessionEnabled(account: Address, provider: ProviderConfig | undefined, session: Session): Promise<boolean>;
|
|
172
|
+
declare function signEnableSession(config: RhinestoneAccountConfig, details: SessionDetails): Promise<Hex>;
|
|
169
173
|
declare function getEnableSessionCall(account: Address, session: Session, enableSessionSignature: Hex, hashesAndChainIds: {
|
|
170
174
|
chainId: bigint;
|
|
171
175
|
sessionDigest: Hex;
|
|
@@ -176,6 +180,6 @@ declare function getEnableSessionCall(account: Address, session: Session, enable
|
|
|
176
180
|
declare function getSessionData(session: Session): SessionData;
|
|
177
181
|
declare function getPermissionId(session: Session): `0x${string}`;
|
|
178
182
|
declare function getSmartSessionValidator(config: RhinestoneAccountConfig): Module | null;
|
|
179
|
-
export { SMART_SESSION_EMISSARY_ADDRESS, SMART_SESSIONS_FALLBACK_TARGET_FLAG, SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG, SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION, getSessionData, getEnableSessionCall, getPermissionId, getSmartSessionValidator, getSessionDetails, };
|
|
183
|
+
export { SMART_SESSION_EMISSARY_ADDRESS, SMART_SESSIONS_FALLBACK_TARGET_FLAG, SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG, SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION, packSignature, getSessionData, getEnableSessionCall, getPermissionId, getSmartSessionValidator, getSessionDetails, isSessionEnabled, signEnableSession, };
|
|
180
184
|
export type { ChainSession, ChainDigest, SessionData, SmartSessionModeType, SessionDetails, };
|
|
181
185
|
//# sourceMappingURL=smart-sessions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-sessions.d.ts","sourceRoot":"","sources":["../../../../modules/validators/smart-sessions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"smart-sessions.d.ts","sourceRoot":"","sources":["../../../../modules/validators/smart-sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,16 +4,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION = exports.SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG = exports.SMART_SESSIONS_FALLBACK_TARGET_FLAG = exports.SMART_SESSION_EMISSARY_ADDRESS = void 0;
|
|
7
|
+
exports.packSignature = packSignature;
|
|
7
8
|
exports.getSessionData = getSessionData;
|
|
8
9
|
exports.getEnableSessionCall = getEnableSessionCall;
|
|
9
10
|
exports.getPermissionId = getPermissionId;
|
|
10
11
|
exports.getSmartSessionValidator = getSmartSessionValidator;
|
|
11
12
|
exports.getSessionDetails = getSessionDetails;
|
|
13
|
+
exports.isSessionEnabled = isSessionEnabled;
|
|
14
|
+
exports.signEnableSession = signEnableSession;
|
|
15
|
+
const solady_1 = require("solady");
|
|
12
16
|
const viem_1 = require("viem");
|
|
13
|
-
const
|
|
17
|
+
const chains_1 = require("viem/chains");
|
|
18
|
+
const utils_1 = require("../../accounts/utils");
|
|
19
|
+
const compact_1 = require("../../execution/compact");
|
|
20
|
+
const utils_2 = require("../../execution/utils");
|
|
14
21
|
const smart_session_emissary_1 = __importDefault(require("../abi/smart-session-emissary"));
|
|
15
22
|
const common_1 = require("../common");
|
|
16
23
|
const core_1 = require("./core");
|
|
24
|
+
Object.defineProperty(exports, "SMART_SESSION_EMISSARY_ADDRESS", { enumerable: true, get: function () { return core_1.SMART_SESSION_EMISSARY_ADDRESS; } });
|
|
17
25
|
const types = {
|
|
18
26
|
PolicyData: [
|
|
19
27
|
{ name: 'policy', type: 'address' },
|
|
@@ -58,42 +66,190 @@ const types = {
|
|
|
58
66
|
],
|
|
59
67
|
MultiChainSession: [{ name: 'sessionsAndChainIds', type: 'ChainSession[]' }],
|
|
60
68
|
};
|
|
61
|
-
const SMART_SESSION_EMISSARY_ADDRESS = '0x4411abbbede0215626284d0385dd55b4303012b7';
|
|
62
|
-
exports.SMART_SESSION_EMISSARY_ADDRESS = SMART_SESSION_EMISSARY_ADDRESS;
|
|
63
69
|
const SMART_SESSION_MODE_USE = '0x00';
|
|
64
70
|
const SMART_SESSION_MODE_ENABLE = '0x01';
|
|
65
|
-
const SMART_SESSION_MODE_UNSAFE_ENABLE = '0x02';
|
|
66
|
-
const SUDO_POLICY_ADDRESS = '0x0000003111cD8e92337C100F22B7A9dbf8DEE301';
|
|
67
71
|
const SMART_SESSIONS_FALLBACK_TARGET_FLAG = '0x0000000000000000000000000000000000000001';
|
|
68
72
|
exports.SMART_SESSIONS_FALLBACK_TARGET_FLAG = SMART_SESSIONS_FALLBACK_TARGET_FLAG;
|
|
69
73
|
const SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG = '0x00000001';
|
|
70
74
|
exports.SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG = SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG;
|
|
71
75
|
const SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION = '0x00000002';
|
|
72
76
|
exports.SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION = SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION;
|
|
73
|
-
const
|
|
74
|
-
const
|
|
77
|
+
const SPENDING_LIMITS_POLICY_ADDRESS = '0x00000088d48cf102a8cdb0137a9b173f957c6343';
|
|
78
|
+
const TIME_FRAME_POLICY_ADDRESS = '0x8177451511de0577b911c254e9551d981c26dc72';
|
|
79
|
+
const SUDO_POLICY_ADDRESS = '0x0000003111cd8e92337c100f22b7a9dbf8dee301';
|
|
80
|
+
const UNIVERSAL_ACTION_POLICY_ADDRESS = '0x0000006dda6c463511c4e9b05cfc34c1247fcf1f';
|
|
81
|
+
const USAGE_LIMIT_POLICY_ADDRESS = '0x1f34ef8311345a3a4a4566af321b313052f51493';
|
|
82
|
+
const VALUE_LIMIT_POLICY_ADDRESS = '0x730da93267e7e513e932301b47f2ac7d062abc83';
|
|
83
|
+
const ACTION_CONDITION_EQUAL = 0;
|
|
84
|
+
const ACTION_CONDITION_GREATER_THAN = 1;
|
|
85
|
+
const ACTION_CONDITION_LESS_THAN = 2;
|
|
86
|
+
const ACTION_CONDITION_GREATER_THAN_OR_EQUAL = 3;
|
|
87
|
+
const ACTION_CONDITION_LESS_THAN_OR_EQUAL = 4;
|
|
88
|
+
const ACTION_CONDITION_NOT_EQUAL = 5;
|
|
89
|
+
const ACTION_CONDITION_IN_RANGE = 6;
|
|
90
|
+
function packSignature(signers, validatorSignature) {
|
|
91
|
+
const session = signers.session;
|
|
92
|
+
const permissionId = getPermissionId(session);
|
|
93
|
+
if (signers.verifyExecutions) {
|
|
94
|
+
const smartSessionMode = signers.enableData
|
|
95
|
+
? SMART_SESSION_MODE_ENABLE
|
|
96
|
+
: SMART_SESSION_MODE_USE;
|
|
97
|
+
const sessionData = getSessionData(signers.session);
|
|
98
|
+
const packedSignature = signers.enableData
|
|
99
|
+
? solady_1.LibZip.flzCompress((0, viem_1.encodeAbiParameters)([
|
|
100
|
+
{
|
|
101
|
+
type: 'tuple',
|
|
102
|
+
name: 'enableData',
|
|
103
|
+
components: [
|
|
104
|
+
{ type: 'bytes', name: 'allocatorSig' },
|
|
105
|
+
{ type: 'bytes', name: 'userSig' },
|
|
106
|
+
{ type: 'uint256', name: 'expires' },
|
|
107
|
+
{
|
|
108
|
+
type: 'tuple',
|
|
109
|
+
name: 'enableSession',
|
|
110
|
+
components: [
|
|
111
|
+
{
|
|
112
|
+
type: 'uint8',
|
|
113
|
+
name: 'chainDigestIndex',
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
type: 'tuple[]',
|
|
117
|
+
name: 'hashesAndChainIds',
|
|
118
|
+
components: [
|
|
119
|
+
{ type: 'uint64', name: 'chainId' },
|
|
120
|
+
{ type: 'bytes32', name: 'sessionDigest' },
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
type: 'tuple',
|
|
125
|
+
name: 'session',
|
|
126
|
+
components: [
|
|
127
|
+
{ type: 'address', name: 'sessionValidator' },
|
|
128
|
+
{ type: 'bytes', name: 'sessionValidatorInitData' },
|
|
129
|
+
{ type: 'bytes32', name: 'salt' },
|
|
130
|
+
{
|
|
131
|
+
type: 'tuple[]',
|
|
132
|
+
name: 'actions',
|
|
133
|
+
components: [
|
|
134
|
+
{ type: 'bytes4', name: 'actionTargetSelector' },
|
|
135
|
+
{ type: 'address', name: 'actionTarget' },
|
|
136
|
+
{
|
|
137
|
+
type: 'tuple[]',
|
|
138
|
+
name: 'actionPolicies',
|
|
139
|
+
components: [
|
|
140
|
+
{ type: 'address', name: 'policy' },
|
|
141
|
+
{ type: 'bytes', name: 'initData' },
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
type: 'tuple[]',
|
|
148
|
+
name: 'claimPolicies',
|
|
149
|
+
components: [
|
|
150
|
+
{ type: 'address', name: 'policy' },
|
|
151
|
+
{ type: 'bytes', name: 'initData' },
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'tuple',
|
|
156
|
+
name: 'erc7739Policies',
|
|
157
|
+
components: [
|
|
158
|
+
{
|
|
159
|
+
type: 'tuple[]',
|
|
160
|
+
name: 'allowedERC7739Content',
|
|
161
|
+
components: [
|
|
162
|
+
{
|
|
163
|
+
type: 'bytes32',
|
|
164
|
+
name: 'appDomainSeparator',
|
|
165
|
+
},
|
|
166
|
+
{ type: 'string[]', name: 'contentNames' },
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
type: 'tuple[]',
|
|
171
|
+
name: 'erc1271Policies',
|
|
172
|
+
components: [
|
|
173
|
+
{ type: 'address', name: 'policy' },
|
|
174
|
+
{ type: 'bytes', name: 'initData' },
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
],
|
|
178
|
+
},
|
|
179
|
+
],
|
|
180
|
+
},
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
],
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
type: 'tuple',
|
|
187
|
+
name: 'config',
|
|
188
|
+
components: [
|
|
189
|
+
{ type: 'uint8', name: 'scope' },
|
|
190
|
+
{ type: 'uint8', name: 'resetPeriod' },
|
|
191
|
+
{ type: 'address', name: 'allocator' },
|
|
192
|
+
{ type: 'bytes32', name: 'permissionId' },
|
|
193
|
+
],
|
|
194
|
+
},
|
|
195
|
+
{ type: 'bytes' },
|
|
196
|
+
], [
|
|
197
|
+
{
|
|
198
|
+
allocatorSig: viem_1.zeroHash,
|
|
199
|
+
userSig: signers.enableData.userSignature,
|
|
200
|
+
expires: viem_1.maxUint256,
|
|
201
|
+
enableSession: {
|
|
202
|
+
chainDigestIndex: signers.enableData.sessionToEnableIndex,
|
|
203
|
+
hashesAndChainIds: signers.enableData.hashesAndChainIds,
|
|
204
|
+
session: sessionData,
|
|
205
|
+
},
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
scope: compact_1.SCOPE_MULTICHAIN,
|
|
209
|
+
resetPeriod: compact_1.RESET_PERIOD_ONE_WEEK,
|
|
210
|
+
allocator: viem_1.zeroAddress,
|
|
211
|
+
permissionId: getPermissionId(signers.session),
|
|
212
|
+
},
|
|
213
|
+
validatorSignature,
|
|
214
|
+
]))
|
|
215
|
+
: validatorSignature;
|
|
216
|
+
return signers.enableData
|
|
217
|
+
? (0, viem_1.encodePacked)(['bytes1', 'bytes'], [smartSessionMode, packedSignature])
|
|
218
|
+
: (0, viem_1.encodePacked)(['bytes1', 'bytes32', 'bytes'], [smartSessionMode, permissionId, packedSignature]);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
const SIGNATURE_IS_VALID_SIG_1271 = '0x00';
|
|
222
|
+
const policyDataOffset = BigInt(64 + (0, viem_1.size)(validatorSignature));
|
|
223
|
+
const mode = SIGNATURE_IS_VALID_SIG_1271;
|
|
224
|
+
const policySpecificData = '0x';
|
|
225
|
+
const signature = (0, viem_1.encodePacked)(['bytes1', 'bytes32', 'uint256', 'bytes', 'bytes'], [
|
|
226
|
+
mode,
|
|
227
|
+
permissionId,
|
|
228
|
+
policyDataOffset,
|
|
229
|
+
validatorSignature,
|
|
230
|
+
policySpecificData,
|
|
231
|
+
]);
|
|
232
|
+
return signature;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
75
235
|
async function getSessionDetails(account, sessions) {
|
|
76
|
-
const lockTag =
|
|
236
|
+
const lockTag = '0x000000000000000000000000';
|
|
77
237
|
const sessionNonces = await Promise.all(sessions.map((session) => getSessionNonce(account, session, lockTag)));
|
|
78
238
|
const sessionDatas = sessions.map((session) => getSessionData(session));
|
|
79
239
|
const signedSessions = sessionDatas.map((session, index) => getSignedSession(account, lockTag, session, sessionNonces[index]));
|
|
80
240
|
const chains = sessions.map((session) => session.chain);
|
|
81
|
-
const
|
|
241
|
+
const hashesAndChainIds = signedSessions.map((session, index) => ({
|
|
82
242
|
chainId: BigInt(chains[index].id),
|
|
83
243
|
sessionDigest: (0, viem_1.hashStruct)({
|
|
84
|
-
types
|
|
244
|
+
types,
|
|
85
245
|
primaryType: 'SignedSession',
|
|
86
246
|
data: session,
|
|
87
247
|
}),
|
|
88
248
|
}));
|
|
89
|
-
const hashesAndChainIds = chainDigests.map((chainDigest) => ({
|
|
90
|
-
chainId: BigInt(chainDigest.chainId),
|
|
91
|
-
sessionDigest: chainDigest.sessionDigest,
|
|
92
|
-
}));
|
|
93
249
|
const data = {
|
|
94
250
|
domain: {
|
|
95
251
|
name: 'SmartSessionEmissary',
|
|
96
|
-
version: '1
|
|
252
|
+
version: '1',
|
|
97
253
|
},
|
|
98
254
|
types: types,
|
|
99
255
|
primaryType: 'MultiChainSession',
|
|
@@ -110,13 +266,42 @@ async function getSessionDetails(account, sessions) {
|
|
|
110
266
|
data,
|
|
111
267
|
};
|
|
112
268
|
}
|
|
269
|
+
async function isSessionEnabled(account, provider, session) {
|
|
270
|
+
const publicClient = (0, viem_1.createPublicClient)({
|
|
271
|
+
chain: session.chain,
|
|
272
|
+
transport: (0, utils_1.createTransport)(session.chain, provider),
|
|
273
|
+
});
|
|
274
|
+
const isEnabled = await publicClient.readContract({
|
|
275
|
+
address: core_1.SMART_SESSION_EMISSARY_ADDRESS,
|
|
276
|
+
abi: [
|
|
277
|
+
{
|
|
278
|
+
type: 'function',
|
|
279
|
+
name: 'isPermissionEnabled',
|
|
280
|
+
inputs: [
|
|
281
|
+
{ name: 'account', type: 'address' },
|
|
282
|
+
{ name: 'permissionId', type: 'bytes32' },
|
|
283
|
+
],
|
|
284
|
+
outputs: [{ name: 'isEnabled', type: 'bool' }],
|
|
285
|
+
stateMutability: 'view',
|
|
286
|
+
},
|
|
287
|
+
],
|
|
288
|
+
functionName: 'isPermissionEnabled',
|
|
289
|
+
args: [account, getPermissionId(session)],
|
|
290
|
+
});
|
|
291
|
+
return isEnabled;
|
|
292
|
+
}
|
|
293
|
+
async function signEnableSession(config, details) {
|
|
294
|
+
return (0, utils_2.signTypedData)(config, details.data, chains_1.mainnet, undefined, {
|
|
295
|
+
skipErc6492: true,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
113
298
|
async function getSessionNonce(account, session, lockTag) {
|
|
114
299
|
const publicClient = (0, viem_1.createPublicClient)({
|
|
115
300
|
chain: session.chain,
|
|
116
301
|
transport: (0, viem_1.http)(),
|
|
117
302
|
});
|
|
118
303
|
const nonce = await publicClient.readContract({
|
|
119
|
-
address: SMART_SESSION_EMISSARY_ADDRESS,
|
|
304
|
+
address: core_1.SMART_SESSION_EMISSARY_ADDRESS,
|
|
120
305
|
abi: [
|
|
121
306
|
{
|
|
122
307
|
type: 'function',
|
|
@@ -157,7 +342,7 @@ function getSignedSession(account, lockTag, session, nonce) {
|
|
|
157
342
|
sessionValidator: session.sessionValidator,
|
|
158
343
|
sessionValidatorInitData: session.sessionValidatorInitData,
|
|
159
344
|
salt: session.salt,
|
|
160
|
-
smartSessionEmissary: SMART_SESSION_EMISSARY_ADDRESS,
|
|
345
|
+
smartSessionEmissary: core_1.SMART_SESSION_EMISSARY_ADDRESS,
|
|
161
346
|
expires: viem_1.maxUint256,
|
|
162
347
|
nonce,
|
|
163
348
|
};
|
|
@@ -166,15 +351,15 @@ async function getEnableSessionCall(account, session, enableSessionSignature, ha
|
|
|
166
351
|
const sessionData = getSessionData(session);
|
|
167
352
|
const permissionId = getPermissionId(session);
|
|
168
353
|
return {
|
|
169
|
-
to: SMART_SESSION_EMISSARY_ADDRESS,
|
|
354
|
+
to: core_1.SMART_SESSION_EMISSARY_ADDRESS,
|
|
170
355
|
data: (0, viem_1.encodeFunctionData)({
|
|
171
356
|
abi: smart_session_emissary_1.default,
|
|
172
357
|
functionName: 'setConfig',
|
|
173
358
|
args: [
|
|
174
359
|
account,
|
|
175
360
|
{
|
|
176
|
-
scope: SCOPE_MULTICHAIN,
|
|
177
|
-
resetPeriod: RESET_PERIOD_ONE_WEEK,
|
|
361
|
+
scope: compact_1.SCOPE_MULTICHAIN,
|
|
362
|
+
resetPeriod: compact_1.RESET_PERIOD_ONE_WEEK,
|
|
178
363
|
allocator: viem_1.zeroAddress,
|
|
179
364
|
permissionId,
|
|
180
365
|
},
|
|
@@ -209,12 +394,34 @@ function getSessionData(session) {
|
|
|
209
394
|
},
|
|
210
395
|
],
|
|
211
396
|
};
|
|
397
|
+
const sudoAction = {
|
|
398
|
+
actionTargetSelector: SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG,
|
|
399
|
+
actionTarget: SMART_SESSIONS_FALLBACK_TARGET_FLAG,
|
|
400
|
+
actionPolicies: [
|
|
401
|
+
{
|
|
402
|
+
policy: SUDO_POLICY_ADDRESS,
|
|
403
|
+
initData: '0x',
|
|
404
|
+
},
|
|
405
|
+
],
|
|
406
|
+
};
|
|
407
|
+
const actions = session.actions
|
|
408
|
+
? session.actions.map((action) => ({
|
|
409
|
+
actionTargetSelector: action.selector ?? SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG,
|
|
410
|
+
actionTarget: action.target ?? SMART_SESSIONS_FALLBACK_TARGET_FLAG,
|
|
411
|
+
actionPolicies: action.policies?.map((policy) => getPolicyData(policy)) ?? [
|
|
412
|
+
{
|
|
413
|
+
policy: SUDO_POLICY_ADDRESS,
|
|
414
|
+
initData: '0x',
|
|
415
|
+
},
|
|
416
|
+
],
|
|
417
|
+
}))
|
|
418
|
+
: [sudoAction];
|
|
212
419
|
return {
|
|
213
420
|
sessionValidator: validator.address,
|
|
214
421
|
salt: viem_1.zeroHash,
|
|
215
422
|
sessionValidatorInitData: validator.initData,
|
|
216
423
|
erc7739Policies: erc7739Data,
|
|
217
|
-
actions
|
|
424
|
+
actions,
|
|
218
425
|
claimPolicies: [],
|
|
219
426
|
};
|
|
220
427
|
}
|
|
@@ -239,6 +446,157 @@ function getPermissionId(session) {
|
|
|
239
446
|
sessionData.salt,
|
|
240
447
|
]));
|
|
241
448
|
}
|
|
449
|
+
function getPolicyData(policy) {
|
|
450
|
+
switch (policy.type) {
|
|
451
|
+
case 'sudo':
|
|
452
|
+
return {
|
|
453
|
+
policy: SUDO_POLICY_ADDRESS,
|
|
454
|
+
initData: '0x',
|
|
455
|
+
};
|
|
456
|
+
case 'universal-action': {
|
|
457
|
+
function getCondition(condition) {
|
|
458
|
+
switch (condition) {
|
|
459
|
+
case 'equal':
|
|
460
|
+
return ACTION_CONDITION_EQUAL;
|
|
461
|
+
case 'greaterThan':
|
|
462
|
+
return ACTION_CONDITION_GREATER_THAN;
|
|
463
|
+
case 'lessThan':
|
|
464
|
+
return ACTION_CONDITION_LESS_THAN;
|
|
465
|
+
case 'greaterThanOrEqual':
|
|
466
|
+
return ACTION_CONDITION_GREATER_THAN_OR_EQUAL;
|
|
467
|
+
case 'lessThanOrEqual':
|
|
468
|
+
return ACTION_CONDITION_LESS_THAN_OR_EQUAL;
|
|
469
|
+
case 'notEqual':
|
|
470
|
+
return ACTION_CONDITION_NOT_EQUAL;
|
|
471
|
+
case 'inRange':
|
|
472
|
+
return ACTION_CONDITION_IN_RANGE;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
const MAX_RULES = 16;
|
|
476
|
+
const rules = createFixedArray(MAX_RULES, () => ({
|
|
477
|
+
condition: ACTION_CONDITION_EQUAL,
|
|
478
|
+
offset: 0n,
|
|
479
|
+
isLimited: false,
|
|
480
|
+
ref: viem_1.zeroHash,
|
|
481
|
+
usage: { limit: 0n, used: 0n },
|
|
482
|
+
}));
|
|
483
|
+
for (let i = 0; i < policy.rules.length; i++) {
|
|
484
|
+
const rule = policy.rules[i];
|
|
485
|
+
const ref = (0, viem_1.isHex)(rule.referenceValue)
|
|
486
|
+
? (0, viem_1.padHex)(rule.referenceValue)
|
|
487
|
+
: (0, viem_1.toHex)(rule.referenceValue, { size: 32 });
|
|
488
|
+
rules[i] = {
|
|
489
|
+
condition: getCondition(rule.condition),
|
|
490
|
+
offset: rule.calldataOffset,
|
|
491
|
+
isLimited: rule.usageLimit !== undefined,
|
|
492
|
+
ref,
|
|
493
|
+
usage: {
|
|
494
|
+
limit: rule.usageLimit ? rule.usageLimit : 0n,
|
|
495
|
+
used: 0n,
|
|
496
|
+
},
|
|
497
|
+
};
|
|
498
|
+
}
|
|
499
|
+
return {
|
|
500
|
+
policy: UNIVERSAL_ACTION_POLICY_ADDRESS,
|
|
501
|
+
initData: (0, viem_1.encodeAbiParameters)([
|
|
502
|
+
{
|
|
503
|
+
components: [
|
|
504
|
+
{
|
|
505
|
+
name: 'valueLimitPerUse',
|
|
506
|
+
type: 'uint256',
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
components: [
|
|
510
|
+
{
|
|
511
|
+
name: 'length',
|
|
512
|
+
type: 'uint256',
|
|
513
|
+
},
|
|
514
|
+
{
|
|
515
|
+
components: [
|
|
516
|
+
{
|
|
517
|
+
name: 'condition',
|
|
518
|
+
type: 'uint8',
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
name: 'offset',
|
|
522
|
+
type: 'uint64',
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
name: 'isLimited',
|
|
526
|
+
type: 'bool',
|
|
527
|
+
},
|
|
528
|
+
{
|
|
529
|
+
name: 'ref',
|
|
530
|
+
type: 'bytes32',
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
components: [
|
|
534
|
+
{
|
|
535
|
+
name: 'limit',
|
|
536
|
+
type: 'uint256',
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
name: 'used',
|
|
540
|
+
type: 'uint256',
|
|
541
|
+
},
|
|
542
|
+
],
|
|
543
|
+
name: 'usage',
|
|
544
|
+
type: 'tuple',
|
|
545
|
+
},
|
|
546
|
+
],
|
|
547
|
+
name: 'rules',
|
|
548
|
+
type: 'tuple[16]',
|
|
549
|
+
},
|
|
550
|
+
],
|
|
551
|
+
name: 'paramRules',
|
|
552
|
+
type: 'tuple',
|
|
553
|
+
},
|
|
554
|
+
],
|
|
555
|
+
name: 'ActionConfig',
|
|
556
|
+
type: 'tuple',
|
|
557
|
+
},
|
|
558
|
+
], [
|
|
559
|
+
{
|
|
560
|
+
valueLimitPerUse: policy.valueLimitPerUse ?? 0n,
|
|
561
|
+
paramRules: {
|
|
562
|
+
length: BigInt(policy.rules.length),
|
|
563
|
+
rules: rules,
|
|
564
|
+
},
|
|
565
|
+
},
|
|
566
|
+
]),
|
|
567
|
+
};
|
|
568
|
+
}
|
|
569
|
+
case 'spending-limits': {
|
|
570
|
+
const tokens = policy.limits.map(({ token }) => token);
|
|
571
|
+
const limits = policy.limits.map(({ amount }) => amount);
|
|
572
|
+
return {
|
|
573
|
+
policy: SPENDING_LIMITS_POLICY_ADDRESS,
|
|
574
|
+
initData: (0, viem_1.encodeAbiParameters)([{ type: 'address[]' }, { type: 'uint256[]' }], [tokens, limits]),
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
case 'time-frame': {
|
|
578
|
+
return {
|
|
579
|
+
policy: TIME_FRAME_POLICY_ADDRESS,
|
|
580
|
+
initData: (0, viem_1.encodePacked)(['uint48', 'uint48'], [
|
|
581
|
+
Math.floor(policy.validUntil / 1000),
|
|
582
|
+
Math.floor(policy.validAfter / 1000),
|
|
583
|
+
]),
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
case 'usage-limit': {
|
|
587
|
+
return {
|
|
588
|
+
policy: USAGE_LIMIT_POLICY_ADDRESS,
|
|
589
|
+
initData: (0, viem_1.encodePacked)(['uint128'], [policy.limit]),
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
case 'value-limit': {
|
|
593
|
+
return {
|
|
594
|
+
policy: VALUE_LIMIT_POLICY_ADDRESS,
|
|
595
|
+
initData: (0, viem_1.encodeAbiParameters)([{ type: 'uint256' }], [policy.limit]),
|
|
596
|
+
};
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
242
600
|
function getSmartSessionValidator(config) {
|
|
243
601
|
if (!config.experimental_sessions) {
|
|
244
602
|
return null;
|
|
@@ -248,10 +606,13 @@ function getSmartSessionValidator(config) {
|
|
|
248
606
|
return null;
|
|
249
607
|
}
|
|
250
608
|
return {
|
|
251
|
-
address: module ?? SMART_SESSION_EMISSARY_ADDRESS,
|
|
609
|
+
address: module ?? core_1.SMART_SESSION_EMISSARY_ADDRESS,
|
|
252
610
|
initData: '0x',
|
|
253
611
|
deInitData: '0x',
|
|
254
612
|
additionalContext: '0x',
|
|
255
613
|
type: common_1.MODULE_TYPE_ID_VALIDATOR,
|
|
256
614
|
};
|
|
257
615
|
}
|
|
616
|
+
function createFixedArray(length, getValue) {
|
|
617
|
+
return Array.from({ length }, (_, i) => getValue(i));
|
|
618
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Address } from 'viem';
|
|
2
|
-
import type {
|
|
2
|
+
import type { IntentInput, IntentOpStatus, IntentResult, IntentRoute, Portfolio, SignedIntentOp, SplitIntentsInput, SplitIntentsResult } from './types';
|
|
3
3
|
export declare class Orchestrator {
|
|
4
4
|
private serverUrl;
|
|
5
5
|
private apiKey?;
|
|
@@ -10,13 +10,8 @@ export declare class Orchestrator {
|
|
|
10
10
|
[chainId: number]: Address[];
|
|
11
11
|
};
|
|
12
12
|
}): Promise<Portfolio>;
|
|
13
|
-
getMaxTokenAmount(account: {
|
|
14
|
-
address: Address;
|
|
15
|
-
accountType: AccountType;
|
|
16
|
-
setupOps: Pick<Execution, 'to' | 'data'>[];
|
|
17
|
-
}, destinationChainId: number, destinationTokenAddress: Address, destinationGasUnits: bigint, sponsored: boolean): Promise<bigint>;
|
|
18
|
-
getIntentCost(input: IntentInput): Promise<IntentCost>;
|
|
19
13
|
getIntentRoute(input: IntentInput): Promise<IntentRoute>;
|
|
14
|
+
splitIntents(input: SplitIntentsInput): Promise<SplitIntentsResult>;
|
|
20
15
|
submitIntent(signedIntentOpUnformatted: SignedIntentOp, dryRun: boolean): Promise<IntentResult>;
|
|
21
16
|
getIntentOpStatus(intentId: bigint): Promise<IntentOpStatus>;
|
|
22
17
|
private getHeaders;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../orchestrator/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../orchestrator/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AA0BnC,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,YAAY,EACZ,WAAW,EACX,SAAS,EAET,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,SAAS,CAAA;AAchB,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,MAAM,CAAC,CAAQ;gBAEX,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAKxC,YAAY,CAChB,WAAW,EAAE,OAAO,EACpB,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;QACnB,MAAM,CAAC,EAAE;YACP,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CAAA;SAC7B,CAAA;KACF,GACA,OAAO,CAAC,SAAS,CAAC;IA+Cf,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAQxD,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwDnE,YAAY,CAChB,yBAAyB,EAAE,cAAc,EACzC,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,YAAY,CAAC;IAgBlB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IASlE,OAAO,CAAC,UAAU;YAUJ,KAAK;IA4BnB,OAAO,CAAC,UAAU;IA6GlB,OAAO,CAAC,iBAAiB;CAmG1B"}
|