Skip to content

Commit a75b1f1

Browse files
Fix incorrect user op v7 encode (#4369)
Co-authored-by: Sergei Boiko <[email protected]>
1 parent c80dd9a commit a75b1f1

File tree

1 file changed

+28
-6
lines changed

1 file changed

+28
-6
lines changed

rust/tw_evm/src/transaction/user_operation_v0_7.rs

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ impl PackedUserOperation {
4343

4444
let account_gas_limits =
4545
concat_u128_be(user_op.verification_gas_limit, user_op.call_gas_limit);
46-
let gas_fees = concat_u128_be(user_op.max_fee_per_gas, user_op.max_priority_fee_per_gas);
46+
let gas_fees = concat_u128_be(user_op.max_priority_fee_per_gas, user_op.max_fee_per_gas);
4747

4848
let paymaster_and_data = if let Some(paymaster) = user_op.paymaster {
4949
let mut paymaster_and_data = paymaster.bytes().into_vec();
@@ -262,7 +262,25 @@ mod tests {
262262
let chain_id = U256::from(11155111u64);
263263
let entry_point = Address::from("0x0000000071727De22E5E9d8BAf0edAc6f37da032");
264264

265-
let user_op = PackedUserOperation {
265+
let user_op = UserOperationV0_7 {
266+
sender: Address::from("0xb292Cf4a8E1fF21Ac27C4f94071Cd02C022C414b"),
267+
nonce: U256::from_str("0xF83D07238A7C8814A48535035602123AD6DBFA63000000000000000000000001").unwrap(),
268+
factory: None,
269+
factory_data: Vec::default(),
270+
call_data: "e9ae5c530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001d8b292cf4a8e1ff21ac27c4f94071cd02c022c414b00000000000000000000000000000000000000000000000000000000000000009517e29f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000ad6330089d9a1fe89f4020292e1afe9969a5a2fc00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018e2fbe8980000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000800000000000000000000000002372912728f93ab3daaaebea4f87e6e28476d987000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000".decode_hex().unwrap(),
271+
call_gas_limit: 1231285u128,
272+
verification_gas_limit: 70908u128,
273+
pre_verification_gas: U256::from(48916u64),
274+
max_fee_per_gas: 71308035098u128,
275+
max_priority_fee_per_gas: 1380000000u128,
276+
paymaster: None,
277+
paymaster_verification_gas_limit: 0,
278+
paymaster_post_op_gas_limit: 0,
279+
paymaster_data: Vec::default(),
280+
entry_point,
281+
};
282+
283+
let packed_user_op = PackedUserOperation {
266284
sender: Address::from("0xb292Cf4a8E1fF21Ac27C4f94071Cd02C022C414b"),
267285
nonce: U256::from_str("0xF83D07238A7C8814A48535035602123AD6DBFA63000000000000000000000001").unwrap(),
268286
init_code: Vec::default(),
@@ -273,14 +291,18 @@ mod tests {
273291
paymaster_and_data: Vec::default(),
274292
};
275293

276-
let encoded = hex::encode(user_op.encode(), false);
294+
let encoded_from_user_op = hex::encode(user_op.encode(chain_id), false);
295+
let encoded_from_packed_user_op = hex::encode(packed_user_op.encode(), false);
277296
let expected = "000000000000000000000000b292cf4a8e1ff21ac27c4f94071cd02c022c414bf83d07238a7c8814a48535035602123ad6dbfa63000000000000000000000001c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470f1b8863cae5d3c89d78ce8e239e0c416de4c9224226a78fbb6c4af63ed0eebf7000000000000000000000000000114fc0000000000000000000000000012c9b5000000000000000000000000000000000000000000000000000000000000bf14000000000000000000000000524121000000000000000000000000109a4a441ac5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470";
278-
assert_eq!(encoded, expected);
297+
assert_eq!(encoded_from_user_op, expected);
298+
assert_eq!(encoded_from_packed_user_op, expected);
279299

280-
let pre_hash = user_op.pre_hash(chain_id, entry_point);
300+
let pre_hash_from_user_op = user_op.pre_hash(chain_id);
301+
let pre_hash_from_packed_user_op = packed_user_op.pre_hash(chain_id, entry_point);
281302
let expected_pre_hash =
282303
H256::from("e486401370d145766c3cf7ba089553214a1230d38662ae532c9b62eb6dadcf7e");
283-
assert_eq!(pre_hash, expected_pre_hash);
304+
assert_eq!(pre_hash_from_user_op, expected_pre_hash);
305+
assert_eq!(pre_hash_from_packed_user_op, expected_pre_hash);
284306
}
285307

286308
#[test]

0 commit comments

Comments
 (0)