@charterlabs/rhinestone-sdk 0.3.9 → 0.4.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 +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/common.js +21 -7
- 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/signing/mfa-webauthn.d.ts +30 -0
- package/dist/src/accounts/signing/mfa-webauthn.d.ts.map +1 -0
- package/dist/src/accounts/signing/mfa-webauthn.js +119 -0
- package/dist/src/accounts/startale.js +1 -1
- package/dist/src/accounts/utils.d.ts +1 -1
- package/dist/src/accounts/utils.d.ts.map +1 -1
- package/dist/src/actions/mfa.d.ts +6 -2
- package/dist/src/actions/mfa.d.ts.map +1 -1
- package/dist/src/actions/mfa.js +14 -4
- 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 +17 -13
- package/dist/src/execution/utils.d.ts +17 -6
- package/dist/src/execution/utils.d.ts.map +1 -1
- package/dist/src/execution/utils.js +193 -43
- 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/core.d.ts +6 -2
- package/dist/src/modules/validators/core.d.ts.map +1 -1
- package/dist/src/modules/validators/core.js +46 -21
- 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 +5 -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 +22 -7
- package/dist/src/modules/validators/smart-sessions.d.ts.map +1 -1
- package/dist/src/modules/validators/smart-sessions.js +82 -22
- 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 +6 -1
- package/dist/src/orchestrator/types.d.ts.map +1 -1
- package/dist/src/types.d.ts +88 -5
- 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 -189
- 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 -150
- 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/modules/validators/smart-sessions.test.d.ts +0 -2
- package/dist/src/modules/validators/smart-sessions.test.d.ts.map +0 -1
- package/dist/src/modules/validators/smart-sessions.test.js +0 -61
- 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,8 +191,9 @@ 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
198
|
/**
|
|
184
199
|
* Builds a mockSignature for SSX validation gas estimation.
|
|
@@ -188,7 +203,7 @@ declare function getSmartSessionValidator(config: RhinestoneConfig): Module | nu
|
|
|
188
203
|
* The orchestrator slices off the first 20 bytes to identify the validator, then
|
|
189
204
|
* simulates verifyExecution with the mock emissary to estimate gas before the user signs.
|
|
190
205
|
*/
|
|
191
|
-
declare function buildMockSignature(session: Session, useDevContracts?: boolean, chainCount?: number): Hex;
|
|
192
|
-
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, packSignature, getSessionData, getEnableSessionCall, getPermissionId, getSmartSessionValidator, getSessionDetails, isSessionEnabled, signEnableSession, buildMockSignature, };
|
|
193
|
-
export type { ChainSession, ChainDigest, SessionData, SmartSessionModeType, SessionDetails, };
|
|
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, };
|
|
194
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,EAMZ,KAAK,GAAG,EAOR,KAAK,mBAAmB,EAKzB,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"smart-sessions.d.ts","sourceRoot":"","sources":["../../../../modules/validators/smart-sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,9 +3,10 @@ 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;
|
|
@@ -16,15 +17,18 @@ exports.buildMockSignature = buildMockSignature;
|
|
|
16
17
|
const solady_1 = require("solady");
|
|
17
18
|
const viem_1 = require("viem");
|
|
18
19
|
const chains_1 = require("viem/chains");
|
|
20
|
+
const accounts_1 = require("../../accounts");
|
|
21
|
+
const startale_1 = require("../../accounts/startale");
|
|
19
22
|
const utils_1 = require("../../accounts/utils");
|
|
20
23
|
const compact_1 = require("../../execution/compact");
|
|
21
24
|
const utils_2 = require("../../execution/utils");
|
|
22
|
-
const
|
|
25
|
+
const registry_1 = require("../../orchestrator/registry");
|
|
23
26
|
const smart_session_emissary_1 = __importDefault(require("../abi/smart-session-emissary"));
|
|
24
27
|
const common_1 = require("../common");
|
|
25
28
|
const core_1 = require("./core");
|
|
26
29
|
Object.defineProperty(exports, "SMART_SESSION_EMISSARY_ADDRESS", { enumerable: true, get: function () { return core_1.SMART_SESSION_EMISSARY_ADDRESS; } });
|
|
27
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");
|
|
28
32
|
const types = {
|
|
29
33
|
PolicyData: [
|
|
30
34
|
{ name: 'policy', type: 'address' },
|
|
@@ -77,13 +81,30 @@ const SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG = '0x00000001';
|
|
|
77
81
|
exports.SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG = SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG;
|
|
78
82
|
const SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION = '0x00000002';
|
|
79
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;
|
|
80
93
|
const SPENDING_LIMITS_POLICY_ADDRESS = '0x00000088d48cf102a8cdb0137a9b173f957c6343';
|
|
94
|
+
exports.SPENDING_LIMITS_POLICY_ADDRESS = SPENDING_LIMITS_POLICY_ADDRESS;
|
|
81
95
|
const TIME_FRAME_POLICY_ADDRESS = '0x8177451511de0577b911c254e9551d981c26dc72';
|
|
96
|
+
exports.TIME_FRAME_POLICY_ADDRESS = TIME_FRAME_POLICY_ADDRESS;
|
|
82
97
|
const SUDO_POLICY_ADDRESS = '0x0000003111cd8e92337c100f22b7a9dbf8dee301';
|
|
98
|
+
exports.SUDO_POLICY_ADDRESS = SUDO_POLICY_ADDRESS;
|
|
83
99
|
const UNIVERSAL_ACTION_POLICY_ADDRESS = '0x0000006dda6c463511c4e9b05cfc34c1247fcf1f';
|
|
100
|
+
exports.UNIVERSAL_ACTION_POLICY_ADDRESS = UNIVERSAL_ACTION_POLICY_ADDRESS;
|
|
84
101
|
const USAGE_LIMIT_POLICY_ADDRESS = '0x1f34ef8311345a3a4a4566af321b313052f51493';
|
|
102
|
+
exports.USAGE_LIMIT_POLICY_ADDRESS = USAGE_LIMIT_POLICY_ADDRESS;
|
|
85
103
|
const VALUE_LIMIT_POLICY_ADDRESS = '0x730da93267e7e513e932301b47f2ac7d062abc83';
|
|
86
|
-
|
|
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';
|
|
87
108
|
const ACTION_CONDITION_EQUAL = 0;
|
|
88
109
|
const ACTION_CONDITION_GREATER_THAN = 1;
|
|
89
110
|
const ACTION_CONDITION_LESS_THAN = 2;
|
|
@@ -225,7 +246,7 @@ function packSignature(signers, validatorSignature) {
|
|
|
225
246
|
const SIGNATURE_IS_VALID_SIG_1271 = '0x00';
|
|
226
247
|
const policyDataOffset = BigInt(64 + (0, viem_1.size)(validatorSignature));
|
|
227
248
|
const mode = SIGNATURE_IS_VALID_SIG_1271;
|
|
228
|
-
const policySpecificData = '0x';
|
|
249
|
+
const policySpecificData = signers.claimPolicyData ?? '0x';
|
|
229
250
|
const signature = (0, viem_1.encodePacked)(['bytes1', 'bytes32', 'uint256', 'bytes', 'bytes'], [
|
|
230
251
|
mode,
|
|
231
252
|
permissionId,
|
|
@@ -239,7 +260,7 @@ function packSignature(signers, validatorSignature) {
|
|
|
239
260
|
async function getSessionDetails(account, sessions, provider, useDevContracts) {
|
|
240
261
|
const lockTag = '0x000000000000000000000000';
|
|
241
262
|
const sessionNonces = await Promise.all(sessions.map((session) => getSessionNonce(account, session, lockTag, provider, useDevContracts)));
|
|
242
|
-
const sessionDatas = sessions.map((session) => getSessionData(session));
|
|
263
|
+
const sessionDatas = sessions.map((session) => getSessionData(session, useDevContracts));
|
|
243
264
|
const signedSessions = sessionDatas.map((session, index) => getSignedSession(account, lockTag, session, sessionNonces[index], useDevContracts));
|
|
244
265
|
const chains = sessions.map((session) => session.chain);
|
|
245
266
|
const hashesAndChainIds = signedSessions.map((session, index) => ({
|
|
@@ -295,6 +316,22 @@ async function isSessionEnabled(account, provider, session, useDevContracts) {
|
|
|
295
316
|
return isEnabled;
|
|
296
317
|
}
|
|
297
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
|
+
}
|
|
298
335
|
return (0, utils_2.signTypedData)(config, details.data, chains_1.mainnet, undefined, {
|
|
299
336
|
skipErc6492: true,
|
|
300
337
|
});
|
|
@@ -352,7 +389,7 @@ function getSignedSession(account, lockTag, session, nonce, useDevContracts) {
|
|
|
352
389
|
};
|
|
353
390
|
}
|
|
354
391
|
async function getEnableSessionCall(account, session, enableSessionSignature, hashesAndChainIds, sessionToEnableIndex, useDevContracts) {
|
|
355
|
-
const sessionData = getSessionData(session);
|
|
392
|
+
const sessionData = getSessionData(session, useDevContracts);
|
|
356
393
|
const permissionId = getPermissionId(session);
|
|
357
394
|
return {
|
|
358
395
|
to: getSmartSessionEmissaryAddress(useDevContracts),
|
|
@@ -381,7 +418,7 @@ async function getEnableSessionCall(account, session, enableSessionSignature, ha
|
|
|
381
418
|
}),
|
|
382
419
|
};
|
|
383
420
|
}
|
|
384
|
-
function getSessionData(session) {
|
|
421
|
+
function getSessionData(session, useDevContracts) {
|
|
385
422
|
const validator = (0, core_1.getValidator)(session.owners);
|
|
386
423
|
const allowedContent = [
|
|
387
424
|
{
|
|
@@ -408,10 +445,11 @@ function getSessionData(session) {
|
|
|
408
445
|
},
|
|
409
446
|
],
|
|
410
447
|
};
|
|
448
|
+
const userHasFallbackAction = session.actions?.some((action) => !('target' in action) && !('selector' in action));
|
|
411
449
|
const injectedActions = [
|
|
412
|
-
//
|
|
450
|
+
// Native token wrapping
|
|
413
451
|
{
|
|
414
|
-
target: (0,
|
|
452
|
+
target: (0, registry_1.getWrappedTokenAddress)(session.chain),
|
|
415
453
|
selector: (0, viem_1.toFunctionSelector)({
|
|
416
454
|
type: 'function',
|
|
417
455
|
name: 'deposit',
|
|
@@ -420,15 +458,22 @@ function getSessionData(session) {
|
|
|
420
458
|
stateMutability: 'payable',
|
|
421
459
|
}),
|
|
422
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.
|
|
423
470
|
{
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
},
|
|
428
|
-
],
|
|
471
|
+
target: DUMMY_PRECLAIMOP_TARGET,
|
|
472
|
+
selector: DUMMY_PRECLAIMOP_SELECTOR,
|
|
473
|
+
policies: [{ type: 'sudo' }],
|
|
429
474
|
},
|
|
430
475
|
];
|
|
431
|
-
const actions = session.actions
|
|
476
|
+
const actions = session.actions?.length
|
|
432
477
|
? [...session.actions, ...injectedActions].map((action) => ({
|
|
433
478
|
actionTargetSelector: 'selector' in action
|
|
434
479
|
? action.selector
|
|
@@ -436,7 +481,7 @@ function getSessionData(session) {
|
|
|
436
481
|
actionTarget: 'target' in action
|
|
437
482
|
? action.target
|
|
438
483
|
: SMART_SESSIONS_FALLBACK_TARGET_FLAG,
|
|
439
|
-
actionPolicies: action.policies?.map((policy) => getPolicyData(policy)) ?? [
|
|
484
|
+
actionPolicies: action.policies?.map((policy) => getPolicyData(policy, useDevContracts)) ?? [
|
|
440
485
|
{
|
|
441
486
|
policy: SUDO_POLICY_ADDRESS,
|
|
442
487
|
initData: '0x',
|
|
@@ -450,7 +495,11 @@ function getSessionData(session) {
|
|
|
450
495
|
sessionValidatorInitData: validator.initData,
|
|
451
496
|
erc7739Policies: erc7739Data,
|
|
452
497
|
actions,
|
|
453
|
-
|
|
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
|
+
})) ?? [],
|
|
454
503
|
};
|
|
455
504
|
}
|
|
456
505
|
function getPermissionId(session) {
|
|
@@ -474,7 +523,7 @@ function getPermissionId(session) {
|
|
|
474
523
|
sessionData.salt,
|
|
475
524
|
]));
|
|
476
525
|
}
|
|
477
|
-
function getPolicyData(policy) {
|
|
526
|
+
function getPolicyData(policy, useDevContracts) {
|
|
478
527
|
switch (policy.type) {
|
|
479
528
|
case 'sudo':
|
|
480
529
|
return {
|
|
@@ -483,7 +532,9 @@ function getPolicyData(policy) {
|
|
|
483
532
|
};
|
|
484
533
|
case 'intent-execution':
|
|
485
534
|
return {
|
|
486
|
-
policy:
|
|
535
|
+
policy: useDevContracts
|
|
536
|
+
? INTENT_EXECUTION_POLICY_ADDRESS_DEV
|
|
537
|
+
: INTENT_EXECUTION_POLICY_ADDRESS,
|
|
487
538
|
initData: '0x',
|
|
488
539
|
};
|
|
489
540
|
case 'universal-action': {
|
|
@@ -659,13 +710,22 @@ function getSmartSessionEmissaryAddress(useDevContracts) {
|
|
|
659
710
|
* The orchestrator slices off the first 20 bytes to identify the validator, then
|
|
660
711
|
* simulates verifyExecution with the mock emissary to estimate gas before the user signs.
|
|
661
712
|
*/
|
|
662
|
-
function buildMockSignature(session, useDevContracts, chainCount = 1) {
|
|
713
|
+
function buildMockSignature(session, useDevContracts, chainCount = 1, targetChainId) {
|
|
663
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;
|
|
664
724
|
// Build one entry per chain — first entry is the real chain ID (for the ChainId check),
|
|
665
725
|
// remaining entries use chainId 0 as placeholders. Hash mismatch is skipped by the
|
|
666
726
|
// mock emissary, so sessionDigest can be zeroHash throughout.
|
|
667
|
-
const hashesAndChainIds = Array.from({ length:
|
|
668
|
-
chainId: i === 0 ? BigInt(
|
|
727
|
+
const hashesAndChainIds = Array.from({ length: safeChainCount }, (_, i) => ({
|
|
728
|
+
chainId: i === 0 ? BigInt(primaryChainId) : 0n,
|
|
669
729
|
sessionDigest: viem_1.zeroHash,
|
|
670
730
|
}));
|
|
671
731
|
const dummySigners = {
|
|
@@ -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"}
|