From dabf83fae4c1333b7b611ac47f20efbd03c565eb Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 8 Jun 2024 16:37:58 +0400 Subject: [PATCH 01/23] move secp256k1_recover to its own crate --- Cargo.lock | 11 +++++++++ Cargo.toml | 1 + curves/secp256k1-recover/Cargo.toml | 23 +++++++++++++++++++ .../secp256k1-recover/src/lib.rs | 0 programs/sbf/Cargo.lock | 11 +++++++++ sdk/Cargo.toml | 3 ++- sdk/program/src/lib.rs | 1 - sdk/src/lib.rs | 2 +- 8 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 curves/secp256k1-recover/Cargo.toml rename sdk/program/src/secp256k1_recover.rs => curves/secp256k1-recover/src/lib.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index acc820c0dac1cc..8a42935e454f0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7299,6 +7299,7 @@ dependencies = [ "solana-sanitize", "solana-sdk", "solana-sdk-macro", + "solana-secp256k1-recover", "static_assertions", "thiserror", "tiny-bip39", @@ -7316,6 +7317,16 @@ dependencies = [ "syn 2.0.71", ] +[[package]] +name = "solana-secp256k1-recover" +version = "2.1.0" +dependencies = [ + "borsh 1.5.1", + "libsecp256k1", + "solana-program", + "thiserror", +] + [[package]] name = "solana-security-txt" version = "1.1.1" diff --git a/Cargo.toml b/Cargo.toml index 4de674c8626506..83b14d978974a0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -397,6 +397,7 @@ solana-runtime = { path = "runtime", version = "=2.1.0" } solana-runtime-transaction = { path = "runtime-transaction", version = "=2.1.0" } solana-sdk = { path = "sdk", version = "=2.1.0" } solana-sdk-macro = { path = "sdk/macro", version = "=2.1.0" } +solana-secp256k1-recover = { path = "curves/secp256k1-recover", version = "=2.1.0", default-features = false } solana-send-transaction-service = { path = "send-transaction-service", version = "=2.1.0" } solana-stake-program = { path = "programs/stake", version = "=2.1.0" } solana-storage-bigtable = { path = "storage-bigtable", version = "=2.1.0" } diff --git a/curves/secp256k1-recover/Cargo.toml b/curves/secp256k1-recover/Cargo.toml new file mode 100644 index 00000000000000..11f4218435d8b7 --- /dev/null +++ b/curves/secp256k1-recover/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "solana-secp256k1-recover" +description = "Solana SECP256K1 Recover" +documentation = "https://docs.rs/solana-secp256k1-recover" +version = { workspace = true } +authors = { workspace = true } +repository = { workspace = true } +homepage = { workspace = true } +license = { workspace = true } +edition = { workspace = true } + +[dependencies] +borsh = { workspace = true, optional = true } +thiserror = { workspace = true } + +[target.'cfg(target_os = "solana")'.dependencies] +solana-program = { workspace = true } + +[target.'cfg(not(target_os = "solana"))'.dependencies] +libsecp256k1 = { workspace = true } + +[features] +borsh = ["dep:borsh"] diff --git a/sdk/program/src/secp256k1_recover.rs b/curves/secp256k1-recover/src/lib.rs similarity index 100% rename from sdk/program/src/secp256k1_recover.rs rename to curves/secp256k1-recover/src/lib.rs diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 756b752be4edac..e083b84e6f5b68 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -6150,6 +6150,7 @@ dependencies = [ "solana-program", "solana-sanitize", "solana-sdk-macro", + "solana-secp256k1-recover", "thiserror", "uriparse", "wasm-bindgen", @@ -6165,6 +6166,16 @@ dependencies = [ "syn 2.0.58", ] +[[package]] +name = "solana-secp256k1-recover" +version = "2.1.0" +dependencies = [ + "borsh 1.5.1", + "libsecp256k1 0.6.0", + "solana-program", + "thiserror", +] + [[package]] name = "solana-security-txt" version = "1.1.1" diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml index 71a8d24733f4e5..f2e6cc6d7cc2d3 100644 --- a/sdk/Cargo.toml +++ b/sdk/Cargo.toml @@ -34,7 +34,7 @@ full = [ "sha3", "digest", ] -borsh = ["dep:borsh", "solana-program/borsh"] +borsh = ["dep:borsh", "solana-program/borsh", "solana-secp256k1-recover/borsh"] dev-context-only-utils = [ "qualifier_attr" ] @@ -84,6 +84,7 @@ solana-frozen-abi-macro = { workspace = true, optional = true } solana-program = { workspace = true } solana-sanitize = { workspace = true } solana-sdk-macro = { workspace = true } +solana-secp256k1-recover = { workspace = true } thiserror = { workspace = true } uriparse = { workspace = true } diff --git a/sdk/program/src/lib.rs b/sdk/program/src/lib.rs index 2862aff1854f74..cc980108f98e9a 100644 --- a/sdk/program/src/lib.rs +++ b/sdk/program/src/lib.rs @@ -519,7 +519,6 @@ pub mod program_utils; pub mod pubkey; pub mod rent; pub mod secp256k1_program; -pub mod secp256k1_recover; pub mod serde_varint; pub mod serialize_utils; pub mod short_vec; diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index 098da40b821efb..a24f315335358f 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -52,7 +52,7 @@ pub use solana_program::{ decode_error, ed25519_program, epoch_rewards, epoch_schedule, fee_calculator, impl_sysvar_get, incinerator, instruction, keccak, lamports, loader_instruction, loader_upgradeable_instruction, loader_v4, loader_v4_instruction, message, msg, native_token, nonce, program, program_error, - program_memory, program_option, program_pack, rent, secp256k1_program, secp256k1_recover, + program_memory, program_option, program_pack, rent, secp256k1_program, serde_varint, serialize_utils, short_vec, slot_hashes, slot_history, stable_layout, stake, stake_history, syscalls, system_instruction, system_program, sysvar, unchecked_div_by_const, vote, From dc2f19dfd7f0c6ae4c65b22f459ebc76f902d30b Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 8 Jun 2024 16:41:10 +0400 Subject: [PATCH 02/23] move syscall definition --- curves/secp256k1-recover/src/lib.rs | 12 +++++++++++- sdk/program/src/syscalls/definitions.rs | 1 - 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/curves/secp256k1-recover/src/lib.rs b/curves/secp256k1-recover/src/lib.rs index fca67cf6b33ae8..525b1e0492e6f9 100644 --- a/curves/secp256k1-recover/src/lib.rs +++ b/curves/secp256k1-recover/src/lib.rs @@ -85,6 +85,16 @@ impl Secp256k1Pubkey { } } +#[cfg(target_os = "solana")] +extern "C" { + pub fn sol_secp256k1_recover( + hash: *const u8, + recovery_id: u64, + signature: *const u8, + result: *mut u8, + ) -> u64; +} + /// Recover the public key from a [secp256k1] ECDSA signature and /// cryptographically-hashed message. /// @@ -399,7 +409,7 @@ pub fn secp256k1_recover( { let mut pubkey_buffer = [0u8; SECP256K1_PUBLIC_KEY_LENGTH]; let result = unsafe { - crate::syscalls::sol_secp256k1_recover( + sol_secp256k1_recover( hash.as_ptr(), recovery_id as u64, signature.as_ptr(), diff --git a/sdk/program/src/syscalls/definitions.rs b/sdk/program/src/syscalls/definitions.rs index 5988cbb76d4073..f16d3277eb3191 100644 --- a/sdk/program/src/syscalls/definitions.rs +++ b/sdk/program/src/syscalls/definitions.rs @@ -16,7 +16,6 @@ define_syscall!(fn sol_create_program_address(seeds_addr: *const u8, seeds_len: define_syscall!(fn sol_try_find_program_address(seeds_addr: *const u8, seeds_len: u64, program_id_addr: *const u8, address_bytes_addr: *const u8, bump_seed_addr: *const u8) -> u64); define_syscall!(fn sol_sha256(vals: *const u8, val_len: u64, hash_result: *mut u8) -> u64); define_syscall!(fn sol_keccak256(vals: *const u8, val_len: u64, hash_result: *mut u8) -> u64); -define_syscall!(fn sol_secp256k1_recover(hash: *const u8, recovery_id: u64, signature: *const u8, result: *mut u8) -> u64); define_syscall!(fn sol_blake3(vals: *const u8, val_len: u64, hash_result: *mut u8) -> u64); define_syscall!(fn sol_memcpy_(dst: *mut u8, src: *const u8, n: u64)); define_syscall!(fn sol_memmove_(dst: *mut u8, src: *const u8, n: u64)); From 3a3ada47cc31ee768c9af7268138f6afc11ad5f2 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 8 Jun 2024 16:41:47 +0400 Subject: [PATCH 03/23] remove libsecp256k1 dep from solana-program --- Cargo.lock | 1 - sdk/program/Cargo.toml | 1 - 2 files changed, 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8a42935e454f0f..13ad22fb2259f4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6806,7 +6806,6 @@ dependencies = [ "itertools 0.12.1", "js-sys", "lazy_static", - "libsecp256k1", "log", "memoffset 0.9.1", "num-bigint 0.4.6", diff --git a/sdk/program/Cargo.toml b/sdk/program/Cargo.toml index 430e7d7badfc05..a1cb83a209a275 100644 --- a/sdk/program/Cargo.toml +++ b/sdk/program/Cargo.toml @@ -56,7 +56,6 @@ ark-serialize = { workspace = true } base64 = { workspace = true, features = ["alloc", "std"] } bitflags = { workspace = true } curve25519-dalek = { workspace = true } -libsecp256k1 = { workspace = true } num-bigint = { workspace = true } rand = { workspace = true } From 7c3da764ea15d77bb13aa2a26124d74e78fb5876 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 8 Jun 2024 16:42:28 +0400 Subject: [PATCH 04/23] update sbf lock file --- Cargo.lock | 1 + programs/sbf/Cargo.lock | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 13ad22fb2259f4..8a42935e454f0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6806,6 +6806,7 @@ dependencies = [ "itertools 0.12.1", "js-sys", "lazy_static", + "libsecp256k1", "log", "memoffset 0.9.1", "num-bigint 0.4.6", diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index e083b84e6f5b68..dded34595bf76b 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -5294,7 +5294,6 @@ dependencies = [ "getrandom 0.2.10", "js-sys", "lazy_static", - "libsecp256k1 0.6.0", "log", "memoffset 0.9.0", "num-bigint 0.4.6", From 0d0bd0d605392ec4ded4271c835142e75fc4a8e3 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 8 Jun 2024 16:55:08 +0400 Subject: [PATCH 05/23] update doc links --- curves/secp256k1-recover/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/curves/secp256k1-recover/src/lib.rs b/curves/secp256k1-recover/src/lib.rs index 525b1e0492e6f9..077b5892874055 100644 --- a/curves/secp256k1-recover/src/lib.rs +++ b/curves/secp256k1-recover/src/lib.rs @@ -21,7 +21,7 @@ //! also provides the [secp256k1 program][sp], which is more flexible, has lower CPU //! cost, and can validate many signatures at once. //! -//! [sp]: crate::secp256k1_program +//! [sp]: https://docs.rs/solana-program/latest/solana_program/secp256k1_program/ //! [`ecrecover`]: https://docs.soliditylang.org/en/v0.8.14/units-and-global-variables.html?highlight=ecrecover#mathematical-and-cryptographic-functions #[cfg(feature = "borsh")] @@ -120,7 +120,7 @@ extern "C" { /// "overflowing" signature, and this function returns an error when parsing /// overflowing signatures. /// -/// [`keccak`]: crate::keccak +/// [`keccak`]: https://docs.rs/solana-program/latest/solana_program/keccak/ /// [`wrapping_sub`]: https://doc.rust-lang.org/std/primitive.u8.html#method.wrapping_sub /// /// On success this function returns a [`Secp256k1Pubkey`], a wrapper around a @@ -133,7 +133,7 @@ extern "C" { /// the [secp256k1 program][sp], which is more flexible, has lower CPU cost, and /// can validate many signatures at once. /// -/// [sp]: crate::secp256k1_program +/// [sp]: https://docs.rs/solana-program/latest/solana_program/secp256k1_program/ /// /// The `secp256k1_recover` syscall is implemented with the [`libsecp256k1`] /// crate, which clients may also want to use. From e60f3e7c70c1ee7456a3333cf62230a252e97173 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 8 Jun 2024 16:59:43 +0400 Subject: [PATCH 06/23] fix doc tests and dev deps --- Cargo.lock | 2 ++ curves/secp256k1-recover/Cargo.toml | 12 +++++++++--- curves/secp256k1-recover/src/lib.rs | 2 +- programs/sbf/Cargo.lock | 1 - 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8a42935e454f0f..4baac81be6f065 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7321,9 +7321,11 @@ dependencies = [ name = "solana-secp256k1-recover" version = "2.1.0" dependencies = [ + "anyhow", "borsh 1.5.1", "libsecp256k1", "solana-program", + "solana-secp256k1-recover", "thiserror", ] diff --git a/curves/secp256k1-recover/Cargo.toml b/curves/secp256k1-recover/Cargo.toml index 11f4218435d8b7..389ab204ed0f85 100644 --- a/curves/secp256k1-recover/Cargo.toml +++ b/curves/secp256k1-recover/Cargo.toml @@ -13,11 +13,17 @@ edition = { workspace = true } borsh = { workspace = true, optional = true } thiserror = { workspace = true } -[target.'cfg(target_os = "solana")'.dependencies] -solana-program = { workspace = true } - [target.'cfg(not(target_os = "solana"))'.dependencies] libsecp256k1 = { workspace = true } +[dev-dependencies] +anyhow = { workspace = true } +solana-program = { workspace = true } +solana-secp256k1-recover = { path = ".", features = ["borsh"] } + +[target.'cfg(not(target_os = "solana"))'.dev-dependencies] +libsecp256k1 = { workspace = true, features = ["hmac"] } + + [features] borsh = ["dep:borsh"] diff --git a/curves/secp256k1-recover/src/lib.rs b/curves/secp256k1-recover/src/lib.rs index 077b5892874055..4a9bbf0e3c9fce 100644 --- a/curves/secp256k1-recover/src/lib.rs +++ b/curves/secp256k1-recover/src/lib.rs @@ -272,8 +272,8 @@ extern "C" { /// entrypoint::ProgramResult, /// keccak, msg, /// program_error::ProgramError, -/// secp256k1_recover::secp256k1_recover, /// }; +/// use solana_secp256k1_recover::secp256k1_recover; /// /// /// The key we expect to sign secp256k1 messages, /// /// as serialized by `libsecp256k1::PublicKey::serialize`. diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index dded34595bf76b..9df59fb260c272 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -6171,7 +6171,6 @@ version = "2.1.0" dependencies = [ "borsh 1.5.1", "libsecp256k1 0.6.0", - "solana-program", "thiserror", ] From 61f58a7c925fc275ce8d6fa88f25398609bce8f3 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 8 Jun 2024 17:32:55 +0400 Subject: [PATCH 07/23] update deps in programs/sbf --- programs/sbf/Cargo.lock | 1 + programs/sbf/Cargo.toml | 1 + programs/sbf/rust/secp256k1_recover/Cargo.toml | 1 + programs/sbf/rust/secp256k1_recover/src/lib.rs | 3 ++- 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 9df59fb260c272..b226ffc9895dce 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -6040,6 +6040,7 @@ version = "2.1.0" dependencies = [ "libsecp256k1 0.7.0", "solana-program", + "solana-secp256k1-recover", ] [[package]] diff --git a/programs/sbf/Cargo.toml b/programs/sbf/Cargo.toml index 0c8da26f7574ae..390b863872a2ef 100644 --- a/programs/sbf/Cargo.toml +++ b/programs/sbf/Cargo.toml @@ -48,6 +48,7 @@ solana-sbf-rust-param-passing-dep = { path = "rust/param_passing_dep", version = solana-sbf-rust-realloc-dep = { path = "rust/realloc_dep", version = "=2.1.0" } solana-sbf-rust-realloc-invoke-dep = { path = "rust/realloc_invoke_dep", version = "=2.1.0" } solana-sdk = { path = "../../sdk", version = "=2.1.0" } +solana-secp256k1-recover = { path = "../../curves/secp256k1-recover", version = "=2.1.0" } solana-svm = { path = "../../svm", version = "=2.1.0" } solana-timings = { path = "../../timings", version = "=2.1.0" } solana-transaction-status = { path = "../../transaction-status", version = "=2.1.0" } diff --git a/programs/sbf/rust/secp256k1_recover/Cargo.toml b/programs/sbf/rust/secp256k1_recover/Cargo.toml index 8a7e473e5b6a65..199558865c1d24 100644 --- a/programs/sbf/rust/secp256k1_recover/Cargo.toml +++ b/programs/sbf/rust/secp256k1_recover/Cargo.toml @@ -11,6 +11,7 @@ edition = { workspace = true } [dependencies] libsecp256k1 = { workspace = true } solana-program = { workspace = true } +solana-secp256k1-recover = { workspace = true } [lib] crate-type = ["cdylib"] diff --git a/programs/sbf/rust/secp256k1_recover/src/lib.rs b/programs/sbf/rust/secp256k1_recover/src/lib.rs index c954dda4144f05..7368397976a91d 100644 --- a/programs/sbf/rust/secp256k1_recover/src/lib.rs +++ b/programs/sbf/rust/secp256k1_recover/src/lib.rs @@ -3,8 +3,9 @@ extern crate solana_program; use solana_program::{ - custom_heap_default, custom_panic_default, msg, secp256k1_recover::secp256k1_recover, + custom_heap_default, custom_panic_default, msg }; +use solana_secp256k1_recover::secp256k1_recover; fn test_secp256k1_recover() { let expected: [u8; 64] = [ From efa3ad57a40173c823d2f64b3d3951321e738945 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 8 Jun 2024 17:33:31 +0400 Subject: [PATCH 08/23] fmt --- programs/sbf/rust/secp256k1_recover/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/programs/sbf/rust/secp256k1_recover/src/lib.rs b/programs/sbf/rust/secp256k1_recover/src/lib.rs index 7368397976a91d..09b239e090a147 100644 --- a/programs/sbf/rust/secp256k1_recover/src/lib.rs +++ b/programs/sbf/rust/secp256k1_recover/src/lib.rs @@ -2,10 +2,10 @@ //! Secp256k1Recover Syscall test extern crate solana_program; -use solana_program::{ - custom_heap_default, custom_panic_default, msg +use { + solana_program::{custom_heap_default, custom_panic_default, msg}, + solana_secp256k1_recover::secp256k1_recover, }; -use solana_secp256k1_recover::secp256k1_recover; fn test_secp256k1_recover() { let expected: [u8; 64] = [ From 5f617eec33f35d5faa14638b0fb23b29d9fce81f Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 8 Jun 2024 17:57:22 +0400 Subject: [PATCH 09/23] add frozen-abi support --- Cargo.lock | 1 + curves/secp256k1-recover/Cargo.toml | 4 ++++ curves/secp256k1-recover/build.rs | 1 + curves/secp256k1-recover/src/lib.rs | 1 + 4 files changed, 7 insertions(+) create mode 120000 curves/secp256k1-recover/build.rs diff --git a/Cargo.lock b/Cargo.lock index 4baac81be6f065..5f894d14d21adc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7324,6 +7324,7 @@ dependencies = [ "anyhow", "borsh 1.5.1", "libsecp256k1", + "solana-frozen-abi", "solana-program", "solana-secp256k1-recover", "thiserror", diff --git a/curves/secp256k1-recover/Cargo.toml b/curves/secp256k1-recover/Cargo.toml index 389ab204ed0f85..586603acff2656 100644 --- a/curves/secp256k1-recover/Cargo.toml +++ b/curves/secp256k1-recover/Cargo.toml @@ -11,6 +11,7 @@ edition = { workspace = true } [dependencies] borsh = { workspace = true, optional = true } +solana-frozen-abi = { workspace = true, optional = true } thiserror = { workspace = true } [target.'cfg(not(target_os = "solana"))'.dependencies] @@ -24,6 +25,9 @@ solana-secp256k1-recover = { path = ".", features = ["borsh"] } [target.'cfg(not(target_os = "solana"))'.dev-dependencies] libsecp256k1 = { workspace = true, features = ["hmac"] } +[build-dependencies] +rustc_version = { workspace = true } [features] borsh = ["dep:borsh"] +frozen-abi = ["dep:solana-frozen-abi"] diff --git a/curves/secp256k1-recover/build.rs b/curves/secp256k1-recover/build.rs new file mode 120000 index 00000000000000..84539eddaa6ded --- /dev/null +++ b/curves/secp256k1-recover/build.rs @@ -0,0 +1 @@ +../../frozen-abi/build.rs \ No newline at end of file diff --git a/curves/secp256k1-recover/src/lib.rs b/curves/secp256k1-recover/src/lib.rs index 4a9bbf0e3c9fce..edecc8b628ec03 100644 --- a/curves/secp256k1-recover/src/lib.rs +++ b/curves/secp256k1-recover/src/lib.rs @@ -1,3 +1,4 @@ +#![cfg_attr(RUSTC_WITH_SPECIALIZATION, feature(min_specialization))] //! Public key recovery from [secp256k1] ECDSA signatures. //! //! [secp256k1]: https://en.bitcoin.it/wiki/Secp256k1 From 504a38bbb467273078b579c238cecfe37e3b6a65 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 8 Jun 2024 17:59:04 +0400 Subject: [PATCH 10/23] update lock files --- Cargo.lock | 1 + programs/sbf/Cargo.lock | 1 + 2 files changed, 2 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 5f894d14d21adc..94bdd5ac44cdc2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7324,6 +7324,7 @@ dependencies = [ "anyhow", "borsh 1.5.1", "libsecp256k1", + "rustc_version 0.4.0", "solana-frozen-abi", "solana-program", "solana-secp256k1-recover", diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index b226ffc9895dce..5e74e29bca1d61 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -6172,6 +6172,7 @@ version = "2.1.0" dependencies = [ "borsh 1.5.1", "libsecp256k1 0.6.0", + "rustc_version", "thiserror", ] From 7da57e15decc49139bf7881862e8e3c8c5862ad4 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sun, 9 Jun 2024 03:42:20 +0400 Subject: [PATCH 11/23] use borsh directly in solana-secp256k1-recover dev deps --- Cargo.lock | 1 - curves/secp256k1-recover/Cargo.toml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 94bdd5ac44cdc2..f64826bb494d12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7327,7 +7327,6 @@ dependencies = [ "rustc_version 0.4.0", "solana-frozen-abi", "solana-program", - "solana-secp256k1-recover", "thiserror", ] diff --git a/curves/secp256k1-recover/Cargo.toml b/curves/secp256k1-recover/Cargo.toml index 586603acff2656..e4706a655db0cc 100644 --- a/curves/secp256k1-recover/Cargo.toml +++ b/curves/secp256k1-recover/Cargo.toml @@ -19,8 +19,8 @@ libsecp256k1 = { workspace = true } [dev-dependencies] anyhow = { workspace = true } +borsh = { workspace = true } solana-program = { workspace = true } -solana-secp256k1-recover = { path = ".", features = ["borsh"] } [target.'cfg(not(target_os = "solana"))'.dev-dependencies] libsecp256k1 = { workspace = true, features = ["hmac"] } From ab2aa51a4841e633bf3bff7e910cee35a8d33755 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Wed, 3 Jul 2024 09:19:08 +0400 Subject: [PATCH 12/23] re-export solana_secp256k1_recover with deprecation --- sdk/src/lib.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index a24f315335358f..184ade8bd39d71 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -155,6 +155,8 @@ pub use solana_sdk_macro::declare_id; pub use solana_sdk_macro::pubkey; /// Convenience macro to define multiple static public keys. pub use solana_sdk_macro::pubkeys; +#[deprecated(since = "2.1.0", note = "Use `solana-secp256k1-recover` crate instead")] +pub use solana_secp256k1_recover as secp256k1_recover; /// Convenience macro for `AddAssign` with saturating arithmetic. /// Replace by `std::num::Saturating` once stable From e68eed74a858345c20fd54326083e950555c41d6 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Wed, 3 Jul 2024 09:22:33 +0400 Subject: [PATCH 13/23] re-export in solana-program too --- Cargo.lock | 1 + programs/sbf/Cargo.lock | 1 + sdk/program/Cargo.toml | 1 + sdk/program/src/lib.rs | 2 ++ sdk/src/lib.rs | 7 +++---- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f64826bb494d12..963bd4b9434bc2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6830,6 +6830,7 @@ dependencies = [ "solana-logger", "solana-sanitize", "solana-sdk-macro", + "solana-secp256k1-recover", "static_assertions", "thiserror", "wasm-bindgen", diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 5e74e29bca1d61..7ef1c3b69568d1 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -5311,6 +5311,7 @@ dependencies = [ "solana-define-syscall", "solana-sanitize", "solana-sdk-macro", + "solana-secp256k1-recover", "thiserror", "wasm-bindgen", ] diff --git a/sdk/program/Cargo.toml b/sdk/program/Cargo.toml index a1cb83a209a275..2d2625322f5667 100644 --- a/sdk/program/Cargo.toml +++ b/sdk/program/Cargo.toml @@ -36,6 +36,7 @@ solana-frozen-abi = { workspace = true, optional = true } solana-frozen-abi-macro = { workspace = true, optional = true } solana-sanitize = { workspace = true } solana-sdk-macro = { workspace = true } +solana-secp256k1-recover = { workspace = true } thiserror = { workspace = true } # This is currently needed to build on-chain programs reliably. diff --git a/sdk/program/src/lib.rs b/sdk/program/src/lib.rs index cc980108f98e9a..a23b9dcf3696c7 100644 --- a/sdk/program/src/lib.rs +++ b/sdk/program/src/lib.rs @@ -536,6 +536,8 @@ pub mod wasm; #[deprecated(since = "2.1.0", note = "Use `solana-sanitize` crate instead")] pub use solana_sanitize as sanitize; +#[deprecated(since = "2.1.0", note = "Use `solana-secp256k1-recover` crate instead")] +pub use solana_secp256k1_recover as secp256k1_recover; #[cfg(target_arch = "wasm32")] pub use wasm_bindgen::prelude::wasm_bindgen; diff --git a/sdk/src/lib.rs b/sdk/src/lib.rs index 184ade8bd39d71..c6fbd2e301e6fb 100644 --- a/sdk/src/lib.rs +++ b/sdk/src/lib.rs @@ -52,10 +52,9 @@ pub use solana_program::{ decode_error, ed25519_program, epoch_rewards, epoch_schedule, fee_calculator, impl_sysvar_get, incinerator, instruction, keccak, lamports, loader_instruction, loader_upgradeable_instruction, loader_v4, loader_v4_instruction, message, msg, native_token, nonce, program, program_error, - program_memory, program_option, program_pack, rent, secp256k1_program, - serde_varint, serialize_utils, short_vec, slot_hashes, slot_history, stable_layout, stake, - stake_history, syscalls, system_instruction, system_program, sysvar, unchecked_div_by_const, - vote, + program_memory, program_option, program_pack, rent, secp256k1_program, serde_varint, + serialize_utils, short_vec, slot_hashes, slot_history, stable_layout, stake, stake_history, + syscalls, system_instruction, system_program, sysvar, unchecked_div_by_const, vote, }; #[cfg(feature = "borsh")] pub use solana_program::{borsh, borsh0_10, borsh1}; From d08558416a91c066a1b97f98bfc5737c46d049cf Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Wed, 3 Jul 2024 09:30:48 +0400 Subject: [PATCH 14/23] use define_syscall macro now that it's available as a standalone crate --- Cargo.lock | 1 + curves/secp256k1-recover/Cargo.toml | 1 + curves/secp256k1-recover/src/lib.rs | 9 +-------- programs/sbf/Cargo.lock | 1 + 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 963bd4b9434bc2..97784831386e56 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7326,6 +7326,7 @@ dependencies = [ "borsh 1.5.1", "libsecp256k1", "rustc_version 0.4.0", + "solana-define-syscall", "solana-frozen-abi", "solana-program", "thiserror", diff --git a/curves/secp256k1-recover/Cargo.toml b/curves/secp256k1-recover/Cargo.toml index e4706a655db0cc..a2124fe5b47e9d 100644 --- a/curves/secp256k1-recover/Cargo.toml +++ b/curves/secp256k1-recover/Cargo.toml @@ -11,6 +11,7 @@ edition = { workspace = true } [dependencies] borsh = { workspace = true, optional = true } +solana-define-syscall = { workspace = true } solana-frozen-abi = { workspace = true, optional = true } thiserror = { workspace = true } diff --git a/curves/secp256k1-recover/src/lib.rs b/curves/secp256k1-recover/src/lib.rs index edecc8b628ec03..7fca3ac5178fe9 100644 --- a/curves/secp256k1-recover/src/lib.rs +++ b/curves/secp256k1-recover/src/lib.rs @@ -87,14 +87,7 @@ impl Secp256k1Pubkey { } #[cfg(target_os = "solana")] -extern "C" { - pub fn sol_secp256k1_recover( - hash: *const u8, - recovery_id: u64, - signature: *const u8, - result: *mut u8, - ) -> u64; -} +define_syscall!(fn sol_secp256k1_recover(hash: *const u8, recovery_id: u64, signature: *const u8, result: *mut u8) -> u64); /// Recover the public key from a [secp256k1] ECDSA signature and /// cryptographically-hashed message. diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 7ef1c3b69568d1..25cd1962b230d8 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -6174,6 +6174,7 @@ dependencies = [ "borsh 1.5.1", "libsecp256k1 0.6.0", "rustc_version", + "solana-define-syscall", "thiserror", ] From e0d89ce195c53ab2f07684655d23ef1add138f46 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Wed, 3 Jul 2024 09:38:23 +0400 Subject: [PATCH 15/23] fix macro import --- curves/secp256k1-recover/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curves/secp256k1-recover/src/lib.rs b/curves/secp256k1-recover/src/lib.rs index 7fca3ac5178fe9..54d66ea6b5b4cc 100644 --- a/curves/secp256k1-recover/src/lib.rs +++ b/curves/secp256k1-recover/src/lib.rs @@ -87,7 +87,7 @@ impl Secp256k1Pubkey { } #[cfg(target_os = "solana")] -define_syscall!(fn sol_secp256k1_recover(hash: *const u8, recovery_id: u64, signature: *const u8, result: *mut u8) -> u64); +solana_define_syscall::define_syscall!(fn sol_secp256k1_recover(hash: *const u8, recovery_id: u64, signature: *const u8, result: *mut u8) -> u64); /// Recover the public key from a [secp256k1] ECDSA signature and /// cryptographically-hashed message. From daa5c02ce4d82478ef31c2b25f0c83068949395b Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Wed, 3 Jul 2024 09:39:32 +0400 Subject: [PATCH 16/23] only require solana-define-syscall when target_os = "solana" --- curves/secp256k1-recover/Cargo.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/curves/secp256k1-recover/Cargo.toml b/curves/secp256k1-recover/Cargo.toml index a2124fe5b47e9d..2639b8f784607b 100644 --- a/curves/secp256k1-recover/Cargo.toml +++ b/curves/secp256k1-recover/Cargo.toml @@ -11,10 +11,12 @@ edition = { workspace = true } [dependencies] borsh = { workspace = true, optional = true } -solana-define-syscall = { workspace = true } solana-frozen-abi = { workspace = true, optional = true } thiserror = { workspace = true } +[target.'cfg(target_os = "solana")'.dependencies] +solana-define-syscall = { workspace = true } + [target.'cfg(not(target_os = "solana"))'.dependencies] libsecp256k1 = { workspace = true } From 90c506055e6632e21de5e59ac0f1d5088a3eddd3 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Wed, 3 Jul 2024 10:19:36 +0400 Subject: [PATCH 17/23] re-export sol_secp256k1_recover with deprecation warning --- sdk/program/src/syscalls/definitions.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdk/program/src/syscalls/definitions.rs b/sdk/program/src/syscalls/definitions.rs index f16d3277eb3191..5fe72b2cee60a7 100644 --- a/sdk/program/src/syscalls/definitions.rs +++ b/sdk/program/src/syscalls/definitions.rs @@ -1,5 +1,7 @@ #[cfg(target_feature = "static-syscalls")] pub use solana_define_syscall::sys_hash; +#[deprecated(since = "2.1.0", note = "Use `solana_secp256k1_recover::sol_secp256k1_recover` instead")] +pub use solana_secp256k1_recover::sol_secp256k1_recover; use { crate::{ instruction::{AccountMeta, ProcessedSiblingInstruction}, From deea70376d5229086774fb9f3bca2b2ce71d9159 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Wed, 3 Jul 2024 12:43:41 +0400 Subject: [PATCH 18/23] add docs.rs metadata --- curves/secp256k1-recover/Cargo.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/curves/secp256k1-recover/Cargo.toml b/curves/secp256k1-recover/Cargo.toml index 2639b8f784607b..9460da976c4d29 100644 --- a/curves/secp256k1-recover/Cargo.toml +++ b/curves/secp256k1-recover/Cargo.toml @@ -34,3 +34,6 @@ rustc_version = { workspace = true } [features] borsh = ["dep:borsh"] frozen-abi = ["dep:solana-frozen-abi"] + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] From bd14864f8e51589b3bbbdcdee050bdc8565708f1 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Wed, 3 Jul 2024 12:47:12 +0400 Subject: [PATCH 19/23] don't compile doc examples to get around false positive in order-crates-for-publishing.py --- Cargo.lock | 1 - curves/secp256k1-recover/Cargo.toml | 1 - curves/secp256k1-recover/src/lib.rs | 6 +++--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 97784831386e56..d4f57349d529b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7328,7 +7328,6 @@ dependencies = [ "rustc_version 0.4.0", "solana-define-syscall", "solana-frozen-abi", - "solana-program", "thiserror", ] diff --git a/curves/secp256k1-recover/Cargo.toml b/curves/secp256k1-recover/Cargo.toml index 9460da976c4d29..668cfada73d11e 100644 --- a/curves/secp256k1-recover/Cargo.toml +++ b/curves/secp256k1-recover/Cargo.toml @@ -23,7 +23,6 @@ libsecp256k1 = { workspace = true } [dev-dependencies] anyhow = { workspace = true } borsh = { workspace = true } -solana-program = { workspace = true } [target.'cfg(not(target_os = "solana"))'.dev-dependencies] libsecp256k1 = { workspace = true, features = ["hmac"] } diff --git a/curves/secp256k1-recover/src/lib.rs b/curves/secp256k1-recover/src/lib.rs index 54d66ea6b5b4cc..c8901c8c0e0894 100644 --- a/curves/secp256k1-recover/src/lib.rs +++ b/curves/secp256k1-recover/src/lib.rs @@ -165,7 +165,7 @@ solana_define_syscall::define_syscall!(fn sol_secp256k1_recover(hash: *const u8, /// signatures with high-order `S` values. The following code will accomplish /// this: /// -/// ```rust +/// ```rust,ignore /// # use solana_program::program_error::ProgramError; /// # let signature_bytes = [ /// # 0x83, 0x55, 0x81, 0xDF, 0xB1, 0x02, 0xA7, 0xD2, @@ -261,7 +261,7 @@ solana_define_syscall::define_syscall!(fn sol_secp256k1_recover(hash: *const u8, /// The Solana program. Note that it uses `libsecp256k1` version 0.7.0 to parse /// the secp256k1 signature to prevent malleability. /// -/// ```no_run +/// ```rust,ignore /// use solana_program::{ /// entrypoint::ProgramResult, /// keccak, msg, @@ -331,7 +331,7 @@ solana_define_syscall::define_syscall!(fn sol_secp256k1_recover(hash: *const u8, /// /// The RPC client program: /// -/// ```no_run +/// ```rust,ignore /// # use solana_program::example_mocks::solana_rpc_client; /// # use solana_program::example_mocks::solana_sdk; /// use anyhow::Result; From 060a69845c0e8e69b6dde13e4f299881e628f85a Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Wed, 3 Jul 2024 13:47:28 +0400 Subject: [PATCH 20/23] fmt --- sdk/program/src/syscalls/definitions.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/program/src/syscalls/definitions.rs b/sdk/program/src/syscalls/definitions.rs index 5fe72b2cee60a7..3f50b9d09866f1 100644 --- a/sdk/program/src/syscalls/definitions.rs +++ b/sdk/program/src/syscalls/definitions.rs @@ -1,6 +1,9 @@ #[cfg(target_feature = "static-syscalls")] pub use solana_define_syscall::sys_hash; -#[deprecated(since = "2.1.0", note = "Use `solana_secp256k1_recover::sol_secp256k1_recover` instead")] +#[deprecated( + since = "2.1.0", + note = "Use `solana_secp256k1_recover::sol_secp256k1_recover` instead" +)] pub use solana_secp256k1_recover::sol_secp256k1_recover; use { crate::{ From b0525c4da15b7415f41ac5c33d4769d59cda88e6 Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 6 Jul 2024 01:37:45 +0400 Subject: [PATCH 21/23] fix AbiExample duplication --- Cargo.lock | 1 - curves/secp256k1-recover/Cargo.toml | 2 -- curves/secp256k1-recover/src/lib.rs | 1 - 3 files changed, 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d4f57349d529b8..24d22c94c0921a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7327,7 +7327,6 @@ dependencies = [ "libsecp256k1", "rustc_version 0.4.0", "solana-define-syscall", - "solana-frozen-abi", "thiserror", ] diff --git a/curves/secp256k1-recover/Cargo.toml b/curves/secp256k1-recover/Cargo.toml index 668cfada73d11e..f23878f83f6804 100644 --- a/curves/secp256k1-recover/Cargo.toml +++ b/curves/secp256k1-recover/Cargo.toml @@ -11,7 +11,6 @@ edition = { workspace = true } [dependencies] borsh = { workspace = true, optional = true } -solana-frozen-abi = { workspace = true, optional = true } thiserror = { workspace = true } [target.'cfg(target_os = "solana")'.dependencies] @@ -32,7 +31,6 @@ rustc_version = { workspace = true } [features] borsh = ["dep:borsh"] -frozen-abi = ["dep:solana-frozen-abi"] [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/curves/secp256k1-recover/src/lib.rs b/curves/secp256k1-recover/src/lib.rs index c8901c8c0e0894..094c6a3e5ec5dd 100644 --- a/curves/secp256k1-recover/src/lib.rs +++ b/curves/secp256k1-recover/src/lib.rs @@ -64,7 +64,6 @@ pub const SECP256K1_SIGNATURE_LENGTH: usize = 64; pub const SECP256K1_PUBLIC_KEY_LENGTH: usize = 64; #[repr(transparent)] -#[cfg_attr(feature = "frozen-abi", derive(AbiExample))] #[cfg_attr( feature = "borsh", derive(BorshSerialize, BorshDeserialize, BorshSchema), From da78ffa5a1bef6c65341da86fb95f6e7bdf9a8cd Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 6 Jul 2024 13:38:27 +0400 Subject: [PATCH 22/23] Revert "fix AbiExample duplication" This reverts commit 86e8671f8def10ff32d1dbcf1d6f80405e1e86f1. --- Cargo.lock | 1 + curves/secp256k1-recover/Cargo.toml | 2 ++ curves/secp256k1-recover/src/lib.rs | 1 + 3 files changed, 4 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 24d22c94c0921a..d4f57349d529b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7327,6 +7327,7 @@ dependencies = [ "libsecp256k1", "rustc_version 0.4.0", "solana-define-syscall", + "solana-frozen-abi", "thiserror", ] diff --git a/curves/secp256k1-recover/Cargo.toml b/curves/secp256k1-recover/Cargo.toml index f23878f83f6804..668cfada73d11e 100644 --- a/curves/secp256k1-recover/Cargo.toml +++ b/curves/secp256k1-recover/Cargo.toml @@ -11,6 +11,7 @@ edition = { workspace = true } [dependencies] borsh = { workspace = true, optional = true } +solana-frozen-abi = { workspace = true, optional = true } thiserror = { workspace = true } [target.'cfg(target_os = "solana")'.dependencies] @@ -31,6 +32,7 @@ rustc_version = { workspace = true } [features] borsh = ["dep:borsh"] +frozen-abi = ["dep:solana-frozen-abi"] [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/curves/secp256k1-recover/src/lib.rs b/curves/secp256k1-recover/src/lib.rs index 094c6a3e5ec5dd..c8901c8c0e0894 100644 --- a/curves/secp256k1-recover/src/lib.rs +++ b/curves/secp256k1-recover/src/lib.rs @@ -64,6 +64,7 @@ pub const SECP256K1_SIGNATURE_LENGTH: usize = 64; pub const SECP256K1_PUBLIC_KEY_LENGTH: usize = 64; #[repr(transparent)] +#[cfg_attr(feature = "frozen-abi", derive(AbiExample))] #[cfg_attr( feature = "borsh", derive(BorshSerialize, BorshDeserialize, BorshSchema), From 3f33a1c01dad968ade0007d446fb76e21b0865af Mon Sep 17 00:00:00 2001 From: kevinheavey Date: Sat, 6 Jul 2024 13:42:32 +0400 Subject: [PATCH 23/23] fix frozen-abi usage --- Cargo.lock | 1 + curves/secp256k1-recover/Cargo.toml | 3 ++- curves/secp256k1-recover/src/lib.rs | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d4f57349d529b8..0f09d092d636fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7328,6 +7328,7 @@ dependencies = [ "rustc_version 0.4.0", "solana-define-syscall", "solana-frozen-abi", + "solana-frozen-abi-macro", "thiserror", ] diff --git a/curves/secp256k1-recover/Cargo.toml b/curves/secp256k1-recover/Cargo.toml index 668cfada73d11e..545fb073e9e6ae 100644 --- a/curves/secp256k1-recover/Cargo.toml +++ b/curves/secp256k1-recover/Cargo.toml @@ -12,6 +12,7 @@ edition = { workspace = true } [dependencies] borsh = { workspace = true, optional = true } solana-frozen-abi = { workspace = true, optional = true } +solana-frozen-abi-macro = { workspace = true, optional = true } thiserror = { workspace = true } [target.'cfg(target_os = "solana")'.dependencies] @@ -32,7 +33,7 @@ rustc_version = { workspace = true } [features] borsh = ["dep:borsh"] -frozen-abi = ["dep:solana-frozen-abi"] +frozen-abi = ["dep:solana-frozen-abi", "dep:solana-frozen-abi-macro"] [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/curves/secp256k1-recover/src/lib.rs b/curves/secp256k1-recover/src/lib.rs index c8901c8c0e0894..837f2b8cf3aed3 100644 --- a/curves/secp256k1-recover/src/lib.rs +++ b/curves/secp256k1-recover/src/lib.rs @@ -64,7 +64,7 @@ pub const SECP256K1_SIGNATURE_LENGTH: usize = 64; pub const SECP256K1_PUBLIC_KEY_LENGTH: usize = 64; #[repr(transparent)] -#[cfg_attr(feature = "frozen-abi", derive(AbiExample))] +#[cfg_attr(feature = "frozen-abi", derive(solana_frozen_abi_macro::AbiExample))] #[cfg_attr( feature = "borsh", derive(BorshSerialize, BorshDeserialize, BorshSchema),