hydra/processors/add_member/
wallet.rs1use super::arg::AddMemberArgs;
2use crate::state::{Fanout, FanoutMembershipVoucher, FANOUT_MEMBERSHIP_VOUCHER_SIZE};
3use crate::utils::logic::calculation::*;
4use crate::utils::validation::{assert_membership_model, assert_owned_by};
5use crate::MembershipModel;
6use anchor_lang::prelude::*;
7use anchor_spl::token::Token;
8
9#[derive(Accounts)]
10#[instruction(args: AddMemberArgs)]
11pub struct AddMemberWallet<'info> {
12 #[account(mut)]
13 pub authority: Signer<'info>,
14 pub member: UncheckedAccount<'info>,
16 #[account(
17 mut,
18 seeds = [b"fanout-config", fanout.name.as_bytes()],
19 has_one = authority,
20 bump = fanout.bump_seed,
21 )]
22 pub fanout: Account<'info, Fanout>,
23 #[account(
24 init,
25 space = FANOUT_MEMBERSHIP_VOUCHER_SIZE,
26 seeds = [b"fanout-membership", fanout.key().as_ref(), member.key().as_ref()],
27 bump,
28 payer = authority
29 )]
30 pub membership_account: Account<'info, FanoutMembershipVoucher>,
31 pub system_program: Program<'info, System>,
32 pub rent: Sysvar<'info, Rent>,
33 pub token_program: Program<'info, Token>,
34}
35
36pub fn add_member_wallet(ctx: Context<AddMemberWallet>, args: AddMemberArgs) -> Result<()> {
37 let fanout = &mut ctx.accounts.fanout;
38 let member = &ctx.accounts.member;
39 let membership_account = &mut ctx.accounts.membership_account;
40 update_fanout_for_add(fanout, args.shares)?;
41 assert_membership_model(fanout, MembershipModel::Wallet)?;
42 assert_owned_by(&fanout.to_account_info(), &crate::ID)?;
43 assert_owned_by(&member.to_account_info(), &System::id())?;
44 membership_account.membership_key = member.key();
45 membership_account.shares = args.shares;
46 membership_account.bump_seed = *ctx.bumps.get("membership_account").unwrap();
47 membership_account.fanout = fanout.key();
48 Ok(())
49}