tonlib_core/tlb_types/block/
state_init.rs

1use crate::cell::{ArcCell, CellBuilder, CellParser, TonCellError};
2use crate::tlb_types::primitives::reference::Ref;
3use crate::tlb_types::tlb::TLB;
4
5// https://github.com/ton-blockchain/ton/blob/59a8cf0ae5c3062d14ec4c89a04fee80b5fd05c1/crypto/block/block.tlb#L281
6#[derive(Debug, Clone, PartialEq)]
7pub struct StateInit {
8    pub split_depth: Option<u8>,
9    pub tick_tock: Option<TickTock>,
10    pub code: Option<Ref<ArcCell>>,
11    pub data: Option<Ref<ArcCell>>,
12    // there is likely library:(HashmapE 256 SimpleLib)
13    pub library: Option<Ref<ArcCell>>,
14}
15
16#[derive(Debug, Clone, PartialEq)]
17pub struct TickTock {
18    pub tick: bool,
19    pub tock: bool,
20}
21
22impl StateInit {
23    pub const fn new(code: ArcCell, data: ArcCell) -> Self {
24        StateInit {
25            split_depth: None,
26            tick_tock: None,
27            code: Some(Ref::new(code)),
28            data: Some(Ref::new(data)),
29            library: None,
30        }
31    }
32}
33
34impl TLB for StateInit {
35    fn read_definition(parser: &mut CellParser) -> Result<Self, TonCellError> {
36        Ok(StateInit {
37            split_depth: parser.load_number_optional(5)?,
38            tick_tock: TLB::read(parser)?,
39            code: TLB::read(parser)?,
40            data: TLB::read(parser)?,
41            library: TLB::read(parser)?,
42        })
43    }
44
45    fn write_definition(&self, dst: &mut CellBuilder) -> Result<(), TonCellError> {
46        dst.store_number_optional(5, self.split_depth)?;
47        self.tick_tock.write(dst)?;
48        self.code.write(dst)?;
49        self.data.write(dst)?;
50        self.library.write(dst)?;
51        Ok(())
52    }
53}
54
55impl TLB for TickTock {
56    fn read_definition(parser: &mut CellParser) -> Result<Self, TonCellError> {
57        let tick = parser.load_bit()?;
58        let tock = parser.load_bit()?;
59        Ok(TickTock { tick, tock })
60    }
61
62    fn write_definition(&self, builder: &mut CellBuilder) -> Result<(), TonCellError> {
63        builder.store_bit(self.tick)?;
64        builder.store_bit(self.tock)?;
65        Ok(())
66    }
67}
68
69#[cfg(test)]
70mod tests {
71    use std::ops::Deref;
72
73    use super::*;
74    use crate::cell::{BagOfCells, TonCellError};
75
76    #[test]
77    fn test_state_init_regular_contract() -> Result<(), TonCellError> {
78        // state_init of UQCJ7Quj9gM_SE3uwOk3gEJC2JFQcgg0s7CSpLr7B_2yiHPG contract
79        let state_init_hex = "b5ee9c720102160100030400020134020100510000082f29a9a31738dd3a33f904d35e2f4f6f9af2d2f9c563c05faa6bb0b12648d5632083ea3f89400114ff00f4a413f4bcf2c80b03020120090404f8f28308d71820d31fd31fd31f02f823bbf264ed44d0d31fd31fd3fff404d15143baf2a15151baf2a205f901541064f910f2a3f80024a4c8cb1f5240cb1f5230cbff5210f400c9ed54f80f01d30721c0009f6c519320d74a96d307d402fb00e830e021c001e30021c002e30001c0039130e30d03a4c8cb1f12cb1fcbff08070605000af400c9ed54006c810108d718fa00d33f305224810108f459f2a782106473747270748018c8cb05cb025005cf165003fa0213cb6acb1f12cb3fc973fb000070810108d718fa00d33fc8542047810108f451f2a782106e6f746570748018c8cb05cb025006cf165004fa0214cb6a12cb1fcb3fc973fb0002006ed207fa00d4d422f90005c8ca0715cbffc9d077748018c8cb05cb0222cf165005fa0214cb6b12ccccc973fb00c84014810108f451f2a702020148130a0201200c0b0059bd242b6f6a2684080a06b90fa0218470d4080847a4937d29910ce6903e9ff9837812801b7810148987159f31840201200e0d0011b8c97ed44d0d70b1f8020158120f02012011100019af1df6a26840106b90eb858fc00019adce76a26840206b90eb85ffc0003db29dfb513420405035c87d010c00b23281f2fff274006040423d029be84c6002e6d001d0d3032171b0925f04e022d749c120925f04e002d31f218210706c7567bd22821064737472bdb0925f05e003fa403020fa4401c8ca07cbffc9d0ed44d0810140d721f404305c810108f40a6fa131b3925f07e005d33fc8258210706c7567ba923830e30d03821064737472ba925f06e30d1514008a5004810108f45930ed44d0810140d720c801cf16f400c9ed540172b08e23821064737472831eb17080185005cb055003cf1623fa0213cb6acb1fcb3fc98040fb00925f03e2007801fa00f40430f8276f2230500aa121bef2e0508210706c7567831eb17080185004cb0526cf1658fa0219f400cb6917cb1f5260cb3f20c98040fb0006";
80        let source_cell = BagOfCells::parse_hex(state_init_hex)?.single_root()?;
81        let state_init = source_cell.parser().load_tlb::<StateInit>()?;
82        assert_eq!(state_init.split_depth, None);
83        assert_eq!(state_init.tick_tock, None);
84        assert!(state_init.code.is_some());
85        assert!(state_init.data.is_some());
86        assert_eq!(state_init.library, None);
87        let mut builder = CellBuilder::new();
88        state_init.write(&mut builder)?;
89        let serial_cell = builder.build()?;
90        assert_eq!(source_cell.deref(), &serial_cell);
91
92        let parsed_back = StateInit::from_cell(&serial_cell)?;
93        assert_eq!(state_init, parsed_back);
94        Ok(())
95    }
96}