Skip to main content

CreateAccount

Struct CreateAccount 

Source
pub struct CreateAccount<'a, 'b: 'a> {
    pub payer: CpiAuthority<'a, 'b>,
    pub to: CpiAuthority<'a, 'b>,
    pub program_id: &'a Pubkey,
    pub space: Option<usize>,
    pub lamports: Option<u64>,
}
Expand description

Arguments to create an account reliably. If the account already has lamports, it will be topped up to the required rent, allocated with the specified amount of space and assigned to the specified program.

§Examples

use sealevel_tools::{
    account_info::{
        try_next_enumerated_account, AccountInfoConstraints, Payer, Program,
        WritableAccount,
    },
    cpi::system_program::CreateAccount,
    entrypoint::{NoStdAccountInfo, ProgramResult},
    pubkey::Pubkey,
};

fn process_instruction(
     program_id: &Pubkey,
     accounts: &[NoStdAccountInfo],
     instruction_data: &[u8],
) -> ProgramResult {
    let mut accounts_iter = accounts.iter().enumerate();

    // Next account must writable signer (A.K.A. our payer).
    let (_, payer) =
        try_next_enumerated_account::<Payer>(&mut accounts_iter, Default::default())?;

    let (new_thing_addr, new_thing_bump) =
        Pubkey::find_program_address(&[b"thing"], program_id);

    // Next account must be writable data account matching PDA address.
    let (_, new_account) = try_next_enumerated_account::<WritableAccount>(
        &mut accounts_iter,
        AccountInfoConstraints {
            key: Some(&new_thing_addr),
            ..Default::default()
        },
    )?;

    CreateAccount {
        payer: payer.as_cpi_authority(),
        to: new_account.as_cpi_authority(Some(&[b"thing", &[new_thing_bump]])),
        program_id,
        space: Some(16),
        lamports: None,
    }
    .try_into_invoke()?;

    Ok(())
}

Use Self::try_invoke_and_serialize to create a new data account and serialize data to it.

use sealevel_tools::{
    borsh::{BorshDeserialize, BorshSerialize},
    account::{AccountSerde, BorshAccountSchema},
    account_info::{
        try_next_enumerated_account, AccountInfoConstraints, Payer, Program,
        WritableAccount,
    },
    cpi::system_program::CreateAccount,
    discriminator::{Discriminate, Discriminator},
    entrypoint::{NoStdAccountInfo, ProgramResult},
    pubkey::Pubkey,
};

#[derive(Debug, BorshDeserialize, BorshSerialize)]
pub struct Thing {
    pub data: u64,
}


impl Discriminate<4> for Thing {
    const DISCRIMINATOR: [u8; 4] = Discriminator::Sha2(b"Thing").to_bytes();
}

fn process_instruction(
     program_id: &Pubkey,
     accounts: &[NoStdAccountInfo],
     instruction_data: &[u8],
) -> ProgramResult {
    let mut accounts_iter = accounts.iter().enumerate();

    // Next account must writable signer (A.K.A. our payer).
    let (_, payer) =
        try_next_enumerated_account::<Payer>(&mut accounts_iter, Default::default())?;

    let (new_thing_addr, new_thing_bump) =
        Pubkey::find_program_address(&[b"thing"], program_id);

    // Next account must be writable data account matching PDA address.
    let (_, new_account) = try_next_enumerated_account::<WritableAccount>(
        &mut accounts_iter,
        AccountInfoConstraints {
            key: Some(&new_thing_addr),
            ..Default::default()
        },
    )?;

    let thing = BorshAccountSchema(Thing { data: 420 });

    CreateAccount {
        payer: payer.as_cpi_authority(),
        to: new_account.as_cpi_authority(Some(&[b"thing", &[new_thing_bump]])),
        program_id,
        space: None,
        lamports: None,
    }
    .try_invoke_and_serialize(&thing)?;

    Ok(())
}

Fields§

§payer: CpiAuthority<'a, 'b>

The account that will pay for the rent.

§Notes

Pass in None for CpiAuthority::signer_seeds if the payer is passed in as a signer.

§to: CpiAuthority<'a, 'b>

The account to be created.

§Notes

Pass in None for CpiAuthority::signer_seeds if the account is passed in as a random keypair.

§program_id: &'a Pubkey

The program to assign the account to.

§space: Option<usize>

The space to allocate for the account. If None, defaults to zero for Self::try_into_invoke and will be determined by AccountSerde::try_account_space for Self::try_invoke_and_serialize.

§lamports: Option<u64>

Implementations§

Source§

impl<'a, 'b: 'a> CreateAccount<'a, 'b>

Source

pub fn try_into_invoke(self) -> Result<Account<'b, true>, ProgramError>

Try to consume arguments to perform CPI calls.

Source

pub fn try_invoke_and_serialize<const DISC_LEN: usize, T: AccountSerde<DISC_LEN>>( self, account_data: &T, ) -> Result<Account<'a, true>, ProgramError>

Try to consume arguments to create a new data account and serialize data to it using the account’s implemented AccountSerde, which includes its discriminator. This method uses Self::try_into_invoke to create the account and then serializes the data to this account.

The space to allocate for the account. If not specified, the space will be determined by AccountSerde::try_account_space.

Trait Implementations§

Source§

impl<'a, 'b: 'a> Clone for CreateAccount<'a, 'b>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a, 'b: 'a> Eq for CreateAccount<'a, 'b>

Source§

impl<'a, 'b: 'a> PartialEq for CreateAccount<'a, 'b>

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl<'a, 'b: 'a> StructuralPartialEq for CreateAccount<'a, 'b>

Auto Trait Implementations§

§

impl<'a, 'b> !Send for CreateAccount<'a, 'b>

§

impl<'a, 'b> !Sync for CreateAccount<'a, 'b>

§

impl<'a, 'b> Freeze for CreateAccount<'a, 'b>

§

impl<'a, 'b> RefUnwindSafe for CreateAccount<'a, 'b>

§

impl<'a, 'b> Unpin for CreateAccount<'a, 'b>

§

impl<'a, 'b> UnsafeUnpin for CreateAccount<'a, 'b>

§

impl<'a, 'b> UnwindSafe for CreateAccount<'a, 'b>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

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

Source§

impl<T> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

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 more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V