1#![no_std]
2
3pub use bobcat_maths::U;
4
5pub use bobcat_storage::const_keccak256;
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(_) => panic!("bad address")
17 }
18 }}
19}
20
21#[macro_export]
22macro_rules! read_words {
23 ($slice:expr, 1) => {{
24 let s = $slice;
25 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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
390#[test]
391fn test_access() {
392 use bobcat_maths::Address;
393 let cd = const_hex_decode_to_array::<{ 32 * 2 + 4 }>(b"a9059cbb0000000000000000000000006221a9c005f6e47eb398fd867784cacfdcfff4e7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap();
394 let a = const_hex_decode_to_array::<20>(b"6221a9c005f6e47eb398fd867784cacfdcfff4e7")
395 .unwrap();
396 let (addr, amt) = read_words!(&cd[4..], 2);
397 assert_eq!((a, U::MAX), (Address::from(U::from(*addr)), U::from(*amt)));
398}
399
400#[test]
401fn test_address() {
402 address!(b"6221a9c005f6e47eb398fd867784cacfdcfff4e7");
403}