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