Просмотр исходного кода

deps: Upgrade to SDK v3 (#92)

#### Problem

SDK v3 has been out for some time, but the sample program and CLI have
not been upgraded to it.

#### Summary of changes

Do all the upgrades! This PR also uses the split-up crates, including
SPL interface crates instead of program crates. To properly use the
interface crate, also add the token-2022 BPF program as a fixture.

Also add a `TryFrom<u32>` implementation for TransferHookError, and stop
using solana-program in the interface.
Jon C 2 недель назад
Родитель
Сommit
dfca33e58f

Разница между файлами не показана из-за своего большого размера
+ 437 - 154
Cargo.lock


+ 20 - 12
clients/cli/Cargo.toml

@@ -12,16 +12,21 @@ edition = { workspace = true }
 [dependencies]
 clap = { version = "3", features = ["cargo"] }
 futures-util = "0.3.31"
-solana-clap-v3-utils = "2.3.4"
-solana-cli-config = "2.3.4"
-solana-client = "2.3.4"
+solana-clap-v3-utils = "3.0.0"
+solana-cli-config = "3.0.0"
+solana-client = "3.0.0"
+solana-commitment-config = "3.0.0"
+solana-instruction = "3.0.0"
 solana-logger = "3.0.0"
-solana-remote-wallet = "2.3.4"
-solana-sdk = "2.2.1"
-solana-sdk-ids = "2.2.1"
-solana-system-interface = "1"
-spl-tlv-account-resolution = { version = "0.10.0", features = ["serde-traits"] }
-spl-transfer-hook-interface = "0.10.0"
+solana-pubkey = "3.0.0"
+solana-remote-wallet = "3.0.0"
+solana-sdk-ids = "3.0.0"
+solana-signature = "3.0.0"
+solana-signer = "3.0.0"
+solana-system-interface = "2"
+solana-transaction = "3.0.0"
+spl-tlv-account-resolution = { version = "0.11.0", features = ["serde-traits"] }
+spl-transfer-hook-interface = { version = "2.0.0", path = "../../interface" }
 strum = "0.27"
 strum_macros = "0.27"
 tokio = { version = "1", features = ["full"] }
@@ -30,9 +35,12 @@ serde_json = "1.0.142"
 serde_yaml = "0.9.34"
 
 [dev-dependencies]
-solana-test-validator = "2.3.4"
-spl-token-2022 = { version = "9.0.0", features = ["no-entrypoint"] }
-spl-token-client = "0.16.1"
+solana-account = "3.0.0"
+solana-keypair = "3.0.0"
+solana-program-option = "3.0.0"
+solana-test-validator = "3.0.0"
+spl-token-2022-interface = "2.0.0"
+spl-token-client = "0.18.0"
 spl-transfer-hook-example = { version = "0.6.0", path = "../../program" }
 
 [lints]

+ 13 - 14
clients/cli/src/main.rs

@@ -12,15 +12,14 @@ use {
         keypair::signer_from_path,
     },
     solana_client::nonblocking::rpc_client::RpcClient,
+    solana_commitment_config::CommitmentConfig,
+    solana_instruction::Instruction,
+    solana_pubkey::Pubkey,
     solana_remote_wallet::remote_wallet::RemoteWalletManager,
-    solana_sdk::{
-        commitment_config::CommitmentConfig,
-        instruction::Instruction,
-        pubkey::Pubkey,
-        signature::{Signature, Signer},
-        transaction::Transaction,
-    },
+    solana_signature::Signature,
+    solana_signer::Signer,
     solana_system_interface::{instruction as system_instruction, program as system_program},
+    solana_transaction::Transaction,
     spl_tlv_account_resolution::{account::ExtraAccountMeta, state::ExtraAccountMetaList},
     spl_transfer_hook_interface::{
         get_extra_account_metas_address,
@@ -533,13 +532,13 @@ extraMetas:
 mod test {
     use {
         super::*,
-        solana_sdk::{
-            account::Account, instruction::AccountMeta, program_option::COption,
-            signer::keypair::Keypair,
-        },
+        solana_account::Account,
+        solana_instruction::AccountMeta,
+        solana_keypair::Keypair,
+        solana_program_option::COption,
         solana_sdk_ids::bpf_loader_upgradeable,
         solana_test_validator::{TestValidator, TestValidatorGenesis, UpgradeableProgramInfo},
-        spl_token_2022::{
+        spl_token_2022_interface::{
             extension::{ExtensionType, StateWithExtensionsMut},
             state::Mint,
         },
@@ -582,7 +581,7 @@ mod test {
             Account {
                 lamports: 1_000_000_000,
                 data: mint_data,
-                owner: spl_token_2022::id(),
+                owner: spl_token_2022_interface::id(),
                 ..Account::default()
             }
             .into(),
@@ -607,7 +606,7 @@ mod test {
 
         let token = Token::new(
             client.clone(),
-            &spl_token_2022::id(),
+            &spl_token_2022_interface::id(),
             &spl_transfer_hook_example::mint::id(),
             Some(decimals),
             payer.clone(),

+ 1 - 1
clients/cli/src/meta.rs

@@ -1,6 +1,6 @@
 use {
     serde::{Deserialize, Serialize},
-    solana_sdk::pubkey::Pubkey,
+    solana_pubkey::Pubkey,
     spl_tlv_account_resolution::{account::ExtraAccountMeta, seeds::Seed},
     std::{path::Path, str::FromStr},
     strum_macros::{EnumString, IntoStaticStr},

+ 1 - 1
interface/Cargo.toml

@@ -36,7 +36,7 @@ crate-type = ["lib"]
 workspace = true
 
 [dev-dependencies]
-solana-program = "2.3.0"
+solana-sha256-hasher = "3.0.0"
 tokio = { version = "1.47.1", features = ["full"] }
 
 [package.metadata.docs.rs]

+ 7 - 0
interface/src/error.rs

@@ -40,3 +40,10 @@ impl ToStr for TransferHookError {
         }
     }
 }
+
+impl TryFrom<u32> for TransferHookError {
+    type Error = ProgramError;
+    fn try_from(code: u32) -> Result<Self, Self::Error> {
+        num_traits::FromPrimitive::from_u32(code).ok_or(ProgramError::InvalidArgument)
+    }
+}

+ 5 - 4
interface/src/instruction.rs

@@ -252,7 +252,9 @@ pub fn update_extra_account_meta_list(
 
 #[cfg(test)]
 mod test {
-    use {super::*, crate::NAMESPACE, solana_program::hash, spl_pod::bytemuck::pod_from_bytes};
+    use {
+        super::*, crate::NAMESPACE, solana_sha256_hasher::hashv, spl_pod::bytemuck::pod_from_bytes,
+    };
 
     #[test]
     fn system_program_id() {
@@ -266,7 +268,7 @@ mod test {
         let packed = check.pack();
         // Please use ExecuteInstruction::SPL_DISCRIMINATOR in your program, the
         // following is just for test purposes
-        let preimage = hash::hashv(&[format!("{NAMESPACE}:execute").as_bytes()]);
+        let preimage = hashv(&[format!("{NAMESPACE}:execute").as_bytes()]);
         let discriminator = &preimage.as_ref()[..ArrayDiscriminator::LENGTH];
         let mut expect = vec![];
         expect.extend_from_slice(discriminator.as_ref());
@@ -296,8 +298,7 @@ mod test {
         let packed = check.pack();
         // Please use INITIALIZE_EXTRA_ACCOUNT_METAS_DISCRIMINATOR in your program,
         // the following is just for test purposes
-        let preimage =
-            hash::hashv(&[format!("{NAMESPACE}:initialize-extra-account-metas").as_bytes()]);
+        let preimage = hashv(&[format!("{NAMESPACE}:initialize-extra-account-metas").as_bytes()]);
         let discriminator = &preimage.as_ref()[..ArrayDiscriminator::LENGTH];
         let mut expect = vec![];
         expect.extend_from_slice(discriminator.as_ref());

+ 12 - 8
program/Cargo.toml

@@ -16,17 +16,21 @@ forbid-additional-mints = []
 
 [dependencies]
 arrayref = "0.3.9"
-solana-program = "2.3.0"
-solana-system-interface = "1"
-spl-tlv-account-resolution = "0.10.0"
-spl-token-2022 = { version = "9.0.0", features = ["no-entrypoint"] }
-spl-transfer-hook-interface = "0.10.0"
+solana-account-info = "3.0.0"
+solana-cpi = "3.0.0"
+solana-msg = "3.0.0"
+solana-program-entrypoint = "3.0.0"
+solana-program-error = "3.0.0"
+solana-pubkey = "3.0.0"
+solana-system-interface = { version = "2", features = ["bincode"] }
+spl-tlv-account-resolution = "0.11.0"
+spl-token-2022-interface = "2.0.0"
+spl-transfer-hook-interface = { version = "2.0.0", path = "../interface" }
 spl-type-length-value = "0.9.0"
 
 [dev-dependencies]
-solana-program-test = "2.3.4"
-solana-sdk = "2.2.1"
-solana-system-interface = "1"
+solana-program-test = "3.0.0"
+solana-sdk = "3.0.0"
 
 [lib]
 crate-type = ["cdylib", "lib"]

+ 4 - 8
program/src/entrypoint.rs

@@ -1,23 +1,19 @@
 //! Program entrypoint
 
 use {
-    crate::processor,
-    solana_program::{
-        account_info::AccountInfo, entrypoint::ProgramResult, program_error::PrintProgramError,
-        pubkey::Pubkey,
-    },
+    crate::processor, solana_account_info::AccountInfo, solana_msg::msg,
+    solana_program_error::ProgramResult, solana_pubkey::Pubkey,
     spl_transfer_hook_interface::error::TransferHookError,
 };
 
-solana_program::entrypoint!(process_instruction);
+solana_program_entrypoint::entrypoint!(process_instruction);
 fn process_instruction(
     program_id: &Pubkey,
     accounts: &[AccountInfo],
     instruction_data: &[u8],
 ) -> ProgramResult {
     if let Err(error) = processor::process(program_id, accounts, instruction_data) {
-        // catch the error so we can print it
-        error.print::<TransferHookError>();
+        msg!(error.to_str::<TransferHookError>());
         return Err(error);
     }
     Ok(())

+ 1 - 5
program/src/lib.rs

@@ -13,10 +13,6 @@ pub mod state;
 #[cfg(not(feature = "no-entrypoint"))]
 mod entrypoint;
 
-// Export current sdk types for downstream users building with a different sdk
-// version
-pub use solana_program;
-
 /// Place the mint id that you want to target with your transfer hook program.
 /// Any other mint will fail to initialize, protecting the transfer hook program
 /// from rogue mints trying to get access to accounts.
@@ -26,5 +22,5 @@ pub use solana_program;
 /// unsafe, this simple example implementation only allows for one mint.
 #[cfg(feature = "forbid-additional-mints")]
 pub mod mint {
-    solana_program::declare_id!("Mint111111111111111111111111111111111111111");
+    solana_pubkey::declare_id!("Mint111111111111111111111111111111111111111");
 }

+ 6 - 9
program/src/processor.rs

@@ -1,17 +1,14 @@
 //! Program state processor
 
 use {
-    solana_program::{
-        account_info::{next_account_info, AccountInfo},
-        entrypoint::ProgramResult,
-        msg,
-        program::invoke_signed,
-        program_error::ProgramError,
-        pubkey::Pubkey,
-    },
+    solana_account_info::{next_account_info, AccountInfo},
+    solana_cpi::invoke_signed,
+    solana_msg::msg,
+    solana_program_error::{ProgramError, ProgramResult},
+    solana_pubkey::Pubkey,
     solana_system_interface::instruction as system_instruction,
     spl_tlv_account_resolution::{account::ExtraAccountMeta, state::ExtraAccountMetaList},
-    spl_token_2022::{
+    spl_token_2022_interface::{
         extension::{
             transfer_hook::TransferHookAccount, BaseStateWithExtensions, StateWithExtensions,
         },

+ 1 - 1
program/src/state.rs

@@ -1,7 +1,7 @@
 //! State helpers for working with the example program
 
 use {
-    solana_program::program_error::ProgramError,
+    solana_program_error::ProgramError,
     spl_tlv_account_resolution::{account::ExtraAccountMeta, state::ExtraAccountMetaList},
     spl_transfer_hook_interface::instruction::ExecuteInstruction,
 };

BIN
program/tests/fixtures/spl_token_2022.so


+ 10 - 15
program/tests/functional.rs

@@ -22,7 +22,7 @@ use {
         account::ExtraAccountMeta, error::AccountResolutionError, seeds::Seed,
         state::ExtraAccountMetaList,
     },
-    spl_token_2022::{
+    spl_token_2022_interface::{
         extension::{
             transfer_hook::TransferHookAccount, BaseStateWithExtensionsMut, ExtensionType,
             StateWithExtensionsMut,
@@ -47,13 +47,8 @@ fn setup(program_id: &Pubkey) -> ProgramTest {
         processor!(spl_transfer_hook_example::processor::process),
     );
 
-    program_test.prefer_bpf(false); // simplicity in the build
-
-    program_test.add_program(
-        "spl_token_2022",
-        spl_token_2022::id(),
-        processor!(spl_token_2022::processor::Processor::process),
-    );
+    program_test.add_program("spl_token_2022", spl_token_2022_interface::id(), None);
+    program_test.prefer_bpf(false);
 
     program_test
 }
@@ -141,7 +136,7 @@ async fn success_execute() {
     let program_id = Pubkey::new_unique();
     let mut program_test = setup(&program_id);
 
-    let token_program_id = spl_token_2022::id();
+    let token_program_id = spl_token_2022_interface::id();
     let wallet = Keypair::new();
     let mint_address = spl_transfer_hook_example::mint::id();
     let mint_authority = Keypair::new();
@@ -438,7 +433,7 @@ async fn fail_incorrect_derivation() {
     let program_id = Pubkey::new_unique();
     let mut program_test = setup(&program_id);
 
-    let token_program_id = spl_token_2022::id();
+    let token_program_id = spl_token_2022_interface::id();
     let wallet = Keypair::new();
     let mint_address = spl_transfer_hook_example::mint::id();
     let mint_authority = Keypair::new();
@@ -501,7 +496,7 @@ async fn fail_incorrect_mint() {
     let program_id = Pubkey::new_unique();
     let mut program_test = setup(&program_id);
 
-    let token_program_id = spl_token_2022::id();
+    let token_program_id = spl_token_2022_interface::id();
     let wallet = Keypair::new();
     // wrong mint, only `spl_transfer_hook_example::mint::id()` allowed
     let mint_address = Pubkey::new_unique();
@@ -592,7 +587,7 @@ async fn success_on_chain_invoke() {
         processor!(process_instruction),
     );
 
-    let token_program_id = spl_token_2022::id();
+    let token_program_id = spl_token_2022_interface::id();
     let wallet = Keypair::new();
     let mint_address = spl_transfer_hook_example::mint::id();
     let mint_authority = Keypair::new();
@@ -735,7 +730,7 @@ async fn fail_without_transferring_flag() {
     let program_id = Pubkey::new_unique();
     let mut program_test = setup(&program_id);
 
-    let token_program_id = spl_token_2022::id();
+    let token_program_id = spl_token_2022_interface::id();
     let wallet = Keypair::new();
     let mint_address = spl_transfer_hook_example::mint::id();
     let mint_authority = Keypair::new();
@@ -829,7 +824,7 @@ async fn success_on_chain_invoke_with_updated_extra_account_metas() {
         processor!(process_instruction),
     );
 
-    let token_program_id = spl_token_2022::id();
+    let token_program_id = spl_token_2022_interface::id();
     let wallet = Keypair::new();
     let mint_address = spl_transfer_hook_example::mint::id();
     let mint_authority = Keypair::new();
@@ -1032,7 +1027,7 @@ async fn success_execute_with_updated_extra_account_metas() {
     let program_id = Pubkey::new_unique();
     let mut program_test = setup(&program_id);
 
-    let token_program_id = spl_token_2022::id();
+    let token_program_id = spl_token_2022_interface::id();
     let wallet = Keypair::new();
     let mint_address = spl_transfer_hook_example::mint::id();
     let mint_authority = Keypair::new();

Некоторые файлы не были показаны из-за большого количества измененных файлов