serde_eth 0.1.1

Ethereum ABI encoder for serde
Documentation
use crate::helpers::pad_left;
use num_bigint::BigUint;
use serde::Serialize;

const ADDRESS_SIZE: usize = 20;
#[derive(Debug, Clone)]
pub struct Address(pub [u8; ADDRESS_SIZE]);
#[derive(Debug, Clone)]
pub struct Bytes32(pub [u8; 32]);
#[derive(Debug, Clone, PartialEq)]
pub struct U256(pub BigUint);

impl From<Vec<u8>> for U256 {
    fn from(value: Vec<u8>) -> Self {
        U256(BigUint::from_bytes_be(&value))
    }
}

impl Default for U256 {
    fn default() -> Self {
        0.into()
    }
}

impl From<u64> for U256 {
    fn from(value: u64) -> Self {
        U256(BigUint::from(value))
    }
}

impl From<i32> for U256 {
    fn from(value: i32) -> Self {
        U256(BigUint::from(value as u64))
    }
}

impl From<usize> for U256 {
    fn from(value: usize) -> Self {
        U256(BigUint::from(value))
    }
}

impl Serialize for U256 {
    fn serialize<S>(&self, serializer: S) -> core::result::Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        let mut bytes = self.0.to_bytes_le();
        bytes.resize(32, 0);
        bytes.reverse();

        serializer.serialize_bytes(&bytes)
    }
}

impl Serialize for Address {
    fn serialize<S>(&self, serializer: S) -> core::result::Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        serializer.serialize_bytes(&pad_left(&self.0.to_vec()))
    }
}

impl Serialize for Bytes32 {
    fn serialize<S>(&self, serializer: S) -> core::result::Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        serializer.serialize_bytes(&self.0.to_vec())
    }
}