From 21b7d7cb851779a488baeef78ca32a4a1ac46ee4 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 5 Jun 2026 17:39:39 +0000 Subject: [PATCH] fix(token-extensions/group): re-enable group anchor + quasar examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both were excluded as "not live", but the real blockers were build/code bugs: - group/anchor: a dead `spl-token-group-interface = "0.2.5"` dependency (never imported in code — the GroupPointer types come from anchor_spl::token_2022) transitively pinned an old solana-zk-token-sdk that conflicts with ed25519-dalek 2 on `zeroize`, breaking `cargo build-sbf`. Removed the dep; the program now builds and its LiteSVM test passes. - group/quasar: three bugs in src/lib.rs — `Program` should be `Program` (compile error); the GroupPointer extension opcode was 41 (that's GroupMemberPointer) instead of 40; and the mint account was allocated 250 bytes instead of 234 (base 82 padded to 165 + 1 account-type byte + GroupPointer TLV of 2+2+64), which made InitializeMint2 fail with InvalidAccountData. Fixed all three; builds and both tests pass. Drop both from .github/.ghaignore so CI builds and tests them. --- .github/.ghaignore | 4 ---- .../group/anchor/programs/group/Cargo.toml | 1 - tokens/token-extensions/group/quasar/src/lib.rs | 14 ++++++++------ 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/.ghaignore b/.github/.ghaignore index a04a034f..034781a7 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -19,10 +19,6 @@ compression/cnft-vault/anchor # builds but need to test on localhost compression/cnft-burn/anchor -# not live -tokens/token-extensions/group/anchor -tokens/token-extensions/group/quasar - # CPI quasar project uses subdirectories (hand/ and lever/) instead of a root Quasar.toml basics/cross-program-invocation/quasar diff --git a/tokens/token-extensions/group/anchor/programs/group/Cargo.toml b/tokens/token-extensions/group/anchor/programs/group/Cargo.toml index fe19b3a1..1253a994 100644 --- a/tokens/token-extensions/group/anchor/programs/group/Cargo.toml +++ b/tokens/token-extensions/group/anchor/programs/group/Cargo.toml @@ -22,7 +22,6 @@ custom-panic = [] [dependencies] anchor-lang = "1.0.0" anchor-spl = "1.0.0" -spl-token-group-interface = "0.2.5" [dev-dependencies] litesvm = "0.11.0" diff --git a/tokens/token-extensions/group/quasar/src/lib.rs b/tokens/token-extensions/group/quasar/src/lib.rs index 3f65707c..d9c4fad4 100644 --- a/tokens/token-extensions/group/quasar/src/lib.rs +++ b/tokens/token-extensions/group/quasar/src/lib.rs @@ -42,13 +42,14 @@ pub struct InitializeGroup { #[account(mut)] pub mint_account: Signer, pub token_program: Program, - pub system_program: Program, + pub system_program: Program, } #[inline(always)] fn handle_initialize_group(accounts: &mut InitializeGroup) -> Result<(), ProgramError> { - // Mint + GroupPointer extension = 250 bytes - let mint_size: u64 = 250; + // Mint + GroupPointer extension = 234 bytes + // (base mint padded to 165 + account_type byte + GroupPointer TLV [2 type + 2 len + 64 data]) + let mint_size: u64 = 234; let lamports = Rent::get()?.try_minimum_balance(mint_size as usize)?; accounts @@ -62,10 +63,11 @@ fn handle_initialize_group(accounts: &mut InitializeGroup) -> Result<(), Program ) .invoke()?; - // InitializeGroupPointer: opcode 41, sub-opcode 0 - // Data: [41, 0, authority (32 bytes), group_address (32 bytes)] + // InitializeGroupPointer: opcode 40, sub-opcode 0 + // (opcode 41 is GroupMemberPointer, not GroupPointer) + // Data: [40, 0, authority (32 bytes), group_address (32 bytes)] let mut ext_data = [0u8; 66]; - ext_data[0] = 41; + ext_data[0] = 40; ext_data[1] = 0; // authority = mint itself (self-referential PDA pattern) ext_data[2..34].copy_from_slice(accounts.mint_account.to_account_view().address().as_ref());