diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b94072c..2e45bfdc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ incremented for features. * lang: Ignore `Unnamed` structs instead of panic ([#605](https://github.com/project-serum/anchor/pull/605)). * lang: Add constraints for initializing mint accounts as pdas, `#[account(init, seeds = [...], mint::decimals = , mint::authority = )]` ([#562](https://github.com/project-serum/anchor/pull/562)). +* lang: Add `AsRef` for `AccountInfo` wrappers ([#652](https://github.com/project-serum/anchor/pull/652)). +* lang: Optimize `trait Key` by removing `AccountInfo` cloning ([#652](https://github.com/project-serum/anchor/pull/652)). ### Breaking Changes diff --git a/lang/src/account_info.rs b/lang/src/account_info.rs index b92dda33..b33ebd3b 100644 --- a/lang/src/account_info.rs +++ b/lang/src/account_info.rs @@ -1,5 +1,5 @@ use crate::error::ErrorCode; -use crate::{Accounts, AccountsExit, ToAccountInfo, ToAccountInfos, ToAccountMetas}; +use crate::{Accounts, AccountsExit, Key, ToAccountInfo, ToAccountInfos, ToAccountMetas}; use solana_program::account_info::AccountInfo; use solana_program::entrypoint::ProgramResult; use solana_program::instruction::AccountMeta; @@ -50,3 +50,9 @@ impl<'info> AccountsExit<'info> for AccountInfo<'info> { Ok(()) } } + +impl<'info> Key for AccountInfo<'info> { + fn key(&self) -> Pubkey { + *self.key + } +} diff --git a/lang/src/cpi_account.rs b/lang/src/cpi_account.rs index a69fd840..c7b31374 100644 --- a/lang/src/cpi_account.rs +++ b/lang/src/cpi_account.rs @@ -1,6 +1,6 @@ use crate::error::ErrorCode; use crate::{ - AccountDeserialize, Accounts, AccountsExit, ToAccountInfo, ToAccountInfos, ToAccountMetas, + AccountDeserialize, Accounts, AccountsExit, Key, ToAccountInfo, ToAccountInfos, ToAccountMetas, }; use solana_program::account_info::AccountInfo; use solana_program::entrypoint::ProgramResult; @@ -113,3 +113,9 @@ impl<'info, T: AccountDeserialize + Clone> AccountsExit<'info> for CpiAccount<'i Ok(()) } } + +impl<'info, T: AccountDeserialize + Clone> Key for CpiAccount<'info, T> { + fn key(&self) -> Pubkey { + *self.info.key + } +} diff --git a/lang/src/cpi_state.rs b/lang/src/cpi_state.rs index 32475638..47bdbcb6 100644 --- a/lang/src/cpi_state.rs +++ b/lang/src/cpi_state.rs @@ -1,7 +1,7 @@ use crate::error::ErrorCode; use crate::{ - AccountDeserialize, AccountSerialize, Accounts, AccountsExit, CpiStateContext, ProgramState, - ToAccountInfo, ToAccountInfos, ToAccountMetas, + AccountDeserialize, AccountSerialize, Accounts, AccountsExit, CpiStateContext, Key, + ProgramState, ToAccountInfo, ToAccountInfos, ToAccountMetas, }; use solana_program::account_info::AccountInfo; use solana_program::entrypoint::ProgramResult; @@ -110,6 +110,14 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Clone> ToAccountInfo<'inf } } +impl<'info, T: AccountSerialize + AccountDeserialize + Clone> AsRef> + for CpiState<'info, T> +{ + fn as_ref(&self) -> &AccountInfo<'info> { + &self.inner.info + } +} + impl<'info, T: AccountSerialize + AccountDeserialize + Clone> Deref for CpiState<'info, T> { type Target = T; @@ -132,3 +140,9 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Clone> AccountsExit<'info Ok(()) } } + +impl<'info, T: AccountSerialize + AccountDeserialize + Clone> Key for CpiState<'info, T> { + fn key(&self) -> Pubkey { + *self.inner.info.key + } +} diff --git a/lang/src/lib.rs b/lang/src/lib.rs index bb3648d4..4e4a0e0f 100644 --- a/lang/src/lib.rs +++ b/lang/src/lib.rs @@ -203,15 +203,6 @@ pub trait Key { fn key(&self) -> Pubkey; } -impl<'info, T> Key for T -where - T: ToAccountInfo<'info>, -{ - fn key(&self) -> Pubkey { - *self.to_account_info().key - } -} - impl Key for Pubkey { fn key(&self) -> Pubkey { *self diff --git a/lang/src/loader.rs b/lang/src/loader.rs index e4bdb453..19f03427 100644 --- a/lang/src/loader.rs +++ b/lang/src/loader.rs @@ -1,6 +1,7 @@ use crate::error::ErrorCode; use crate::{ - Accounts, AccountsClose, AccountsExit, ToAccountInfo, ToAccountInfos, ToAccountMetas, ZeroCopy, + Accounts, AccountsClose, AccountsExit, Key, ToAccountInfo, ToAccountInfos, ToAccountMetas, + ZeroCopy, }; use solana_program::account_info::AccountInfo; use solana_program::entrypoint::ProgramResult; @@ -166,6 +167,12 @@ impl<'info, T: ZeroCopy> ToAccountMetas for Loader<'info, T> { } } +impl<'info, T: ZeroCopy> AsRef> for Loader<'info, T> { + fn as_ref(&self) -> &AccountInfo<'info> { + &self.acc_info + } +} + impl<'info, T: ZeroCopy> ToAccountInfos<'info> for Loader<'info, T> { fn to_account_infos(&self) -> Vec> { vec![self.acc_info.clone()] @@ -177,3 +184,9 @@ impl<'info, T: ZeroCopy> ToAccountInfo<'info> for Loader<'info, T> { self.acc_info.clone() } } + +impl<'info, T: ZeroCopy> Key for Loader<'info, T> { + fn key(&self) -> Pubkey { + *self.acc_info.key + } +} diff --git a/lang/src/program_account.rs b/lang/src/program_account.rs index 814c67ce..98b6abf8 100644 --- a/lang/src/program_account.rs +++ b/lang/src/program_account.rs @@ -1,6 +1,6 @@ use crate::error::ErrorCode; use crate::{ - AccountDeserialize, AccountSerialize, Accounts, AccountsClose, AccountsExit, CpiAccount, + AccountDeserialize, AccountSerialize, Accounts, AccountsClose, AccountsExit, CpiAccount, Key, ToAccountInfo, ToAccountInfos, ToAccountMetas, }; use solana_program::account_info::AccountInfo; @@ -163,3 +163,9 @@ where Self::new(a.to_account_info(), Deref::deref(&a).clone()) } } + +impl<'info, T: AccountSerialize + AccountDeserialize + Clone> Key for ProgramAccount<'info, T> { + fn key(&self) -> Pubkey { + *self.inner.info.key + } +} diff --git a/lang/src/state.rs b/lang/src/state.rs index 4acc81b4..4eee0964 100644 --- a/lang/src/state.rs +++ b/lang/src/state.rs @@ -1,6 +1,6 @@ use crate::error::ErrorCode; use crate::{ - AccountDeserialize, AccountSerialize, Accounts, AccountsExit, CpiAccount, ToAccountInfo, + AccountDeserialize, AccountSerialize, Accounts, AccountsExit, CpiAccount, Key, ToAccountInfo, ToAccountInfos, ToAccountMetas, }; use solana_program::account_info::AccountInfo; @@ -109,6 +109,14 @@ impl<'info, T: AccountSerialize + AccountDeserialize + Clone> ToAccountInfo<'inf } } +impl<'info, T: AccountSerialize + AccountDeserialize + Clone> AsRef> + for ProgramState<'info, T> +{ + fn as_ref(&self) -> &AccountInfo<'info> { + &self.inner.info + } +} + impl<'a, T: AccountSerialize + AccountDeserialize + Clone> Deref for ProgramState<'a, T> { type Target = T; @@ -151,3 +159,9 @@ pub fn address(program_id: &Pubkey) -> Pubkey { let owner = program_id; Pubkey::create_with_seed(&base, seed, owner).unwrap() } + +impl<'info, T: AccountSerialize + AccountDeserialize + Clone> Key for ProgramState<'info, T> { + fn key(&self) -> Pubkey { + *self.inner.info.key + } +} diff --git a/lang/src/sysvar.rs b/lang/src/sysvar.rs index 2f1b36c2..11bdafb6 100644 --- a/lang/src/sysvar.rs +++ b/lang/src/sysvar.rs @@ -1,5 +1,5 @@ use crate::error::ErrorCode; -use crate::{Accounts, AccountsExit, ToAccountInfo, ToAccountInfos, ToAccountMetas}; +use crate::{Accounts, AccountsExit, Key, ToAccountInfo, ToAccountInfos, ToAccountMetas}; use solana_program::account_info::AccountInfo; use solana_program::entrypoint::ProgramResult; use solana_program::instruction::AccountMeta; @@ -60,6 +60,12 @@ impl<'info, T: solana_program::sysvar::Sysvar> ToAccountInfos<'info> for Sysvar< } } +impl<'info, T: solana_program::sysvar::Sysvar> AsRef> for Sysvar<'info, T> { + fn as_ref(&self) -> &AccountInfo<'info> { + &self.info + } +} + impl<'a, T: solana_program::sysvar::Sysvar> Deref for Sysvar<'a, T> { type Target = T; @@ -86,3 +92,9 @@ impl<'info, T: solana_program::sysvar::Sysvar> AccountsExit<'info> for Sysvar<'i Ok(()) } } + +impl<'info, T: solana_program::sysvar::Sysvar> Key for Sysvar<'info, T> { + fn key(&self) -> Pubkey { + *self.info.key + } +}