use borsh::{BorshDeserialize, BorshSerialize};
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
BorshDeserialize,
BorshSerialize,
serde::Serialize,
serde::Deserialize,
)]
pub struct MessageDiscriminant {
discriminant: u32,
}
const MIN_ON_CHAIN_DISCRIMINANT: u32 = 1 << 30;
const NEP_366_META_TRANSACTIONS: u32 = MIN_ON_CHAIN_DISCRIMINANT + 366;
#[derive(BorshSerialize)]
pub struct SignableMessage<'a, T> {
pub discriminant: MessageDiscriminant,
pub msg: &'a T,
}
impl<'a, T: BorshSerialize> SignableMessage<'a, T> {
pub fn new(msg: &'a T, ty: SignableMessageType) -> Self {
let discriminant = ty.into();
Self { discriminant, msg }
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[non_exhaustive]
pub enum SignableMessageType {
DelegateAction,
}
impl From<SignableMessageType> for MessageDiscriminant {
fn from(ty: SignableMessageType) -> Self {
match ty {
SignableMessageType::DelegateAction => Self {
discriminant: NEP_366_META_TRANSACTIONS,
},
}
}
}