Skip to content

Commit

Permalink
restructured code
Browse files Browse the repository at this point in the history
  • Loading branch information
ikemHood committed Feb 27, 2025
1 parent 9b22cbf commit b24d98d
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 101 deletions.
37 changes: 26 additions & 11 deletions StarShopContracts/referral-contract/src/admin.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use crate::helpers::verify_admin;
use crate::types::{DataKey, Error, LevelRequirements, Milestone, RewardRates};
use soroban_sdk::{Address, Env};

Expand Down Expand Up @@ -47,7 +46,6 @@ pub trait AdminOperations {
fn transfer_admin(env: Env, new_admin: Address) -> Result<(), Error>;
}


impl AdminOperations for AdminModule {
fn initialize(
env: Env,
Expand Down Expand Up @@ -82,13 +80,13 @@ impl AdminOperations for AdminModule {
}

fn set_reward_rates(env: Env, rates: RewardRates) -> Result<(), Error> {
verify_admin(&env)?;
AdminModule::verify_admin(&env)?;
env.storage().instance().set(&DataKey::RewardRates, &rates);
Ok(())
}

fn add_milestone(env: Env, milestone: Milestone) -> Result<(), Error> {
verify_admin(&env)?;
AdminModule::verify_admin(&env)?;

// Find next available milestone ID
let mut next_id = 0;
Expand All @@ -105,7 +103,7 @@ impl AdminOperations for AdminModule {
}

fn remove_milestone(env: Env, milestone_id: u32) -> Result<(), Error> {
verify_admin(&env)?;
AdminModule::verify_admin(&env)?;

if !env
.storage()
Expand All @@ -126,7 +124,7 @@ impl AdminOperations for AdminModule {
milestone_id: u32,
new_milestone: Milestone,
) -> Result<(), Error> {
verify_admin(&env)?;
AdminModule::verify_admin(&env)?;

if !env
.storage()
Expand All @@ -144,15 +142,15 @@ impl AdminOperations for AdminModule {
}

fn pause_contract(env: Env) -> Result<(), Error> {
verify_admin(&env)?;
AdminModule::verify_admin(&env)?;
env.storage()
.instance()
.set(&DataKey::ContractPaused, &true);
Ok(())
}

fn resume_contract(env: Env) -> Result<(), Error> {
verify_admin(&env)?;
AdminModule::verify_admin(&env)?;
env.storage()
.instance()
.set(&DataKey::ContractPaused, &false);
Expand All @@ -164,13 +162,13 @@ impl AdminOperations for AdminModule {
}

fn transfer_admin(env: Env, new_admin: Address) -> Result<(), Error> {
verify_admin(&env)?;
AdminModule::verify_admin(&env)?;
env.storage().instance().set(&DataKey::Admin, &new_admin);
Ok(())
}

fn set_level_requirements(env: Env, requirements: LevelRequirements) -> Result<(), Error> {
verify_admin(&env)?;
AdminModule::verify_admin(&env)?;

// Validate that higher levels have stricter requirements
if !Self::validate_level_requirements(&requirements) {
Expand All @@ -184,7 +182,7 @@ impl AdminOperations for AdminModule {
}

fn set_reward_token(env: Env, token: Address) -> Result<(), Error> {
verify_admin(&env)?;
AdminModule::verify_admin(&env)?;
env.storage().instance().set(&DataKey::RewardToken, &token);
Ok(())
}
Expand All @@ -203,6 +201,23 @@ impl AdminModule {
.unwrap_or(false)
}

pub fn verify_admin(env: &Env) -> Result<(), Error> {
let admin: Address = env
.storage()
.instance()
.get(&DataKey::Admin)
.ok_or(Error::NotInitialized)?;
admin.require_auth();
Ok(())
}

pub fn ensure_contract_active(env: &Env) -> Result<(), Error> {
if AdminModule::is_contract_paused(env) {
return Err(Error::ContractPaused);
}
Ok(())
}

fn validate_level_requirements(requirements: &LevelRequirements) -> bool {
// Ensure Gold requirements are higher than Silver
if requirements.gold.required_direct_referrals
Expand Down
42 changes: 0 additions & 42 deletions StarShopContracts/referral-contract/src/helpers.rs

This file was deleted.

13 changes: 6 additions & 7 deletions StarShopContracts/referral-contract/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
#![no_std]
use soroban_sdk::{contract, contractimpl, Address, Env, String, Vec};

use admin::*;
use referral::*;
use rewards::*;
use types::*;
use verification::*;

mod admin;
mod helpers;
mod level;
mod referral;
mod rewards;
mod types;
mod verification;

use admin::*;
use referral::*;
use rewards::*;
use types::*;
use verification::*;

#[contract]
pub struct ReferralContract;

Expand Down
56 changes: 39 additions & 17 deletions StarShopContracts/referral-contract/src/referral.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::helpers::{ensure_contract_active, ensure_user_verified, get_user_data, user_exists};
use crate::admin::AdminModule;
use crate::level::LevelManagementModule;
use crate::rewards::RewardModule;
use crate::rewards::RewardOperations;
Expand Down Expand Up @@ -83,22 +83,22 @@ impl ReferralOperations for ReferralModule {
referrer_address: Address,
identity_proof: String,
) -> Result<(), Error> {
ensure_contract_active(&env)?;
AdminModule::ensure_contract_active(&env)?;
user.require_auth();

// Check if user already exists
if user_exists(&env, &user) {
if ReferralModule::user_exists(&env, &user) {
return Err(Error::AlreadyRegistered);
}

// Check if referrer exists
if !user_exists(&env, &referrer_address) {
if !ReferralModule::user_exists(&env, &referrer_address) {
return Err(Error::ReferrerNotFound);
}

// Check if referrer is verified
let referrer_data = get_user_data(&env, &referrer_address)?;
ensure_user_verified(&referrer_data)?;
let referrer_data = ReferralModule::get_user_data(&env, &referrer_address)?;
ReferralModule::ensure_user_verified(&referrer_data)?;

// Create new user data
let user_data = UserData {
Expand Down Expand Up @@ -132,30 +132,30 @@ impl ReferralOperations for ReferralModule {
}

fn is_user_verified(env: Env, user: Address) -> Result<bool, Error> {
get_user_data(&env, &user)
ReferralModule::get_user_data(&env, &user)
.map(|data| data.verification_status == VerificationStatus::Verified)
}

fn is_user_registered(env: Env, user: Address) -> Result<bool, Error> {
Ok(user_exists(&env, &user))
Ok(ReferralModule::user_exists(&env, &user))
}

fn get_user_info(env: Env, user: Address) -> Result<UserData, Error> {
get_user_data(&env, &user)
ReferralModule::get_user_data(&env, &user)
}

fn get_direct_referrals(env: Env, user: Address) -> Result<Vec<Address>, Error> {
let user_data = get_user_data(&env, &user)?;
let user_data = ReferralModule::get_user_data(&env, &user)?;
Ok(user_data.direct_referrals)
}

fn get_team_size(env: Env, user: Address) -> Result<u32, Error> {
let user_data = get_user_data(&env, &user)?;
let user_data = ReferralModule::get_user_data(&env, &user)?;
Ok(user_data.team_size)
}

fn get_user_level(env: Env, user: Address) -> Result<UserLevel, Error> {
let user_data = get_user_data(&env, &user)?;
let user_data = ReferralModule::get_user_data(&env, &user)?;
Ok(user_data.level)
}

Expand Down Expand Up @@ -195,16 +195,16 @@ impl ReferralOperations for ReferralModule {
}

fn get_referral_conversion_rate(env: Env, user: Address) -> Result<u32, Error> {
let user_data = get_user_data(&env, &user)?;
let user_data = ReferralModule::get_user_data(&env, &user)?;

if user_data.direct_referrals.len() == 0 {
return Ok(0);
}

let mut verified_referrals = 0;
for referral in user_data.direct_referrals.iter() {
let referral_data = get_user_data(&env, &referral)?;
if crate::helpers::is_user_verified(&referral_data) {
let referral_data = ReferralModule::get_user_data(&env, &referral)?;
if ReferralModule::user_verified(&referral_data) {
verified_referrals += 1;
}
}
Expand All @@ -221,7 +221,7 @@ impl ReferralModule {
referrer: &Address,
new_user: &Address,
) -> Result<(), Error> {
let mut referrer_data = get_user_data(env, referrer)?;
let mut referrer_data = ReferralModule::get_user_data(env, referrer)?;

// Add to direct referrals
referrer_data.direct_referrals.push_back(new_user.clone());
Expand Down Expand Up @@ -252,7 +252,7 @@ impl ReferralModule {
return Ok(());
}

let mut user_data = get_user_data(env, user)?;
let mut user_data = ReferralModule::get_user_data(env, user)?;
user_data.team_size += 1;

env.storage()
Expand All @@ -277,4 +277,26 @@ impl ReferralModule {
.instance()
.set(&DataKey::TotalUsers, &(current + 1));
}

pub fn get_user_data(env: &Env, user: &Address) -> Result<UserData, Error> {
env.storage()
.persistent()
.get(&DataKey::User(user.clone()))
.ok_or(Error::UserNotFound)
}

pub fn user_exists(env: &Env, user: &Address) -> bool {
env.storage().persistent().has(&DataKey::User(user.clone()))
}

pub fn ensure_user_verified(user_data: &UserData) -> Result<(), Error> {
if !ReferralModule::user_verified(user_data) {
return Err(Error::VerificationRequired);
}
Ok(())
}

pub fn user_verified(user_data: &UserData) -> bool {
matches!(user_data.verification_status, VerificationStatus::Verified)
}
}
Loading

0 comments on commit b24d98d

Please sign in to comment.