@rhinestone/sdk 1.4.1 → 1.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/dist/src/accounts/index.d.ts +1 -0
- 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.js +1 -1
- package/dist/src/actions/recovery.test.js +1 -1
- package/dist/src/execution/signing.test.d.ts +2 -0
- package/dist/src/execution/signing.test.d.ts.map +1 -0
- package/dist/src/execution/signing.test.js +465 -0
- package/dist/src/execution/utils.d.ts +1 -0
- package/dist/src/execution/utils.d.ts.map +1 -1
- package/dist/src/execution/utils.js +76 -7
- package/dist/src/execution/utils.test.js +183 -0
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- 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 +4 -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/permit2.test.d.ts +2 -0
- package/dist/src/modules/validators/policies/claim/permit2.test.d.ts.map +1 -0
- package/dist/src/modules/validators/policies/claim/permit2.test.js +519 -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 +14 -3
- package/dist/src/modules/validators/smart-sessions.d.ts.map +1 -1
- package/dist/src/modules/validators/smart-sessions.js +51 -16
- package/dist/src/modules/validators/smart-sessions.test.js +266 -16
- package/dist/src/orchestrator/client.d.ts.map +1 -1
- package/dist/src/orchestrator/client.js +1 -0
- 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 +2 -2
- package/dist/src/orchestrator/index.d.ts.map +1 -1
- package/dist/src/orchestrator/registry.d.ts.map +1 -1
- package/dist/src/orchestrator/registry.js +5 -1
- package/dist/src/orchestrator/types.d.ts +1 -0
- package/dist/src/orchestrator/types.d.ts.map +1 -1
- package/dist/src/types.d.ts +38 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/test/utils/utils.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const viem_1 = require("viem");
|
|
4
|
+
const vitest_1 = require("vitest");
|
|
5
|
+
const permit2_1 = require("./permit2");
|
|
6
|
+
const types_1 = require("./types");
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Shared fixtures
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
const TOKEN_A = '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'; // USDC
|
|
11
|
+
const TOKEN_B = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2'; // WETH
|
|
12
|
+
const ARBITER = '0x1234567890123456789012345678901234567890';
|
|
13
|
+
/** Zero-value Op struct (vt is bytes32, empty ops) */
|
|
14
|
+
const EMPTY_OP = {
|
|
15
|
+
vt: viem_1.zeroHash,
|
|
16
|
+
ops: [],
|
|
17
|
+
};
|
|
18
|
+
/** A simple message with one permitted token and no mandate ops */
|
|
19
|
+
const baseMessage = {
|
|
20
|
+
permitted: [{ token: TOKEN_A, amount: 1000n }],
|
|
21
|
+
spender: ARBITER,
|
|
22
|
+
nonce: 42n,
|
|
23
|
+
deadline: 9999999n,
|
|
24
|
+
mandate: {
|
|
25
|
+
target: {
|
|
26
|
+
recipient: ARBITER,
|
|
27
|
+
tokenOut: [{ token: TOKEN_B, amount: 500n }],
|
|
28
|
+
targetChain: 8453n,
|
|
29
|
+
fillExpiry: 888888n,
|
|
30
|
+
},
|
|
31
|
+
minGas: 100000n,
|
|
32
|
+
originOps: EMPTY_OP,
|
|
33
|
+
destOps: EMPTY_OP,
|
|
34
|
+
q: (0, viem_1.keccak256)('0x'),
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// Hash helpers (mirror of the private functions in permit2.ts)
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
const TYPEHASH_PERMIT2_TOKEN = '0x618358ac3db8dc274f0cd8829da7e234bd48cd73c4a740aede1adec9846d06a1';
|
|
41
|
+
const TYPEHASH_TOKENOUT = '0x55550a068ac7a6c7ce02eac46ebe7c7b964dd10d7800455df1c5bc5a6685a42c';
|
|
42
|
+
const TYPEHASH_TARGET = '0xf72802bb5695954ab337feb3d113d61f4206cfaef3987552df2b2b47477db74b';
|
|
43
|
+
const TYPEHASH_OPS = '0x09b0a32e9842b65559835c235891737e06927d59e48a6f0e0512e136a513a9e4';
|
|
44
|
+
const TYPEHASH_OP = '0xdbc520cb50a8aaf3fa06ea43dc3d59d248e52ae638476e3268a1e6e36bffe196';
|
|
45
|
+
const TYPEHASH_MANDATE = '0xc988b4da10503879cf4b893fed09620229f5ade301ef5e4af6124b22823627dc';
|
|
46
|
+
function hashArray(hashes) {
|
|
47
|
+
return (0, viem_1.keccak256)(hashes.length > 0 ? (0, viem_1.concat)(hashes) : '0x');
|
|
48
|
+
}
|
|
49
|
+
function hashToken(token, amount, typehash) {
|
|
50
|
+
return (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([{ type: 'bytes32' }, { type: 'address' }, { type: 'uint256' }], [typehash, token, amount]));
|
|
51
|
+
}
|
|
52
|
+
function hashOp(op) {
|
|
53
|
+
const execHashes = Array.from(op.ops).map((e) => (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([
|
|
54
|
+
{ type: 'bytes32' },
|
|
55
|
+
{ type: 'address' },
|
|
56
|
+
{ type: 'uint256' },
|
|
57
|
+
{ type: 'bytes32' },
|
|
58
|
+
], [TYPEHASH_OPS, e.to, e.value, (0, viem_1.keccak256)(e.data)])));
|
|
59
|
+
return (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([{ type: 'bytes32' }, { type: 'bytes32' }, { type: 'bytes32' }], [TYPEHASH_OP, op.vt, hashArray(execHashes)]));
|
|
60
|
+
}
|
|
61
|
+
function hashTarget(recipient, tokenOutHash, targetChain, fillExpiry) {
|
|
62
|
+
return (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([
|
|
63
|
+
{ type: 'bytes32' },
|
|
64
|
+
{ type: 'address' },
|
|
65
|
+
{ type: 'bytes32' },
|
|
66
|
+
{ type: 'uint256' },
|
|
67
|
+
{ type: 'uint256' },
|
|
68
|
+
], [TYPEHASH_TARGET, recipient, tokenOutHash, targetChain, fillExpiry]));
|
|
69
|
+
}
|
|
70
|
+
function hashMandate(targetHash, minGas, originOpsHash, destOpsHash, q) {
|
|
71
|
+
return (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([
|
|
72
|
+
{ type: 'bytes32' },
|
|
73
|
+
{ type: 'bytes32' },
|
|
74
|
+
{ type: 'uint128' },
|
|
75
|
+
{ type: 'bytes32' },
|
|
76
|
+
{ type: 'bytes32' },
|
|
77
|
+
{ type: 'bytes32' },
|
|
78
|
+
], [TYPEHASH_MANDATE, targetHash, minGas, originOpsHash, destOpsHash, q]));
|
|
79
|
+
}
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Tests
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
(0, vitest_1.describe)('buildPermit2ClaimPolicyCalldata', () => {
|
|
84
|
+
(0, vitest_1.describe)('header', () => {
|
|
85
|
+
(0, vitest_1.test)('always starts with [spender:20][nonce:32][deadline:32]', () => {
|
|
86
|
+
const policy = { type: 'permit2-claim' };
|
|
87
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
88
|
+
const expectedHeader = (0, viem_1.encodePacked)(['address', 'uint256', 'uint256'], [baseMessage.spender, baseMessage.nonce, baseMessage.deadline]);
|
|
89
|
+
// Header is 84 bytes (20 + 32 + 32)
|
|
90
|
+
(0, vitest_1.expect)(result.slice(0, 2 + 84 * 2)).toBe(expectedHeader);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.describe)('tokenIn — hash-only mode (no tokensIn policy)', () => {
|
|
94
|
+
(0, vitest_1.test)('inserts keccak256 of token permissions array', () => {
|
|
95
|
+
const policy = { type: 'permit2-claim' };
|
|
96
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
97
|
+
const tokenHash = hashArray(baseMessage.permitted.map(({ token, amount }) => hashToken(token, amount, TYPEHASH_PERMIT2_TOKEN)));
|
|
98
|
+
// Header = 84 bytes, then 32 bytes of tokenPermissionsHash
|
|
99
|
+
const tokenHashInResult = `0x${result.slice(2 + 84 * 2, 2 + 84 * 2 + 64)}`;
|
|
100
|
+
(0, vitest_1.expect)(tokenHashInResult).toBe(tokenHash);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
(0, vitest_1.describe)('tokenIn — expanded mode (tokensIn policy set)', () => {
|
|
104
|
+
(0, vitest_1.test)('writes [count:1][token_uint256:32][amount:32] per permitted token', () => {
|
|
105
|
+
const policy = {
|
|
106
|
+
type: 'permit2-claim',
|
|
107
|
+
tokensIn: [{ chainId: 1, token: TOKEN_A }],
|
|
108
|
+
};
|
|
109
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
110
|
+
const headerLen = 84;
|
|
111
|
+
const offset = 2 + headerLen * 2;
|
|
112
|
+
// count byte
|
|
113
|
+
(0, vitest_1.expect)(result.slice(offset, offset + 2)).toBe((0, viem_1.toHex)(baseMessage.permitted.length, { size: 1 }).slice(2));
|
|
114
|
+
// token entry: address abi-encoded as uint256 (left-padded) + amount
|
|
115
|
+
const { token, amount } = baseMessage.permitted[0];
|
|
116
|
+
const expectedEntry = (0, viem_1.encodeAbiParameters)([{ type: 'address' }, { type: 'uint256' }], [token, amount]);
|
|
117
|
+
(0, vitest_1.expect)(result.slice(offset + 2, offset + 2 + 128)).toBe(expectedEntry.slice(2));
|
|
118
|
+
});
|
|
119
|
+
(0, vitest_1.test)('length increases with each permitted token', () => {
|
|
120
|
+
const policy = {
|
|
121
|
+
type: 'permit2-claim',
|
|
122
|
+
tokensIn: [{ chainId: 1, token: TOKEN_A }],
|
|
123
|
+
};
|
|
124
|
+
const msg2 = {
|
|
125
|
+
...baseMessage,
|
|
126
|
+
permitted: [
|
|
127
|
+
{ token: TOKEN_A, amount: 1000n },
|
|
128
|
+
{ token: TOKEN_B, amount: 2000n },
|
|
129
|
+
],
|
|
130
|
+
};
|
|
131
|
+
const r1 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
132
|
+
const r2 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, msg2);
|
|
133
|
+
// r2 should be 64 bytes (one extra token entry) longer than r1
|
|
134
|
+
(0, vitest_1.expect)((r2.length - r1.length) / 2).toBe(64);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
(0, vitest_1.describe)('mandate — hash-only mode (no target checks)', () => {
|
|
138
|
+
(0, vitest_1.test)('inserts pre-computed mandateHash when no target checks enabled', () => {
|
|
139
|
+
const policy = { type: 'permit2-claim' };
|
|
140
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
141
|
+
const m = baseMessage.mandate;
|
|
142
|
+
const tokenOutHash = hashArray(m.target.tokenOut.map(({ token, amount }) => hashToken(token, amount, TYPEHASH_TOKENOUT)));
|
|
143
|
+
const targetHash = hashTarget(m.target.recipient, tokenOutHash, m.target.targetChain, m.target.fillExpiry);
|
|
144
|
+
const expectedMandateHash = hashMandate(targetHash, m.minGas, hashOp(m.originOps), hashOp(m.destOps), m.q);
|
|
145
|
+
// Hash-only: header(84) + tokenPermissionsHash(32) + mandateHash(32) = 148 bytes
|
|
146
|
+
(0, vitest_1.expect)((result.length - 2) / 2).toBe(148);
|
|
147
|
+
const mandateHashInResult = `0x${result.slice(2 + (84 + 32) * 2)}`;
|
|
148
|
+
(0, vitest_1.expect)(mandateHashInResult).toBe(expectedMandateHash);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
(0, vitest_1.describe)('mandate — expanded mode (target checks enabled)', () => {
|
|
152
|
+
(0, vitest_1.test)('tokenOut policy: expands target with [count:1][token:32][amount:32]...', () => {
|
|
153
|
+
const policy = {
|
|
154
|
+
type: 'permit2-claim',
|
|
155
|
+
tokensOut: [{ chainId: 8453, token: TOKEN_B }],
|
|
156
|
+
};
|
|
157
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
158
|
+
// Expanded: header(84) + tokenPermissionsHash(32) + target[recipient:20,targetChain:32,fillExpiry:32]
|
|
159
|
+
// + tokenOut[count:1, entry:64] + minGas(16) + originOpsHash(32) + destOpsHash(32) + q(32)
|
|
160
|
+
// = 84 + 32 + 84 + 1 + 64 + 16 + 32 + 32 + 32 = 377 bytes
|
|
161
|
+
(0, vitest_1.expect)((result.length - 2) / 2).toBe(377);
|
|
162
|
+
});
|
|
163
|
+
(0, vitest_1.test)('recipient policy: expands target, tokenOut is hashed', () => {
|
|
164
|
+
const policy = {
|
|
165
|
+
type: 'permit2-claim',
|
|
166
|
+
recipients: [{ chainId: 8453, recipient: ARBITER }],
|
|
167
|
+
};
|
|
168
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
169
|
+
// Expanded: header(84) + tokenPermissionsHash(32) + target header(84)
|
|
170
|
+
// + tokenOutHash(32) + minGas(16) + originOpsHash(32) + destOpsHash(32) + q(32) = 344 bytes
|
|
171
|
+
(0, vitest_1.expect)((result.length - 2) / 2).toBe(344);
|
|
172
|
+
});
|
|
173
|
+
(0, vitest_1.test)('fillExpiry policy: expands target, tokenOut is hashed', () => {
|
|
174
|
+
const policy = {
|
|
175
|
+
type: 'permit2-claim',
|
|
176
|
+
fillExpiryBounds: [{ chainId: 8453 }],
|
|
177
|
+
};
|
|
178
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
179
|
+
(0, vitest_1.expect)((result.length - 2) / 2).toBe(344);
|
|
180
|
+
});
|
|
181
|
+
(0, vitest_1.test)('recipientIsSponsor: expands target, tokenOut is hashed', () => {
|
|
182
|
+
const policy = {
|
|
183
|
+
type: 'permit2-claim',
|
|
184
|
+
recipientIsSponsor: true,
|
|
185
|
+
};
|
|
186
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
187
|
+
(0, vitest_1.expect)((result.length - 2) / 2).toBe(344);
|
|
188
|
+
});
|
|
189
|
+
(0, vitest_1.test)('expanded target starts with [recipient:20][targetChain:32][fillExpiry:32]', () => {
|
|
190
|
+
const policy = {
|
|
191
|
+
type: 'permit2-claim',
|
|
192
|
+
recipients: [{ chainId: 8453, recipient: ARBITER }],
|
|
193
|
+
};
|
|
194
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
195
|
+
const { target } = baseMessage.mandate;
|
|
196
|
+
const expectedTargetHeader = (0, viem_1.encodePacked)(['address', 'uint256', 'uint256'], [target.recipient, target.targetChain, target.fillExpiry]);
|
|
197
|
+
// tokenPermissionsHash ends at offset 84+32=116 bytes from start
|
|
198
|
+
const targetStart = 2 + (84 + 32) * 2;
|
|
199
|
+
(0, vitest_1.expect)(result.slice(targetStart, targetStart + expectedTargetHeader.length - 2)).toBe(expectedTargetHeader.slice(2));
|
|
200
|
+
});
|
|
201
|
+
(0, vitest_1.test)('q is appended verbatim at the end', () => {
|
|
202
|
+
const policy = {
|
|
203
|
+
type: 'permit2-claim',
|
|
204
|
+
recipients: [{ chainId: 8453, recipient: ARBITER }],
|
|
205
|
+
};
|
|
206
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
207
|
+
// q is always the last 32 bytes
|
|
208
|
+
const qInResult = `0x${result.slice(result.length - 64)}`;
|
|
209
|
+
(0, vitest_1.expect)(qInResult).toBe(baseMessage.mandate.q);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
(0, vitest_1.describe)('determinism', () => {
|
|
213
|
+
(0, vitest_1.test)('same inputs always produce same output', () => {
|
|
214
|
+
const policy = {
|
|
215
|
+
type: 'permit2-claim',
|
|
216
|
+
tokensIn: [{ chainId: 1, token: TOKEN_A }],
|
|
217
|
+
tokensOut: [{ chainId: 8453, token: TOKEN_B }],
|
|
218
|
+
};
|
|
219
|
+
const r1 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
220
|
+
const r2 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, baseMessage);
|
|
221
|
+
(0, vitest_1.expect)(r1).toBe(r2);
|
|
222
|
+
});
|
|
223
|
+
(0, vitest_1.test)('hash-only and expanded modes produce different output', () => {
|
|
224
|
+
const hashOnlyPolicy = { type: 'permit2-claim' };
|
|
225
|
+
const expandedPolicy = {
|
|
226
|
+
type: 'permit2-claim',
|
|
227
|
+
tokensOut: [{ chainId: 8453, token: TOKEN_B }],
|
|
228
|
+
};
|
|
229
|
+
const r1 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(hashOnlyPolicy, baseMessage);
|
|
230
|
+
const r2 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(expandedPolicy, baseMessage);
|
|
231
|
+
(0, vitest_1.expect)(r1).not.toBe(r2);
|
|
232
|
+
(0, vitest_1.expect)(r1.length).toBeLessThan(r2.length);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
(0, vitest_1.describe)('empty arrays', () => {
|
|
236
|
+
(0, vitest_1.test)('empty permitted array hashes to keccak256 of empty bytes', () => {
|
|
237
|
+
const policy = { type: 'permit2-claim' };
|
|
238
|
+
const msgEmpty = { ...baseMessage, permitted: [] };
|
|
239
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, msgEmpty);
|
|
240
|
+
const emptyHash = (0, viem_1.keccak256)('0x');
|
|
241
|
+
const tokenHashInResult = `0x${result.slice(2 + 84 * 2, 2 + 84 * 2 + 64)}`;
|
|
242
|
+
(0, vitest_1.expect)(tokenHashInResult).toBe(emptyHash);
|
|
243
|
+
});
|
|
244
|
+
(0, vitest_1.test)('empty tokenOut array hashes to keccak256 of empty bytes in hash-only mode', () => {
|
|
245
|
+
const policy = { type: 'permit2-claim' };
|
|
246
|
+
const msgNoOut = {
|
|
247
|
+
...baseMessage,
|
|
248
|
+
mandate: {
|
|
249
|
+
...baseMessage.mandate,
|
|
250
|
+
target: { ...baseMessage.mandate.target, tokenOut: [] },
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
const r1 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, msgNoOut);
|
|
254
|
+
// Should succeed without errors and be deterministic
|
|
255
|
+
const r2 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, msgNoOut);
|
|
256
|
+
(0, vitest_1.expect)(r1).toBe(r2);
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
// ---------------------------------------------------------------------------
|
|
261
|
+
// Op hashing — non-empty ops and non-zero vt (as the orchestrator sends them)
|
|
262
|
+
// ---------------------------------------------------------------------------
|
|
263
|
+
(0, vitest_1.describe)('Op hashing with real orchestrator data shapes', () => {
|
|
264
|
+
const policy = { type: 'permit2-claim' };
|
|
265
|
+
// vt as the orchestrator produces it: bytes32(bytes2([execType, sigMode]))
|
|
266
|
+
// e.g. execType=0x04 (ERC7579), sigMode=0x01 (EMISSARY) → 0x0401 in first 2 bytes
|
|
267
|
+
const REAL_VT = `0x0401${'00'.repeat(30)}`;
|
|
268
|
+
const EXEC_A = {
|
|
269
|
+
to: TOKEN_A,
|
|
270
|
+
value: 0n,
|
|
271
|
+
data: '0xdeadbeef',
|
|
272
|
+
};
|
|
273
|
+
const EXEC_B = {
|
|
274
|
+
to: TOKEN_B,
|
|
275
|
+
value: 1000n,
|
|
276
|
+
data: '0x',
|
|
277
|
+
};
|
|
278
|
+
(0, vitest_1.test)('non-zero vt produces different hash than zero vt', () => {
|
|
279
|
+
const opZeroVt = { vt: viem_1.zeroHash, ops: [EXEC_A] };
|
|
280
|
+
const opRealVt = { vt: REAL_VT, ops: [EXEC_A] };
|
|
281
|
+
// Use hash-only mandate mode so ops hash is visible in output
|
|
282
|
+
const msgZeroVt = {
|
|
283
|
+
...baseMessage,
|
|
284
|
+
mandate: { ...baseMessage.mandate, originOps: opZeroVt },
|
|
285
|
+
};
|
|
286
|
+
const msgRealVt = {
|
|
287
|
+
...baseMessage,
|
|
288
|
+
mandate: { ...baseMessage.mandate, originOps: opRealVt },
|
|
289
|
+
};
|
|
290
|
+
const r1 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, msgZeroVt);
|
|
291
|
+
const r2 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, msgRealVt);
|
|
292
|
+
(0, vitest_1.expect)(r1).not.toBe(r2);
|
|
293
|
+
});
|
|
294
|
+
(0, vitest_1.test)('non-empty ops array produces different hash than empty ops', () => {
|
|
295
|
+
const opEmpty = { vt: REAL_VT, ops: [] };
|
|
296
|
+
const opWithExec = { vt: REAL_VT, ops: [EXEC_A] };
|
|
297
|
+
const msgEmpty = {
|
|
298
|
+
...baseMessage,
|
|
299
|
+
mandate: { ...baseMessage.mandate, originOps: opEmpty },
|
|
300
|
+
};
|
|
301
|
+
const msgWithExec = {
|
|
302
|
+
...baseMessage,
|
|
303
|
+
mandate: { ...baseMessage.mandate, originOps: opWithExec },
|
|
304
|
+
};
|
|
305
|
+
const r1 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, msgEmpty);
|
|
306
|
+
const r2 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, msgWithExec);
|
|
307
|
+
(0, vitest_1.expect)(r1).not.toBe(r2);
|
|
308
|
+
});
|
|
309
|
+
(0, vitest_1.test)('ops order matters — different order produces different hash', () => {
|
|
310
|
+
const opAB = { vt: REAL_VT, ops: [EXEC_A, EXEC_B] };
|
|
311
|
+
const opBA = { vt: REAL_VT, ops: [EXEC_B, EXEC_A] };
|
|
312
|
+
const msgAB = {
|
|
313
|
+
...baseMessage,
|
|
314
|
+
mandate: { ...baseMessage.mandate, originOps: opAB },
|
|
315
|
+
};
|
|
316
|
+
const msgBA = {
|
|
317
|
+
...baseMessage,
|
|
318
|
+
mandate: { ...baseMessage.mandate, originOps: opBA },
|
|
319
|
+
};
|
|
320
|
+
const r1 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, msgAB);
|
|
321
|
+
const r2 = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, msgBA);
|
|
322
|
+
(0, vitest_1.expect)(r1).not.toBe(r2);
|
|
323
|
+
});
|
|
324
|
+
(0, vitest_1.test)('ops hash matches manual computation (bytes32 vt encoding)', () => {
|
|
325
|
+
const op = { vt: REAL_VT, ops: [EXEC_A, EXEC_B] };
|
|
326
|
+
const msg = {
|
|
327
|
+
...baseMessage,
|
|
328
|
+
mandate: { ...baseMessage.mandate, originOps: op, destOps: EMPTY_OP },
|
|
329
|
+
};
|
|
330
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)(policy, msg);
|
|
331
|
+
// Manually compute expected mandate hash
|
|
332
|
+
const execHashA = (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([
|
|
333
|
+
{ type: 'bytes32' },
|
|
334
|
+
{ type: 'address' },
|
|
335
|
+
{ type: 'uint256' },
|
|
336
|
+
{ type: 'bytes32' },
|
|
337
|
+
], [TYPEHASH_OPS, EXEC_A.to, EXEC_A.value, (0, viem_1.keccak256)(EXEC_A.data)]));
|
|
338
|
+
const execHashB = (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([
|
|
339
|
+
{ type: 'bytes32' },
|
|
340
|
+
{ type: 'address' },
|
|
341
|
+
{ type: 'uint256' },
|
|
342
|
+
{ type: 'bytes32' },
|
|
343
|
+
], [TYPEHASH_OPS, EXEC_B.to, EXEC_B.value, (0, viem_1.keccak256)(EXEC_B.data)]));
|
|
344
|
+
const opsArrayHash = (0, viem_1.keccak256)((0, viem_1.concat)([execHashA, execHashB]));
|
|
345
|
+
const expectedOriginOpsHash = (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([{ type: 'bytes32' }, { type: 'bytes32' }, { type: 'bytes32' }], [TYPEHASH_OP, REAL_VT, opsArrayHash]));
|
|
346
|
+
const tokenOutHash = hashArray(msg.mandate.target.tokenOut.map(({ token, amount }) => hashToken(token, amount, TYPEHASH_TOKENOUT)));
|
|
347
|
+
const targetHash = hashTarget(msg.mandate.target.recipient, tokenOutHash, msg.mandate.target.targetChain, msg.mandate.target.fillExpiry);
|
|
348
|
+
const expectedMandateHash = (0, viem_1.keccak256)((0, viem_1.encodeAbiParameters)([
|
|
349
|
+
{ type: 'bytes32' },
|
|
350
|
+
{ type: 'bytes32' },
|
|
351
|
+
{ type: 'uint128' },
|
|
352
|
+
{ type: 'bytes32' },
|
|
353
|
+
{ type: 'bytes32' },
|
|
354
|
+
{ type: 'bytes32' },
|
|
355
|
+
], [
|
|
356
|
+
TYPEHASH_MANDATE,
|
|
357
|
+
targetHash,
|
|
358
|
+
msg.mandate.minGas,
|
|
359
|
+
expectedOriginOpsHash,
|
|
360
|
+
hashOp(EMPTY_OP),
|
|
361
|
+
msg.mandate.q,
|
|
362
|
+
]));
|
|
363
|
+
// mandate hash is the last 32 bytes in hash-only mode
|
|
364
|
+
const mandateHashInResult = `0x${result.slice(result.length - 64)}`;
|
|
365
|
+
(0, vitest_1.expect)(mandateHashInResult).toBe(expectedMandateHash);
|
|
366
|
+
});
|
|
367
|
+
(0, vitest_1.test)('message shape matching getTypedData output: vt as 32-byte hex from orchestrator', () => {
|
|
368
|
+
// Simulates what getTypedData in execution/permit2.ts produces:
|
|
369
|
+
// mandate.preClaimOps = { vt: <32-byte hex>, ops: Execution[] }
|
|
370
|
+
const orchestratorStyleMessage = {
|
|
371
|
+
permitted: [{ token: TOKEN_A, amount: 500000n }],
|
|
372
|
+
spender: ARBITER,
|
|
373
|
+
nonce: 1n,
|
|
374
|
+
deadline: 2000000000n,
|
|
375
|
+
mandate: {
|
|
376
|
+
target: {
|
|
377
|
+
recipient: ARBITER,
|
|
378
|
+
tokenOut: [{ token: TOKEN_B, amount: 250000n }],
|
|
379
|
+
targetChain: 8453n,
|
|
380
|
+
fillExpiry: 1999999999n,
|
|
381
|
+
},
|
|
382
|
+
minGas: 200000n,
|
|
383
|
+
// vt as bytes32 with execType=0x04 (ERC7579), sigMode=0x01 (EMISSARY)
|
|
384
|
+
originOps: { vt: `0x0401${'00'.repeat(30)}`, ops: [] },
|
|
385
|
+
destOps: { vt: `0x0401${'00'.repeat(30)}`, ops: [] },
|
|
386
|
+
q: (0, viem_1.keccak256)('0xabcdef'),
|
|
387
|
+
},
|
|
388
|
+
};
|
|
389
|
+
const result = (0, permit2_1.buildPermit2ClaimPolicyCalldata)({ type: 'permit2-claim' }, orchestratorStyleMessage);
|
|
390
|
+
// Should produce a deterministic 148-byte output (all hash-only mode)
|
|
391
|
+
(0, vitest_1.expect)((result.length - 2) / 2).toBe(148);
|
|
392
|
+
// Should be deterministic
|
|
393
|
+
(0, vitest_1.expect)((0, permit2_1.buildPermit2ClaimPolicyCalldata)({ type: 'permit2-claim' }, orchestratorStyleMessage)).toBe(result);
|
|
394
|
+
});
|
|
395
|
+
});
|
|
396
|
+
// ---------------------------------------------------------------------------
|
|
397
|
+
// encodePermit2ClaimPolicyInitData
|
|
398
|
+
// ---------------------------------------------------------------------------
|
|
399
|
+
(0, vitest_1.describe)('encodePermit2ClaimPolicyInitData', () => {
|
|
400
|
+
function modeConfigBit(fieldId) {
|
|
401
|
+
return types_1.MODE_CHECK_STORAGE << (fieldId * 2);
|
|
402
|
+
}
|
|
403
|
+
function readModeConfig(initData) {
|
|
404
|
+
return Number(BigInt(`0x${initData.slice(2, 10)}`));
|
|
405
|
+
}
|
|
406
|
+
(0, vitest_1.test)('empty policy: modeConfig=0, only 4-byte header', () => {
|
|
407
|
+
const result = (0, permit2_1.encodePermit2ClaimPolicyInitData)({ type: 'permit2-claim' });
|
|
408
|
+
// 4 bytes = 8 hex chars + '0x'
|
|
409
|
+
(0, vitest_1.expect)(result).toBe('0x00000000');
|
|
410
|
+
});
|
|
411
|
+
(0, vitest_1.test)('arbiters: sets FIELD_ARBITER mode bit and encodes [count:1][address...]', () => {
|
|
412
|
+
const policy = {
|
|
413
|
+
type: 'permit2-claim',
|
|
414
|
+
arbiters: [ARBITER],
|
|
415
|
+
};
|
|
416
|
+
const result = (0, permit2_1.encodePermit2ClaimPolicyInitData)(policy);
|
|
417
|
+
(0, vitest_1.expect)(readModeConfig(result) & modeConfigBit(types_1.FIELD_ARBITER)).toBeTruthy();
|
|
418
|
+
// After 4-byte modeConfig: count(1) + address(20) = 21 bytes
|
|
419
|
+
const expected = (0, viem_1.concat)([
|
|
420
|
+
(0, viem_1.toHex)(modeConfigBit(types_1.FIELD_ARBITER), { size: 4 }),
|
|
421
|
+
(0, viem_1.encodePacked)(['uint8', 'address'], [1, ARBITER]),
|
|
422
|
+
]);
|
|
423
|
+
(0, vitest_1.expect)(result).toBe(expected);
|
|
424
|
+
});
|
|
425
|
+
(0, vitest_1.test)('expiryBounds: sets FIELD_EXPIRY bit and encodes max<<128|min as uint256', () => {
|
|
426
|
+
const min = 1000n;
|
|
427
|
+
const max = 9999999n;
|
|
428
|
+
const policy = {
|
|
429
|
+
type: 'permit2-claim',
|
|
430
|
+
expiryBounds: { min, max },
|
|
431
|
+
};
|
|
432
|
+
const result = (0, permit2_1.encodePermit2ClaimPolicyInitData)(policy);
|
|
433
|
+
(0, vitest_1.expect)(readModeConfig(result) & modeConfigBit(types_1.FIELD_EXPIRY)).toBeTruthy();
|
|
434
|
+
const packed = (min & ((1n << 128n) - 1n)) | (max << 128n);
|
|
435
|
+
const expected = (0, viem_1.concat)([
|
|
436
|
+
(0, viem_1.toHex)(modeConfigBit(types_1.FIELD_EXPIRY), { size: 4 }),
|
|
437
|
+
(0, viem_1.toHex)(packed, { size: 32 }),
|
|
438
|
+
]);
|
|
439
|
+
(0, vitest_1.expect)(result).toBe(expected);
|
|
440
|
+
});
|
|
441
|
+
(0, vitest_1.test)('tokensIn: sets FIELD_TOKEN_IN bit and encodes [count:1][chainId:32][token:20]...', () => {
|
|
442
|
+
const policy = {
|
|
443
|
+
type: 'permit2-claim',
|
|
444
|
+
tokensIn: [{ chainId: 1, token: TOKEN_A }],
|
|
445
|
+
};
|
|
446
|
+
const result = (0, permit2_1.encodePermit2ClaimPolicyInitData)(policy);
|
|
447
|
+
(0, vitest_1.expect)(readModeConfig(result) & modeConfigBit(types_1.FIELD_TOKEN_IN)).toBeTruthy();
|
|
448
|
+
const expected = (0, viem_1.concat)([
|
|
449
|
+
(0, viem_1.toHex)(modeConfigBit(types_1.FIELD_TOKEN_IN), { size: 4 }),
|
|
450
|
+
(0, viem_1.toHex)(1, { size: 1 }),
|
|
451
|
+
(0, viem_1.encodePacked)(['uint256', 'address'], [1n, TOKEN_A]),
|
|
452
|
+
]);
|
|
453
|
+
(0, vitest_1.expect)(result).toBe(expected);
|
|
454
|
+
});
|
|
455
|
+
(0, vitest_1.test)('recipients: uses ANY_ADDRESS sentinel for "any"', () => {
|
|
456
|
+
const policy = {
|
|
457
|
+
type: 'permit2-claim',
|
|
458
|
+
recipients: [
|
|
459
|
+
{ chainId: 8453, recipient: 'any' },
|
|
460
|
+
{ chainId: 1, recipient: ARBITER },
|
|
461
|
+
],
|
|
462
|
+
};
|
|
463
|
+
const result = (0, permit2_1.encodePermit2ClaimPolicyInitData)(policy);
|
|
464
|
+
(0, vitest_1.expect)(readModeConfig(result) & modeConfigBit(types_1.FIELD_RECIPIENT)).toBeTruthy();
|
|
465
|
+
const expected = (0, viem_1.concat)([
|
|
466
|
+
(0, viem_1.toHex)(modeConfigBit(types_1.FIELD_RECIPIENT), { size: 4 }),
|
|
467
|
+
(0, viem_1.toHex)(2, { size: 1 }),
|
|
468
|
+
(0, viem_1.encodePacked)(['uint256', 'address'], [8453n, types_1.ANY_ADDRESS]),
|
|
469
|
+
(0, viem_1.encodePacked)(['uint256', 'address'], [1n, ARBITER]),
|
|
470
|
+
]);
|
|
471
|
+
(0, vitest_1.expect)(result).toBe(expected);
|
|
472
|
+
});
|
|
473
|
+
(0, vitest_1.test)('fillExpiryBounds: sets FIELD_FILL_EXPIRY bit and encodes [count:1][chainId:32][packed:32]...', () => {
|
|
474
|
+
const policy = {
|
|
475
|
+
type: 'permit2-claim',
|
|
476
|
+
fillExpiryBounds: [{ chainId: 8453, min: 100n, max: 9000n }],
|
|
477
|
+
};
|
|
478
|
+
const result = (0, permit2_1.encodePermit2ClaimPolicyInitData)(policy);
|
|
479
|
+
(0, vitest_1.expect)(readModeConfig(result) & modeConfigBit(types_1.FIELD_FILL_EXPIRY)).toBeTruthy();
|
|
480
|
+
const packed = (100n & ((1n << 128n) - 1n)) | (9000n << 128n);
|
|
481
|
+
const expected = (0, viem_1.concat)([
|
|
482
|
+
(0, viem_1.toHex)(modeConfigBit(types_1.FIELD_FILL_EXPIRY), { size: 4 }),
|
|
483
|
+
(0, viem_1.toHex)(1, { size: 1 }),
|
|
484
|
+
(0, viem_1.encodePacked)(['uint256', 'uint256'], [8453n, packed]),
|
|
485
|
+
]);
|
|
486
|
+
(0, vitest_1.expect)(result).toBe(expected);
|
|
487
|
+
});
|
|
488
|
+
(0, vitest_1.test)('tokensOut: sets FIELD_TOKEN_OUT bit', () => {
|
|
489
|
+
const policy = {
|
|
490
|
+
type: 'permit2-claim',
|
|
491
|
+
tokensOut: [{ chainId: 8453, token: TOKEN_B }],
|
|
492
|
+
};
|
|
493
|
+
const result = (0, permit2_1.encodePermit2ClaimPolicyInitData)(policy);
|
|
494
|
+
(0, vitest_1.expect)(readModeConfig(result) & modeConfigBit(types_1.FIELD_TOKEN_OUT)).toBeTruthy();
|
|
495
|
+
});
|
|
496
|
+
(0, vitest_1.test)('recipientIsSponsor: sets FIELD_RECIPIENT_IS_SPONSOR bit, no extra bytes', () => {
|
|
497
|
+
const policy = {
|
|
498
|
+
type: 'permit2-claim',
|
|
499
|
+
recipientIsSponsor: true,
|
|
500
|
+
};
|
|
501
|
+
const result = (0, permit2_1.encodePermit2ClaimPolicyInitData)(policy);
|
|
502
|
+
(0, vitest_1.expect)(readModeConfig(result) & modeConfigBit(types_1.FIELD_RECIPIENT_IS_SPONSOR)).toBeTruthy();
|
|
503
|
+
// Only modeConfig bytes — no additional payload
|
|
504
|
+
(0, vitest_1.expect)(result).toBe((0, viem_1.toHex)(modeConfigBit(types_1.FIELD_RECIPIENT_IS_SPONSOR), { size: 4 }));
|
|
505
|
+
});
|
|
506
|
+
(0, vitest_1.test)('multiple fields: all mode bits are combined correctly', () => {
|
|
507
|
+
const policy = {
|
|
508
|
+
type: 'permit2-claim',
|
|
509
|
+
arbiters: [ARBITER],
|
|
510
|
+
tokensIn: [{ chainId: 1, token: TOKEN_A }],
|
|
511
|
+
tokensOut: [{ chainId: 8453, token: TOKEN_B }],
|
|
512
|
+
};
|
|
513
|
+
const result = (0, permit2_1.encodePermit2ClaimPolicyInitData)(policy);
|
|
514
|
+
const expectedMode = modeConfigBit(types_1.FIELD_ARBITER) |
|
|
515
|
+
modeConfigBit(types_1.FIELD_TOKEN_IN) |
|
|
516
|
+
modeConfigBit(types_1.FIELD_TOKEN_OUT);
|
|
517
|
+
(0, vitest_1.expect)(readModeConfig(result)).toBe(expectedMode);
|
|
518
|
+
});
|
|
519
|
+
});
|
|
@@ -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, SessionEnableData } from '../../types';
|
|
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,11 +164,21 @@ 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 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;
|
|
167
176
|
interface ResolvedSessionSignerSet {
|
|
168
177
|
type: 'experimental_session';
|
|
169
178
|
session: Session;
|
|
170
179
|
enableData?: SessionEnableData;
|
|
171
180
|
verifyExecutions: boolean;
|
|
181
|
+
claimPolicyData?: Hex;
|
|
172
182
|
}
|
|
173
183
|
declare function packSignature(signers: ResolvedSessionSignerSet, validatorSignature: Hex): Hex;
|
|
174
184
|
declare function getSessionDetails(account: Address, sessions: Session[], provider: ProviderConfig | undefined, useDevContracts?: boolean): Promise<SessionDetails>;
|
|
@@ -181,8 +191,9 @@ declare function getEnableSessionCall(account: Address, session: Session, enable
|
|
|
181
191
|
to: `0x${string}`;
|
|
182
192
|
data: `0x${string}`;
|
|
183
193
|
}>;
|
|
184
|
-
declare function getSessionData(session: Session): SessionData;
|
|
194
|
+
declare function getSessionData(session: Session, useDevContracts?: boolean): SessionData;
|
|
185
195
|
declare function getPermissionId(session: Session): `0x${string}`;
|
|
196
|
+
declare function getPolicyData(policy: Policy, useDevContracts?: boolean): PolicyData;
|
|
186
197
|
declare function getSmartSessionValidator(config: RhinestoneConfig): Module | null;
|
|
187
198
|
/**
|
|
188
199
|
* Builds a mockSignature for SSX validation gas estimation.
|
|
@@ -193,6 +204,6 @@ declare function getSmartSessionValidator(config: RhinestoneConfig): Module | nu
|
|
|
193
204
|
* simulates verifyExecution with the mock emissary to estimate gas before the user signs.
|
|
194
205
|
*/
|
|
195
206
|
declare function buildMockSignature(session: Session, useDevContracts?: boolean, chainCount?: number): Hex;
|
|
196
|
-
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, };
|
|
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, };
|
|
197
208
|
export type { ChainSession, ChainDigest, ResolvedSessionSignerSet, SessionData, SmartSessionModeType, SessionDetails, };
|
|
198
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;AAcb,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"smart-sessions.d.ts","sourceRoot":"","sources":["../../../../modules/validators/smart-sessions.ts"],"names":[],"mappings":"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"}
|