@@ -40,7 +40,7 @@ const ESCAPE_SECURITY_PERIOD = 7*24*60*60 # set to e.g. 7 days in prod
40
40
const ESCAPE_TYPE_GUARDIAN = 0
41
41
const ESCAPE_TYPE_SIGNER = 1
42
42
43
- const ERC156_ACCOUNT_INTERFACE = 0x50b70dcb
43
+ const ERC156_ACCOUNT_INTERFACE = 0xf10dbd44
44
44
45
45
const TRUE = 1
46
46
const FALSE = 0
@@ -51,18 +51,20 @@ const PREFIX_TRANSACTION = 'StarkNet Transaction'
51
51
# STRUCTS
52
52
####################
53
53
54
- struct MCall :
54
+ struct Call :
55
55
member to: felt
56
56
member selector: felt
57
- member data_offset : felt
58
- member data_len : felt
57
+ member calldata_len : felt
58
+ member calldata : felt *
59
59
end
60
60
61
- struct Call:
61
+ # Tmp struct introduced while we wait for Cairo
62
+ # to support passing `[Call]` to __execute__
63
+ struct CallArray:
62
64
member to: felt
63
65
member selector: felt
64
- member calldata_len : felt
65
- member calldata : felt *
66
+ member data_offset : felt
67
+ member data_len : felt
66
68
end
67
69
68
70
struct Escape:
@@ -165,8 +167,8 @@ func __execute__{
165
167
ecdsa_ptr: SignatureBuiltin*,
166
168
range_check_ptr
167
169
} (
168
- mcalls_len : felt ,
169
- mcalls: MCall *,
170
+ call_array_len : felt ,
171
+ call_array: CallArray *,
170
172
calldata_len: felt ,
171
173
calldata: felt *,
172
174
nonce: felt
@@ -179,8 +181,8 @@ func __execute__{
179
181
############### TMP #############################
180
182
# parse inputs to an array of 'Call' struct
181
183
let (calls : Call*) = alloc()
182
- from_mcall_to_call(mcalls_len, mcalls , calldata, calls)
183
- let calls_len = mcalls_len
184
+ from_call_array_to_call(call_array_len, call_array , calldata, calls)
185
+ let calls_len = call_array_len
184
186
#################################################
185
187
186
188
# validate and bump nonce
@@ -190,20 +192,20 @@ func __execute__{
190
192
let (tx_info) = get_tx_info()
191
193
192
194
# compute message hash
193
- let (message_hash ) = get_execute_hash (tx_info.account_contract_address, calls_len, calls, nonce, tx_info.max_fee, tx_info.version)
195
+ let (hash ) = hash_multicall (tx_info.account_contract_address, calls_len, calls, nonce, tx_info.max_fee, tx_info.version)
194
196
195
197
if calls_len == 1 :
196
198
if calls[0 ].to == tx_info.account_contract_address:
197
199
tempvar signer_condition = (calls[0 ].selector - ESCAPE_GUARDIAN_SELECTOR) * (calls[0 ].selector - TRIGGER_ESCAPE_GUARDIAN_SELECTOR)
198
200
tempvar guardian_condition = (calls[0 ].selector - ESCAPE_SIGNER_SELECTOR) * (calls[0 ].selector - TRIGGER_ESCAPE_SIGNER_SELECTOR)
199
201
if signer_condition == 0 :
200
202
# validate signer signature
201
- validate_signer_signature(message_hash , tx_info.signature, tx_info.signature_len)
203
+ validate_signer_signature(hash , tx_info.signature, tx_info.signature_len)
202
204
jmp do_execute
203
205
end
204
206
if guardian_condition == 0 :
205
207
# validate guardian signature
206
- validate_guardian_signature(message_hash , tx_info.signature, tx_info.signature_len)
208
+ validate_guardian_signature(hash , tx_info.signature, tx_info.signature_len)
207
209
jmp do_execute
208
210
end
209
211
end
@@ -212,8 +214,8 @@ func __execute__{
212
214
assert_no_self_call(tx_info.account_contract_address, calls_len, calls)
213
215
end
214
216
# validate signer and guardian signatures
215
- validate_signer_signature(message_hash , tx_info.signature, tx_info.signature_len)
216
- validate_guardian_signature(message_hash , tx_info.signature + 2 , tx_info.signature_len - 2 )
217
+ validate_signer_signature(hash , tx_info.signature, tx_info.signature_len)
218
+ validate_guardian_signature(hash , tx_info.signature + 2 , tx_info.signature_len - 2 )
217
219
218
220
# execute calls
219
221
do_execute:
719
721
# @param max_fee The max fee the user is willing to pay for the multicall
720
722
# @param version The version of transaction in the Cairo OS. Always set to 0 .
721
723
# @return res The hash of the multicall
722
- func get_execute_hash {
724
+ func hash_multicall {
723
725
syscall_ptr: felt *,
724
726
pedersen_ptr: HashBuiltin*
725
727
} (
@@ -826,31 +828,28 @@ func hash_calldata{
826
828
end
827
829
end
828
830
829
- func from_mcall_to_call {
830
- syscall_ptr: felt *,
831
- pedersen_ptr: HashBuiltin*,
832
- range_check_ptr
831
+ func from_call_array_to_call {
832
+ syscall_ptr: felt *
833
833
} (
834
- mcalls_len : felt ,
835
- mcalls: MCall *,
834
+ call_array_len : felt ,
835
+ call_array: CallArray *,
836
836
calldata: felt *,
837
837
calls: Call*
838
838
):
839
- alloc_locals
840
-
841
- # if no more mcalls
842
- if mcalls_len == 0 :
839
+ # if no more calls
840
+ if call_array_len == 0 :
843
841
return ()
844
842
end
845
843
846
- # parse the first mcall
844
+ # parse the current call
847
845
assert [calls] = Call(
848
- to=[mcalls].to,
849
- selector=[mcalls].selector,
850
- calldata_len=[mcalls].data_len,
851
- calldata=calldata + [mcalls].data_offset)
846
+ to=[call_array].to,
847
+ selector=[call_array].selector,
848
+ calldata_len=[call_array].data_len,
849
+ calldata=calldata + [call_array].data_offset
850
+ )
852
851
853
- # parse the other mcalls recursively
854
- from_mcall_to_call(mcalls_len - 1 , mcalls + MCall .SIZE , calldata, calls + Call.SIZE )
852
+ # parse the remaining calls recursively
853
+ from_call_array_to_call(call_array_len - 1 , call_array + CallArray .SIZE , calldata, calls + Call.SIZE )
855
854
return ()
856
855
end
0 commit comments