2022-03-16 13:09:58 -07:00
|
|
|
use crate::prelude::*;
|
2021-09-11 14:43:12 -07:00
|
|
|
use solana_program::pubkey::Pubkey;
|
|
|
|
|
|
|
|
pub use solana_program::system_program::ID;
|
|
|
|
|
2021-11-20 07:14:06 -08:00
|
|
|
#[derive(Debug, Clone)]
|
2021-09-11 14:43:12 -07:00
|
|
|
pub struct System;
|
|
|
|
|
|
|
|
impl anchor_lang::Id for System {
|
|
|
|
fn id() -> Pubkey {
|
|
|
|
ID
|
|
|
|
}
|
|
|
|
}
|
2022-03-16 13:09:58 -07:00
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn advance_nonce_account<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, AdvanceNonceAccount<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
) -> Result<()> {
|
|
|
|
let ix = crate::solana_program::system_instruction::advance_nonce_account(
|
|
|
|
ctx.accounts.nonce.key,
|
|
|
|
ctx.accounts.authorized.key,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ix,
|
|
|
|
&[
|
|
|
|
ctx.accounts.nonce,
|
|
|
|
ctx.accounts.recent_blockhashes,
|
|
|
|
ctx.accounts.authorized,
|
|
|
|
],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct AdvanceNonceAccount<'info> {
|
|
|
|
pub nonce: AccountInfo<'info>,
|
|
|
|
pub authorized: AccountInfo<'info>,
|
|
|
|
pub recent_blockhashes: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn allocate<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, Allocate<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
space: u64,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ix = crate::solana_program::system_instruction::allocate(
|
|
|
|
ctx.accounts.account_to_allocate.key,
|
|
|
|
space,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ix,
|
|
|
|
&[ctx.accounts.account_to_allocate],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct Allocate<'info> {
|
|
|
|
pub account_to_allocate: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn allocate_with_seed<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, AllocateWithSeed<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
seed: &str,
|
|
|
|
space: u64,
|
|
|
|
owner: &Pubkey,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ix = crate::solana_program::system_instruction::allocate_with_seed(
|
|
|
|
ctx.accounts.account_to_allocate.key,
|
|
|
|
ctx.accounts.base.key,
|
|
|
|
seed,
|
|
|
|
space,
|
|
|
|
owner,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ix,
|
|
|
|
&[ctx.accounts.account_to_allocate, ctx.accounts.base],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct AllocateWithSeed<'info> {
|
|
|
|
pub account_to_allocate: AccountInfo<'info>,
|
|
|
|
pub base: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn assign<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, Assign<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
owner: &Pubkey,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ix = crate::solana_program::system_instruction::assign(
|
|
|
|
ctx.accounts.account_to_assign.key,
|
|
|
|
owner,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ix,
|
|
|
|
&[ctx.accounts.account_to_assign],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct Assign<'info> {
|
|
|
|
pub account_to_assign: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn assign_with_seed<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, AssignWithSeed<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
seed: &str,
|
|
|
|
owner: &Pubkey,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ix = crate::solana_program::system_instruction::assign_with_seed(
|
|
|
|
ctx.accounts.account_to_assign.key,
|
|
|
|
ctx.accounts.base.key,
|
|
|
|
seed,
|
|
|
|
owner,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ix,
|
|
|
|
&[ctx.accounts.account_to_assign, ctx.accounts.base],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct AssignWithSeed<'info> {
|
|
|
|
pub account_to_assign: AccountInfo<'info>,
|
|
|
|
pub base: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn authorize_nonce_account<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, AuthorizeNonceAccount<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
new_authority: &Pubkey,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ix = crate::solana_program::system_instruction::authorize_nonce_account(
|
|
|
|
ctx.accounts.nonce.key,
|
|
|
|
ctx.accounts.authorized.key,
|
|
|
|
new_authority,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ix,
|
|
|
|
&[ctx.accounts.nonce, ctx.accounts.authorized],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct AuthorizeNonceAccount<'info> {
|
|
|
|
pub nonce: AccountInfo<'info>,
|
|
|
|
pub authorized: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn create_account<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, CreateAccount<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
lamports: u64,
|
|
|
|
space: u64,
|
|
|
|
owner: &Pubkey,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ix = crate::solana_program::system_instruction::create_account(
|
|
|
|
ctx.accounts.from.key,
|
|
|
|
ctx.accounts.to.key,
|
|
|
|
lamports,
|
|
|
|
space,
|
|
|
|
owner,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ix,
|
|
|
|
&[ctx.accounts.from, ctx.accounts.to],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct CreateAccount<'info> {
|
|
|
|
pub from: AccountInfo<'info>,
|
|
|
|
pub to: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn create_account_with_seed<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, CreateAccountWithSeed<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
seed: &str,
|
|
|
|
lamports: u64,
|
|
|
|
space: u64,
|
|
|
|
owner: &Pubkey,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ix = crate::solana_program::system_instruction::create_account_with_seed(
|
|
|
|
ctx.accounts.from.key,
|
|
|
|
ctx.accounts.to.key,
|
|
|
|
ctx.accounts.base.key,
|
|
|
|
seed,
|
|
|
|
lamports,
|
|
|
|
space,
|
|
|
|
owner,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ix,
|
|
|
|
&[ctx.accounts.from, ctx.accounts.to, ctx.accounts.base],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct CreateAccountWithSeed<'info> {
|
|
|
|
pub from: AccountInfo<'info>,
|
|
|
|
pub to: AccountInfo<'info>,
|
|
|
|
pub base: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn create_nonce_account<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, CreateNonceAccount<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
lamports: u64,
|
|
|
|
authority: &Pubkey,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ixs = crate::solana_program::system_instruction::create_nonce_account(
|
|
|
|
ctx.accounts.from.key,
|
|
|
|
ctx.accounts.nonce.key,
|
|
|
|
authority,
|
|
|
|
lamports,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ixs[0],
|
|
|
|
&[ctx.accounts.from, ctx.accounts.nonce.clone()],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)?;
|
|
|
|
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ixs[1],
|
|
|
|
&[
|
|
|
|
ctx.accounts.nonce,
|
|
|
|
ctx.accounts.recent_blockhashes,
|
|
|
|
ctx.accounts.rent,
|
|
|
|
],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct CreateNonceAccount<'info> {
|
|
|
|
pub from: AccountInfo<'info>,
|
|
|
|
pub nonce: AccountInfo<'info>,
|
|
|
|
pub recent_blockhashes: AccountInfo<'info>,
|
|
|
|
pub rent: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn create_nonce_account_with_seed<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, CreateNonceAccountWithSeed<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
lamports: u64,
|
|
|
|
seed: &str,
|
|
|
|
authority: &Pubkey,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ixs = crate::solana_program::system_instruction::create_nonce_account_with_seed(
|
|
|
|
ctx.accounts.from.key,
|
|
|
|
ctx.accounts.nonce.key,
|
|
|
|
ctx.accounts.base.key,
|
|
|
|
seed,
|
|
|
|
authority,
|
|
|
|
lamports,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ixs[0],
|
|
|
|
&[
|
|
|
|
ctx.accounts.from,
|
|
|
|
ctx.accounts.nonce.clone(),
|
|
|
|
ctx.accounts.base,
|
|
|
|
],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)?;
|
|
|
|
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ixs[1],
|
|
|
|
&[
|
|
|
|
ctx.accounts.nonce,
|
|
|
|
ctx.accounts.recent_blockhashes,
|
|
|
|
ctx.accounts.rent,
|
|
|
|
],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct CreateNonceAccountWithSeed<'info> {
|
|
|
|
pub from: AccountInfo<'info>,
|
|
|
|
pub nonce: AccountInfo<'info>,
|
|
|
|
pub base: AccountInfo<'info>,
|
|
|
|
pub recent_blockhashes: AccountInfo<'info>,
|
|
|
|
pub rent: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn transfer<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, Transfer<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
lamports: u64,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ix = crate::solana_program::system_instruction::transfer(
|
|
|
|
ctx.accounts.from.key,
|
|
|
|
ctx.accounts.to.key,
|
|
|
|
lamports,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ix,
|
|
|
|
&[ctx.accounts.from, ctx.accounts.to],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct Transfer<'info> {
|
|
|
|
pub from: AccountInfo<'info>,
|
|
|
|
pub to: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn transfer_with_seed<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, TransferWithSeed<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
from_seed: String,
|
|
|
|
from_owner: &Pubkey,
|
|
|
|
lamports: u64,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ix = crate::solana_program::system_instruction::transfer_with_seed(
|
|
|
|
ctx.accounts.from.key,
|
|
|
|
ctx.accounts.base.key,
|
|
|
|
from_seed,
|
|
|
|
from_owner,
|
|
|
|
ctx.accounts.to.key,
|
|
|
|
lamports,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ix,
|
|
|
|
&[ctx.accounts.from, ctx.accounts.base, ctx.accounts.to],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct TransferWithSeed<'info> {
|
|
|
|
pub from: AccountInfo<'info>,
|
|
|
|
pub base: AccountInfo<'info>,
|
|
|
|
pub to: AccountInfo<'info>,
|
|
|
|
}
|
|
|
|
|
2023-02-06 03:16:23 -08:00
|
|
|
pub fn withdraw_nonce_account<'info>(
|
|
|
|
ctx: CpiContext<'_, '_, '_, 'info, WithdrawNonceAccount<'info>>,
|
2022-03-16 13:09:58 -07:00
|
|
|
lamports: u64,
|
|
|
|
) -> Result<()> {
|
|
|
|
let ix = crate::solana_program::system_instruction::withdraw_nonce_account(
|
|
|
|
ctx.accounts.nonce.key,
|
|
|
|
ctx.accounts.authorized.key,
|
|
|
|
ctx.accounts.to.key,
|
|
|
|
lamports,
|
|
|
|
);
|
|
|
|
crate::solana_program::program::invoke_signed(
|
|
|
|
&ix,
|
|
|
|
&[
|
|
|
|
ctx.accounts.nonce,
|
|
|
|
ctx.accounts.to,
|
|
|
|
ctx.accounts.recent_blockhashes,
|
|
|
|
ctx.accounts.rent,
|
|
|
|
ctx.accounts.authorized,
|
|
|
|
],
|
|
|
|
ctx.signer_seeds,
|
|
|
|
)
|
|
|
|
.map_err(Into::into)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Accounts)]
|
|
|
|
pub struct WithdrawNonceAccount<'info> {
|
|
|
|
pub nonce: AccountInfo<'info>,
|
|
|
|
pub to: AccountInfo<'info>,
|
|
|
|
pub recent_blockhashes: AccountInfo<'info>,
|
|
|
|
pub rent: AccountInfo<'info>,
|
|
|
|
pub authorized: AccountInfo<'info>,
|
|
|
|
}
|