Skip to content

Commit

Permalink
fix(user-ops-indexer): u64 convert panic (#1016)
Browse files Browse the repository at this point in the history
* fix: u64 convert panic

* chore: cargo clippy
  • Loading branch information
k1rill-fedoseev authored Aug 16, 2024
1 parent e1b8571 commit 5faf103
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 75 deletions.
20 changes: 10 additions & 10 deletions user-ops-indexer/user-ops-indexer-logic/src/indexer/base_indexer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -412,9 +412,9 @@ mod tests {
nonce: H256::zero(),
init_code: None,
call_data: Bytes::from_str("0x70641a22000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000001e0049783f008a0085193e00003d00cd54003c71ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000").unwrap(),
call_gas_limit: 92599,
verification_gas_limit: 87149,
pre_verification_gas: 49900,
call_gas_limit: U256::from(92599),
verification_gas_limit: U256::from(87149),
pre_verification_gas: U256::from(49900),
max_fee_per_gas: U256::from(53825000000u64),
max_priority_fee_per_gas: U256::from(500000000u64),
paymaster_and_data: None,
Expand All @@ -433,9 +433,9 @@ mod tests {
paymaster: None,
status: true,
revert_reason: None,
gas: 229648,
gas: U256::from(229648),
gas_price: U256::from(37400206579u64),
gas_used: 165030,
gas_used: U256::from(165030),
sponsor_type: SponsorType::WalletDeposit,
user_logs_start_index: 268,
user_logs_count: 1,
Expand Down Expand Up @@ -480,9 +480,9 @@ mod tests {
nonce: H256::zero(),
init_code: Some(Bytes::from_str("0x1f5806eafab78028b6e29ab65208f54cfdd4ce45a1aafc9e0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000244ac27308a000000000000000000000000000000000000000000000000000000000000008000000000000000000000000080ee560d57f4b1d2acfeb2174d09d54879c7408800000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000598991c9d726cbac7eb023ca974fe6e7e7a57ce80000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003479096622cf141e3cc93126bbccc3ef10b952c1ef000000000000000000000000000000000000000000000000000000000002a3000000000000000000000000000000000000000000000000000000000000000000000000000000000000000074115cff9c5b847b402c382f066cf275ab6440b75aaa1b881c164e5d43131cfb3895759573bc597baf526002f8d1943f1aaa67dbf7fa99cd30d12a235169eef4f3d5c96fc1619c60bc9d8028dfea0f89c7ec5e3f27000000000000000000000000000000000000000000000000000000000002a300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()),
call_data: Bytes::from_str("0x34fcd5be00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000094a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b30000000000000000000000001b637a3008dc1f86d92031a97fc4b5ac0803329e00000000000000000000000000000000000000000000000000000002540be40000000000000000000000000000000000000000000000000000000000").unwrap(),
call_gas_limit: 2000000,
verification_gas_limit: 1000000,
pre_verification_gas: 500000,
call_gas_limit: U256::from(2000000),
verification_gas_limit: U256::from(1000000),
pre_verification_gas: U256::from(500000),
max_fee_per_gas: U256::from(1),
max_priority_fee_per_gas: U256::from(1),
paymaster_and_data: Some(Bytes::from_str("0x1b637a3008dc1f86d92031a97fc4b5ac0803329e00000000000000000000000000061a8000000000000000000000000000061a8000000000000000000000000094a9d9ac8a22534e3faca9f4e7f2e2cf85d5e4c800000000000000000000000000000000000000000000000000000002540be400").unwrap()),
Expand All @@ -501,9 +501,9 @@ mod tests {
paymaster: Some(Address::from_str("0x1b637a3008dc1f86d92031a97FC4B5aC0803329e").unwrap()),
status: true,
revert_reason: None,
gas: 4300000,
gas: U256::from(4300000),
gas_price: U256::from(1),
gas_used: 1534051,
gas_used: U256::from(1534051),
sponsor_type: SponsorType::PaymasterSponsor,
user_logs_start_index: 42,
user_logs_count: 3,
Expand Down
18 changes: 7 additions & 11 deletions user-ops-indexer/user-ops-indexer-logic/src/indexer/v06/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,10 +151,6 @@ fn build_user_op_model(
.map(|e| e.account)
.collect();

let call_gas_limit = user_op.user_op.call_gas_limit.as_u64();
let verification_gas_limit = user_op.user_op.verification_gas_limit.as_u64();
let pre_verification_gas = user_op.user_op.pre_verification_gas.as_u64();

let factory = extract_address(&user_op.user_op.init_code);
let paymaster = extract_address(&user_op.user_op.paymaster_and_data);
let sender = user_op.user_op.sender;
Expand All @@ -166,9 +162,9 @@ fn build_user_op_model(
nonce: H256::from_uint(&user_op.user_op.nonce),
init_code: none_if_empty(user_op.user_op.init_code),
call_data: user_op.user_op.call_data,
call_gas_limit,
verification_gas_limit,
pre_verification_gas,
call_gas_limit: user_op.user_op.call_gas_limit,
verification_gas_limit: user_op.user_op.verification_gas_limit,
pre_verification_gas: user_op.user_op.pre_verification_gas,
max_fee_per_gas: user_op.user_op.max_fee_per_gas,
max_priority_fee_per_gas: user_op.user_op.max_priority_fee_per_gas,
paymaster_and_data: none_if_empty(user_op.user_op.paymaster_and_data),
Expand All @@ -187,13 +183,13 @@ fn build_user_op_model(
paymaster,
status: user_op_event.success,
revert_reason: revert_event.map(|e| e.revert_reason),
gas: call_gas_limit
+ verification_gas_limit * if paymaster.is_none() { 1 } else { 3 }
+ pre_verification_gas,
gas: user_op.user_op.call_gas_limit
+ user_op.user_op.verification_gas_limit * if paymaster.is_none() { 1 } else { 3 }
+ user_op.user_op.pre_verification_gas,
gas_price: user_op_event
.actual_gas_cost
.div(user_op_event.actual_gas_used),
gas_used: user_op_event.actual_gas_used.as_u64(),
gas_used: user_op_event.actual_gas_used,
sponsor_type: extract_sponsor_type(sender, paymaster, &tx_deposits),
user_logs_start_index,
user_logs_count,
Expand Down
13 changes: 5 additions & 8 deletions user-ops-indexer/user-ops-indexer-logic/src/indexer/v07/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use ethers::prelude::{
abi::{AbiDecode, Address},
abigen,
types::{Bytes, Log, TransactionReceipt, H256},
BigEndianHash, EthEvent,
BigEndianHash, EthEvent, U256,
};
use lazy_static::lazy_static;
use std::ops::Div;
Expand Down Expand Up @@ -154,15 +154,12 @@ fn build_user_op_model(

let (verification_gas_limit, call_gas_limit) =
unpack_uints(&user_op.user_op.account_gas_limits[..]);
let verification_gas_limit = verification_gas_limit.as_u64();
let call_gas_limit = call_gas_limit.as_u64();
let pre_verification_gas = user_op.user_op.pre_verification_gas.as_u64();
let pre_verification_gas = user_op.user_op.pre_verification_gas;
let (paymaster_verification_gas_limit, paymaster_post_op_gas_limit) =
if user_op.user_op.paymaster_and_data.len() >= 52 {
let (a, b) = unpack_uints(&user_op.user_op.paymaster_and_data[20..52]);
(a.as_u64(), b.as_u64())
unpack_uints(&user_op.user_op.paymaster_and_data[20..52])
} else {
(0, 0)
(U256::zero(), U256::zero())
};
let gas = call_gas_limit
+ verification_gas_limit
Expand Down Expand Up @@ -208,7 +205,7 @@ fn build_user_op_model(
gas_price: user_op_event
.actual_gas_cost
.div(user_op_event.actual_gas_used),
gas_used: user_op_event.actual_gas_used.as_u64(),
gas_used: user_op_event.actual_gas_used,
sponsor_type: extract_sponsor_type(sender, paymaster, &tx_deposits),
user_logs_start_index,
user_logs_count,
Expand Down
56 changes: 28 additions & 28 deletions user-ops-indexer/user-ops-indexer-logic/src/types/user_op.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ use crate::{
pub use entity::sea_orm_active_enums::{EntryPointVersion, SponsorType};
use entity::user_operations::Model;
use ethers::prelude::{
abi::AbiEncode, core::utils::to_checksum, Address, BigEndianHash, Bytes, H128, H256, U256,
abi::AbiEncode, core::utils::to_checksum, Address, BigEndianHash, Bytes, H256, U256,
};
use num_traits::cast::ToPrimitive;
use sea_orm::{prelude::BigDecimal, ActiveEnum};
use sea_orm::ActiveEnum;
use std::ops::Mul;

#[derive(Clone, Debug, PartialEq)]
Expand All @@ -18,9 +18,9 @@ pub struct UserOp {
pub nonce: H256,
pub init_code: Option<Bytes>,
pub call_data: Bytes,
pub call_gas_limit: u64,
pub verification_gas_limit: u64,
pub pre_verification_gas: u64,
pub call_gas_limit: U256,
pub verification_gas_limit: U256,
pub pre_verification_gas: U256,
pub max_fee_per_gas: U256,
pub max_priority_fee_per_gas: U256,
pub paymaster_and_data: Option<Bytes>,
Expand All @@ -39,9 +39,9 @@ pub struct UserOp {
pub paymaster: Option<Address>,
pub status: bool,
pub revert_reason: Option<Bytes>,
pub gas: u64,
pub gas: U256,
pub gas_price: U256,
pub gas_used: u64,
pub gas_used: U256,
pub sponsor_type: SponsorType,
pub user_logs_start_index: u32,
pub user_logs_count: u32,
Expand Down Expand Up @@ -72,9 +72,9 @@ impl From<UserOp> for Model {
nonce: v.nonce.as_bytes().to_vec(),
init_code: v.init_code.clone().map(|a| a.to_vec()),
call_data: v.call_data.to_vec(),
call_gas_limit: BigDecimal::from(v.call_gas_limit),
verification_gas_limit: BigDecimal::from(v.verification_gas_limit),
pre_verification_gas: BigDecimal::from(v.pre_verification_gas),
call_gas_limit: u256_to_decimal(v.call_gas_limit),
verification_gas_limit: u256_to_decimal(v.verification_gas_limit),
pre_verification_gas: u256_to_decimal(v.pre_verification_gas),
max_fee_per_gas: u256_to_decimal(v.max_fee_per_gas),
max_priority_fee_per_gas: u256_to_decimal(v.max_priority_fee_per_gas),
paymaster_and_data: v.paymaster_and_data.clone().map(|a| a.to_vec()),
Expand All @@ -93,9 +93,9 @@ impl From<UserOp> for Model {
paymaster: v.paymaster.map(|a| a.as_bytes().to_vec()),
status: v.status,
revert_reason: v.revert_reason.clone().map(|a| a.to_vec()),
gas: BigDecimal::from(v.gas),
gas: u256_to_decimal(v.gas),
gas_price: u256_to_decimal(v.gas_price),
gas_used: BigDecimal::from(v.gas_used),
gas_used: u256_to_decimal(v.gas_used),
sponsor_type: v.sponsor_type.clone(),
user_logs_start_index: v.user_logs_start_index as i32,
user_logs_count: v.user_logs_count as i32,
Expand All @@ -113,9 +113,9 @@ impl From<Model> for UserOp {
nonce: H256::from_slice(&v.nonce),
init_code: v.init_code.clone().map(Bytes::from),
call_data: Bytes::from(v.call_data.clone()),
call_gas_limit: v.call_gas_limit.to_u64().unwrap_or(0),
verification_gas_limit: v.verification_gas_limit.to_u64().unwrap_or(0),
pre_verification_gas: v.pre_verification_gas.to_u64().unwrap_or(0),
call_gas_limit: U256::from(v.call_gas_limit.to_u128().unwrap_or(0)),
verification_gas_limit: U256::from(v.verification_gas_limit.to_u128().unwrap_or(0)),
pre_verification_gas: U256::from(v.pre_verification_gas.to_u128().unwrap_or(0)),
max_fee_per_gas: U256::from(v.max_fee_per_gas.to_u128().unwrap_or(0)),
max_priority_fee_per_gas: U256::from(v.max_priority_fee_per_gas.to_u128().unwrap_or(0)),
paymaster_and_data: v.paymaster_and_data.clone().map(Bytes::from),
Expand All @@ -134,9 +134,9 @@ impl From<Model> for UserOp {
paymaster: v.paymaster.clone().map(|a| Address::from_slice(&a)),
status: v.status,
revert_reason: v.revert_reason.clone().map(Bytes::from),
gas: v.gas.to_u64().unwrap_or(0),
gas: U256::from(v.gas.to_u128().unwrap_or(0)),
gas_price: U256::from(v.gas_price.to_u128().unwrap_or(0)),
gas_used: v.gas_used.to_u64().unwrap_or(0),
gas_used: U256::from(v.gas_used.to_u128().unwrap_or(0)),
sponsor_type: v.sponsor_type.clone(),
user_logs_start_index: v.user_logs_start_index as u32,
user_logs_count: v.user_logs_count as u32,
Expand All @@ -158,9 +158,9 @@ impl From<UserOp> for user_ops_indexer_proto::blockscout::user_ops_indexer::v1::
nonce: U256::from(v.nonce.as_fixed_bytes()).to_string(),
init_code: v.init_code.map_or("0x".to_string(), |b| b.to_string()),
call_data: v.call_data.to_string(),
call_gas_limit: v.call_gas_limit,
verification_gas_limit: v.verification_gas_limit,
pre_verification_gas: v.pre_verification_gas,
call_gas_limit: v.call_gas_limit.to_string(),
verification_gas_limit: v.verification_gas_limit.to_string(),
pre_verification_gas: v.pre_verification_gas.to_string(),
max_fee_per_gas: v.max_fee_per_gas.to_string(),
max_priority_fee_per_gas: v.max_priority_fee_per_gas.to_string(),
paymaster_and_data: v
Expand All @@ -179,14 +179,14 @@ impl From<UserOp> for user_ops_indexer_proto::blockscout::user_ops_indexer::v1::
call_data: v.call_data.to_string(),
account_gas_limits: H256::from_slice(
[
H128::from_low_u64_be(v.verification_gas_limit).as_bytes(),
H128::from_low_u64_be(v.call_gas_limit).as_bytes(),
&H256::from_uint(&v.verification_gas_limit).as_bytes()[16..],
&H256::from_uint(&v.call_gas_limit).as_bytes()[16..],
]
.concat()
.as_slice(),
)
.encode_hex(),
pre_verification_gas: v.pre_verification_gas,
pre_verification_gas: v.pre_verification_gas.to_string(),
gas_fees: H256::from_slice(
[
&H256::from_uint(&v.max_fee_per_gas).as_bytes()[16..],
Expand All @@ -212,9 +212,9 @@ impl From<UserOp> for user_ops_indexer_proto::blockscout::user_ops_indexer::v1::
sender: to_checksum(&v.sender, None),
nonce: v.nonce.encode_hex(),
call_data: v.call_data.to_string(),
call_gas_limit: v.call_gas_limit,
verification_gas_limit: v.verification_gas_limit,
pre_verification_gas: v.pre_verification_gas,
call_gas_limit: v.call_gas_limit.to_string(),
verification_gas_limit: v.verification_gas_limit.to_string(),
pre_verification_gas: v.pre_verification_gas.to_string(),
max_fee_per_gas: v.max_fee_per_gas.to_string(),
max_priority_fee_per_gas: v.max_priority_fee_per_gas.to_string(),
signature: v.signature.to_string(),
Expand All @@ -233,9 +233,9 @@ impl From<UserOp> for user_ops_indexer_proto::blockscout::user_ops_indexer::v1::
paymaster: v.paymaster.map(|a| to_checksum(&a, None)),
status: v.status,
revert_reason: v.revert_reason.map(|b| b.to_string()),
gas: v.gas,
gas: v.gas.to_string(),
gas_price: v.gas_price.to_string(),
gas_used: v.gas_used,
gas_used: v.gas_used.to_string(),
sponsor_type: v.sponsor_type.to_value().to_string(),
user_logs_start_index: v.user_logs_start_index,
user_logs_count: v.user_logs_count,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,9 @@ message RawUserOpV06 {
string nonce = 2;
string init_code = 3;
string call_data = 4;
uint64 call_gas_limit = 5;
uint64 verification_gas_limit = 6;
uint64 pre_verification_gas = 7;
string call_gas_limit = 5;
string verification_gas_limit = 6;
string pre_verification_gas = 7;
string max_fee_per_gas = 8;
string max_priority_fee_per_gas = 9;
string paymaster_and_data = 10;
Expand All @@ -171,7 +171,7 @@ message RawUserOpV07 {
string init_code = 3;
string call_data = 4;
string account_gas_limits = 5; // call_gas_limit + verification_gas_limit
uint64 pre_verification_gas = 6;
string pre_verification_gas = 6;
string gas_fees = 7; // max_fee_per_gas + max_priority_fee_per_gas
string paymaster_and_data = 8; // paymaster + paymaster_verification_gas_limit + post_op_gas_limit + paymaster_data
string signature = 9;
Expand All @@ -182,9 +182,9 @@ message UserOp {
string sender = 2;
string nonce = 3;
string call_data = 4;
uint64 call_gas_limit = 5;
uint64 verification_gas_limit = 6;
uint64 pre_verification_gas = 7;
string call_gas_limit = 5;
string verification_gas_limit = 6;
string pre_verification_gas = 7;
string max_fee_per_gas = 8;
string max_priority_fee_per_gas = 9;
string signature = 10;
Expand All @@ -206,9 +206,9 @@ message UserOp {
optional string paymaster = 23;
bool status = 24;
optional string revert_reason = 25;
uint64 gas = 26;
string gas = 26;
string gas_price = 27;
uint64 gas_used = 28;
string gas_used = 28;
string sponsor_type = 29;
uint32 user_logs_start_index = 30;
uint32 user_logs_count = 31;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -508,13 +508,10 @@ definitions:
type: string
call_gas_limit:
type: string
format: uint64
verification_gas_limit:
type: string
format: uint64
pre_verification_gas:
type: string
format: uint64
max_fee_per_gas:
type: string
max_priority_fee_per_gas:
Expand All @@ -539,7 +536,6 @@ definitions:
title: call_gas_limit + verification_gas_limit
pre_verification_gas:
type: string
format: uint64
gas_fees:
type: string
title: max_fee_per_gas + max_priority_fee_per_gas
Expand All @@ -561,13 +557,10 @@ definitions:
type: string
call_gas_limit:
type: string
format: uint64
verification_gas_limit:
type: string
format: uint64
pre_verification_gas:
type: string
format: uint64
max_fee_per_gas:
type: string
max_priority_fee_per_gas:
Expand Down Expand Up @@ -611,12 +604,10 @@ definitions:
type: string
gas:
type: string
format: uint64
gas_price:
type: string
gas_used:
type: string
format: uint64
sponsor_type:
type: string
user_logs_start_index:
Expand Down

0 comments on commit 5faf103

Please sign in to comment.