rock_n_rollup/services/
internal.rs

1use tezos_smart_rollup_encoding::{
2    inbox::{InboxMessage, InternalInboxMessage},
3    michelson::Michelson,
4};
5
6use crate::core::{FromInput, Input, Runtime};
7
8pub trait FromInternal
9where
10    Self: Sized,
11{
12    fn from_internal(input: &[u8]) -> Result<Self, ()>;
13}
14
15pub struct Internal<T>
16where
17    T: FromInternal,
18{
19    level: u32,
20    id: u32,
21    payload: T,
22}
23
24impl<T: FromInternal> Internal<T> {
25    pub fn level(&self) -> &u32 {
26        &self.level
27    }
28
29    pub fn id(&self) -> &u32 {
30        &self.id
31    }
32
33    pub fn payload(&self) -> &T {
34        &self.payload
35    }
36}
37
38pub struct StartOfLevel;
39pub struct InfoPerLevel;
40pub struct EndOfLevel;
41
42/// TODO: better types or use tht tezos sdk
43pub struct Transfer<M>
44where
45    M: Michelson,
46{
47    payload: M,
48    sender: String,
49    source: String,
50    destination: String,
51}
52
53impl<M> Transfer<M>
54where
55    M: Michelson,
56{
57    pub fn payload(&self) -> &M {
58        &self.payload
59    }
60
61    pub fn sender(&self) -> &String {
62        &self.sender
63    }
64
65    pub fn source(&self) -> &String {
66        &self.source
67    }
68
69    pub fn destination(&self) -> &String {
70        &self.destination
71    }
72}
73
74impl FromInternal for StartOfLevel {
75    fn from_internal(input: &[u8]) -> Result<Self, ()> {
76        match input[..] {
77            [0x00, 0x01, ..] => Ok(StartOfLevel {}),
78            _ => Err(()),
79        }
80    }
81}
82
83impl FromInternal for InfoPerLevel {
84    fn from_internal(input: &[u8]) -> Result<Self, ()> {
85        match input[..] {
86            [0x00, 0x03, ..] => Ok(InfoPerLevel {}),
87            _ => Err(()),
88        }
89    }
90}
91
92impl FromInternal for EndOfLevel {
93    fn from_internal(input: &[u8]) -> Result<Self, ()> {
94        match input[..] {
95            [0x00, 0x02, ..] => Ok(EndOfLevel {}),
96            _ => Err(()),
97        }
98    }
99}
100
101impl<M> FromInternal for Transfer<M>
102where
103    M: Michelson,
104{
105    fn from_internal(input: &[u8]) -> Result<Self, ()> {
106        let (_, msg) = InboxMessage::<M>::parse(input).map_err(|_| ())?;
107
108        match msg {
109            InboxMessage::Internal(InternalInboxMessage::Transfer(t)) => {
110                let payload = t.payload;
111                let sender = t.sender.to_base58_check();
112                let source = t.source.to_b58check();
113                let destination = t.destination.to_b58check();
114
115                Ok(Transfer {
116                    payload,
117                    sender,
118                    source,
119                    destination,
120                })
121            }
122            _ => Err(()),
123        }
124    }
125}
126
127impl<T: FromInternal, S> FromInput<Vec<u8>, S> for Internal<T> {
128    fn from_input<R: Runtime>(_: &mut R, input: &Input<Vec<u8>>, _: &S) -> Result<Self, ()> {
129        let payload = T::from_internal(&input.payload)?;
130        Ok(Internal {
131            level: input.level,
132            id: input.id,
133            payload,
134        })
135    }
136}