pub struct CpiContext<'a, 'b, 'c, 'info, T>where
T: ToAccountMetas + ToAccountInfos<'info>,{
pub accounts: T,
pub remaining_accounts: Vec<AccountInfo<'info>>,
pub program: AccountInfo<'info>,
pub signer_seeds: &'a [&'b [&'c [u8]]],
}
Expand description
Context specifying non-argument inputs for cross-program-invocations.
§Example with and without PDA signature
ⓘ
// Callee Program
use anchor_lang::prelude::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod callee {
use super::*;
pub fn init(ctx: Context<Init>) -> Result<()> {
(*ctx.accounts.data).authority = ctx.accounts.authority.key();
Ok(())
}
pub fn set_data(ctx: Context<SetData>, data: u64) -> Result<()> {
(*ctx.accounts.data_acc).data = data;
Ok(())
}
}
#[account]
#[derive(Default)]
pub struct Data {
data: u64,
authority: Pubkey,
}
#[derive(Accounts)]
pub struct Init<'info> {
#[account(init, payer = payer)]
pub data: Account<'info, Data>,
pub payer: Signer<'info>,
pub authority: UncheckedAccount<'info>,
pub system_program: Program<'info, System>
}
#[derive(Accounts)]
pub struct SetData<'info> {
#[account(mut, has_one = authority)]
pub data_acc: Account<'info, Data>,
pub authority: Signer<'info>,
}
// Caller Program
use anchor_lang::prelude::*;
use callee::{self, program::Callee};
declare_id!("Sxg7dBh5VLT8S1o6BqncZCPq9nhHHukjfVd6ohQJeAk");
#[program]
pub mod caller {
use super::*;
pub fn do_cpi(ctx: Context<DoCpi>, data: u64) -> Result<()> {
let callee_id = ctx.accounts.callee.to_account_info();
let callee_accounts = callee::cpi::accounts::SetData {
data_acc: ctx.accounts.data_acc.to_account_info(),
authority: ctx.accounts.callee_authority.to_account_info(),
};
let cpi_ctx = CpiContext::new(callee_id, callee_accounts);
callee::cpi::set_data(cpi_ctx, data)
}
pub fn do_cpi_with_pda_authority(ctx: Context<DoCpiWithPDAAuthority>, bump: u8, data: u64) -> Result<()> {
let seeds = &[&[b"example_seed", bytemuck::bytes_of(&bump)][..]];
let callee_id = ctx.accounts.callee.to_account_info();
let callee_accounts = callee::cpi::accounts::SetData {
data_acc: ctx.accounts.data_acc.to_account_info(),
authority: ctx.accounts.callee_authority.to_account_info(),
};
let cpi_ctx = CpiContext::new_with_signer(callee_id, callee_accounts, seeds);
callee::cpi::set_data(cpi_ctx, data)
}
}
// We can use "UncheckedAccount"s here because
// the callee program does the checks.
// We use "mut" so the autogenerated clients know
// that this account should be mutable.
#[derive(Accounts)]
pub struct DoCpi<'info> {
#[account(mut)]
pub data_acc: UncheckedAccount<'info>,
pub callee_authority: UncheckedAccount<'info>,
pub callee: Program<'info, Callee>,
}
#[derive(Accounts)]
pub struct DoCpiWithPDAAuthority<'info> {
#[account(mut)]
pub data_acc: UncheckedAccount<'info>,
pub callee_authority: UncheckedAccount<'info>,
pub callee: Program<'info, Callee>,
}
Fields§
§accounts: T
§remaining_accounts: Vec<AccountInfo<'info>>
§program: AccountInfo<'info>
§signer_seeds: &'a [&'b [&'c [u8]]]
Implementations§
Source§impl<'a, 'b, 'c, 'info, T> CpiContext<'a, 'b, 'c, 'info, T>where
T: ToAccountMetas + ToAccountInfos<'info>,
impl<'a, 'b, 'c, 'info, T> CpiContext<'a, 'b, 'c, 'info, T>where
T: ToAccountMetas + ToAccountInfos<'info>,
pub fn new( program: AccountInfo<'info>, accounts: T, ) -> CpiContext<'a, 'b, 'c, 'info, T>
pub fn new_with_signer( program: AccountInfo<'info>, accounts: T, signer_seeds: &'a [&'b [&'c [u8]]], ) -> CpiContext<'a, 'b, 'c, 'info, T>
pub fn with_signer( self, signer_seeds: &'a [&'b [&'c [u8]]], ) -> CpiContext<'a, 'b, 'c, 'info, T>
pub fn with_remaining_accounts( self, ra: Vec<AccountInfo<'info>>, ) -> CpiContext<'a, 'b, 'c, 'info, T>
Trait Implementations§
Source§impl<'info, T> ToAccountInfos<'info> for CpiContext<'_, '_, '_, 'info, T>where
T: ToAccountInfos<'info> + ToAccountMetas,
impl<'info, T> ToAccountInfos<'info> for CpiContext<'_, '_, '_, 'info, T>where
T: ToAccountInfos<'info> + ToAccountMetas,
fn to_account_infos(&self) -> Vec<AccountInfo<'info>>
Source§impl<'info, T> ToAccountMetas for CpiContext<'_, '_, '_, 'info, T>where
T: ToAccountInfos<'info> + ToAccountMetas,
impl<'info, T> ToAccountMetas for CpiContext<'_, '_, '_, 'info, T>where
T: ToAccountInfos<'info> + ToAccountMetas,
Source§fn to_account_metas(&self, is_signer: Option<bool>) -> Vec<AccountMeta>
fn to_account_metas(&self, is_signer: Option<bool>) -> Vec<AccountMeta>
is_signer
is given as an optional override for the signer meta field.
This covers the edge case when a program-derived-address needs to relay
a transaction from a client to another program but sign the transaction
before the relay. The client cannot mark the field as a signer, and so
we have to override the is_signer meta field given by the client.Auto Trait Implementations§
impl<'a, 'b, 'c, 'info, T> Freeze for CpiContext<'a, 'b, 'c, 'info, T>where
T: Freeze,
impl<'a, 'b, 'c, 'info, T> !RefUnwindSafe for CpiContext<'a, 'b, 'c, 'info, T>
impl<'a, 'b, 'c, 'info, T> !Send for CpiContext<'a, 'b, 'c, 'info, T>
impl<'a, 'b, 'c, 'info, T> !Sync for CpiContext<'a, 'b, 'c, 'info, T>
impl<'a, 'b, 'c, 'info, T> Unpin for CpiContext<'a, 'b, 'c, 'info, T>where
T: Unpin,
impl<'a, 'b, 'c, 'info, T> !UnwindSafe for CpiContext<'a, 'b, 'c, 'info, T>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
Causes
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
Causes
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
Causes
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
Causes
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
Causes
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
Causes
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
Causes
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
Causes
self
to use its UpperHex
implementation when
Debug
-formatted.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Pipes by value. This is generally the method you want to use. Read more
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
Borrows
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
Mutably borrows
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
Borrows
self
, then passes self.as_ref()
into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
Mutably borrows
self
, then passes self.as_mut()
into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
Borrows
self
, then passes self.deref()
into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Immutable access to the
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
Mutable access to the
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
Immutable access to the
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
Mutable access to the
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Immutable access to the
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Mutable access to the
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
Calls
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
Calls
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
Calls
.tap_borrow()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
Calls
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
Calls
.tap_ref()
only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
Calls
.tap_ref_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
Calls
.tap_deref()
only in debug builds, and is erased in release
builds.