@charterlabs/rhinestone-sdk 0.2.8 → 0.2.9
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/error.d.ts +4 -1
- package/dist/src/accounts/error.d.ts.map +1 -1
- package/dist/src/accounts/error.js +9 -1
- package/dist/src/accounts/index.d.ts +9 -2
- package/dist/src/accounts/index.d.ts.map +1 -1
- package/dist/src/accounts/index.js +26 -1
- package/dist/src/accounts/json-rpc/index.d.ts.map +1 -1
- package/dist/src/accounts/json-rpc/index.js +4 -0
- package/dist/src/accounts/json-rpc/index.test.d.ts +2 -0
- package/dist/src/accounts/json-rpc/index.test.d.ts.map +1 -0
- package/dist/src/accounts/json-rpc/index.test.js +33 -0
- package/dist/src/accounts/json-rpc/providers.d.ts +2 -1
- package/dist/src/accounts/json-rpc/providers.d.ts.map +1 -1
- package/dist/src/accounts/json-rpc/providers.js +8 -0
- package/dist/src/accounts/json-rpc/providers.test.d.ts +2 -0
- package/dist/src/accounts/json-rpc/providers.test.d.ts.map +1 -0
- package/dist/src/accounts/json-rpc/providers.test.js +43 -0
- package/dist/src/accounts/kernel.d.ts +9 -2
- package/dist/src/accounts/kernel.d.ts.map +1 -1
- package/dist/src/accounts/kernel.js +13 -0
- package/dist/src/accounts/nexus.d.ts +9 -2
- package/dist/src/accounts/nexus.d.ts.map +1 -1
- package/dist/src/accounts/nexus.js +15 -1
- package/dist/src/accounts/passport.d.ts +4 -4
- package/dist/src/accounts/passport.d.ts.map +1 -1
- package/dist/src/accounts/safe.d.ts +9 -2
- package/dist/src/accounts/safe.d.ts.map +1 -1
- package/dist/src/accounts/safe.js +15 -0
- package/dist/src/accounts/signing/common.d.ts.map +1 -1
- package/dist/src/accounts/signing/common.js +26 -5
- package/dist/src/accounts/signing/message.js +1 -1
- package/dist/src/accounts/startale.d.ts +9 -2
- package/dist/src/accounts/startale.d.ts.map +1 -1
- package/dist/src/accounts/startale.js +15 -0
- package/dist/src/accounts/walletClient.d.ts +27 -0
- package/dist/src/accounts/walletClient.d.ts.map +1 -1
- package/dist/src/accounts/walletClient.js +77 -0
- package/dist/src/actions/smart-sessions.d.ts +2 -11
- package/dist/src/actions/smart-sessions.d.ts.map +1 -1
- package/dist/src/actions/smart-sessions.js +0 -10
- package/dist/src/errors/index.d.ts +3 -3
- package/dist/src/errors/index.d.ts.map +1 -1
- package/dist/src/errors/index.js +3 -1
- package/dist/src/execution/index.d.ts +8 -3
- package/dist/src/execution/index.d.ts.map +1 -1
- package/dist/src/execution/index.js +27 -7
- package/dist/src/execution/singleChainOps.d.ts +28 -0
- package/dist/src/execution/singleChainOps.d.ts.map +1 -0
- package/dist/src/execution/{multiChainOps.js → singleChainOps.js} +7 -14
- package/dist/src/execution/smart-session.d.ts +5 -7
- package/dist/src/execution/smart-session.d.ts.map +1 -1
- package/dist/src/execution/smart-session.js +113 -228
- package/dist/src/execution/utils.d.ts +2 -2
- package/dist/src/execution/utils.d.ts.map +1 -1
- package/dist/src/execution/utils.js +81 -22
- package/dist/src/index.d.ts +14 -16
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +15 -6
- package/dist/src/modules/index.d.ts.map +1 -1
- package/dist/src/modules/index.js +1 -1
- package/dist/src/modules/validators/core.d.ts +5 -3
- package/dist/src/modules/validators/core.d.ts.map +1 -1
- package/dist/src/modules/validators/core.js +39 -2
- package/dist/src/modules/validators/smart-sessions.d.ts +6 -6
- package/dist/src/modules/validators/smart-sessions.d.ts.map +1 -1
- package/dist/src/modules/validators/smart-sessions.js +23 -12
- package/dist/src/orchestrator/client.d.ts.map +1 -1
- package/dist/src/orchestrator/client.js +13 -1
- package/dist/src/orchestrator/error.d.ts +27 -1
- package/dist/src/orchestrator/error.d.ts.map +1 -1
- package/dist/src/orchestrator/error.js +10 -1
- package/dist/src/orchestrator/index.d.ts +6 -6
- package/dist/src/orchestrator/index.d.ts.map +1 -1
- package/dist/src/orchestrator/index.js +4 -3
- package/dist/src/orchestrator/registry.d.ts +6 -2
- package/dist/src/orchestrator/registry.d.ts.map +1 -1
- package/dist/src/orchestrator/registry.js +16 -64
- package/dist/src/orchestrator/registry.test.js +24 -24
- package/dist/src/orchestrator/types.d.ts +37 -23
- package/dist/src/orchestrator/types.d.ts.map +1 -1
- package/dist/src/orchestrator/types.js +9 -5
- package/dist/src/types.d.ts +30 -7
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/src/execution/multiChainOps.d.ts +0 -40
- package/dist/src/execution/multiChainOps.d.ts.map +0 -1
- package/dist/src/execution/smart-session.test.d.ts +0 -2
- package/dist/src/execution/smart-session.test.d.ts.map +0 -1
- package/dist/src/execution/smart-session.test.js +0 -34
|
@@ -2,113 +2,137 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.enableSmartSession = enableSmartSession;
|
|
4
4
|
exports.getSessionDetails = getSessionDetails;
|
|
5
|
-
exports.getMultichainDigest = getMultichainDigest;
|
|
6
5
|
const viem_1 = require("viem");
|
|
7
6
|
const accounts_1 = require("../accounts");
|
|
8
7
|
const utils_1 = require("../accounts/utils");
|
|
9
8
|
const validators_1 = require("../modules/validators");
|
|
10
9
|
const smart_sessions_1 = require("../modules/validators/smart-sessions");
|
|
11
10
|
const error_1 = require("./error");
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
const smartSessionTypes = {
|
|
12
|
+
PolicyData: [
|
|
13
|
+
{ name: 'policy', type: 'address' },
|
|
14
|
+
{ name: 'initData', type: 'bytes' },
|
|
15
|
+
],
|
|
16
|
+
ActionData: [
|
|
17
|
+
{ name: 'actionTargetSelector', type: 'bytes4' },
|
|
18
|
+
{ name: 'actionTarget', type: 'address' },
|
|
19
|
+
{ name: 'actionPolicies', type: 'PolicyData[]' },
|
|
20
|
+
],
|
|
21
|
+
ERC7739Context: [
|
|
22
|
+
{ name: 'appDomainSeparator', type: 'bytes32' },
|
|
23
|
+
{ name: 'contentName', type: 'string[]' },
|
|
24
|
+
],
|
|
25
|
+
ERC7739Data: [
|
|
26
|
+
{ name: 'allowedERC7739Content', type: 'ERC7739Context[]' },
|
|
27
|
+
{ name: 'erc1271Policies', type: 'PolicyData[]' },
|
|
28
|
+
],
|
|
29
|
+
SignedPermissions: [
|
|
30
|
+
{ name: 'permitGenericPolicy', type: 'bool' },
|
|
31
|
+
{ name: 'permitAdminAccess', type: 'bool' },
|
|
32
|
+
{ name: 'ignoreSecurityAttestations', type: 'bool' },
|
|
33
|
+
{ name: 'permitERC4337Paymaster', type: 'bool' },
|
|
34
|
+
{ name: 'userOpPolicies', type: 'PolicyData[]' },
|
|
35
|
+
{ name: 'erc7739Policies', type: 'ERC7739Data' },
|
|
36
|
+
{ name: 'actions', type: 'ActionData[]' },
|
|
37
|
+
],
|
|
38
|
+
SignedSession: [
|
|
39
|
+
{ name: 'account', type: 'address' },
|
|
40
|
+
{ name: 'permissions', type: 'SignedPermissions' },
|
|
41
|
+
{ name: 'sessionValidator', type: 'address' },
|
|
42
|
+
{ name: 'sessionValidatorInitData', type: 'bytes' },
|
|
43
|
+
{ name: 'salt', type: 'bytes32' },
|
|
44
|
+
{ name: 'smartSession', type: 'address' },
|
|
45
|
+
{ name: 'nonce', type: 'uint256' },
|
|
46
|
+
],
|
|
47
|
+
ChainSession: [
|
|
48
|
+
{ name: 'chainId', type: 'uint64' },
|
|
49
|
+
{ name: 'session', type: 'SignedSession' },
|
|
50
|
+
],
|
|
51
|
+
MultiChainSession: [{ name: 'sessionsAndChainIds', type: 'ChainSession[]' }],
|
|
52
|
+
};
|
|
53
|
+
async function getSessionDetails(config, sessions, sessionIndex, initialNonces, signature) {
|
|
54
|
+
const chains = sessions
|
|
55
|
+
.map((session) => session.chain)
|
|
56
|
+
.filter((chain) => !!chain);
|
|
57
|
+
if (chains.length !== sessions.length) {
|
|
58
|
+
throw new error_1.SessionChainRequiredError();
|
|
59
|
+
}
|
|
14
60
|
const accountAddress = (0, accounts_1.getAddress)(config);
|
|
15
|
-
const
|
|
61
|
+
const publicClients = chains.map((chain) => (0, viem_1.createPublicClient)({
|
|
62
|
+
chain,
|
|
63
|
+
transport: (0, utils_1.createTransport)(chain, config.provider),
|
|
64
|
+
}));
|
|
65
|
+
const sessionDatas = sessions.map((session) => (0, smart_sessions_1.getSmartSessionData)(session));
|
|
66
|
+
const sessionNonces = await Promise.all(sessions.map((session, index) => initialNonces?.[index] ??
|
|
67
|
+
getSessionNonce(publicClients[index], accountAddress, (0, validators_1.getPermissionId)(session))));
|
|
68
|
+
const signedSessions = sessionDatas.map((session, index) => ({
|
|
69
|
+
account: accountAddress,
|
|
70
|
+
permissions: {
|
|
71
|
+
permitGenericPolicy: session.actions.some((action) => action.actionTarget === smart_sessions_1.SMART_SESSIONS_FALLBACK_TARGET_FLAG &&
|
|
72
|
+
action.actionTargetSelector ===
|
|
73
|
+
smart_sessions_1.SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG),
|
|
74
|
+
permitAdminAccess: session.actions.some((action) => action.actionTargetSelector ===
|
|
75
|
+
smart_sessions_1.SMART_SESSIONS_FALLBACK_TARGET_SELECTOR_FLAG_PERMITTED_TO_CALL_SMARTSESSION),
|
|
76
|
+
ignoreSecurityAttestations: false,
|
|
77
|
+
permitERC4337Paymaster: session.permitERC4337Paymaster,
|
|
78
|
+
userOpPolicies: session.userOpPolicies,
|
|
79
|
+
erc7739Policies: session.erc7739Policies,
|
|
80
|
+
actions: session.actions,
|
|
81
|
+
},
|
|
82
|
+
sessionValidator: session.sessionValidator,
|
|
83
|
+
sessionValidatorInitData: session.sessionValidatorInitData,
|
|
84
|
+
salt: session.salt,
|
|
85
|
+
smartSession: validators_1.SMART_SESSIONS_VALIDATOR_ADDRESS,
|
|
86
|
+
nonce: sessionNonces[index],
|
|
87
|
+
}));
|
|
88
|
+
const chainDigests = signedSessions.map((session, index) => ({
|
|
89
|
+
chainId: BigInt(chains[index].id),
|
|
90
|
+
sessionDigest: (0, viem_1.hashStruct)({
|
|
91
|
+
types: smartSessionTypes,
|
|
92
|
+
primaryType: 'SignedSession',
|
|
93
|
+
data: session,
|
|
94
|
+
}),
|
|
95
|
+
}));
|
|
96
|
+
const typedData = {
|
|
97
|
+
domain: {
|
|
98
|
+
name: 'SmartSession',
|
|
99
|
+
version: '1',
|
|
100
|
+
},
|
|
101
|
+
types: smartSessionTypes,
|
|
102
|
+
primaryType: 'MultiChainSession',
|
|
103
|
+
message: {
|
|
104
|
+
sessionsAndChainIds: signedSessions.map((session, index) => ({
|
|
105
|
+
chainId: BigInt(chains[index].id),
|
|
106
|
+
session,
|
|
107
|
+
})),
|
|
108
|
+
},
|
|
109
|
+
};
|
|
16
110
|
const chain = sessions[sessionIndex].chain;
|
|
17
111
|
if (!chain) {
|
|
18
112
|
throw new error_1.SessionChainRequiredError();
|
|
19
113
|
}
|
|
20
114
|
const validator = {
|
|
21
|
-
address:
|
|
22
|
-
isRoot:
|
|
115
|
+
address: sessionDatas[sessionIndex].sessionValidator,
|
|
116
|
+
isRoot: false,
|
|
23
117
|
};
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
(await (0, accounts_1.getPackedSignature)(config, undefined, chain, validator, sessionDetails.permissionEnableHash));
|
|
27
|
-
return sessionDetails;
|
|
28
|
-
}
|
|
29
|
-
async function getEnableSessionDetails(accountType, sessions, sessionIndex, accountAddress, provider) {
|
|
30
|
-
const chainDigests = [];
|
|
31
|
-
const chainSessions = [];
|
|
32
|
-
for (const session of sessions) {
|
|
33
|
-
const permissionId = (0, validators_1.getPermissionId)(session);
|
|
34
|
-
const sessionChain = session.chain;
|
|
35
|
-
if (!sessionChain) {
|
|
36
|
-
throw new error_1.SessionChainRequiredError();
|
|
37
|
-
}
|
|
38
|
-
const publicClient = (0, viem_1.createPublicClient)({
|
|
39
|
-
chain: sessionChain,
|
|
40
|
-
transport: (0, utils_1.createTransport)(sessionChain, provider),
|
|
41
|
-
});
|
|
42
|
-
const sessionNonce = await getSessionNonce(publicClient, accountAddress, permissionId);
|
|
43
|
-
const sessionData = await (0, smart_sessions_1.getSessionData)(session);
|
|
44
|
-
const sessionDigest = await getSessionDigest(publicClient, accountAddress, sessionData, permissionId, validators_1.SMART_SESSION_MODE_ENABLE);
|
|
45
|
-
chainDigests.push({
|
|
46
|
-
chainId: BigInt(sessionChain.id),
|
|
47
|
-
sessionDigest,
|
|
48
|
-
});
|
|
49
|
-
chainSessions.push({
|
|
50
|
-
chainId: BigInt(sessionChain.id),
|
|
51
|
-
session: {
|
|
52
|
-
permissions: {
|
|
53
|
-
permitGenericPolicy: false,
|
|
54
|
-
permitAdminAccess: false,
|
|
55
|
-
ignoreSecurityAttestations: false,
|
|
56
|
-
permitERC4337Paymaster: sessionData.permitERC4337Paymaster,
|
|
57
|
-
userOpPolicies: sessionData.userOpPolicies,
|
|
58
|
-
erc7739Policies: sessionData.erc7739Policies,
|
|
59
|
-
actions: sessionData.actions,
|
|
60
|
-
},
|
|
61
|
-
salt: sessionData.salt,
|
|
62
|
-
sessionValidator: sessionData.sessionValidator,
|
|
63
|
-
sessionValidatorInitData: sessionData.sessionValidatorInitData,
|
|
64
|
-
account: accountAddress,
|
|
65
|
-
smartSession: validators_1.SMART_SESSIONS_VALIDATOR_ADDRESS,
|
|
66
|
-
nonce: sessionNonce,
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
const permissionEnableHash = getMultichainDigest(chainDigests);
|
|
71
|
-
const sessionToEnable = sessions[sessionIndex || 0];
|
|
72
|
-
const sessionChain = sessionToEnable.chain;
|
|
73
|
-
if (!sessionChain) {
|
|
74
|
-
throw new error_1.SessionChainRequiredError();
|
|
75
|
-
}
|
|
76
|
-
const sessionData = await (0, smart_sessions_1.getSessionData)(sessionToEnable);
|
|
118
|
+
const sessionSignature = signature ??
|
|
119
|
+
(await (0, accounts_1.getTypedDataPackedSignature)(config, undefined, chain, validator, typedData));
|
|
77
120
|
return {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
hashesAndChainIds: chainDigests,
|
|
121
|
+
nonces: sessionNonces,
|
|
122
|
+
signature: sessionSignature,
|
|
81
123
|
enableSessionData: {
|
|
82
|
-
permissionId: (0, validators_1.getPermissionId)(sessionToEnable),
|
|
83
|
-
validator: sessionData.sessionValidator,
|
|
84
|
-
accountType,
|
|
85
124
|
chainDigestIndex: sessionIndex,
|
|
86
|
-
hashesAndChainIds: chainDigests
|
|
87
|
-
|
|
88
|
-
|
|
125
|
+
hashesAndChainIds: chainDigests.map((chainDigest) => ({
|
|
126
|
+
chainId: BigInt(chainDigest.chainId),
|
|
127
|
+
sessionDigest: chainDigest.sessionDigest,
|
|
128
|
+
})),
|
|
129
|
+
sessionToEnable: sessionDatas[sessionIndex],
|
|
130
|
+
signature: sessionSignature,
|
|
89
131
|
},
|
|
90
132
|
};
|
|
91
133
|
}
|
|
92
|
-
function getMultichainDigest(chainDigests) {
|
|
93
|
-
function hashChainDigestMimicRPC(chainDigest) {
|
|
94
|
-
const CHAIN_SESSION_TYPEHASH = '0x1ea7e4bc398fa0ccd68d92b5d8931a3fd93eebe1cf0391b4ba28935801af7c80';
|
|
95
|
-
return (0, viem_1.keccak256)((0, viem_1.encodePacked)(['bytes32', 'uint256', 'bytes32'], [
|
|
96
|
-
CHAIN_SESSION_TYPEHASH,
|
|
97
|
-
chainDigest.chainId,
|
|
98
|
-
chainDigest.sessionDigest,
|
|
99
|
-
]));
|
|
100
|
-
}
|
|
101
|
-
function hashChainDigestArray(chainDigests) {
|
|
102
|
-
const hashes = chainDigests.map((digest) => hashChainDigestMimicRPC(digest));
|
|
103
|
-
return (0, viem_1.keccak256)((0, viem_1.concat)(hashes));
|
|
104
|
-
}
|
|
105
|
-
const MULTICHAIN_SESSION_TYPEHASH = '0x0c9d02fb89a1da34d66ea2088dc9ee6a58efee71cef6f1bb849ed74fc6003d98';
|
|
106
|
-
const MULTICHAIN_DOMAIN_SEPARATOR = '0x057501e891776d1482927e5f094ae44049a4d893ba2d7b334dd7db8d38d3a0e1';
|
|
107
|
-
const structHash = (0, viem_1.keccak256)((0, viem_1.encodePacked)(['bytes32', 'bytes32'], [MULTICHAIN_SESSION_TYPEHASH, hashChainDigestArray(chainDigests)]));
|
|
108
|
-
return (0, viem_1.keccak256)((0, viem_1.concat)(['0x1901', MULTICHAIN_DOMAIN_SEPARATOR, structHash]));
|
|
109
|
-
}
|
|
110
134
|
async function getSessionNonce(client, account, permissionId) {
|
|
111
|
-
|
|
135
|
+
const nonce = await client.readContract({
|
|
112
136
|
address: validators_1.SMART_SESSIONS_VALIDATOR_ADDRESS,
|
|
113
137
|
abi: [
|
|
114
138
|
{
|
|
@@ -128,147 +152,8 @@ async function getSessionNonce(client, account, permissionId) {
|
|
|
128
152
|
],
|
|
129
153
|
functionName: 'getNonce',
|
|
130
154
|
args: [permissionId, account],
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
async function getSessionDigest(client, account, session, permissionId, mode) {
|
|
134
|
-
return (await client.readContract({
|
|
135
|
-
address: validators_1.SMART_SESSIONS_VALIDATOR_ADDRESS,
|
|
136
|
-
abi: [
|
|
137
|
-
{
|
|
138
|
-
type: 'function',
|
|
139
|
-
name: 'getSessionDigest',
|
|
140
|
-
inputs: [
|
|
141
|
-
{
|
|
142
|
-
name: 'permissionId',
|
|
143
|
-
type: 'bytes32',
|
|
144
|
-
internalType: 'PermissionId',
|
|
145
|
-
},
|
|
146
|
-
{ name: 'account', type: 'address', internalType: 'address' },
|
|
147
|
-
{
|
|
148
|
-
name: 'data',
|
|
149
|
-
type: 'tuple',
|
|
150
|
-
internalType: 'struct Session',
|
|
151
|
-
components: [
|
|
152
|
-
{
|
|
153
|
-
name: 'sessionValidator',
|
|
154
|
-
type: 'address',
|
|
155
|
-
internalType: 'contract ISessionValidator',
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
name: 'sessionValidatorInitData',
|
|
159
|
-
type: 'bytes',
|
|
160
|
-
internalType: 'bytes',
|
|
161
|
-
},
|
|
162
|
-
{ name: 'salt', type: 'bytes32', internalType: 'bytes32' },
|
|
163
|
-
{
|
|
164
|
-
name: 'userOpPolicies',
|
|
165
|
-
type: 'tuple[]',
|
|
166
|
-
internalType: 'struct PolicyData[]',
|
|
167
|
-
components: [
|
|
168
|
-
{
|
|
169
|
-
name: 'policy',
|
|
170
|
-
type: 'address',
|
|
171
|
-
internalType: 'address',
|
|
172
|
-
},
|
|
173
|
-
{ name: 'initData', type: 'bytes', internalType: 'bytes' },
|
|
174
|
-
],
|
|
175
|
-
},
|
|
176
|
-
{
|
|
177
|
-
name: 'erc7739Policies',
|
|
178
|
-
type: 'tuple',
|
|
179
|
-
internalType: 'struct ERC7739Data',
|
|
180
|
-
components: [
|
|
181
|
-
{
|
|
182
|
-
name: 'allowedERC7739Content',
|
|
183
|
-
type: 'tuple[]',
|
|
184
|
-
internalType: 'struct ERC7739Context[]',
|
|
185
|
-
components: [
|
|
186
|
-
{
|
|
187
|
-
name: 'appDomainSeparator',
|
|
188
|
-
type: 'bytes32',
|
|
189
|
-
internalType: 'bytes32',
|
|
190
|
-
},
|
|
191
|
-
{
|
|
192
|
-
name: 'contentName',
|
|
193
|
-
type: 'string[]',
|
|
194
|
-
internalType: 'string[]',
|
|
195
|
-
},
|
|
196
|
-
],
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
name: 'erc1271Policies',
|
|
200
|
-
type: 'tuple[]',
|
|
201
|
-
internalType: 'struct PolicyData[]',
|
|
202
|
-
components: [
|
|
203
|
-
{
|
|
204
|
-
name: 'policy',
|
|
205
|
-
type: 'address',
|
|
206
|
-
internalType: 'address',
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
name: 'initData',
|
|
210
|
-
type: 'bytes',
|
|
211
|
-
internalType: 'bytes',
|
|
212
|
-
},
|
|
213
|
-
],
|
|
214
|
-
},
|
|
215
|
-
],
|
|
216
|
-
},
|
|
217
|
-
{
|
|
218
|
-
name: 'actions',
|
|
219
|
-
type: 'tuple[]',
|
|
220
|
-
internalType: 'struct ActionData[]',
|
|
221
|
-
components: [
|
|
222
|
-
{
|
|
223
|
-
name: 'actionTargetSelector',
|
|
224
|
-
type: 'bytes4',
|
|
225
|
-
internalType: 'bytes4',
|
|
226
|
-
},
|
|
227
|
-
{
|
|
228
|
-
name: 'actionTarget',
|
|
229
|
-
type: 'address',
|
|
230
|
-
internalType: 'address',
|
|
231
|
-
},
|
|
232
|
-
{
|
|
233
|
-
name: 'actionPolicies',
|
|
234
|
-
type: 'tuple[]',
|
|
235
|
-
internalType: 'struct PolicyData[]',
|
|
236
|
-
components: [
|
|
237
|
-
{
|
|
238
|
-
name: 'policy',
|
|
239
|
-
type: 'address',
|
|
240
|
-
internalType: 'address',
|
|
241
|
-
},
|
|
242
|
-
{
|
|
243
|
-
name: 'initData',
|
|
244
|
-
type: 'bytes',
|
|
245
|
-
internalType: 'bytes',
|
|
246
|
-
},
|
|
247
|
-
],
|
|
248
|
-
},
|
|
249
|
-
],
|
|
250
|
-
},
|
|
251
|
-
{
|
|
252
|
-
name: 'permitERC4337Paymaster',
|
|
253
|
-
type: 'bool',
|
|
254
|
-
internalType: 'bool',
|
|
255
|
-
},
|
|
256
|
-
],
|
|
257
|
-
},
|
|
258
|
-
{
|
|
259
|
-
name: 'mode',
|
|
260
|
-
type: 'uint8',
|
|
261
|
-
internalType: 'enum SmartSessionMode',
|
|
262
|
-
},
|
|
263
|
-
],
|
|
264
|
-
outputs: [{ name: '', type: 'bytes32', internalType: 'bytes32' }],
|
|
265
|
-
stateMutability: 'view',
|
|
266
|
-
},
|
|
267
|
-
],
|
|
268
|
-
functionName: 'getSessionDigest',
|
|
269
|
-
// @ts-ignore Viem fails to infer the type of "session"
|
|
270
|
-
args: [permissionId, account, session, Number(mode)],
|
|
271
|
-
}));
|
|
155
|
+
});
|
|
156
|
+
return nonce;
|
|
272
157
|
}
|
|
273
158
|
async function enableSmartSession(chain, config, session) {
|
|
274
159
|
const publicClient = (0, viem_1.createPublicClient)({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type Address, type Chain, type HashTypedDataParameters, type Hex, type PublicClient, type SignableMessage, type SignedAuthorization, type SignedAuthorizationList, type TypedData } from 'viem';
|
|
2
2
|
import { type UserOperation } from 'viem/account-abstraction';
|
|
3
3
|
import { type IntentOp, type IntentRoute } from '../orchestrator';
|
|
4
|
-
import type
|
|
4
|
+
import { type Account, type SettlementLayer } from '../orchestrator/types';
|
|
5
5
|
import type { Call, CalldataInput, CallInput, RhinestoneConfig, SignerSet, SourceAssetInput, TokenRequest, TokenSymbol, Transaction, UserOperationTransaction } from '../types';
|
|
6
6
|
interface UserOperationResult {
|
|
7
7
|
type: 'userop';
|
|
@@ -42,7 +42,7 @@ declare function signAuthorizationsInternal(config: RhinestoneConfig, data: Inte
|
|
|
42
42
|
declare function submitTransaction(config: RhinestoneConfig, signedTransaction: SignedTransactionData, authorizations: SignedAuthorizationList, dryRun?: boolean): Promise<TransactionResult>;
|
|
43
43
|
declare function submitUserOperation(config: RhinestoneConfig, signedUserOperation: SignedUserOperationData): Promise<UserOperationResult>;
|
|
44
44
|
declare function getTokenRequests(sourceChains: Chain[], targetChain: Chain, initialTokenRequests: TokenRequest[] | undefined, settlementLayers: SettlementLayer[] | undefined): TokenRequest[];
|
|
45
|
-
declare function prepareTransactionAsIntent(config: RhinestoneConfig, sourceChains: Chain[] | undefined, targetChain: Chain, callInputs: CalldataInput[], gasLimit: bigint | undefined, tokenRequests: TokenRequest[], accountAddress: Address, isSponsored: boolean, eip7702InitSignature: Hex | undefined, settlementLayers: SettlementLayer[] | undefined, sourceAssets: SourceAssetInput | undefined, feeAsset: Address | TokenSymbol | undefined, lockFunds?: boolean, account?: {
|
|
45
|
+
declare function prepareTransactionAsIntent(config: RhinestoneConfig, sourceChains: Chain[] | undefined, targetChain: Chain, callInputs: CalldataInput[], gasLimit: bigint | undefined, tokenRequests: TokenRequest[], recipient: Account | undefined, accountAddress: Address, isSponsored: boolean, eip7702InitSignature: Hex | undefined, settlementLayers: SettlementLayer[] | undefined, sourceAssets: SourceAssetInput | undefined, feeAsset: Address | TokenSymbol | undefined, lockFunds?: boolean, account?: {
|
|
46
46
|
setupOps?: {
|
|
47
47
|
to: Address;
|
|
48
48
|
data: Hex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../execution/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../execution/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ exports.getTokenRequests = getTokenRequests;
|
|
|
20
20
|
exports.resolveCallInputs = resolveCallInputs;
|
|
21
21
|
const viem_1 = require("viem");
|
|
22
22
|
const account_abstraction_1 = require("viem/account-abstraction");
|
|
23
|
+
const erc7739_1 = require("viem/experimental/erc7739");
|
|
23
24
|
const accounts_1 = require("../accounts");
|
|
24
25
|
const utils_1 = require("../accounts/utils");
|
|
25
26
|
const modules_1 = require("../modules");
|
|
@@ -28,18 +29,19 @@ const core_1 = require("../modules/validators/core");
|
|
|
28
29
|
const orchestrator_1 = require("../orchestrator");
|
|
29
30
|
const consts_1 = require("../orchestrator/consts");
|
|
30
31
|
const registry_1 = require("../orchestrator/registry");
|
|
32
|
+
const types_1 = require("../orchestrator/types");
|
|
31
33
|
const compact_1 = require("./compact");
|
|
32
34
|
const error_1 = require("./error");
|
|
33
|
-
const multiChainOps_1 = require("./multiChainOps");
|
|
34
35
|
const permit2_1 = require("./permit2");
|
|
36
|
+
const singleChainOps_1 = require("./singleChainOps");
|
|
35
37
|
async function prepareTransaction(config, transaction) {
|
|
36
|
-
const { sourceChains, targetChain, tokenRequests, signers, sponsored, eip7702InitSignature, settlementLayers, sourceAssets, feeAsset, lockFunds, account, } = getTransactionParams(transaction);
|
|
38
|
+
const { sourceChains, targetChain, tokenRequests, signers, sponsored, eip7702InitSignature, settlementLayers, sourceAssets, feeAsset, lockFunds, account, recipient, } = getTransactionParams(transaction);
|
|
37
39
|
const accountAddress = (0, accounts_1.getAddress)(config);
|
|
38
40
|
const isUserOpSigner = signers?.type === 'guardians' || signers?.type === 'session';
|
|
39
41
|
if (isUserOpSigner) {
|
|
40
42
|
throw new error_1.SignerNotSupportedError();
|
|
41
43
|
}
|
|
42
|
-
const intentRoute = await prepareTransactionAsIntent(config, sourceChains, targetChain, await resolveCallInputs(transaction.calls, config, targetChain, accountAddress), transaction.gasLimit, tokenRequests, accountAddress, sponsored ?? false, eip7702InitSignature, settlementLayers, sourceAssets, feeAsset, lockFunds, account);
|
|
44
|
+
const intentRoute = await prepareTransactionAsIntent(config, sourceChains, targetChain, await resolveCallInputs(transaction.calls, config, targetChain, accountAddress), transaction.gasLimit, tokenRequests, recipient, accountAddress, sponsored ?? false, eip7702InitSignature, settlementLayers, sourceAssets, feeAsset, lockFunds, account);
|
|
43
45
|
return {
|
|
44
46
|
intentRoute,
|
|
45
47
|
transaction,
|
|
@@ -122,12 +124,54 @@ async function signTypedData(config, parameters, chain, signers) {
|
|
|
122
124
|
}
|
|
123
125
|
const ownerValidator = (0, validators_1.getOwnerValidator)(config);
|
|
124
126
|
const isRoot = validator.address === ownerValidator.address;
|
|
127
|
+
if (signers?.type === 'session') {
|
|
128
|
+
return await signTypedDataWithSession(config, chain, {
|
|
129
|
+
address: validator.address,
|
|
130
|
+
isRoot,
|
|
131
|
+
}, signers, parameters);
|
|
132
|
+
}
|
|
125
133
|
const signature = await (0, accounts_1.getTypedDataPackedSignature)(config, signers, chain, {
|
|
126
134
|
address: validator.address,
|
|
127
135
|
isRoot,
|
|
128
136
|
}, parameters);
|
|
129
137
|
return await (0, accounts_1.toErc6492Signature)(config, signature, chain);
|
|
130
138
|
}
|
|
139
|
+
async function signTypedDataWithSession(config, chain, validator, signers, parameters) {
|
|
140
|
+
const { name, version, chainId, verifyingContract, salt } = (0, accounts_1.getEip712Domain)(config, chain);
|
|
141
|
+
const signature = await (0, accounts_1.getTypedDataPackedSignature)(config, signers, chain, validator, {
|
|
142
|
+
domain: parameters.domain,
|
|
143
|
+
primaryType: 'TypedDataSign',
|
|
144
|
+
types: {
|
|
145
|
+
...parameters.types,
|
|
146
|
+
TypedDataSign: [
|
|
147
|
+
{ name: 'contents', type: parameters.primaryType },
|
|
148
|
+
{ name: 'name', type: 'string' },
|
|
149
|
+
{ name: 'version', type: 'string' },
|
|
150
|
+
{ name: 'chainId', type: 'uint256' },
|
|
151
|
+
{ name: 'verifyingContract', type: 'address' },
|
|
152
|
+
{ name: 'salt', type: 'bytes32' },
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
message: {
|
|
156
|
+
contents: parameters.message,
|
|
157
|
+
name,
|
|
158
|
+
version,
|
|
159
|
+
chainId,
|
|
160
|
+
verifyingContract,
|
|
161
|
+
salt,
|
|
162
|
+
},
|
|
163
|
+
}, (signature) => {
|
|
164
|
+
const erc7739Signature = (0, erc7739_1.wrapTypedDataSignature)({
|
|
165
|
+
domain: parameters.domain,
|
|
166
|
+
primaryType: parameters.primaryType,
|
|
167
|
+
types: parameters.types,
|
|
168
|
+
message: parameters.message,
|
|
169
|
+
signature,
|
|
170
|
+
});
|
|
171
|
+
return (0, viem_1.encodePacked)(['bytes32', 'bytes'], [(0, validators_1.getPermissionId)(signers.session), erc7739Signature]);
|
|
172
|
+
});
|
|
173
|
+
return await (0, accounts_1.toErc6492Signature)(config, signature, chain);
|
|
174
|
+
}
|
|
131
175
|
async function signAuthorizationsInternal(config, data) {
|
|
132
176
|
const eoa = config.eoa;
|
|
133
177
|
if (!eoa) {
|
|
@@ -190,6 +234,7 @@ function getTransactionParams(transaction) {
|
|
|
190
234
|
const feeAsset = transaction.feeAsset;
|
|
191
235
|
const lockFunds = transaction.lockFunds;
|
|
192
236
|
const account = transaction.experimental_accountOverride;
|
|
237
|
+
const recipient = transaction.recipient;
|
|
193
238
|
const tokenRequests = getTokenRequests(sourceChains || [], targetChain, initialTokenRequests, settlementLayers);
|
|
194
239
|
return {
|
|
195
240
|
sourceChains,
|
|
@@ -204,6 +249,7 @@ function getTransactionParams(transaction) {
|
|
|
204
249
|
feeAsset,
|
|
205
250
|
lockFunds,
|
|
206
251
|
account,
|
|
252
|
+
recipient,
|
|
207
253
|
};
|
|
208
254
|
}
|
|
209
255
|
function getTokenRequests(sourceChains, targetChain, initialTokenRequests, settlementLayers) {
|
|
@@ -250,7 +296,7 @@ async function prepareTransactionAsUserOp(config, chain, callInputs, signers, ga
|
|
|
250
296
|
}),
|
|
251
297
|
};
|
|
252
298
|
}
|
|
253
|
-
async function prepareTransactionAsIntent(config, sourceChains, targetChain, callInputs, gasLimit, tokenRequests, accountAddress, isSponsored, eip7702InitSignature, settlementLayers, sourceAssets, feeAsset, lockFunds, account) {
|
|
299
|
+
async function prepareTransactionAsIntent(config, sourceChains, targetChain, callInputs, gasLimit, tokenRequests, recipient, accountAddress, isSponsored, eip7702InitSignature, settlementLayers, sourceAssets, feeAsset, lockFunds, account) {
|
|
254
300
|
const calls = parseCalls(callInputs, targetChain.id);
|
|
255
301
|
const accountAccessList = createAccountAccessList(sourceChains, sourceAssets);
|
|
256
302
|
const { setupOps, delegations } = await getSetupOperationsAndDelegations(config, accountAddress, eip7702InitSignature);
|
|
@@ -265,10 +311,11 @@ async function prepareTransactionAsIntent(config, sourceChains, targetChain, cal
|
|
|
265
311
|
const accountType = getAccountType(config);
|
|
266
312
|
const metaIntent = {
|
|
267
313
|
destinationChainId: targetChain.id,
|
|
268
|
-
|
|
314
|
+
tokenRequests: tokenRequests.map((tokenRequest) => ({
|
|
269
315
|
tokenAddress: (0, registry_1.resolveTokenAddress)(tokenRequest.address, targetChain.id),
|
|
270
316
|
amount: tokenRequest.amount,
|
|
271
317
|
})),
|
|
318
|
+
recipient,
|
|
272
319
|
account: {
|
|
273
320
|
address: accountAddress,
|
|
274
321
|
accountType: accountType,
|
|
@@ -320,9 +367,10 @@ async function signIntent(config, targetChain, intentOp, signers) {
|
|
|
320
367
|
throw new accounts_1.EoaSigningMethodNotConfiguredError('signTypedData, sign, or signMessage');
|
|
321
368
|
}
|
|
322
369
|
}
|
|
370
|
+
const destinationSignature = originSignatures.at(-1);
|
|
323
371
|
return {
|
|
324
372
|
originSignatures,
|
|
325
|
-
destinationSignature
|
|
373
|
+
destinationSignature,
|
|
326
374
|
};
|
|
327
375
|
}
|
|
328
376
|
const validator = getValidator(config, signers);
|
|
@@ -332,20 +380,21 @@ async function signIntent(config, targetChain, intentOp, signers) {
|
|
|
332
380
|
const ownerValidator = (0, validators_1.getOwnerValidator)(config);
|
|
333
381
|
const isRoot = validator.address === ownerValidator.address;
|
|
334
382
|
const signatures = await getIntentSignature(config, intentOp, signers, targetChain, validator, isRoot);
|
|
335
|
-
return
|
|
383
|
+
return {
|
|
384
|
+
originSignatures: signatures.originSignatures,
|
|
385
|
+
destinationSignature: signatures.destinationSignature,
|
|
386
|
+
};
|
|
336
387
|
}
|
|
337
388
|
async function getIntentSignature(config, intentOp, signers, targetChain, validator, isRoot) {
|
|
338
|
-
const
|
|
339
|
-
|
|
389
|
+
const withPermit2 = intentOp.elements.some((element) => element.mandate.qualifier.settlementContext?.fundingMethod ===
|
|
390
|
+
types_1.FundingMethod.PERMIT2);
|
|
391
|
+
const withIntentExecutorOps = intentOp.elements.some((element) => element.mandate.qualifier.settlementContext.settlementLayer ===
|
|
340
392
|
'INTENT_EXECUTOR');
|
|
341
|
-
if (
|
|
342
|
-
const signature = await
|
|
343
|
-
return
|
|
344
|
-
originSignatures: Array(intentOp.elements.length).fill(signature),
|
|
345
|
-
destinationSignature: signature,
|
|
346
|
-
};
|
|
393
|
+
if (withIntentExecutorOps) {
|
|
394
|
+
const signature = await getSingleChainOpsSignature(config, intentOp, signers, targetChain, validator, isRoot);
|
|
395
|
+
return signature;
|
|
347
396
|
}
|
|
348
|
-
if (
|
|
397
|
+
if (withPermit2) {
|
|
349
398
|
return await getPermit2Signatures(config, intentOp, signers, targetChain, validator, isRoot);
|
|
350
399
|
}
|
|
351
400
|
const signature = await getCompactSignature(config, intentOp, signers, targetChain, validator, isRoot);
|
|
@@ -354,12 +403,20 @@ async function getIntentSignature(config, intentOp, signers, targetChain, valida
|
|
|
354
403
|
destinationSignature: signature,
|
|
355
404
|
};
|
|
356
405
|
}
|
|
357
|
-
async function
|
|
406
|
+
async function getSingleChainOpsSignature(config, intentOp, signers, targetChain, validator, isRoot) {
|
|
358
407
|
const address = (0, accounts_1.getAddress)(config);
|
|
359
408
|
const intentExecutor = (0, modules_1.getIntentExecutor)(config);
|
|
360
|
-
const
|
|
361
|
-
|
|
362
|
-
|
|
409
|
+
const originSignatures = [];
|
|
410
|
+
for (const element of intentOp.elements) {
|
|
411
|
+
const typedData = (0, singleChainOps_1.getTypedData)(address, intentExecutor.address, element, BigInt(intentOp.nonce));
|
|
412
|
+
const signature = await signIntentTypedData(config, signers, targetChain, validator, isRoot, typedData);
|
|
413
|
+
originSignatures.push(signature);
|
|
414
|
+
}
|
|
415
|
+
const destinationSignature = originSignatures.at(-1);
|
|
416
|
+
return {
|
|
417
|
+
originSignatures,
|
|
418
|
+
destinationSignature,
|
|
419
|
+
};
|
|
363
420
|
}
|
|
364
421
|
async function getPermit2Signatures(config, intentOp, signers, targetChain, validator, isRoot) {
|
|
365
422
|
const originSignatures = [];
|
|
@@ -368,9 +425,10 @@ async function getPermit2Signatures(config, intentOp, signers, targetChain, vali
|
|
|
368
425
|
const signature = await signIntentTypedData(config, signers, targetChain, validator, isRoot, typedData);
|
|
369
426
|
originSignatures.push(signature);
|
|
370
427
|
}
|
|
428
|
+
const destinationSignature = originSignatures.at(-1);
|
|
371
429
|
return {
|
|
372
430
|
originSignatures,
|
|
373
|
-
destinationSignature
|
|
431
|
+
destinationSignature,
|
|
374
432
|
};
|
|
375
433
|
}
|
|
376
434
|
async function getCompactSignature(config, intentOp, signers, targetChain, validator, isRoot) {
|
|
@@ -513,7 +571,8 @@ function getValidator(config, signers) {
|
|
|
513
571
|
if (withOwner) {
|
|
514
572
|
// ECDSA
|
|
515
573
|
if (withOwner.kind === 'ecdsa') {
|
|
516
|
-
|
|
574
|
+
// Use the configured owner validator (e.g., ENS) rather than forcing Ownable
|
|
575
|
+
return (0, validators_1.getOwnerValidator)(config);
|
|
517
576
|
}
|
|
518
577
|
// Passkeys (WebAuthn)
|
|
519
578
|
if (withOwner.kind === 'passkey') {
|