use crate::EvmResult;
use pallet_evm::{Log, PrecompileHandle};
use sp_core::{H160, H256};
use sp_std::{vec, vec::Vec};
#[must_use]
pub fn log0(address: impl Into<H160>, data: impl Into<Vec<u8>>) -> Log {
Log {
address: address.into(),
topics: vec![],
data: data.into(),
}
}
#[must_use]
pub fn log1(address: impl Into<H160>, topic0: impl Into<H256>, data: impl Into<Vec<u8>>) -> Log {
Log {
address: address.into(),
topics: vec![topic0.into()],
data: data.into(),
}
}
#[must_use]
pub fn log2(
address: impl Into<H160>,
topic0: impl Into<H256>,
topic1: impl Into<H256>,
data: impl Into<Vec<u8>>,
) -> Log {
Log {
address: address.into(),
topics: vec![topic0.into(), topic1.into()],
data: data.into(),
}
}
#[must_use]
pub fn log3(
address: impl Into<H160>,
topic0: impl Into<H256>,
topic1: impl Into<H256>,
topic2: impl Into<H256>,
data: impl Into<Vec<u8>>,
) -> Log {
Log {
address: address.into(),
topics: vec![topic0.into(), topic1.into(), topic2.into()],
data: data.into(),
}
}
#[must_use]
pub fn log4(
address: impl Into<H160>,
topic0: impl Into<H256>,
topic1: impl Into<H256>,
topic2: impl Into<H256>,
topic3: impl Into<H256>,
data: impl Into<Vec<u8>>,
) -> Log {
Log {
address: address.into(),
topics: vec![topic0.into(), topic1.into(), topic2.into(), topic3.into()],
data: data.into(),
}
}
pub trait LogExt {
fn record(self, handle: &mut impl PrecompileHandle) -> EvmResult;
fn compute_cost(&self) -> EvmResult<u64>;
}
impl LogExt for Log {
fn record(self, handle: &mut impl PrecompileHandle) -> EvmResult {
handle.log(self.address, self.topics, self.data)?;
Ok(())
}
fn compute_cost(&self) -> EvmResult<u64> {
crate::evm::costs::log_costs(self.topics.len(), self.data.len())
}
}