stealth_vault/instructions/
submit_execution_intent.rs1use 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}