Trait SolEncode

pub trait SolEncode<'a> {
    type SolType: SolTypeEncode + SolTopicEncode;

    const SOL_NAME: &'static str = <<Self::SolType as SolTypeEncode>::AlloyType as AlloySolType>::SOL_NAME;

    // Required method
    fn to_sol_type(&'a self) -> Self::SolType;

    // Provided methods
    fn encode(&'a self) -> Vec<u8>  { ... }
    fn encode_to(&'a self, buffer: &mut [u8]) -> usize { ... }
    fn encode_topic<H>(&'a self, hasher: H) -> [u8; 32]
       where H: Fn(&[u8], &mut [u8; 32]) { ... }
}
Expand description

Maps an arbitrary Rust/ink! type to a Solidity ABI type equivalent for Solidity ABI encoding.

§Note

Implementing this trait entails:

  • Declaring the equivalent Solidity ABI type via the SolType associated type. See the docs for sealed SolTypeEncode trait for a table of Rust/ink! primitive types mapped to their equivalent Solidity ABI type.
  • Implementing the to_sol_type method which defines how to convert (preferably via a borrow) from &self to &Self::SolType (i.e. the Solidity ABI representation).

§Example

use ink_primitives::SolEncode;

// Example arbitrary type.
struct MyType {
    size: u8,
    status: bool,
}

// `SolEncode` implementation/mapping.
impl<'a> SolEncode<'a> for MyType {
    // NOTE: Prefer reference based representation for better performance.
    type SolType = (&'a u8, &'a bool);

    fn to_sol_type(&'a self) -> Self::SolType {
        (&self.size, &self.status)
    }
}

Provided Associated Constants§

const SOL_NAME: &'static str = <<Self::SolType as SolTypeEncode>::AlloyType as AlloySolType>::SOL_NAME

Name of equivalent Solidity ABI type.

Required Associated Types§

type SolType: SolTypeEncode + SolTopicEncode

Equivalent Solidity ABI type representation.

§Note

Prefer reference based representation for better performance.

Required Methods§

fn to_sol_type(&'a self) -> Self::SolType

Converts from Self to Self::SolType via either a borrow (if possible), or a possibly expensive conversion otherwise.

Provided Methods§

fn encode(&'a self) -> Vec<u8>

Solidity ABI encode the value.

fn encode_to(&'a self, buffer: &mut [u8]) -> usize

Solidity ABI encode the value into the given buffer, and returns the number of bytes written.

§Panics

Panics if the buffer is not large enough.

fn encode_topic<H>(&'a self, hasher: H) -> [u8; 32]
where H: Fn(&[u8], &mut [u8; 32]),

Solidity ABI encode the value as a topic (i.e. an indexed event parameter).

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

§

impl SolEncode<'_> for bool

§

type SolType = bool

§

fn to_sol_type(&self) -> <bool as SolEncode<'_>>::SolType

§

impl SolEncode<'_> for i8

§

type SolType = i8

§

fn to_sol_type(&self) -> <i8 as SolEncode<'_>>::SolType

§

impl SolEncode<'_> for i16

§

type SolType = i16

§

fn to_sol_type(&self) -> <i16 as SolEncode<'_>>::SolType

§

impl SolEncode<'_> for i32

§

type SolType = i32

§

fn to_sol_type(&self) -> <i32 as SolEncode<'_>>::SolType

§

impl SolEncode<'_> for i64

§

type SolType = i64

§

fn to_sol_type(&self) -> <i64 as SolEncode<'_>>::SolType

§

impl SolEncode<'_> for i128

§

type SolType = i128

§

fn to_sol_type(&self) -> <i128 as SolEncode<'_>>::SolType

§

impl SolEncode<'_> for u8

§

type SolType = u8

§

fn to_sol_type(&self) -> <u8 as SolEncode<'_>>::SolType

§

impl SolEncode<'_> for u16

§

type SolType = u16

§

fn to_sol_type(&self) -> <u16 as SolEncode<'_>>::SolType

§

impl SolEncode<'_> for u32

§

type SolType = u32

§

fn to_sol_type(&self) -> <u32 as SolEncode<'_>>::SolType

§

impl SolEncode<'_> for u64

§

type SolType = u64

§

fn to_sol_type(&self) -> <u64 as SolEncode<'_>>::SolType

§

impl SolEncode<'_> for u128

§

type SolType = u128

§

fn to_sol_type(&self) -> <u128 as SolEncode<'_>>::SolType

§

impl SolEncode<'_> for Weight

§

type SolType = (u64, u64)

§

fn to_sol_type(&self) -> <Weight as SolEncode<'_>>::SolType

§

impl<'a> SolEncode<'a> for &str

§

type SolType = &'a str

§

fn to_sol_type(&'a self) -> <&str as SolEncode<'a>>::SolType

§

impl<'a> SolEncode<'a> for &mut str

§

type SolType = &'a str

§

fn to_sol_type(&'a self) -> <&mut str as SolEncode<'a>>::SolType

§

impl<'a> SolEncode<'a> for ()

§

type SolType = ()

§

fn to_sol_type(&'a self) -> <() as SolEncode<'a>>::SolType

§

impl<'a> SolEncode<'a> for Box<str>

§

type SolType = &'a str

§

fn to_sol_type(&'a self) -> <Box<str> as SolEncode<'a>>::SolType

§

impl<'a> SolEncode<'a> for String

§

type SolType = &'a str

§

fn to_sol_type(&'a self) -> <String as SolEncode<'a>>::SolType

§

impl<'a, T> SolEncode<'a> for &[T]
where T: SolEncode<'a>,

§

type SolType = Vec<<T as SolEncode<'a>>::SolType>

§

fn to_sol_type(&'a self) -> <&[T] as SolEncode<'a>>::SolType

§

impl<'a, T> SolEncode<'a> for &mut [T]
where T: SolEncode<'a>,

§

type SolType = Vec<<T as SolEncode<'a>>::SolType>

§

fn to_sol_type(&'a self) -> <&mut [T] as SolEncode<'a>>::SolType

§

impl<'a, T> SolEncode<'a> for Cow<'_, T>
where T: SolEncode<'a> + Clone,

§

type SolType = <T as SolEncode<'a>>::SolType

§

fn to_sol_type(&'a self) -> <Cow<'_, T> as SolEncode<'a>>::SolType

§

impl<'a, T> SolEncode<'a> for Option<T>
where T: SolEncode<'a>,

§

type SolType = Option<<T as SolEncode<'a>>::SolType>

§

fn to_sol_type(&'a self) -> <Option<T> as SolEncode<'a>>::SolType

§

impl<'a, T> SolEncode<'a> for &T
where T: SolEncode<'a>,

§

type SolType = <T as SolEncode<'a>>::SolType

§

fn to_sol_type(&'a self) -> <&T as SolEncode<'a>>::SolType

§

impl<'a, T> SolEncode<'a> for &mut T
where T: SolEncode<'a>,

§

type SolType = <T as SolEncode<'a>>::SolType

§

fn to_sol_type(&'a self) -> <&mut T as SolEncode<'a>>::SolType

§

impl<'a, T> SolEncode<'a> for Box<[T]>
where T: SolEncode<'a>,

§

type SolType = Box<[<T as SolEncode<'a>>::SolType]>

§

fn to_sol_type(&'a self) -> <Box<[T]> as SolEncode<'a>>::SolType

§

impl<'a, T> SolEncode<'a> for Box<T>
where T: SolEncode<'a>,

§

type SolType = <T as SolEncode<'a>>::SolType

§

fn to_sol_type(&'a self) -> <Box<T> as SolEncode<'a>>::SolType

§

impl<'a, T> SolEncode<'a> for Vec<T>
where T: SolEncode<'a>,

§

type SolType = Vec<<T as SolEncode<'a>>::SolType>

§

fn to_sol_type(&'a self) -> <Vec<T> as SolEncode<'a>>::SolType

§

impl<'a, T> SolEncode<'a> for Argument<T>
where T: SolEncode<'a>,

§

type SolType = <T as SolEncode<'a>>::SolType

§

fn to_sol_type(&'a self) -> <Argument<T> as SolEncode<'a>>::SolType

§

impl<'a, T, const N: usize> SolEncode<'a> for [T; N]
where T: SolEncode<'a>,

§

type SolType = [<T as SolEncode<'a>>::SolType; N]

§

fn to_sol_type(&'a self) -> <[T; N] as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0> SolEncode<'a> for (TupleElement0,)
where TupleElement0: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType,)

§

fn to_sol_type(&'a self) -> <(TupleElement0,) as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0, TupleElement1> SolEncode<'a> for (TupleElement0, TupleElement1)
where TupleElement0: SolEncode<'a>, TupleElement1: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType, <TupleElement1 as SolEncode<'a>>::SolType)

§

fn to_sol_type( &'a self, ) -> <(TupleElement0, TupleElement1) as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0, TupleElement1, TupleElement2> SolEncode<'a> for (TupleElement0, TupleElement1, TupleElement2)
where TupleElement0: SolEncode<'a>, TupleElement1: SolEncode<'a>, TupleElement2: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType, <TupleElement1 as SolEncode<'a>>::SolType, <TupleElement2 as SolEncode<'a>>::SolType)

§

fn to_sol_type( &'a self, ) -> <(TupleElement0, TupleElement1, TupleElement2) as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0, TupleElement1, TupleElement2, TupleElement3> SolEncode<'a> for (TupleElement0, TupleElement1, TupleElement2, TupleElement3)
where TupleElement0: SolEncode<'a>, TupleElement1: SolEncode<'a>, TupleElement2: SolEncode<'a>, TupleElement3: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType, <TupleElement1 as SolEncode<'a>>::SolType, <TupleElement2 as SolEncode<'a>>::SolType, <TupleElement3 as SolEncode<'a>>::SolType)

§

fn to_sol_type( &'a self, ) -> <(TupleElement0, TupleElement1, TupleElement2, TupleElement3) as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4> SolEncode<'a> for (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4)
where TupleElement0: SolEncode<'a>, TupleElement1: SolEncode<'a>, TupleElement2: SolEncode<'a>, TupleElement3: SolEncode<'a>, TupleElement4: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType, <TupleElement1 as SolEncode<'a>>::SolType, <TupleElement2 as SolEncode<'a>>::SolType, <TupleElement3 as SolEncode<'a>>::SolType, <TupleElement4 as SolEncode<'a>>::SolType)

§

fn to_sol_type( &'a self, ) -> <(TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4) as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5> SolEncode<'a> for (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5)
where TupleElement0: SolEncode<'a>, TupleElement1: SolEncode<'a>, TupleElement2: SolEncode<'a>, TupleElement3: SolEncode<'a>, TupleElement4: SolEncode<'a>, TupleElement5: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType, <TupleElement1 as SolEncode<'a>>::SolType, <TupleElement2 as SolEncode<'a>>::SolType, <TupleElement3 as SolEncode<'a>>::SolType, <TupleElement4 as SolEncode<'a>>::SolType, <TupleElement5 as SolEncode<'a>>::SolType)

§

fn to_sol_type( &'a self, ) -> <(TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5) as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6> SolEncode<'a> for (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6)
where TupleElement0: SolEncode<'a>, TupleElement1: SolEncode<'a>, TupleElement2: SolEncode<'a>, TupleElement3: SolEncode<'a>, TupleElement4: SolEncode<'a>, TupleElement5: SolEncode<'a>, TupleElement6: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType, <TupleElement1 as SolEncode<'a>>::SolType, <TupleElement2 as SolEncode<'a>>::SolType, <TupleElement3 as SolEncode<'a>>::SolType, <TupleElement4 as SolEncode<'a>>::SolType, <TupleElement5 as SolEncode<'a>>::SolType, <TupleElement6 as SolEncode<'a>>::SolType)

§

fn to_sol_type( &'a self, ) -> <(TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6) as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7> SolEncode<'a> for (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7)
where TupleElement0: SolEncode<'a>, TupleElement1: SolEncode<'a>, TupleElement2: SolEncode<'a>, TupleElement3: SolEncode<'a>, TupleElement4: SolEncode<'a>, TupleElement5: SolEncode<'a>, TupleElement6: SolEncode<'a>, TupleElement7: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType, <TupleElement1 as SolEncode<'a>>::SolType, <TupleElement2 as SolEncode<'a>>::SolType, <TupleElement3 as SolEncode<'a>>::SolType, <TupleElement4 as SolEncode<'a>>::SolType, <TupleElement5 as SolEncode<'a>>::SolType, <TupleElement6 as SolEncode<'a>>::SolType, <TupleElement7 as SolEncode<'a>>::SolType)

§

fn to_sol_type( &'a self, ) -> <(TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7) as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8> SolEncode<'a> for (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8)
where TupleElement0: SolEncode<'a>, TupleElement1: SolEncode<'a>, TupleElement2: SolEncode<'a>, TupleElement3: SolEncode<'a>, TupleElement4: SolEncode<'a>, TupleElement5: SolEncode<'a>, TupleElement6: SolEncode<'a>, TupleElement7: SolEncode<'a>, TupleElement8: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType, <TupleElement1 as SolEncode<'a>>::SolType, <TupleElement2 as SolEncode<'a>>::SolType, <TupleElement3 as SolEncode<'a>>::SolType, <TupleElement4 as SolEncode<'a>>::SolType, <TupleElement5 as SolEncode<'a>>::SolType, <TupleElement6 as SolEncode<'a>>::SolType, <TupleElement7 as SolEncode<'a>>::SolType, <TupleElement8 as SolEncode<'a>>::SolType)

§

fn to_sol_type( &'a self, ) -> <(TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8) as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8, TupleElement9> SolEncode<'a> for (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8, TupleElement9)
where TupleElement0: SolEncode<'a>, TupleElement1: SolEncode<'a>, TupleElement2: SolEncode<'a>, TupleElement3: SolEncode<'a>, TupleElement4: SolEncode<'a>, TupleElement5: SolEncode<'a>, TupleElement6: SolEncode<'a>, TupleElement7: SolEncode<'a>, TupleElement8: SolEncode<'a>, TupleElement9: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType, <TupleElement1 as SolEncode<'a>>::SolType, <TupleElement2 as SolEncode<'a>>::SolType, <TupleElement3 as SolEncode<'a>>::SolType, <TupleElement4 as SolEncode<'a>>::SolType, <TupleElement5 as SolEncode<'a>>::SolType, <TupleElement6 as SolEncode<'a>>::SolType, <TupleElement7 as SolEncode<'a>>::SolType, <TupleElement8 as SolEncode<'a>>::SolType, <TupleElement9 as SolEncode<'a>>::SolType)

§

fn to_sol_type( &'a self, ) -> <(TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8, TupleElement9) as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8, TupleElement9, TupleElement10> SolEncode<'a> for (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8, TupleElement9, TupleElement10)
where TupleElement0: SolEncode<'a>, TupleElement1: SolEncode<'a>, TupleElement2: SolEncode<'a>, TupleElement3: SolEncode<'a>, TupleElement4: SolEncode<'a>, TupleElement5: SolEncode<'a>, TupleElement6: SolEncode<'a>, TupleElement7: SolEncode<'a>, TupleElement8: SolEncode<'a>, TupleElement9: SolEncode<'a>, TupleElement10: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType, <TupleElement1 as SolEncode<'a>>::SolType, <TupleElement2 as SolEncode<'a>>::SolType, <TupleElement3 as SolEncode<'a>>::SolType, <TupleElement4 as SolEncode<'a>>::SolType, <TupleElement5 as SolEncode<'a>>::SolType, <TupleElement6 as SolEncode<'a>>::SolType, <TupleElement7 as SolEncode<'a>>::SolType, <TupleElement8 as SolEncode<'a>>::SolType, <TupleElement9 as SolEncode<'a>>::SolType, <TupleElement10 as SolEncode<'a>>::SolType)

§

fn to_sol_type( &'a self, ) -> <(TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8, TupleElement9, TupleElement10) as SolEncode<'a>>::SolType

§

impl<'a, TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8, TupleElement9, TupleElement10, TupleElement11> SolEncode<'a> for (TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8, TupleElement9, TupleElement10, TupleElement11)
where TupleElement0: SolEncode<'a>, TupleElement1: SolEncode<'a>, TupleElement2: SolEncode<'a>, TupleElement3: SolEncode<'a>, TupleElement4: SolEncode<'a>, TupleElement5: SolEncode<'a>, TupleElement6: SolEncode<'a>, TupleElement7: SolEncode<'a>, TupleElement8: SolEncode<'a>, TupleElement9: SolEncode<'a>, TupleElement10: SolEncode<'a>, TupleElement11: SolEncode<'a>,

§

type SolType = (<TupleElement0 as SolEncode<'a>>::SolType, <TupleElement1 as SolEncode<'a>>::SolType, <TupleElement2 as SolEncode<'a>>::SolType, <TupleElement3 as SolEncode<'a>>::SolType, <TupleElement4 as SolEncode<'a>>::SolType, <TupleElement5 as SolEncode<'a>>::SolType, <TupleElement6 as SolEncode<'a>>::SolType, <TupleElement7 as SolEncode<'a>>::SolType, <TupleElement8 as SolEncode<'a>>::SolType, <TupleElement9 as SolEncode<'a>>::SolType, <TupleElement10 as SolEncode<'a>>::SolType, <TupleElement11 as SolEncode<'a>>::SolType)

§

fn to_sol_type( &'a self, ) -> <(TupleElement0, TupleElement1, TupleElement2, TupleElement3, TupleElement4, TupleElement5, TupleElement6, TupleElement7, TupleElement8, TupleElement9, TupleElement10, TupleElement11) as SolEncode<'a>>::SolType

§

impl<T> SolEncode<'_> for PhantomData<T>

§

type SolType = ()

§

fn encode(&self) -> Vec<u8>

§

fn to_sol_type(&self)

Implementors§

§

impl SolEncode<'_> for H160

§

impl SolEncode<'_> for U256

§

impl<'a> SolEncode<'a> for ByteSlice<'_>

§

type SolType = &'a ByteSlice<'a>

§

impl<'a> SolEncode<'a> for DynBytes

§

type SolType = &'a DynBytes

§

impl<'a> SolEncode<'a> for H256

§

type SolType = &'a FixedBytes<32>

§

impl<'a> SolEncode<'a> for AccountId

§

type SolType = &'a FixedBytes<32>

§

impl<'a> SolEncode<'a> for Hash

§

type SolType = &'a FixedBytes<32>

§

impl<'a, const N: usize> SolEncode<'a> for FixedBytes<N>
where ByteCount<N>: SupportedFixedBytes,

§

type SolType = &'a FixedBytes<N>