1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
use core::convert::TryInto;
use serde::{Deserialize, Serialize};
use crate::arrays_as_bytes;
// We could use the third-party `ethereum_types::Address` here,
// but it has an inefficient `serde` implementation (serializes as hex instead of bytes).
// So for simplicity we just use our own type since we only need the size check.
// Later a conversion method can be easily defined to/from `ethereum_types::Address`.
/// Represents an Ethereum address (20 bytes).
#[derive(PartialEq, Debug, Serialize, Deserialize, Copy, Clone, PartialOrd, Eq, Ord)]
pub struct Address(#[serde(with = "arrays_as_bytes")] [u8; 20]);
impl Address {
/// Attempts to create an address from a byte slice.
/// Fails if the size of the slice is incorrect.
pub fn from_slice(bytes: &[u8]) -> Option<Self> {
bytes.try_into().ok().map(Address)
}
}
impl AsRef<[u8]> for Address {
fn as_ref(&self) -> &[u8] {
self.0.as_ref()
}
}
