diff --git a/Cargo.lock b/Cargo.lock index 30bace6..8867f39 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1652,44 +1652,43 @@ dependencies = [ [[package]] name = "spl-pod" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1233fdecd7461611d69bb87bc2e95af742df47291975d21232a0be8217da9de" +version = "0.7.2" dependencies = [ + "base64", "borsh", "bytemuck", "bytemuck_derive", "num-derive", "num-traits", "num_enum", + "serde", + "serde_json", + "solana-address 2.2.0", "solana-program-error", "solana-program-option", - "solana-pubkey", - "solana-zk-sdk", + "spl-pod 0.7.2", + "test-case", "thiserror 2.0.18", + "wincode", ] [[package]] name = "spl-pod" version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f3df240f67bea453d4bc5749761e45436d14b9457ed667e0300555d5c271f3" dependencies = [ - "base64", "borsh", "bytemuck", "bytemuck_derive", "num-derive", "num-traits", "num_enum", - "serde", - "serde_json", - "solana-address 2.2.0", "solana-program-error", "solana-program-option", + "solana-pubkey", "solana-zk-sdk", - "spl-pod 0.7.2", - "test-case", "thiserror 2.0.18", - "wincode", ] [[package]] @@ -1762,7 +1761,7 @@ dependencies = [ "solana-pubkey", "solana-sdk-ids", "solana-zk-sdk", - "spl-pod 0.7.1", + "spl-pod 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "spl-token-confidential-transfer-proof-extraction", "spl-token-confidential-transfer-proof-generation", "spl-token-group-interface", @@ -1787,7 +1786,7 @@ dependencies = [ "solana-pubkey", "solana-sdk-ids", "solana-zk-sdk", - "spl-pod 0.7.1", + "spl-pod 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 2.0.18", ] @@ -1816,7 +1815,7 @@ dependencies = [ "solana-program-error", "solana-pubkey", "spl-discriminator 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "spl-pod 0.7.1", + "spl-pod 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 2.0.18", ] @@ -1854,7 +1853,7 @@ dependencies = [ "solana-program-error", "solana-pubkey", "spl-discriminator 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "spl-pod 0.7.1", + "spl-pod 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "spl-type-length-value 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 2.0.18", ] @@ -1890,7 +1889,7 @@ dependencies = [ "solana-msg", "solana-program-error", "spl-discriminator 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "spl-pod 0.7.1", + "spl-pod 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "thiserror 2.0.18", ] diff --git a/pod/Cargo.toml b/pod/Cargo.toml index 8e6ed38..e752798 100644 --- a/pod/Cargo.toml +++ b/pod/Cargo.toml @@ -19,11 +19,10 @@ bytemuck_derive = { version = "1.10.1" } num-derive = "0.4" num_enum = "0.7" num-traits = "0.2" -serde = { version = "1.0.228", optional = true } +serde = { version = "1.0.228", optional = true, features = ["derive"] } solana-address = { version = "2.2.0", features = ["bytemuck"] } solana-program-error = "3.0.0" solana-program-option = "3.0.0" -solana-zk-sdk = "4.0.0" thiserror = "2.0" wincode = { version = "0.4.4", features = ["derive"], optional = true } diff --git a/pod/src/optional_keys.rs b/pod/src/optional_keys.rs index 4b80474..154f0ae 100644 --- a/pod/src/optional_keys.rs +++ b/pod/src/optional_keys.rs @@ -6,7 +6,6 @@ use { solana_address::Address, solana_program_error::ProgramError, solana_program_option::COption, - solana_zk_sdk::encryption::pod::elgamal::PodElGamalPubkey, }; #[cfg(feature = "serde-traits")] use { @@ -128,102 +127,9 @@ impl<'de> Deserialize<'de> for OptionalNonZeroPubkey { } } -/// An `ElGamalPubkey` that encodes `None` as all `0`, meant to be usable as a -/// `Pod` type. -#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)] -#[repr(transparent)] -pub struct OptionalNonZeroElGamalPubkey(PodElGamalPubkey); -impl OptionalNonZeroElGamalPubkey { - /// Checks equality between an `OptionalNonZeroElGamalPubkey` and an - /// `ElGamalPubkey` when interpreted as bytes. - pub fn equals(&self, other: &PodElGamalPubkey) -> bool { - &self.0 == other - } -} -impl TryFrom> for OptionalNonZeroElGamalPubkey { - type Error = ProgramError; - fn try_from(p: Option) -> Result { - match p { - None => Ok(Self(PodElGamalPubkey::default())), - Some(elgamal_pubkey) => { - if elgamal_pubkey == PodElGamalPubkey::default() { - Err(ProgramError::InvalidArgument) - } else { - Ok(Self(elgamal_pubkey)) - } - } - } - } -} -impl From for Option { - fn from(p: OptionalNonZeroElGamalPubkey) -> Self { - if p.0 == PodElGamalPubkey::default() { - None - } else { - Some(p.0) - } - } -} - -#[cfg(feature = "serde-traits")] -impl Serialize for OptionalNonZeroElGamalPubkey { - fn serialize(&self, s: S) -> Result - where - S: Serializer, - { - if self.0 == PodElGamalPubkey::default() { - s.serialize_none() - } else { - s.serialize_some(&self.0.to_string()) - } - } -} - -#[cfg(feature = "serde-traits")] -struct OptionalNonZeroElGamalPubkeyVisitor; - -#[cfg(feature = "serde-traits")] -impl Visitor<'_> for OptionalNonZeroElGamalPubkeyVisitor { - type Value = OptionalNonZeroElGamalPubkey; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("an ElGamal public key as base64 or `null`") - } - - fn visit_str(self, v: &str) -> Result - where - E: Error, - { - let elgamal_pubkey: PodElGamalPubkey = FromStr::from_str(v).map_err(Error::custom)?; - OptionalNonZeroElGamalPubkey::try_from(Some(elgamal_pubkey)).map_err(Error::custom) - } - - fn visit_unit(self) -> Result - where - E: Error, - { - Ok(OptionalNonZeroElGamalPubkey::default()) - } -} - -#[cfg(feature = "serde-traits")] -impl<'de> Deserialize<'de> for OptionalNonZeroElGamalPubkey { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - deserializer.deserialize_any(OptionalNonZeroElGamalPubkeyVisitor) - } -} - #[cfg(test)] mod tests { - use { - super::*, - crate::bytemuck::pod_from_bytes, - base64::{prelude::BASE64_STANDARD, Engine}, - solana_address::ADDRESS_BYTES, - }; + use {super::*, crate::bytemuck::pod_from_bytes, solana_address::ADDRESS_BYTES}; #[test] fn test_pod_non_zero_option() { @@ -281,80 +187,4 @@ mod tests { serde_json::from_str::(&serialized_none).unwrap(); assert_eq!(optional_non_zero_pubkey_none, deserialized_none); } - - const OPTIONAL_NONZERO_ELGAMAL_PUBKEY_LEN: usize = 32; - - // Unfortunately, the `solana-zk-sdk` does not expose a constructor interface - // to construct `PodRistrettoPoint` from bytes. As a work-around, encode the - // bytes as base64 string and then convert the string to a - // `PodElGamalCiphertext`. - // - // The constructor will be added (and this function removed) with - // `solana-zk-sdk` 2.1. - fn elgamal_pubkey_from_bytes(bytes: &[u8]) -> PodElGamalPubkey { - let string = BASE64_STANDARD.encode(bytes); - core::str::FromStr::from_str(&string).unwrap() - } - - #[test] - fn test_pod_non_zero_elgamal_option() { - assert_eq!( - Some(elgamal_pubkey_from_bytes( - &[1; OPTIONAL_NONZERO_ELGAMAL_PUBKEY_LEN] - )), - Option::::from(OptionalNonZeroElGamalPubkey( - elgamal_pubkey_from_bytes(&[1; OPTIONAL_NONZERO_ELGAMAL_PUBKEY_LEN]) - )) - ); - assert_eq!( - None, - Option::::from(OptionalNonZeroElGamalPubkey( - elgamal_pubkey_from_bytes(&[0; OPTIONAL_NONZERO_ELGAMAL_PUBKEY_LEN]) - )) - ); - - assert_eq!( - OptionalNonZeroElGamalPubkey(elgamal_pubkey_from_bytes( - &[1; OPTIONAL_NONZERO_ELGAMAL_PUBKEY_LEN] - )), - *pod_from_bytes::( - &[1; OPTIONAL_NONZERO_ELGAMAL_PUBKEY_LEN] - ) - .unwrap() - ); - assert!(pod_from_bytes::(&[]).is_err()); - } - - #[cfg(feature = "serde-traits")] - #[test] - fn test_pod_non_zero_elgamal_option_serde_some() { - let optional_non_zero_elgamal_pubkey_some = OptionalNonZeroElGamalPubkey( - elgamal_pubkey_from_bytes(&[1; OPTIONAL_NONZERO_ELGAMAL_PUBKEY_LEN]), - ); - let serialized_some = - serde_json::to_string(&optional_non_zero_elgamal_pubkey_some).unwrap(); - assert_eq!( - &serialized_some, - "\"AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE=\"" - ); - - let deserialized_some = - serde_json::from_str::(&serialized_some).unwrap(); - assert_eq!(optional_non_zero_elgamal_pubkey_some, deserialized_some); - } - - #[cfg(feature = "serde-traits")] - #[test] - fn test_pod_non_zero_elgamal_option_serde_none() { - let optional_non_zero_elgamal_pubkey_none = OptionalNonZeroElGamalPubkey( - elgamal_pubkey_from_bytes(&[0; OPTIONAL_NONZERO_ELGAMAL_PUBKEY_LEN]), - ); - let serialized_none = - serde_json::to_string(&optional_non_zero_elgamal_pubkey_none).unwrap(); - assert_eq!(&serialized_none, "null"); - - let deserialized_none = - serde_json::from_str::(&serialized_none).unwrap(); - assert_eq!(optional_non_zero_elgamal_pubkey_none, deserialized_none); - } } diff --git a/tlv-account-resolution/Cargo.toml b/tlv-account-resolution/Cargo.toml index aa1e2f5..9dd256f 100644 --- a/tlv-account-resolution/Cargo.toml +++ b/tlv-account-resolution/Cargo.toml @@ -15,7 +15,7 @@ bytemuck = { version = "1.23.2", features = ["derive"] } num-derive = "0.4" num_enum = "0.7" num-traits = "0.2" -serde = { version = "1.0.228", optional = true } +serde = { version = "1.0.228", optional = true, features = ["derive"] } solana-account-info = "3.0.0" solana-instruction = { version = "3.0.0", features = ["std"] } solana-program-error = "3.0.0"