Skip to content
This repository was archived by the owner on Sep 7, 2023. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
"idl:upgrade:wordcel:mainnet": "anchor idl upgrade -f target/idl/wordcel.json --provider.cluster mainnet --provider.wallet ~/.config/solana/wordcel_mainnet.json EXzAYHZ8xS6QJ6xGRsdKZXixoQBLsuMbmwJozm85jHp",
"idl:upgrade:invite:mainnet": "anchor idl upgrade -f target/idl/invite.json --provider.cluster mainnet --provider.wallet ~/.config/solana/wordcel_mainnet.json Fc4q6ttyDHr11HjMHRvanG9SskeR24Q62egdwsUUMHLf",
"idl:upgrade:wordcel:devnet": "anchor idl upgrade -f target/idl/wordcel.json --provider.cluster devnet --provider.wallet ~/.config/solana/wordcel_admin.json D9JJgeRf2rKq5LNMHLBMb92g4ZpeMgCyvZkd7QKwSCzg",
"idl:upgrade:invite:devnet": "anchor idl upgrade -f target/idl/invite.json --provider.cluster devnet --provider.wallet ~/.config/solana/wordcel_admin.json 6G5x4Es2YZYB5e4QkFJN88TrfLABkYEQpkUH5Gob9Cut"
"idl:upgrade:invite:devnet": "anchor idl upgrade -f target/idl/invite.json --provider.cluster devnet --provider.wallet ~/.config/solana/wordcel_admin.json 6G5x4Es2YZYB5e4QkFJN88TrfLABkYEQpkUH5Gob9Cut",
"anchor:publish:invite:mainnet": "anchor publish invite --provider.cluster mainnet --provider.wallet ~/.config/solana/wordcel_mainnet.json -- --features mainnet"
},
"dependencies": {
"@bundlr-network/client": "^0.5.12",
Expand Down
36 changes: 31 additions & 5 deletions programs/invite/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,27 +18,33 @@ pub mod invite {

pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
let invite_account = &mut ctx.accounts.invite_account;
invite_account.bump = *ctx.bumps.get("invite_account").unwrap();
invite_account.bump = ctx.bumps["invite_account"];
invite_account.authority = *ctx.accounts.authority.to_account_info().key;
invite_account.invited_by = *ctx.accounts.payer.to_account_info().key;
invite_account.invites_left = Invite::MAX_TO_GIVE;
invite_account.invites_left = Invite::NUM_INITIAL_INVITES;
invite_account.invites_sent = 0;
Ok(())
}

pub fn send_invite(ctx: Context<SendInvite>) -> Result<()> {
let to_invite_account = &mut ctx.accounts.to_invite_account;
to_invite_account.bump = *ctx.bumps.get("to_invite_account").unwrap();
to_invite_account.bump = ctx.bumps["to_invite_account"];
to_invite_account.authority = *ctx.accounts.to.to_account_info().key;
to_invite_account.invited_by = *ctx.accounts.authority.to_account_info().key;
to_invite_account.invites_left = Invite::MAX_TO_GIVE;
to_invite_account.invites_left = Invite::NUM_INITIAL_INVITES;
to_invite_account.invites_sent = 0;

let invite_account = &mut ctx.accounts.invite_account;
invite_account.invites_sent = invite_account.invites_sent.checked_add(1).unwrap();
invite_account.invites_left = invite_account.invites_left.checked_sub(1).unwrap();
Ok(())
}

pub fn claim_invite(ctx: Context<ClaimInvites>) -> Result<()> {
let invite_account = &mut ctx.accounts.invite_account;
invite_account.invites_left = invite_account.invites_left.checked_add(4).unwrap();
Ok(())
}
}

#[derive(Accounts)]
Expand Down Expand Up @@ -93,6 +99,24 @@ pub struct SendInvite<'info> {
pub system_program: Program<'info, System>,
}

#[derive(Accounts)]
pub struct ClaimInvites<'info> {
#[account(
mut,
has_one = authority,
seeds = [
Invite::PREFIX.as_bytes().as_ref(),
authority.key().as_ref()
],
bump = invite_account.bump,
constraint = invite_account.invites_left <= 1 @InviteError::IneligibleClaim,
)]
pub invite_account: Account<'info, Invite>,
#[account(mut)]
pub authority: Signer<'info>,
pub system_program: Program<'info, System>,
}

#[account]
#[derive(Default)]
pub struct Invite {
Expand All @@ -105,7 +129,7 @@ pub struct Invite {

impl Invite {
pub const PREFIX: &'static str = "invite";
pub const MAX_TO_GIVE: u8 = 2;
pub const NUM_INITIAL_INVITES: u8 = 2;
pub const LEN: usize = 8 + size_of::<Self>();

fn is_whitelisted(key: Pubkey) -> bool {
Expand All @@ -131,5 +155,7 @@ impl Invite {
#[error_code]
pub enum InviteError {
NoInvitesLeft,
#[msg("Invites can be only claimed after existing invites are used")]
IneligibleClaim,
UnAuthorizedInitialization,
}
Loading