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: Tremaining_accounts: Vec<AccountInfo<'info>>program: AccountInfo<'info>signer_seeds: &'a [&'b [&'c [u8]]]

Implementations

Trait Implementations

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. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The alignment of pointer.

The type for initializers.

Initializes a with the given initializer. Read more

Dereferences the given pointer. Read more

Mutably dereferences the given pointer. Read more

Drops the object pointed to by the given pointer. Read more

Should always be Self

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.