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§

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.