diff --git a/StarShopContracts/referral-contract/src/admin.rs b/StarShopContracts/referral-contract/src/admin.rs index b14e826..50a4278 100644 --- a/StarShopContracts/referral-contract/src/admin.rs +++ b/StarShopContracts/referral-contract/src/admin.rs @@ -1,4 +1,3 @@ -use crate::helpers::verify_admin; use crate::types::{DataKey, Error, LevelRequirements, Milestone, RewardRates}; use soroban_sdk::{Address, Env}; @@ -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, @@ -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; @@ -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() @@ -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() @@ -144,7 +142,7 @@ 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); @@ -152,7 +150,7 @@ impl AdminOperations for AdminModule { } fn resume_contract(env: Env) -> Result<(), Error> { - verify_admin(&env)?; + AdminModule::verify_admin(&env)?; env.storage() .instance() .set(&DataKey::ContractPaused, &false); @@ -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) { @@ -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(()) } @@ -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 diff --git a/StarShopContracts/referral-contract/src/helpers.rs b/StarShopContracts/referral-contract/src/helpers.rs deleted file mode 100644 index 238d879..0000000 --- a/StarShopContracts/referral-contract/src/helpers.rs +++ /dev/null @@ -1,42 +0,0 @@ -use crate::admin::AdminModule; -use crate::types::{DataKey, Error, UserData, VerificationStatus}; -use soroban_sdk::{Address, Env}; - -pub fn get_user_data(env: &Env, user: &Address) -> Result { - 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 is_user_verified(user_data: &UserData) -> bool { - matches!(user_data.verification_status, VerificationStatus::Verified) -} - -pub fn ensure_user_verified(user_data: &UserData) -> Result<(), Error> { - if !is_user_verified(user_data) { - return Err(Error::VerificationRequired); - } - Ok(()) -} - -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(()) -} diff --git a/StarShopContracts/referral-contract/src/lib.rs b/StarShopContracts/referral-contract/src/lib.rs index 038c678..4ae5490 100644 --- a/StarShopContracts/referral-contract/src/lib.rs +++ b/StarShopContracts/referral-contract/src/lib.rs @@ -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; diff --git a/StarShopContracts/referral-contract/src/referral.rs b/StarShopContracts/referral-contract/src/referral.rs index aae1f3b..bf41759 100644 --- a/StarShopContracts/referral-contract/src/referral.rs +++ b/StarShopContracts/referral-contract/src/referral.rs @@ -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; @@ -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 { @@ -132,30 +132,30 @@ impl ReferralOperations for ReferralModule { } fn is_user_verified(env: Env, user: Address) -> Result { - 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 { - Ok(user_exists(&env, &user)) + Ok(ReferralModule::user_exists(&env, &user)) } fn get_user_info(env: Env, user: Address) -> Result { - get_user_data(&env, &user) + ReferralModule::get_user_data(&env, &user) } fn get_direct_referrals(env: Env, user: Address) -> Result, 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 { - 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 { - let user_data = get_user_data(&env, &user)?; + let user_data = ReferralModule::get_user_data(&env, &user)?; Ok(user_data.level) } @@ -195,7 +195,7 @@ impl ReferralOperations for ReferralModule { } fn get_referral_conversion_rate(env: Env, user: Address) -> Result { - 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); @@ -203,8 +203,8 @@ impl ReferralOperations for ReferralModule { 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; } } @@ -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()); @@ -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() @@ -277,4 +277,26 @@ impl ReferralModule { .instance() .set(&DataKey::TotalUsers, &(current + 1)); } + + pub fn get_user_data(env: &Env, user: &Address) -> Result { + 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) + } } diff --git a/StarShopContracts/referral-contract/src/rewards.rs b/StarShopContracts/referral-contract/src/rewards.rs index 7b2d41e..dd663c7 100644 --- a/StarShopContracts/referral-contract/src/rewards.rs +++ b/StarShopContracts/referral-contract/src/rewards.rs @@ -1,9 +1,9 @@ -use crate::helpers::{ensure_contract_active, ensure_user_verified, get_user_data, verify_admin}; +use crate::admin::AdminModule; use crate::level::LevelManagementModule; +use crate::referral::ReferralModule; use crate::types::{DataKey, Error, Milestone, MilestoneRequirement, RewardRates}; use soroban_sdk::token::Client as TokenClient; use soroban_sdk::{Address, Env, Vec}; - pub struct RewardModule; pub trait RewardOperations { /// Distribute rewards for a referral @@ -27,12 +27,12 @@ pub trait RewardOperations { impl RewardOperations for RewardModule { fn distribute_rewards(env: Env, user: Address, amount: i128) -> Result<(), Error> { - ensure_contract_active(&env)?; - verify_admin(&env)?; + AdminModule::ensure_contract_active(&env)?; + AdminModule::verify_admin(&env)?; // Get user data and verify - let user_data = get_user_data(&env, &user)?; - ensure_user_verified(&user_data)?; + let user_data = ReferralModule::get_user_data(&env, &user)?; + ReferralModule::ensure_user_verified(&user_data)?; // Verify amount is positive if amount <= 0 { @@ -54,7 +54,7 @@ impl RewardOperations for RewardModule { } // First reward the user themselves - let mut user_data = get_user_data(&env, &user)?; + let mut user_data = ReferralModule::get_user_data(&env, &user)?; user_data.pending_rewards += amount; user_data.total_rewards += amount; total_distributed += amount; @@ -73,7 +73,7 @@ impl RewardOperations for RewardModule { break; } - let mut upline_data = get_user_data(&env, &upline_address)?; + let mut upline_data = ReferralModule::get_user_data(&env, &upline_address)?; // Calculate reward based on level let reward_rate = match remaining_levels { @@ -107,11 +107,11 @@ impl RewardOperations for RewardModule { } fn claim_rewards(env: Env, user: Address) -> Result { - ensure_contract_active(&env)?; + AdminModule::ensure_contract_active(&env)?; user.require_auth(); - let mut user_data = get_user_data(&env, &user)?; - ensure_user_verified(&user_data)?; + let mut user_data = ReferralModule::get_user_data(&env, &user)?; + ReferralModule::ensure_user_verified(&user_data)?; if user_data.pending_rewards <= 0 { return Err(Error::InsufficientRewards); @@ -139,20 +139,20 @@ impl RewardOperations for RewardModule { } fn get_pending_rewards(env: Env, user: Address) -> Result { - let user_data = get_user_data(&env, &user)?; + let user_data = ReferralModule::get_user_data(&env, &user)?; Ok(user_data.pending_rewards) } fn get_total_rewards(env: Env, user: Address) -> Result { - let user_data = get_user_data(&env, &user)?; + let user_data = ReferralModule::get_user_data(&env, &user)?; Ok(user_data.total_rewards) } fn check_and_reward_milestone(env: Env, user: Address) -> Result<(), Error> { user.require_auth(); - let user_data = get_user_data(&env, &user)?; - ensure_user_verified(&user_data)?; + let user_data = ReferralModule::get_user_data(&env, &user)?; + ReferralModule::ensure_user_verified(&user_data)?; let mut milestone_id = 0; while env diff --git a/StarShopContracts/referral-contract/src/verification.rs b/StarShopContracts/referral-contract/src/verification.rs index 897bbf7..bdf740a 100644 --- a/StarShopContracts/referral-contract/src/verification.rs +++ b/StarShopContracts/referral-contract/src/verification.rs @@ -1,4 +1,5 @@ -use crate::helpers::{ensure_contract_active, get_user_data, verify_admin}; +use crate::admin::*; +use crate::referral::ReferralModule; use crate::types::{DataKey, Error, UserData, VerificationStatus}; use soroban_sdk::{Address, Env, String, Vec}; @@ -23,17 +24,17 @@ pub trait VerificationOperations { impl VerificationOperations for VerificationModule { fn submit_verification(env: Env, user: Address, identity_proof: String) -> Result<(), Error> { - ensure_contract_active(&env)?; + AdminModule::ensure_contract_active(&env)?; user.require_auth(); - let mut user_data = get_user_data(&env, &user)?; + let mut user_data = ReferralModule::get_user_data(&env, &user)?; Self::process_verification(&env, &mut user_data, &identity_proof) } fn approve_verification(env: Env, user: Address) -> Result<(), Error> { - verify_admin(&env)?; + AdminModule::verify_admin(&env)?; - let mut user_data = get_user_data(&env, &user)?; + let mut user_data = ReferralModule::get_user_data(&env, &user)?; user_data.verification_status = VerificationStatus::Verified; env.storage() @@ -45,9 +46,9 @@ impl VerificationOperations for VerificationModule { } fn reject_verification(env: Env, user: Address, reason: String) -> Result<(), Error> { - verify_admin(&env)?; + AdminModule::verify_admin(&env)?; - let mut user_data = get_user_data(&env, &user)?; + let mut user_data = ReferralModule::get_user_data(&env, &user)?; user_data.verification_status = VerificationStatus::Rejected(reason); env.storage() @@ -59,12 +60,12 @@ impl VerificationOperations for VerificationModule { } fn get_verification_status(env: Env, user: Address) -> Result { - let user_data = get_user_data(&env, &user)?; + let user_data = ReferralModule::get_user_data(&env, &user)?; Ok(user_data.verification_status) } fn get_pending_verifications(env: Env) -> Result, Error> { - verify_admin(&env)?; //do we need this for a get function?? + AdminModule::verify_admin(&env)?; Ok(env .storage()