From 9400aeb1f536a1a8baff094caa7d87507294f020 Mon Sep 17 00:00:00 2001 From: Aung Nanda Oo Date: Thu, 23 Jul 2026 18:39:49 -0700 Subject: [PATCH 1/3] fix(token-2022/metadata/anchor): bump spl-token-metadata-interface and fix API drift MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The program pinned spl-token-metadata-interface = "0.3.3" and spl-type-length-value = "0.4.3", while anchor-spl = "1.0.2" transitively resolves to 0.8.0 / 0.9.1 respectively. Cargo ended up with two incompatible spl-token-metadata-interface versions in the dependency tree, pulling in an older solana-program chain that conflicted with the solana-zk-token-sdk compile unit, causing the build to fail. Fix: align the two direct pins to the versions anchor-spl already uses: spl-token-metadata-interface 0.3.3 → 0.8.0 spl-type-length-value 0.4.3 → 0.9.1 Three minor API-drift call-sites also updated: - initialize.rs: replace removed DEFAULT_LAMPORTS_PER_BYTE_YEAR / DEFAULT_EXEMPTION_THRESHOLD constants with Rent::get()?.minimum_balance() - update_field.rs, update_authority.rs: rename struct field token_program_id → program_id in TokenMetadataUpdateField / TokenMetadataUpdateAuthority (field was renamed in anchor-spl 1.1.x) All 7 existing tests pass locally. Removes the entry from .ghaignore so the program is picked up by CI anchor.yml again. Co-Authored-By: Claude Sonnet 4.6 --- .github/.ghaignore | 3 --- .../token-2022/metadata/anchor/programs/metadata/Cargo.toml | 4 ++-- .../anchor/programs/metadata/src/instructions/initialize.rs | 6 +----- .../programs/metadata/src/instructions/update_authority.rs | 2 +- .../programs/metadata/src/instructions/update_field.rs | 2 +- 5 files changed, 5 insertions(+), 12 deletions(-) diff --git a/.github/.ghaignore b/.github/.ghaignore index 6452220d5..1dd589259 100644 --- a/.github/.ghaignore +++ b/.github/.ghaignore @@ -36,9 +36,6 @@ tokens/token-2022/group/anchor # error in tests tokens/external-delegate-token-master/anchor -# build failed - program outdated -tokens/token-2022/metadata/anchor - # dependency issues tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor diff --git a/tokens/token-2022/metadata/anchor/programs/metadata/Cargo.toml b/tokens/token-2022/metadata/anchor/programs/metadata/Cargo.toml index a0c953334..87fab924f 100644 --- a/tokens/token-2022/metadata/anchor/programs/metadata/Cargo.toml +++ b/tokens/token-2022/metadata/anchor/programs/metadata/Cargo.toml @@ -22,8 +22,8 @@ custom-panic = [] [dependencies] anchor-lang = "1.0.2" anchor-spl = "1.0.2" -spl-token-metadata-interface = "0.3.3" -spl-type-length-value = "0.4.3" +spl-token-metadata-interface = "0.8.0" +spl-type-length-value = "0.9.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs index f03917e90..7a5280939 100644 --- a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs +++ b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs @@ -1,7 +1,4 @@ use anchor_lang::prelude::*; -use anchor_lang::solana_program::rent::{ - DEFAULT_EXEMPTION_THRESHOLD, DEFAULT_LAMPORTS_PER_BYTE_YEAR, -}; use anchor_lang::system_program::{transfer, Transfer}; use anchor_spl::token_interface::{ token_metadata_initialize, Mint, Token2022, TokenMetadataInitialize, @@ -42,8 +39,7 @@ pub fn process_initialize(ctx: Context, args: TokenMetadataArgs) -> let data_len = 4 + token_metadata.get_packed_len()?; // Calculate lamports required for the additional metadata - let lamports = - data_len as u64 * DEFAULT_LAMPORTS_PER_BYTE_YEAR * DEFAULT_EXEMPTION_THRESHOLD as u64; + let lamports = Rent::get()?.minimum_balance(data_len); // Transfer additional lamports to mint account transfer( diff --git a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_authority.rs b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_authority.rs index 994712325..f68b619a7 100644 --- a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_authority.rs +++ b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_authority.rs @@ -29,7 +29,7 @@ pub fn process_update_authority(ctx: Context) -> Result<()> { CpiContext::new( ctx.accounts.token_program.key(), TokenMetadataUpdateAuthority { - token_program_id: ctx.accounts.token_program.to_account_info(), + program_id: ctx.accounts.token_program.to_account_info(), metadata: ctx.accounts.mint_account.to_account_info(), current_authority: ctx.accounts.current_authority.to_account_info(), diff --git a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_field.rs b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_field.rs index 2e94c7b1c..adb20b8f2 100644 --- a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_field.rs +++ b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_field.rs @@ -80,7 +80,7 @@ pub fn process_update_field(ctx: Context, args: UpdateFieldArgs) -> CpiContext::new( ctx.accounts.token_program.key(), TokenMetadataUpdateField { - token_program_id: ctx.accounts.token_program.to_account_info(), + program_id: ctx.accounts.token_program.to_account_info(), metadata: ctx.accounts.mint_account.to_account_info(), update_authority: ctx.accounts.authority.to_account_info(), }, From ac19c163546f27e3b66b61d76a704b0d17110abd Mon Sep 17 00:00:00 2001 From: Aung Nanda Oo Date: Thu, 23 Jul 2026 18:50:56 -0700 Subject: [PATCH 2/3] fix(token-2022/metadata/anchor): avoid double-charging rent overhead in initialize minimum_balance(data_len) prices (128 + data_len) bytes, but the mint's base 128-byte account overhead is already funded by Anchor's `init`. Use minimum_balance(data_len) - minimum_balance(0) to charge only for the incremental metadata extension bytes. Co-Authored-By: Claude Sonnet 4.6 --- .../programs/metadata/src/instructions/initialize.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs index 7a5280939..eada9f24b 100644 --- a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs +++ b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs @@ -38,8 +38,11 @@ pub fn process_initialize(ctx: Context, args: TokenMetadataArgs) -> // Add 4 extra bytes for size of MetadataExtension (2 bytes for type, 2 bytes for length) let data_len = 4 + token_metadata.get_packed_len()?; - // Calculate lamports required for the additional metadata - let lamports = Rent::get()?.minimum_balance(data_len); + // Calculate lamports required for the additional metadata bytes only. + // The mint's base account overhead (128 bytes) is already funded by Anchor's `init`, + // so subtract minimum_balance(0) to avoid double-charging that overhead. + let rent = Rent::get()?; + let lamports = rent.minimum_balance(data_len).saturating_sub(rent.minimum_balance(0)); // Transfer additional lamports to mint account transfer( From 02acb9812eca290fba711e70dc1cafbff1ddea76 Mon Sep 17 00:00:00 2001 From: Aung Nanda Oo Date: Fri, 24 Jul 2026 17:44:58 -0700 Subject: [PATCH 3/3] fix(#642): pin @types/node to ^22.x and update tsconfig for token-2022/metadata/anchor @types/node@20.x has Buffer interface incompatible with TypeScript 5.x causing tsc --noEmit to fail in CI. Pinning @types/node to ^22.19.1 resolves this. Also bumps typescript to ^5.5.0, adds skipLibCheck, and updates target/lib to es2020 to match current project requirements. Co-Authored-By: Claude Sonnet 4.6 --- .../token-2022/metadata/anchor/package.json | 3 +- .../token-2022/metadata/anchor/pnpm-lock.yaml | 42 ++++++++----------- .../token-2022/metadata/anchor/tsconfig.json | 9 ++-- 3 files changed, 25 insertions(+), 29 deletions(-) diff --git a/tokens/token-2022/metadata/anchor/package.json b/tokens/token-2022/metadata/anchor/package.json index f46c7b95c..b3b58fd7d 100644 --- a/tokens/token-2022/metadata/anchor/package.json +++ b/tokens/token-2022/metadata/anchor/package.json @@ -12,10 +12,11 @@ "@types/bn.js": "^5.1.0", "@types/chai": "^4.3.0", "@types/mocha": "^9.0.0", + "@types/node": "^22.19.1", "chai": "^4.3.4", "mocha": "^9.0.3", "prettier": "^2.6.2", "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" + "typescript": "^5.5.0" } } diff --git a/tokens/token-2022/metadata/anchor/pnpm-lock.yaml b/tokens/token-2022/metadata/anchor/pnpm-lock.yaml index 733244d50..0157b09bf 100644 --- a/tokens/token-2022/metadata/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/metadata/anchor/pnpm-lock.yaml @@ -24,6 +24,9 @@ importers: '@types/mocha': specifier: ^9.0.0 version: 9.1.1 + '@types/node': + specifier: ^22.19.1 + version: 22.20.1 chai: specifier: ^4.3.4 version: 4.4.1 @@ -37,7 +40,7 @@ importers: specifier: ^10.0.0 version: 10.0.0(mocha@9.2.2) typescript: - specifier: ^5.3.3 + specifier: ^5.5.0 version: 5.9.3 packages: @@ -149,11 +152,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.12.11': - resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==} - - '@types/node@24.8.0': - resolution: {integrity: sha512-5x08bUtU8hfboMTrJ7mEO4CpepS9yBwAqcL52y86SWNmbPX8LVbNs3EP4cNrIZgdjk2NAlP2ahNihozpoZIxSg==} + '@types/node@22.20.1': + resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==} '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -392,6 +392,7 @@ packages: glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me growl@1.10.5: resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} @@ -413,6 +414,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -668,11 +670,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - undici-types@7.14.0: - resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} utf-8-validate@5.0.10: resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} @@ -680,6 +679,7 @@ packages: uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true webidl-conversions@3.0.1: @@ -894,13 +894,13 @@ snapshots: '@types/bn.js@5.1.5': dependencies: - '@types/node': 20.12.11 + '@types/node': 22.20.1 '@types/chai@4.3.16': {} '@types/connect@3.4.38': dependencies: - '@types/node': 24.8.0 + '@types/node': 22.20.1 '@types/json5@0.0.29': optional: true @@ -909,23 +909,19 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@20.12.11': + '@types/node@22.20.1': dependencies: - undici-types: 5.26.5 - - '@types/node@24.8.0': - dependencies: - undici-types: 7.14.0 + undici-types: 6.21.0 '@types/uuid@8.3.4': {} '@types/ws@7.4.7': dependencies: - '@types/node': 24.8.0 + '@types/node': 22.20.1 '@types/ws@8.18.1': dependencies: - '@types/node': 24.8.0 + '@types/node': 22.20.1 '@ungap/promise-all-settled@1.1.2': {} @@ -1413,9 +1409,7 @@ snapshots: typescript@5.9.3: {} - undici-types@5.26.5: {} - - undici-types@7.14.0: {} + undici-types@6.21.0: {} utf-8-validate@5.0.10: dependencies: diff --git a/tokens/token-2022/metadata/anchor/tsconfig.json b/tokens/token-2022/metadata/anchor/tsconfig.json index cd5d2e3d0..219f1fd62 100644 --- a/tokens/token-2022/metadata/anchor/tsconfig.json +++ b/tokens/token-2022/metadata/anchor/tsconfig.json @@ -1,10 +1,11 @@ { "compilerOptions": { - "types": ["mocha", "chai"], + "types": ["mocha", "chai", "node"], "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], + "lib": ["es2020"], "module": "commonjs", - "target": "es6", - "esModuleInterop": true + "target": "es2020", + "esModuleInterop": true, + "skipLibCheck": true } }