Skip to content

Commit 94ed4e0

Browse files
lang: Fix cpi feature instructions not accounting for discriminator overrides (solana-foundation#3376)
1 parent 8ec7ec8 commit 94ed4e0

File tree

4 files changed

+19
-19
lines changed

4 files changed

+19
-19
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ The minor version will be incremented upon a breaking change and the patch versi
9696
- cli: Fix `shell` command failing due to outdated program initialization ([#3351](https://github.com/coral-xyz/anchor/pull/3351)).
9797
- idl: Fix detecting false-positives from doc comments during module path conversion ([#3359](https://github.com/coral-xyz/anchor/pull/3359)).
9898
- cli: Remove passing the rent sysvar account to IDL instructions ([#3372](https://github.com/coral-xyz/anchor/pull/3372)).
99+
- lang: Fix `cpi` feature instructions not accounting for discriminator overrides ([#3376](https://github.com/coral-xyz/anchor/pull/3376)).
99100

100101
### Breaking
101102

lang/syn/src/codegen/program/common.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,9 @@ pub fn gen_discriminator(namespace: &str, name: impl ToString) -> proc_macro2::T
2323
format!("&{:?}", discriminator).parse().unwrap()
2424
}
2525

26-
pub fn generate_ix_variant(name: String, args: &[IxArg]) -> proc_macro2::TokenStream {
26+
pub fn generate_ix_variant(name: &str, args: &[IxArg]) -> proc_macro2::TokenStream {
2727
let ix_arg_names: Vec<&syn::Ident> = args.iter().map(|arg| &arg.name).collect();
28-
let ix_name_camel: proc_macro2::TokenStream = {
29-
let n = name.to_camel_case();
30-
n.parse().unwrap()
31-
};
28+
let ix_name_camel = generate_ix_variant_name(name);
3229

3330
if args.is_empty() {
3431
quote! {
@@ -42,3 +39,8 @@ pub fn generate_ix_variant(name: String, args: &[IxArg]) -> proc_macro2::TokenSt
4239
}
4340
}
4441
}
42+
43+
pub fn generate_ix_variant_name(name: &str) -> proc_macro2::TokenStream {
44+
let n = name.to_camel_case();
45+
n.parse().unwrap()
46+
}

lang/syn/src/codegen/program/cpi.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
use crate::codegen::program::common::{
2-
gen_discriminator, generate_ix_variant, SIGHASH_GLOBAL_NAMESPACE,
3-
};
1+
use crate::codegen::program::common::{generate_ix_variant, generate_ix_variant_name};
42
use crate::Program;
53
use heck::SnakeCase;
64
use quote::{quote, ToTokens};
@@ -14,10 +12,14 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
1412
let accounts_ident: proc_macro2::TokenStream = format!("crate::cpi::accounts::{}", &ix.anchor_ident.to_string()).parse().unwrap();
1513
let cpi_method = {
1614
let name = &ix.raw_method.sig.ident;
17-
let ix_variant = generate_ix_variant(name.to_string(), &ix.args);
15+
let name_str = name.to_string();
16+
let ix_variant = generate_ix_variant(&name_str, &ix.args);
1817
let method_name = &ix.ident;
1918
let args: Vec<&syn::PatType> = ix.args.iter().map(|arg| &arg.raw_arg).collect();
20-
let discriminator = gen_discriminator(SIGHASH_GLOBAL_NAMESPACE, name);
19+
let discriminator = {
20+
let name = generate_ix_variant_name(&name_str);
21+
quote! { <instruction::#name as anchor_lang::Discriminator>::DISCRIMINATOR }
22+
};
2123
let ret_type = &ix.returns.ty.to_token_stream();
2224
let ix_cfgs = &ix.cfgs;
2325
let (method_ret, maybe_return) = match ret_type.to_string().as_str() {

lang/syn/src/codegen/program/handlers.rs

+4-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use crate::codegen::program::common::*;
22
use crate::program_codegen::idl::idl_accounts_and_functions;
33
use crate::Program;
4-
use heck::CamelCase;
54
use quote::{quote, ToTokens};
65

76
// Generate non-inlined wrappers for each instruction handler, since Solana's
@@ -98,11 +97,12 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
9897
.iter()
9998
.map(|ix| {
10099
let ix_arg_names: Vec<&syn::Ident> = ix.args.iter().map(|arg| &arg.name).collect();
101-
let ix_name = generate_ix_variant_name(ix.raw_method.sig.ident.to_string());
102100
let ix_method_name = &ix.raw_method.sig.ident;
103-
let anchor = &ix.anchor_ident;
104-
let variant_arm = generate_ix_variant(ix.raw_method.sig.ident.to_string(), &ix.args);
101+
let ix_method_name_str = ix_method_name.to_string();
102+
let ix_name = generate_ix_variant_name(&ix_method_name_str);
103+
let variant_arm = generate_ix_variant(&ix_method_name_str, &ix.args);
105104
let ix_name_log = format!("Instruction: {ix_name}");
105+
let anchor = &ix.anchor_ident;
106106
let ret_type = &ix.returns.ty.to_token_stream();
107107
let cfgs = &ix.cfgs;
108108
let maybe_set_return_data = match ret_type.to_string().as_str() {
@@ -191,11 +191,6 @@ pub fn generate(program: &Program) -> proc_macro2::TokenStream {
191191
}
192192
}
193193

194-
fn generate_ix_variant_name(name: String) -> proc_macro2::TokenStream {
195-
let n = name.to_camel_case();
196-
n.parse().unwrap()
197-
}
198-
199194
/// Generate the event module based on whether the `event-cpi` feature is enabled.
200195
fn generate_event_cpi_mod() -> proc_macro2::TokenStream {
201196
#[cfg(feature = "event-cpi")]

0 commit comments

Comments
 (0)