@charterlabs/rhinestone-sdk 0.3.8 → 0.4.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.
- package/README.md +89 -1
- package/dist/src/accounts/index.d.ts +6 -3
- package/dist/src/accounts/index.d.ts.map +1 -1
- package/dist/src/accounts/index.js +8 -2
- package/dist/src/accounts/json-rpc/providers.d.ts.map +1 -1
- package/dist/src/accounts/json-rpc/providers.js +3 -3
- package/dist/src/accounts/safe.d.ts.map +1 -1
- package/dist/src/accounts/safe.js +4 -1
- package/dist/src/accounts/signing/common.d.ts +10 -5
- package/dist/src/accounts/signing/common.d.ts.map +1 -1
- package/dist/src/accounts/signing/message.d.ts +3 -1
- package/dist/src/accounts/signing/message.d.ts.map +1 -1
- package/dist/src/accounts/startale.d.ts +3 -2
- package/dist/src/accounts/startale.d.ts.map +1 -1
- package/dist/src/accounts/startale.js +108 -19
- package/dist/src/accounts/utils.d.ts +1 -1
- package/dist/src/accounts/utils.d.ts.map +1 -1
- package/dist/src/auth/provider.d.ts +7 -0
- package/dist/src/auth/provider.d.ts.map +1 -0
- package/dist/src/auth/provider.js +41 -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/error.d.ts +9 -1
- package/dist/src/execution/error.d.ts.map +1 -1
- package/dist/src/execution/error.js +12 -1
- package/dist/src/execution/index.d.ts +6 -4
- package/dist/src/execution/index.d.ts.map +1 -1
- package/dist/src/execution/index.js +18 -15
- package/dist/src/execution/utils.d.ts +31 -7
- package/dist/src/execution/utils.d.ts.map +1 -1
- package/dist/src/execution/utils.js +317 -46
- package/dist/src/index.d.ts +5 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +13 -11
- package/dist/src/jwt-server/digest.d.ts +11 -0
- package/dist/src/jwt-server/digest.d.ts.map +1 -0
- package/dist/src/jwt-server/digest.js +22 -0
- package/dist/src/jwt-server/express.d.ts +16 -0
- package/dist/src/jwt-server/express.d.ts.map +1 -0
- package/dist/src/jwt-server/express.js +24 -0
- package/dist/src/jwt-server/handlers.d.ts +10 -0
- package/dist/src/jwt-server/handlers.d.ts.map +1 -0
- package/dist/src/jwt-server/handlers.js +41 -0
- package/dist/src/jwt-server/index.d.ts +8 -0
- package/dist/src/jwt-server/index.d.ts.map +1 -0
- package/dist/src/jwt-server/index.js +18 -0
- package/dist/src/jwt-server/jcs.d.ts +12 -0
- package/dist/src/jwt-server/jcs.d.ts.map +1 -0
- package/dist/src/jwt-server/jcs.js +60 -0
- package/dist/src/jwt-server/signer.d.ts +18 -0
- package/dist/src/jwt-server/signer.d.ts.map +1 -0
- package/dist/src/jwt-server/signer.js +71 -0
- package/dist/src/jwt-server/sponsorship.d.ts +19 -0
- package/dist/src/jwt-server/sponsorship.d.ts.map +1 -0
- package/dist/src/jwt-server/sponsorship.js +56 -0
- package/dist/src/jwt-server/web.d.ts +4 -0
- package/dist/src/jwt-server/web.d.ts.map +1 -0
- package/dist/src/jwt-server/web.js +27 -0
- package/dist/src/modules/validators/index.d.ts +2 -2
- package/dist/src/modules/validators/index.d.ts.map +1 -1
- package/dist/src/modules/validators/index.js +6 -1
- package/dist/src/modules/validators/policies/claim/permit2.d.ts +55 -0
- package/dist/src/modules/validators/policies/claim/permit2.d.ts.map +1 -0
- package/dist/src/modules/validators/policies/claim/permit2.js +239 -0
- package/dist/src/modules/validators/policies/claim/types.d.ts +12 -0
- package/dist/src/modules/validators/policies/claim/types.d.ts.map +1 -0
- package/dist/src/modules/validators/policies/claim/types.js +18 -0
- package/dist/src/modules/validators/smart-sessions.d.ts +30 -6
- package/dist/src/modules/validators/smart-sessions.d.ts.map +1 -1
- package/dist/src/modules/validators/smart-sessions.js +135 -12
- package/dist/src/orchestrator/client.d.ts +9 -4
- package/dist/src/orchestrator/client.d.ts.map +1 -1
- package/dist/src/orchestrator/client.js +29 -17
- package/dist/src/orchestrator/consts.d.ts +3 -2
- package/dist/src/orchestrator/consts.d.ts.map +1 -1
- package/dist/src/orchestrator/consts.js +4 -2
- package/dist/src/orchestrator/index.d.ts +4 -3
- package/dist/src/orchestrator/index.d.ts.map +1 -1
- package/dist/src/orchestrator/index.js +2 -2
- package/dist/src/orchestrator/registry.d.ts +2 -1
- package/dist/src/orchestrator/registry.d.ts.map +1 -1
- package/dist/src/orchestrator/registry.js +17 -1
- package/dist/src/orchestrator/types.d.ts +30 -2
- package/dist/src/orchestrator/types.d.ts.map +1 -1
- package/dist/src/types.d.ts +99 -10
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/index.d.ts +3 -9
- package/dist/src/utils/index.d.ts.map +1 -1
- package/package.json +18 -4
- package/dist/src/accounts/index.test.d.ts +0 -2
- package/dist/src/accounts/index.test.d.ts.map +0 -1
- package/dist/src/accounts/index.test.js +0 -33
- package/dist/src/accounts/json-rpc/index.test.d.ts +0 -2
- package/dist/src/accounts/json-rpc/index.test.d.ts.map +0 -1
- package/dist/src/accounts/json-rpc/index.test.js +0 -35
- package/dist/src/accounts/json-rpc/providers.test.d.ts +0 -2
- package/dist/src/accounts/json-rpc/providers.test.d.ts.map +0 -1
- package/dist/src/accounts/json-rpc/providers.test.js +0 -43
- package/dist/src/accounts/kernel.test.d.ts +0 -2
- package/dist/src/accounts/kernel.test.d.ts.map +0 -1
- package/dist/src/accounts/kernel.test.js +0 -132
- package/dist/src/accounts/nexus.test.d.ts +0 -2
- package/dist/src/accounts/nexus.test.d.ts.map +0 -1
- package/dist/src/accounts/nexus.test.js +0 -118
- package/dist/src/accounts/safe.test.d.ts +0 -2
- package/dist/src/accounts/safe.test.d.ts.map +0 -1
- package/dist/src/accounts/safe.test.js +0 -118
- package/dist/src/accounts/signing/passkeys.test.d.ts +0 -2
- package/dist/src/accounts/signing/passkeys.test.d.ts.map +0 -1
- package/dist/src/accounts/signing/passkeys.test.js +0 -88
- package/dist/src/accounts/startale.test.d.ts +0 -2
- package/dist/src/accounts/startale.test.d.ts.map +0 -1
- package/dist/src/accounts/startale.test.js +0 -92
- package/dist/src/accounts/utils.test.d.ts +0 -2
- package/dist/src/accounts/utils.test.d.ts.map +0 -1
- package/dist/src/accounts/utils.test.js +0 -49
- package/dist/src/actions/ecdsa.test.d.ts +0 -2
- package/dist/src/actions/ecdsa.test.d.ts.map +0 -1
- package/dist/src/actions/ecdsa.test.js +0 -99
- package/dist/src/actions/passkeys.test.d.ts +0 -2
- package/dist/src/actions/passkeys.test.d.ts.map +0 -1
- package/dist/src/actions/passkeys.test.js +0 -54
- package/dist/src/actions/recovery.test.d.ts +0 -2
- package/dist/src/actions/recovery.test.d.ts.map +0 -1
- package/dist/src/actions/recovery.test.js +0 -168
- package/dist/src/execution/utils.test.d.ts +0 -2
- package/dist/src/execution/utils.test.d.ts.map +0 -1
- package/dist/src/execution/utils.test.js +0 -49
- package/dist/src/modules/index.test.d.ts +0 -2
- package/dist/src/modules/index.test.d.ts.map +0 -1
- package/dist/src/modules/index.test.js +0 -81
- package/dist/src/modules/validators/core.test.d.ts +0 -2
- package/dist/src/modules/validators/core.test.d.ts.map +0 -1
- package/dist/src/modules/validators/core.test.js +0 -101
- package/dist/src/orchestrator/registry.test.d.ts +0 -2
- package/dist/src/orchestrator/registry.test.d.ts.map +0 -1
- package/dist/src/orchestrator/registry.test.js +0 -154
- package/dist/test/consts.d.ts +0 -10
- package/dist/test/consts.d.ts.map +0 -1
- package/dist/test/consts.js +0 -22
- package/dist/test/utils/utils.d.ts +0 -5
- package/dist/test/utils/utils.d.ts.map +0 -1
- package/dist/test/utils/utils.js +0 -20
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permit2.d.ts","sourceRoot":"","sources":["../../../../../../modules/validators/policies/claim/permit2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAIZ,KAAK,GAAG,EAKT,MAAM,MAAM,CAAA;AACb,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAiD3D,oFAAoF;AACpF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,SAAS;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACxD,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE;QACP,MAAM,EAAE;YACN,SAAS,EAAE,OAAO,CAAA;YAClB,QAAQ,EAAE,SAAS;gBAAE,KAAK,EAAE,OAAO,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAE,EAAE,CAAA;YACvD,WAAW,EAAE,MAAM,CAAA;YACnB,UAAU,EAAE,MAAM,CAAA;SACnB,CAAA;QACD,MAAM,EAAE,MAAM,CAAA;QACd,SAAS,EAAE;YACT,EAAE,EAAE,GAAG,CAAA;YACP,GAAG,EAAE,SAAS;gBAAE,EAAE,EAAE,OAAO,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,GAAG,CAAA;aAAE,EAAE,CAAA;SAC1D,CAAA;QACD,OAAO,EAAE;YACP,EAAE,EAAE,GAAG,CAAA;YACP,GAAG,EAAE,SAAS;gBAAE,EAAE,EAAE,OAAO,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,GAAG,CAAA;aAAE,EAAE,CAAA;SAC1D,CAAA;QACD,CAAC,EAAE,GAAG,CAAA;KACP,CAAA;CACF;AA+ED;;;;;;;;;GASG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,mBAAmB,GAC3B,GAAG,CA2EL;AAED,eAAO,MAAM,4BAA4B,EAAE,OACG,CAAA;AAE9C,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,kBAAkB,GACzB,GAAG,CA2FL"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PERMIT2_CLAIM_POLICY_ADDRESS = void 0;
|
|
4
|
+
exports.buildPermit2ClaimPolicyCalldata = buildPermit2ClaimPolicyCalldata;
|
|
5
|
+
exports.encodePermit2ClaimPolicyInitData = encodePermit2ClaimPolicyInitData;
|
|
6
|
+
const viem_1 = require("viem");
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
// EIP-712 type definitions for Permit2/Mandate struct encoding.
|
|
9
|
+
// Note: the token-out struct is named 'Token' in the Solidity contract (matching the
|
|
10
|
+
// signed Permit2 message types in execution/permit2.ts).
|
|
11
|
+
const PERMIT2_TYPES = {
|
|
12
|
+
TokenPermissions: [
|
|
13
|
+
{ name: 'token', type: 'address' },
|
|
14
|
+
{ name: 'amount', type: 'uint256' },
|
|
15
|
+
],
|
|
16
|
+
Token: [
|
|
17
|
+
{ name: 'token', type: 'address' },
|
|
18
|
+
{ name: 'amount', type: 'uint256' },
|
|
19
|
+
],
|
|
20
|
+
Ops: [
|
|
21
|
+
{ name: 'to', type: 'address' },
|
|
22
|
+
{ name: 'value', type: 'uint256' },
|
|
23
|
+
{ name: 'data', type: 'bytes' },
|
|
24
|
+
],
|
|
25
|
+
Op: [
|
|
26
|
+
{ name: 'vt', type: 'bytes32' },
|
|
27
|
+
{ name: 'ops', type: 'Ops[]' },
|
|
28
|
+
],
|
|
29
|
+
Target: [
|
|
30
|
+
{ name: 'recipient', type: 'address' },
|
|
31
|
+
{ name: 'tokenOut', type: 'Token[]' },
|
|
32
|
+
{ name: 'targetChain', type: 'uint256' },
|
|
33
|
+
{ name: 'fillExpiry', type: 'uint256' },
|
|
34
|
+
],
|
|
35
|
+
Mandate: [
|
|
36
|
+
{ name: 'target', type: 'Target' },
|
|
37
|
+
{ name: 'minGas', type: 'uint128' },
|
|
38
|
+
{ name: 'originOps', type: 'Op' },
|
|
39
|
+
{ name: 'destOps', type: 'Op' },
|
|
40
|
+
{ name: 'q', type: 'bytes32' },
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
// --- EIP-712 hash helpers ---
|
|
44
|
+
function hashArray(hashes) {
|
|
45
|
+
return (0, viem_1.keccak256)(hashes.length > 0 ? (0, viem_1.concat)(hashes) : '0x');
|
|
46
|
+
}
|
|
47
|
+
function hashTokenPermissionsArray(permitted) {
|
|
48
|
+
return hashArray(permitted.map(({ token, amount }) => (0, viem_1.hashStruct)({
|
|
49
|
+
primaryType: 'TokenPermissions',
|
|
50
|
+
types: PERMIT2_TYPES,
|
|
51
|
+
data: { token, amount },
|
|
52
|
+
})));
|
|
53
|
+
}
|
|
54
|
+
function hashTokenOutArray(tokenOut) {
|
|
55
|
+
return hashArray(tokenOut.map(({ token, amount }) => (0, viem_1.hashStruct)({
|
|
56
|
+
primaryType: 'Token',
|
|
57
|
+
types: PERMIT2_TYPES,
|
|
58
|
+
data: { token, amount },
|
|
59
|
+
})));
|
|
60
|
+
}
|
|
61
|
+
function hashOpStruct(op) {
|
|
62
|
+
return (0, viem_1.hashStruct)({
|
|
63
|
+
primaryType: 'Op',
|
|
64
|
+
types: PERMIT2_TYPES,
|
|
65
|
+
data: { vt: op.vt, ops: Array.from(op.ops) },
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function hashMandateStruct(mandate) {
|
|
69
|
+
return (0, viem_1.hashStruct)({
|
|
70
|
+
primaryType: 'Mandate',
|
|
71
|
+
types: PERMIT2_TYPES,
|
|
72
|
+
data: {
|
|
73
|
+
target: {
|
|
74
|
+
recipient: mandate.target.recipient,
|
|
75
|
+
tokenOut: Array.from(mandate.target.tokenOut),
|
|
76
|
+
targetChain: mandate.target.targetChain,
|
|
77
|
+
fillExpiry: mandate.target.fillExpiry,
|
|
78
|
+
},
|
|
79
|
+
minGas: mandate.minGas,
|
|
80
|
+
originOps: {
|
|
81
|
+
vt: mandate.originOps.vt,
|
|
82
|
+
ops: Array.from(mandate.originOps.ops),
|
|
83
|
+
},
|
|
84
|
+
destOps: { vt: mandate.destOps.vt, ops: Array.from(mandate.destOps.ops) },
|
|
85
|
+
q: mandate.q,
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
// --- Token array encoding helpers ---
|
|
90
|
+
/** Encodes a token+amount pair as [token_as_uint256:32][amount:32] (64 bytes) */
|
|
91
|
+
function encodeTokenEntry(token, amount) {
|
|
92
|
+
return (0, viem_1.encodeAbiParameters)([{ type: 'address' }, { type: 'uint256' }], [token, amount]);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Builds the policySpecificData calldata for a Permit2ClaimPolicy EIP-1271 check.
|
|
96
|
+
*
|
|
97
|
+
* Format (derived from Permit2ClaimPolicy.sol calldata layout):
|
|
98
|
+
* Header: [spender:20][nonce:32][deadline:32]
|
|
99
|
+
* TokenIn: expanded [count:1][token:32][amount:32]... OR pre-computed hash [32]
|
|
100
|
+
* Mandate: if any target check enabled — expanded target + minGas:16 + ops hashes + q
|
|
101
|
+
* else — pre-computed mandateHash [32]
|
|
102
|
+
*
|
|
103
|
+
*/
|
|
104
|
+
function buildPermit2ClaimPolicyCalldata(policy, message) {
|
|
105
|
+
const tokenInEnabled = !!policy.tokensIn?.length;
|
|
106
|
+
const recipientEnabled = !!policy.recipients?.length;
|
|
107
|
+
const fillExpiryEnabled = !!policy.fillExpiryBounds?.length;
|
|
108
|
+
const tokenOutEnabled = !!policy.tokensOut?.length;
|
|
109
|
+
const recipientIsSponsorEnabled = !!policy.recipientIsSponsor;
|
|
110
|
+
// hasAnyTargetCheck mirrors the Solidity MASK_TARGET_CHECKS logic for our supported fields
|
|
111
|
+
const hasAnyTargetCheck = recipientEnabled ||
|
|
112
|
+
fillExpiryEnabled ||
|
|
113
|
+
tokenOutEnabled ||
|
|
114
|
+
recipientIsSponsorEnabled;
|
|
115
|
+
const parts = [];
|
|
116
|
+
// Header: [spender:20][nonce:32][deadline:32] (spender == arbiter in Permit2 context)
|
|
117
|
+
parts.push((0, viem_1.encodePacked)(['address', 'uint256', 'uint256'], [message.spender, message.nonce, message.deadline]));
|
|
118
|
+
// TokenIn section
|
|
119
|
+
if (tokenInEnabled) {
|
|
120
|
+
// Expanded: [count:1][token_as_uint256:32][amount:32]...
|
|
121
|
+
if (message.permitted.length > 255)
|
|
122
|
+
throw new Error('permitted array exceeds max length of 255');
|
|
123
|
+
parts.push((0, viem_1.toHex)(message.permitted.length, { size: 1 }));
|
|
124
|
+
for (const { token, amount } of message.permitted) {
|
|
125
|
+
parts.push(encodeTokenEntry(token, amount));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
parts.push(hashTokenPermissionsArray(message.permitted));
|
|
130
|
+
}
|
|
131
|
+
// Mandate section
|
|
132
|
+
if (!hasAnyTargetCheck) {
|
|
133
|
+
// No mandate-level checks enabled — provide pre-computed mandateHash
|
|
134
|
+
parts.push(hashMandateStruct(message.mandate));
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// Expanded mandate: target fields + minGas + ops hashes + q
|
|
138
|
+
const target = message.mandate.target;
|
|
139
|
+
// Target: [recipient:20][targetChain:32][fillExpiry:32]
|
|
140
|
+
parts.push((0, viem_1.encodePacked)(['address', 'uint256', 'uint256'], [target.recipient, target.targetChain, target.fillExpiry]));
|
|
141
|
+
// TokenOut (inside target)
|
|
142
|
+
if (tokenOutEnabled) {
|
|
143
|
+
if (target.tokenOut.length > 255)
|
|
144
|
+
throw new Error('tokenOut array exceeds max length of 255');
|
|
145
|
+
parts.push((0, viem_1.toHex)(target.tokenOut.length, { size: 1 }));
|
|
146
|
+
for (const { token, amount } of target.tokenOut) {
|
|
147
|
+
parts.push(encodeTokenEntry(token, amount));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
parts.push(hashTokenOutArray(target.tokenOut));
|
|
152
|
+
}
|
|
153
|
+
// minGas: uint128 = 16 bytes
|
|
154
|
+
parts.push((0, viem_1.toHex)(message.mandate.minGas, { size: 16 }));
|
|
155
|
+
// originOpsHash and destOpsHash: always 32-byte hashes (we don't support ops checks)
|
|
156
|
+
parts.push(hashOpStruct(message.mandate.originOps));
|
|
157
|
+
parts.push(hashOpStruct(message.mandate.destOps));
|
|
158
|
+
// qualificationHash: q is already keccak256(qualifier.encodedVal)
|
|
159
|
+
parts.push(message.mandate.q);
|
|
160
|
+
}
|
|
161
|
+
return (0, viem_1.concat)(parts);
|
|
162
|
+
}
|
|
163
|
+
exports.PERMIT2_CLAIM_POLICY_ADDRESS = '0x62E3588C6d861C9f986E82EC3757434EDF16ce91';
|
|
164
|
+
function encodePermit2ClaimPolicyInitData(policy) {
|
|
165
|
+
let modeConfig = 0;
|
|
166
|
+
const setMode = (fieldId) => {
|
|
167
|
+
modeConfig |= types_1.MODE_CHECK_STORAGE << (fieldId * 2);
|
|
168
|
+
};
|
|
169
|
+
if (policy.arbiters?.length)
|
|
170
|
+
setMode(types_1.FIELD_ARBITER);
|
|
171
|
+
if (policy.expiryBounds)
|
|
172
|
+
setMode(types_1.FIELD_EXPIRY);
|
|
173
|
+
if (policy.tokensIn?.length)
|
|
174
|
+
setMode(types_1.FIELD_TOKEN_IN);
|
|
175
|
+
if (policy.recipients?.length)
|
|
176
|
+
setMode(types_1.FIELD_RECIPIENT);
|
|
177
|
+
if (policy.fillExpiryBounds?.length)
|
|
178
|
+
setMode(types_1.FIELD_FILL_EXPIRY);
|
|
179
|
+
if (policy.tokensOut?.length)
|
|
180
|
+
setMode(types_1.FIELD_TOKEN_OUT);
|
|
181
|
+
if (policy.recipientIsSponsor)
|
|
182
|
+
setMode(types_1.FIELD_RECIPIENT_IS_SPONSOR);
|
|
183
|
+
const parts = [(0, viem_1.toHex)(modeConfig, { size: 4 })];
|
|
184
|
+
// Arbiter: [count: 1][address: 20] each
|
|
185
|
+
if (policy.arbiters?.length) {
|
|
186
|
+
if (policy.arbiters.length > 255)
|
|
187
|
+
throw new Error('arbiters array exceeds max length of 255');
|
|
188
|
+
parts.push((0, viem_1.encodePacked)(['uint8', ...policy.arbiters.map(() => 'address')], [policy.arbiters.length, ...policy.arbiters]));
|
|
189
|
+
}
|
|
190
|
+
// Expiry: [maxExpiry: 16][minExpiry: 16] packed into uint256
|
|
191
|
+
if (policy.expiryBounds) {
|
|
192
|
+
const mask128 = (1n << 128n) - 1n;
|
|
193
|
+
const min = (policy.expiryBounds.min ?? 0n) & mask128;
|
|
194
|
+
const max = (policy.expiryBounds.max ?? viem_1.maxUint256) & mask128;
|
|
195
|
+
parts.push((0, viem_1.toHex)((min & mask128) | (max << 128n), { size: 32 }));
|
|
196
|
+
}
|
|
197
|
+
// TokenIn: [count: 1][chainId: 32][token: 20] each
|
|
198
|
+
if (policy.tokensIn?.length) {
|
|
199
|
+
if (policy.tokensIn.length > 255)
|
|
200
|
+
throw new Error('tokensIn array exceeds max length of 255');
|
|
201
|
+
parts.push((0, viem_1.toHex)(policy.tokensIn.length, { size: 1 }));
|
|
202
|
+
for (const { chainId, token } of policy.tokensIn) {
|
|
203
|
+
parts.push((0, viem_1.encodePacked)(['uint256', 'address'], [BigInt(chainId), token]));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Recipient: [count: 1][chainId: 32][recipient: 20] each
|
|
207
|
+
if (policy.recipients?.length) {
|
|
208
|
+
if (policy.recipients.length > 255)
|
|
209
|
+
throw new Error('recipients array exceeds max length of 255');
|
|
210
|
+
parts.push((0, viem_1.toHex)(policy.recipients.length, { size: 1 }));
|
|
211
|
+
for (const { chainId, recipient } of policy.recipients) {
|
|
212
|
+
parts.push((0, viem_1.encodePacked)(['uint256', 'address'], [BigInt(chainId), recipient === 'any' ? types_1.ANY_ADDRESS : recipient]));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// FillExpiry: [count: 1][chainId: 32][max<<128|min packed into uint256] each
|
|
216
|
+
if (policy.fillExpiryBounds?.length) {
|
|
217
|
+
if (policy.fillExpiryBounds.length > 255)
|
|
218
|
+
throw new Error('fillExpiryBounds array exceeds max length of 255');
|
|
219
|
+
const mask128 = (1n << 128n) - 1n;
|
|
220
|
+
parts.push((0, viem_1.toHex)(policy.fillExpiryBounds.length, { size: 1 }));
|
|
221
|
+
for (const { chainId, min: fMin, max: fMax } of policy.fillExpiryBounds) {
|
|
222
|
+
const minVal = (fMin ?? 0n) & mask128;
|
|
223
|
+
const maxVal = (fMax ?? viem_1.maxUint256) & mask128;
|
|
224
|
+
const packed = minVal | (maxVal << 128n);
|
|
225
|
+
parts.push((0, viem_1.encodePacked)(['uint256', 'uint256'], [BigInt(chainId), packed]));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// TokenOut: [count: 1][chainId: 32][token: 20] each
|
|
229
|
+
if (policy.tokensOut?.length) {
|
|
230
|
+
if (policy.tokensOut.length > 255)
|
|
231
|
+
throw new Error('tokensOut array exceeds max length of 255');
|
|
232
|
+
parts.push((0, viem_1.toHex)(policy.tokensOut.length, { size: 1 }));
|
|
233
|
+
for (const { chainId, token } of policy.tokensOut) {
|
|
234
|
+
parts.push((0, viem_1.encodePacked)(['uint256', 'address'], [BigInt(chainId), token]));
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// RecipientIsSponsor has no data payload — mode bit alone enables it
|
|
238
|
+
return (0, viem_1.concat)(parts);
|
|
239
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const FIELD_ARBITER = 0;
|
|
2
|
+
export declare const FIELD_EXPIRY = 1;
|
|
3
|
+
export declare const FIELD_TOKEN_IN = 2;
|
|
4
|
+
export declare const FIELD_RECIPIENT = 3;
|
|
5
|
+
export declare const FIELD_FILL_EXPIRY = 4;
|
|
6
|
+
export declare const FIELD_TOKEN_OUT = 5;
|
|
7
|
+
export declare const FIELD_ORIGIN_OPS = 6;
|
|
8
|
+
export declare const FIELD_DEST_OPS = 7;
|
|
9
|
+
export declare const FIELD_RECIPIENT_IS_SPONSOR = 9;
|
|
10
|
+
export declare const MODE_CHECK_STORAGE = 1;
|
|
11
|
+
export declare const ANY_ADDRESS: "0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF";
|
|
12
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../modules/validators/policies/claim/types.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa,IAAI,CAAA;AAC9B,eAAO,MAAM,YAAY,IAAI,CAAA;AAC7B,eAAO,MAAM,cAAc,IAAI,CAAA;AAC/B,eAAO,MAAM,eAAe,IAAI,CAAA;AAChC,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAClC,eAAO,MAAM,eAAe,IAAI,CAAA;AAChC,eAAO,MAAM,gBAAgB,IAAI,CAAA;AACjC,eAAO,MAAM,cAAc,IAAI,CAAA;AAE/B,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAG3C,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAGnC,eAAO,MAAM,WAAW,EAAG,4CAAqD,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ANY_ADDRESS = exports.MODE_CHECK_STORAGE = exports.FIELD_RECIPIENT_IS_SPONSOR = exports.FIELD_DEST_OPS = exports.FIELD_ORIGIN_OPS = exports.FIELD_TOKEN_OUT = exports.FIELD_FILL_EXPIRY = exports.FIELD_RECIPIENT = exports.FIELD_TOKEN_IN = exports.FIELD_EXPIRY = exports.FIELD_ARBITER = void 0;
|
|
4
|
+
// Field IDs matching BaseDataTypes.sol
|
|
5
|
+
exports.FIELD_ARBITER = 0;
|
|
6
|
+
exports.FIELD_EXPIRY = 1;
|
|
7
|
+
exports.FIELD_TOKEN_IN = 2;
|
|
8
|
+
exports.FIELD_RECIPIENT = 3;
|
|
9
|
+
exports.FIELD_FILL_EXPIRY = 4;
|
|
10
|
+
exports.FIELD_TOKEN_OUT = 5;
|
|
11
|
+
exports.FIELD_ORIGIN_OPS = 6;
|
|
12
|
+
exports.FIELD_DEST_OPS = 7;
|
|
13
|
+
// Field 8 is reserved in BaseDataTypes.sol
|
|
14
|
+
exports.FIELD_RECIPIENT_IS_SPONSOR = 9;
|
|
15
|
+
// Mode values
|
|
16
|
+
exports.MODE_CHECK_STORAGE = 1;
|
|
17
|
+
// Sentinel: allows any recipient address
|
|
18
|
+
exports.ANY_ADDRESS = '0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Address, type Hex, type TypedDataDefinition } from 'viem';
|
|
2
|
-
import type { ProviderConfig, RhinestoneAccountConfig, RhinestoneConfig, Session,
|
|
2
|
+
import type { Policy, ProviderConfig, RhinestoneAccountConfig, RhinestoneConfig, Session, SessionEnableData } from '../../types';
|
|
3
3
|
import { type Module } from '../common';
|
|
4
4
|
import { SMART_SESSION_EMISSARY_ADDRESS, SMART_SESSION_EMISSARY_ADDRESS_DEV } from './core';
|
|
5
5
|
interface SessionData {
|
|
@@ -164,9 +164,23 @@ declare const SMART_SESSION_MODE_ENABLE = "0x01";
|
|
|
164
164
|
declare const SMART_SESSIONS_FALLBACK_TARGET_FLAG: Address;
|
|
165
165
|
declare const SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG: Hex;
|
|
166
166
|
declare const SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION: Hex;
|
|
167
|
-
declare
|
|
167
|
+
declare const DUMMY_PRECLAIMOP_TARGET: Address;
|
|
168
|
+
declare const DUMMY_PRECLAIMOP_SELECTOR: Hex;
|
|
169
|
+
declare const SPENDING_LIMITS_POLICY_ADDRESS: Address;
|
|
170
|
+
declare const TIME_FRAME_POLICY_ADDRESS: Address;
|
|
171
|
+
declare const SUDO_POLICY_ADDRESS: Address;
|
|
172
|
+
declare const UNIVERSAL_ACTION_POLICY_ADDRESS: Address;
|
|
173
|
+
declare const USAGE_LIMIT_POLICY_ADDRESS: Address;
|
|
174
|
+
declare const VALUE_LIMIT_POLICY_ADDRESS: Address;
|
|
175
|
+
declare const INTENT_EXECUTION_POLICY_ADDRESS: Address;
|
|
176
|
+
interface ResolvedSessionSignerSet {
|
|
168
177
|
type: 'experimental_session';
|
|
169
|
-
|
|
178
|
+
session: Session;
|
|
179
|
+
enableData?: SessionEnableData;
|
|
180
|
+
verifyExecutions: boolean;
|
|
181
|
+
claimPolicyData?: Hex;
|
|
182
|
+
}
|
|
183
|
+
declare function packSignature(signers: ResolvedSessionSignerSet, validatorSignature: Hex): Hex;
|
|
170
184
|
declare function getSessionDetails(account: Address, sessions: Session[], provider: ProviderConfig | undefined, useDevContracts?: boolean): Promise<SessionDetails>;
|
|
171
185
|
declare function isSessionEnabled(account: Address, provider: ProviderConfig | undefined, session: Session, useDevContracts?: boolean): Promise<boolean>;
|
|
172
186
|
declare function signEnableSession(config: RhinestoneAccountConfig, details: SessionDetails): Promise<Hex>;
|
|
@@ -177,9 +191,19 @@ declare function getEnableSessionCall(account: Address, session: Session, enable
|
|
|
177
191
|
to: `0x${string}`;
|
|
178
192
|
data: `0x${string}`;
|
|
179
193
|
}>;
|
|
180
|
-
declare function getSessionData(session: Session): SessionData;
|
|
194
|
+
declare function getSessionData(session: Session, useDevContracts?: boolean): SessionData;
|
|
181
195
|
declare function getPermissionId(session: Session): `0x${string}`;
|
|
196
|
+
declare function getPolicyData(policy: Policy, useDevContracts?: boolean): PolicyData;
|
|
182
197
|
declare function getSmartSessionValidator(config: RhinestoneConfig): Module | null;
|
|
183
|
-
|
|
184
|
-
|
|
198
|
+
/**
|
|
199
|
+
* Builds a mockSignature for SSX validation gas estimation.
|
|
200
|
+
* Format: emissaryAddress (20 bytes) + enable-mode sigData.
|
|
201
|
+
* Uses real session data (policies/actions from the user's session config) with dummy
|
|
202
|
+
* sigs and hashes — the mock emissary skips sig verification and only writes storage.
|
|
203
|
+
* The orchestrator slices off the first 20 bytes to identify the validator, then
|
|
204
|
+
* simulates verifyExecution with the mock emissary to estimate gas before the user signs.
|
|
205
|
+
*/
|
|
206
|
+
declare function buildMockSignature(session: Session, useDevContracts?: boolean, chainCount?: number, targetChainId?: number): Hex;
|
|
207
|
+
export { SMART_SESSION_EMISSARY_ADDRESS, SMART_SESSION_EMISSARY_ADDRESS_DEV, SMART_SESSIONS_FALLBACK_TARGET_FLAG, SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG, SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION, DUMMY_PRECLAIMOP_TARGET, DUMMY_PRECLAIMOP_SELECTOR, SPENDING_LIMITS_POLICY_ADDRESS, TIME_FRAME_POLICY_ADDRESS, SUDO_POLICY_ADDRESS, UNIVERSAL_ACTION_POLICY_ADDRESS, USAGE_LIMIT_POLICY_ADDRESS, VALUE_LIMIT_POLICY_ADDRESS, INTENT_EXECUTION_POLICY_ADDRESS, packSignature, getSessionData, getPolicyData, getEnableSessionCall, getPermissionId, getSmartSessionValidator, getSessionDetails, isSessionEnabled, signEnableSession, buildMockSignature, };
|
|
208
|
+
export type { ChainSession, ChainDigest, ResolvedSessionSignerSet, SessionData, SmartSessionModeType, SessionDetails, };
|
|
185
209
|
//# 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":"AACA,OAAO,EACL,KAAK,OAAO,
|
|
1
|
+
{"version":3,"file":"smart-sessions.d.ts","sourceRoot":"","sources":["../../../../modules/validators/smart-sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,26 +3,32 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
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_DEV = exports.SMART_SESSION_EMISSARY_ADDRESS = void 0;
|
|
6
|
+
exports.INTENT_EXECUTION_POLICY_ADDRESS = exports.VALUE_LIMIT_POLICY_ADDRESS = exports.USAGE_LIMIT_POLICY_ADDRESS = exports.UNIVERSAL_ACTION_POLICY_ADDRESS = exports.SUDO_POLICY_ADDRESS = exports.TIME_FRAME_POLICY_ADDRESS = exports.SPENDING_LIMITS_POLICY_ADDRESS = exports.DUMMY_PRECLAIMOP_SELECTOR = exports.DUMMY_PRECLAIMOP_TARGET = 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_DEV = exports.SMART_SESSION_EMISSARY_ADDRESS = void 0;
|
|
7
7
|
exports.packSignature = packSignature;
|
|
8
8
|
exports.getSessionData = getSessionData;
|
|
9
|
+
exports.getPolicyData = getPolicyData;
|
|
9
10
|
exports.getEnableSessionCall = getEnableSessionCall;
|
|
10
11
|
exports.getPermissionId = getPermissionId;
|
|
11
12
|
exports.getSmartSessionValidator = getSmartSessionValidator;
|
|
12
13
|
exports.getSessionDetails = getSessionDetails;
|
|
13
14
|
exports.isSessionEnabled = isSessionEnabled;
|
|
14
15
|
exports.signEnableSession = signEnableSession;
|
|
16
|
+
exports.buildMockSignature = buildMockSignature;
|
|
15
17
|
const solady_1 = require("solady");
|
|
16
18
|
const viem_1 = require("viem");
|
|
17
19
|
const chains_1 = require("viem/chains");
|
|
20
|
+
const accounts_1 = require("../../accounts");
|
|
21
|
+
const startale_1 = require("../../accounts/startale");
|
|
18
22
|
const utils_1 = require("../../accounts/utils");
|
|
19
23
|
const compact_1 = require("../../execution/compact");
|
|
20
24
|
const utils_2 = require("../../execution/utils");
|
|
25
|
+
const registry_1 = require("../../orchestrator/registry");
|
|
21
26
|
const smart_session_emissary_1 = __importDefault(require("../abi/smart-session-emissary"));
|
|
22
27
|
const common_1 = require("../common");
|
|
23
28
|
const core_1 = require("./core");
|
|
24
29
|
Object.defineProperty(exports, "SMART_SESSION_EMISSARY_ADDRESS", { enumerable: true, get: function () { return core_1.SMART_SESSION_EMISSARY_ADDRESS; } });
|
|
25
30
|
Object.defineProperty(exports, "SMART_SESSION_EMISSARY_ADDRESS_DEV", { enumerable: true, get: function () { return core_1.SMART_SESSION_EMISSARY_ADDRESS_DEV; } });
|
|
31
|
+
const permit2_1 = require("./policies/claim/permit2");
|
|
26
32
|
const types = {
|
|
27
33
|
PolicyData: [
|
|
28
34
|
{ name: 'policy', type: 'address' },
|
|
@@ -75,12 +81,30 @@ const SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG = '0x00000001';
|
|
|
75
81
|
exports.SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG = SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG;
|
|
76
82
|
const SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION = '0x00000002';
|
|
77
83
|
exports.SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION = SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION;
|
|
84
|
+
// Dummy preclaimop action injected into every session so that the filler can trigger
|
|
85
|
+
// verifyExecution (ENABLE mode) using an injected dummy preclaimop when there are no
|
|
86
|
+
// real preclaimops. Target 0x...0420 is the ecRecover precompile; calls to it fail
|
|
87
|
+
// silently because preclaimops are failure-tolerant. Selector 0x69123456 is
|
|
88
|
+
// intentionally uncommon.
|
|
89
|
+
const DUMMY_PRECLAIMOP_TARGET = '0x0000000000000000000000000000000000000420';
|
|
90
|
+
exports.DUMMY_PRECLAIMOP_TARGET = DUMMY_PRECLAIMOP_TARGET;
|
|
91
|
+
const DUMMY_PRECLAIMOP_SELECTOR = '0x69123456';
|
|
92
|
+
exports.DUMMY_PRECLAIMOP_SELECTOR = DUMMY_PRECLAIMOP_SELECTOR;
|
|
78
93
|
const SPENDING_LIMITS_POLICY_ADDRESS = '0x00000088d48cf102a8cdb0137a9b173f957c6343';
|
|
94
|
+
exports.SPENDING_LIMITS_POLICY_ADDRESS = SPENDING_LIMITS_POLICY_ADDRESS;
|
|
79
95
|
const TIME_FRAME_POLICY_ADDRESS = '0x8177451511de0577b911c254e9551d981c26dc72';
|
|
96
|
+
exports.TIME_FRAME_POLICY_ADDRESS = TIME_FRAME_POLICY_ADDRESS;
|
|
80
97
|
const SUDO_POLICY_ADDRESS = '0x0000003111cd8e92337c100f22b7a9dbf8dee301';
|
|
98
|
+
exports.SUDO_POLICY_ADDRESS = SUDO_POLICY_ADDRESS;
|
|
81
99
|
const UNIVERSAL_ACTION_POLICY_ADDRESS = '0x0000006dda6c463511c4e9b05cfc34c1247fcf1f';
|
|
100
|
+
exports.UNIVERSAL_ACTION_POLICY_ADDRESS = UNIVERSAL_ACTION_POLICY_ADDRESS;
|
|
82
101
|
const USAGE_LIMIT_POLICY_ADDRESS = '0x1f34ef8311345a3a4a4566af321b313052f51493';
|
|
102
|
+
exports.USAGE_LIMIT_POLICY_ADDRESS = USAGE_LIMIT_POLICY_ADDRESS;
|
|
83
103
|
const VALUE_LIMIT_POLICY_ADDRESS = '0x730da93267e7e513e932301b47f2ac7d062abc83';
|
|
104
|
+
exports.VALUE_LIMIT_POLICY_ADDRESS = VALUE_LIMIT_POLICY_ADDRESS;
|
|
105
|
+
const INTENT_EXECUTION_POLICY_ADDRESS = '0xe9eA54d063975cDee9e06b7636d5563d95a7A23C';
|
|
106
|
+
exports.INTENT_EXECUTION_POLICY_ADDRESS = INTENT_EXECUTION_POLICY_ADDRESS;
|
|
107
|
+
const INTENT_EXECUTION_POLICY_ADDRESS_DEV = '0xa09b47de6e510cbdc18b97e9239bedcb44fb4901';
|
|
84
108
|
const ACTION_CONDITION_EQUAL = 0;
|
|
85
109
|
const ACTION_CONDITION_GREATER_THAN = 1;
|
|
86
110
|
const ACTION_CONDITION_LESS_THAN = 2;
|
|
@@ -222,7 +246,7 @@ function packSignature(signers, validatorSignature) {
|
|
|
222
246
|
const SIGNATURE_IS_VALID_SIG_1271 = '0x00';
|
|
223
247
|
const policyDataOffset = BigInt(64 + (0, viem_1.size)(validatorSignature));
|
|
224
248
|
const mode = SIGNATURE_IS_VALID_SIG_1271;
|
|
225
|
-
const policySpecificData = '0x';
|
|
249
|
+
const policySpecificData = signers.claimPolicyData ?? '0x';
|
|
226
250
|
const signature = (0, viem_1.encodePacked)(['bytes1', 'bytes32', 'uint256', 'bytes', 'bytes'], [
|
|
227
251
|
mode,
|
|
228
252
|
permissionId,
|
|
@@ -236,7 +260,7 @@ function packSignature(signers, validatorSignature) {
|
|
|
236
260
|
async function getSessionDetails(account, sessions, provider, useDevContracts) {
|
|
237
261
|
const lockTag = '0x000000000000000000000000';
|
|
238
262
|
const sessionNonces = await Promise.all(sessions.map((session) => getSessionNonce(account, session, lockTag, provider, useDevContracts)));
|
|
239
|
-
const sessionDatas = sessions.map((session) => getSessionData(session));
|
|
263
|
+
const sessionDatas = sessions.map((session) => getSessionData(session, useDevContracts));
|
|
240
264
|
const signedSessions = sessionDatas.map((session, index) => getSignedSession(account, lockTag, session, sessionNonces[index], useDevContracts));
|
|
241
265
|
const chains = sessions.map((session) => session.chain);
|
|
242
266
|
const hashesAndChainIds = signedSessions.map((session, index) => ({
|
|
@@ -292,6 +316,22 @@ async function isSessionEnabled(account, provider, session, useDevContracts) {
|
|
|
292
316
|
return isEnabled;
|
|
293
317
|
}
|
|
294
318
|
async function signEnableSession(config, details) {
|
|
319
|
+
const account = (0, accounts_1.getAccountProvider)(config);
|
|
320
|
+
const validator = (0, core_1.getOwnerValidator)(config);
|
|
321
|
+
const isStartaleK1 = account.type === 'startale' &&
|
|
322
|
+
validator.address.toLowerCase() ===
|
|
323
|
+
startale_1.K1_DEFAULT_VALIDATOR_ADDRESS.toLowerCase();
|
|
324
|
+
if (isStartaleK1) {
|
|
325
|
+
const chainIds = details.hashesAndChainIds.map((h) => h.chainId);
|
|
326
|
+
const uniqueChainIds = [...new Set(chainIds.map((c) => c.toString()))];
|
|
327
|
+
if (uniqueChainIds.length > 1) {
|
|
328
|
+
throw new Error('Startale accounts with K1 validator do not support multi-chain session enable');
|
|
329
|
+
}
|
|
330
|
+
const chain = (0, registry_1.getChainById)(Number(chainIds[0]));
|
|
331
|
+
return (0, utils_2.signTypedData)(config, details.data, chain, undefined, {
|
|
332
|
+
skipErc6492: true,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
295
335
|
return (0, utils_2.signTypedData)(config, details.data, chains_1.mainnet, undefined, {
|
|
296
336
|
skipErc6492: true,
|
|
297
337
|
});
|
|
@@ -349,7 +389,7 @@ function getSignedSession(account, lockTag, session, nonce, useDevContracts) {
|
|
|
349
389
|
};
|
|
350
390
|
}
|
|
351
391
|
async function getEnableSessionCall(account, session, enableSessionSignature, hashesAndChainIds, sessionToEnableIndex, useDevContracts) {
|
|
352
|
-
const sessionData = getSessionData(session);
|
|
392
|
+
const sessionData = getSessionData(session, useDevContracts);
|
|
353
393
|
const permissionId = getPermissionId(session);
|
|
354
394
|
return {
|
|
355
395
|
to: getSmartSessionEmissaryAddress(useDevContracts),
|
|
@@ -378,7 +418,7 @@ async function getEnableSessionCall(account, session, enableSessionSignature, ha
|
|
|
378
418
|
}),
|
|
379
419
|
};
|
|
380
420
|
}
|
|
381
|
-
function getSessionData(session) {
|
|
421
|
+
function getSessionData(session, useDevContracts) {
|
|
382
422
|
const validator = (0, core_1.getValidator)(session.owners);
|
|
383
423
|
const allowedContent = [
|
|
384
424
|
{
|
|
@@ -405,11 +445,43 @@ function getSessionData(session) {
|
|
|
405
445
|
},
|
|
406
446
|
],
|
|
407
447
|
};
|
|
408
|
-
const
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
448
|
+
const userHasFallbackAction = session.actions?.some((action) => !('target' in action) && !('selector' in action));
|
|
449
|
+
const injectedActions = [
|
|
450
|
+
// Native token wrapping
|
|
451
|
+
{
|
|
452
|
+
target: (0, registry_1.getWrappedTokenAddress)(session.chain),
|
|
453
|
+
selector: (0, viem_1.toFunctionSelector)({
|
|
454
|
+
type: 'function',
|
|
455
|
+
name: 'deposit',
|
|
456
|
+
inputs: [],
|
|
457
|
+
outputs: [],
|
|
458
|
+
stateMutability: 'payable',
|
|
459
|
+
}),
|
|
460
|
+
},
|
|
461
|
+
// Only inject the intent-execution fallback if the user hasn't defined their own
|
|
462
|
+
// fallback action — otherwise both map to the same actionId and their policies merge,
|
|
463
|
+
// causing IntentExecutionPolicy to be required for all fallback calls
|
|
464
|
+
...(!userHasFallbackAction
|
|
465
|
+
? [{ policies: [{ type: 'intent-execution' }] }]
|
|
466
|
+
: []),
|
|
467
|
+
// Dummy action: allows the filler to call verifyExecution in ENABLE mode using
|
|
468
|
+
// an injected dummy preclaimop so any session can be enabled on-chain without
|
|
469
|
+
// a separate UserOp, regardless of whether it has claim or action policies.
|
|
470
|
+
{
|
|
471
|
+
target: DUMMY_PRECLAIMOP_TARGET,
|
|
472
|
+
selector: DUMMY_PRECLAIMOP_SELECTOR,
|
|
473
|
+
policies: [{ type: 'sudo' }],
|
|
474
|
+
},
|
|
475
|
+
];
|
|
476
|
+
const actions = session.actions?.length
|
|
477
|
+
? [...session.actions, ...injectedActions].map((action) => ({
|
|
478
|
+
actionTargetSelector: 'selector' in action
|
|
479
|
+
? action.selector
|
|
480
|
+
: SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG,
|
|
481
|
+
actionTarget: 'target' in action
|
|
482
|
+
? action.target
|
|
483
|
+
: SMART_SESSIONS_FALLBACK_TARGET_FLAG,
|
|
484
|
+
actionPolicies: action.policies?.map((policy) => getPolicyData(policy, useDevContracts)) ?? [
|
|
413
485
|
{
|
|
414
486
|
policy: SUDO_POLICY_ADDRESS,
|
|
415
487
|
initData: '0x',
|
|
@@ -423,7 +495,11 @@ function getSessionData(session) {
|
|
|
423
495
|
sessionValidatorInitData: validator.initData,
|
|
424
496
|
erc7739Policies: erc7739Data,
|
|
425
497
|
actions,
|
|
426
|
-
|
|
498
|
+
// Note: Permit2ClaimPolicy has no dev deployment — same address in all environments
|
|
499
|
+
claimPolicies: session.claimPolicies?.map((p) => ({
|
|
500
|
+
policy: permit2_1.PERMIT2_CLAIM_POLICY_ADDRESS,
|
|
501
|
+
initData: (0, permit2_1.encodePermit2ClaimPolicyInitData)(p),
|
|
502
|
+
})) ?? [],
|
|
427
503
|
};
|
|
428
504
|
}
|
|
429
505
|
function getPermissionId(session) {
|
|
@@ -447,13 +523,20 @@ function getPermissionId(session) {
|
|
|
447
523
|
sessionData.salt,
|
|
448
524
|
]));
|
|
449
525
|
}
|
|
450
|
-
function getPolicyData(policy) {
|
|
526
|
+
function getPolicyData(policy, useDevContracts) {
|
|
451
527
|
switch (policy.type) {
|
|
452
528
|
case 'sudo':
|
|
453
529
|
return {
|
|
454
530
|
policy: SUDO_POLICY_ADDRESS,
|
|
455
531
|
initData: '0x',
|
|
456
532
|
};
|
|
533
|
+
case 'intent-execution':
|
|
534
|
+
return {
|
|
535
|
+
policy: useDevContracts
|
|
536
|
+
? INTENT_EXECUTION_POLICY_ADDRESS_DEV
|
|
537
|
+
: INTENT_EXECUTION_POLICY_ADDRESS,
|
|
538
|
+
initData: '0x',
|
|
539
|
+
};
|
|
457
540
|
case 'universal-action': {
|
|
458
541
|
function getCondition(condition) {
|
|
459
542
|
switch (condition) {
|
|
@@ -619,6 +702,46 @@ function getSmartSessionEmissaryAddress(useDevContracts) {
|
|
|
619
702
|
? core_1.SMART_SESSION_EMISSARY_ADDRESS_DEV
|
|
620
703
|
: core_1.SMART_SESSION_EMISSARY_ADDRESS;
|
|
621
704
|
}
|
|
705
|
+
/**
|
|
706
|
+
* Builds a mockSignature for SSX validation gas estimation.
|
|
707
|
+
* Format: emissaryAddress (20 bytes) + enable-mode sigData.
|
|
708
|
+
* Uses real session data (policies/actions from the user's session config) with dummy
|
|
709
|
+
* sigs and hashes — the mock emissary skips sig verification and only writes storage.
|
|
710
|
+
* The orchestrator slices off the first 20 bytes to identify the validator, then
|
|
711
|
+
* simulates verifyExecution with the mock emissary to estimate gas before the user signs.
|
|
712
|
+
*/
|
|
713
|
+
function buildMockSignature(session, useDevContracts, chainCount = 1, targetChainId) {
|
|
714
|
+
const emissaryAddress = getSmartSessionEmissaryAddress(useDevContracts);
|
|
715
|
+
// Use targetChainId when provided (per-chain mockSignatures path) so the
|
|
716
|
+
// mock emissary's chainId check passes on the correct chain. Falls back to
|
|
717
|
+
// session.chain.id for the global mockSignature (single-chain path).
|
|
718
|
+
const primaryChainId = targetChainId ?? session.chain.id;
|
|
719
|
+
// Normalize chainCount to a finite positive integer. Guards against
|
|
720
|
+
// accidental NaN/undefined from caller (e.g. `sourceChains?.length` when
|
|
721
|
+
// sourceChains is undefined) which would otherwise make Array.from produce
|
|
722
|
+
// an empty array and silently drop the ChainId check.
|
|
723
|
+
const safeChainCount = Number.isFinite(chainCount) && chainCount > 0 ? Math.floor(chainCount) : 1;
|
|
724
|
+
// Build one entry per chain — first entry is the real chain ID (for the ChainId check),
|
|
725
|
+
// remaining entries use chainId 0 as placeholders. Hash mismatch is skipped by the
|
|
726
|
+
// mock emissary, so sessionDigest can be zeroHash throughout.
|
|
727
|
+
const hashesAndChainIds = Array.from({ length: safeChainCount }, (_, i) => ({
|
|
728
|
+
chainId: i === 0 ? BigInt(primaryChainId) : 0n,
|
|
729
|
+
sessionDigest: viem_1.zeroHash,
|
|
730
|
+
}));
|
|
731
|
+
const dummySigners = {
|
|
732
|
+
type: 'experimental_session',
|
|
733
|
+
session,
|
|
734
|
+
verifyExecutions: true,
|
|
735
|
+
enableData: {
|
|
736
|
+
userSignature: `0x${'00'.repeat(65)}`,
|
|
737
|
+
hashesAndChainIds,
|
|
738
|
+
sessionToEnableIndex: 0,
|
|
739
|
+
},
|
|
740
|
+
};
|
|
741
|
+
const dummyValidatorSignature = `0x${'00'.repeat(65)}`;
|
|
742
|
+
const sigData = packSignature(dummySigners, dummyValidatorSignature);
|
|
743
|
+
return (0, viem_1.concat)([emissaryAddress, sigData]);
|
|
744
|
+
}
|
|
622
745
|
function createFixedArray(length, getValue) {
|
|
623
746
|
return Array.from({ length }, (_, i) => getValue(i));
|
|
624
747
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { Address } from 'viem';
|
|
2
|
+
import type { AuthProvider } from '../auth/provider';
|
|
2
3
|
import type { IntentInput, IntentOpStatus, IntentResult, IntentRoute, Portfolio, SignedIntentOp, SplitIntentsInput, SplitIntentsResult } from './types';
|
|
3
4
|
export declare class Orchestrator {
|
|
4
5
|
private serverUrl;
|
|
5
|
-
private
|
|
6
|
-
private
|
|
7
|
-
constructor(serverUrl: string,
|
|
6
|
+
private authProvider;
|
|
7
|
+
private extraHeaders?;
|
|
8
|
+
constructor(serverUrl: string, authProvider: AuthProvider, headers?: Record<string, string>);
|
|
8
9
|
getPortfolio(userAddress: Address, filter?: {
|
|
9
10
|
chainIds?: number[];
|
|
10
11
|
tokens?: {
|
|
@@ -13,9 +14,13 @@ export declare class Orchestrator {
|
|
|
13
14
|
}): Promise<Portfolio>;
|
|
14
15
|
getIntentRoute(input: IntentInput): Promise<IntentRoute>;
|
|
15
16
|
splitIntents(input: SplitIntentsInput): Promise<SplitIntentsResult>;
|
|
16
|
-
submitIntent(signedIntentOpUnformatted: SignedIntentOp, dryRun: boolean
|
|
17
|
+
submitIntent(signedIntentOpUnformatted: SignedIntentOp, dryRun: boolean, policyContext?: {
|
|
18
|
+
intentInput: unknown;
|
|
19
|
+
isSponsored: boolean;
|
|
20
|
+
}): Promise<IntentResult>;
|
|
17
21
|
getIntentOpStatus(intentId: bigint): Promise<IntentOpStatus>;
|
|
18
22
|
private getHeaders;
|
|
23
|
+
private getSubmitHeaders;
|
|
19
24
|
private fetch;
|
|
20
25
|
private parseError;
|
|
21
26
|
private parseErrorMessage;
|
|
@@ -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;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AA2BpD,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,YAAY,CAAc;IAClC,OAAO,CAAC,YAAY,CAAC,CAAwB;gBAG3C,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAO5B,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;IASxD,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwDnE,YAAY,CAChB,yBAAyB,EAAE,cAAc,EACzC,MAAM,EAAE,OAAO,EACf,aAAa,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,OAAO,CAAA;KAAE,GAC7D,OAAO,CAAC,YAAY,CAAC;IAqBlB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;YASpD,UAAU;YAWV,gBAAgB;YAgBhB,KAAK;IA6BnB,OAAO,CAAC,UAAU;IA6GlB,OAAO,CAAC,iBAAiB;CAmG1B"}
|