use anchor_lang::prelude::*;
use crate::errors::*;
use crate::state::*;
#[derive(AnchorSerialize, AnchorDeserialize)]
pub struct ConfigTransactionCreateArgs {
pub actions: Vec<ConfigAction>,
pub memo: Option<String>,
}
#[derive(Accounts)]
#[instruction(args: ConfigTransactionCreateArgs)]
pub struct ConfigTransactionCreate<'info> {
#[account(
mut,
seeds = [SEED_PREFIX, SEED_MULTISIG, multisig.create_key.as_ref()],
bump = multisig.bump,
)]
pub multisig: Account<'info, Multisig>,
#[account(
init,
payer = rent_payer,
space = ConfigTransaction::size(&args.actions),
seeds = [
SEED_PREFIX,
multisig.key().as_ref(),
SEED_TRANSACTION,
&multisig.transaction_index.checked_add(1).unwrap().to_le_bytes(),
],
bump
)]
pub transaction: Account<'info, ConfigTransaction>,
pub creator: Signer<'info>,
#[account(mut)]
pub rent_payer: Signer<'info>,
pub system_program: Program<'info, System>,
}
impl ConfigTransactionCreate<'_> {
fn validate(&self) -> Result<()> {
require_keys_eq!(
self.multisig.config_authority,
Pubkey::default(),
MultisigError::NotSupportedForControlled
);
require!(
self.multisig.is_member(self.creator.key()).is_some(),
MultisigError::NotAMember
);
require!(
self.multisig
.member_has_permission(self.creator.key(), Permission::Initiate),
MultisigError::Unauthorized
);
Ok(())
}
#[access_control(ctx.accounts.validate())]
pub fn config_transaction_create(
ctx: Context<Self>,
args: ConfigTransactionCreateArgs,
) -> Result<()> {
require!(!args.actions.is_empty(), MultisigError::NoActions);
let multisig = &mut ctx.accounts.multisig;
let transaction = &mut ctx.accounts.transaction;
let creator = &mut ctx.accounts.creator;
let multisig_key = multisig.key();
let transaction_index = multisig.transaction_index.checked_add(1).unwrap();
transaction.multisig = multisig_key;
transaction.creator = creator.key();
transaction.index = transaction_index;
transaction.bump = *ctx.bumps.get("transaction").unwrap();
transaction.actions = args.actions;
multisig.transaction_index = transaction_index;
multisig.invariant()?;
msg!("transaction index: {}", transaction_index);
Ok(())
}
}