@@ -48,6 +48,7 @@ use types::invocation::JsInvocationsDetails;
48
48
use types:: outside_execution:: JsOutsideExecution ;
49
49
use types:: session:: { JsCredentials , JsSession } ;
50
50
use url:: Url ;
51
+ use utils:: { policies_match, set_panic_hook} ;
51
52
use wasm_bindgen:: prelude:: * ;
52
53
53
54
use crate :: types:: TryFromJsValue ;
@@ -87,7 +88,8 @@ impl CartridgeAccount {
87
88
credential_id : String ,
88
89
public_key : String ,
89
90
) -> Result < CartridgeAccount > {
90
- utils:: set_panic_hook ( ) ;
91
+ set_panic_hook ( ) ;
92
+
91
93
let rpc_url = Url :: parse ( & rpc_url) ?;
92
94
let provider = JsonRpcClient :: new ( HttpTransport :: new ( rpc_url. clone ( ) ) ) ;
93
95
@@ -125,7 +127,7 @@ impl CartridgeAccount {
125
127
policies : Vec < JsValue > ,
126
128
expires_at : u64 ,
127
129
) -> Result < JsValue > {
128
- utils :: set_panic_hook ( ) ;
130
+ set_panic_hook ( ) ;
129
131
130
132
let methods = policies
131
133
. into_iter ( )
@@ -159,26 +161,30 @@ impl CartridgeAccount {
159
161
session_details : JsValue ,
160
162
fee_multiplier : Option < f64 > ,
161
163
) -> Result < JsValue > {
162
- utils :: set_panic_hook ( ) ;
164
+ set_panic_hook ( ) ;
163
165
164
166
let calls = calls
165
167
. into_iter ( )
166
168
. map ( Call :: try_from_js_value)
167
169
. collect :: < std:: result:: Result < Vec < _ > , _ > > ( ) ?;
168
170
169
- let result = if let Some ( session_details) = from_value ( session_details) ? {
170
- self . session_account ( session_details)
171
- . await ?
172
- . execute_v1 ( calls)
173
- . fee_estimate_multiplier ( fee_multiplier. unwrap_or ( 1.0 ) )
174
- . estimate_fee ( )
175
- . await
176
- } else {
177
- self . account
178
- . execute_v1 ( calls)
179
- . fee_estimate_multiplier ( fee_multiplier. unwrap_or ( 1.0 ) )
180
- . estimate_fee ( )
181
- . await
171
+ let multipler = fee_multiplier. unwrap_or ( 1.0 ) ;
172
+ let session_details: Option < JsSession > = from_value ( session_details) ?;
173
+ let result = match self . get_session_account ( & calls, session_details) . await ? {
174
+ Some ( session_account) => {
175
+ session_account
176
+ . execute_v1 ( calls)
177
+ . fee_estimate_multiplier ( multipler)
178
+ . estimate_fee ( )
179
+ . await
180
+ }
181
+ _ => {
182
+ self . account
183
+ . execute_v1 ( calls)
184
+ . fee_estimate_multiplier ( multipler)
185
+ . estimate_fee ( )
186
+ . await
187
+ }
182
188
} ;
183
189
184
190
let fee_estimate =
@@ -194,29 +200,32 @@ impl CartridgeAccount {
194
200
transaction_details : JsValue ,
195
201
session_details : JsValue ,
196
202
) -> Result < JsValue > {
197
- utils :: set_panic_hook ( ) ;
203
+ set_panic_hook ( ) ;
198
204
199
205
let calls = calls
200
206
. into_iter ( )
201
207
. map ( Call :: try_from_js_value)
202
208
. collect :: < std:: result:: Result < Vec < _ > , _ > > ( ) ?;
203
209
204
210
let details = JsInvocationsDetails :: try_from ( transaction_details) ?;
205
- let result = if let Some ( session_details) = from_value ( session_details) ? {
206
- self . session_account ( session_details)
207
- . await ?
208
- . execute_v1 ( calls)
209
- . max_fee ( details. max_fee )
210
- . nonce ( details. nonce )
211
- . send ( )
212
- . await
213
- } else {
214
- self . account
215
- . execute_v1 ( calls)
216
- . max_fee ( details. max_fee )
217
- . nonce ( details. nonce )
218
- . send ( )
219
- . await
211
+ let session_details: Option < JsSession > = from_value ( session_details) ?;
212
+ let result = match self . get_session_account ( & calls, session_details) . await ? {
213
+ Some ( session_account) => {
214
+ session_account
215
+ . execute_v1 ( calls)
216
+ . max_fee ( details. max_fee )
217
+ . nonce ( details. nonce )
218
+ . send ( )
219
+ . await
220
+ }
221
+ _ => {
222
+ self . account
223
+ . execute_v1 ( calls)
224
+ . max_fee ( details. max_fee )
225
+ . nonce ( details. nonce )
226
+ . send ( )
227
+ . await
228
+ }
220
229
} ;
221
230
222
231
let execution = result. map_err ( |e| OperationError :: Execution ( format ! ( "{:#?}" , e) ) ) ?;
@@ -231,28 +240,39 @@ impl CartridgeAccount {
231
240
caller : JsValue ,
232
241
session_details : JsValue ,
233
242
) -> Result < JsValue > {
234
- utils:: set_panic_hook ( ) ;
243
+ set_panic_hook ( ) ;
244
+
245
+ let rs_calls: Vec < Call > = calls
246
+ . clone ( )
247
+ . into_iter ( )
248
+ . map ( Call :: try_from_js_value)
249
+ . collect :: < std:: result:: Result < _ , _ > > ( ) ?;
250
+
251
+ let js_calls: Vec < JsCall > = calls
252
+ . into_iter ( )
253
+ . map ( JsCall :: try_from)
254
+ . collect :: < std:: result:: Result < _ , _ > > ( ) ?;
235
255
236
256
let outside = JsOutsideExecution {
237
257
caller : serde_wasm_bindgen:: from_value ( caller) ?,
238
258
execute_after : 0_u64 ,
239
259
execute_before : 3000000000_u64 ,
240
- calls : calls
241
- . into_iter ( )
242
- . map ( JsCall :: try_from)
243
- . collect :: < std:: result:: Result < Vec < _ > , _ > > ( ) ?,
260
+ calls : js_calls,
244
261
nonce : SigningKey :: from_random ( ) . secret_scalar ( ) ,
245
262
} ;
246
263
247
- let signed = if let Some ( session_details) = from_value ( session_details) ? {
248
- self . session_account ( session_details)
249
- . await ?
250
- . sign_outside_execution ( outside. clone ( ) . try_into ( ) ?)
251
- . await ?
252
- } else {
253
- self . account
254
- . sign_outside_execution ( outside. clone ( ) . try_into ( ) ?)
255
- . await ?
264
+ let session_details: Option < JsSession > = from_value ( session_details) ?;
265
+ let signed = match self . get_session_account ( & rs_calls, session_details) . await ? {
266
+ Some ( session_account) => {
267
+ session_account
268
+ . sign_outside_execution ( outside. clone ( ) . try_into ( ) ?)
269
+ . await ?
270
+ }
271
+ _ => {
272
+ self . account
273
+ . sign_outside_execution ( outside. clone ( ) . try_into ( ) ?)
274
+ . await ?
275
+ }
256
276
} ;
257
277
258
278
let response = PaymasterRequest :: send (
@@ -274,6 +294,8 @@ impl CartridgeAccount {
274
294
275
295
#[ wasm_bindgen( js_name = signMessage) ]
276
296
pub async fn sign_message ( & self , typed_data : String ) -> Result < JsValue > {
297
+ set_panic_hook ( ) ;
298
+
277
299
let signature = self
278
300
. account
279
301
. sign_message ( serde_json:: from_str ( & typed_data) ?)
@@ -285,6 +307,8 @@ impl CartridgeAccount {
285
307
286
308
#[ wasm_bindgen( js_name = deploySelf) ]
287
309
pub async fn deploy_self ( & self , max_fee : JsValue ) -> Result < JsValue > {
310
+ set_panic_hook ( ) ;
311
+
288
312
let webauthn_calldata = self . device_signer . signer_pub_data ( ) ;
289
313
let mut constructor_calldata =
290
314
Vec :: < WebauthnSigner > :: cairo_serialize ( & vec ! [ webauthn_calldata] ) ;
@@ -314,6 +338,8 @@ impl CartridgeAccount {
314
338
315
339
#[ wasm_bindgen( js_name = delegateAccount) ]
316
340
pub async fn delegate_account ( & self ) -> Result < JsValue > {
341
+ set_panic_hook ( ) ;
342
+
317
343
let res = self
318
344
. account
319
345
. provider ( )
@@ -331,30 +357,45 @@ impl CartridgeAccount {
331
357
Ok ( to_value ( & res[ 0 ] ) ?)
332
358
}
333
359
334
- async fn session_account (
360
+ async fn get_session_account (
335
361
& self ,
336
- details : JsSession ,
337
- ) -> Result < SessionAccount < JsonRpcClient < HttpTransport > , SigningKey , SigningKey > > {
338
- let methods = details
362
+ calls : & [ Call ] ,
363
+ session_details : Option < JsSession > ,
364
+ ) -> Result < Option < SessionAccount < JsonRpcClient < HttpTransport > , SigningKey , SigningKey > > > {
365
+ set_panic_hook ( ) ;
366
+
367
+ let Some ( session_details) = session_details else {
368
+ return Ok ( None ) ;
369
+ } ;
370
+
371
+ if !policies_match ( calls, & session_details. policies ) {
372
+ return Ok ( None ) ;
373
+ }
374
+
375
+ let methods = session_details
339
376
. policies
377
+ . clone ( )
340
378
. into_iter ( )
341
379
. map ( |policy| Ok ( AllowedMethod :: try_from ( policy) ?) )
342
380
. collect :: < Result < Vec < AllowedMethod > > > ( ) ?;
343
381
344
382
let dummy_guardian = SigningKey :: from_secret_scalar ( short_string ! ( "CARTRIDGE_GUARDIAN" ) ) ;
345
- let session_signer = SigningKey :: from_secret_scalar ( details. credentials . private_key ) ;
346
- let expires_at: u64 = details. expires_at . parse ( ) ?;
383
+ let session_signer =
384
+ SigningKey :: from_secret_scalar ( session_details. credentials . private_key ) ;
385
+ let expires_at: u64 = session_details. expires_at . parse ( ) ?;
347
386
let session = Session :: new ( methods, expires_at, & session_signer. signer ( ) )
348
387
. map_err ( SessionError :: Creation ) ?;
349
388
350
- Ok ( SessionAccount :: new (
389
+ let session_account = SessionAccount :: new (
351
390
JsonRpcClient :: new ( HttpTransport :: new ( self . rpc_url . clone ( ) ) ) ,
352
391
session_signer,
353
392
dummy_guardian,
354
393
self . account . address ( ) ,
355
394
self . account . chain_id ( ) ,
356
- details . credentials . authorization ,
395
+ session_details . credentials . authorization ,
357
396
session,
358
- ) )
397
+ ) ;
398
+
399
+ Ok ( Some ( session_account) )
359
400
}
360
401
}
0 commit comments