1use crate::block_tlb::{Coins, CurrencyCollection, StateInit};
2use crate::tlb_adapters::TLBRef;
3use ton_lib_core::cell::{TonCellRef, TonHash};
4use ton_lib_core::types::tlb_core::{MsgAddressInt, VarLenBytes};
5use ton_lib_core::TLBDerive;
6
7#[derive(Default, Debug, Clone, PartialEq, TLBDerive)]
8pub struct ShardAccount {
9 #[tlb_derive(adapter = "TLBRef")]
10 pub account: MaybeAccount,
11 pub last_tx_hash: TonHash,
12 pub last_tx_lt: u64,
13}
14
15#[derive(Debug, Clone, PartialEq, TLBDerive)]
18pub enum MaybeAccount {
19 None(AccountNone),
20 #[rustfmt::skip]
21 Account(Box::<Account>),
22}
23
24#[derive(Debug, Clone, PartialEq, TLBDerive)]
25#[tlb_derive(prefix = 0b0, bits_len = 1)]
26pub struct AccountNone;
27
28#[derive(Debug, Clone, PartialEq, TLBDerive)]
29#[tlb_derive(prefix = 0b1, bits_len = 1)]
30pub struct Account {
31 pub addr: MsgAddressInt,
32 pub storage_stat: StorageInfo,
33 pub storage: AccountStorage,
34}
35
36#[derive(Debug, Clone, PartialEq, TLBDerive)]
37pub struct StorageUsed {
38 pub cells: VarLenBytes<u64, 3>,
39 pub bits: VarLenBytes<u64, 3>,
40}
41
42#[derive(Debug, Clone, PartialEq, TLBDerive)]
43pub struct StorageInfo {
44 pub used: StorageUsed,
45 pub storage_extra: MaybeStorageExtraInfo,
46 pub last_paid: u32,
47 pub due_payment: Option<Coins>,
48}
49
50#[derive(Debug, Clone, PartialEq, TLBDerive)]
51pub struct AccountStorage {
52 pub last_tx_lt: u64,
53 pub balance: CurrencyCollection,
54 pub state: AccountState,
55}
56
57#[derive(Debug, Clone, PartialEq, TLBDerive)]
58pub enum MaybeStorageExtraInfo {
59 None(StorageExtraInfoNone),
60 Info(StorageExtraInfo),
61}
62
63#[derive(Debug, Clone, PartialEq, TLBDerive)]
64#[tlb_derive(prefix = 0b000, bits_len = 3)]
65pub struct StorageExtraInfoNone;
66
67#[derive(Debug, Clone, PartialEq, TLBDerive)]
68#[tlb_derive(prefix = 0b001, bits_len = 3)]
69pub struct StorageExtraInfo {
70 pub dict_hash: TonHash,
71}
72
73#[derive(Debug, Clone, PartialEq, TLBDerive)]
74pub enum AccountState {
75 Uninit(AccountStateUninit),
76 Frozen(AccountStateFrozen),
77 Active(AccountStateActive),
78}
79
80#[derive(Debug, Clone, PartialEq, TLBDerive)]
81#[tlb_derive(prefix = 0b00, bits_len = 2)]
82pub struct AccountStateUninit;
83
84#[derive(Debug, Clone, PartialEq, TLBDerive)]
85#[tlb_derive(prefix = 0b01, bits_len = 2)]
86pub struct AccountStateFrozen {
87 pub state_hash: TonHash,
88}
89
90#[derive(Debug, Clone, PartialEq, TLBDerive)]
91#[tlb_derive(prefix = 0b1, bits_len = 1)]
92pub struct AccountStateActive {
93 pub state_init: StateInit,
94}
95
96#[derive(Debug, Clone, PartialEq, TLBDerive)]
98pub enum AccountStatus {
99 Uninit(AccountStatusUninit),
100 Frozen(AccountStatusFrozen),
101 Active(AccountStatusActive),
102 NonExist(AccountStatusNotExist),
103}
104
105#[derive(Debug, Clone, PartialEq, TLBDerive)]
106#[tlb_derive(prefix = 0b00, bits_len = 2)]
107pub struct AccountStatusUninit;
108
109#[derive(Debug, Clone, PartialEq, TLBDerive)]
110#[tlb_derive(prefix = 0b01, bits_len = 2)]
111pub struct AccountStatusFrozen;
112
113#[derive(Debug, Clone, PartialEq, TLBDerive)]
114#[tlb_derive(prefix = 0b10, bits_len = 2)]
115pub struct AccountStatusActive;
116
117#[derive(Debug, Clone, PartialEq, TLBDerive)]
118#[tlb_derive(prefix = 0b11, bits_len = 2)]
119pub struct AccountStatusNotExist;
120
121impl ShardAccount {
122 pub const NON_EXIST: ShardAccount = ShardAccount {
123 account: MaybeAccount::None(AccountNone),
124 last_tx_hash: TonHash::ZERO,
125 last_tx_lt: 0,
126 };
127}
128
129impl Default for AccountStatus {
130 fn default() -> Self { AccountStatus::NonExist(AccountStatusNotExist) }
131}
132
133impl Default for MaybeAccount {
134 fn default() -> Self { MaybeAccount::None(AccountNone) }
135}
136
137#[rustfmt::skip]
138impl MaybeAccount {
139 pub fn as_active(&self) -> Option<&AccountStateActive> { self.as_account()?.storage.state.as_active() }
140 pub fn as_frozen(&self) -> Option<&AccountStateFrozen> { self.as_account()?.storage.state.as_frozen() }
141 pub fn get_code(&self) -> Option<&TonCellRef> { self.as_active()?.state_init.code.as_ref() }
142 pub fn get_data(&self) -> Option<&TonCellRef> { self.as_active()?.state_init.data.as_ref() }
143 pub fn get_balance(&self) -> Option<&Coins> { Some(&self.as_account()?.storage.balance.grams) }
144
145 pub fn as_active_mut(&mut self) -> Option<&mut AccountStateActive> { self.as_account_mut()?.storage.state.as_active_mut() }
146 pub fn as_frozen_mut(&mut self) -> Option<&mut AccountStateFrozen> { self.as_account_mut()?.storage.state.as_frozen_mut() }
147 pub fn get_code_mut(&mut self) -> Option<&mut TonCellRef> { self.as_active_mut()?.state_init.code.as_mut() }
148 pub fn get_data_mut(&mut self) -> Option<&mut TonCellRef> { self.as_active_mut()?.state_init.data.as_mut() }
149 pub fn get_balance_mut(&mut self) -> Option<&mut Coins> { Some(&mut self.as_account_mut()?.storage.balance.grams) }
150}
151
152#[cfg(test)]
153mod tests {
154 use super::*;
155 use crate::block_tlb::{SimpleLib, TickTock};
156 use std::collections::HashMap;
157
158 use std::str::FromStr;
159 use tokio_test::assert_ok;
160 use ton_lib_core::cell::TonCell;
161 use ton_lib_core::traits::tlb::TLB;
162 use ton_lib_core::types::tlb_core::{MsgAddressIntStd, VarLen};
163
164 #[test]
165 fn test_block_tlb_account_some() -> anyhow::Result<()> {
166 let account_boc = "b5ee9c7201021d0100066d000271c00b113a994b5024a16719f69139328eb759596c38a25f59028b146fecdc3621dfe23a8bce83401229200000cc73d58b950d75499e8106934001020114ff00f4a413f4bcf2c80b030253705148e3baabcb0800c881fc78d28207072c728a2e7896228f37e17369ae121cb0eef7b4b0385f3330401a1b02016204050202cb0607020120161702f3d0cb434c0c05c6c238ecc200835c874c7c0608405e351466ea44c38601035c87e800c3b51343e803e903e90353534541168504d3214017e809400f3c58073c5b333327b55383e903e900c7e800c7d007e800c7e80004c5c3e0e80b4c7c04074cfc044bb51343e803e903e9035353449a084190adf41eeb8c089a0809001da23864658380e78b64814183fa0bc0019635355161c705f2e04904fa4021fa4430c000f2e14dfa00d4d120d0d31f018210178d4519baf2e0488040d721fa00fa4031fa4031fa0020d70b009ad74bc00101c001b0f2b19130e254431b0a03fa82107bdd97deba8ee7363805fa00fa40f82854120a70546004131503c8cb0358fa0201cf1601cf16c921c8cb0113f40012f400cb00c9f9007074c8cb02ca07cbffc9d05008c705f2e04a12a14414506603c85005fa025003cf1601cf16ccccc9ed54fa40d120d70b01c000b3915be30de02682102c76b973bae30235250c0d0e018e2191729171e2f839206e938124279120e2216e94318128739101e25023a813a0738103a370f83ca00270f83612a00170f836a07381040982100966018070f837a0bcf2b025597f0b00ec82103b9aca0070fb02f828450470546004131503c8cb0358fa0201cf1601cf16c921c8cb0113f40012f400cb00c920f9007074c8cb02ca07cbffc9d0c8801801cb0501cf1658fa02029858775003cb6bcccc9730017158cb6acce2c98011fb005005a04314c85005fa025003cf1601cf16ccccc9ed540044c8801001cb0501cf1670fa027001cb6a8210d53276db01cb1f0101cb3fc98042fb0001fc145f04323401fa40d2000101d195c821cf16c9916de2c8801001cb055004cf1670fa027001cb6a8210d173540001cb1f500401cb3f23fa4430c0008e35f828440470546004131503c8cb0358fa0201cf1601cf16c921c8cb0113f40012f400cb00c9f9007074c8cb02ca07cbffc9d012cf1697316c127001cb01e2f400c90f04f882106501f354ba8e223134365145c705f2e04902fa40d1103402c85005fa025003cf1601cf16ccccc9ed54e0258210fb88e119ba8e2132343603d15131c705f2e0498b025512c85005fa025003cf1601cf16ccccc9ed54e034248210235caf52bae30237238210cb862902bae302365b2082102508d66abae3026c311011121300088050fb0002ec3031325033c705f2e049fa40fa00d4d120d0d31f01018040d7212182100f8a7ea5ba8e4d36208210595f07bcba8e2c3004fa0031fa4031f401d120f839206e943081169fde718102f270f8380170f836a0811a7770f836a0bcf2b08e138210eed236d3ba9504d30331d19434f2c048e2e2e30d50037014150044335142c705f2e049c85003cf16c9134440c85005fa025003cf1601cf16ccccc9ed54001e3002c705f2e049d4d4d101ed54fb0400188210d372158cbadc840ff2f000ce31fa0031fa4031fa4031f401fa0020d70b009ad74bc00101c001b0f2b19130e25442162191729171e2f839206e938124279120e2216e94318128739101e25023a813a0738103a370f83ca00270f83612a00170f836a07381040982100966018070f837a0bcf2b000c082103b9aca0070fb02f828450470546004131503c8cb0358fa0201cf1601cf16c921c8cb0113f40012f400cb00c920f9007074c8cb02ca07cbffc9d0c8801801cb0501cf1658fa02029858775003cb6bcccc9730017158cb6acce2c98011fb000025bd9adf6a2687d007d207d206a6a6888122f82402027118190085adbcf6a2687d007d207d206a6a688a2f827c1400b82a3002098a81e46581ac7d0100e78b00e78b6490e4658089fa00097a00658064fc80383a6465816503e5ffe4e84000cfaf16f6a2687d007d207d206a6a68bf99e836c1783872ebdb514d9c97c283b7f0ae5179029e2b6119c39462719e4f46ed8f7413e62c780a417877407e978f01a40711411b1acb773a96bdd93fa83bb5ca8435013c8c4b3ac91f4589b4780a38646583fa0064a180400842028f452d7a4dfd74066b682365177259ed05734435be76b5fd4bd5d8af2b7c3d6801001c003e68747470733a2f2f7465746865722e746f2f757364742d746f6e2e6a736f6e";
167 let cell = TonCell::from_boc_hex(account_boc)?;
168 let account = MaybeAccount::from_cell(&cell)?;
169 if let MaybeAccount::Account(account) = &account {
170 assert_eq!(
171 account.addr,
172 MsgAddressIntStd {
173 anycast: None,
174 workchain: 0,
175 address: TonHash::from_str("B113A994B5024A16719F69139328EB759596C38A25F59028B146FECDC3621DFE")?,
176 }
177 .into()
178 );
179 assert_eq!(account.storage_stat.used.cells, VarLenBytes::new(29u32, 8));
180 assert_eq!(account.storage_stat.used.bits, VarLenBytes::new(12090u32, 16));
181
182 assert_eq!(account.storage.last_tx_lt, 56199469000003u64);
183 assert_eq!(account.storage.balance, CurrencyCollection::new(915473564698u64));
184 if let AccountState::Active(state) = &account.storage.state {
185 let code = state.state_init.code.as_ref().unwrap();
186 assert_eq!(
187 code.hash()?,
188 &TonHash::from_str("18d5b6e780ff0bb451254c2c760d09d6e485638cd1407abb97078752c3c1c9ee")?
189 );
190 }
191 } else {
192 panic!("Expected Some account");
193 }
194 let serialized_back = account.to_cell()?;
195 assert_eq!(serialized_back, cell);
196 Ok(())
197 }
198
199 #[test]
200 fn test_block_tlb_shard_account_tick_tock() -> anyhow::Result<()> {
201 let boc_hex = "b5ee9c7201020d0100017500015099602ce40fd84286bddb06f8bcc9fceb7e3027f9826c8985017f16cba12363cc000016e2cc89c18101036fcff34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf21881f4800000000000005b8b322706090311d3e017f009080202016206030142bf412429205ea66d6f2004edfa570f6f56b3e85e59baa1befbc73b7da5d55bdc61040104123405000456780142bf5a2eef5056775f5b9572ff3ad63dd2a71d1fb281ca177a5e1c74730eccb2e51307000fabacabadabacaba8004811fd096c00000000000000000000000000000000000000000000000000000000000000000114ff00f4a413f4a0f2c80b0a0201200c0b00dfa5ffff76a268698fe9ffe8e42c5267858f90e785ffe4f6aa6467c444ffb365ffc10802faf0807d014035e7a064b87d804077e7857fc10803dfd2407d014035e7a064b86467cd8903a32b9ba4410803ade68afd014035e7a045ea432b6363796103bb7b9363210c678b64b87d807d80400002d2";
202
203 let shard_account = ShardAccount::from_boc_hex(boc_hex)?;
204 let expected = ShardAccount {
205 account: MaybeAccount::Account(Box::new(Account{
206 addr: MsgAddressInt::Std(MsgAddressIntStd {
207 anycast: None,
208 workchain: -1,
209 address: TonHash::from_str("34517c7bdf5187c55af4f8b61fdc321588c7ab768dee24b006df29106458d7cf")?,
210 }),
211 storage_stat: StorageInfo {
212 used: StorageUsed {
213 cells: VarLenBytes::new(12u32, 8),
214 bits: VarLenBytes::new(2002u32, 16),
215 },
216 storage_extra: StorageExtraInfoNone.into(),
217 last_paid: 0,
218 due_payment: None,
219 },
220 storage: AccountStorage {
221 last_tx_lt: 25163350000002,
222 balance: CurrencyCollection::new(206000000u32),
223 state: AccountState::Active(AccountStateActive {
224 state_init: StateInit {
225 split_depth: None,
226 tick_tock: Some(TickTock {
227 tick: true,
228 tock: true,
229 }),
230 code: Some(TonCellRef::from_boc_hex("b5ee9c72010104010087000114ff00f4a413f4a0f2c80b01020120030200dfa5ffff76a268698fe9ffe8e42c5267858f90e785ffe4f6aa6467c444ffb365ffc10802faf0807d014035e7a064b87d804077e7857fc10803dfd2407d014035e7a064b86467cd8903a32b9ba4410803ade68afd014035e7a045ea432b6363796103bb7b9363210c678b64b87d807d80400002d2")?),
231 data: Some(TonCellRef::from_boc_hex("b5ee9c7201010101002600004811fd096c0000000000000000000000000000000000000000000000000000000000000000")?),
232 library: HashMap::from([
233 (TonHash::from_str("0D1777A82B3BAFADCAB97F9D6B1EE9538E8FD940E50BBD2F0E3A398766597289")?, SimpleLib {
234 public: true,
235 root: TonCellRef::from_boc_hex("b5ee9c7201010101000a00000fabacabadabacaba8")?,
236 }),
237 (TonHash::from_str("209214902F5336B7900276FD2B87B7AB59F42F2CDD50DF7DE39DBED2EAADEE30")?, SimpleLib {
238 public: true,
239 root: TonCellRef::from_boc_hex("b5ee9c7201010201000900010412340100045678")?,
240 }),
241
242 ]),
243 },
244 }),
245 },
246 })),
247 last_tx_hash: TonHash::from_str("99602ce40fd84286bddb06f8bcc9fceb7e3027f9826c8985017f16cba12363cc")?,
248 last_tx_lt: 25163350000001,
249 };
250
251 assert_eq!(expected, shard_account);
252
253 assert_eq!(
254 shard_account.cell_hash()?,
255 TonHash::from_str("2EF34B7D264FC0C21713BE018B9FBB264B0AF887FF5715C36229BDF79B11A858")?
256 );
257 let serialized = shard_account.to_boc_hex()?;
258 let parsed_back = ShardAccount::from_boc_hex(&serialized)?;
259 assert_eq!(parsed_back, shard_account);
260 Ok(())
261 }
262
263 #[test]
264 fn test_block_tlb_shard_account_regular() -> anyhow::Result<()> {
265 let boc_hex = "b5ee9c7201021401000421000150b78a4a3e91ae0ddf8c49983a554e010cc4764ccc990500728e8202f958c7fc40000030a3c2065f4501026fc00949a19cfd6eb82bb5ff6573b11208c71abb9398411b3b4672f78a7e34ea706d92268715433ce498700000c28f08197d210a9949ea1340030201957081353c31caacd80129343398aec31cdbbf7d32d977c27a96d5cd23c38fd4bd47be019abafb9b356b001ece9afb55cc82c82739247aa35879be66afeb1502a81a72f2a982ec7625b5fb20030114ff00f4a413f4bcf2c80b040201620605001ba0f605da89a1f401f481f481a8610202cc11070201200b080201480a090083200835c87b51343e803e903e90350c0134c7e08405e3514654882ea0841ef765f784ee84ac7cb8b174cfcc7e800c04e81408f214013e809633c58073c5b3327b552000db3b51343e803e903e90350c01f4cffe803e900c145468549271c17cb8b049f0bffcb8b0a0823938702a8005a805af3cb8b0e0841ef765f7b232c7c572cfd400fe8088b3c58073c5b25c60063232c14933c59c3e80b2dab33260103ec01004f214013e809633c58073c5b3327b55200201580f0c01f53b51343e803e903e90350c0234cffe80145468017e903e9002fe911d3232c084b281f2fff27414d431c1551cdb48965c150804d50500f214013e809633c58073c5b33248a0079c7232c032c132c004bd003d0032c032407e910c6af8407e40006ab84061386c2c5c1d3232c0b281f2fff2741631c16c7cb8b0c2a00d01fefa0051a8a18208989680820898968012b608a18208e4e1c0a018a1278e385279a018a182107362d09cc8cb1f5230cb3f58fa025007cf165007cf16c9718010c8cb0524cf165006fa0215cb6a14ccc971fb00102410239710491038375f04e225d70b01c30023c200b093356c21e30d03c85004fa0258cf1601cf16ccc9ed540e00428210d53276db708010c8cb055008cf165004fa0216cb6a12cb1f12cb3fc972fb0001f300f4cffe803e90087c007b51343e803e903e90350c144da8548ab1c17cb8b04a30bffcb8b0951d009c150804d50500f214013e809633c58073c5b33248a0079c7232c032c132c004bd003d0032c0325481be910c6af8407e40006ab84061386c2c5c1d3232c0b281f2fff274013e903d010c7e800835d27080201000d8f2e2c4778018c8cb055008cf1670fa0217cb6b17cc8210178d4519c8cb1f19cb3f5007fa0222cf165006cf1624fa025003cf16c95005cc2291729171e25008a812a08208e4e1c0aa008208989680a0a014bcf2e2c504c98040fb004130c85004fa0258cf1601cf16ccc9ed540201d4131200113e910c1c2ebcb8536000c30831c02497c138007434c0c05c6c2544d7c0fc03783e903e900c7e800c5c75c87e800c7e800c1cea6d0000b4c7e08403e29fa954882ea54c4d167c02b8208405e3514654882ea58c511100fc02f80d60841657c1ef2ea4d67c033817c12103fcbc20";
267
268 let shard_account = ShardAccount::from_boc_hex(boc_hex)?;
269 let expected = ShardAccount {
270 account: MaybeAccount::Account(Box::new(Account{
271 addr: MsgAddressInt::Std(MsgAddressIntStd {
272 anycast: None,
273 workchain: 0,
274 address: TonHash::from_str("949a19cfd6eb82bb5ff6573b11208c71abb9398411b3b4672f78a7e34ea706d9")?,
275 }),
276 storage_stat: StorageInfo {
277 used: StorageUsed {
278 cells: VarLen::new(19u32, 8),
279 bits: VarLen::new(7253u32, 16),
280 },
281 storage_extra: StorageExtraInfoNone.into(),
282 last_paid: 1738314510,
283 due_payment: None,
284 },
285 storage: AccountStorage {
286 last_tx_lt: 53479893000008,
287 balance: CurrencyCollection::new(711272360u32),
288 state: AccountState::Active(AccountStateActive {
289 state_init: StateInit {
290 split_depth: None,
291 tick_tock: None,
292 code: Some(TonCellRef::from_boc_hex("b5ee9c720102110100036c000114ff00f4a413f4bcf2c80b010201620302001ba0f605da89a1f401f481f481a8610202cc0e04020120080502014807060083200835c87b51343e803e903e90350c0134c7e08405e3514654882ea0841ef765f784ee84ac7cb8b174cfcc7e800c04e81408f214013e809633c58073c5b3327b552000db3b51343e803e903e90350c01f4cffe803e900c145468549271c17cb8b049f0bffcb8b0a0823938702a8005a805af3cb8b0e0841ef765f7b232c7c572cfd400fe8088b3c58073c5b25c60063232c14933c59c3e80b2dab33260103ec01004f214013e809633c58073c5b3327b55200201580c0901f53b51343e803e903e90350c0234cffe80145468017e903e9002fe911d3232c084b281f2fff27414d431c1551cdb48965c150804d50500f214013e809633c58073c5b33248a0079c7232c032c132c004bd003d0032c032407e910c6af8407e40006ab84061386c2c5c1d3232c0b281f2fff2741631c16c7cb8b0c2a00a01fefa0051a8a18208989680820898968012b608a18208e4e1c0a018a1278e385279a018a182107362d09cc8cb1f5230cb3f58fa025007cf165007cf16c9718010c8cb0524cf165006fa0215cb6a14ccc971fb00102410239710491038375f04e225d70b01c30023c200b093356c21e30d03c85004fa0258cf1601cf16ccc9ed540b00428210d53276db708010c8cb055008cf165004fa0216cb6a12cb1f12cb3fc972fb0001f300f4cffe803e90087c007b51343e803e903e90350c144da8548ab1c17cb8b04a30bffcb8b0951d009c150804d50500f214013e809633c58073c5b33248a0079c7232c032c132c004bd003d0032c0325481be910c6af8407e40006ab84061386c2c5c1d3232c0b281f2fff274013e903d010c7e800835d27080200d00d8f2e2c4778018c8cb055008cf1670fa0217cb6b17cc8210178d4519c8cb1f19cb3f5007fa0222cf165006cf1624fa025003cf16c95005cc2291729171e25008a812a08208e4e1c0aa008208989680a0a014bcf2e2c504c98040fb004130c85004fa0258cf1601cf16ccc9ed540201d4100f00113e910c1c2ebcb8536000c30831c02497c138007434c0c05c6c2544d7c0fc03783e903e900c7e800c5c75c87e800c7e800c1cea6d0000b4c7e08403e29fa954882ea54c4d167c02b8208405e3514654882ea58c511100fc02f80d60841657c1ef2ea4d67c033817c12103fcbc20")?),
293 data: Some(TonCellRef::from_boc_hex("b5ee9c72010212010003ba0001957081353c31caacd80129343398aec31cdbbf7d32d977c27a96d5cd23c38fd4bd47be019abafb9b356b001ece9afb55cc82c82739247aa35879be66afeb1502a81a72f2a982ec7625b5fb20010114ff00f4a413f4bcf2c80b020201620403001ba0f605da89a1f401f481f481a8610202cc0f05020120090602014808070083200835c87b51343e803e903e90350c0134c7e08405e3514654882ea0841ef765f784ee84ac7cb8b174cfcc7e800c04e81408f214013e809633c58073c5b3327b552000db3b51343e803e903e90350c01f4cffe803e900c145468549271c17cb8b049f0bffcb8b0a0823938702a8005a805af3cb8b0e0841ef765f7b232c7c572cfd400fe8088b3c58073c5b25c60063232c14933c59c3e80b2dab33260103ec01004f214013e809633c58073c5b3327b55200201580d0a01f53b51343e803e903e90350c0234cffe80145468017e903e9002fe911d3232c084b281f2fff27414d431c1551cdb48965c150804d50500f214013e809633c58073c5b33248a0079c7232c032c132c004bd003d0032c032407e910c6af8407e40006ab84061386c2c5c1d3232c0b281f2fff2741631c16c7cb8b0c2a00b01fefa0051a8a18208989680820898968012b608a18208e4e1c0a018a1278e385279a018a182107362d09cc8cb1f5230cb3f58fa025007cf165007cf16c9718010c8cb0524cf165006fa0215cb6a14ccc971fb00102410239710491038375f04e225d70b01c30023c200b093356c21e30d03c85004fa0258cf1601cf16ccc9ed540c00428210d53276db708010c8cb055008cf165004fa0216cb6a12cb1f12cb3fc972fb0001f300f4cffe803e90087c007b51343e803e903e90350c144da8548ab1c17cb8b04a30bffcb8b0951d009c150804d50500f214013e809633c58073c5b33248a0079c7232c032c132c004bd003d0032c0325481be910c6af8407e40006ab84061386c2c5c1d3232c0b281f2fff274013e903d010c7e800835d27080200e00d8f2e2c4778018c8cb055008cf1670fa0217cb6b17cc8210178d4519c8cb1f19cb3f5007fa0222cf165006cf1624fa025003cf16c95005cc2291729171e25008a812a08208e4e1c0aa008208989680a0a014bcf2e2c504c98040fb004130c85004fa0258cf1601cf16ccc9ed540201d4111000113e910c1c2ebcb8536000c30831c02497c138007434c0c05c6c2544d7c0fc03783e903e900c7e800c5c75c87e800c7e800c1cea6d0000b4c7e08403e29fa954882ea54c4d167c02b8208405e3514654882ea58c511100fc02f80d60841657c1ef2ea4d67c033817c12103fcbc20")?),
294 library: Default::default(),
295 },
296 }),
297 },
298 })),
299 last_tx_hash: TonHash::from_str("b78a4a3e91ae0ddf8c49983a554e010cc4764ccc990500728e8202f958c7fc40")?,
300 last_tx_lt: 53479893000005,
301 };
302
303 assert_eq!(expected, shard_account);
304 assert_eq!(
305 shard_account.cell_hash()?,
306 TonHash::from_str("355BCC314569D5A3627E374F709464D3F9E0126CDB71DAB860DF18C6867C40D4")?
307 );
308 let serialized = shard_account.to_boc_hex()?;
309 let parsed_back = ShardAccount::from_boc_hex(&serialized)?;
310 assert_eq!(parsed_back, shard_account);
311 Ok(())
312 }
313
314 #[test]
315 fn test_block_tlb_account_storage_extra_info() -> anyhow::Result<()> {
316 let account = MaybeAccount::from_boc_hex("b5ee9c7201023401000f140002b1c00f81e9c8ef2294f1c7515e02a621ccab3f05d9e5b254e307d743314d8ad8dc49a2689c4cca438d42d5d95ecf4d0fcb68cc51d0838c320f8b655fd5c7c7f6aeb014ca26905b416ff08000007ed2d42dc0154b2036c72d134001020114ff00f4a413f4bcf2c80b030386801d02ec7498d846f039cc605d8cb55199be8ffa5008728151498d6b929c3b196d2400931f7fc347c05333778502c862ced26ef1dbd61ae84c0ec489dddbba1c25765830313202016204050198d0eda2edfb20c700925f04e001d0d3030171b0925f04e0fa40fa4031fa0031f401fa0031fa00013170f83a02d31f0101d33f01125365a18055820085ce8209e1338070f83766b608a15166a106020120272804f2ed44d0fa4001f861fa4001f862fa4001f863d401d0fa0001f86cfa0001f86bfa0030f86dd401f86ed430d0d32f01f86ad32f01f866d32f01f867d32f01f868d32f01f869d30301f864f40430f86522821048e660b5bae3022282106c582059ba9136e30d2182100e50d313bae302343434228210cf6a5da4ba0708090a00b46c7181179470f8365cbcf2e064f84d59a1a0f86df845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5402fc03d31ffa00f404fa4055302170547000246ec0008e156c3101d0d300fa00fa0023963403fa0030039130e29134e255027f266ec000f84cf84b5007a816a05240b915b0927034de5320a022a027a02e81334a70f836a0a052c0be5240b0e30210365f0638c88210ae7df95b2402cb1fcb3fcb1f21cf16c9702602801080420b0c03ec3101fa40d4d4f828f84e52300270705003c85003cf168b02cf16ca00ccc921c8cb0113f40012f400cb00c97001f90074c8cb0212ca07cbffc9d05006c705f2e04701d7393078d721d3ff0131f8458307f40e6fa131f2e0c920d0f404f401fa40fa003020c300935b3234e30ddb3c5252a1c200f2e0640f101103fc8f7a3202d4f828f84e52300270705003c85003cf168b02cf16ca00ccc921c8cb0113f40012f400cb00c97001f90074c8cb0212ca07cbffc9d05003c705f2e04701fa40308210cf6a5da4587f830771800cc8cb03cb01cb0813cbff02957158cb61cc987058cb6101d0cf16e2c98010fb0020d70b01c000b3915be30de02219251a01fe3339393a3b5266a05008a05008a026a08014fb02f84d5004a0f86df845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed54216ec0009d01c8f400f84cfa02f84bfa02c992316de205c8cb1f2101cb3f0d006e226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb00f80f06c000938100cc928064e2f2f0102501925003cf165003fa0213f40001cf16c982106c582059017f830771800cc8cb03cb01cb0813cbff02957158cb61cc987058cb6101d0cf16e2c98010fb0021d70b01c000b3915be30ddb310e0076c88210d53276db5802cb1fcb3fc970018010810082226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb0004fe250441381523d70b01c0008e63aa00814d6970f836a0738103b582100966018070f837a0801c8127e08209e1338070f837a07020c88210d7b9c06e580802cb1fcb3f23cf165004fa0258cf1622fa0214cb00cb00c970c87001ca0012cccb00c9c87001cbff58cf1658fa02ccc9c8ccc9e30d218307f48e6fa56c12e30f01d01213141502f670207f8ef6238307f47c6fa5208ee702d430d0d3ff0130fa40fa00d430d0d2000101d4f40430206e8e2e3054232080108011226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb008e90c802d012cf162310355980108011db3ce2019213a09414a04313e2029132e201b3161701fcf845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5482100e50d31350047f830771800cc8cb03cb01cb0813cbff02957158cb61cc987058cb6101d0cf16e2c98010fb005043a101a1f84d5210be18003e306c2270c8c9c87f01ca00cccb00c9c87001cbff58cf1658fa02ccc9c8ccc90002a400043070000a028307f41600a28e4dc85801cb055005cf165003fa0254712323ed41ed43ed44ed45ed479f5bc85003cf17c913775003cb6bcccced67ed65ed64ed63ed61747fed11987601cb6bcc01cf17ed41edf101f2ffc901fb00db060008e6306c1200a6f2e0658010fb0201fa403020d70b01c000b38e3cc88210d53276db580302cb1fcb3fc970018010810082226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb00915be20076c88210ae7df95b580302cb1fcb3fc9700180108042226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb0004f6821023b05641bae3022282101f95f86cba8ed46c22f8435210c705f2e048f84dc300f2e0c8c88210f358b6d0580302cb1fcb3ff84dfa02c9f84d01801072226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb0070f86de031218210063199b7bae3022182103531465cba1b251c1d01fe32f8435220c705f2e048f823f849bef2e0ca02d3ff01f84802d32f0131f868f848f849bef2e0cbf847f866f823f867f847f84aa0f869f823f844f84aa8a1f8458307f4866fa5908e1c01d32f013122bb9bf84552108307f45b30f865def8458307f47c6fa5e85f03c8f84901cb2fc9d0f84552208307f416f865708014fb021e00a631f841c705f2e046fa0030f86bf845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5404f88e5331f841c705f2e046fa0030f86cf845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed54e02182105cec6be0bae302218210581879bcbae30221821060094a1bbae3022182106a4fbe34ba2021222301d8f845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed54c80101cbff0101cb2ff84801cb2ff84601cb2ff84701cb2ff84901cb2fc9821023b05641017f1f00c2830771800cc8cb03cb01cb0813cbff02957158cb61cc987058cb6101d0cf16e2c98010fb00c88210d53276db580302cb1fcb3fc970018010810082226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb0000a631f841c705f2e046fa4030f863f845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5400b831f841c705f2e046fa4030f862f8428b02c705f2d050f845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5400a66c21f841c705f2e0468b02f862f845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5401f88e576c21f842c705f2e049f842f8618b02f862f845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed54e021821020faec53ba8e1631f841c705f2e046d421fb0401d0ed1eed53d430ed54e0212402be82107ee5a6d0ba8ebd31f841c705f2e046d430f86e6df86582107ee5a6d0c8c970830771800cc8cb03cb01cb0813cbff02957158cb61cc987058cb6101d0cf16e2c98010fb00e0218210e97250b7bae30230318210d53276dbbadc840ff2f02526008cf845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5400a831f841c705f2e046d32f0131f86af845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed54020158292a0201202c2d00d9b444bda89a1f48003f0c3f48003f0c5f48003f0c7a803a1f40003f0d9f40003f0d7f40061f0dba803f0dda861a1a65e03f0d5a65e03f0cda65e03f0cfa65e03f0d1a65e03f0d3a60603f0c9e80861f0cbf083f085f087f089f08bf08df08ff091f095f093f099f097f09bf09d001f9b4817da89a1f48003f0c3f48003f0c5f48003f0c7a803a1f40003f0d9f40003f0d7f40061f0dba803f0dda861a1a65e03f0d5a65e03f0cda65e03f0cfa65e03f0d1a65e03f0d3a60603f0c9e80861f0cae041f08b060fe90cdf4b211c3003a65e0262a6077928d844a2212261c5f08b060fe8f8df4bd02046be07f08d02b0014f847f848f849f84af84401ebb9685ed44d0fa4001f861fa4001f862fa4001f863d401d0fa0001f86cfa0001f86bfa0030f86dd401f86ed430d0d32f01f86ad32f01f866d32f01f867d32f01f868d32f01f869d30301f864f40430f865f828f84e120270705003c85003cf168b02cf16ca00ccc921c8cb0113f40012f400cb00c92082e01e9bb316ed44d0fa4001f861fa4001f862fa4001f863d401d0fa0001f86cfa0001f86bfa0030f86dd401f86ed430d0d32f01f86ad32f01f866d32f01f867d32f01f868d32f01f869d30301f864f40430f865f828f84e120270705003c85003cf168b02cf16ca00ccc921c8cb0113f40012f400cb00c982f00207001f90074c8cb0212ca07cbffc9d001001e7001f90074c8cb0212ca07cbffc9d00019398968030f4240501f58373808084202e46fa11560c837d5226a87e1bec85bb89bf960c0077c8e4354a747242cba1b05013d00000000001e0000682dfce50000682dfdea0000682dfdd50000682dfe083c33004fa0005301f8059bf55cfa01c7f8cd4bb128402936204591ae294aa5f6f6009a911300000d05bfc110")?;
317 assert_eq!(
318 account.as_account().unwrap().storage_stat.storage_extra.as_info().unwrap().dict_hash,
319 TonHash::from_str("4871A85ABB2BD9E9A1F96D198A3A10718641F16CABFAB8F8FED5D6029944D20B")?
320 );
321 Ok(())
322 }
323
324 #[test]
325 fn test_block_tlb_account_with_other_currencies() -> anyhow::Result<()> {
326 let account = MaybeAccount::from_boc_hex("b5ee9c7201020c01000135000477cff000000000000000000000000000000000000000000000000000000000000000021881c9400000000000000470ddcc451211229a017f31012033c00908070102016205020142bf412429205ea66d6f2004edfa570f6f56b3e85e59baa1befbc73b7da5d55bdc60030104123404000456780142bf5a2eef5056775f5b9572ff3ad63dd2a71d1fb281ca177a5e1c74730eccb2e51306000fabacabadabacaba800480000000a2270f7e042f16b5d2f84eaaf74dd726fe0f3214fae0db98fc9811c928d7b7a7d0098ff0020dd2082014c97ba9730ed44d0d70b1fe0a4f260810200d71820d70b1fed44d0d31fd3ffd15112baf2a122f901541044f910f2a2f80001d31f31d307d4d101fb00a4c8cb1fcbffc9ed540201200b0a0015bfffffffbcbd1a94a200100015be000003bcb3670dc15550")?;
327 assert!(!account.as_account().unwrap().storage.balance.other.is_empty());
328 Ok(())
329 }
330
331 #[test]
332 fn test_block_tlb_account_large() -> anyhow::Result<()> {
333 let account = MaybeAccount::from_boc_hex("b5ee9c720202020f00010000165300000269c002857bdf1ed7104d7d1c322e08f3b730dca9fe4f8abc7ff5a73d23f3c2a6c7ec14041e83cd030c42b0c0000053004acc3bfc13400001000204248aed5320e30320c0ffe30220c0fee302f20b000500060007020e01517470bd84041e8682af31397f6707c54527f4d2acc120bf5b67416e85819b55d50000017cfc8225acc000030400000400040004000404000012001200120012020af4a420f4a1020e00080262ed44d0d749c301f86622d0d70b03a93800dc21c700209f3021d70d1ff2bc21c00020926c21dedfe30201db3cf8476ef27c0009000a028aed44d0d749c301f86621db3cd300019f810200d71820f90158f842f910f2a8ded33f01f84321b9f2b420f8238103e8a882081b7740a0b9f2b4f863d31f01db3cf8476ef27c000e000a0014736f6c20302e34392e30027af846f2e04cf8426ee3008d0890801c52cadbcc81c8e6906459edafbdc9b71081994e92d387e139e6acb69cb20003d0c8ce806fcf40c98100a0fb00db3c0010000f02282082100a0fe8a9bae30220821068b55f3fbae302000b000c032630f846f2e04cf8426ee300d1db3cdb3c7ff8670010000d000f027830f8426ee300f846f273d1f800f82870c8cf8580ca0073cf40ce8d0480000000000000000000000000000507f454c0cf16c9810080fb00db3c7ff867000e000f0072f84a20c8cc2101cc2101ccccc9f86af82870c8cf8580ca0073cf40ce8d0480000000000000000000000000000507f454c0cf16c9810080fb000216ed44d0d749c2018a8e80e2001000110022f84af843f842c8cbffcb3fcf83ccc9ed540024ed44d0d3ffd33fd30031d4d1f86af863f862012e70ed44d0f40588f86a8040f40ef2bdd70bfff86270f863020e040000130013001300130400001400140014001404000015001500150015040000160016001600160400001700170017001704000018001800180018040000190019001900190400001a001a001a001a0400001b001b001b001b0400001c001c001c001c0400001d001d001d001d0400001e001e001e001e0400001f001f001f001f040000200020002000200400002100210021002104000022002200220022040000230023002300230400002400240024002404000025002500250025040000260026002600260400002700270027002704000028002800280028040000290029002900290400002a002a002a002a0400002b002b002b002b0400002c002c002c002c0400002d002d002d002d0400002e002e002e002e0400002f002f002f002f040000300030003000300400003100310031003104000032003200320032040000330033003300330400003400340034003404000035003500350035040000360036003600360400003700370037003704000038003800380038040000390039003900390400003a003a003a003a0400003b003b003b003b0400003c003c003c003c0400003d003d003d003d0400003e003e003e003e0400003f003f003f003f040000400040004000400400004100410041004104000042004200420042040000430043004300430400004400440044004404000045004500450045040000460046004600460400004700470047004704000048004800480048040000490049004900490400004a004a004a004a0400004b004b004b004b0400004c004c004c004c0400004d004d004d004d0400004e004e004e004e0400004f004f004f004f040000500050005000500400005100510051005104000052005200520052040000530053005300530400005400540054005404000055005500550055040000560056005600560400005700570057005704000058005800580058040000590059005900590400005a005a005a005a0400005b005b005b005b0400005c005c005c005c0400005d005d005d005d0400005e005e005e005e0400005f005f005f005f040000600060006000600400006100610061006104000062006200620062040000630063006300630400006400640064006404000065006500650065040000660066006600660400006700670067006704000068006800680068040000690069006900690400006a006a006a006a0400006b006b006b006b0400006c006c006c006c0400006d006d006d006d0400006e006e006e006e0400006f006f006f006f040000700070007000700400007100710071007104000072007200720072040000730073007300730400007400740074007404000075007500750075040000760076007600760400007700770077007704000078007800780078040000790079007900790400007a007a007a007a0400007b007b007b007b0400007c007c007c007c0400007d007d007d007d0400007e007e007e007e0400007f007f007f007f040000800080008000800400008100810081008104000082008200820082040000830083008300830400008400840084008404000085008500850085040000860086008600860400008700870087008704000088008800880088040000890089008900890400008a008a008a008a0400008b008b008b008b0400008c008c008c008c0400008d008d008d008d0400008e008e008e008e0400008f008f008f008f040000900090009000900400009100910091009104000092009200920092040000930093009300930400009400940094009404000095009500950095040000960096009600960400009700970097009704000098009800980098040000990099009900990400009a009a009a009a0400009b009b009b009b0400009c009c009c009c0400009d009d009d009d0400009e009e009e009e0400009f009f009f009f040000a000a000a000a0040000a100a100a100a1040000a200a200a200a2040000a300a300a300a3040000a400a400a400a4040000a500a500a500a5040000a600a600a600a6040000a700a700a700a7040000a800a800a800a8040000a900a900a900a9040000aa00aa00aa00aa040000ab00ab00ab00ab040000ac00ac00ac00ac040000ad00ad00ad00ad040000ae00ae00ae00ae040000af00af00af00af040000b000b000b000b0040000b100b100b100b1040000b200b200b200b2040000b300b300b300b3040000b400b400b400b4040000b500b500b500b5040000b600b600b600b6040000b700b700b700b7040000b800b800b800b8040000b900b900b900b9040000ba00ba00ba00ba040000bb00bb00bb00bb040000bc00bc00bc00bc040000bd00bd00bd00bd040000be00be00be00be040000bf00bf00bf00bf040000c000c000c000c0040000c100c100c100c1040000c200c200c200c2040000c300c300c300c3040000c400c400c400c4040000c500c500c500c5040000c600c600c600c6040000c700c700c700c7040000c800c800c800c8040000c900c900c900c9040000ca00ca00ca00ca040000cb00cb00cb00cb040000cc00cc00cc00cc040000cd00cd00cd00cd040000ce00ce00ce00ce040000cf00cf00cf00cf040000d000d000d000d0040000d100d100d100d1040000d200d200d200d2040000d300d300d300d3040000d400d400d400d4040000d500d500d500d5040000d600d600d600d6040000d700d700d700d7040000d800d800d800d8040000d900d900d900d9040000da00da00da00da040000db00db00db00db040000dc00dc00dc00dc040000dd00dd00dd00dd040000de00de00de00de040000df00df00df00df040000e000e000e000e0040000e100e100e100e1040000e200e200e200e2040000e300e300e300e3040000e400e400e400e4040000e500e500e500e5040000e600e600e600e6040000e700e700e700e7040000e800e800e800e8040000e900e900e900e9040000ea00ea00ea00ea040000eb00eb00eb00eb040000ec00ec00ec00ec040000ed00ed00ed00ed040000ee00ee00ee00ee040000ef00ef00ef00ef040000f000f000f000f0040000f100f100f100f1040000f200f200f200f2040000f300f300f300f3040000f400f400f400f4040000f500f500f500f5040000f600f600f600f6040000f700f700f700f7040000f800f800f800f8040000f900f900f900f9040000fa00fa00fa00fa040000fb00fb00fb00fb040000fc00fc00fc00fc040000fd00fd00fd00fd040000fe00fe00fe00fe040000ff00ff00ff00ff040001000100010001000400010101010101010104000102010201020102040001030103010301030400010401040104010404000105010501050105040001060106010601060400010701070107010704000108010801080108040001090109010901090400010a010a010a010a0400010b010b010b010b0400010c010c010c010c0400010d010d010d010d0400010e010e010e010e0400010f010f010f010f040001100110011001100400011101110111011104000112011201120112040001130113011301130400011401140114011404000115011501150115040001160116011601160400011701170117011704000118011801180118040001190119011901190400011a011a011a011a0400011b011b011b011b0400011c011c011c011c0400011d011d011d011d0400011e011e011e011e0400011f011f011f011f040001200120012001200400012101210121012104000122012201220122040001230123012301230400012401240124012404000125012501250125040001260126012601260400012701270127012704000128012801280128040001290129012901290400012a012a012a012a0400012b012b012b012b0400012c012c012c012c0400012d012d012d012d0400012e012e012e012e0400012f012f012f012f040001300130013001300400013101310131013104000132013201320132040001330133013301330400013401340134013404000135013501350135040001360136013601360400013701370137013704000138013801380138040001390139013901390400013a013a013a013a0400013b013b013b013b0400013c013c013c013c0400013d013d013d013d0400013e013e013e013e0400013f013f013f013f040001400140014001400400014101410141014104000142014201420142040001430143014301430400014401440144014404000145014501450145040001460146014601460400014701470147014704000148014801480148040001490149014901490400014a014a014a014a0400014b014b014b014b0400014c014c014c014c0400014d014d014d014d0400014e014e014e014e0400014f014f014f014f040001500150015001500400015101510151015104000152015201520152040001530153015301530400015401540154015404000155015501550155040001560156015601560400015701570157015704000158015801580158040001590159015901590400015a015a015a015a0400015b015b015b015b0400015c015c015c015c0400015d015d015d015d0400015e015e015e015e0400015f015f015f015f040001600160016001600400016101610161016104000162016201620162040001630163016301630400016401640164016404000165016501650165040001660166016601660400016701670167016704000168016801680168040001690169016901690400016a016a016a016a0400016b016b016b016b0400016c016c016c016c0400016d016d016d016d0400016e016e016e016e0400016f016f016f016f040001700170017001700400017101710171017104000172017201720172040001730173017301730400017401740174017404000175017501750175040001760176017601760400017701770177017704000178017801780178040001790179017901790400017a017a017a017a0400017b017b017b017b0400017c017c017c017c0400017d017d017d017d0400017e017e017e017e0400017f017f017f017f040001800180018001800400018101810181018104000182018201820182040001830183018301830400018401840184018404000185018501850185040001860186018601860400018701870187018704000188018801880188040001890189018901890400018a018a018a018a0400018b018b018b018b0400018c018c018c018c0400018d018d018d018d0400018e018e018e018e0400018f018f018f018f040001900190019001900400019101910191019104000192019201920192040001930193019301930400019401940194019404000195019501950195040001960196019601960400019701970197019704000198019801980198040001990199019901990400019a019a019a019a0400019b019b019b019b0400019c019c019c019c0400019d019d019d019d0400019e019e019e019e0400019f019f019f019f040001a001a001a001a0040001a101a101a101a1040001a201a201a201a2040001a301a301a301a3040001a401a401a401a4040001a501a501a501a5040001a601a601a601a6040001a701a701a701a7040001a801a801a801a8040001a901a901a901a9040001aa01aa01aa01aa040001ab01ab01ab01ab040001ac01ac01ac01ac040001ad01ad01ad01ad040001ae01ae01ae01ae040001af01af01af01af040001b001b001b001b0040001b101b101b101b1040001b201b201b201b2040001b301b301b301b3040001b401b401b401b4040001b501b501b501b5040001b601b601b601b6040001b701b701b701b7040001b801b801b801b8040001b901b901b901b9040001ba01ba01ba01ba040001bb01bb01bb01bb040001bc01bc01bc01bc040001bd01bd01bd01bd040001be01be01be01be040001bf01bf01bf01bf040001c001c001c001c0040001c101c101c101c1040001c201c201c201c2040001c301c301c301c3040001c401c401c401c4040001c501c501c501c5040001c601c601c601c6040001c701c701c701c7040001c801c801c801c8040001c901c901c901c9040001ca01ca01ca01ca040001cb01cb01cb01cb040001cc01cc01cc01cc040001cd01cd01cd01cd040001ce01ce01ce01ce040001cf01cf01cf01cf040001d001d001d001d0040001d101d101d101d1040001d201d201d201d2040001d301d301d301d3040001d401d401d401d4040001d501d501d501d5040001d601d601d601d6040001d701d701d701d7040001d801d801d801d8040001d901d901d901d9040001da01da01da01da040001db01db01db01db040001dc01dc01dc01dc040001dd01dd01dd01dd040001de01de01de01de040001df01df01df01df040001e001e001e001e0040001e101e101e101e1040001e201e201e201e2040001e301e301e301e3040001e401e401e401e4040001e501e501e501e5040001e601e601e601e6040001e701e701e701e7040001e801e801e801e8040001e901e901e901e9040001ea01ea01ea01ea040001eb01eb01eb01eb040001ec01ec01ec01ec040001ed01ed01ed01ed040001ee01ee01ee01ee040001ef01ef01ef01ef040001f001f001f001f0040001f101f101f101f1040001f201f201f201f2040001f301f301f301f3040001f401f401f401f4040001f501f501f501f5040001f601f601f601f6040001f701f701f701f7040001f801f801f801f8040001f901f901f901f9040001fa01fa01fa01fa040001fb01fb01fb01fb040001fc01fc01fc01fc040001fd01fd01fd01fd040001fe01fe01fe01fe040001ff01ff01ff01ff040002000200020002000400020102010201020104000202020202020202040002030203020302030400020402040204020404000205020502050205040002060206020602060400020702070207020704000208020802080208040002090209020902090400020a020a020a020a0400020b020b020b020b0400020c020c020c020c0400020d020d020d020d0400020e020e020e020e0000")?;
335 assert_ok!(account.cell_hash());
336 Ok(())
337 }
338}