use bitflags::bitflags;
use num_bigint::TryFromBigIntError;
pub mod out;
pub type BlockId = u32;
pub type Codec = u64;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[repr(packed, C)]
pub struct TokenAmount {
pub lo: u64,
pub hi: u64,
}
impl From<TokenAmount> for crate::econ::TokenAmount {
fn from(v: TokenAmount) -> Self {
crate::econ::TokenAmount::from_atto(((v.hi as u128) << 64) | (v.lo as u128))
}
}
impl TryFrom<crate::econ::TokenAmount> for TokenAmount {
type Error = TryFromBigIntError<()>;
fn try_from(v: crate::econ::TokenAmount) -> Result<Self, Self::Error> {
v.atto().try_into().map(|v: u128| Self {
hi: (v >> u64::BITS) as u64,
lo: v as u64,
})
}
}
impl<'a> TryFrom<&'a crate::econ::TokenAmount> for TokenAmount {
type Error = TryFromBigIntError<()>;
fn try_from(v: &'a crate::econ::TokenAmount) -> Result<Self, Self::Error> {
v.atto().try_into().map(|v: u128| Self {
hi: (v >> u64::BITS) as u64,
lo: v as u64,
})
}
}
bitflags! {
#[derive(Default, Copy, Clone, Eq, PartialEq, Debug)]
#[repr(transparent)]
pub struct SendFlags: u64 {
const READ_ONLY = 0b00000001;
}
}
impl SendFlags {
pub fn read_only(self) -> bool {
self.intersects(Self::READ_ONLY)
}
}
#[repr(C, packed)]
pub struct EventEntry {
pub flags: crate::event::Flags,
pub codec: u64,
pub key_len: u32,
pub val_len: u32,
}
pub unsafe trait SyscallSafe: Copy + Sized + 'static {}
macro_rules! assert_syscall_safe {
($($t:ty,)*) => {
$(unsafe impl SyscallSafe for $t {})*
}
}
assert_syscall_safe! {
(),
u8, u16, u32, u64,
i8, i16, i32, i64,
TokenAmount,
out::ipld::IpldOpen,
out::ipld::IpldStat,
out::send::Send,
out::crypto::VerifyConsensusFault,
out::network::NetworkContext,
out::vm::MessageContext,
}
unsafe impl<T, const N: usize> SyscallSafe for [T; N] where T: SyscallSafe {}