diff --git a/docs/src/pages/docs/the-accounts-struct.md b/docs/src/pages/docs/the-accounts-struct.md index a8c6865ced..2f1cd76e09 100644 --- a/docs/src/pages/docs/the-accounts-struct.md +++ b/docs/src/pages/docs/the-accounts-struct.md @@ -138,7 +138,7 @@ You can find information about all constraints in the reference. We will cover s ## Safety checks -Two of the Anchor account types, [AccountInfo](https://docs.rs/anchor-lang/latest/anchor_lang/accounts/account_info/index.html) and [UncheckedAccount](https://docs.rs/anchor-lang/latest/anchor_lang/accounts/unchecked_account/index.html) do not implement any checks on the account being passed. Anchor implements safety checks that encourage additional documentation describing why additional checks are not necesssary. +One of the Anchor account types, [UncheckedAccount](https://docs.rs/anchor-lang/latest/anchor_lang/accounts/unchecked_account/index.html) does not implement any checks on the account being passed. Anchor implements safety checks that encourage additional documentation describing why additional checks are not necesssary. Attempting to build a program containing the following excerpt with `anchor build`: diff --git a/lang/derive/accounts/src/lib.rs b/lang/derive/accounts/src/lib.rs index dbb76b852e..0bec7b7644 100644 --- a/lang/derive/accounts/src/lib.rs +++ b/lang/derive/accounts/src/lib.rs @@ -65,9 +65,9 @@ use syn::parse_macro_input; /// Example: ///

 /// #[account(signer)]
-/// pub authority: AccountInfo<'info>,
+/// pub authority: UncheckedAccount<'info>,
 /// #[account(signer @ MyError::MyErrorCode)]
-/// pub payer: AccountInfo<'info>
+/// pub payer: UncheckedAccount<'info>
 ///                 
/// /// @@ -173,13 +173,13 @@ use syn::parse_macro_input; ///         init, payer = payer, ///         space = 8 + 8, owner = other_program.key() ///     )] -///     pub account_for_other_program: AccountInfo<'info>, +///     pub account_for_other_program: UncheckedAccount<'info>, ///     #[account( ///         init, payer = payer, space = 8 + 8, ///         owner = other_program.key(), ///         seeds = [b"other_seed"], bump ///     )] -///     pub pda_for_other_program: AccountInfo<'info>, +///     pub pda_for_other_program: UncheckedAccount<'info>, ///     #[account(mut)] ///     pub payer: Signer<'info>, ///     pub system_program: Program<'info, System>, @@ -254,21 +254,21 @@ use syn::parse_macro_input; /// #[instruction(first_bump: u8, second_bump: u8)] /// pub struct Example { /// #[account(seeds = [b"example_seed"], bump)] -/// pub canonical_pda: AccountInfo<'info>, +/// pub canonical_pda: UncheckedAccount<'info>, /// #[account( /// seeds = [b"example_seed"], /// bump, /// seeds::program = other_program.key() /// )] -/// pub canonical_pda_two: AccountInfo<'info>, +/// pub canonical_pda_two: UncheckedAccount<'info>, /// #[account(seeds = [b"other_seed"], bump = first_bump)] -/// pub arbitrary_pda: AccountInfo<'info> +/// pub arbitrary_pda: UncheckedAccount<'info> /// #[account( /// seeds = [b"other_seed"], /// bump = second_bump, /// seeds::program = other_program.key() /// )] -/// pub arbitrary_pda_two: AccountInfo<'info>, +/// pub arbitrary_pda_two: UncheckedAccount<'info>, /// pub other_program: Program<'info, OtherProgram> /// } /// @@ -337,7 +337,7 @@ use syn::parse_macro_input; /// Example: ///

 /// #[account(executable)]
-/// pub my_program: AccountInfo<'info>
+/// pub my_program: UncheckedAccount<'info>
 ///                 
/// /// @@ -356,7 +356,7 @@ use syn::parse_macro_input; /// #[account(zero, rent_exempt = skip)] /// pub skipped_account: Account<'info, MyData>, /// #[account(rent_exempt = enforce)] -/// pub enforced_account: AccountInfo<'info> +/// pub enforced_account: UncheckedAccount<'info> /// /// /// @@ -629,7 +629,7 @@ use syn::parse_macro_input; /// /// /// -#[proc_macro_derive(Accounts, attributes(account, instruction, only_cpi))] +#[proc_macro_derive(Accounts, attributes(account, instruction))] pub fn derive_anchor_deserialize(item: TokenStream) -> TokenStream { parse_macro_input!(item as anchor_syn::AccountsStruct) .to_token_stream() diff --git a/lang/src/accounts/account.rs b/lang/src/accounts/account.rs index 184b0c55b2..7d3ea2fd90 100644 --- a/lang/src/accounts/account.rs +++ b/lang/src/accounts/account.rs @@ -2,6 +2,7 @@ use crate::bpf_writer::BpfWriter; use crate::error::{Error, ErrorCode}; +use crate::prelude::UncheckedAccount; use crate::{ AccountDeserialize, AccountSerialize, Accounts, AccountsClose, AccountsExit, Key, Owner, Result, ToAccountInfo, ToAccountInfos, ToAccountMetas, @@ -429,3 +430,11 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Clone> Key for Account<'i *self.info.key } } + +impl<'info, T: AccountSerialize + AccountDeserialize + Clone> From> + for UncheckedAccount<'info> +{ + fn from(value: Account<'info, T>) -> Self { + UncheckedAccount::try_from(value.info) + } +} diff --git a/lang/src/accounts/account_info.rs b/lang/src/accounts/account_info.rs index 2cdbe6584c..6b09cb3ad5 100644 --- a/lang/src/accounts/account_info.rs +++ b/lang/src/accounts/account_info.rs @@ -1,30 +1,5 @@ -//! AccountInfo can be used as a type but -//! [Unchecked Account](crate::accounts::unchecked_account::UncheckedAccount) -//! should be used instead. - -use crate::{AccountsExit, Key, ToAccountInfos, ToAccountMetas}; -use solana_program::account_info::AccountInfo; -use solana_program::instruction::AccountMeta; -use solana_program::pubkey::Pubkey; - -impl<'info> ToAccountMetas for AccountInfo<'info> { - fn to_account_metas(&self, is_signer: Option) -> Vec { - let is_signer = is_signer.unwrap_or(self.is_signer); - let meta = match self.is_writable { - false => AccountMeta::new_readonly(*self.key, is_signer), - true => AccountMeta::new(*self.key, is_signer), - }; - vec![meta] - } -} - -impl<'info> ToAccountInfos<'info> for AccountInfo<'info> { - fn to_account_infos(&self) -> Vec> { - vec![self.clone()] - } -} - -impl<'info> AccountsExit<'info> for AccountInfo<'info> {} +use crate::Key; +use solana_program::{account_info::AccountInfo, pubkey::Pubkey}; impl<'info> Key for AccountInfo<'info> { fn key(&self) -> Pubkey { diff --git a/lang/src/accounts/account_loader.rs b/lang/src/accounts/account_loader.rs index 1d2d2861bd..322b41faaa 100644 --- a/lang/src/accounts/account_loader.rs +++ b/lang/src/accounts/account_loader.rs @@ -2,6 +2,7 @@ use crate::bpf_writer::BpfWriter; use crate::error::{Error, ErrorCode}; +use crate::prelude::UncheckedAccount; use crate::{ Accounts, AccountsClose, AccountsExit, Key, Owner, Result, ToAccountInfo, ToAccountInfos, ToAccountMetas, ZeroCopy, @@ -80,7 +81,7 @@ use std::ops::DerefMut; /// bar: AccountLoader<'info, Bar>, /// #[account(mut)] /// authority: Signer<'info>, -/// system_program: AccountInfo<'info>, +/// system_program: UncheckedAccount<'info>, /// } /// /// #[derive(Accounts)] @@ -281,3 +282,9 @@ impl<'info, T: ZeroCopy + Owner> Key for AccountLoader<'info, T> { *self.acc_info.key } } + +impl<'info, T: ZeroCopy + Owner> From> for UncheckedAccount<'info> { + fn from(value: AccountLoader<'info, T>) -> Self { + UncheckedAccount::try_from(value.acc_info) + } +} diff --git a/lang/src/accounts/boxed.rs b/lang/src/accounts/boxed.rs index b143024ead..f956fe22e4 100644 --- a/lang/src/accounts/boxed.rs +++ b/lang/src/accounts/boxed.rs @@ -13,6 +13,7 @@ //! } //! ``` +use crate::prelude::UncheckedAccount; use crate::{Accounts, AccountsClose, AccountsExit, Result, ToAccountInfos, ToAccountMetas}; use solana_program::account_info::AccountInfo; use solana_program::instruction::AccountMeta; @@ -55,3 +56,9 @@ impl<'info, T: AccountsClose<'info>> AccountsClose<'info> for Box { T::close(self, sol_destination) } } + +impl<'info, T: Into>> From> for UncheckedAccount<'info> { + fn from(value: Box) -> Self { + value.into() + } +} diff --git a/lang/src/accounts/interface.rs b/lang/src/accounts/interface.rs index 2c3e4dac86..d3bca457b0 100644 --- a/lang/src/accounts/interface.rs +++ b/lang/src/accounts/interface.rs @@ -2,6 +2,7 @@ use crate::accounts::program::Program; use crate::error::{Error, ErrorCode}; +use crate::prelude::UncheckedAccount; use crate::{ AccountDeserialize, Accounts, AccountsExit, CheckId, Key, Result, ToAccountInfos, ToAccountMetas, @@ -142,3 +143,9 @@ impl<'info, T: AccountDeserialize> Key for Interface<'info, T> { self.0.key() } } + +impl<'info, T> From> for UncheckedAccount<'info> { + fn from(value: Interface<'info, T>) -> Self { + value.0.into() + } +} diff --git a/lang/src/accounts/interface_account.rs b/lang/src/accounts/interface_account.rs index 44817a29e1..4dc1577737 100644 --- a/lang/src/accounts/interface_account.rs +++ b/lang/src/accounts/interface_account.rs @@ -2,6 +2,7 @@ use crate::accounts::account::Account; use crate::error::ErrorCode; +use crate::prelude::UncheckedAccount; use crate::{ AccountDeserialize, AccountSerialize, Accounts, AccountsClose, AccountsExit, CheckOwner, Key, Owners, Result, ToAccountInfos, ToAccountMetas, @@ -329,3 +330,11 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Clone> Key for InterfaceA self.account.key() } } + +impl<'info, T: AccountSerialize + AccountDeserialize + Clone> From> + for UncheckedAccount<'info> +{ + fn from(value: InterfaceAccount<'info, T>) -> Self { + value.account.into() + } +} diff --git a/lang/src/accounts/mod.rs b/lang/src/accounts/mod.rs index a5e55ebeab..e26f3bc619 100644 --- a/lang/src/accounts/mod.rs +++ b/lang/src/accounts/mod.rs @@ -1,6 +1,7 @@ //! Account types that can be used in the account validation struct. pub mod account; +#[doc(hidden)] pub mod account_info; pub mod account_loader; pub mod boxed; diff --git a/lang/src/accounts/program.rs b/lang/src/accounts/program.rs index 2aa8b9f7e2..0ba0ccb2d2 100644 --- a/lang/src/accounts/program.rs +++ b/lang/src/accounts/program.rs @@ -1,6 +1,7 @@ //! Type validating that the account is the given Program use crate::error::{Error, ErrorCode}; +use crate::prelude::UncheckedAccount; use crate::{ AccountDeserialize, Accounts, AccountsExit, Id, Key, Result, ToAccountInfos, ToAccountMetas, }; @@ -196,3 +197,9 @@ impl<'info, T: AccountDeserialize> Key for Program<'info, T> { *self.info.key } } + +impl<'info, T> From> for UncheckedAccount<'info> { + fn from(value: Program<'info, T>) -> Self { + UncheckedAccount::try_from(value.info) + } +} diff --git a/lang/src/accounts/signer.rs b/lang/src/accounts/signer.rs index 7d757024a3..b79d1ecfe5 100644 --- a/lang/src/accounts/signer.rs +++ b/lang/src/accounts/signer.rs @@ -1,5 +1,6 @@ //! Type validating that the account signed the transaction use crate::error::ErrorCode; +use crate::prelude::UncheckedAccount; use crate::{Accounts, AccountsExit, Key, Result, ToAccountInfos, ToAccountMetas}; use solana_program::account_info::AccountInfo; use solana_program::instruction::AccountMeta; @@ -110,3 +111,9 @@ impl<'info> Key for Signer<'info> { *self.info.key } } + +impl<'info> From> for UncheckedAccount<'info> { + fn from(value: Signer<'info>) -> Self { + UncheckedAccount::try_from(value.info) + } +} diff --git a/lang/src/accounts/system_account.rs b/lang/src/accounts/system_account.rs index 8c90fd537c..283b865d43 100644 --- a/lang/src/accounts/system_account.rs +++ b/lang/src/accounts/system_account.rs @@ -1,6 +1,7 @@ //! Type validating that the account is owned by the system program use crate::error::ErrorCode; +use crate::prelude::UncheckedAccount; use crate::*; use solana_program::account_info::AccountInfo; use solana_program::instruction::AccountMeta; @@ -89,3 +90,9 @@ impl<'info> Key for SystemAccount<'info> { *self.info.key } } + +impl<'info> From> for UncheckedAccount<'info> { + fn from(value: SystemAccount<'info>) -> Self { + UncheckedAccount::try_from(value.info) + } +} diff --git a/lang/src/accounts/sysvar.rs b/lang/src/accounts/sysvar.rs index c955ff9c15..881791a7e2 100644 --- a/lang/src/accounts/sysvar.rs +++ b/lang/src/accounts/sysvar.rs @@ -1,6 +1,7 @@ //! Type validating that the account is a sysvar and deserializing it use crate::error::ErrorCode; +use crate::prelude::UncheckedAccount; use crate::{Accounts, AccountsExit, Key, Result, ToAccountInfos, ToAccountMetas}; use solana_program::account_info::AccountInfo; use solana_program::instruction::AccountMeta; @@ -121,3 +122,9 @@ impl<'info, T: solana_program::sysvar::Sysvar> Key for Sysvar<'info, T> { *self.info.key } } + +impl<'info, T: solana_program::sysvar::Sysvar> From> for UncheckedAccount<'info> { + fn from(value: Sysvar<'info, T>) -> Self { + UncheckedAccount::try_from(value.info) + } +} diff --git a/lang/src/accounts/unchecked_account.rs b/lang/src/accounts/unchecked_account.rs index 5a00127579..3f13a0dfb0 100644 --- a/lang/src/accounts/unchecked_account.rs +++ b/lang/src/accounts/unchecked_account.rs @@ -75,3 +75,9 @@ impl<'info> Key for UncheckedAccount<'info> { *self.0.key } } + +impl<'info> From> for UncheckedAccount<'info> { + fn from(value: AccountInfo<'info>) -> Self { + UncheckedAccount::try_from(value) + } +} diff --git a/lang/src/system_program.rs b/lang/src/system_program.rs index b11d514ce0..73cef9a5b6 100644 --- a/lang/src/system_program.rs +++ b/lang/src/system_program.rs @@ -22,9 +22,9 @@ pub fn advance_nonce_account<'info>( crate::solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.nonce, - ctx.accounts.recent_blockhashes, - ctx.accounts.authorized, + ctx.accounts.nonce.to_account_info(), + ctx.accounts.recent_blockhashes.to_account_info(), + ctx.accounts.authorized.to_account_info(), ], ctx.signer_seeds, ) @@ -32,11 +32,10 @@ pub fn advance_nonce_account<'info>( } #[derive(Accounts)] -#[only_cpi] pub struct AdvanceNonceAccount<'info> { - pub nonce: AccountInfo<'info>, - pub authorized: AccountInfo<'info>, - pub recent_blockhashes: AccountInfo<'info>, + pub nonce: UncheckedAccount<'info>, + pub authorized: UncheckedAccount<'info>, + pub recent_blockhashes: UncheckedAccount<'info>, } pub fn allocate<'info>( @@ -49,16 +48,15 @@ pub fn allocate<'info>( ); crate::solana_program::program::invoke_signed( &ix, - &[ctx.accounts.account_to_allocate], + &[ctx.accounts.account_to_allocate.to_account_info()], ctx.signer_seeds, ) .map_err(Into::into) } #[derive(Accounts)] -#[only_cpi] pub struct Allocate<'info> { - pub account_to_allocate: AccountInfo<'info>, + pub account_to_allocate: UncheckedAccount<'info>, } pub fn allocate_with_seed<'info>( @@ -76,17 +74,19 @@ pub fn allocate_with_seed<'info>( ); crate::solana_program::program::invoke_signed( &ix, - &[ctx.accounts.account_to_allocate, ctx.accounts.base], + &[ + ctx.accounts.account_to_allocate.to_account_info(), + ctx.accounts.base.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) } #[derive(Accounts)] -#[only_cpi] pub struct AllocateWithSeed<'info> { - pub account_to_allocate: AccountInfo<'info>, - pub base: AccountInfo<'info>, + pub account_to_allocate: UncheckedAccount<'info>, + pub base: UncheckedAccount<'info>, } pub fn assign<'info>( @@ -99,16 +99,15 @@ pub fn assign<'info>( ); crate::solana_program::program::invoke_signed( &ix, - &[ctx.accounts.account_to_assign], + &[ctx.accounts.account_to_assign.to_account_info()], ctx.signer_seeds, ) .map_err(Into::into) } #[derive(Accounts)] -#[only_cpi] pub struct Assign<'info> { - pub account_to_assign: AccountInfo<'info>, + pub account_to_assign: UncheckedAccount<'info>, } pub fn assign_with_seed<'info>( @@ -124,17 +123,19 @@ pub fn assign_with_seed<'info>( ); crate::solana_program::program::invoke_signed( &ix, - &[ctx.accounts.account_to_assign, ctx.accounts.base], + &[ + ctx.accounts.account_to_assign.to_account_info(), + ctx.accounts.base.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) } #[derive(Accounts)] -#[only_cpi] pub struct AssignWithSeed<'info> { - pub account_to_assign: AccountInfo<'info>, - pub base: AccountInfo<'info>, + pub account_to_assign: UncheckedAccount<'info>, + pub base: UncheckedAccount<'info>, } pub fn authorize_nonce_account<'info>( @@ -148,17 +149,19 @@ pub fn authorize_nonce_account<'info>( ); crate::solana_program::program::invoke_signed( &ix, - &[ctx.accounts.nonce, ctx.accounts.authorized], + &[ + ctx.accounts.nonce.to_account_info(), + ctx.accounts.authorized.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) } #[derive(Accounts)] -#[only_cpi] pub struct AuthorizeNonceAccount<'info> { - pub nonce: AccountInfo<'info>, - pub authorized: AccountInfo<'info>, + pub nonce: UncheckedAccount<'info>, + pub authorized: UncheckedAccount<'info>, } pub fn create_account<'info>( @@ -176,17 +179,19 @@ pub fn create_account<'info>( ); crate::solana_program::program::invoke_signed( &ix, - &[ctx.accounts.from, ctx.accounts.to], + &[ + ctx.accounts.from.to_account_info(), + ctx.accounts.to.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) } #[derive(Accounts)] -#[only_cpi] pub struct CreateAccount<'info> { - pub from: AccountInfo<'info>, - pub to: AccountInfo<'info>, + pub from: UncheckedAccount<'info>, + pub to: UncheckedAccount<'info>, } pub fn create_account_with_seed<'info>( @@ -207,18 +212,21 @@ pub fn create_account_with_seed<'info>( ); crate::solana_program::program::invoke_signed( &ix, - &[ctx.accounts.from, ctx.accounts.to, ctx.accounts.base], + &[ + ctx.accounts.from.to_account_info(), + ctx.accounts.to.to_account_info(), + ctx.accounts.base.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) } #[derive(Accounts)] -#[only_cpi] pub struct CreateAccountWithSeed<'info> { - pub from: AccountInfo<'info>, - pub to: AccountInfo<'info>, - pub base: AccountInfo<'info>, + pub from: UncheckedAccount<'info>, + pub to: UncheckedAccount<'info>, + pub base: UncheckedAccount<'info>, } pub fn create_nonce_account<'info>( @@ -234,16 +242,19 @@ pub fn create_nonce_account<'info>( ); crate::solana_program::program::invoke_signed( &ixs[0], - &[ctx.accounts.from, ctx.accounts.nonce.clone()], + &[ + ctx.accounts.from.to_account_info(), + ctx.accounts.nonce.to_account_info(), + ], ctx.signer_seeds, )?; crate::solana_program::program::invoke_signed( &ixs[1], &[ - ctx.accounts.nonce, - ctx.accounts.recent_blockhashes, - ctx.accounts.rent, + ctx.accounts.nonce.to_account_info(), + ctx.accounts.recent_blockhashes.to_account_info(), + ctx.accounts.rent.to_account_info(), ], ctx.signer_seeds, ) @@ -251,12 +262,11 @@ pub fn create_nonce_account<'info>( } #[derive(Accounts)] -#[only_cpi] pub struct CreateNonceAccount<'info> { - pub from: AccountInfo<'info>, - pub nonce: AccountInfo<'info>, - pub recent_blockhashes: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub from: UncheckedAccount<'info>, + pub nonce: UncheckedAccount<'info>, + pub recent_blockhashes: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } pub fn create_nonce_account_with_seed<'info>( @@ -276,9 +286,9 @@ pub fn create_nonce_account_with_seed<'info>( crate::solana_program::program::invoke_signed( &ixs[0], &[ - ctx.accounts.from, - ctx.accounts.nonce.clone(), - ctx.accounts.base, + ctx.accounts.from.to_account_info(), + ctx.accounts.nonce.to_account_info(), + ctx.accounts.base.to_account_info(), ], ctx.signer_seeds, )?; @@ -286,9 +296,9 @@ pub fn create_nonce_account_with_seed<'info>( crate::solana_program::program::invoke_signed( &ixs[1], &[ - ctx.accounts.nonce, - ctx.accounts.recent_blockhashes, - ctx.accounts.rent, + ctx.accounts.nonce.to_account_info(), + ctx.accounts.recent_blockhashes.to_account_info(), + ctx.accounts.rent.to_account_info(), ], ctx.signer_seeds, ) @@ -296,13 +306,12 @@ pub fn create_nonce_account_with_seed<'info>( } #[derive(Accounts)] -#[only_cpi] pub struct CreateNonceAccountWithSeed<'info> { - pub from: AccountInfo<'info>, - pub nonce: AccountInfo<'info>, - pub base: AccountInfo<'info>, - pub recent_blockhashes: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub from: UncheckedAccount<'info>, + pub nonce: UncheckedAccount<'info>, + pub base: UncheckedAccount<'info>, + pub recent_blockhashes: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } pub fn transfer<'info>( @@ -316,17 +325,19 @@ pub fn transfer<'info>( ); crate::solana_program::program::invoke_signed( &ix, - &[ctx.accounts.from, ctx.accounts.to], + &[ + ctx.accounts.from.to_account_info(), + ctx.accounts.to.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) } #[derive(Accounts)] -#[only_cpi] pub struct Transfer<'info> { - pub from: AccountInfo<'info>, - pub to: AccountInfo<'info>, + pub from: UncheckedAccount<'info>, + pub to: UncheckedAccount<'info>, } pub fn transfer_with_seed<'info>( @@ -345,18 +356,21 @@ pub fn transfer_with_seed<'info>( ); crate::solana_program::program::invoke_signed( &ix, - &[ctx.accounts.from, ctx.accounts.base, ctx.accounts.to], + &[ + ctx.accounts.from.to_account_info(), + ctx.accounts.base.to_account_info(), + ctx.accounts.to.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) } #[derive(Accounts)] -#[only_cpi] pub struct TransferWithSeed<'info> { - pub from: AccountInfo<'info>, - pub base: AccountInfo<'info>, - pub to: AccountInfo<'info>, + pub from: UncheckedAccount<'info>, + pub base: UncheckedAccount<'info>, + pub to: UncheckedAccount<'info>, } pub fn withdraw_nonce_account<'info>( @@ -372,11 +386,11 @@ pub fn withdraw_nonce_account<'info>( crate::solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.nonce, - ctx.accounts.to, - ctx.accounts.recent_blockhashes, - ctx.accounts.rent, - ctx.accounts.authorized, + ctx.accounts.nonce.to_account_info(), + ctx.accounts.to.to_account_info(), + ctx.accounts.recent_blockhashes.to_account_info(), + ctx.accounts.rent.to_account_info(), + ctx.accounts.authorized.to_account_info(), ], ctx.signer_seeds, ) @@ -384,11 +398,10 @@ pub fn withdraw_nonce_account<'info>( } #[derive(Accounts)] -#[only_cpi] pub struct WithdrawNonceAccount<'info> { - pub nonce: AccountInfo<'info>, - pub to: AccountInfo<'info>, - pub recent_blockhashes: AccountInfo<'info>, - pub rent: AccountInfo<'info>, - pub authorized: AccountInfo<'info>, + pub nonce: UncheckedAccount<'info>, + pub to: UncheckedAccount<'info>, + pub recent_blockhashes: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, + pub authorized: UncheckedAccount<'info>, } diff --git a/lang/syn/src/codegen/accounts/__cpi_client_accounts.rs b/lang/syn/src/codegen/accounts/__cpi_client_accounts.rs index 57b4f53730..569b8e142e 100644 --- a/lang/syn/src/codegen/accounts/__cpi_client_accounts.rs +++ b/lang/syn/src/codegen/accounts/__cpi_client_accounts.rs @@ -63,12 +63,12 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { if f.is_optional { quote! { #docs - pub #name: Option> + pub #name: Option> } } else { quote! { #docs - pub #name: anchor_lang::solana_program::account_info::AccountInfo<'info> + pub #name: anchor_lang::accounts::unchecked_account::UncheckedAccount<'info> } } } diff --git a/lang/syn/src/codegen/accounts/constraints.rs b/lang/syn/src/codegen/accounts/constraints.rs index 2a515d7116..0b580652fd 100644 --- a/lang/syn/src/codegen/accounts/constraints.rs +++ b/lang/syn/src/codegen/accounts/constraints.rs @@ -390,8 +390,8 @@ fn generate_constraint_realloc( anchor_lang::context::CpiContext::new( system_program.to_account_info(), anchor_lang::system_program::Transfer { - from: #payer.to_account_info(), - to: __field_info.clone(), + from: #payer.to_account_info().into(), + to: __field_info.clone().into(), }, ), __new_rent_minimum.checked_sub(__field_info.lamports()).unwrap(), @@ -557,9 +557,9 @@ fn generate_constraint_init_group( // Initialize the token account. let cpi_program = #token_program.to_account_info(); let accounts = ::anchor_spl::token_interface::InitializeAccount3 { - account: #field.to_account_info(), - mint: #mint.to_account_info(), - authority: #owner.to_account_info(), + account: #field.to_account_info().into(), + mint: #mint.to_account_info().into(), + authority: #owner.to_account_info().into(), }; let cpi_ctx = anchor_lang::context::CpiContext::new(cpi_program, accounts); ::anchor_spl::token_interface::initialize_account3(cpi_ctx)?; @@ -624,12 +624,12 @@ fn generate_constraint_init_group( let cpi_program = associated_token_program.to_account_info(); let cpi_accounts = ::anchor_spl::associated_token::Create { - payer: #payer.to_account_info(), - associated_token: #field.to_account_info(), - authority: #owner.to_account_info(), - mint: #mint.to_account_info(), - system_program: system_program.to_account_info(), - token_program: #token_program.to_account_info(), + payer: #payer.to_account_info().into(), + associated_token: #field.to_account_info().into(), + authority: #owner.to_account_info().into(), + mint: #mint.to_account_info().into(), + system_program: system_program.to_account_info().into(), + token_program: #token_program.to_account_info().into(), }; let cpi_ctx = anchor_lang::context::CpiContext::new(cpi_program, cpi_accounts); ::anchor_spl::associated_token::create(cpi_ctx)?; @@ -716,7 +716,7 @@ fn generate_constraint_init_group( // Initialize the mint account. let cpi_program = #token_program.to_account_info(); let accounts = ::anchor_spl::token_interface::InitializeMint2 { - mint: #field.to_account_info(), + mint: #field.to_account_info().into(), }; let cpi_ctx = anchor_lang::context::CpiContext::new(cpi_program, accounts); ::anchor_spl::token_interface::initialize_mint2(cpi_ctx, #decimals, &#owner.key(), #freeze_authority)?; @@ -1142,13 +1142,13 @@ fn generate_create_account( let space = #space; let lamports = __anchor_rent.minimum_balance(space); let cpi_accounts = anchor_lang::system_program::CreateAccount { - from: #payer.to_account_info(), - to: #field.to_account_info() + from: #payer.to_account_info().into(), + to: #field.to_account_info().into(), }; let cpi_context = anchor_lang::context::CpiContext::new(system_program.to_account_info(), cpi_accounts); anchor_lang::system_program::create_account(cpi_context.with_signer(&[#seeds_with_nonce]), lamports, space as u64, #owner)?; } else { - require_keys_neq!(#payer.key(), #field.key(), anchor_lang::error::ErrorCode::TryingToInitPayerAsProgramAccount); + require_keys_neq!(#payer.key(), *#field.key, anchor_lang::error::ErrorCode::TryingToInitPayerAsProgramAccount); // Fund the account for rent exemption. let required_lamports = __anchor_rent .minimum_balance(#space) @@ -1156,21 +1156,21 @@ fn generate_create_account( .saturating_sub(__current_lamports); if required_lamports > 0 { let cpi_accounts = anchor_lang::system_program::Transfer { - from: #payer.to_account_info(), - to: #field.to_account_info(), + from: #payer.to_account_info().into(), + to: #field.to_account_info().into(), }; let cpi_context = anchor_lang::context::CpiContext::new(system_program.to_account_info(), cpi_accounts); anchor_lang::system_program::transfer(cpi_context, required_lamports)?; } // Allocate space. let cpi_accounts = anchor_lang::system_program::Allocate { - account_to_allocate: #field.to_account_info() + account_to_allocate: #field.to_account_info().into(), }; let cpi_context = anchor_lang::context::CpiContext::new(system_program.to_account_info(), cpi_accounts); anchor_lang::system_program::allocate(cpi_context.with_signer(&[#seeds_with_nonce]), #space as u64)?; // Assign to the spl token program. let cpi_accounts = anchor_lang::system_program::Assign { - account_to_assign: #field.to_account_info() + account_to_assign: #field.to_account_info().into(), }; let cpi_context = anchor_lang::context::CpiContext::new(system_program.to_account_info(), cpi_accounts); anchor_lang::system_program::assign(cpi_context.with_signer(&[#seeds_with_nonce]), #owner)?; diff --git a/lang/syn/src/codegen/accounts/mod.rs b/lang/syn/src/codegen/accounts/mod.rs index fd4a855e66..3a239cbe33 100644 --- a/lang/syn/src/codegen/accounts/mod.rs +++ b/lang/syn/src/codegen/accounts/mod.rs @@ -22,21 +22,14 @@ pub fn generate(accs: &AccountsStruct) -> proc_macro2::TokenStream { let __client_accounts_mod = __client_accounts::generate(accs); let __cpi_client_accounts_mod = __cpi_client_accounts::generate(accs); - if accs.only_cpi { - quote! { - #impl_to_account_infos - #impl_to_account_metas - } - } else { - quote! { - #impl_try_accounts - #impl_to_account_infos - #impl_to_account_metas - #impl_exit + quote! { + #impl_try_accounts + #impl_to_account_infos + #impl_to_account_metas + #impl_exit - #__client_accounts_mod - #__cpi_client_accounts_mod - } + #__client_accounts_mod + #__cpi_client_accounts_mod } } diff --git a/lang/syn/src/codegen/program/idl.rs b/lang/syn/src/codegen/program/idl.rs index 2e4c83f94f..eecfbdcbde 100644 --- a/lang/syn/src/codegen/program/idl.rs +++ b/lang/syn/src/codegen/program/idl.rs @@ -224,8 +224,8 @@ pub fn idl_accounts_and_functions() -> proc_macro2::TokenStream { anchor_lang::context::CpiContext::new( accounts.system_program.to_account_info(), anchor_lang::system_program::Transfer { - from: accounts.authority.to_account_info(), - to: accounts.idl.to_account_info(), + from: accounts.authority.to_account_info().into(), + to: accounts.idl.to_account_info().into(), }, ), new_rent_minimum diff --git a/lang/syn/src/lib.rs b/lang/syn/src/lib.rs index 210d957dd6..80f74af598 100644 --- a/lang/syn/src/lib.rs +++ b/lang/syn/src/lib.rs @@ -93,8 +93,6 @@ pub struct AccountsStruct { pub fields: Vec, // Instruction data api expression. instruction_api: Option>, - // Used internally to limit the codegen - only_cpi: bool, } impl Parse for AccountsStruct { @@ -121,7 +119,6 @@ impl AccountsStruct { strct: ItemStruct, fields: Vec, instruction_api: Option>, - only_cpi: bool, ) -> Self { let ident = strct.ident.clone(); let generics = strct.generics; @@ -130,7 +127,6 @@ impl AccountsStruct { generics, fields, instruction_api, - only_cpi, } } @@ -243,9 +239,6 @@ impl Field { let account_ty = self.account_ty(); let container_ty = self.container_ty(); let inner_ty = match &self.ty { - Ty::AccountInfo => quote! { - AccountInfo - }, Ty::UncheckedAccount => quote! { UncheckedAccount }, @@ -322,7 +315,6 @@ impl Field { }, }; match &self.ty { - Ty::AccountInfo => quote! { #field.to_account_info() }, Ty::UncheckedAccount => { quote! { UncheckedAccount::try_from(#field.to_account_info()) } } @@ -402,7 +394,6 @@ impl Field { Ty::InterfaceAccount(_) => { quote! { anchor_lang::accounts::interface_account::InterfaceAccount } } - Ty::AccountInfo => quote! {}, Ty::UncheckedAccount => quote! {}, Ty::Signer => quote! {}, Ty::SystemAccount => quote! {}, @@ -413,9 +404,6 @@ impl Field { // Returns the inner account struct type. pub fn account_ty(&self) -> proc_macro2::TokenStream { match &self.ty { - Ty::AccountInfo => quote! { - AccountInfo - }, Ty::UncheckedAccount => quote! { UncheckedAccount }, @@ -487,7 +475,6 @@ pub struct CompositeField { // A type of an account field. #[derive(Debug, PartialEq, Eq)] pub enum Ty { - AccountInfo, UncheckedAccount, AccountLoader(AccountLoaderTy), Sysvar(SysvarTy), diff --git a/lang/syn/src/parser/accounts/mod.rs b/lang/syn/src/parser/accounts/mod.rs index 45018e0a05..acee1c80a3 100644 --- a/lang/syn/src/parser/accounts/mod.rs +++ b/lang/syn/src/parser/accounts/mod.rs @@ -20,7 +20,6 @@ pub fn parse(strct: &syn::ItemStruct) -> ParseResult { }) .map(|ix_attr| ix_attr.parse_args_with(Punctuated::::parse_terminated)) .transpose()?; - let only_cpi = strct.attrs.iter().any(|a| a.path.is_ident("only_cpi")); let fields = match &strct.fields { syn::Fields::Named(fields) => fields .named @@ -35,33 +34,9 @@ pub fn parse(strct: &syn::ItemStruct) -> ParseResult { } }; - if !only_cpi { - prevent_account_info(&fields)?; - } - constraints_cross_checks(&fields)?; - Ok(AccountsStruct::new( - strct.clone(), - fields, - instruction_api, - only_cpi, - )) -} - -fn prevent_account_info(fields: &[AccountField]) -> ParseResult<()> { - let field = fields.iter().find(|f| match f { - AccountField::Field(acc_f) => acc_f.ty == Ty::AccountInfo, - _ => false, - }); - - match field { - Some(f) => Err(ParseError::new( - f.ident().span(), - "AccountInfo can no longer be used in the context. Please use UncheckedAccount instead.", - )), - None => Ok(()), - } + Ok(AccountsStruct::new(strct.clone(), fields, instruction_api)) } fn constraints_cross_checks(fields: &[AccountField]) -> ParseResult<()> { @@ -318,7 +293,6 @@ fn is_field_primitive(f: &syn::Field) -> ParseResult { let r = matches!( ident_string(f)?.0.as_str(), "Sysvar" - | "AccountInfo" | "UncheckedAccount" | "AccountLoader" | "Account" @@ -336,7 +310,6 @@ fn parse_ty(f: &syn::Field) -> ParseResult<(Ty, bool)> { let (ident, optional, path) = ident_string(f)?; let ty = match ident.as_str() { "Sysvar" => Ty::Sysvar(parse_sysvar(&path)?), - "AccountInfo" => Ty::AccountInfo, "UncheckedAccount" => Ty::UncheckedAccount, "AccountLoader" => Ty::AccountLoader(parse_program_account_loader(&path)?), "Account" => Ty::Account(parse_account_ty(&path)?), diff --git a/spl/src/associated_token.rs b/spl/src/associated_token.rs index 6e43cd39e0..8c32cae542 100644 --- a/spl/src/associated_token.rs +++ b/spl/src/associated_token.rs @@ -1,7 +1,7 @@ -use anchor_lang::solana_program::account_info::AccountInfo; +use anchor_lang::prelude::UncheckedAccount; use anchor_lang::solana_program::pubkey::Pubkey; -use anchor_lang::Result; use anchor_lang::{context::CpiContext, Accounts}; +use anchor_lang::{Result, ToAccountInfo}; pub use spl_associated_token_account::{ get_associated_token_address, get_associated_token_address_with_program_id, ID, @@ -17,12 +17,12 @@ pub fn create<'info>(ctx: CpiContext<'_, '_, '_, 'info, Create<'info>>) -> Resul solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.payer, - ctx.accounts.associated_token, - ctx.accounts.authority, - ctx.accounts.mint, - ctx.accounts.system_program, - ctx.accounts.token_program, + ctx.accounts.payer.to_account_info(), + ctx.accounts.associated_token.to_account_info(), + ctx.accounts.authority.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.system_program.to_account_info(), + ctx.accounts.token_program.to_account_info(), ], ctx.signer_seeds, ) @@ -41,12 +41,12 @@ pub fn create_idempotent<'info>( solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.payer, - ctx.accounts.associated_token, - ctx.accounts.authority, - ctx.accounts.mint, - ctx.accounts.system_program, - ctx.accounts.token_program, + ctx.accounts.payer.to_account_info(), + ctx.accounts.associated_token.to_account_info(), + ctx.accounts.authority.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.system_program.to_account_info(), + ctx.accounts.token_program.to_account_info(), ], ctx.signer_seeds, ) @@ -54,14 +54,13 @@ pub fn create_idempotent<'info>( } #[derive(Accounts)] -#[only_cpi] pub struct Create<'info> { - pub payer: AccountInfo<'info>, - pub associated_token: AccountInfo<'info>, - pub authority: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub system_program: AccountInfo<'info>, - pub token_program: AccountInfo<'info>, + pub payer: UncheckedAccount<'info>, + pub associated_token: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub system_program: UncheckedAccount<'info>, + pub token_program: UncheckedAccount<'info>, } type CreateIdempotent<'info> = Create<'info>; diff --git a/spl/src/dex.rs b/spl/src/dex.rs index bfe2965051..207e1945f6 100644 --- a/spl/src/dex.rs +++ b/spl/src/dex.rs @@ -1,4 +1,4 @@ -use anchor_lang::solana_program::account_info::AccountInfo; +use anchor_lang::prelude::UncheckedAccount; use anchor_lang::solana_program::program_error::ProgramError; use anchor_lang::solana_program::pubkey::Pubkey; use anchor_lang::{context::CpiContext, Accounts, Result, ToAccountInfos}; @@ -203,97 +203,90 @@ pub fn initialize_market<'info>( } #[derive(Accounts)] -#[only_cpi] pub struct NewOrderV3<'info> { - pub market: AccountInfo<'info>, - pub open_orders: AccountInfo<'info>, - pub request_queue: AccountInfo<'info>, - pub event_queue: AccountInfo<'info>, - pub market_bids: AccountInfo<'info>, - pub market_asks: AccountInfo<'info>, + pub market: UncheckedAccount<'info>, + pub open_orders: UncheckedAccount<'info>, + pub request_queue: UncheckedAccount<'info>, + pub event_queue: UncheckedAccount<'info>, + pub market_bids: UncheckedAccount<'info>, + pub market_asks: UncheckedAccount<'info>, // Token account where funds are transferred from for the order. If // posting a bid market A/B, then this is the SPL token account for B. - pub order_payer_token_account: AccountInfo<'info>, - pub open_orders_authority: AccountInfo<'info>, + pub order_payer_token_account: UncheckedAccount<'info>, + pub open_orders_authority: UncheckedAccount<'info>, // Also known as the "base" currency. For a given A/B market, // this is the vault for the A mint. - pub coin_vault: AccountInfo<'info>, + pub coin_vault: UncheckedAccount<'info>, // Also known as the "quote" currency. For a given A/B market, // this is the vault for the B mint. - pub pc_vault: AccountInfo<'info>, - pub token_program: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub pc_vault: UncheckedAccount<'info>, + pub token_program: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct CancelOrderV2<'info> { - pub market: AccountInfo<'info>, - pub market_bids: AccountInfo<'info>, - pub market_asks: AccountInfo<'info>, - pub open_orders: AccountInfo<'info>, - pub open_orders_authority: AccountInfo<'info>, - pub event_queue: AccountInfo<'info>, + pub market: UncheckedAccount<'info>, + pub market_bids: UncheckedAccount<'info>, + pub market_asks: UncheckedAccount<'info>, + pub open_orders: UncheckedAccount<'info>, + pub open_orders_authority: UncheckedAccount<'info>, + pub event_queue: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct SettleFunds<'info> { - pub market: AccountInfo<'info>, - pub open_orders: AccountInfo<'info>, - pub open_orders_authority: AccountInfo<'info>, - pub coin_vault: AccountInfo<'info>, - pub pc_vault: AccountInfo<'info>, - pub coin_wallet: AccountInfo<'info>, - pub pc_wallet: AccountInfo<'info>, - pub vault_signer: AccountInfo<'info>, - pub token_program: AccountInfo<'info>, + pub market: UncheckedAccount<'info>, + pub open_orders: UncheckedAccount<'info>, + pub open_orders_authority: UncheckedAccount<'info>, + pub coin_vault: UncheckedAccount<'info>, + pub pc_vault: UncheckedAccount<'info>, + pub coin_wallet: UncheckedAccount<'info>, + pub pc_wallet: UncheckedAccount<'info>, + pub vault_signer: UncheckedAccount<'info>, + pub token_program: UncheckedAccount<'info>, } /// To use an (optional) market authority, add it as the first account of the /// CpiContext's `remaining_accounts` Vec. #[derive(Accounts)] -#[only_cpi] pub struct InitOpenOrders<'info> { - pub open_orders: AccountInfo<'info>, - pub authority: AccountInfo<'info>, - pub market: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub open_orders: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, + pub market: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct CloseOpenOrders<'info> { - pub open_orders: AccountInfo<'info>, - pub authority: AccountInfo<'info>, - pub destination: AccountInfo<'info>, - pub market: AccountInfo<'info>, + pub open_orders: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, + pub destination: UncheckedAccount<'info>, + pub market: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct SweepFees<'info> { - pub market: AccountInfo<'info>, - pub pc_vault: AccountInfo<'info>, - pub sweep_authority: AccountInfo<'info>, - pub sweep_receiver: AccountInfo<'info>, - pub vault_signer: AccountInfo<'info>, - pub token_program: AccountInfo<'info>, + pub market: UncheckedAccount<'info>, + pub pc_vault: UncheckedAccount<'info>, + pub sweep_authority: UncheckedAccount<'info>, + pub sweep_receiver: UncheckedAccount<'info>, + pub vault_signer: UncheckedAccount<'info>, + pub token_program: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct InitializeMarket<'info> { - pub market: AccountInfo<'info>, - pub coin_mint: AccountInfo<'info>, - pub pc_mint: AccountInfo<'info>, - pub coin_vault: AccountInfo<'info>, - pub pc_vault: AccountInfo<'info>, - pub bids: AccountInfo<'info>, - pub asks: AccountInfo<'info>, - pub req_q: AccountInfo<'info>, - pub event_q: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub market: UncheckedAccount<'info>, + pub coin_mint: UncheckedAccount<'info>, + pub pc_mint: UncheckedAccount<'info>, + pub coin_vault: UncheckedAccount<'info>, + pub pc_vault: UncheckedAccount<'info>, + pub bids: UncheckedAccount<'info>, + pub asks: UncheckedAccount<'info>, + pub req_q: UncheckedAccount<'info>, + pub event_q: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } #[derive(Clone)] diff --git a/spl/src/metadata.rs b/spl/src/metadata.rs index 2f30539b39..296c853ba1 100644 --- a/spl/src/metadata.rs +++ b/spl/src/metadata.rs @@ -1,8 +1,12 @@ -use anchor_lang::context::CpiContext; -use anchor_lang::{Accounts, ErrorCode, Result, ToAccountInfos}; -use mpl_token_metadata::state::{CollectionDetails, DataV2, TokenMetadataAccount}; -use mpl_token_metadata::ID; -use solana_program::account_info::AccountInfo; +use anchor_lang::{ + context::CpiContext, + prelude::{ErrorCode, UncheckedAccount}, + Accounts, Result, ToAccountInfos, +}; +use mpl_token_metadata::{ + state::{CollectionDetails, DataV2, TokenMetadataAccount}, + ID, +}; use solana_program::pubkey::Pubkey; use std::ops::Deref; @@ -554,114 +558,105 @@ pub fn unverify_sized_collection_item<'info>( } #[derive(Accounts)] -#[only_cpi] pub struct ApproveCollectionAuthority<'info> { - pub collection_authority_record: AccountInfo<'info>, - pub new_collection_authority: AccountInfo<'info>, - pub update_authority: AccountInfo<'info>, - pub payer: AccountInfo<'info>, - pub metadata: AccountInfo<'info>, - pub mint: AccountInfo<'info>, + pub collection_authority_record: UncheckedAccount<'info>, + pub new_collection_authority: UncheckedAccount<'info>, + pub update_authority: UncheckedAccount<'info>, + pub payer: UncheckedAccount<'info>, + pub metadata: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct BubblegumSetCollectionSize<'info> { - pub metadata_account: AccountInfo<'info>, - pub update_authority: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub bubblegum_signer: AccountInfo<'info>, + pub metadata_account: UncheckedAccount<'info>, + pub update_authority: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub bubblegum_signer: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct BurnEditionNft<'info> { - pub metadata: AccountInfo<'info>, - pub owner: AccountInfo<'info>, - pub print_edition_mint: AccountInfo<'info>, - pub master_edition_mint: AccountInfo<'info>, - pub print_edition_token: AccountInfo<'info>, - pub master_edition_token: AccountInfo<'info>, - pub master_edition: AccountInfo<'info>, - pub print_edition: AccountInfo<'info>, - pub edition_marker: AccountInfo<'info>, - pub spl_token: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub owner: UncheckedAccount<'info>, + pub print_edition_mint: UncheckedAccount<'info>, + pub master_edition_mint: UncheckedAccount<'info>, + pub print_edition_token: UncheckedAccount<'info>, + pub master_edition_token: UncheckedAccount<'info>, + pub master_edition: UncheckedAccount<'info>, + pub print_edition: UncheckedAccount<'info>, + pub edition_marker: UncheckedAccount<'info>, + pub spl_token: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct BurnNft<'info> { - pub metadata: AccountInfo<'info>, - pub owner: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub token: AccountInfo<'info>, - pub edition: AccountInfo<'info>, - pub spl_token: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub owner: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub token: UncheckedAccount<'info>, + pub edition: UncheckedAccount<'info>, + pub spl_token: UncheckedAccount<'info>, } #[deprecated(note = "internal instructions deprecated by Metaplex")] #[derive(Accounts)] -#[only_cpi] pub struct CreateMetadataAccountsV2<'info> { - pub metadata: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub mint_authority: AccountInfo<'info>, - pub payer: AccountInfo<'info>, - pub update_authority: AccountInfo<'info>, - pub system_program: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub mint_authority: UncheckedAccount<'info>, + pub payer: UncheckedAccount<'info>, + pub update_authority: UncheckedAccount<'info>, + pub system_program: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct CreateMetadataAccountsV3<'info> { - pub metadata: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub mint_authority: AccountInfo<'info>, - pub payer: AccountInfo<'info>, - pub update_authority: AccountInfo<'info>, - pub system_program: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub mint_authority: UncheckedAccount<'info>, + pub payer: UncheckedAccount<'info>, + pub update_authority: UncheckedAccount<'info>, + pub system_program: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct UpdateMetadataAccountsV2<'info> { - pub metadata: AccountInfo<'info>, - pub update_authority: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub update_authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct CreateMasterEditionV3<'info> { - pub edition: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub update_authority: AccountInfo<'info>, - pub mint_authority: AccountInfo<'info>, - pub payer: AccountInfo<'info>, - pub metadata: AccountInfo<'info>, - pub token_program: AccountInfo<'info>, - pub system_program: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub edition: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub update_authority: UncheckedAccount<'info>, + pub mint_authority: UncheckedAccount<'info>, + pub payer: UncheckedAccount<'info>, + pub metadata: UncheckedAccount<'info>, + pub token_program: UncheckedAccount<'info>, + pub system_program: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct MintNewEditionFromMasterEditionViaToken<'info> { - pub new_metadata: AccountInfo<'info>, - pub new_edition: AccountInfo<'info>, - pub master_edition: AccountInfo<'info>, - pub new_mint: AccountInfo<'info>, - pub edition_mark_pda: AccountInfo<'info>, - pub new_mint_authority: AccountInfo<'info>, - pub payer: AccountInfo<'info>, - pub token_account_owner: AccountInfo<'info>, - pub token_account: AccountInfo<'info>, - pub new_metadata_update_authority: AccountInfo<'info>, - pub metadata: AccountInfo<'info>, - pub token_program: AccountInfo<'info>, - pub system_program: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub new_metadata: UncheckedAccount<'info>, + pub new_edition: UncheckedAccount<'info>, + pub master_edition: UncheckedAccount<'info>, + pub new_mint: UncheckedAccount<'info>, + pub edition_mark_pda: UncheckedAccount<'info>, + pub new_mint_authority: UncheckedAccount<'info>, + pub payer: UncheckedAccount<'info>, + pub token_account_owner: UncheckedAccount<'info>, + pub token_account: UncheckedAccount<'info>, + pub new_metadata_update_authority: UncheckedAccount<'info>, + pub metadata: UncheckedAccount<'info>, + pub token_program: UncheckedAccount<'info>, + pub system_program: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, // // Not actually used by the program but still needed because it's needed // for the pda calculation in the helper. :/ @@ -669,155 +664,140 @@ pub struct MintNewEditionFromMasterEditionViaToken<'info> { // The better thing to do would be to remove this and have the instruction // helper pass in the `edition_mark_pda` directly. // - pub metadata_mint: AccountInfo<'info>, + pub metadata_mint: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct RevokeCollectionAuthority<'info> { - pub collection_authority_record: AccountInfo<'info>, - pub delegate_authority: AccountInfo<'info>, - pub revoke_authority: AccountInfo<'info>, - pub metadata: AccountInfo<'info>, - pub mint: AccountInfo<'info>, + pub collection_authority_record: UncheckedAccount<'info>, + pub delegate_authority: UncheckedAccount<'info>, + pub revoke_authority: UncheckedAccount<'info>, + pub metadata: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct SetCollectionSize<'info> { - pub metadata: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub update_authority: AccountInfo<'info>, - pub system_program: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub update_authority: UncheckedAccount<'info>, + pub system_program: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct SetTokenStandard<'info> { - pub metadata_account: AccountInfo<'info>, - pub update_authority: AccountInfo<'info>, - pub mint_account: AccountInfo<'info>, + pub metadata_account: UncheckedAccount<'info>, + pub update_authority: UncheckedAccount<'info>, + pub mint_account: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct VerifyCollection<'info> { - pub payer: AccountInfo<'info>, - pub metadata: AccountInfo<'info>, - pub collection_authority: AccountInfo<'info>, - pub collection_mint: AccountInfo<'info>, - pub collection_metadata: AccountInfo<'info>, - pub collection_master_edition: AccountInfo<'info>, + pub payer: UncheckedAccount<'info>, + pub metadata: UncheckedAccount<'info>, + pub collection_authority: UncheckedAccount<'info>, + pub collection_mint: UncheckedAccount<'info>, + pub collection_metadata: UncheckedAccount<'info>, + pub collection_master_edition: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct VerifySizedCollectionItem<'info> { - pub payer: AccountInfo<'info>, - pub metadata: AccountInfo<'info>, - pub collection_authority: AccountInfo<'info>, - pub collection_mint: AccountInfo<'info>, - pub collection_metadata: AccountInfo<'info>, - pub collection_master_edition: AccountInfo<'info>, + pub payer: UncheckedAccount<'info>, + pub metadata: UncheckedAccount<'info>, + pub collection_authority: UncheckedAccount<'info>, + pub collection_mint: UncheckedAccount<'info>, + pub collection_metadata: UncheckedAccount<'info>, + pub collection_master_edition: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct SetAndVerifyCollection<'info> { - pub metadata: AccountInfo<'info>, - pub collection_authority: AccountInfo<'info>, - pub payer: AccountInfo<'info>, - pub update_authority: AccountInfo<'info>, - pub collection_mint: AccountInfo<'info>, - pub collection_metadata: AccountInfo<'info>, - pub collection_master_edition: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub collection_authority: UncheckedAccount<'info>, + pub payer: UncheckedAccount<'info>, + pub update_authority: UncheckedAccount<'info>, + pub collection_mint: UncheckedAccount<'info>, + pub collection_metadata: UncheckedAccount<'info>, + pub collection_master_edition: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct SetAndVerifySizedCollectionItem<'info> { - pub metadata: AccountInfo<'info>, - pub collection_authority: AccountInfo<'info>, - pub payer: AccountInfo<'info>, - pub update_authority: AccountInfo<'info>, - pub collection_mint: AccountInfo<'info>, - pub collection_metadata: AccountInfo<'info>, - pub collection_master_edition: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub collection_authority: UncheckedAccount<'info>, + pub payer: UncheckedAccount<'info>, + pub update_authority: UncheckedAccount<'info>, + pub collection_mint: UncheckedAccount<'info>, + pub collection_metadata: UncheckedAccount<'info>, + pub collection_master_edition: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct FreezeDelegatedAccount<'info> { - pub metadata: AccountInfo<'info>, - pub delegate: AccountInfo<'info>, - pub token_account: AccountInfo<'info>, - pub edition: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub token_program: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub delegate: UncheckedAccount<'info>, + pub token_account: UncheckedAccount<'info>, + pub edition: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub token_program: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct ThawDelegatedAccount<'info> { - pub metadata: AccountInfo<'info>, - pub delegate: AccountInfo<'info>, - pub token_account: AccountInfo<'info>, - pub edition: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub token_program: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub delegate: UncheckedAccount<'info>, + pub token_account: UncheckedAccount<'info>, + pub edition: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub token_program: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct UpdatePrimarySaleHappenedViaToken<'info> { - pub metadata: AccountInfo<'info>, - pub owner: AccountInfo<'info>, - pub token: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub owner: UncheckedAccount<'info>, + pub token: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct SignMetadata<'info> { - pub creator: AccountInfo<'info>, - pub metadata: AccountInfo<'info>, + pub creator: UncheckedAccount<'info>, + pub metadata: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct RemoveCreatorVerification<'info> { - pub creator: AccountInfo<'info>, - pub metadata: AccountInfo<'info>, + pub creator: UncheckedAccount<'info>, + pub metadata: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct Utilize<'info> { - pub metadata: AccountInfo<'info>, - pub token_account: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub use_authority: AccountInfo<'info>, - pub owner: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub token_account: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub use_authority: UncheckedAccount<'info>, + pub owner: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct UnverifyCollection<'info> { - pub metadata: AccountInfo<'info>, - pub collection_authority: AccountInfo<'info>, - pub collection_mint: AccountInfo<'info>, - pub collection: AccountInfo<'info>, - pub collection_master_edition_account: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub collection_authority: UncheckedAccount<'info>, + pub collection_mint: UncheckedAccount<'info>, + pub collection: UncheckedAccount<'info>, + pub collection_master_edition_account: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct UnverifySizedCollectionItem<'info> { - pub metadata: AccountInfo<'info>, - pub collection_authority: AccountInfo<'info>, - pub payer: AccountInfo<'info>, - pub collection_mint: AccountInfo<'info>, - pub collection: AccountInfo<'info>, - pub collection_master_edition_account: AccountInfo<'info>, + pub metadata: UncheckedAccount<'info>, + pub collection_authority: UncheckedAccount<'info>, + pub payer: UncheckedAccount<'info>, + pub collection_mint: UncheckedAccount<'info>, + pub collection: UncheckedAccount<'info>, + pub collection_master_edition_account: UncheckedAccount<'info>, } #[derive(Clone, Debug, PartialEq)] diff --git a/spl/src/shmem.rs b/spl/src/shmem.rs index e3de56438a..311b5c9bfe 100644 --- a/spl/src/shmem.rs +++ b/spl/src/shmem.rs @@ -1,13 +1,13 @@ //! CPI API for interacting with the SPL shared memory //! [program](https://github.com/solana-labs/solana-program-library/tree/master/shared-memory). -use anchor_lang::ToAccountInfo; -use anchor_lang::{context::CpiContext, Accounts}; -use solana_program::account_info::AccountInfo; -use solana_program::declare_id; -use solana_program::entrypoint::ProgramResult; -use solana_program::instruction::{AccountMeta, Instruction}; +use anchor_lang::{context::CpiContext, prelude::UncheckedAccount, Accounts, ToAccountInfo}; use solana_program::program; +use solana_program::{ + declare_id, + entrypoint::ProgramResult, + instruction::{AccountMeta, Instruction}, +}; // TODO: update this once the final shared memory program gets released. // shmem4EWT2sPdVGvTZCzXXRAURL9G5vpPxNwSeKhHUL. @@ -28,25 +28,23 @@ pub fn ret<'a, 'b, 'c, 'info>( accounts: vec![AccountMeta::new(*ctx.accounts.buffer.key, false)], data, }; - let mut accounts = vec![ctx.accounts.buffer]; - accounts.push(ctx.program.clone()); + let mut accounts = vec![ctx.accounts.buffer.to_account_info()]; + accounts.push(ctx.program.to_account_info()); program::invoke(&instruction, &accounts) } #[derive(Accounts)] -#[only_cpi] pub struct Ret<'info> { #[account(mut)] - pub buffer: AccountInfo<'info>, + pub buffer: UncheckedAccount<'info>, } // A set of accounts that can be used with shared memory. #[derive(Accounts)] -#[only_cpi] pub struct Shmem<'info> { // Shared memory account to write the return value into. #[account(mut, constraint = shmem.owner == shmem_program.key)] - pub shmem: AccountInfo<'info>, + pub shmem: UncheckedAccount<'info>, #[account(constraint = shmem_program.key == &ID)] - pub shmem_program: AccountInfo<'info>, + pub shmem_program: UncheckedAccount<'info>, } diff --git a/spl/src/stake.rs b/spl/src/stake.rs index bfbb8de030..ad674a99c8 100644 --- a/spl/src/stake.rs +++ b/spl/src/stake.rs @@ -1,5 +1,6 @@ use anchor_lang::{ context::CpiContext, + prelude::UncheckedAccount, solana_program::{ account_info::AccountInfo, pubkey::Pubkey, @@ -9,7 +10,7 @@ use anchor_lang::{ state::{StakeAuthorize, StakeState}, }, }, - Accounts, Result, + Accounts, Result, ToAccountInfo, }; use borsh::BorshDeserialize; use std::ops::Deref; @@ -29,9 +30,9 @@ pub fn authorize<'info>( custodian.as_ref().map(|c| c.key), ); let mut account_infos = vec![ - ctx.accounts.stake, - ctx.accounts.clock, - ctx.accounts.authorized, + ctx.accounts.stake.to_account_info(), + ctx.accounts.clock.to_account_info(), + ctx.accounts.authorized.to_account_info(), ]; if let Some(c) = custodian { account_infos.push(c); @@ -53,11 +54,11 @@ pub fn withdraw<'info>( custodian.as_ref().map(|c| c.key), ); let mut account_infos = vec![ - ctx.accounts.stake, - ctx.accounts.to, - ctx.accounts.clock, - ctx.accounts.stake_history, - ctx.accounts.withdrawer, + ctx.accounts.stake.to_account_info(), + ctx.accounts.to.to_account_info(), + ctx.accounts.clock.to_account_info(), + ctx.accounts.stake_history.to_account_info(), + ctx.accounts.withdrawer.to_account_info(), ]; if let Some(c) = custodian { account_infos.push(c); @@ -72,7 +73,11 @@ pub fn deactivate_stake<'info>( let ix = stake::instruction::deactivate_stake(ctx.accounts.stake.key, ctx.accounts.staker.key); solana_program::program::invoke_signed( &ix, - &[ctx.accounts.stake, ctx.accounts.clock, ctx.accounts.staker], + &[ + ctx.accounts.stake.to_account_info(), + ctx.accounts.clock.to_account_info(), + ctx.accounts.staker.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -81,51 +86,48 @@ pub fn deactivate_stake<'info>( // CPI accounts #[derive(Accounts)] -#[only_cpi] pub struct Authorize<'info> { /// The stake account to be updated - pub stake: AccountInfo<'info>, + pub stake: UncheckedAccount<'info>, /// The existing authority - pub authorized: AccountInfo<'info>, + pub authorized: UncheckedAccount<'info>, /// The new authority to replace the existing authority - pub new_authorized: AccountInfo<'info>, + pub new_authorized: UncheckedAccount<'info>, /// Clock sysvar - pub clock: AccountInfo<'info>, + pub clock: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct Withdraw<'info> { /// The stake account to be updated - pub stake: AccountInfo<'info>, + pub stake: UncheckedAccount<'info>, /// The stake account's withdraw authority - pub withdrawer: AccountInfo<'info>, + pub withdrawer: UncheckedAccount<'info>, /// Account to send withdrawn lamports to - pub to: AccountInfo<'info>, + pub to: UncheckedAccount<'info>, /// Clock sysvar - pub clock: AccountInfo<'info>, + pub clock: UncheckedAccount<'info>, /// StakeHistory sysvar - pub stake_history: AccountInfo<'info>, + pub stake_history: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct DeactivateStake<'info> { /// The stake account to be deactivated - pub stake: AccountInfo<'info>, + pub stake: UncheckedAccount<'info>, /// The stake account's stake authority - pub staker: AccountInfo<'info>, + pub staker: UncheckedAccount<'info>, /// Clock sysvar - pub clock: AccountInfo<'info>, + pub clock: UncheckedAccount<'info>, } // State diff --git a/spl/src/token.rs b/spl/src/token.rs index 44f2f64d05..127da5b7c0 100644 --- a/spl/src/token.rs +++ b/spl/src/token.rs @@ -1,9 +1,10 @@ +use anchor_lang::prelude::UncheckedAccount; use anchor_lang::solana_program::account_info::AccountInfo; use anchor_lang::solana_program::program_pack::Pack; use anchor_lang::solana_program::pubkey::Pubkey; use anchor_lang::{context::CpiContext, Accounts}; -use anchor_lang::{solana_program, Result}; +use anchor_lang::{solana_program, Result, ToAccountInfo}; use std::ops::Deref; pub use spl_token; @@ -23,7 +24,11 @@ pub fn transfer<'info>( )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.from, ctx.accounts.to, ctx.accounts.authority], + &[ + ctx.accounts.from.to_account_info(), + ctx.accounts.to.to_account_info(), + ctx.accounts.authority.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -47,10 +52,10 @@ pub fn transfer_checked<'info>( solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.from, - ctx.accounts.mint, - ctx.accounts.to, - ctx.accounts.authority, + ctx.accounts.from.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.to.to_account_info(), + ctx.accounts.authority.to_account_info(), ], ctx.signer_seeds, ) @@ -71,7 +76,11 @@ pub fn mint_to<'info>( )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.to, ctx.accounts.mint, ctx.accounts.authority], + &[ + ctx.accounts.to.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.authority.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -88,7 +97,11 @@ pub fn burn<'info>(ctx: CpiContext<'_, '_, '_, 'info, Burn<'info>>, amount: u64) )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.from, ctx.accounts.mint, ctx.accounts.authority], + &[ + ctx.accounts.from.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.authority.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -109,9 +122,9 @@ pub fn approve<'info>( solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.to, - ctx.accounts.delegate, - ctx.accounts.authority, + ctx.accounts.to.to_account_info(), + ctx.accounts.delegate.to_account_info(), + ctx.accounts.authority.to_account_info(), ], ctx.signer_seeds, ) @@ -136,10 +149,10 @@ pub fn approve_checked<'info>( solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.to, - ctx.accounts.mint, - ctx.accounts.delegate, - ctx.accounts.authority, + ctx.accounts.to.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.delegate.to_account_info(), + ctx.accounts.authority.to_account_info(), ], ctx.signer_seeds, ) @@ -155,7 +168,10 @@ pub fn revoke<'info>(ctx: CpiContext<'_, '_, '_, 'info, Revoke<'info>>) -> Resul )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.source, ctx.accounts.authority], + &[ + ctx.accounts.source.to_account_info(), + ctx.accounts.authority.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -173,10 +189,10 @@ pub fn initialize_account<'info>( solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.account, - ctx.accounts.mint, - ctx.accounts.authority, - ctx.accounts.rent, + ctx.accounts.account.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.authority.to_account_info(), + ctx.accounts.rent.to_account_info(), ], ctx.signer_seeds, ) @@ -194,7 +210,10 @@ pub fn initialize_account3<'info>( )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.account, ctx.accounts.mint], + &[ + ctx.accounts.account.to_account_info(), + ctx.accounts.mint.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -211,9 +230,9 @@ pub fn close_account<'info>(ctx: CpiContext<'_, '_, '_, 'info, CloseAccount<'inf solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.account, - ctx.accounts.destination, - ctx.accounts.authority, + ctx.accounts.account.to_account_info(), + ctx.accounts.destination.to_account_info(), + ctx.accounts.authority.to_account_info(), ], ctx.signer_seeds, ) @@ -233,9 +252,9 @@ pub fn freeze_account<'info>( solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.account, - ctx.accounts.mint, - ctx.accounts.authority, + ctx.accounts.account.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.authority.to_account_info(), ], ctx.signer_seeds, ) @@ -253,9 +272,9 @@ pub fn thaw_account<'info>(ctx: CpiContext<'_, '_, '_, 'info, ThawAccount<'info> solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.account, - ctx.accounts.mint, - ctx.accounts.authority, + ctx.accounts.account.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.authority.to_account_info(), ], ctx.signer_seeds, ) @@ -277,7 +296,10 @@ pub fn initialize_mint<'info>( )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.mint, ctx.accounts.rent], + &[ + ctx.accounts.mint.to_account_info(), + ctx.accounts.rent.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -296,8 +318,12 @@ pub fn initialize_mint2<'info>( freeze_authority, decimals, )?; - solana_program::program::invoke_signed(&ix, &[ctx.accounts.mint], ctx.signer_seeds) - .map_err(Into::into) + solana_program::program::invoke_signed( + &ix, + &[ctx.accounts.mint.to_account_info()], + ctx.signer_seeds, + ) + .map_err(Into::into) } pub fn set_authority<'info>( @@ -320,7 +346,10 @@ pub fn set_authority<'info>( )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.account_or_mint, ctx.accounts.current_authority], + &[ + ctx.accounts.account_or_mint.to_account_info(), + ctx.accounts.current_authority.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -328,132 +357,120 @@ pub fn set_authority<'info>( pub fn sync_native<'info>(ctx: CpiContext<'_, '_, '_, 'info, SyncNative<'info>>) -> Result<()> { let ix = spl_token::instruction::sync_native(&spl_token::ID, ctx.accounts.account.key)?; - solana_program::program::invoke_signed(&ix, &[ctx.accounts.account], ctx.signer_seeds) - .map_err(Into::into) + solana_program::program::invoke_signed( + &ix, + &[ctx.accounts.account.to_account_info()], + ctx.signer_seeds, + ) + .map_err(Into::into) } #[derive(Accounts)] -#[only_cpi] pub struct Transfer<'info> { - pub from: AccountInfo<'info>, - pub to: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub from: UncheckedAccount<'info>, + pub to: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct TransferChecked<'info> { - pub from: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub to: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub from: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub to: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct MintTo<'info> { - pub mint: AccountInfo<'info>, - pub to: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub mint: UncheckedAccount<'info>, + pub to: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct Burn<'info> { - pub mint: AccountInfo<'info>, - pub from: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub mint: UncheckedAccount<'info>, + pub from: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct Approve<'info> { - pub to: AccountInfo<'info>, - pub delegate: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub to: UncheckedAccount<'info>, + pub delegate: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct ApproveChecked<'info> { - pub to: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub delegate: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub to: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub delegate: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct Revoke<'info> { - pub source: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub source: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct InitializeAccount<'info> { - pub account: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub authority: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct InitializeAccount3<'info> { - pub account: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct CloseAccount<'info> { - pub account: AccountInfo<'info>, - pub destination: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, + pub destination: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct FreezeAccount<'info> { - pub account: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct ThawAccount<'info> { - pub account: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct InitializeMint<'info> { - pub mint: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub mint: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct InitializeMint2<'info> { - pub mint: AccountInfo<'info>, + pub mint: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct SetAuthority<'info> { - pub current_authority: AccountInfo<'info>, - pub account_or_mint: AccountInfo<'info>, + pub current_authority: UncheckedAccount<'info>, + pub account_or_mint: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct SyncNative<'info> { - pub account: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, } #[derive(Clone, Debug, Default, PartialEq)] diff --git a/spl/src/token_2022.rs b/spl/src/token_2022.rs index f97c761b40..cf9133d2a1 100644 --- a/spl/src/token_2022.rs +++ b/spl/src/token_2022.rs @@ -1,8 +1,9 @@ -use anchor_lang::solana_program::account_info::AccountInfo; - -use anchor_lang::solana_program::pubkey::Pubkey; -use anchor_lang::{context::CpiContext, Accounts}; -use anchor_lang::{solana_program, Result}; +use anchor_lang::{ + context::CpiContext, + prelude::UncheckedAccount, + solana_program::{self, pubkey::Pubkey}, + Accounts, Result, ToAccountInfo, +}; pub use spl_token_2022; pub use spl_token_2022::ID; @@ -26,7 +27,11 @@ pub fn transfer<'info>( )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.from, ctx.accounts.to, ctx.accounts.authority], + &[ + ctx.accounts.from.to_account_info(), + ctx.accounts.to.to_account_info(), + ctx.accounts.authority.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -50,10 +55,10 @@ pub fn transfer_checked<'info>( solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.from, - ctx.accounts.mint, - ctx.accounts.to, - ctx.accounts.authority, + ctx.accounts.from.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.to.to_account_info(), + ctx.accounts.authority.to_account_info(), ], ctx.signer_seeds, ) @@ -74,7 +79,11 @@ pub fn mint_to<'info>( )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.to, ctx.accounts.mint, ctx.accounts.authority], + &[ + ctx.accounts.to.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.authority.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -91,7 +100,11 @@ pub fn burn<'info>(ctx: CpiContext<'_, '_, '_, 'info, Burn<'info>>, amount: u64) )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.from, ctx.accounts.mint, ctx.accounts.authority], + &[ + ctx.accounts.from.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.authority.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -112,9 +125,9 @@ pub fn approve<'info>( solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.to, - ctx.accounts.delegate, - ctx.accounts.authority, + ctx.accounts.to.to_account_info(), + ctx.accounts.delegate.to_account_info(), + ctx.accounts.authority.to_account_info(), ], ctx.signer_seeds, ) @@ -130,7 +143,10 @@ pub fn revoke<'info>(ctx: CpiContext<'_, '_, '_, 'info, Revoke<'info>>) -> Resul )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.source, ctx.accounts.authority], + &[ + ctx.accounts.source.to_account_info(), + ctx.accounts.authority.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -148,10 +164,10 @@ pub fn initialize_account<'info>( solana_program::program::invoke( &ix, &[ - ctx.accounts.account, - ctx.accounts.mint, - ctx.accounts.authority, - ctx.accounts.rent, + ctx.accounts.account.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.authority.to_account_info(), + ctx.accounts.rent.to_account_info(), ], ) .map_err(Into::into) @@ -166,8 +182,14 @@ pub fn initialize_account3<'info>( ctx.accounts.mint.key, ctx.accounts.authority.key, )?; - solana_program::program::invoke(&ix, &[ctx.accounts.account, ctx.accounts.mint]) - .map_err(Into::into) + solana_program::program::invoke( + &ix, + &[ + ctx.accounts.account.to_account_info(), + ctx.accounts.mint.to_account_info(), + ], + ) + .map_err(Into::into) } pub fn close_account<'info>(ctx: CpiContext<'_, '_, '_, 'info, CloseAccount<'info>>) -> Result<()> { @@ -181,9 +203,9 @@ pub fn close_account<'info>(ctx: CpiContext<'_, '_, '_, 'info, CloseAccount<'inf solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.account, - ctx.accounts.destination, - ctx.accounts.authority, + ctx.accounts.account.to_account_info(), + ctx.accounts.destination.to_account_info(), + ctx.accounts.authority.to_account_info(), ], ctx.signer_seeds, ) @@ -203,9 +225,9 @@ pub fn freeze_account<'info>( solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.account, - ctx.accounts.mint, - ctx.accounts.authority, + ctx.accounts.account.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.authority.to_account_info(), ], ctx.signer_seeds, ) @@ -223,9 +245,9 @@ pub fn thaw_account<'info>(ctx: CpiContext<'_, '_, '_, 'info, ThawAccount<'info> solana_program::program::invoke_signed( &ix, &[ - ctx.accounts.account, - ctx.accounts.mint, - ctx.accounts.authority, + ctx.accounts.account.to_account_info(), + ctx.accounts.mint.to_account_info(), + ctx.accounts.authority.to_account_info(), ], ctx.signer_seeds, ) @@ -245,8 +267,14 @@ pub fn initialize_mint<'info>( freeze_authority, decimals, )?; - solana_program::program::invoke(&ix, &[ctx.accounts.mint, ctx.accounts.rent]) - .map_err(Into::into) + solana_program::program::invoke( + &ix, + &[ + ctx.accounts.mint.to_account_info(), + ctx.accounts.rent.to_account_info(), + ], + ) + .map_err(Into::into) } pub fn initialize_mint2<'info>( @@ -262,7 +290,7 @@ pub fn initialize_mint2<'info>( freeze_authority, decimals, )?; - solana_program::program::invoke(&ix, &[ctx.accounts.mint]).map_err(Into::into) + solana_program::program::invoke(&ix, &[ctx.accounts.mint.to_account_info()]).map_err(Into::into) } pub fn set_authority<'info>( @@ -285,7 +313,10 @@ pub fn set_authority<'info>( )?; solana_program::program::invoke_signed( &ix, - &[ctx.accounts.account_or_mint, ctx.accounts.current_authority], + &[ + ctx.accounts.account_or_mint.to_account_info(), + ctx.accounts.current_authority.to_account_info(), + ], ctx.signer_seeds, ) .map_err(Into::into) @@ -293,7 +324,8 @@ pub fn set_authority<'info>( pub fn sync_native<'info>(ctx: CpiContext<'_, '_, '_, 'info, SyncNative<'info>>) -> Result<()> { let ix = spl_token_2022::instruction::sync_native(ctx.program.key, ctx.accounts.account.key)?; - solana_program::program::invoke(&ix, &[ctx.accounts.account]).map_err(Into::into) + solana_program::program::invoke(&ix, &[ctx.accounts.account.to_account_info()]) + .map_err(Into::into) } pub fn get_account_data_size<'info>( @@ -305,7 +337,7 @@ pub fn get_account_data_size<'info>( ctx.accounts.mint.key, extension_types, )?; - solana_program::program::invoke(&ix, &[ctx.accounts.mint])?; + solana_program::program::invoke(&ix, &[ctx.accounts.mint.to_account_info()])?; solana_program::program::get_return_data() .ok_or(solana_program::program_error::ProgramError::InvalidInstructionData) .and_then(|(key, data)| { @@ -329,7 +361,7 @@ pub fn initialize_mint_close_authority<'info>( ctx.accounts.mint.key, close_authority, )?; - solana_program::program::invoke(&ix, &[ctx.accounts.mint]).map_err(Into::into) + solana_program::program::invoke(&ix, &[ctx.accounts.mint.to_account_info()]).map_err(Into::into) } pub fn initialize_immutable_owner<'info>( @@ -339,7 +371,8 @@ pub fn initialize_immutable_owner<'info>( ctx.program.key, ctx.accounts.account.key, )?; - solana_program::program::invoke(&ix, &[ctx.accounts.account]).map_err(Into::into) + solana_program::program::invoke(&ix, &[ctx.accounts.account.to_account_info()]) + .map_err(Into::into) } pub fn amount_to_ui_amount<'info>( @@ -351,7 +384,7 @@ pub fn amount_to_ui_amount<'info>( ctx.accounts.account.key, amount, )?; - solana_program::program::invoke(&ix, &[ctx.accounts.account])?; + solana_program::program::invoke(&ix, &[ctx.accounts.account.to_account_info()])?; solana_program::program::get_return_data() .ok_or(solana_program::program_error::ProgramError::InvalidInstructionData) .and_then(|(key, data)| { @@ -375,7 +408,7 @@ pub fn ui_amount_to_amount<'info>( ctx.accounts.account.key, ui_amount, )?; - solana_program::program::invoke(&ix, &[ctx.accounts.account])?; + solana_program::program::invoke(&ix, &[ctx.accounts.account.to_account_info()])?; solana_program::program::get_return_data() .ok_or(solana_program::program_error::ProgramError::InvalidInstructionData) .and_then(|(key, data)| { @@ -391,148 +424,128 @@ pub fn ui_amount_to_amount<'info>( } #[derive(Accounts)] -#[only_cpi] pub struct Transfer<'info> { - pub from: AccountInfo<'info>, - pub to: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub from: UncheckedAccount<'info>, + pub to: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct TransferChecked<'info> { - pub from: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub to: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub from: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub to: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct MintTo<'info> { - pub mint: AccountInfo<'info>, - pub to: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub mint: UncheckedAccount<'info>, + pub to: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct Burn<'info> { - pub mint: AccountInfo<'info>, - pub from: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub mint: UncheckedAccount<'info>, + pub from: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct Approve<'info> { - pub to: AccountInfo<'info>, - pub delegate: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub to: UncheckedAccount<'info>, + pub delegate: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct Revoke<'info> { - pub source: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub source: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct InitializeAccount<'info> { - pub account: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub authority: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct InitializeAccount3<'info> { - pub account: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct CloseAccount<'info> { - pub account: AccountInfo<'info>, - pub destination: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, + pub destination: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct FreezeAccount<'info> { - pub account: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct ThawAccount<'info> { - pub account: AccountInfo<'info>, - pub mint: AccountInfo<'info>, - pub authority: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, + pub mint: UncheckedAccount<'info>, + pub authority: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct InitializeMint<'info> { - pub mint: AccountInfo<'info>, - pub rent: AccountInfo<'info>, + pub mint: UncheckedAccount<'info>, + pub rent: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct InitializeMint2<'info> { - pub mint: AccountInfo<'info>, + pub mint: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct SetAuthority<'info> { - pub current_authority: AccountInfo<'info>, - pub account_or_mint: AccountInfo<'info>, + pub current_authority: UncheckedAccount<'info>, + pub account_or_mint: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct SyncNative<'info> { - pub account: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct GetAccountDataSize<'info> { - pub mint: AccountInfo<'info>, + pub mint: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct InitializeMintCloseAuthority<'info> { - pub mint: AccountInfo<'info>, + pub mint: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct InitializeImmutableOwner<'info> { - pub account: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct AmountToUiAmount<'info> { - pub account: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, } #[derive(Accounts)] -#[only_cpi] pub struct UiAmountToAmount<'info> { - pub account: AccountInfo<'info>, + pub account: UncheckedAccount<'info>, } #[derive(Clone)] diff --git a/tests/cpi-returns/programs/caller/src/lib.rs b/tests/cpi-returns/programs/caller/src/lib.rs index ff093e971e..30715746f7 100644 --- a/tests/cpi-returns/programs/caller/src/lib.rs +++ b/tests/cpi-returns/programs/caller/src/lib.rs @@ -18,7 +18,7 @@ pub mod caller { pub fn cpi_call_return_u64(ctx: Context) -> Result<()> { let cpi_program = ctx.accounts.cpi_return_program.to_account_info(); let cpi_accounts = CpiReturn { - account: ctx.accounts.cpi_return.to_account_info(), + account: ctx.accounts.cpi_return.clone().into(), }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let result = callee::cpi::return_u64(cpi_ctx)?; @@ -30,7 +30,7 @@ pub mod caller { pub fn cpi_call_return_struct(ctx: Context) -> Result<()> { let cpi_program = ctx.accounts.cpi_return_program.to_account_info(); let cpi_accounts = CpiReturn { - account: ctx.accounts.cpi_return.to_account_info(), + account: ctx.accounts.cpi_return.clone().into(), }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let result = callee::cpi::return_struct(cpi_ctx)?; @@ -42,7 +42,7 @@ pub mod caller { pub fn cpi_call_return_vec(ctx: Context) -> Result<()> { let cpi_program = ctx.accounts.cpi_return_program.to_account_info(); let cpi_accounts = CpiReturn { - account: ctx.accounts.cpi_return.to_account_info(), + account: ctx.accounts.cpi_return.clone().into(), }; let cpi_ctx = CpiContext::new(cpi_program, cpi_accounts); let result = callee::cpi::return_vec(cpi_ctx)?; diff --git a/tests/spl/token-proxy/programs/token-proxy/src/lib.rs b/tests/spl/token-proxy/programs/token-proxy/src/lib.rs index 264fd61a70..dd88842c5a 100644 --- a/tests/spl/token-proxy/programs/token-proxy/src/lib.rs +++ b/tests/spl/token-proxy/programs/token-proxy/src/lib.rs @@ -21,19 +21,19 @@ mod token_proxy { if let Some(token_program) = &ctx.accounts.token_program { if let Some(mint) = &ctx.accounts.mint { let cpi_accounts = TransferChecked { - from: ctx.accounts.from.to_account_info(), - mint: mint.to_account_info(), - to: ctx.accounts.to.to_account_info(), - authority: ctx.accounts.authority.to_account_info(), + from: ctx.accounts.from.clone().into(), + mint: mint.clone().into(), + to: ctx.accounts.to.clone().into(), + authority: ctx.accounts.authority.clone().into(), }; let cpi_program = token_program.to_account_info(); let cpi_context = CpiContext::new(cpi_program, cpi_accounts); token_interface::transfer_checked(cpi_context, amount, mint.decimals) } else { let cpi_accounts = Transfer { - from: ctx.accounts.from.to_account_info(), - to: ctx.accounts.to.to_account_info(), - authority: ctx.accounts.authority.to_account_info(), + from: ctx.accounts.from.clone().into(), + to: ctx.accounts.to.clone().into(), + authority: ctx.accounts.authority.clone().into(), }; let cpi_program = token_program.to_account_info(); let cpi_context = CpiContext::new(cpi_program, cpi_accounts); @@ -204,9 +204,9 @@ impl<'a, 'b, 'c, 'info> From<&mut ProxyTransfer<'info>> { fn from(accounts: &mut ProxyTransfer<'info>) -> CpiContext<'a, 'b, 'c, 'info, Transfer<'info>> { let cpi_accounts = Transfer { - from: accounts.from.to_account_info(), - to: accounts.to.to_account_info(), - authority: accounts.authority.to_account_info(), + from: accounts.from.clone().into(), + to: accounts.to.clone().into(), + authority: accounts.authority.clone().into(), }; let cpi_program = accounts.token_program.to_account_info(); CpiContext::new(cpi_program, cpi_accounts) @@ -218,9 +218,9 @@ impl<'a, 'b, 'c, 'info> From<&mut ProxyMintTo<'info>> { fn from(accounts: &mut ProxyMintTo<'info>) -> CpiContext<'a, 'b, 'c, 'info, MintTo<'info>> { let cpi_accounts = MintTo { - mint: accounts.mint.to_account_info(), - to: accounts.to.to_account_info(), - authority: accounts.authority.to_account_info(), + mint: accounts.mint.clone().into(), + to: accounts.to.clone().into(), + authority: accounts.authority.clone().into(), }; let cpi_program = accounts.token_program.to_account_info(); CpiContext::new(cpi_program, cpi_accounts) @@ -230,9 +230,9 @@ impl<'a, 'b, 'c, 'info> From<&mut ProxyMintTo<'info>> impl<'a, 'b, 'c, 'info> From<&mut ProxyBurn<'info>> for CpiContext<'a, 'b, 'c, 'info, Burn<'info>> { fn from(accounts: &mut ProxyBurn<'info>) -> CpiContext<'a, 'b, 'c, 'info, Burn<'info>> { let cpi_accounts = Burn { - mint: accounts.mint.to_account_info(), - from: accounts.from.to_account_info(), - authority: accounts.authority.to_account_info(), + mint: accounts.mint.clone().into(), + from: accounts.from.clone().into(), + authority: accounts.authority.clone().into(), }; let cpi_program = accounts.token_program.to_account_info(); CpiContext::new(cpi_program, cpi_accounts) @@ -246,8 +246,8 @@ impl<'a, 'b, 'c, 'info> From<&mut ProxySetAuthority<'info>> accounts: &mut ProxySetAuthority<'info>, ) -> CpiContext<'a, 'b, 'c, 'info, SetAuthority<'info>> { let cpi_accounts = SetAuthority { - account_or_mint: accounts.account_or_mint.to_account_info(), - current_authority: accounts.current_authority.to_account_info(), + account_or_mint: accounts.account_or_mint.clone().into(), + current_authority: accounts.current_authority.clone().into(), }; // TODO: Support multisig signers let cpi_program = accounts.token_program.to_account_info(); CpiContext::new(cpi_program, cpi_accounts) diff --git a/tests/spl/token-wrapper/programs/token-wrapper/src/lib.rs b/tests/spl/token-wrapper/programs/token-wrapper/src/lib.rs index b8a38727d8..fad1f5a42f 100644 --- a/tests/spl/token-wrapper/programs/token-wrapper/src/lib.rs +++ b/tests/spl/token-wrapper/programs/token-wrapper/src/lib.rs @@ -31,10 +31,11 @@ pub mod token_wrapper { from: ctx .accounts .initializer_deposit_token_account - .to_account_info(), - mint: ctx.accounts.deposit_mint.to_account_info(), - to: ctx.accounts.deposit_token_vault.to_account_info(), - authority: ctx.accounts.initializer.to_account_info(), + .clone() + .into(), + mint: ctx.accounts.deposit_mint.clone().into(), + to: ctx.accounts.deposit_token_vault.clone().into(), + authority: ctx.accounts.initializer.clone().into(), }, ), initializer_amount, @@ -53,12 +54,13 @@ pub mod token_wrapper { CpiContext::new_with_signer( ctx.accounts.wrapped_token_program.to_account_info(), token_interface::MintTo { - mint: ctx.accounts.wrapped_mint.to_account_info(), + mint: ctx.accounts.wrapped_mint.clone().into(), to: ctx .accounts .initializer_wrapped_token_account - .to_account_info(), - authority: ctx.accounts.wrapper_authority.to_account_info(), + .clone() + .into(), + authority: ctx.accounts.wrapper_authority.clone().into(), }, signer_seeds, ), @@ -74,10 +76,10 @@ pub mod token_wrapper { CpiContext::new( ctx.accounts.deposit_token_program.to_account_info(), token_interface::TransferChecked { - from: ctx.accounts.user_deposit_token_account.to_account_info(), - mint: ctx.accounts.deposit_mint.to_account_info(), - to: ctx.accounts.deposit_token_vault.to_account_info(), - authority: ctx.accounts.signer.to_account_info(), + from: ctx.accounts.user_deposit_token_account.clone().into(), + mint: ctx.accounts.deposit_mint.clone().into(), + to: ctx.accounts.deposit_token_vault.clone().into(), + authority: ctx.accounts.signer.clone().into(), }, ), wrap_amount, @@ -96,9 +98,9 @@ pub mod token_wrapper { CpiContext::new_with_signer( ctx.accounts.wrapped_token_program.to_account_info(), token_interface::MintTo { - mint: ctx.accounts.wrapped_mint.to_account_info(), - to: ctx.accounts.user_wrapped_token_account.to_account_info(), - authority: ctx.accounts.wrapper_authority.to_account_info(), + mint: ctx.accounts.wrapped_mint.clone().into(), + to: ctx.accounts.user_wrapped_token_account.clone().into(), + authority: ctx.accounts.wrapper_authority.clone().into(), }, signer_seeds, ), @@ -114,9 +116,9 @@ pub mod token_wrapper { CpiContext::new( ctx.accounts.wrapped_token_program.to_account_info(), token_interface::Burn { - mint: ctx.accounts.wrapped_mint.to_account_info(), - from: ctx.accounts.user_wrapped_token_account.to_account_info(), - authority: ctx.accounts.signer.to_account_info(), + mint: ctx.accounts.wrapped_mint.clone().into(), + from: ctx.accounts.user_wrapped_token_account.clone().into(), + authority: ctx.accounts.signer.clone().into(), }, ), unwrap_amount, @@ -134,10 +136,10 @@ pub mod token_wrapper { CpiContext::new_with_signer( ctx.accounts.deposit_token_program.to_account_info(), token_interface::TransferChecked { - from: ctx.accounts.deposit_token_vault.to_account_info(), - mint: ctx.accounts.deposit_mint.to_account_info(), - to: ctx.accounts.user_deposit_token_account.to_account_info(), - authority: ctx.accounts.wrapper_authority.to_account_info(), + from: ctx.accounts.deposit_token_vault.clone().into(), + mint: ctx.accounts.deposit_mint.clone().into(), + to: ctx.accounts.user_deposit_token_account.clone().into(), + authority: ctx.accounts.wrapper_authority.clone().into(), }, signer_seeds, ),