Skip to content

Commit

Permalink
feat: add TxKind (#542)
Browse files Browse the repository at this point in the history
* feat: add `TxKind`

* feat: `#[no_std]` support

* test: fix `non_local_definitions` lint

* chore: more lints
  • Loading branch information
onbjerg authored Feb 28, 2024
1 parent fdbc741 commit 90e800e
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 1 deletion.
2 changes: 1 addition & 1 deletion crates/dyn-abi/src/eip712/coerce.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ fn bytes(value: &serde_json::Value) -> Option<Vec<u8>> {

let arr = value.as_array()?;
let mut vec = Vec::with_capacity(arr.len());
for elem in arr.into_iter() {
for elem in arr.iter() {
vec.push(elem.as_u64()?.try_into().ok()?);
}
Some(vec)
Expand Down
1 change: 1 addition & 0 deletions crates/dyn-abi/src/eip712/typed_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ impl<'de> Deserialize<'de> for TypedData {
message: serde_json::Value,
}

#[allow(non_local_definitions)]
impl From<TypedDataHelper> for TypedData {
fn from(value: TypedDataHelper) -> Self {
Self {
Expand Down
96 changes: 96 additions & 0 deletions crates/primitives/src/common.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
use crate::Address;

#[cfg(feature = "rlp")]
use alloy_rlp::{Buf, BufMut, Decodable, Encodable, EMPTY_STRING_CODE};

/// The `to` field of a transaction. Either a target address, or empty for a
/// contract creation.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum TxKind {
/// A transaction that creates a contract.
#[default]
Create,
/// A transaction that calls a contract or transfer.
Call(Address),
}

impl From<Option<Address>> for TxKind {
/// Creates a `TxKind::Call` with the `Some` address, `None` otherwise.
#[inline]
fn from(value: Option<Address>) -> Self {
match value {
None => TxKind::Create,
Some(addr) => TxKind::Call(addr),
}
}
}

impl From<Address> for TxKind {
/// Creates a `TxKind::Call` with the given address.
#[inline]
fn from(value: Address) -> Self {
TxKind::Call(value)
}
}

impl TxKind {
/// Returns the address of the contract that will be called or will receive the transfer.
pub const fn to(self) -> Option<Address> {
match self {
TxKind::Create => None,
TxKind::Call(to) => Some(to),
}
}

/// Returns true if the transaction is a contract creation.
#[inline]
pub const fn is_create(self) -> bool {
matches!(self, TxKind::Create)
}

/// Returns true if the transaction is a contract call.
#[inline]
pub const fn is_call(self) -> bool {
matches!(self, TxKind::Call(_))
}

/// Calculates a heuristic for the in-memory size of this object.
#[inline]
pub const fn size(self) -> usize {
core::mem::size_of::<Self>()
}
}

#[cfg(feature = "rlp")]
impl Encodable for TxKind {
fn encode(&self, out: &mut dyn BufMut) {
match self {
TxKind::Call(to) => to.encode(out),
TxKind::Create => out.put_u8(EMPTY_STRING_CODE),
}
}

fn length(&self) -> usize {
match self {
TxKind::Call(to) => to.length(),
TxKind::Create => 1, // EMPTY_STRING_CODE is a single byte
}
}
}

#[cfg(feature = "rlp")]
impl Decodable for TxKind {
fn decode(buf: &mut &[u8]) -> alloy_rlp::Result<Self> {
if let Some(&first) = buf.first() {
if first == EMPTY_STRING_CODE {
buf.advance(1);
Ok(TxKind::Create)
} else {
let addr = <Address as Decodable>::decode(buf)?;
Ok(TxKind::Call(addr))
}
} else {
Err(alloy_rlp::Error::InputTooShort)
}
}
}
5 changes: 5 additions & 0 deletions crates/primitives/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
#![cfg_attr(not(feature = "std"), no_std)]
#![cfg_attr(feature = "std", allow(unused_imports))]
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
// TODO: remove when https://github.com/proptest-rs/proptest/pull/427 is merged
#![allow(unknown_lints, non_local_definitions)]

#[macro_use]
extern crate alloc;
Expand Down Expand Up @@ -44,6 +46,9 @@ pub use bits::{
mod bytes_;
pub use self::bytes_::Bytes;

mod common;
pub use common::TxKind;

mod log;
pub use log::{Log, LogData};

Expand Down
2 changes: 2 additions & 0 deletions crates/sol-types/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@
#![cfg_attr(not(feature = "std"), no_std)]
#![cfg_attr(feature = "std", allow(unused_imports))]
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
// TODO: remove when https://github.com/proptest-rs/proptest/pull/427 is merged
#![allow(unknown_lints, non_local_definitions)]

#[allow(unused_extern_crates)]
extern crate self as alloy_sol_types;
Expand Down
3 changes: 3 additions & 0 deletions crates/sol-types/tests/macros/main.rs
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
// TODO: remove when https://github.com/proptest-rs/proptest/pull/427 is merged
#![allow(unknown_lints, non_local_definitions)]

mod sol;

0 comments on commit 90e800e

Please sign in to comment.