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,
),