Skip to content

Commit 3e9c66c

Browse files
committed
stash pre claude
1 parent 65a4d1e commit 3e9c66c

File tree

12 files changed

+598
-33
lines changed

12 files changed

+598
-33
lines changed

Cargo.lock

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

program-libs/hasher/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ solana-program = { workspace = true, optional = true }
1616
thiserror = { workspace = true }
1717
arrayvec = { workspace = true }
1818
num-bigint = { workspace = true }
19+
zerocopy = { workspace = true }
1920

2021
[target.'cfg(not(target_os = "solana"))'.dependencies]
2122
ark-bn254 = { workspace = true }

program-libs/hasher/src/to_byte_array.rs

+21
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use zerocopy::IntoBytes;
2+
13
use crate::{Hasher, HasherError, Poseidon};
24

35
pub trait ToByteArray {
@@ -55,6 +57,25 @@ impl ToByteArray for solana_program::pubkey::Pubkey {
5557
}
5658
}
5759

60+
impl ToByteArray for zerocopy::little_endian::U16 {
61+
const NUM_FIELDS: usize = 1;
62+
63+
fn to_byte_array(&self) -> Result<[u8; 32], HasherError> {
64+
let bytes: u16 = (*self).into();
65+
println!("U16 to byte array {}", bytes);
66+
bytes.to_byte_array()
67+
}
68+
69+
fn to_byte_arrays<const NUM_FIELDS: usize>(
70+
&self,
71+
) -> Result<[[u8; 32]; NUM_FIELDS], HasherError> {
72+
if Self::NUM_FIELDS != NUM_FIELDS {
73+
return Err(HasherError::InvalidNumFields);
74+
}
75+
Ok([self.to_byte_array()?; NUM_FIELDS])
76+
}
77+
}
78+
5879
impl<T: ToByteArray> ToByteArray for Option<T> {
5980
const NUM_FIELDS: usize = 1;
6081

program-libs/zero-copy-derive/src/lib.rs

+52-12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use proc_macro::TokenStream;
2-
use quote::{format_ident, quote};
2+
use quote::{format_ident, quote, ToTokens};
33
use syn::{parse_macro_input, DeriveInput};
44

55
mod deserialize_impl;
@@ -49,11 +49,26 @@ mod zero_copy_struct_inner;
4949
/// 3. rename deserialize traits to ZeroCopy and ZeroCopyMut
5050
/// 4. check generated code by hand
5151
/// 5. fix partial eq generation for options
52-
#[proc_macro_derive(ZeroCopy)]
52+
#[proc_macro_derive(ZeroCopy, attributes(poseidon))]
5353
pub fn derive_zero_copy(input: TokenStream) -> TokenStream {
5454
// Parse the input DeriveInput
5555
let input = parse_macro_input!(input as DeriveInput);
5656

57+
println!("input {}", input.ident.to_token_stream().to_string());
58+
println!(
59+
"input data {}",
60+
input.generics.to_token_stream().to_string()
61+
);
62+
63+
// Check for both the poseidon_hasher attribute and LightHasher in derive
64+
let hasher = input.attrs.iter().any(|attr| {
65+
if attr.path().is_ident("poseidon") {
66+
return true;
67+
}
68+
false
69+
});
70+
println!("hasher {}", hasher);
71+
5772
// Process the input to extract struct information
5873
let (name, z_struct_name, z_struct_meta_name, fields) = utils::process_input(&input);
5974

@@ -62,21 +77,23 @@ pub fn derive_zero_copy(input: TokenStream) -> TokenStream {
6277

6378
// Generate each implementation part using the respective modules
6479
let meta_struct_def_mut =
65-
meta_struct::generate_meta_struct::<true>(&z_struct_meta_name, &meta_fields);
80+
meta_struct::generate_meta_struct::<true>(&z_struct_meta_name, &meta_fields, hasher);
6681
let meta_struct_def =
67-
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields);
82+
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields, hasher);
6883

6984
let z_struct_def_mut = z_struct::generate_z_struct::<true>(
7085
&z_struct_name,
7186
&z_struct_meta_name,
7287
&struct_fields,
7388
&meta_fields,
89+
hasher,
7490
);
7591
let z_struct_def = z_struct::generate_z_struct::<false>(
7692
&z_struct_name,
7793
&z_struct_meta_name,
7894
&struct_fields,
7995
&meta_fields,
96+
hasher,
8097
);
8198

8299
let zero_copy_struct_inner_impl_mut =
@@ -142,6 +159,20 @@ pub fn derive_zero_copy_eq(input: TokenStream) -> TokenStream {
142159
// Parse the input DeriveInput
143160
let input = parse_macro_input!(input as DeriveInput);
144161

162+
// Check for LightHasher in derive attributes (same logic as in derive_zero_copy)
163+
let hasher = input.attrs.iter().any(|attr| {
164+
if attr.path().is_ident("poseidon_hasher") {
165+
return true;
166+
}
167+
168+
if attr.path().is_ident("derive") {
169+
let derive_string = attr.to_token_stream().to_string();
170+
return derive_string.contains("LightHasher");
171+
}
172+
173+
false
174+
});
175+
145176
// Process the input to extract struct information
146177
let (name, z_struct_name, z_struct_meta_name, fields) = utils::process_input(&input);
147178

@@ -360,12 +391,13 @@ mod tests {
360391

361392
// Generate each implementation part using the respective modules
362393
let meta_struct_def =
363-
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields);
394+
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields, false);
364395
let z_struct_def = z_struct::generate_z_struct::<false>(
365396
&z_struct_name,
366397
&z_struct_meta_name,
367398
&struct_fields,
368399
&meta_fields,
400+
false,
369401
);
370402
let zero_copy_struct_inner_impl =
371403
zero_copy_struct_inner::generate_zero_copy_struct_inner::<false>(name, &z_struct_name);
@@ -475,12 +507,13 @@ mod tests {
475507

476508
// Generate each implementation part
477509
let meta_struct_def =
478-
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields);
510+
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields, false);
479511
let z_struct_def = z_struct::generate_z_struct::<false>(
480512
&z_struct_name,
481513
&z_struct_meta_name,
482514
&struct_fields,
483515
&meta_fields,
516+
false,
484517
);
485518
let zero_copy_struct_inner_impl =
486519
zero_copy_struct_inner::generate_zero_copy_struct_inner::<false>(name, &z_struct_name);
@@ -547,12 +580,13 @@ mod tests {
547580

548581
// Generate the implementation
549582
let meta_struct_def =
550-
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields);
583+
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields, false);
551584
let z_struct_def = z_struct::generate_z_struct::<false>(
552585
&z_struct_name,
553586
&z_struct_meta_name,
554587
&struct_fields,
555588
&meta_fields,
589+
false,
556590
);
557591

558592
// Check meta struct has bool converted to u8
@@ -586,12 +620,13 @@ mod tests {
586620

587621
// Generate code from ZeroCopy
588622
let meta_struct_def =
589-
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields);
623+
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields, false);
590624
let z_struct_def = z_struct::generate_z_struct::<false>(
591625
&z_struct_name,
592626
&z_struct_meta_name,
593627
&struct_fields,
594628
&meta_fields,
629+
false,
595630
);
596631
let zero_copy_struct_inner_impl =
597632
zero_copy_struct_inner::generate_zero_copy_struct_inner::<false>(name, &z_struct_name);
@@ -676,7 +711,7 @@ mod tests {
676711

677712
// Generate the implementation
678713
let meta_struct_def =
679-
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields);
714+
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields, false);
680715
let result = meta_struct_def.to_string();
681716

682717
// Verify the meta struct has the right fields
@@ -718,12 +753,13 @@ mod tests {
718753

719754
// Generate the expanded code
720755
let meta_struct_def =
721-
meta_struct::generate_meta_struct::<true>(&z_struct_meta_name, &meta_fields);
756+
meta_struct::generate_meta_struct::<true>(&z_struct_meta_name, &meta_fields, false);
722757
let z_struct_def = z_struct::generate_z_struct::<true>(
723758
&z_struct_name,
724759
&z_struct_meta_name,
725760
&struct_fields,
726761
&meta_fields,
762+
false,
727763
);
728764
let zero_copy_struct_inner_impl = zero_copy_struct_inner::generate_zero_copy_struct_inner::<
729765
false,
@@ -955,13 +991,17 @@ mod tests {
955991
);
956992

957993
// Generate code
958-
let meta_struct_def =
959-
meta_struct::generate_meta_struct::<false>(&z_struct_meta_name, &meta_fields);
994+
let meta_struct_def = meta_struct::generate_meta_struct::<false>(
995+
&z_struct_meta_name,
996+
&meta_fields,
997+
false,
998+
);
960999
let z_struct_def = z_struct::generate_z_struct::<false>(
9611000
&z_struct_name,
9621001
&z_struct_meta_name,
9631002
&struct_fields,
9641003
&meta_fields,
1004+
false,
9651005
);
9661006
let zero_copy_struct_inner_impl =
9671007
zero_copy_struct_inner::generate_zero_copy_struct_inner::<false>(

program-libs/zero-copy-derive/src/meta_struct.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::utils::convert_to_zerocopy_type;
99
pub fn generate_meta_struct<const MUT: bool>(
1010
z_struct_meta_name: &syn::Ident,
1111
meta_fields: &[&Field],
12+
hasher: bool,
1213
) -> TokenStream {
1314
let mut z_struct_meta_name = z_struct_meta_name.clone();
1415
if MUT {
@@ -23,11 +24,18 @@ pub fn generate_meta_struct<const MUT: bool>(
2324
pub #field_name: #field_type
2425
}
2526
});
27+
let hasher = if hasher {
28+
quote! {
29+
, LightHasher
30+
}
31+
} else {
32+
quote! {}
33+
};
2634

2735
// Return the complete meta struct definition
2836
quote! {
2937
#[repr(C)]
30-
#[derive(Debug, PartialEq, light_zero_copy::KnownLayout, light_zero_copy::Immutable, light_zero_copy::Unaligned, light_zero_copy::FromBytes, light_zero_copy::IntoBytes)]
38+
#[derive(Debug, PartialEq, light_zero_copy::KnownLayout, light_zero_copy::Immutable, light_zero_copy::Unaligned, light_zero_copy::FromBytes, light_zero_copy::IntoBytes #hasher)]
3139
pub struct #z_struct_meta_name {
3240
#(#meta_fields_with_converted_types,)*
3341
}

program-libs/zero-copy-derive/src/z_struct.rs

+25-5
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ pub fn generate_z_struct<const MUT: bool>(
258258
z_struct_meta_name: &Ident,
259259
struct_fields: &[&Field],
260260
meta_fields: &[&Field],
261+
hasher: bool,
261262
) -> TokenStream {
262263
let mut z_struct_name = z_struct_name.clone();
263264
let mut z_struct_meta_name = z_struct_meta_name.clone();
@@ -272,25 +273,41 @@ pub fn generate_z_struct<const MUT: bool>(
272273
let derive_clone = if MUT {
273274
quote! {}
274275
} else {
275-
quote! { Clone }
276+
quote! {, Clone }
276277
};
277278
let struct_fields_with_zerocopy_types =
278279
generate_struct_fields_with_zerocopy_types::<MUT>(struct_fields);
279280

281+
let derive_hasher = if hasher {
282+
quote! {
283+
, LightHasher
284+
}
285+
} else {
286+
quote! {}
287+
};
288+
let hasher_flatten = if hasher {
289+
quote! {
290+
#[flatten]
291+
}
292+
} else {
293+
quote! {}
294+
};
295+
280296
let mut z_struct = if meta_fields.is_empty() {
281297
quote! {
282298
// ZStruct
283-
#[derive(Debug, PartialEq, #derive_clone)]
299+
#[derive(Debug, PartialEq #derive_clone #derive_hasher)]
284300
pub struct #z_struct_name<'a> {
285301
#(#struct_fields_with_zerocopy_types,)*
286302
}
287303
}
288304
} else {
289305
let mut tokens = quote! {
290306
// ZStruct
291-
#[derive(Debug, PartialEq, #derive_clone)]
307+
#[derive(Debug, PartialEq #derive_clone #derive_hasher)]
292308
pub struct #z_struct_name<'a> {
293-
__meta: light_zero_copy::Ref<#mutability , #z_struct_meta_name>,
309+
#hasher_flatten
310+
__meta: light_zero_copy::Ref<#mutability, #z_struct_meta_name>,
294311
#(#struct_fields_with_zerocopy_types,)*
295312
}
296313
impl<'a> core::ops::Deref for #z_struct_name<'a> {
@@ -300,8 +317,10 @@ pub fn generate_z_struct<const MUT: bool>(
300317
&self.__meta
301318
}
302319
}
303-
304320
};
321+
if hasher {
322+
println!("hasher_flatten {}", tokens.to_string());
323+
}
305324

306325
if MUT {
307326
tokens.append_all(quote! {
@@ -430,6 +449,7 @@ mod tests {
430449
&z_struct_meta_name,
431450
&struct_fields,
432451
&meta_fields,
452+
false,
433453
);
434454

435455
// Get the generated code as a string for validation

program-libs/zero-copy/src/borsh.rs

+4
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,10 @@ pub mod test {
312312
pub b: u16,
313313
}
314314

315+
// pub fn data_hash_struct_1(a: u8, b: u16) -> [u8; 32] {
316+
317+
// }
318+
315319
#[repr(C)]
316320
#[derive(Debug, PartialEq, KnownLayout, Immutable, Unaligned, FromBytes)]
317321
pub struct ZStruct1Meta {

sdk-libs/macros/Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ light-poseidon = { workspace = true }
1818
[dev-dependencies]
1919
light-compressed-account = { workspace = true }
2020
prettyplease = "0.2.29"
21+
borsh = { workspace = true }
22+
light-zero-copy = { workspace = true }
23+
zerocopy = { workspace = true }
2124

2225
[lib]
2326
proc-macro = true

0 commit comments

Comments
 (0)