Skip to content
Open
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
4,174 changes: 4,174 additions & 0 deletions voting/Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion voting/programs/voting/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ idl-build = ["anchor-lang/idl-build"]
test-sbf = []

[dependencies]
anchor-lang = "0.31.1"
anchor-lang = {version = "0.31.1", features = ["init-if-needed"]}

[dev-dependencies]
mollusk-svm = "=0.0.15"
Expand Down
8 changes: 5 additions & 3 deletions voting/programs/voting/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ use anchor_lang::prelude::*;

#[error_code]
pub enum ErrorCode {
#[msg("Custom error message")]
CustomError,
}
#[msg("Voting has not started yet")]
VotingNotStarted,
#[msg("Voting has ended")]
VotingEnded,
}
42 changes: 42 additions & 0 deletions voting/programs/voting/src/instructions/caste_vote.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
use anchor_lang::prelude::*;

use crate::{error::ErrorCode, CandidateAccount, PollAccount};

pub fn _vote(ctx: Context<Vote>, _poll_id: u64, _candidate: String) -> Result<()> {
msg!("Vote casted for candidate: {}", _candidate);
let candidate_account = &mut ctx.accounts.candidate_account;
let current_time = Clock::get()?.unix_timestamp;

if (current_time > (ctx.accounts.poll_account.poll_voting_end as i64)) {
return Err(ErrorCode::VotingEnded.into());
}
if (current_time < (ctx.accounts.poll_account.poll_voting_start as i64)) {
return Err(ErrorCode::VotingNotStarted.into());
}
candidate_account.candidate_vote_count += 1;

Ok(())
}


#[derive(Accounts)]
#[instruction(poll_id: u64, candidate: String)]

pub struct Vote<'info> {
#[account(mut)]
pub signer: Signer<'info>,

#[account(
mut,
seeds= [b"poll".as_ref(), poll_id.to_le_bytes().as_ref()],
bump
)]
pub poll_account: Account<'info, PollAccount>,

#[account(
mut,
seeds= [poll_id.to_le_bytes().as_ref(), candidate.as_ref()],
bump
)]
pub candidate_account: Account<'info, CandidateAccount>,
}
9 changes: 0 additions & 9 deletions voting/programs/voting/src/instructions/initialize.rs

This file was deleted.

36 changes: 36 additions & 0 deletions voting/programs/voting/src/instructions/initialize_candidate.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
use anchor_lang::prelude::*;

use crate::{CandidateAccount, PollAccount};

pub fn _initialize_candidate(
ctx: Context<InitializeCandidate>,
_poll_id: u64,
candidate: String,
) -> Result<()> {
ctx.accounts.candidate_account.candidate_name = candidate;
ctx.accounts.candidate_account.candidate_vote_count = 0;
ctx.accounts.poll_account.poll_option_index += 1;
Ok(())
}





#[derive(Accounts)]
#[instruction(poll_id: u64, candidate: String)]
pub struct InitializeCandidate<'info> {
#[account(mut)]
signer: Signer<'info>,
#[account(
init,
payer=signer,
space = 8 + CandidateAccount::INIT_SPACE,
seeds= [poll_id.to_le_bytes().as_ref(),candidate.as_ref()],
bump
)]
pub candidate_account: Account<'info, CandidateAccount>,
pub poll_account: Account<'info, PollAccount>,
pub system_program: Program<'info, System>,
}

39 changes: 39 additions & 0 deletions voting/programs/voting/src/instructions/initialize_poll.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
use anchor_lang::prelude::*;

use crate::PollAccount;
pub fn _initialize_poll(
ctx: Context<InitializePoll>,
_poll_id: u64,
start_time: u64,
end_time: u64,
name: String,
description: String,
) -> Result<()> {
msg!("Greetings from: {:?}", ctx.program_id);
ctx.accounts.poll_account.poll_name = name;
ctx.accounts.poll_account.poll_description = description;
ctx.accounts.poll_account.poll_voting_start = start_time;
ctx.accounts.poll_account.poll_voting_end = end_time;
Ok(())
}




#[derive(Accounts)]
#[instruction(poll_id: u64)]
pub struct InitializePoll<'info> {
#[account(mut)]
pub signer: Signer<'info>,

#[account(
init_if_needed,
payer=signer,
space = 8 + PollAccount::INIT_SPACE,
seeds= [b"poll".as_ref(),poll_id.to_le_bytes().as_ref()],
bump
)]
pub poll_account: Account<'info, PollAccount>,

pub system_program: Program<'info, System>,
}
12 changes: 10 additions & 2 deletions voting/programs/voting/src/instructions/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
pub mod initialize;
pub mod initialize_poll;

pub use initialize::*;
pub use initialize_poll::*;

pub mod initialize_candidate;

pub use initialize_candidate::*;

pub mod caste_vote;

pub use caste_vote::*;
28 changes: 25 additions & 3 deletions voting/programs/voting/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,37 @@ use anchor_lang::prelude::*;

pub use constants::*;
pub use instructions::*;
pub use state::*;
pub use state::state::*;

declare_id!("4kZYYmPPGyitVhhbXzSJehjKJWEJ9NkgVqeekLLc9CY2");

#[program]
pub mod voting {
use super::*;
pub fn initialize_poll(
ctx: Context<InitializePoll>,
_poll_id: u64,
start_time: u64,
end_time: u64,
name: String,
description: String,
) -> Result<()> {
_initialize_poll(ctx, _poll_id, start_time, end_time, name, description)
}

pub fn initialize_candidate(
ctx: Context<InitializeCandidate>,
_poll_id: u64,
candidate: String,
) -> Result<()> {
_initialize_candidate(ctx, _poll_id, candidate)
}

pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
initialize::handler(ctx)
pub fn vote(
ctx: Context<Vote>,
_poll_id: u64,
_candidate: String,
) -> Result<()> {
_vote(ctx, _poll_id, _candidate)
}
}
2 changes: 2 additions & 0 deletions voting/programs/voting/src/state/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pub mod state;
pub use state::*;
23 changes: 23 additions & 0 deletions voting/programs/voting/src/state/state.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
use anchor_lang::prelude::*;

#[account]
#[derive(InitSpace)]
pub struct PollAccount {
#[max_len(32)]
pub poll_name: String,
#[max_len(280)]
pub poll_description: String,
pub poll_voting_start: u64,
pub poll_voting_end: u64,
pub poll_option_index: u64,
}

#[account]
#[derive(InitSpace)]

pub struct CandidateAccount {
#[max_len(32)]
pub candidate_name: String,
pub candidate_vote_count: u64,
}