rock_n_rollup/services/
internal.rs1use 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
42pub 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}