Skip to main content

stealth_vault/instructions/
submit_execution_intent.rs

1use anchor_lang::prelude::*;
2
3use crate::{
4    constants::{INTENT_SEED, INTENT_STATUS_PENDING, VAULT_SEED},
5    errors::StealthVaultError,
6    state::{ExecutionIntent, Vault},
7};
8
9#[derive(Accounts)]
10#[instruction(nonce: u64)]
11pub struct SubmitExecutionIntent<'info> {
12    #[account(mut)]
13    pub ephemeral_authority: Signer<'info>,
14    #[account(
15        seeds = [VAULT_SEED, vault.owner.as_ref()],
16        bump = vault.bump,
17        constraint = vault.ephemeral_authority == ephemeral_authority.key()
18            @ StealthVaultError::InvalidEphemeralAuthority
19    )]
20    pub vault: Account<'info, Vault>,
21    #[account(
22        init,
23        payer = ephemeral_authority,
24        space = 8 + ExecutionIntent::INIT_SPACE,
25        seeds = [INTENT_SEED, vault.key().as_ref(), &nonce.to_le_bytes()],
26        bump
27    )]
28    pub intent: Account<'info, ExecutionIntent>,
29    pub system_program: Program<'info, System>,
30}
31
32pub fn submit_execution_intent_handler(
33    ctx: Context<SubmitExecutionIntent>,
34    nonce: u64,
35    payload_hash: [u8; 32],
36) -> Result<()> {
37    let intent = &mut ctx.accounts.intent;
38
39    intent.vault = ctx.accounts.vault.key();
40    intent.ephemeral_authority = ctx.accounts.ephemeral_authority.key();
41    intent.executor = Pubkey::default();
42    intent.nonce = nonce;
43    intent.payload_hash = payload_hash;
44    intent.status = INTENT_STATUS_PENDING;
45    intent.created_at = Clock::get()?.unix_timestamp;
46    intent.cancelled_at = 0;
47    intent.executed_at = 0;
48    intent.bump = ctx.bumps.intent;
49
50    Ok(())
51}