Skip to content

Commit 5d25100

Browse files
mikemaccanaclaude
andcommitted
Fix token-2022 metadata: use 8-byte discriminator for TokenMetadataInitialize
Token-2022 v7 encodes TokenMetadata/TokenGroup instructions using 8-byte SHA256-based discriminators rather than simple 1-byte opcodes. The correct discriminator for initialize_account is sha256("spl_token_metadata_interface: initialize_account")[0..8] = [210, 225, 30, 162, 88, 184, 77, 141]. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent a8f816e commit 5d25100

1 file changed

Lines changed: 9 additions & 7 deletions

File tree

  • tokens/token-2022/metadata/quasar/src

tokens/token-2022/metadata/quasar/src/lib.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -140,19 +140,21 @@ pub fn handle_initialize(
140140
)
141141
.invoke()?;
142142

143-
// TokenMetadataInitialize: TokenInstruction::TokenMetadataExtension = 45, sub = 0
144-
// Data: [45, 0, update_authority(32), mint(32),
143+
// TokenMetadataInitialize via spl-token-metadata-interface discriminator format.
144+
// Token-2022 v7 uses 8-byte SHA256 discriminators for TokenMetadata/TokenGroup
145+
// instructions rather than simple opcode bytes.
146+
// Discriminator = sha256("spl_token_metadata_interface:initialize_account")[0..8]
147+
// = [210, 225, 30, 162, 88, 184, 77, 141]
148+
// Data: [discriminator(8), update_authority(32), mint(32),
145149
// name_len(u32 LE), name, symbol_len(u32 LE), symbol, uri_len(u32 LE), uri]
146150
// Accounts: [metadata(=mint, writable), update_authority(readonly),
147151
// mint(readonly), mint_authority(signer)]
148-
// In token-2022 v7: 44=PausableExtension, 45=TokenMetadataExtension
149152
const MAX_META_IX: usize = 512;
150153
let mut buf = [0u8; MAX_META_IX];
151154
let mut pos = 0usize;
152-
buf[pos] = 45;
153-
pos += 1;
154-
buf[pos] = 0;
155-
pos += 1;
155+
let discriminator: [u8; 8] = [210, 225, 30, 162, 88, 184, 77, 141];
156+
buf[pos..pos + 8].copy_from_slice(&discriminator);
157+
pos += 8;
156158
buf[pos..pos + 32].copy_from_slice(accounts.payer.to_account_view().address().as_ref());
157159
pos += 32;
158160
buf[pos..pos + 32]

0 commit comments

Comments
 (0)