tonlib_core/tlb_types/block/
state_init.rs1use crate::cell::{ArcCell, CellBuilder, CellParser, TonCellError};
2use crate::tlb_types::primitives::reference::Ref;
3use crate::tlb_types::tlb::TLB;
4
5#[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 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 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}