Skip to content

Commit ec6e5e4

Browse files
authored
Merge pull request #62 from quicknode/claude/token-ext-metadata
fix(token-extensions/metadata): build on Anchor 1.0; re-enable in CI
2 parents 032f321 + 92d24b6 commit ec6e5e4

9 files changed

Lines changed: 44 additions & 31 deletions

File tree

.github/.ghaignore

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,2 @@
1-
# build failed - program outdated
2-
tokens/token-extensions/metadata/anchor
3-
41
# dependency issues
52
tokens/token-extensions/nft-meta-data-pointer/anchor-example/anchor

tokens/token-extensions/metadata/anchor/programs/metadata/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ custom-panic = []
2222
[dependencies]
2323
anchor-lang = "1.0.0"
2424
anchor-spl = "1.0.0"
25-
spl-token-metadata-interface = "0.3.3"
26-
spl-type-length-value = "0.4.3"
25+
spl-token-metadata-interface = "0.8.0"
26+
spl-type-length-value = "0.9.1"
2727

2828
[dev-dependencies]
2929
litesvm = "0.11.0"

tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/emit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub struct Emit<'info> {
1111

1212
// Invoke the emit instruction from spl_token_metadata_interface directly
1313
// There is not an anchor CpiContext for this instruction
14-
pub fn handle_process_emit(context: Context<Emit>) -> Result<()> {
14+
pub fn process_emit(context: Context<Emit>) -> Result<()> {
1515
invoke(
1616
&emit(
1717
&context.accounts.token_program.key(), // token program id

tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/initialize.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
use anchor_lang::prelude::*;
2-
use anchor_lang::solana_program::rent::{
3-
DEFAULT_EXEMPTION_THRESHOLD, DEFAULT_LAMPORTS_PER_BYTE_YEAR,
4-
};
52
use anchor_lang::system_program::{transfer, Transfer};
63
use anchor_spl::token_interface::{
74
token_metadata_initialize, Mint, Token2022, TokenMetadataInitialize,
@@ -27,7 +24,7 @@ pub struct Initialize<'info> {
2724
pub system_program: Program<'info, System>,
2825
}
2926

30-
pub fn handle_process_initialize(context: Context<Initialize>, args: TokenMetadataArgs) -> Result<()> {
27+
pub fn process_initialize(context: Context<Initialize>, args: TokenMetadataArgs) -> Result<()> {
3128
let TokenMetadataArgs { name, symbol, uri } = args;
3229

3330
// Define token metadata
@@ -42,8 +39,7 @@ pub fn handle_process_initialize(context: Context<Initialize>, args: TokenMetada
4239
let data_len = 4 + token_metadata.get_packed_len()?;
4340

4441
// Calculate lamports required for the additional metadata
45-
let lamports =
46-
data_len as u64 * DEFAULT_LAMPORTS_PER_BYTE_YEAR * DEFAULT_EXEMPTION_THRESHOLD as u64;
42+
let lamports = Rent::get()?.minimum_balance(data_len);
4743

4844
// Transfer additional lamports to mint account
4945
transfer(
@@ -62,7 +58,7 @@ pub fn handle_process_initialize(context: Context<Initialize>, args: TokenMetada
6258
CpiContext::new(
6359
context.accounts.token_program.key(),
6460
TokenMetadataInitialize {
65-
token_program_id: context.accounts.token_program.to_account_info(),
61+
program_id: context.accounts.token_program.to_account_info(),
6662
mint: context.accounts.mint_account.to_account_info(),
6763
metadata: context.accounts.mint_account.to_account_info(),
6864
mint_authority: context.accounts.payer.to_account_info(),

tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/remove_key.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ pub struct RemoveKey<'info> {
1919

2020
// Invoke the remove_key instruction from spl_token_metadata_interface directly
2121
// There is not an anchor CpiContext for this instruction
22-
pub fn handle_process_remove_key(context: Context<RemoveKey>, key: String) -> Result<()> {
22+
pub fn process_remove_key(context: Context<RemoveKey>, key: String) -> Result<()> {
2323
invoke(
2424
&remove_key(
2525
&context.accounts.token_program.key(), // token program id
2626
&context.accounts.mint_account.key(), // "metadata" account
2727
&context.accounts.update_authority.key(), // update authority
28-
key, // key to remove
28+
key, // key to remove
2929
true, // idempotent flag, if true transaction will not fail if key does not exist
3030
),
3131
&[

tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_authority.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub struct UpdateAuthority<'info> {
1818
pub system_program: Program<'info, System>,
1919
}
2020

21-
pub fn handle_process_update_authority(context: Context<UpdateAuthority>) -> Result<()> {
21+
pub fn process_update_authority(context: Context<UpdateAuthority>) -> Result<()> {
2222
let new_authority_key = match &context.accounts.new_authority {
2323
Some(account) => OptionalNonZeroPubkey::try_from(Some(account.key()))?,
2424
None => OptionalNonZeroPubkey::try_from(None)?,
@@ -29,7 +29,7 @@ pub fn handle_process_update_authority(context: Context<UpdateAuthority>) -> Res
2929
CpiContext::new(
3030
context.accounts.token_program.key(),
3131
TokenMetadataUpdateAuthority {
32-
token_program_id: context.accounts.token_program.to_account_info(),
32+
program_id: context.accounts.token_program.to_account_info(),
3333
metadata: context.accounts.mint_account.to_account_info(),
3434
current_authority: context.accounts.current_authority.to_account_info(),
3535

tokens/token-extensions/metadata/anchor/programs/metadata/src/instructions/update_field.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ pub struct UpdateField<'info> {
2323
pub system_program: Program<'info, System>,
2424
}
2525

26-
pub fn handle_process_update_field(context: Context<UpdateField>, args: UpdateFieldArgs) -> Result<()> {
26+
pub fn process_update_field(context: Context<UpdateField>, args: UpdateFieldArgs) -> Result<()> {
2727
let UpdateFieldArgs { field, value } = args;
2828

2929
// Convert to Field type from spl_token_metadata_interface
@@ -80,7 +80,7 @@ pub fn handle_process_update_field(context: Context<UpdateField>, args: UpdateFi
8080
CpiContext::new(
8181
context.accounts.token_program.key(),
8282
TokenMetadataUpdateField {
83-
token_program_id: context.accounts.token_program.to_account_info(),
83+
program_id: context.accounts.token_program.to_account_info(),
8484
metadata: context.accounts.mint_account.to_account_info(),
8585
update_authority: context.accounts.authority.to_account_info(),
8686
},

tokens/token-extensions/metadata/anchor/programs/metadata/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
#![allow(clippy::diverging_sub_expression)]
2+
13
use anchor_lang::prelude::*;
24

35
use instructions::*;
4-
mod instructions;
6+
pub mod instructions;
57

68
declare_id!("BJHEDXSQfD9kBFvhw8ZCGmPFRihzvbMoxoHUKpXdpn4D");
79

tokens/token-extensions/metadata/anchor/programs/metadata/tests/test_metadata.rs

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ use {
44
InstructionData, ToAccountMetas,
55
},
66
litesvm::LiteSVM,
7+
solana_keypair::Keypair,
78
solana_kite::{
89
create_wallet, send_transaction_from_instructions,
910
token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID,
1011
},
11-
solana_keypair::Keypair,
1212
solana_signer::Signer,
1313
};
1414

@@ -47,7 +47,13 @@ fn test_metadata_full_flow() {
4747
}
4848
.to_account_metas(None),
4949
);
50-
send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap();
50+
send_transaction_from_instructions(
51+
&mut svm,
52+
vec![initialize_ix],
53+
&[&payer, &mint_keypair],
54+
&payer.pubkey(),
55+
)
56+
.unwrap();
5157

5258
// Verify mint exists
5359
let mint_account = svm
@@ -75,7 +81,8 @@ fn test_metadata_full_flow() {
7581
}
7682
.to_account_metas(None),
7783
);
78-
send_transaction_from_instructions(&mut svm, vec![update_name_ix], &[&payer], &payer.pubkey()).unwrap();
84+
send_transaction_from_instructions(&mut svm, vec![update_name_ix], &[&payer], &payer.pubkey())
85+
.unwrap();
7986
svm.expire_blockhash();
8087

8188
// Step 3: Add custom field
@@ -96,7 +103,13 @@ fn test_metadata_full_flow() {
96103
}
97104
.to_account_metas(None),
98105
);
99-
send_transaction_from_instructions(&mut svm, vec![add_custom_field_ix], &[&payer], &payer.pubkey()).unwrap();
106+
send_transaction_from_instructions(
107+
&mut svm,
108+
vec![add_custom_field_ix],
109+
&[&payer],
110+
&payer.pubkey(),
111+
)
112+
.unwrap();
100113
svm.expire_blockhash();
101114

102115
// Step 4: Remove custom field
@@ -114,7 +127,8 @@ fn test_metadata_full_flow() {
114127
}
115128
.to_account_metas(None),
116129
);
117-
send_transaction_from_instructions(&mut svm, vec![remove_key_ix], &[&payer], &payer.pubkey()).unwrap();
130+
send_transaction_from_instructions(&mut svm, vec![remove_key_ix], &[&payer], &payer.pubkey())
131+
.unwrap();
118132
svm.expire_blockhash();
119133

120134
// Step 5: Update authority to None
@@ -130,7 +144,13 @@ fn test_metadata_full_flow() {
130144
}
131145
.to_account_metas(None),
132146
);
133-
send_transaction_from_instructions(&mut svm, vec![update_authority_ix], &[&payer], &payer.pubkey()).unwrap();
147+
send_transaction_from_instructions(
148+
&mut svm,
149+
vec![update_authority_ix],
150+
&[&payer],
151+
&payer.pubkey(),
152+
)
153+
.unwrap();
134154
svm.expire_blockhash();
135155

136156
// Step 6: Emit metadata (verify it doesn't fail)
@@ -143,14 +163,12 @@ fn test_metadata_full_flow() {
143163
}
144164
.to_account_metas(None),
145165
);
146-
send_transaction_from_instructions(&mut svm, vec![emit_ix], &[&payer], &payer.pubkey()).unwrap();
166+
send_transaction_from_instructions(&mut svm, vec![emit_ix], &[&payer], &payer.pubkey())
167+
.unwrap();
147168

148169
// Verify mint still exists after all operations
149170
let mint_account = svm
150171
.get_account(&mint_keypair.pubkey())
151172
.expect("Mint account should still exist after all metadata operations");
152-
assert!(
153-
!mint_account.data.is_empty(),
154-
"Mint should still have data"
155-
);
173+
assert!(!mint_account.data.is_empty(), "Mint should still have data");
156174
}

0 commit comments

Comments
 (0)