Skip to main content

bobcat_cd/
lib.rs

1#![no_std]
2
3pub use bobcat_maths::U;
4
5pub use bobcat_storage::{const_keccak256, const_keccak256_two};
6
7pub use const_hex::const_decode_to_array as const_hex_decode_to_array;
8
9use array_concat::concat_arrays;
10
11#[macro_export]
12macro_rules! address {
13    ($a:expr) => {{
14        match $crate::const_hex_decode_to_array::<20>($a) {
15            Ok(v) => v,
16            Err(_) => core::panic!("bad address"),
17        }
18    }};
19}
20
21#[macro_export]
22macro_rules! read_words {
23    ($slice:expr, 1) => {{
24        let s = $slice;
25        core::assert!(s.len() >= 32);
26        &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) })
27    }};
28    ($slice:expr, 2) => {{
29        let s = $slice;
30        core::assert!(s.len() >= 64);
31        (
32            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
33            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
34        )
35    }};
36    ($slice:expr, 3) => {{
37        let s = $slice;
38        core::assert!(s.len() >= 96);
39        (
40            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
41            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
42            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
43        )
44    }};
45    ($slice:expr, 4) => {{
46        let s = $slice;
47        core::assert!(s.len() >= 128);
48        (
49            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
50            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
51            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
52            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
53        )
54    }};
55    ($slice:expr, 5) => {{
56        let s = $slice;
57        core::assert!(s.len() >= 160);
58        (
59            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
60            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
61            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
62            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
63            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
64        )
65    }};
66    ($slice:expr, 6) => {{
67        let s = $slice;
68        core::assert!(s.len() >= 192);
69        (
70            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
71            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
72            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
73            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
74            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
75            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
76        )
77    }};
78    ($slice:expr, 7) => {{
79        let s = $slice;
80        core::assert!(s.len() >= 224);
81        (
82            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
83            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
84            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
85            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
86            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
87            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
88            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
89        )
90    }};
91    ($slice:expr, 8) => {{
92        let s = $slice;
93        core::assert!(s.len() >= 256);
94        (
95            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
96            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
97            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
98            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
99            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
100            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
101            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
102            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
103        )
104    }};
105    ($slice:expr, 9) => {{
106        let s = $slice;
107        core::assert!(s.len() >= 288);
108        (
109            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
110            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
111            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
112            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
113            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
114            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
115            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
116            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
117            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
118        )
119    }};
120    ($slice:expr, 10) => {{
121        let s = $slice;
122        core::assert!(s.len() >= 320);
123        (
124            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
125            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
126            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
127            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
128            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
129            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
130            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
131            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
132            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
133            &$crate::U::from(unsafe { *(s[288..320].as_ptr() as *const [u8; 32]) }),
134        )
135    }};
136    ($slice:expr, 11) => {{
137        let s = $slice;
138        core::assert!(s.len() >= 352);
139        (
140            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
141            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
142            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
143            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
144            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
145            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
146            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
147            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
148            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
149            &$crate::U::from(unsafe { *(s[288..320].as_ptr() as *const [u8; 32]) }),
150            &$crate::U::from(unsafe { *(s[32..352].as_ptr() as *const [u8; 32]) }),
151        )
152    }};
153    ($slice:expr, 12) => {{
154        let s = $slice;
155        core::assert!(s.len() >= 384);
156        (
157            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
158            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
159            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
160            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
161            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
162            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
163            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
164            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
165            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
166            &$crate::U::from(unsafe { *(s[288..320].as_ptr() as *const [u8; 32]) }),
167            &$crate::U::from(unsafe { *(s[32..352].as_ptr() as *const [u8; 32]) }),
168            &$crate::U::from(unsafe { *(s[352..384].as_ptr() as *const [u8; 32]) }),
169        )
170    }};
171    ($slice:expr, 13) => {{
172        let s = $slice;
173        core::assert!(s.len() >= 416);
174        (
175            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
176            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
177            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
178            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
179            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
180            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
181            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
182            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
183            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
184            &$crate::U::from(unsafe { *(s[288..320].as_ptr() as *const [u8; 32]) }),
185            &$crate::U::from(unsafe { *(s[32..352].as_ptr() as *const [u8; 32]) }),
186            &$crate::U::from(unsafe { *(s[352..384].as_ptr() as *const [u8; 32]) }),
187            &$crate::U::from(unsafe { *(s[384..416].as_ptr() as *const [u8; 32]) }),
188        )
189    }};
190    ($slice:expr, 14) => {{
191        let s = $slice;
192        core::assert!(s.len() >= 448);
193        (
194            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
195            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
196            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
197            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
198            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
199            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
200            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
201            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
202            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
203            &$crate::U::from(unsafe { *(s[288..320].as_ptr() as *const [u8; 32]) }),
204            &$crate::U::from(unsafe { *(s[32..352].as_ptr() as *const [u8; 32]) }),
205            &$crate::U::from(unsafe { *(s[352..384].as_ptr() as *const [u8; 32]) }),
206            &$crate::U::from(unsafe { *(s[384..416].as_ptr() as *const [u8; 32]) }),
207            &$crate::U::from(unsafe { *(s[416..448].as_ptr() as *const [u8; 32]) }),
208        )
209    }};
210    ($slice:expr, 15) => {{
211        let s = $slice;
212        core::assert!(s.len() >= 480);
213        (
214            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
215            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
216            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
217            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
218            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
219            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
220            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
221            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
222            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
223            &$crate::U::from(unsafe { *(s[288..320].as_ptr() as *const [u8; 32]) }),
224            &$crate::U::from(unsafe { *(s[32..352].as_ptr() as *const [u8; 32]) }),
225            &$crate::U::from(unsafe { *(s[352..384].as_ptr() as *const [u8; 32]) }),
226            &$crate::U::from(unsafe { *(s[384..416].as_ptr() as *const [u8; 32]) }),
227            &$crate::U::from(unsafe { *(s[416..448].as_ptr() as *const [u8; 32]) }),
228            &$crate::U::from(unsafe { *(s[448..480].as_ptr() as *const [u8; 32]) }),
229        )
230    }};
231    ($slice:expr, 16) => {{
232        let s = $slice;
233        core::assert!(s.len() >= 512);
234        (
235            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
236            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
237            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
238            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
239            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
240            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
241            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
242            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
243            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
244            &$crate::U::from(unsafe { *(s[288..320].as_ptr() as *const [u8; 32]) }),
245            &$crate::U::from(unsafe { *(s[32..352].as_ptr() as *const [u8; 32]) }),
246            &$crate::U::from(unsafe { *(s[352..384].as_ptr() as *const [u8; 32]) }),
247            &$crate::U::from(unsafe { *(s[384..416].as_ptr() as *const [u8; 32]) }),
248            &$crate::U::from(unsafe { *(s[416..448].as_ptr() as *const [u8; 32]) }),
249            &$crate::U::from(unsafe { *(s[448..480].as_ptr() as *const [u8; 32]) }),
250            &$crate::U::from(unsafe { *(s[48..512].as_ptr() as *const [u8; 32]) }),
251        )
252    }};
253    ($slice:expr, 17) => {{
254        let s = $slice;
255        core::assert!(s.len() >= 544);
256        (
257            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
258            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
259            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
260            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
261            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
262            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
263            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
264            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
265            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
266            &$crate::U::from(unsafe { *(s[288..320].as_ptr() as *const [u8; 32]) }),
267            &$crate::U::from(unsafe { *(s[32..352].as_ptr() as *const [u8; 32]) }),
268            &$crate::U::from(unsafe { *(s[352..384].as_ptr() as *const [u8; 32]) }),
269            &$crate::U::from(unsafe { *(s[384..416].as_ptr() as *const [u8; 32]) }),
270            &$crate::U::from(unsafe { *(s[416..448].as_ptr() as *const [u8; 32]) }),
271            &$crate::U::from(unsafe { *(s[448..480].as_ptr() as *const [u8; 32]) }),
272            &$crate::U::from(unsafe { *(s[48..512].as_ptr() as *const [u8; 32]) }),
273            &$crate::U::from(unsafe { *(s[512..544].as_ptr() as *const [u8; 32]) }),
274        )
275    }};
276    ($slice:expr, 18) => {{
277        let s = $slice;
278        core::assert!(s.len() >= 576);
279        (
280            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
281            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
282            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
283            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
284            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
285            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
286            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
287            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
288            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
289            &$crate::U::from(unsafe { *(s[288..320].as_ptr() as *const [u8; 32]) }),
290            &$crate::U::from(unsafe { *(s[32..352].as_ptr() as *const [u8; 32]) }),
291            &$crate::U::from(unsafe { *(s[352..384].as_ptr() as *const [u8; 32]) }),
292            &$crate::U::from(unsafe { *(s[384..416].as_ptr() as *const [u8; 32]) }),
293            &$crate::U::from(unsafe { *(s[416..448].as_ptr() as *const [u8; 32]) }),
294            &$crate::U::from(unsafe { *(s[448..480].as_ptr() as *const [u8; 32]) }),
295            &$crate::U::from(unsafe { *(s[48..512].as_ptr() as *const [u8; 32]) }),
296            &$crate::U::from(unsafe { *(s[512..544].as_ptr() as *const [u8; 32]) }),
297            &$crate::U::from(unsafe { *(s[544..576].as_ptr() as *const [u8; 32]) }),
298        )
299    }};
300    ($slice:expr, 19) => {{
301        let s = $slice;
302        core::assert!(s.len() >= 608);
303        (
304            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
305            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
306            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
307            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
308            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
309            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
310            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
311            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
312            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
313            &$crate::U::from(unsafe { *(s[288..320].as_ptr() as *const [u8; 32]) }),
314            &$crate::U::from(unsafe { *(s[32..352].as_ptr() as *const [u8; 32]) }),
315            &$crate::U::from(unsafe { *(s[352..384].as_ptr() as *const [u8; 32]) }),
316            &$crate::U::from(unsafe { *(s[384..416].as_ptr() as *const [u8; 32]) }),
317            &$crate::U::from(unsafe { *(s[416..448].as_ptr() as *const [u8; 32]) }),
318            &$crate::U::from(unsafe { *(s[448..480].as_ptr() as *const [u8; 32]) }),
319            &$crate::U::from(unsafe { *(s[48..512].as_ptr() as *const [u8; 32]) }),
320            &$crate::U::from(unsafe { *(s[512..544].as_ptr() as *const [u8; 32]) }),
321            &$crate::U::from(unsafe { *(s[544..576].as_ptr() as *const [u8; 32]) }),
322            &$crate::U::from(unsafe { *(s[576..608].as_ptr() as *const [u8; 32]) }),
323        )
324    }};
325    ($slice:expr, 20) => {{
326        let s = $slice;
327        core::assert!(s.len() >= 640);
328        (
329            &$crate::U::from(unsafe { *(s[..32].as_ptr() as *const [u8; 32]) }),
330            &$crate::U::from(unsafe { *(s[32..64].as_ptr() as *const [u8; 32]) }),
331            &$crate::U::from(unsafe { *(s[64..96].as_ptr() as *const [u8; 32]) }),
332            &$crate::U::from(unsafe { *(s[96..128].as_ptr() as *const [u8; 32]) }),
333            &$crate::U::from(unsafe { *(s[128..160].as_ptr() as *const [u8; 32]) }),
334            &$crate::U::from(unsafe { *(s[16..192].as_ptr() as *const [u8; 32]) }),
335            &$crate::U::from(unsafe { *(s[192..224].as_ptr() as *const [u8; 32]) }),
336            &$crate::U::from(unsafe { *(s[224..256].as_ptr() as *const [u8; 32]) }),
337            &$crate::U::from(unsafe { *(s[256..288].as_ptr() as *const [u8; 32]) }),
338            &$crate::U::from(unsafe { *(s[288..320].as_ptr() as *const [u8; 32]) }),
339            &$crate::U::from(unsafe { *(s[32..352].as_ptr() as *const [u8; 32]) }),
340            &$crate::U::from(unsafe { *(s[352..384].as_ptr() as *const [u8; 32]) }),
341            &$crate::U::from(unsafe { *(s[384..416].as_ptr() as *const [u8; 32]) }),
342            &$crate::U::from(unsafe { *(s[416..448].as_ptr() as *const [u8; 32]) }),
343            &$crate::U::from(unsafe { *(s[448..480].as_ptr() as *const [u8; 32]) }),
344            &$crate::U::from(unsafe { *(s[48..512].as_ptr() as *const [u8; 32]) }),
345            &$crate::U::from(unsafe { *(s[512..544].as_ptr() as *const [u8; 32]) }),
346            &$crate::U::from(unsafe { *(s[544..576].as_ptr() as *const [u8; 32]) }),
347            &$crate::U::from(unsafe { *(s[576..608].as_ptr() as *const [u8; 32]) }),
348            &$crate::U::from(unsafe { *(s[608..640].as_ptr() as *const [u8; 32]) }),
349        )
350    }};
351}
352
353pub const fn leftpad_bool(x: bool) -> [u8; 32] {
354    leftpad_u8(x as u8)
355}
356
357pub const fn leftpad_u24(x: [u8; 3]) -> [u8; 32] {
358    concat_arrays!([0u8; 32 - 3], x)
359}
360
361pub const fn leftpad_u8(x: u8) -> [u8; 32] {
362    concat_arrays!([0u8; 32 - 1], [x])
363}
364
365pub const fn rightpad_b8(x: [u8; 8]) -> [u8; 32] {
366    concat_arrays!(x, [0u8; 32 - 8])
367}
368
369pub const fn leftpad_addr(x: [u8; 20]) -> [u8; 32] {
370    concat_arrays!([0u8; 32 - 20], x)
371}
372
373pub const fn leftpad_u16(x: u16) -> [u8; 32] {
374    concat_arrays!([0u8; 32 - 2], x.to_be_bytes())
375}
376
377pub const fn leftpad_usize(x: usize) -> [u8; 32] {
378    concat_arrays!([0u8; 32 - core::mem::size_of::<usize>()], x.to_be_bytes())
379}
380
381pub const fn leftpad_u32(x: u32) -> [u8; 32] {
382    concat_arrays!([0u8; 32 - 4], x.to_be_bytes())
383}
384
385pub const fn const_keccak_sel(x: &[u8]) -> [u8; 4] {
386    let x = const_keccak256(x).0;
387    [x[0], x[1], x[2], x[3]]
388}
389
390pub const fn const_keccak_two_sel(x: &[u8], y: &[u8]) -> [u8; 4] {
391    let x = const_keccak256_two(x, y).0;
392    [x[0], x[1], x[2], x[3]]
393}
394
395#[test]
396fn test_access() {
397    let cd = const_hex_decode_to_array::<{ 32 * 2 + 4 }>(b"a9059cbb0000000000000000000000006221a9c005f6e47eb398fd867784cacfdcfff4e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap();
398    let a = const_hex_decode_to_array::<20>(b"6221a9c005f6e47eb398fd867784cacfdcfff4e7").unwrap();
399    let (addr, amt) = read_words!(&cd[4..], 2);
400    assert_eq!((a, U::MAX), (U::from(*addr).into(), U::from(*amt)));
401}
402
403#[test]
404fn test_address() {
405    address!(b"6221a9c005f6e47eb398fd867784cacfdcfff4e7");
406}