light_merkle_tree_program/verifier_invoked_instructions/
sol_transfer.rs

1use anchor_lang::prelude::*;
2
3use crate::{RegisteredAssetPool, RegisteredVerifier};
4#[derive(Accounts)]
5pub struct UnshieldSol<'info> {
6    /// CHECK:` Signer is registered verifier program.
7    #[account(mut , seeds=[__program_id.to_bytes().as_ref()],bump,seeds::program=registered_verifier_pda.pubkey)]
8    pub authority: Signer<'info>,
9    #[account(mut)]
10    pub merkle_tree_token: Account<'info, RegisteredAssetPool>,
11    #[account(mut, seeds=[&registered_verifier_pda.pubkey.to_bytes()],  bump)]
12    pub registered_verifier_pda: Account<'info, RegisteredVerifier>,
13    /// CHECK:`
14    #[account(mut)]
15    pub recipient: UncheckedAccount<'info>,
16}
17
18pub fn process_sol_transfer(
19    from_account: &AccountInfo,
20    dest_account: &AccountInfo,
21    amount: u64,
22) -> Result<()> {
23    let from_starting_lamports = from_account.lamports();
24    // msg!("from_starting_lamports: {}", from_starting_lamports);
25    from_starting_lamports
26        .checked_sub(amount)
27        .ok_or(ProgramError::InvalidAccountData)?;
28    **from_account.lamports.borrow_mut() = from_starting_lamports
29        .checked_sub(amount)
30        .ok_or(ProgramError::InvalidAccountData)?;
31    // msg!("from_ending_lamports: {}", res);
32
33    let dest_starting_lamports = dest_account.lamports();
34    **dest_account.lamports.borrow_mut() = dest_starting_lamports
35        .checked_add(amount)
36        .ok_or(ProgramError::InvalidAccountData)?;
37    dest_starting_lamports
38        .checked_add(amount)
39        .ok_or(ProgramError::InvalidAccountData)?;
40    // msg!("dest_starting_lamports: {}", dest_starting_lamports);
41    // msg!("dest_res_lamports: {}", res);
42
43    Ok(())
44}