From f83acb30f686f344ef6f94e6da1e63e71454e32f Mon Sep 17 00:00:00 2001 From: Joinhack Date: Sat, 28 Feb 2026 18:38:03 +0800 Subject: [PATCH 1/3] from the devnet for disable mint --- anchor/Anchor.toml | 2 +- anchor/Cargo.lock | 247 ++++++++++++------ anchor/programs/bless-token/Cargo.toml | 7 +- .../programs/bless-token/src/context/meta.rs | 63 ++++- .../programs/bless-token/src/context/mod.rs | 3 +- anchor/programs/bless-token/src/errors.rs | 6 + anchor/programs/bless-token/src/lib.rs | 5 + anchor/src/client/bless_token_client.ts | 33 +++ anchor/tests/bless_token.test.ts | 24 ++ 9 files changed, 300 insertions(+), 90 deletions(-) diff --git a/anchor/Anchor.toml b/anchor/Anchor.toml index 976fad5..457b3a2 100644 --- a/anchor/Anchor.toml +++ b/anchor/Anchor.toml @@ -1,6 +1,6 @@ [toolchain] package_manager = "yarn" -anchor_version = "0.31.1" +anchor_version = "0.32.1" [features] resolution = true diff --git a/anchor/Cargo.lock b/anchor/Cargo.lock index e75bc73..9c73c75 100644 --- a/anchor/Cargo.lock +++ b/anchor/Cargo.lock @@ -61,9 +61,9 @@ dependencies = [ [[package]] name = "anchor-attribute-access-control" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f70fd141a4d18adf11253026b32504f885447048c7494faf5fa83b01af9c0cf" +checksum = "7a883ca44ef14b2113615fc6d3a85fefc68b5002034e88db37f7f1f802f88aa9" dependencies = [ "anchor-syn", "proc-macro2", @@ -73,9 +73,9 @@ dependencies = [ [[package]] name = "anchor-attribute-account" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "715a261c57c7679581e06f07a74fa2af874ac30f86bd8ea07cca4a7e5388a064" +checksum = "61c4d97763b29030412b4b80715076377edc9cc63bc3c9e667297778384b9fd2" dependencies = [ "anchor-syn", "bs58", @@ -86,9 +86,9 @@ dependencies = [ [[package]] name = "anchor-attribute-constant" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730d6df8ae120321c5c25e0779e61789e4b70dc8297102248902022f286102e4" +checksum = "aae3328bbf9bbd517a51621b1ba6cbec06cbbc25e8cfc7403bddf69bcf088206" dependencies = [ "anchor-syn", "quote", @@ -97,9 +97,9 @@ dependencies = [ [[package]] name = "anchor-attribute-error" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27e6e449cc3a37b2880b74dcafb8e5a17b954c0e58e376432d7adc646fb333ef" +checksum = "cf2398a6d9e16df1ee9d7d37d970a8246756de898c8dd16ef6bdbe4da20cf39a" dependencies = [ "anchor-syn", "quote", @@ -108,9 +108,9 @@ dependencies = [ [[package]] name = "anchor-attribute-event" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7710e4c54adf485affcd9be9adec5ef8846d9c71d7f31e16ba86ff9fc1dd49f" +checksum = "f12758f4ec2f0e98d4d56916c6fe95cb23d74b8723dd902c762c5ef46ebe7b65" dependencies = [ "anchor-syn", "proc-macro2", @@ -120,9 +120,9 @@ dependencies = [ [[package]] name = "anchor-attribute-program" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ecfd49b2aeadeb32f35262230db402abed76ce87e27562b34f61318b2ec83c" +checksum = "8c7193b5af2649813584aae6e3569c46fd59616a96af2083c556b13136c3830f" dependencies = [ "anchor-lang-idl", "anchor-syn", @@ -137,9 +137,9 @@ dependencies = [ [[package]] name = "anchor-derive-accounts" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be89d160793a88495af462a7010b3978e48e30a630c91de47ce2c1d3cb7a6149" +checksum = "d332d1a13c0fca1a446de140b656e66110a5e8406977dcb6a41e5d6f323760b0" dependencies = [ "anchor-syn", "quote", @@ -148,9 +148,9 @@ dependencies = [ [[package]] name = "anchor-derive-serde" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abc6ee78acb7bfe0c2dd2abc677aaa4789c0281a0c0ef01dbf6fe85e0fd9e6e4" +checksum = "8656e4af182edaeae665fa2d2d7ee81148518b5bd0be9a67f2a381bb17da7d46" dependencies = [ "anchor-syn", "borsh-derive-internal", @@ -161,9 +161,9 @@ dependencies = [ [[package]] name = "anchor-derive-space" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134a01c0703f6fd355a0e472c033f6f3e41fac1ef6e370b20c50f4c8d022cea7" +checksum = "dcff2a083560cd79817db07d89a4de39a2c4b2eaa00c1742cf0df49b25ff2bed" dependencies = [ "proc-macro2", "quote", @@ -172,9 +172,9 @@ dependencies = [ [[package]] name = "anchor-lang" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6bab117055905e930f762c196e08f861f8dfe7241b92cee46677a3b15561a0a" +checksum = "e67d85d5376578f12d840c29ff323190f6eecd65b00a0b5f2b2f232751d049cc" dependencies = [ "anchor-attribute-access-control", "anchor-attribute-account", @@ -190,7 +190,26 @@ dependencies = [ "bincode", "borsh 0.10.4", "bytemuck", - "solana-program", + "solana-account-info", + "solana-clock", + "solana-cpi", + "solana-define-syscall", + "solana-feature-gate-interface", + "solana-instruction", + "solana-instructions-sysvar", + "solana-invoke", + "solana-loader-v3-interface", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-sdk-ids", + "solana-system-interface", + "solana-sysvar", + "solana-sysvar-id", "thiserror 1.0.69", ] @@ -221,9 +240,9 @@ dependencies = [ [[package]] name = "anchor-spl" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c08cb5d762c0694f74bd02c9a5b04ea53cefc496e2c27b3234acffca5cd076b" +checksum = "3397ab3fc5b198bbfe55d827ff58bd69f2a8d3f9f71c3732c23c2093fec4d3ef" dependencies = [ "anchor-lang", "mpl-token-metadata", @@ -237,9 +256,9 @@ dependencies = [ [[package]] name = "anchor-syn" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dc7a6d90cc643df0ed2744862cdf180587d1e5d28936538c18fc8908489ed67" +checksum = "b93b69aa7d099b59378433f6d7e20e1008fc10c69e48b220270e5b3f2ec4c8be" dependencies = [ "anyhow", "bs58", @@ -446,18 +465,18 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.9.3" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", @@ -1466,9 +1485,9 @@ dependencies = [ [[package]] name = "solana-curve25519" -version = "2.2.18" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e2a54e2ed54b23d01281b90da8ce11f955af2711798bdea299f107a7e15551" +checksum = "eae4261b9a8613d10e77ac831a8fa60b6fa52b9b103df46d641deff9f9812a23" dependencies = [ "bytemuck", "bytemuck_derive", @@ -1489,9 +1508,9 @@ dependencies = [ [[package]] name = "solana-define-syscall" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf784bb2cb3e02cac9801813c30187344228d2ae952534902108f6150573a33d" +checksum = "2ae3e2abcf541c8122eafe9a625d4d194b4023c20adde1e251f94e056bb1aee2" [[package]] name = "solana-derivation-path" @@ -1602,9 +1621,9 @@ dependencies = [ [[package]] name = "solana-instruction" -version = "2.2.1" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce496a475e5062ba5de97215ab39d9c358f9c9df4bb7f3a45a1f1a8bd9065ed" +checksum = "bab5682934bd1f65f8d2c16f21cb532526fcc1a09f796e2cacdb091eee5774ad" dependencies = [ "bincode", "borsh 1.5.7", @@ -1613,6 +1632,7 @@ dependencies = [ "num-traits", "serde", "serde_derive", + "serde_json", "solana-define-syscall", "solana-pubkey", "wasm-bindgen", @@ -1635,6 +1655,19 @@ dependencies = [ "solana-sysvar-id", ] +[[package]] +name = "solana-invoke" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58f5693c6de226b3626658377168b0184e94e8292ff16e3d31d4766e65627565" +dependencies = [ + "solana-account-info", + "solana-define-syscall", + "solana-instruction", + "solana-program-entrypoint", + "solana-stable-layout", +] + [[package]] name = "solana-keccak-hasher" version = "2.2.1" @@ -1891,16 +1924,16 @@ dependencies = [ [[package]] name = "solana-pubkey" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad77cf9f30b971a1eec48dde6a863dcac60ba005a34dfde23736afa5c7ac667" +checksum = "9b62adb9c3261a052ca1f999398c388f1daf558a1b492f60a6d9e64857db4ff1" dependencies = [ "borsh 0.10.4", "borsh 1.5.7", - "bs58", "bytemuck", "bytemuck_derive", "curve25519-dalek", + "five8", "five8_const", "getrandom 0.2.15", "js-sys", @@ -2209,9 +2242,9 @@ dependencies = [ [[package]] name = "solana-zk-sdk" -version = "2.2.18" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bdc20e66b672dc40b33040d345807fcad328c060751127e3a1564374a57eee" +checksum = "97b9fc6ec37d16d0dccff708ed1dd6ea9ba61796700c3bb7c3b401973f10f63b" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -2221,7 +2254,6 @@ dependencies = [ "curve25519-dalek", "itertools", "js-sys", - "lazy_static", "merlin", "num-derive 0.4.2", "num-traits", @@ -2246,9 +2278,9 @@ dependencies = [ [[package]] name = "spl-associated-token-account" -version = "6.0.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76fee7d65013667032d499adc3c895e286197a35a0d3a4643c80e7fd3e9969e3" +checksum = "ae179d4a26b3c7a20c839898e6aed84cb4477adf108a366c95532f058aea041b" dependencies = [ "borsh 1.5.7", "num-derive 0.4.2", @@ -2257,7 +2289,7 @@ dependencies = [ "spl-associated-token-account-client", "spl-token", "spl-token-2022", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] @@ -2308,12 +2340,22 @@ dependencies = [ [[package]] name = "spl-elgamal-registry" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce0f668975d2b0536e8a8fd60e56a05c467f06021dae037f1d0cfed0de2e231d" +checksum = "65edfeed09cd4231e595616aa96022214f9c9d2be02dea62c2b30d5695a6833a" dependencies = [ "bytemuck", - "solana-program", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-system-interface", + "solana-sysvar", "solana-zk-sdk", "spl-pod", "spl-token-confidential-transfer-proof-extraction", @@ -2355,22 +2397,24 @@ dependencies = [ [[package]] name = "spl-program-error" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d39b5186f42b2b50168029d81e58e800b690877ef0b30580d107659250da1d1" +checksum = "9cdebc8b42553070b75aa5106f071fef2eb798c64a7ec63375da4b1f058688c6" dependencies = [ "num-derive 0.4.2", "num-traits", - "solana-program", + "solana-decode-error", + "solana-msg", + "solana-program-error", "spl-program-error-derive", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] name = "spl-program-error-derive" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" +checksum = "2a2539e259c66910d78593475540e8072f0b10f0f61d7607bbf7593899ed52d0" dependencies = [ "proc-macro2", "quote", @@ -2380,9 +2424,9 @@ dependencies = [ [[package]] name = "spl-tlv-account-resolution" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd99ff1e9ed2ab86e3fd582850d47a739fec1be9f4661cba1782d3a0f26805f3" +checksum = "1408e961215688715d5a1063cbdcf982de225c45f99c82b4f7d7e1dd22b998d7" dependencies = [ "bytemuck", "num-derive 0.4.2", @@ -2397,37 +2441,66 @@ dependencies = [ "spl-pod", "spl-program-error", "spl-type-length-value", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] name = "spl-token" -version = "7.0.0" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed320a6c934128d4f7e54fe00e16b8aeaecf215799d060ae14f93378da6dc834" +checksum = "053067c6a82c705004f91dae058b11b4780407e9ccd6799dc9e7d0fab5f242da" dependencies = [ "arrayref", "bytemuck", "num-derive 0.4.2", "num-traits", "num_enum", - "solana-program", - "thiserror 1.0.69", + "solana-account-info", + "solana-cpi", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-sysvar", + "thiserror 2.0.12", ] [[package]] name = "spl-token-2022" -version = "6.0.0" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b27f7405010ef816587c944536b0eafbcc35206ab6ba0f2ca79f1d28e488f4f" +checksum = "31f0dfbb079eebaee55e793e92ca5f433744f4b71ee04880bfd6beefba5973e5" dependencies = [ "arrayref", "bytemuck", "num-derive 0.4.2", "num-traits", "num_enum", - "solana-program", + "solana-account-info", + "solana-clock", + "solana-cpi", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-native-token", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", "solana-security-txt", + "solana-system-interface", + "solana-sysvar", "solana-zk-sdk", "spl-elgamal-registry", "spl-memo", @@ -2440,14 +2513,14 @@ dependencies = [ "spl-token-metadata-interface", "spl-transfer-hook-interface", "spl-type-length-value", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] name = "spl-token-confidential-transfer-ciphertext-arithmetic" -version = "0.2.1" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "170378693c5516090f6d37ae9bad2b9b6125069be68d9acd4865bbe9fc8499fd" +checksum = "cddd52bfc0f1c677b41493dafa3f2dbbb4b47cf0990f08905429e19dc8289b35" dependencies = [ "base64 0.22.1", "bytemuck", @@ -2457,13 +2530,19 @@ dependencies = [ [[package]] name = "spl-token-confidential-transfer-proof-extraction" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff2d6a445a147c9d6dd77b8301b1e116c8299601794b558eafa409b342faf96" +checksum = "fe2629860ff04c17bafa9ba4bed8850a404ecac81074113e1f840dbd0ebb7bd6" dependencies = [ "bytemuck", + "solana-account-info", "solana-curve25519", - "solana-program", + "solana-instruction", + "solana-instructions-sysvar", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "solana-sdk-ids", "solana-zk-sdk", "spl-pod", "thiserror 2.0.12", @@ -2471,20 +2550,20 @@ dependencies = [ [[package]] name = "spl-token-confidential-transfer-proof-generation" -version = "0.2.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8627184782eec1894de8ea26129c61303f1f0adeed65c20e0b10bc584f09356d" +checksum = "fa27b9174bea869a7ebf31e0be6890bce90b1a4288bc2bbf24bd413f80ae3fde" dependencies = [ "curve25519-dalek", "solana-zk-sdk", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] name = "spl-token-group-interface" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d595667ed72dbfed8c251708f406d7c2814a3fa6879893b323d56a10bedfc799" +checksum = "5597b4cd76f85ce7cd206045b7dc22da8c25516573d42d267c8d1fd128db5129" dependencies = [ "bytemuck", "num-derive 0.4.2", @@ -2496,14 +2575,14 @@ dependencies = [ "solana-pubkey", "spl-discriminator", "spl-pod", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] name = "spl-token-metadata-interface" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb9c89dbc877abd735f05547dcf9e6e12c00c11d6d74d8817506cab4c99fdbb" +checksum = "304d6e06f0de0c13a621464b1fd5d4b1bebf60d15ca71a44d3839958e0da16ee" dependencies = [ "borsh 1.5.7", "num-derive 0.4.2", @@ -2517,14 +2596,14 @@ dependencies = [ "spl-discriminator", "spl-pod", "spl-type-length-value", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] name = "spl-transfer-hook-interface" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4aa7503d52107c33c88e845e1351565050362c2314036ddf19a36cd25137c043" +checksum = "a7e905b849b6aba63bde8c4badac944ebb6c8e6e14817029cbe1bc16829133bd" dependencies = [ "arrayref", "bytemuck", @@ -2542,14 +2621,14 @@ dependencies = [ "spl-program-error", "spl-tlv-account-resolution", "spl-type-length-value", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] name = "spl-type-length-value" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba70ef09b13af616a4c987797870122863cba03acc4284f226a4473b043923f9" +checksum = "d417eb548214fa822d93f84444024b4e57c13ed6719d4dcc68eec24fb481e9f5" dependencies = [ "bytemuck", "num-derive 0.4.2", @@ -2560,7 +2639,7 @@ dependencies = [ "solana-program-error", "spl-discriminator", "spl-pod", - "thiserror 1.0.69", + "thiserror 2.0.12", ] [[package]] diff --git a/anchor/programs/bless-token/Cargo.toml b/anchor/programs/bless-token/Cargo.toml index 3b44f0a..bf27609 100644 --- a/anchor/programs/bless-token/Cargo.toml +++ b/anchor/programs/bless-token/Cargo.toml @@ -15,8 +15,11 @@ no-entrypoint = [] no-idl = [] no-log-ix-name = [] idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] +anchor-debug = [] +custom-panic = [] +custom-heap = [] [dependencies] -anchor-lang = "0.31.1" -anchor-spl = {version = "0.31.1", features = ["metadata"] } +anchor-lang = "0.32.1" +anchor-spl = {version = "0.32.1", features = ["metadata"] } diff --git a/anchor/programs/bless-token/src/context/meta.rs b/anchor/programs/bless-token/src/context/meta.rs index 8ec4fbf..0aacbe6 100644 --- a/anchor/programs/bless-token/src/context/meta.rs +++ b/anchor/programs/bless-token/src/context/meta.rs @@ -4,7 +4,7 @@ use anchor_spl::{ create_metadata_accounts_v3, mpl_token_metadata::types::DataV2, update_metadata_accounts_v2, CreateMetadataAccountsV3, Metadata, UpdateMetadataAccountsV2, }, - token::Mint, + token::{self, spl_token::instruction::AuthorityType, Mint, SetAuthority, Token}, }; use crate::{ @@ -245,3 +245,64 @@ impl<'info> BlessTokenMetaSetMetadata<'info> { Ok(()) } } + +#[derive(Accounts)] +pub struct BlessTokenDisableMint<'info> { + #[account( + mut, + // only admin can disable mint authority. + constraint = payer.key() == bless_meta_state.admin + )] + pub payer: Signer<'info>, + + #[account(mut)] + pub bless_mint: Account<'info, Mint>, + + #[account( + mut, + seeds = [SEED_BLESS_CONTRACT_STATE.as_bytes(), bless_mint.key().as_ref()], + bump = bless_state.bump, + )] + pub bless_state: Account<'info, BlessTokenState>, + + #[account( + mut, + seeds = [SEED_BLESS_TOKEN_META_STATE.as_bytes(), bless_state.key().as_ref()], + bump = bless_meta_state.bump, + )] + pub bless_meta_state: Account<'info, BlessTokenMetaState>, + + pub token_program: Program<'info, Token>, +} + +impl<'info> BlessTokenDisableMint<'info> { + pub fn disable_mint(&mut self) -> Result<()> { + let bless_token_key = Pubkey::from_str_const(crate::MINT_KEY); + if self.bless_mint.key() != bless_token_key { + return Err(BlsError::InvalidMintToken.into()); + } + let mint_authority = self + .bless_mint + .mint_authority + .ok_or(BlsError::MintAuthorityAlreadyDisabled)?; + if mint_authority != self.bless_state.key() { + return Err(BlsError::InvalidMintAuthority.into()); + } + let mint_bytes = self.bless_mint.key(); + let signer_seeds: &[&[&[u8]]] = &[&[ + SEED_BLESS_CONTRACT_STATE.as_bytes(), + mint_bytes.as_ref(), + &[self.bless_state.bump], + ]]; + let cpi_ctx = CpiContext::new_with_signer( + self.token_program.to_account_info(), + SetAuthority { + current_authority: self.bless_state.to_account_info(), + account_or_mint: self.bless_mint.to_account_info(), + }, + signer_seeds, + ); + token::set_authority(cpi_ctx, AuthorityType::MintTokens, None)?; + Ok(()) + } +} diff --git a/anchor/programs/bless-token/src/context/mod.rs b/anchor/programs/bless-token/src/context/mod.rs index 35797a5..8c58bc0 100644 --- a/anchor/programs/bless-token/src/context/mod.rs +++ b/anchor/programs/bless-token/src/context/mod.rs @@ -7,8 +7,7 @@ mod meta; pub use meta::*; use crate::{ - errors::BlsError, BlessTokenState, MINT_KEY, SEED_BLESS_CONTRACT_STATE, - WALLET_COMMUNITY_REWARDS_FEE, WALLET_ECOSYSTEM_LIQUIDITYPROVISION_TGTMARKETING_FEE, + errors::BlsError, BlessTokenState, MINT_KEY, SEED_BLESS_CONTRACT_STATE, WALLET_COMMUNITY_REWARDS_FEE, WALLET_ECOSYSTEM_LIQUIDITYPROVISION_TGTMARKETING_FEE, WALLET_FOUNDATION_FEE, WALLET_INVESTOR_FEE, WALLET_TEAM_ADVISOR_FEE, }; diff --git a/anchor/programs/bless-token/src/errors.rs b/anchor/programs/bless-token/src/errors.rs index 0b52f9f..23f5424 100644 --- a/anchor/programs/bless-token/src/errors.rs +++ b/anchor/programs/bless-token/src/errors.rs @@ -13,4 +13,10 @@ pub enum BlsError { #[msg("Invalid pending admin.")] InvalidPendingAdmin, + + #[msg("Invalid mint authority.")] + InvalidMintAuthority, + + #[msg("Mint authority already disabled.")] + MintAuthorityAlreadyDisabled, } diff --git a/anchor/programs/bless-token/src/lib.rs b/anchor/programs/bless-token/src/lib.rs index 7435835..9344d69 100644 --- a/anchor/programs/bless-token/src/lib.rs +++ b/anchor/programs/bless-token/src/lib.rs @@ -22,6 +22,11 @@ pub mod bless_token { ctx.accounts.init(bump) } + /// Permanently disable mint authority for the bless token. + pub fn disable_bless_mint(ctx: Context) -> Result<()> { + ctx.accounts.disable_mint() + } + /// Initializes the bless meta state with the payer designated as the admin. /// This function can only be called once. pub fn initialize_bless_token_meta_state( diff --git a/anchor/src/client/bless_token_client.ts b/anchor/src/client/bless_token_client.ts index 64b3bf5..80d0b0a 100644 --- a/anchor/src/client/bless_token_client.ts +++ b/anchor/src/client/bless_token_client.ts @@ -116,6 +116,39 @@ export class BlsTokenClient { return this.baseClient.sendAndConfirm(versioned, txOptions.signerKeypair); } + public async getDisableMintTx( + blessMint: PublicKey, + txOptions: TxOptions = {}, + ): Promise { + let preIxs: TransactionInstruction[] = []; + if (txOptions?.preInstructions) { + preIxs = txOptions?.preInstructions; + } + + const payer: PublicKey = txOptions.signer || this.baseClient.getSigner(); + const tx = await this.baseClient.program.methods + .disableBlessMint() + .accountsPartial({ + payer, + blessMint, + }) + .preInstructions(preIxs) + .transaction(); + return tx; + } + + public async disableMint( + blessMint: PublicKey, + txOptions: TxOptions = {}, + ): Promise { + const tx = await this.getDisableMintTx(blessMint, txOptions); + const versioned = await this.baseClient.getVersionedTransaction({ + tx, + ...txOptions, + }); + return this.baseClient.sendAndConfirm(versioned, txOptions.signerKeypair); + } + public async getCreateMetadataTx( blessMint: PublicKey, admin: PublicKey, diff --git a/anchor/tests/bless_token.test.ts b/anchor/tests/bless_token.test.ts index 6264a7b..9f192c2 100644 --- a/anchor/tests/bless_token.test.ts +++ b/anchor/tests/bless_token.test.ts @@ -11,6 +11,7 @@ import { Account, createMint, getAccount, + getMint, getOrCreateAssociatedTokenAccount, } from "@solana/spl-token"; import { BlessTokenAccounts } from "../src/client/bless_token_client"; @@ -190,4 +191,27 @@ describe("bless token tests.", () => { const state = await blessTokenClient.getBlessTokenMetaState(mint!); expect(state.admin.toBase58()).eq(pendingAdmin.publicKey.toBase58()); }); + + it("disable mint should fail when current authority is invalid", async () => { + let hasExpectedError = false; + try { + await blessTokenClient.disableMint(mint!, { + signer: pendingAdmin.publicKey, + signerKeypair: [pendingAdmin, wallet], + }); + } catch (e) { + const msg = String(e); + hasExpectedError = + msg.includes("Invalid mint authority") || + msg.includes("InvalidMintAuthority"); + } + expect(hasExpectedError).eq(true); + + const [blessStatePda] = PublicKey.findProgramAddressSync( + [Buffer.from("bless_contract_state"), mint.toBuffer()], + client.programId, + ); + const mintInfo = await getMint(connection, mint); + expect(mintInfo.mintAuthority?.toBase58()).eq(blessStatePda.toBase58()); + }); }); From 90a2fea2d7ce125e91c9ead7a6a62b14484b7cfd Mon Sep 17 00:00:00 2001 From: Joinhack Date: Sat, 28 Feb 2026 19:07:51 +0800 Subject: [PATCH 2/3] update dependency --- anchor/Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/anchor/Cargo.lock b/anchor/Cargo.lock index 9c73c75..5cff1d8 100644 --- a/anchor/Cargo.lock +++ b/anchor/Cargo.lock @@ -1375,9 +1375,9 @@ dependencies = [ [[package]] name = "solana-account-info" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c17d606a298a205fae325489fbed88ee6dc4463c111672172327e741c8905d" +checksum = "c8f5152a288ef1912300fc6efa6c2d1f9bb55d9398eb6c72326360b8063987da" dependencies = [ "bincode", "serde", @@ -1640,9 +1640,9 @@ dependencies = [ [[package]] name = "solana-instructions-sysvar" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427f2d0d6dc0bb49f16cef5e7f975180d2e80aab9bdd3b2af68e2d029ec63f43" +checksum = "e0e85a6fad5c2d0c4f5b91d34b8ca47118fc593af706e523cdbedf846a954f57" dependencies = [ "bitflags", "solana-account-info", From 9eebae4e5dd1f4f64a4e0ef23251ad07c8e269c5 Mon Sep 17 00:00:00 2001 From: Joinhack Date: Thu, 5 Mar 2026 16:11:54 +0800 Subject: [PATCH 3/3] disable the initialize_bless_token instruction --- anchor/programs/bless-token/src/lib.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/anchor/programs/bless-token/src/lib.rs b/anchor/programs/bless-token/src/lib.rs index 9344d69..bac525f 100644 --- a/anchor/programs/bless-token/src/lib.rs +++ b/anchor/programs/bless-token/src/lib.rs @@ -17,10 +17,11 @@ pub mod bless_token { use super::*; /// initial bless token state function - pub fn initialize_bless_token(ctx: Context) -> Result<()> { - let bump = ctx.bumps.bless_state; - ctx.accounts.init(bump) - } + /// Plan B: disable the instruction to limit the size of the contract. + // pub fn initialize_bless_token(ctx: Context) -> Result<()> { + // let bump = ctx.bumps.bless_state; + // ctx.accounts.init(bump) + // } /// Permanently disable mint authority for the bless token. pub fn disable_bless_mint(ctx: Context) -> Result<()> {