1mod error;
2pub use error::*;
3use lazy_static::lazy_static;
4use num_bigint::BigUint;
5use num_traits::Zero;
6
7mod common_msg_info;
8pub use common_msg_info::*;
9
10use crate::cell::{ArcCell, Cell};
11
12mod common;
13mod jetton;
14mod nft;
15mod sbt;
16mod transfer;
17pub use common::*;
18pub use jetton::*;
19pub use nft::*;
20pub use sbt::*;
21pub use transfer::*;
22
23lazy_static! {
24 pub(crate) static ref ZERO_COINS: BigUint = BigUint::zero();
25}
26
27pub trait TonMessage: Sized {
28 fn build(&self) -> Result<Cell, TonMessageError>;
29
30 fn parse(cell: &Cell) -> Result<Self, TonMessageError>;
31}
32
33pub trait HasOpcode: TonMessage {
34 fn verify_opcode(&self, opcode: u32) -> Result<(), TonMessageError> {
35 let expected_opcode = Self::opcode();
36 if opcode != expected_opcode {
37 let invalid = InvalidMessage {
38 opcode: Some(opcode),
39 query_id: Some(self.query_id()),
40 message: format!("Unexpected opcode. {0:08x} expected", expected_opcode),
41 };
42 Err(TonMessageError::InvalidMessage(invalid))
43 } else {
44 Ok(())
45 }
46 }
47
48 fn with_query_id(&mut self, query_id: u64) -> &mut Self {
49 self.set_query_id(query_id);
50 self
51 }
52 fn set_query_id(&mut self, query_id: u64);
53
54 fn query_id(&self) -> u64;
55
56 fn opcode() -> u32;
57}
58
59impl TonMessage for Cell {
60 fn build(&self) -> Result<Cell, TonMessageError> {
61 Ok(self.clone())
62 }
63
64 fn parse(cell: &Cell) -> Result<Self, TonMessageError> {
65 Ok(cell.clone())
66 }
67}
68
69pub trait WithForwardPayload: TonMessage {
70 fn with_forward_payload(
71 &mut self,
72 forward_ton_amount: BigUint,
73 forward_payload: ArcCell,
74 ) -> &mut Self {
75 self.set_forward_payload(forward_payload, forward_ton_amount);
76 self
77 }
78
79 fn set_forward_payload(&mut self, forward_payload: ArcCell, forward_ton_amount: BigUint);
80}