diff --git a/Cargo.lock b/Cargo.lock index 8628ce825..befd54d3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1899,7 +1899,9 @@ dependencies = [ "serde-big-array", "solana-account", "solana-instruction", + "solana-program-pack", "solana-pubkey", + "spl-token-2022 9.0.0", ] [[package]] @@ -1917,7 +1919,7 @@ dependencies = [ "solana-instruction", "solana-program-pack", "solana-pubkey", - "spl-token 6.0.0", + "spl-token 8.0.0", "sqlx", "sqlx_migrator", ] @@ -6371,8 +6373,8 @@ dependencies = [ "solana-sysvar", "spl-token 7.0.0", "spl-token-2022 7.0.0", - "spl-token-group-interface", - "spl-token-metadata-interface", + "spl-token-group-interface 0.5.0", + "spl-token-metadata-interface 0.6.0", "thiserror 2.0.12", "zstd", ] @@ -8685,8 +8687,8 @@ dependencies = [ "spl-memo 6.0.0", "spl-token 7.0.0", "spl-token-2022 7.0.0", - "spl-token-group-interface", - "spl-token-metadata-interface", + "spl-token-group-interface 0.5.0", + "spl-token-metadata-interface 0.6.0", "thiserror 2.0.12", ] @@ -8953,7 +8955,31 @@ dependencies = [ "solana-program", "solana-zk-sdk", "spl-pod", - "spl-token-confidential-transfer-proof-extraction", + "spl-token-confidential-transfer-proof-extraction 0.2.1", +] + +[[package]] +name = "spl-elgamal-registry" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56cc66fe64651a48c8deb4793d8a5deec8f8faf19f355b9df294387bc5a36b5f" +dependencies = [ + "bytemuck", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-security-txt", + "solana-system-interface", + "solana-sysvar", + "solana-zk-sdk", + "spl-pod", + "spl-token-confidential-transfer-proof-extraction 0.4.0", ] [[package]] @@ -9008,10 +9034,25 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "solana-program", - "spl-program-error-derive", + "spl-program-error-derive 0.4.1", "thiserror 1.0.69", ] +[[package]] +name = "spl-program-error" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdebc8b42553070b75aa5106f071fef2eb798c64a7ec63375da4b1f058688c6" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-decode-error", + "solana-msg", + "solana-program-error", + "spl-program-error-derive 0.5.0", + "thiserror 2.0.12", +] + [[package]] name = "spl-program-error-derive" version = "0.4.1" @@ -9024,6 +9065,18 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "spl-program-error-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2539e259c66910d78593475540e8072f0b10f0f61d7607bbf7593899ed52d0" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.9", + "syn 2.0.101", +] + [[package]] name = "spl-tlv-account-resolution" version = "0.9.0" @@ -9041,11 +9094,33 @@ dependencies = [ "solana-pubkey", "spl-discriminator", "spl-pod", - "spl-program-error", - "spl-type-length-value", + "spl-program-error 0.6.0", + "spl-type-length-value 0.7.0", "thiserror 1.0.69", ] +[[package]] +name = "spl-tlv-account-resolution" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1408e961215688715d5a1063cbdcf982de225c45f99c82b4f7d7e1dd22b998d7" +dependencies = [ + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "solana-account-info", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator", + "spl-pod", + "spl-program-error 0.7.0", + "spl-type-length-value 0.8.0", + "thiserror 2.0.12", +] + [[package]] name = "spl-token" version = "6.0.0" @@ -9076,6 +9151,34 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "spl-token" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053067c6a82c705004f91dae058b11b4780407e9ccd6799dc9e7d0fab5f242da" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum", + "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" @@ -9090,17 +9193,17 @@ dependencies = [ "solana-program", "solana-security-txt", "solana-zk-sdk", - "spl-elgamal-registry", + "spl-elgamal-registry 0.1.1", "spl-memo 6.0.0", "spl-pod", "spl-token 7.0.0", - "spl-token-confidential-transfer-ciphertext-arithmetic", - "spl-token-confidential-transfer-proof-extraction", + "spl-token-confidential-transfer-ciphertext-arithmetic 0.2.1", + "spl-token-confidential-transfer-proof-extraction 0.2.1", "spl-token-confidential-transfer-proof-generation 0.2.0", - "spl-token-group-interface", - "spl-token-metadata-interface", - "spl-transfer-hook-interface", - "spl-type-length-value", + "spl-token-group-interface 0.5.0", + "spl-token-metadata-interface 0.6.0", + "spl-transfer-hook-interface 0.9.0", + "spl-type-length-value 0.7.0", "thiserror 1.0.69", ] @@ -9118,17 +9221,61 @@ dependencies = [ "solana-program", "solana-security-txt", "solana-zk-sdk", - "spl-elgamal-registry", + "spl-elgamal-registry 0.1.1", "spl-memo 6.0.0", "spl-pod", "spl-token 7.0.0", - "spl-token-confidential-transfer-ciphertext-arithmetic", - "spl-token-confidential-transfer-proof-extraction", + "spl-token-confidential-transfer-ciphertext-arithmetic 0.2.1", + "spl-token-confidential-transfer-proof-extraction 0.2.1", "spl-token-confidential-transfer-proof-generation 0.3.0", - "spl-token-group-interface", - "spl-token-metadata-interface", - "spl-transfer-hook-interface", - "spl-type-length-value", + "spl-token-group-interface 0.5.0", + "spl-token-metadata-interface 0.6.0", + "spl-transfer-hook-interface 0.9.0", + "spl-type-length-value 0.7.0", + "thiserror 2.0.12", +] + +[[package]] +name = "spl-token-2022" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707d8237d17d857246b189d0fb278797dcd7cf6219374547791b231fd35a8cc8" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum", + "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 0.3.0", + "spl-memo 6.0.0", + "spl-pod", + "spl-token 8.0.0", + "spl-token-confidential-transfer-ciphertext-arithmetic 0.3.0", + "spl-token-confidential-transfer-proof-extraction 0.4.0", + "spl-token-confidential-transfer-proof-generation 0.4.0", + "spl-token-group-interface 0.6.0", + "spl-token-metadata-interface 0.7.0", + "spl-transfer-hook-interface 0.10.0", + "spl-type-length-value 0.8.0", "thiserror 2.0.12", ] @@ -9144,6 +9291,18 @@ dependencies = [ "solana-zk-sdk", ] +[[package]] +name = "spl-token-confidential-transfer-ciphertext-arithmetic" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94ab20faf7b5edaa79acd240e0f21d5a2ef936aa99ed98f698573a2825b299c4" +dependencies = [ + "base64 0.22.1", + "bytemuck", + "solana-curve25519", + "solana-zk-sdk", +] + [[package]] name = "spl-token-confidential-transfer-proof-extraction" version = "0.2.1" @@ -9158,6 +9317,26 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "spl-token-confidential-transfer-proof-extraction" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bedc4675c80409a004da46978674e4073c65c4b1c611bf33d120381edeffe036" +dependencies = [ + "bytemuck", + "solana-account-info", + "solana-curve25519", + "solana-instruction", + "solana-instructions-sysvar", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "solana-sdk-ids", + "solana-zk-sdk", + "spl-pod", + "thiserror 2.0.12", +] + [[package]] name = "spl-token-confidential-transfer-proof-generation" version = "0.2.0" @@ -9180,6 +9359,17 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "spl-token-confidential-transfer-proof-generation" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae5b124840d4aed474cef101d946a798b806b46a509ee4df91021e1ab1cef3ef" +dependencies = [ + "curve25519-dalek 4.1.3", + "solana-zk-sdk", + "thiserror 2.0.12", +] + [[package]] name = "spl-token-group-interface" version = "0.5.0" @@ -9199,6 +9389,25 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "spl-token-group-interface" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5597b4cd76f85ce7cd206045b7dc22da8c25516573d42d267c8d1fd128db5129" +dependencies = [ + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator", + "spl-pod", + "thiserror 2.0.12", +] + [[package]] name = "spl-token-metadata-interface" version = "0.6.0" @@ -9216,10 +9425,31 @@ dependencies = [ "solana-pubkey", "spl-discriminator", "spl-pod", - "spl-type-length-value", + "spl-type-length-value 0.7.0", "thiserror 1.0.69", ] +[[package]] +name = "spl-token-metadata-interface" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "304d6e06f0de0c13a621464b1fd5d4b1bebf60d15ca71a44d3839958e0da16ee" +dependencies = [ + "borsh 1.5.7", + "num-derive 0.4.2", + "num-traits", + "solana-borsh", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator", + "spl-pod", + "spl-type-length-value 0.8.0", + "thiserror 2.0.12", +] + [[package]] name = "spl-transfer-hook-interface" version = "0.9.0" @@ -9239,12 +9469,37 @@ dependencies = [ "solana-pubkey", "spl-discriminator", "spl-pod", - "spl-program-error", - "spl-tlv-account-resolution", - "spl-type-length-value", + "spl-program-error 0.6.0", + "spl-tlv-account-resolution 0.9.0", + "spl-type-length-value 0.7.0", "thiserror 1.0.69", ] +[[package]] +name = "spl-transfer-hook-interface" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e905b849b6aba63bde8c4badac944ebb6c8e6e14817029cbe1bc16829133bd" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "solana-account-info", + "solana-cpi", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "spl-discriminator", + "spl-pod", + "spl-program-error 0.7.0", + "spl-tlv-account-resolution 0.10.0", + "spl-type-length-value 0.8.0", + "thiserror 2.0.12", +] + [[package]] name = "spl-type-length-value" version = "0.7.0" @@ -9263,6 +9518,24 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "spl-type-length-value" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d417eb548214fa822d93f84444024b4e57c13ed6719d4dcc68eec24fb481e9f5" +dependencies = [ + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "solana-account-info", + "solana-decode-error", + "solana-msg", + "solana-program-error", + "spl-discriminator", + "spl-pod", + "thiserror 2.0.12", +] + [[package]] name = "sqlx" version = "0.8.6" @@ -9750,7 +10023,7 @@ dependencies = [ "log", "rustls 0.23.27", "solana-account", - "spl-token 6.0.0", + "spl-token 8.0.0", "tokio", "yellowstone-grpc-proto", ] diff --git a/Cargo.toml b/Cargo.toml index ed1549215..43518d136 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -156,7 +156,8 @@ solana-transaction = "~2.2" solana-transaction-context = "~2.2" solana-transaction-status = "~2.2" spl-memo = "5.0.0" -spl-token = "6.0.0" +spl-token = "8.0.0" +spl-token-2022 = "9.0.0" sqlx = { version = "0.8.5", features = [ "macros", "runtime-tokio-rustls", diff --git a/decoders/token-2022-decoder/Cargo.toml b/decoders/token-2022-decoder/Cargo.toml index ad2e54f23..1a27726c8 100644 --- a/decoders/token-2022-decoder/Cargo.toml +++ b/decoders/token-2022-decoder/Cargo.toml @@ -18,4 +18,6 @@ serde = { workspace = true } serde-big-array = { workspace = true } solana-account = { workspace = true } solana-instruction = { workspace = true, default-features = false } +solana-program-pack = { workspace = true } solana-pubkey = { workspace = true } +spl-token-2022 = { workspace = true, features = ["no-entrypoint"] } diff --git a/decoders/token-2022-decoder/src/accounts/mint.rs b/decoders/token-2022-decoder/src/accounts/mint.rs deleted file mode 100644 index 52c5ab8be..000000000 --- a/decoders/token-2022-decoder/src/accounts/mint.rs +++ /dev/null @@ -1,13 +0,0 @@ -use carbon_core::{borsh, CarbonDeserialize}; - -#[derive( - CarbonDeserialize, Debug, serde::Deserialize, serde::Serialize, PartialEq, Eq, Clone, Hash, -)] -#[carbon(discriminator = "0x6a5edd53c00a4a4a")] -pub struct Mint { - pub mint_authority: Option, - pub supply: u64, - pub decimals: u8, - pub is_initialized: bool, - pub freeze_authority: Option, -} diff --git a/decoders/token-2022-decoder/src/accounts/mod.rs b/decoders/token-2022-decoder/src/accounts/mod.rs index f8d9bad15..cd301ec82 100644 --- a/decoders/token-2022-decoder/src/accounts/mod.rs +++ b/decoders/token-2022-decoder/src/accounts/mod.rs @@ -1,29 +1,32 @@ use { super::Token2022Decoder, - crate::PROGRAM_ID, - carbon_core::{account::AccountDecoder, deserialize::CarbonDeserialize}, + carbon_core::account::AccountDecoder, + solana_account::ReadableAccount, + solana_program_pack::Pack, + spl_token_2022::{ + extension::StateWithExtensions, + state::{Account as TokenAccount, Mint, Multisig}, + }, }; -pub mod mint; -pub mod multisig; -pub mod token; -pub enum Token2022Account { - Mint(mint::Mint), - Token(token::Token), - Multisig(multisig::Multisig), +pub enum Token2022Account<'data> { + Mint(StateWithExtensions<'data, Mint>), + Token(StateWithExtensions<'data, TokenAccount>), + Multisig(Multisig), } -impl AccountDecoder<'_> for Token2022Decoder { - type AccountType = Token2022Account; +impl<'data> AccountDecoder<'data> for Token2022Decoder { + type AccountType = Token2022Account<'data>; + fn decode_account( &self, - account: &solana_account::Account, + account: &'data solana_account::Account, ) -> Option> { - if !account.owner.eq(&PROGRAM_ID) { + if !account.owner.eq(&spl_token_2022::id()) { return None; } - if let Some(decoded_account) = mint::Mint::deserialize(account.data.as_slice()) { + if let Ok(decoded_account) = StateWithExtensions::::unpack(account.data()) { return Some(carbon_core::account::DecodedAccount { lamports: account.lamports, data: Token2022Account::Mint(decoded_account), @@ -33,7 +36,7 @@ impl AccountDecoder<'_> for Token2022Decoder { }); } - if let Some(decoded_account) = token::Token::deserialize(account.data.as_slice()) { + if let Ok(decoded_account) = StateWithExtensions::::unpack(account.data()) { return Some(carbon_core::account::DecodedAccount { lamports: account.lamports, data: Token2022Account::Token(decoded_account), @@ -43,7 +46,7 @@ impl AccountDecoder<'_> for Token2022Decoder { }); } - if let Some(decoded_account) = multisig::Multisig::deserialize(account.data.as_slice()) { + if let Ok(decoded_account) = Multisig::unpack(account.data()) { return Some(carbon_core::account::DecodedAccount { lamports: account.lamports, data: Token2022Account::Multisig(decoded_account), diff --git a/decoders/token-2022-decoder/src/accounts/multisig.rs b/decoders/token-2022-decoder/src/accounts/multisig.rs deleted file mode 100644 index 7cdae695e..000000000 --- a/decoders/token-2022-decoder/src/accounts/multisig.rs +++ /dev/null @@ -1,12 +0,0 @@ -use carbon_core::{borsh, CarbonDeserialize}; - -#[derive( - CarbonDeserialize, Debug, serde::Deserialize, serde::Serialize, PartialEq, Eq, Clone, Hash, -)] -#[carbon(discriminator = "0x032c5eecdd46ac85")] -pub struct Multisig { - pub m: u8, - pub n: u8, - pub is_initialized: bool, - pub signers: [solana_pubkey::Pubkey; 11], -} diff --git a/decoders/token-2022-decoder/src/accounts/token.rs b/decoders/token-2022-decoder/src/accounts/token.rs deleted file mode 100644 index 19d619173..000000000 --- a/decoders/token-2022-decoder/src/accounts/token.rs +++ /dev/null @@ -1,19 +0,0 @@ -use { - super::super::types::*, - carbon_core::{borsh, CarbonDeserialize}, -}; - -#[derive( - CarbonDeserialize, Debug, serde::Deserialize, serde::Serialize, PartialEq, Eq, Clone, Hash, -)] -#[carbon(discriminator = "0xc971463ece9dd1b2")] -pub struct Token { - pub mint: solana_pubkey::Pubkey, - pub owner: solana_pubkey::Pubkey, - pub amount: u64, - pub delegate: Option, - pub state: AccountState, - pub is_native: Option, - pub delegated_amount: u64, - pub close_authority: Option, -} diff --git a/decoders/token-2022-decoder/src/instructions/mod.rs b/decoders/token-2022-decoder/src/instructions/mod.rs index 897bfa6fb..69bb7059b 100644 --- a/decoders/token-2022-decoder/src/instructions/mod.rs +++ b/decoders/token-2022-decoder/src/instructions/mod.rs @@ -1,5 +1,3 @@ -use crate::PROGRAM_ID; - use super::Token2022Decoder; pub mod amount_to_ui_amount; pub mod apply_confidential_pending_balance; @@ -187,7 +185,7 @@ impl carbon_core::instruction::InstructionDecoder<'_> for Token2022Decoder { &self, instruction: &solana_instruction::Instruction, ) -> Option> { - if !instruction.program_id.eq(&PROGRAM_ID) { + if !instruction.program_id.eq(&spl_token_2022::id()) { return None; } diff --git a/decoders/token-2022-decoder/src/lib.rs b/decoders/token-2022-decoder/src/lib.rs index 1768be314..fc011f49a 100644 --- a/decoders/token-2022-decoder/src/lib.rs +++ b/decoders/token-2022-decoder/src/lib.rs @@ -7,5 +7,4 @@ pub mod accounts; pub mod instructions; pub mod types; -pub const PROGRAM_ID: Pubkey = - Pubkey::from_str_const("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); +pub const PROGRAM_ID: Pubkey = spl_token_2022::id(); diff --git a/decoders/token-program-decoder/Cargo.toml b/decoders/token-program-decoder/Cargo.toml index d7b8ebcea..9d61b9711 100644 --- a/decoders/token-program-decoder/Cargo.toml +++ b/decoders/token-program-decoder/Cargo.toml @@ -28,6 +28,6 @@ solana-account = { workspace = true } solana-instruction = { workspace = true, default-features = false } solana-program-pack = { workspace = true } solana-pubkey = { workspace = true } -spl-token = { workspace = true } +spl-token = { workspace = true, features = ["no-entrypoint"] } sqlx = { workspace = true, optional = true } sqlx_migrator = { workspace = true, optional = true }