From 6bc6990058cb7baf7be5d0053b6dd15007b590e7 Mon Sep 17 00:00:00 2001 From: Ikem Peter Date: Sun, 23 Feb 2025 08:06:33 +0100 Subject: [PATCH 1/8] implemented multi-level referral contract --- .../referral-contract/Cargo.toml | 15 + StarShopContracts/referral-contract/Makefile | 16 + StarShopContracts/referral-contract/README.md | 27 ++ .../referral-contract/src/admin.rs | 181 ++++++++++ .../referral-contract/src/helpers.rs | 38 +++ .../referral-contract/src/interface.rs | 119 +++++++ .../referral-contract/src/level.rs | 51 +++ .../referral-contract/src/lib.rs | 320 ++++++++++++++++++ .../referral-contract/src/metrics.rs | 96 ++++++ .../referral-contract/src/referral.rs | 143 ++++++++ .../referral-contract/src/rewards.rs | 218 ++++++++++++ .../referral-contract/src/test.rs | 1 + .../referral-contract/src/types.rs | 127 +++++++ .../referral-contract/src/verification.rs | 118 +++++++ 14 files changed, 1470 insertions(+) create mode 100644 StarShopContracts/referral-contract/Cargo.toml create mode 100644 StarShopContracts/referral-contract/Makefile create mode 100644 StarShopContracts/referral-contract/README.md create mode 100644 StarShopContracts/referral-contract/src/admin.rs create mode 100644 StarShopContracts/referral-contract/src/helpers.rs create mode 100644 StarShopContracts/referral-contract/src/interface.rs create mode 100644 StarShopContracts/referral-contract/src/level.rs create mode 100644 StarShopContracts/referral-contract/src/lib.rs create mode 100644 StarShopContracts/referral-contract/src/metrics.rs create mode 100644 StarShopContracts/referral-contract/src/referral.rs create mode 100644 StarShopContracts/referral-contract/src/rewards.rs create mode 100644 StarShopContracts/referral-contract/src/test.rs create mode 100644 StarShopContracts/referral-contract/src/types.rs create mode 100644 StarShopContracts/referral-contract/src/verification.rs diff --git a/StarShopContracts/referral-contract/Cargo.toml b/StarShopContracts/referral-contract/Cargo.toml new file mode 100644 index 0000000..6ab6829 --- /dev/null +++ b/StarShopContracts/referral-contract/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "referral-contract" +version = "0.0.0" +edition = "2021" +publish = false + +[lib] +crate-type = ["cdylib"] +doctest = false + +[dependencies] +soroban-sdk = { workspace = true } + +[dev-dependencies] +soroban-sdk = { workspace = true, features = ["testutils"] } diff --git a/StarShopContracts/referral-contract/Makefile b/StarShopContracts/referral-contract/Makefile new file mode 100644 index 0000000..7f774ad --- /dev/null +++ b/StarShopContracts/referral-contract/Makefile @@ -0,0 +1,16 @@ +default: build + +all: test + +test: build + cargo test + +build: + stellar contract build + @ls -l target/wasm32-unknown-unknown/release/*.wasm + +fmt: + cargo fmt --all + +clean: + cargo clean diff --git a/StarShopContracts/referral-contract/README.md b/StarShopContracts/referral-contract/README.md new file mode 100644 index 0000000..197817e --- /dev/null +++ b/StarShopContracts/referral-contract/README.md @@ -0,0 +1,27 @@ +# Soroban Project + +## Project Structure + +This repository uses the recommended structure for a Soroban project: + +```text +. +├── referral-contract +│   ├── src +│   │   ├── lib.rs +│   │   └── test.rs +│  └── Cargo.toml +├── Cargo.toml +└── README.md +``` + +- New Soroban contracts can be put in `contracts`, each in their own directory. + There is already a `hello_world` contract in there to get you started. +- If you initialized this project with any other example contracts via + `--with-example`, those contracts will be in the `contracts` directory as + well. +- Contracts should have their own `Cargo.toml` files that rely on the top-level + `Cargo.toml` workspace for their dependencies. +- Frontend libraries can be added to the top-level directory as well. If you + initialized this project with a frontend template via `--frontend-template` + you will have those files already included. diff --git a/StarShopContracts/referral-contract/src/admin.rs b/StarShopContracts/referral-contract/src/admin.rs new file mode 100644 index 0000000..0bc6e85 --- /dev/null +++ b/StarShopContracts/referral-contract/src/admin.rs @@ -0,0 +1,181 @@ +use crate::helpers::verify_admin; +use crate::interface::AdminOperations; +use crate::types::{DataKey, Error, LevelRequirements, Milestone, RewardRates}; +use soroban_sdk::{Address, Env}; + +pub struct AdminModule; + +impl AdminOperations for AdminModule { + fn initialize( + env: Env, + admin: Address, + reward_token: Address, + level_requirements: LevelRequirements, + ) -> Result<(), Error> { + // Check if contract is already initialized + if env.storage().persistent().has(&DataKey::Admin) { + return Err(Error::AlreadyInitialized); + } + + // Store admin address + env.storage().persistent().set(&DataKey::Admin, &admin); + + // Initialize contract as active + env.storage() + .persistent() + .set(&DataKey::ContractPaused, &false); + + // Store reward token + env.storage() + .persistent() + .set(&DataKey::RewardToken, &reward_token); + + // Store level requirements + env.storage() + .persistent() + .set(&DataKey::LevelRequirements, &level_requirements); + + Ok(()) + } + + fn set_reward_rates(env: Env, rates: RewardRates) -> Result<(), Error> { + verify_admin(&env)?; + env.storage() + .persistent() + .set(&DataKey::RewardRates, &rates); + Ok(()) + } + + fn add_milestone(env: Env, milestone: Milestone) -> Result<(), Error> { + verify_admin(&env)?; + + // Find next available milestone ID + let mut next_id = 0; + while env.storage().persistent().has(&DataKey::Milestone(next_id)) { + next_id += 1; + } + + // Store the milestone with its ID + env.storage() + .persistent() + .set(&DataKey::Milestone(next_id), &milestone); + + Ok(()) + } + + fn remove_milestone(env: Env, milestone_id: u32) -> Result<(), Error> { + verify_admin(&env)?; + + if !env + .storage() + .persistent() + .has(&DataKey::Milestone(milestone_id)) + { + return Err(Error::MilestoneNotFound); + } + + env.storage() + .persistent() + .remove(&DataKey::Milestone(milestone_id)); + Ok(()) + } + + fn update_milestone( + env: Env, + milestone_id: u32, + new_milestone: Milestone, + ) -> Result<(), Error> { + verify_admin(&env)?; + + if !env + .storage() + .persistent() + .has(&DataKey::Milestone(milestone_id)) + { + return Err(Error::MilestoneNotFound); + } + + env.storage() + .persistent() + .set(&DataKey::Milestone(milestone_id), &new_milestone); + + Ok(()) + } + + fn pause_contract(env: Env) -> Result<(), Error> { + verify_admin(&env)?; + env.storage() + .persistent() + .set(&DataKey::ContractPaused, &true); + Ok(()) + } + + fn resume_contract(env: Env) -> Result<(), Error> { + verify_admin(&env)?; + env.storage() + .persistent() + .set(&DataKey::ContractPaused, &false); + Ok(()) + } + + fn transfer_admin(env: Env, new_admin: Address) -> Result<(), Error> { + verify_admin(&env)?; + env.storage().persistent().set(&DataKey::Admin, &new_admin); + Ok(()) + } + + fn set_level_requirements(env: Env, requirements: LevelRequirements) -> Result<(), Error> { + verify_admin(&env)?; + + // Validate that higher levels have stricter requirements + if !Self::validate_level_requirements(&requirements) { + return Err(Error::InvalidLevelRequirements); + } + + env.storage() + .persistent() + .set(&DataKey::LevelRequirements, &requirements); + Ok(()) + } + + fn set_reward_token(env: Env, token: Address) -> Result<(), Error> { + verify_admin(&env)?; + env.storage() + .persistent() + .set(&DataKey::RewardToken, &token); + Ok(()) + } +} + +// Helper functions +impl AdminModule { + pub fn is_contract_paused(env: &Env) -> bool { + env.storage() + .persistent() + .get(&DataKey::ContractPaused) + .unwrap_or(false) + } + + fn validate_level_requirements(requirements: &LevelRequirements) -> bool { + // Ensure Gold requirements are higher than Silver + if requirements.gold.required_direct_referrals + < requirements.silver.required_direct_referrals + || requirements.gold.required_team_size < requirements.silver.required_team_size + || requirements.gold.required_total_rewards < requirements.silver.required_total_rewards + { + return false; + } + + // Ensure Platinum requirements are higher than Gold + if requirements.platinum.required_direct_referrals + < requirements.gold.required_direct_referrals + || requirements.platinum.required_team_size < requirements.gold.required_team_size + || requirements.platinum.required_total_rewards + < requirements.gold.required_total_rewards + { + return false; + } + + true + } +} diff --git a/StarShopContracts/referral-contract/src/helpers.rs b/StarShopContracts/referral-contract/src/helpers.rs new file mode 100644 index 0000000..35e1b10 --- /dev/null +++ b/StarShopContracts/referral-contract/src/helpers.rs @@ -0,0 +1,38 @@ +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).unwrap(); + 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/interface.rs b/StarShopContracts/referral-contract/src/interface.rs new file mode 100644 index 0000000..ee6fc79 --- /dev/null +++ b/StarShopContracts/referral-contract/src/interface.rs @@ -0,0 +1,119 @@ +use crate::types::{ + Error, LevelRequirements, Milestone, RewardRates, UserData, VerificationStatus, +}; +use soroban_sdk::{Address, Env, String, Vec}; + +/// Handles verification operations for users +pub trait VerificationOperations { + /// Submit verification documents for review + fn submit_verification(env: Env, user: Address, identity_proof: String) -> Result<(), Error>; + + /// Admin approval of user verification + fn approve_verification(env: Env, user: Address) -> Result<(), Error>; + + /// Admin rejection of user verification with reason + fn reject_verification(env: Env, user: Address, reason: String) -> Result<(), Error>; + + /// Get user's verification status + fn get_verification_status(env: Env, user: Address) -> Result; + + /// Get list of pending verifications + fn get_pending_verifications(env: Env) -> Result, Error>; +} + +/// Manages referral operations and relationships +pub trait ReferralOperations { + /// Register new user with referral + fn register_with_referral( + env: Env, + user: Address, + referrer_address: Address, + identity_proof: String, + ) -> Result<(), Error>; + + /// Check if user is verified + fn is_user_verified(env: Env, user: Address) -> Result; + + /// Check if user is registered + fn is_user_registered(env: Env, user: Address) -> Result; + + /// Get user's information + fn get_user_info(env: Env, user: Address) -> Result; + + /// Get user's direct referrals + fn get_direct_referrals(env: Env, user: Address) -> Result, Error>; + + /// Get user's team size (all levels) + fn get_team_size(env: Env, user: Address) -> Result; +} + +/// Handles reward calculations and distributions +pub trait RewardOperations { + /// Distribute rewards for a referral + fn distribute_rewards(env: Env, user: Address, amount: i128) -> Result<(), Error>; + + /// Claim accumulated rewards + fn claim_rewards(env: Env, user: Address) -> Result; + + /// Get pending rewards balance + fn get_pending_rewards(env: Env, user: Address) -> Result; + + /// Get total rewards earned + fn get_total_rewards(env: Env, user: Address) -> Result; + + /// Check if milestone achieved and distribute rewards + fn check_and_reward_milestone(env: Env, user: Address) -> Result<(), Error>; +} + +/// Manages administrative operations +pub trait AdminOperations { + /// Initialize contract with admin address + fn initialize( + env: Env, + admin: Address, + reward_token: Address, + level_requirements: LevelRequirements, + ) -> Result<(), Error>; + + /// Set reward rates for different levels + fn set_reward_rates(env: Env, rates: RewardRates) -> Result<(), Error>; + + /// Set level requirements for different levels + fn set_level_requirements(env: Env, requirements: LevelRequirements) -> Result<(), Error>; + + /// Set reward token + fn set_reward_token(env: Env, token: Address) -> Result<(), Error>; + + /// Add new milestone + fn add_milestone(env: Env, milestone: Milestone) -> Result<(), Error>; + + /// Remove existing milestone + fn remove_milestone(env: Env, milestone_id: u32) -> Result<(), Error>; + + /// Update existing milestone + fn update_milestone(env: Env, milestone_id: u32, milestone: Milestone) -> Result<(), Error>; + + /// Pause contract operations (emergency) + fn pause_contract(env: Env) -> Result<(), Error>; + + /// Resume contract operations + fn resume_contract(env: Env) -> Result<(), Error>; + + /// Transfer admin rights to new address + fn transfer_admin(env: Env, new_admin: Address) -> Result<(), Error>; +} + +/// Handles system metrics and monitoring +pub trait MetricsOperations { + /// Get total registered users + fn get_total_users(env: Env) -> Result; + + /// Get total distributed rewards + fn get_total_distributed_rewards(env: Env) -> Result; + + /// Get system statistics + fn get_system_metrics(env: Env) -> Result, Error>; + + /// Get user conversion rates + fn get_referral_conversion_rate(env: Env, user: Address) -> Result; +} diff --git a/StarShopContracts/referral-contract/src/level.rs b/StarShopContracts/referral-contract/src/level.rs new file mode 100644 index 0000000..0e131a2 --- /dev/null +++ b/StarShopContracts/referral-contract/src/level.rs @@ -0,0 +1,51 @@ +use crate::types::{DataKey, Error, LevelCriteria, LevelRequirements, UserData, UserLevel}; +use soroban_sdk::Env; + +pub struct LevelManagementModule; + +impl LevelManagementModule { + pub fn check_and_update_level(env: &Env, user_data: &mut UserData) -> Result { + let requirements: LevelRequirements = env + .storage() + .persistent() + .get(&DataKey::LevelRequirements) + .ok_or(Error::InvalidLevelRequirements)?; + + let new_level = Self::calculate_eligible_level(user_data, &requirements); + + if new_level > user_data.level { + user_data.level = new_level; + return Ok(true); + } + + Ok(false) + } + + fn calculate_eligible_level( + user_data: &UserData, + requirements: &LevelRequirements, + ) -> UserLevel { + // Check Platinum requirements + if Self::meets_criteria(user_data, &requirements.platinum) { + return UserLevel::Platinum; + } + + // Check Gold requirements + if Self::meets_criteria(user_data, &requirements.gold) { + return UserLevel::Gold; + } + + // Check Silver requirements + if Self::meets_criteria(user_data, &requirements.silver) { + return UserLevel::Silver; + } + + UserLevel::Basic + } + + fn meets_criteria(user_data: &UserData, criteria: &LevelCriteria) -> bool { + user_data.direct_referrals.len() as u32 >= criteria.required_direct_referrals + && user_data.team_size >= criteria.required_team_size + && user_data.total_rewards >= criteria.required_total_rewards + } +} diff --git a/StarShopContracts/referral-contract/src/lib.rs b/StarShopContracts/referral-contract/src/lib.rs new file mode 100644 index 0000000..1f79a0a --- /dev/null +++ b/StarShopContracts/referral-contract/src/lib.rs @@ -0,0 +1,320 @@ +#![no_std] +use soroban_sdk::{contract, contractimpl, Address, Env, String, Vec}; + +mod admin; +mod helpers; +mod interface; +mod level; +mod metrics; +mod referral; +mod rewards; +mod types; +mod verification; + +use admin::AdminModule; +use interface::{ + AdminOperations, MetricsOperations, ReferralOperations, RewardOperations, + VerificationOperations, +}; +use metrics::MetricsModule; +use referral::ReferralModule; +use rewards::RewardModule; +use types::{ + Error, LevelCriteria, LevelRequirements, Milestone, RewardRates, UserData, VerificationStatus, +}; +use verification::VerificationModule; + +#[contract] +pub struct ReferralContract; + +#[contractimpl] +impl ReferralContract { + /// Initializes the referral contract with an admin address, reward token, and default level requirements + /// + /// # Arguments + /// * `env` - The contract environment + /// * `admin` - The address of the contract administrator + /// * `reward_token` - The address of the token used for rewards + pub fn initialize(env: Env, admin: Address, reward_token: Address) -> Result<(), Error> { + let default_requirements = LevelRequirements { + silver: LevelCriteria { + required_direct_referrals: 5, + required_team_size: 15, + required_total_rewards: 1000, + }, + gold: LevelCriteria { + required_direct_referrals: 10, + required_team_size: 50, + required_total_rewards: 5000, + }, + platinum: LevelCriteria { + required_direct_referrals: 20, + required_team_size: 100, + required_total_rewards: 20000, + }, + }; + + AdminModule::initialize(env, admin, reward_token, default_requirements) + } + + /// Sets the reward rates for different referral levels + /// + /// # Arguments + /// * `env` - The contract environment + /// * `rates` - The new reward rates structure + pub fn set_reward_rates(env: Env, rates: RewardRates) -> Result<(), Error> { + AdminModule::set_reward_rates(env, rates) + } + + /// Adds a new milestone to the referral program + /// + /// # Arguments + /// * `env` - The contract environment + /// * `milestone` - The milestone to be added + pub fn add_milestone(env: Env, milestone: Milestone) -> Result<(), Error> { + AdminModule::add_milestone(env, milestone) + } + + /// Removes a milestone from the referral program + /// + /// # Arguments + /// * `env` - The contract environment + /// * `milestone_id` - The ID of the milestone to remove + pub fn remove_milestone(env: Env, milestone_id: u32) -> Result<(), Error> { + AdminModule::remove_milestone(env, milestone_id) + } + + /// Updates an existing milestone + /// + /// # Arguments + /// * `env` - The contract environment + /// * `milestone_id` - The ID of the milestone to update + /// * `milestone` - The new milestone data + pub fn update_milestone( + env: Env, + milestone_id: u32, + milestone: Milestone, + ) -> Result<(), Error> { + AdminModule::update_milestone(env, milestone_id, milestone) + } + + /// Pauses all contract operations + pub fn pause_contract(env: Env) -> Result<(), Error> { + AdminModule::pause_contract(env) + } + + /// Resumes contract operations after being paused + pub fn resume_contract(env: Env) -> Result<(), Error> { + AdminModule::resume_contract(env) + } + + /// Transfers admin rights to a new address + /// + /// # Arguments + /// * `env` - The contract environment + /// * `new_admin` - The address of the new administrator + pub fn transfer_admin(env: Env, new_admin: Address) -> Result<(), Error> { + AdminModule::transfer_admin(env, new_admin) + } + + /// Sets or updates the reward token address + /// + /// # Arguments + /// * `env` - The contract environment + /// * `token` - The address of the new reward token + pub fn set_reward_token(env: Env, token: Address) -> Result<(), Error> { + AdminModule::set_reward_token(env, token) + } + + /// Updates the requirements for different referral levels + /// + /// # Arguments + /// * `env` - The contract environment + /// * `requirements` - The new level requirements + pub fn set_level_requirements(env: Env, requirements: LevelRequirements) -> Result<(), Error> { + AdminModule::set_level_requirements(env, requirements) + } + + /// Submits a verification request for a user + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user to verify + /// * `identity_proof` - Proof of identity for verification + pub fn submit_verification( + env: Env, + user: Address, + identity_proof: String, + ) -> Result<(), Error> { + VerificationModule::submit_verification(env, user, identity_proof) + } + + /// Approves a user's verification request + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user to approve + pub fn approve_verification(env: Env, user: Address) -> Result<(), Error> { + VerificationModule::approve_verification(env, user) + } + + /// Rejects a user's verification request with a reason + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user to reject + /// * `reason` - The reason for rejection + pub fn reject_verification(env: Env, user: Address, reason: String) -> Result<(), Error> { + VerificationModule::reject_verification(env, user, reason) + } + + /// Retrieves the verification status of a user + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user to check + pub fn get_verification_status(env: Env, user: Address) -> Result { + VerificationModule::get_verification_status(env, user) + } + + /// Returns a list of all pending verification requests + pub fn get_pending_verifications(env: Env) -> Result, Error> { + VerificationModule::get_pending_verifications(env) + } + + /// Registers a new user with a referrer + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the new user + /// * `referrer_address` - The address of the referrer + /// * `identity_proof` - Proof of identity for verification + pub fn register_with_referral( + env: Env, + user: Address, + referrer_address: Address, + identity_proof: String, + ) -> Result<(), Error> { + ReferralModule::register_with_referral(env, user, referrer_address, identity_proof) + } + + /// Checks if a user is verified + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user to check + pub fn is_user_verified(env: Env, user: Address) -> Result { + ReferralModule::is_user_verified(env, user) + } + + /// Checks if a user is registered in the system + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user to check + pub fn is_user_registered(env: Env, user: Address) -> Result { + ReferralModule::is_user_registered(env, user) + } + + /// Retrieves detailed information about a user + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user + pub fn get_user_info(env: Env, user: Address) -> Result { + ReferralModule::get_user_info(env, user) + } + + /// Gets a list of direct referrals for a user + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user + pub fn get_direct_referrals(env: Env, user: Address) -> Result, Error> { + ReferralModule::get_direct_referrals(env, user) + } + + /// Gets the total team size (direct and indirect referrals) for a user + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user + pub fn get_team_size(env: Env, user: Address) -> Result { + ReferralModule::get_team_size(env, user) + } + + /// Distributes rewards to a user and their upline + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user + /// * `amount` - The amount of rewards to distribute + pub fn distribute_rewards(env: Env, user: Address, amount: i128) -> Result<(), Error> { + RewardModule::distribute_rewards(env, user, amount) + } + + /// Allows a user to claim their accumulated rewards + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user claiming rewards + pub fn claim_rewards(env: Env, user: Address) -> Result { + RewardModule::claim_rewards(env, user) + } + + /// Gets the amount of pending rewards for a user + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user + pub fn get_pending_rewards(env: Env, user: Address) -> Result { + RewardModule::get_pending_rewards(env, user) + } + + /// Gets the total rewards earned by a user + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user + pub fn get_total_rewards(env: Env, user: Address) -> Result { + RewardModule::get_total_rewards(env, user) + } + + /// Checks and rewards any achieved milestones for a user + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user + pub fn check_and_reward_milestone(env: Env, user: Address) -> Result<(), Error> { + RewardModule::check_and_reward_milestone(env, user) + } + + /// Gets the total number of users in the system + pub fn get_total_users(env: Env) -> Result { + MetricsModule::get_total_users(env) + } + + /// Gets the total amount of rewards distributed + pub fn get_total_distributed_rewards(env: Env) -> Result { + MetricsModule::get_total_distributed_rewards(env) + } + + /// Gets various system metrics as key-value pairs + /// total_users, total_rewards, average_reward_per_user + /// + pub fn get_system_metrics(env: Env) -> Result, Error> { + MetricsModule::get_system_metrics(env) + } + + /// Gets the referral conversion rate for a user. verified users/registered users + /// + /// # Arguments + /// * `env` - The contract environment + /// * `user` - The address of the user + pub fn get_referral_conversion_rate(env: Env, user: Address) -> Result { + MetricsModule::get_referral_conversion_rate(env, user) + } +} + +#[cfg(test)] +mod test; diff --git a/StarShopContracts/referral-contract/src/metrics.rs b/StarShopContracts/referral-contract/src/metrics.rs new file mode 100644 index 0000000..a528228 --- /dev/null +++ b/StarShopContracts/referral-contract/src/metrics.rs @@ -0,0 +1,96 @@ +use crate::helpers::get_user_data; +use crate::interface::MetricsOperations; +use crate::types::{DataKey, Error}; +use soroban_sdk::{Address, Env, String, Vec}; + +pub struct MetricsModule; + +impl MetricsOperations for MetricsModule { + fn get_total_users(env: Env) -> Result { + Ok(env + .storage() + .persistent() + .get(&DataKey::TotalUsers) + .unwrap_or(0)) + } + + fn get_total_distributed_rewards(env: Env) -> Result { + Ok(env + .storage() + .persistent() + .get(&DataKey::TotalDistributedRewards) + .unwrap_or(0)) + } + + fn get_system_metrics(env: Env) -> Result, Error> { + let mut metrics = Vec::new(&env); + + // Total users + let total_users = Self::get_total_users(env.clone())? as i128; + metrics.push_back((String::from_str(&env, "total_users"), total_users)); + + // Total rewards + let total_rewards = Self::get_total_distributed_rewards(env.clone())?; + metrics.push_back(( + String::from_str(&env, "total_distributed_rewards"), + total_rewards, + )); + + // Average reward per user + let avg_reward = if total_users > 0 { + total_rewards / total_users + } else { + 0 + }; + metrics.push_back(( + String::from_str(&env, "average_reward_per_user"), + avg_reward, + )); + + Ok(metrics) + } + + fn get_referral_conversion_rate(env: Env, user: Address) -> Result { + let user_data = 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) { + verified_referrals += 1; + } + } + + // Calculate conversion rate as percentage (0-100) + Ok((verified_referrals * 100) / user_data.direct_referrals.len() as u32) + } +} + +// Helper functions +impl MetricsModule { + pub fn increment_total_users(env: &Env) { + let current = env + .storage() + .persistent() + .get(&DataKey::TotalUsers) + .unwrap_or(0); + env.storage() + .persistent() + .set(&DataKey::TotalUsers, &(current + 1)); + } + + pub fn add_distributed_rewards(env: &Env, amount: i128) { + let current = env + .storage() + .persistent() + .get(&DataKey::TotalDistributedRewards) + .unwrap_or(0); + env.storage() + .persistent() + .set(&DataKey::TotalDistributedRewards, &(current + amount)); + } +} diff --git a/StarShopContracts/referral-contract/src/referral.rs b/StarShopContracts/referral-contract/src/referral.rs new file mode 100644 index 0000000..7d28fb6 --- /dev/null +++ b/StarShopContracts/referral-contract/src/referral.rs @@ -0,0 +1,143 @@ +use crate::helpers::{ensure_contract_active, ensure_user_verified, get_user_data, user_exists}; +use crate::interface::ReferralOperations; +use crate::level::LevelManagementModule; +use crate::metrics::MetricsModule; +use crate::types::{DataKey, Error, UserData, UserLevel, VerificationStatus}; +use crate::verification::VerificationModule; +use soroban_sdk::{Address, Env, String, Vec}; + +pub struct ReferralModule; + +impl ReferralOperations for ReferralModule { + fn register_with_referral( + env: Env, + user: Address, + referrer_address: Address, + identity_proof: String, + ) -> Result<(), Error> { + ensure_contract_active(&env)?; + user.require_auth(); + + // Check if user already exists + if user_exists(&env, &user) { + return Err(Error::AlreadyRegistered); + } + + // Check if referrer exists + if !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)?; + + // Create new user data + let mut user_data = UserData { + address: user.clone(), + referrer: Some(referrer_address.clone()), + direct_referrals: Vec::new(&env), + team_size: 0, + pending_rewards: 0, + total_rewards: 0, + level: UserLevel::Basic, + verification_status: VerificationStatus::Pending, + identity_proof: identity_proof.clone(), + join_date: env.ledger().timestamp(), + }; + + // Store user data + env.storage() + .persistent() + .set(&DataKey::User(user.clone()), &user_data); + + // Update referrer's direct referrals and team size + Self::update_referrer_stats(&env, &referrer_address, &user)?; + + // Submit verification automatically + VerificationModule::process_verification(&env, &mut user_data, &identity_proof)?; + + // Increment total users + MetricsModule::increment_total_users(&env); + + Ok(()) + } + + fn is_user_verified(env: Env, user: Address) -> Result { + 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)) + } + + fn get_user_info(env: Env, user: Address) -> Result { + get_user_data(&env, &user) + } + + fn get_direct_referrals(env: Env, user: Address) -> Result, Error> { + let user_data = 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)?; + Ok(user_data.team_size) + } +} + +// Helper functions +impl ReferralModule { + fn update_referrer_stats( + env: &Env, + referrer: &Address, + new_user: &Address, + ) -> Result<(), Error> { + let mut referrer_data = get_user_data(env, referrer)?; + + // Add to direct referrals + referrer_data.direct_referrals.push_back(new_user.clone()); + + // Update team size + referrer_data.team_size += 1; + + // Check for level update + LevelManagementModule::check_and_update_level(env, &mut referrer_data)?; + + // Store updated referrer data + env.storage() + .persistent() + .set(&DataKey::User(referrer.clone()), &referrer_data); + + // Update upstream team sizes (for 3 levels) + if let Some(upline) = &referrer_data.referrer { + Self::update_upline_team_size(env, upline, 2)?; + } + + Ok(()) + } + + fn update_upline_team_size( + env: &Env, + user: &Address, + remaining_levels: u32, + ) -> Result<(), Error> { + if remaining_levels == 0 { + return Ok(()); + } + + let mut user_data = get_user_data(env, user)?; + user_data.team_size += 1; + + env.storage() + .persistent() + .set(&DataKey::User(user.clone()), &user_data); + + if let Some(upline) = user_data.referrer { + Self::update_upline_team_size(env, &upline, remaining_levels - 1)?; + } + + Ok(()) + } +} diff --git a/StarShopContracts/referral-contract/src/rewards.rs b/StarShopContracts/referral-contract/src/rewards.rs new file mode 100644 index 0000000..ffc838a --- /dev/null +++ b/StarShopContracts/referral-contract/src/rewards.rs @@ -0,0 +1,218 @@ +use crate::helpers::{ensure_contract_active, ensure_user_verified, get_user_data, verify_admin}; +use crate::interface::RewardOperations; +use crate::level::LevelManagementModule; +use crate::metrics::MetricsModule; +use crate::types::{DataKey, Error, Milestone, MilestoneRequirement, RewardRates}; +use soroban_sdk::token::Client as TokenClient; +use soroban_sdk::{Address, Env, Vec}; + +pub struct RewardModule; + +impl RewardOperations for RewardModule { + fn distribute_rewards(env: Env, user: Address, amount: i128) -> Result<(), Error> { + ensure_contract_active(&env)?; + verify_admin(&env)?; + + // Get user data and verify + let user_data = get_user_data(&env, &user)?; + ensure_user_verified(&user_data)?; + + // Verify amount is positive + if amount <= 0 { + return Err(Error::InvalidAmount); + } + + let mut total_distributed = 0; + + // Get reward rates + let rates: RewardRates = env + .storage() + .persistent() + .get(&DataKey::RewardRates) + .ok_or(Error::InvalidRewardRates)?; + + // Check if amount exceeds max reward per referral + if amount > rates.max_reward_per_referral { + return Err(Error::MaxRewardExceeded); + } + + // First reward the user themselves + let mut user_data = get_user_data(&env, &user)?; + user_data.pending_rewards += amount; + user_data.total_rewards += amount; + total_distributed += amount; + + // Update storage for user + env.storage() + .persistent() + .set(&DataKey::User(user.clone()), &user_data); + + // Calculate and distribute rewards to upline (up to 3 levels) + let mut current_user = user_data.clone(); + let mut remaining_levels = 3; + + while let Some(upline_address) = current_user.referrer { + if remaining_levels == 0 { + break; + } + + let mut upline_data = get_user_data(&env, &upline_address)?; + + // Calculate reward based on level + let reward_rate = match remaining_levels { + 3 => rates.level1, + 2 => rates.level2, + 1 => rates.level3, + _ => 0, + }; + + let reward_amount = (amount * reward_rate as i128) / 10000; // Convert basis points to actual percentage + upline_data.pending_rewards += reward_amount; + upline_data.total_rewards += reward_amount; + total_distributed += reward_amount; + + // Check and update level + LevelManagementModule::check_and_update_level(&env, &mut upline_data)?; + + // Update storage (only once) + env.storage() + .persistent() + .set(&DataKey::User(upline_address.clone()), &upline_data); + + current_user = upline_data; + remaining_levels -= 1; + } + + // Update total distributed rewards + MetricsModule::add_distributed_rewards(&env, total_distributed); + + Ok(()) + } + + fn claim_rewards(env: Env, user: Address) -> Result { + ensure_contract_active(&env)?; + user.require_auth(); + + let mut user_data = get_user_data(&env, &user)?; + ensure_user_verified(&user_data)?; + + if user_data.pending_rewards <= 0 { + return Err(Error::InsufficientRewards); + } + + let amount = user_data.pending_rewards; + user_data.pending_rewards = 0; + + let reward_token = env + .storage() + .persistent() + .get(&DataKey::RewardToken) + .ok_or(Error::InvalidRewardToken)?; + + // Transfer tokens to user + let token = TokenClient::new(&env, &reward_token); + token.transfer(&env.current_contract_address(), &user, &amount); + + // Update storage + env.storage() + .persistent() + .set(&DataKey::User(user), &user_data); + + Ok(amount) + } + + fn get_pending_rewards(env: Env, user: Address) -> Result { + let user_data = 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)?; + 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 mut milestone_id = 0; + while env + .storage() + .persistent() + .has(&DataKey::Milestone(milestone_id)) + { + // check if milestone already achieved + if RewardModule::has_achieved_milestone(&env, &user, milestone_id) { + milestone_id += 1; + continue; + } + + let milestone: Milestone = env + .storage() + .persistent() + .get(&DataKey::Milestone(milestone_id)) + .unwrap(); + + // Check if user meets milestone requirements + let requirement_met = match milestone.requirement { + MilestoneRequirement::DirectReferrals(required) => { + user_data.direct_referrals.len() as u32 >= required + } + MilestoneRequirement::TeamSize(required) => user_data.team_size >= required, + MilestoneRequirement::TotalRewards(required) => user_data.total_rewards >= required, + MilestoneRequirement::ActiveDays(required) => { + let current_time = env.ledger().timestamp(); + (current_time - user_data.join_date) / (24 * 60 * 60) >= required + } + }; + + // If requirement met and user level matches or exceeds required level + if requirement_met && (user_data.level >= milestone.required_level) { + // Distribute milestone reward + let mut updated_user = user_data.clone(); + updated_user.pending_rewards += milestone.reward_amount; + updated_user.total_rewards += milestone.reward_amount; + + // Update user data + env.storage() + .persistent() + .set(&DataKey::User(user.clone()), &updated_user); + + // Update total distributed rewards + MetricsModule::add_distributed_rewards(&env, milestone.reward_amount); + + // Mark milestone as achieved for this user + let mut updated_achieved = env + .storage() + .persistent() + .get::<_, Vec>(&DataKey::UserAchievedMilestones(user.clone())) + .unwrap_or_else(|| Vec::new(&env)); + + updated_achieved.push_back(milestone_id); + + env.storage().persistent().set( + &DataKey::UserAchievedMilestones(user.clone()), + &updated_achieved, + ); + + return Ok(()); + } + + milestone_id += 1; + } + + Ok(()) + } +} + +// Helper functions +impl RewardModule { + pub fn has_achieved_milestone(env: &Env, user: &Address, milestone_id: u32) -> bool { + env.storage() + .persistent() + .get::<_, Vec>(&DataKey::UserAchievedMilestones(user.clone())) + .map_or(false, |achieved| achieved.contains(&milestone_id)) + } +} diff --git a/StarShopContracts/referral-contract/src/test.rs b/StarShopContracts/referral-contract/src/test.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/StarShopContracts/referral-contract/src/test.rs @@ -0,0 +1 @@ + diff --git a/StarShopContracts/referral-contract/src/types.rs b/StarShopContracts/referral-contract/src/types.rs new file mode 100644 index 0000000..ea013f2 --- /dev/null +++ b/StarShopContracts/referral-contract/src/types.rs @@ -0,0 +1,127 @@ +use soroban_sdk::{contracterror, contracttype, Address, String, Vec}; + +/// User verification status in the system +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum VerificationStatus { + Pending, // Initial state when verification is submitted + Verified, // User has passed verification + Rejected(String), // User was rejected with reason +} + +/// User levels with increasing benefits +/// Higher levels require stricter criteria and offer better rewards +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] +pub enum UserLevel { + Basic = 0, // New users, basic commission rates + Silver = 1, // Intermediate level, improved rates + Gold = 2, // Advanced level, premium rates + Platinum = 3, // Highest level, maximum benefits +} + +/// Core user data structure containing all user-related information +#[contracttype] +#[derive(Clone)] +pub struct UserData { + pub address: Address, // User's blockchain address + pub referrer: Option
, // Address of user's referrer + pub direct_referrals: Vec
, // List of direct referrals + pub team_size: u32, // Total team size (all levels) + pub pending_rewards: i128, // Unclaimed rewards + pub total_rewards: i128, // All-time earned rewards + pub level: UserLevel, // Current user level + pub verification_status: VerificationStatus, // KYC status + pub identity_proof: String, // Verification documents hash + pub join_date: u64, // Registration timestamp +} + +/// Milestone achievement criteria and rewards +#[contracttype] +#[derive(Clone)] +pub struct Milestone { + pub required_level: UserLevel, // Minimum level required + pub requirement: MilestoneRequirement, // Achievement criteria + pub reward_amount: i128, // Reward for completion + pub description: String, // Milestone description +} + +/// Different types of milestone requirements +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub enum MilestoneRequirement { + DirectReferrals(u32), // Number of direct referrals needed + TeamSize(u32), // Total team size required + TotalRewards(i128), // Cumulative rewards threshold + ActiveDays(u64), // Days of activity required +} + +/// Storage keys for contract data +#[contracttype] +pub enum DataKey { + Admin, // Contract administrator + TotalUsers, // Total registered users + RewardToken, // Token used for rewards + RewardRates, // Commission rates config + User(Address), // User data storage + Milestone(u32), // Milestone data + ContractPaused, // Contract pause status + ReferralCode(String), // Referral code mapping + TotalDistributedRewards, // Total rewards given + UserAchievedMilestones(Address), // User's completed milestones + PendingVerifications(Vec
), // Users awaiting verification + LevelRequirements, // Level upgrade criteria +} + +/// Commission rates for different referral levels +#[contracttype] +#[derive(Clone)] +pub struct RewardRates { + pub level1: u32, // Direct referral rate (basis points) + pub level2: u32, // Second level rate + pub level3: u32, // Third level rate + pub max_reward_per_referral: i128, // Maximum reward cap +} + +/// Criteria for level upgrades +#[contracttype] +#[derive(Clone)] +pub struct LevelCriteria { + pub required_direct_referrals: u32, // Minimum direct referrals + pub required_team_size: u32, // Minimum total team size + pub required_total_rewards: i128, // Minimum earned rewards +} + +/// Requirements for each level upgrade +#[contracttype] +pub struct LevelRequirements { + pub silver: LevelCriteria, // Requirements for Silver + pub gold: LevelCriteria, // Requirements for Gold + pub platinum: LevelCriteria, // Requirements for Platinum +} + +/// Contract error types +#[contracterror] +#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] +#[repr(u32)] +pub enum Error { + AlreadyInitialized = 1, // Contract already setup + Unauthorized = 2, // Caller lacks permission + AlreadyRegistered = 3, // User already exists + InvalidReferralCode = 4, // Invalid/expired code + UserNotFound = 5, // User doesn't exist + MilestoneNotFound = 6, // Milestone not found + InvalidAmount = 7, // Invalid reward amount + VerificationRequired = 8, // Action needs verification + AlreadyVerified = 9, // Already verified + InvalidIdentityProof = 10, // Invalid KYC documents + ReferralCodeExists = 11, // Code already taken + InsufficientRewards = 12, // Not enough rewards + InvalidRewardRates = 13, // Invalid commission rates + MaxRewardExceeded = 14, // Reward cap reached + ReferrerNotVerified = 15, // Referrer needs verification + ReferrerNotFound = 16, // Referrer doesn't exist + InvalidLevelRequirements = 17, // Invalid level criteria + ContractPaused = 18, // Contract is paused + InvalidRewardToken = 19, // Invalid token address +} diff --git a/StarShopContracts/referral-contract/src/verification.rs b/StarShopContracts/referral-contract/src/verification.rs new file mode 100644 index 0000000..ac8c379 --- /dev/null +++ b/StarShopContracts/referral-contract/src/verification.rs @@ -0,0 +1,118 @@ +use crate::helpers::{ensure_contract_active, get_user_data, verify_admin}; +use crate::interface::VerificationOperations; +use crate::types::{DataKey, Error, UserData, VerificationStatus}; +use soroban_sdk::{Address, Env, String, Vec}; + +pub struct VerificationModule; + +impl VerificationOperations for VerificationModule { + fn submit_verification(env: Env, user: Address, identity_proof: String) -> Result<(), Error> { + ensure_contract_active(&env)?; + user.require_auth(); + + let mut user_data = 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)?; + + let mut user_data = get_user_data(&env, &user)?; + user_data.verification_status = VerificationStatus::Verified; + + env.storage() + .persistent() + .set(&DataKey::User(user.clone()), &user_data); + Self::remove_from_pending_verifications(&env, &user); + + Ok(()) + } + + fn reject_verification(env: Env, user: Address, reason: String) -> Result<(), Error> { + verify_admin(&env)?; + + let mut user_data = get_user_data(&env, &user)?; + user_data.verification_status = VerificationStatus::Rejected(reason); + + env.storage() + .persistent() + .set(&DataKey::User(user.clone()), &user_data); + Self::remove_from_pending_verifications(&env, &user); + + Ok(()) + } + + fn get_verification_status(env: Env, user: Address) -> Result { + let user_data = 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?? + + Ok(env + .storage() + .persistent() + .get(&DataKey::PendingVerifications(Vec::new(&env))) + .unwrap_or_else(|| Vec::new(&env))) + } +} + +// Helper functions +impl VerificationModule { + pub fn process_verification( + env: &Env, + user: &mut UserData, + identity_proof: &String, + ) -> Result<(), Error> { + match user.verification_status { + VerificationStatus::Verified => return Err(Error::AlreadyVerified), + VerificationStatus::Pending => return Err(Error::AlreadyVerified), + VerificationStatus::Rejected(_) => (), + } + + user.verification_status = VerificationStatus::Pending; + user.identity_proof = identity_proof.clone(); + + env.storage() + .persistent() + .set(&DataKey::User(user.address.clone()), user); + Self::add_to_pending_verifications(&env, &user.address); + + Ok(()) + } + + //add user to pending verifications + fn add_to_pending_verifications(env: &Env, user: &Address) { + let mut pending = env + .storage() + .persistent() + .get::<_, Vec
>(&DataKey::PendingVerifications(Vec::new(env))) + .unwrap_or_else(|| Vec::new(env)); + + pending.push_back(user.clone()); + env.storage() + .persistent() + .set(&DataKey::PendingVerifications(Vec::new(env)), &pending); + } + + fn remove_from_pending_verifications(env: &Env, user: &Address) { + let pending = env + .storage() + .persistent() + .get::<_, Vec
>(&DataKey::PendingVerifications(Vec::new(env))) + .unwrap_or_else(|| Vec::new(env)); + + // Remove the user from pending verifications + let mut new_pending = Vec::new(env); + for addr in pending.iter() { + if &addr != user { + new_pending.push_back(addr); + } + } + + env.storage() + .persistent() + .set(&DataKey::PendingVerifications(Vec::new(env)), &new_pending); + } +} From 466fbd5747dbd58769ce9cb7c3b60580c2d4e9e8 Mon Sep 17 00:00:00 2001 From: Ikem Peter Date: Sun, 23 Feb 2025 08:08:22 +0100 Subject: [PATCH 2/8] added referral-contract to workspace --- Cargo.lock | 7 +++++++ Cargo.toml | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index b228fbf..7758089 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -945,6 +945,13 @@ dependencies = [ "getrandom", ] +[[package]] +name = "referral-contract" +version = "0.0.0" +dependencies = [ + "soroban-sdk", +] + [[package]] name = "rfc6979" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index b73ebd0..8fd4b29 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ members = [ "StarShopContracts/implement-payment-contract", "StarShopContracts/product-follow-contract", "StarShopContracts/product-voting-contract", + "StarShopContracts/referral-contract", ] [workspace.dependencies] @@ -24,4 +25,4 @@ lto = true # For more information about this profile see https://soroban.stellar.org/docs/basic-tutorials/logging#cargotoml-profile [profile.release-with-logs] inherits = "release" -debug-assertions = true \ No newline at end of file +debug-assertions = true From 3fb7ccfd43ddf1950dc9acc96749ac53cce236c1 Mon Sep 17 00:00:00 2001 From: Ikem Peter Date: Sun, 23 Feb 2025 08:22:33 +0100 Subject: [PATCH 3/8] updated readme --- StarShopContracts/referral-contract/README.md | 160 +++++++++++++++--- 1 file changed, 139 insertions(+), 21 deletions(-) diff --git a/StarShopContracts/referral-contract/README.md b/StarShopContracts/referral-contract/README.md index 197817e..91660b2 100644 --- a/StarShopContracts/referral-contract/README.md +++ b/StarShopContracts/referral-contract/README.md @@ -1,27 +1,145 @@ -# Soroban Project +# Multi-Level Referral Smart Contract -## Project Structure +A Soroban smart contract implementing a sophisticated multi-level referral +system with reward tracking, commission distribution, and user verification. -This repository uses the recommended structure for a Soroban project: +## 🌟 Features + +### Referral System + +- Multi-level referral tracking (up to 3 levels) +- Automatic commission distribution +- Team size tracking across levels +- Verified referrer requirements + +### User Levels + +- 4-tier system: Basic → Silver → Gold → Platinum +- Automatic level progression +- Configurable requirements per level: + - Direct referrals count + - Team size + - Total rewards earned + +### Reward Structure + +- Tiered commission rates: + - Level 1: 5% (configurable) + - Level 2: 2% (configurable) + - Level 3: 1% (configurable) +- Milestone-based rewards +- Reward caps per referral +- Automatic distribution + +### Verification System + +- KYC verification requirement +- Admin approval process +- Verification status tracking +- Identity proof storage + +### Security Features + +- Contract pause mechanism +- Admin controls +- Authorization checks +- Duplicate prevention +- Activity tracking + +## 📋 Prerequisites + +- Rust toolchain +- Soroban CLI + +## 🛠 Setup + +1. Install dependencies: + +```bash +make build +``` + +## 📝 Contract Interface + +### Admin Operations + +```rust +fn initialize(env: Env, admin: Address, reward_token: Address) -> Result<(), Error> +fn set_reward_rates(env: Env, rates: RewardRates) -> Result<(), Error> +fn set_level_requirements(env: Env, requirements: LevelRequirements) -> Result<(), Error> +fn pause_contract(env: Env) -> Result<(), Error> +fn resume_contract(env: Env) -> Result<(), Error> +``` + +### User Operations + +```rust +fn register_with_referral(env: Env, user: Address, referrer: Address, identity_proof: String) -> Result<(), Error> +fn submit_verification(env: Env, user: Address, identity_proof: String) -> Result<(), Error> +fn claim_rewards(env: Env, user: Address) -> Result +``` + +### Query Operations + +```rust +fn get_user_info(env: Env, user: Address) -> Result +fn get_pending_rewards(env: Env, user: Address) -> Result +fn get_verification_status(env: Env, user: Address) -> Result +``` + +## 🏗 Contract Structure ```text -. -├── referral-contract -│   ├── src -│   │   ├── lib.rs -│   │   └── test.rs -│  └── Cargo.toml -├── Cargo.toml -└── README.md +referral-contract/ +├── src/ +│ ├── lib.rs # Contract entry points +│ ├── admin.rs # Admin operations +│ ├── referral.rs # Referral logic +│ ├── rewards.rs # Reward management +│ ├── verification.rs # User verification +│ ├── level.rs # Level management +│ ├── types.rs # Data structures +│ ├── helpers.rs # Utility functions +│ └── test.rs # Test suite +└── Cargo.toml ``` -- New Soroban contracts can be put in `contracts`, each in their own directory. - There is already a `hello_world` contract in there to get you started. -- If you initialized this project with any other example contracts via - `--with-example`, those contracts will be in the `contracts` directory as - well. -- Contracts should have their own `Cargo.toml` files that rely on the top-level - `Cargo.toml` workspace for their dependencies. -- Frontend libraries can be added to the top-level directory as well. If you - initialized this project with a frontend template via `--frontend-template` - you will have those files already included. +## 🔄 User Flow + +1. User Registration + - Register with referrer + - Submit verification documents + - Await verification approval + +2. Level Progression + - Meet level requirements + - Automatic level upgrades + - Access level benefits + +3. Reward Distribution + - Earn commissions from referrals + - Achieve milestones + - Claim rewards + +## 🔐 Security Considerations + +- All critical operations require verification +- Admin operations are protected +- Reward caps prevent abuse +- Pause mechanism for emergencies + +## 📊 Metrics & Analytics + +- Total users tracking +- Reward distribution stats +- Referral conversion rates +- Level distribution +- System performance metrics + +## 🧪 Testing + +Run the test suite: + +```bash +make test +``` From f03377be1f80063add3a4933315bb4cf76ebe0e5 Mon Sep 17 00:00:00 2001 From: Ikem Peter Date: Sun, 23 Feb 2025 13:09:22 +0100 Subject: [PATCH 4/8] feat: write test, updated contract --- .../referral-contract/src/admin.rs | 48 +- .../referral-contract/src/helpers.rs | 6 +- .../referral-contract/src/interface.rs | 14 +- .../referral-contract/src/level.rs | 2 +- .../referral-contract/src/lib.rs | 47 +- .../referral-contract/src/metrics.rs | 16 +- .../referral-contract/src/referral.rs | 36 +- .../referral-contract/src/rewards.rs | 8 +- .../referral-contract/src/test.rs | 251 ++ .../referral-contract/src/types.rs | 26 +- .../referral-contract/src/verification.rs | 12 +- .../test_admin/test_initialization.1.json | 752 +++++ .../test/test_admin/test_pause_resume.1.json | 848 ++++++ .../test_levels/test_level_progression.1.json | 2523 +++++++++++++++++ .../test_metrics/test_system_metrics.1.json | 1526 ++++++++++ .../test_referral_registration.1.json | 1230 ++++++++ .../test_team_size_update.1.json | 1630 +++++++++++ .../test_milestone_achievement.1.json | 1699 +++++++++++ .../test_reward_distribution.1.json | 1351 +++++++++ ...test_registration_verification_flow.1.json | 721 +++++ .../test_verification_flow.1.json | 1029 +++++++ 21 files changed, 13689 insertions(+), 86 deletions(-) create mode 100644 StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_initialization.1.json create mode 100644 StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_pause_resume.1.json create mode 100644 StarShopContracts/referral-contract/test_snapshots/test/test_levels/test_level_progression.1.json create mode 100644 StarShopContracts/referral-contract/test_snapshots/test/test_metrics/test_system_metrics.1.json create mode 100644 StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_referral_registration.1.json create mode 100644 StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_team_size_update.1.json create mode 100644 StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_milestone_achievement.1.json create mode 100644 StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_reward_distribution.1.json create mode 100644 StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_registration_verification_flow.1.json create mode 100644 StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_verification_flow.1.json diff --git a/StarShopContracts/referral-contract/src/admin.rs b/StarShopContracts/referral-contract/src/admin.rs index 0bc6e85..04739aa 100644 --- a/StarShopContracts/referral-contract/src/admin.rs +++ b/StarShopContracts/referral-contract/src/admin.rs @@ -13,26 +13,26 @@ impl AdminOperations for AdminModule { level_requirements: LevelRequirements, ) -> Result<(), Error> { // Check if contract is already initialized - if env.storage().persistent().has(&DataKey::Admin) { + if env.storage().instance().has(&DataKey::Admin) { return Err(Error::AlreadyInitialized); } // Store admin address - env.storage().persistent().set(&DataKey::Admin, &admin); + env.storage().instance().set(&DataKey::Admin, &admin); // Initialize contract as active env.storage() - .persistent() + .instance() .set(&DataKey::ContractPaused, &false); // Store reward token env.storage() - .persistent() + .instance() .set(&DataKey::RewardToken, &reward_token); // Store level requirements env.storage() - .persistent() + .instance() .set(&DataKey::LevelRequirements, &level_requirements); Ok(()) @@ -40,9 +40,7 @@ impl AdminOperations for AdminModule { fn set_reward_rates(env: Env, rates: RewardRates) -> Result<(), Error> { verify_admin(&env)?; - env.storage() - .persistent() - .set(&DataKey::RewardRates, &rates); + env.storage().instance().set(&DataKey::RewardRates, &rates); Ok(()) } @@ -51,13 +49,13 @@ impl AdminOperations for AdminModule { // Find next available milestone ID let mut next_id = 0; - while env.storage().persistent().has(&DataKey::Milestone(next_id)) { + while env.storage().instance().has(&DataKey::Milestone(next_id)) { next_id += 1; } // Store the milestone with its ID env.storage() - .persistent() + .instance() .set(&DataKey::Milestone(next_id), &milestone); Ok(()) @@ -68,14 +66,14 @@ impl AdminOperations for AdminModule { if !env .storage() - .persistent() + .instance() .has(&DataKey::Milestone(milestone_id)) { return Err(Error::MilestoneNotFound); } env.storage() - .persistent() + .instance() .remove(&DataKey::Milestone(milestone_id)); Ok(()) } @@ -89,14 +87,14 @@ impl AdminOperations for AdminModule { if !env .storage() - .persistent() + .instance() .has(&DataKey::Milestone(milestone_id)) { return Err(Error::MilestoneNotFound); } env.storage() - .persistent() + .instance() .set(&DataKey::Milestone(milestone_id), &new_milestone); Ok(()) @@ -105,7 +103,7 @@ impl AdminOperations for AdminModule { fn pause_contract(env: Env) -> Result<(), Error> { verify_admin(&env)?; env.storage() - .persistent() + .instance() .set(&DataKey::ContractPaused, &true); Ok(()) } @@ -113,14 +111,18 @@ impl AdminOperations for AdminModule { fn resume_contract(env: Env) -> Result<(), Error> { verify_admin(&env)?; env.storage() - .persistent() + .instance() .set(&DataKey::ContractPaused, &false); Ok(()) } + fn get_paused_state(env: Env) -> Result { + Ok(Self::is_contract_paused(&env)) + } + fn transfer_admin(env: Env, new_admin: Address) -> Result<(), Error> { verify_admin(&env)?; - env.storage().persistent().set(&DataKey::Admin, &new_admin); + env.storage().instance().set(&DataKey::Admin, &new_admin); Ok(()) } @@ -133,25 +135,27 @@ impl AdminOperations for AdminModule { } env.storage() - .persistent() + .instance() .set(&DataKey::LevelRequirements, &requirements); Ok(()) } fn set_reward_token(env: Env, token: Address) -> Result<(), Error> { verify_admin(&env)?; - env.storage() - .persistent() - .set(&DataKey::RewardToken, &token); + env.storage().instance().set(&DataKey::RewardToken, &token); Ok(()) } + + fn get_admin(env: Env) -> Result { + Ok(env.storage().instance().get(&DataKey::Admin).unwrap()) + } } // Helper functions impl AdminModule { pub fn is_contract_paused(env: &Env) -> bool { env.storage() - .persistent() + .instance() .get(&DataKey::ContractPaused) .unwrap_or(false) } diff --git a/StarShopContracts/referral-contract/src/helpers.rs b/StarShopContracts/referral-contract/src/helpers.rs index 35e1b10..238d879 100644 --- a/StarShopContracts/referral-contract/src/helpers.rs +++ b/StarShopContracts/referral-contract/src/helpers.rs @@ -25,7 +25,11 @@ pub fn ensure_user_verified(user_data: &UserData) -> Result<(), Error> { } pub fn verify_admin(env: &Env) -> Result<(), Error> { - let admin: Address = env.storage().instance().get(&DataKey::Admin).unwrap(); + let admin: Address = env + .storage() + .instance() + .get(&DataKey::Admin) + .ok_or(Error::NotInitialized)?; admin.require_auth(); Ok(()) } diff --git a/StarShopContracts/referral-contract/src/interface.rs b/StarShopContracts/referral-contract/src/interface.rs index ee6fc79..a521a48 100644 --- a/StarShopContracts/referral-contract/src/interface.rs +++ b/StarShopContracts/referral-contract/src/interface.rs @@ -1,5 +1,5 @@ use crate::types::{ - Error, LevelRequirements, Milestone, RewardRates, UserData, VerificationStatus, + Error, LevelRequirements, Milestone, RewardRates, UserData, UserLevel, VerificationStatus, }; use soroban_sdk::{Address, Env, String, Vec}; @@ -23,6 +23,9 @@ pub trait VerificationOperations { /// Manages referral operations and relationships pub trait ReferralOperations { + /// Initialize contract + fn initialize(env: &Env, admin: &Address) -> Result<(), Error>; + /// Register new user with referral fn register_with_referral( env: Env, @@ -45,6 +48,9 @@ pub trait ReferralOperations { /// Get user's team size (all levels) fn get_team_size(env: Env, user: Address) -> Result; + + /// Get user's level + fn get_user_level(env: Env, user: Address) -> Result; } /// Handles reward calculations and distributions @@ -75,6 +81,9 @@ pub trait AdminOperations { level_requirements: LevelRequirements, ) -> Result<(), Error>; + /// get admin address + fn get_admin(env: Env) -> Result; + /// Set reward rates for different levels fn set_reward_rates(env: Env, rates: RewardRates) -> Result<(), Error>; @@ -99,6 +108,9 @@ pub trait AdminOperations { /// Resume contract operations fn resume_contract(env: Env) -> Result<(), Error>; + /// Check if contract is paused + fn get_paused_state(env: Env) -> Result; + /// Transfer admin rights to new address fn transfer_admin(env: Env, new_admin: Address) -> Result<(), Error>; } diff --git a/StarShopContracts/referral-contract/src/level.rs b/StarShopContracts/referral-contract/src/level.rs index 0e131a2..dec7be5 100644 --- a/StarShopContracts/referral-contract/src/level.rs +++ b/StarShopContracts/referral-contract/src/level.rs @@ -7,7 +7,7 @@ impl LevelManagementModule { pub fn check_and_update_level(env: &Env, user_data: &mut UserData) -> Result { let requirements: LevelRequirements = env .storage() - .persistent() + .instance() .get(&DataKey::LevelRequirements) .ok_or(Error::InvalidLevelRequirements)?; diff --git a/StarShopContracts/referral-contract/src/lib.rs b/StarShopContracts/referral-contract/src/lib.rs index 1f79a0a..ce6a752 100644 --- a/StarShopContracts/referral-contract/src/lib.rs +++ b/StarShopContracts/referral-contract/src/lib.rs @@ -20,7 +20,8 @@ use metrics::MetricsModule; use referral::ReferralModule; use rewards::RewardModule; use types::{ - Error, LevelCriteria, LevelRequirements, Milestone, RewardRates, UserData, VerificationStatus, + Error, LevelCriteria, LevelRequirements, Milestone, RewardRates, UserData, UserLevel, + VerificationStatus, }; use verification::VerificationModule; @@ -32,7 +33,6 @@ impl ReferralContract { /// Initializes the referral contract with an admin address, reward token, and default level requirements /// /// # Arguments - /// * `env` - The contract environment /// * `admin` - The address of the contract administrator /// * `reward_token` - The address of the token used for rewards pub fn initialize(env: Env, admin: Address, reward_token: Address) -> Result<(), Error> { @@ -53,23 +53,26 @@ impl ReferralContract { required_total_rewards: 20000, }, }; - + ReferralModule::initialize(&env, &admin)?; AdminModule::initialize(env, admin, reward_token, default_requirements) } /// Sets the reward rates for different referral levels /// /// # Arguments - /// * `env` - The contract environment /// * `rates` - The new reward rates structure pub fn set_reward_rates(env: Env, rates: RewardRates) -> Result<(), Error> { AdminModule::set_reward_rates(env, rates) } + /// get admin address + pub fn get_admin(env: Env) -> Result { + AdminModule::get_admin(env) + } + /// Adds a new milestone to the referral program /// /// # Arguments - /// * `env` - The contract environment /// * `milestone` - The milestone to be added pub fn add_milestone(env: Env, milestone: Milestone) -> Result<(), Error> { AdminModule::add_milestone(env, milestone) @@ -78,7 +81,6 @@ impl ReferralContract { /// Removes a milestone from the referral program /// /// # Arguments - /// * `env` - The contract environment /// * `milestone_id` - The ID of the milestone to remove pub fn remove_milestone(env: Env, milestone_id: u32) -> Result<(), Error> { AdminModule::remove_milestone(env, milestone_id) @@ -87,7 +89,6 @@ impl ReferralContract { /// Updates an existing milestone /// /// # Arguments - /// * `env` - The contract environment /// * `milestone_id` - The ID of the milestone to update /// * `milestone` - The new milestone data pub fn update_milestone( @@ -108,10 +109,14 @@ impl ReferralContract { AdminModule::resume_contract(env) } + /// Check if contract is paused + pub fn get_paused_state(env: Env) -> Result { + AdminModule::get_paused_state(env) + } + /// Transfers admin rights to a new address /// /// # Arguments - /// * `env` - The contract environment /// * `new_admin` - The address of the new administrator pub fn transfer_admin(env: Env, new_admin: Address) -> Result<(), Error> { AdminModule::transfer_admin(env, new_admin) @@ -120,7 +125,6 @@ impl ReferralContract { /// Sets or updates the reward token address /// /// # Arguments - /// * `env` - The contract environment /// * `token` - The address of the new reward token pub fn set_reward_token(env: Env, token: Address) -> Result<(), Error> { AdminModule::set_reward_token(env, token) @@ -129,7 +133,6 @@ impl ReferralContract { /// Updates the requirements for different referral levels /// /// # Arguments - /// * `env` - The contract environment /// * `requirements` - The new level requirements pub fn set_level_requirements(env: Env, requirements: LevelRequirements) -> Result<(), Error> { AdminModule::set_level_requirements(env, requirements) @@ -138,7 +141,6 @@ impl ReferralContract { /// Submits a verification request for a user /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user to verify /// * `identity_proof` - Proof of identity for verification pub fn submit_verification( @@ -152,7 +154,6 @@ impl ReferralContract { /// Approves a user's verification request /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user to approve pub fn approve_verification(env: Env, user: Address) -> Result<(), Error> { VerificationModule::approve_verification(env, user) @@ -161,7 +162,6 @@ impl ReferralContract { /// Rejects a user's verification request with a reason /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user to reject /// * `reason` - The reason for rejection pub fn reject_verification(env: Env, user: Address, reason: String) -> Result<(), Error> { @@ -171,7 +171,6 @@ impl ReferralContract { /// Retrieves the verification status of a user /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user to check pub fn get_verification_status(env: Env, user: Address) -> Result { VerificationModule::get_verification_status(env, user) @@ -185,7 +184,6 @@ impl ReferralContract { /// Registers a new user with a referrer /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the new user /// * `referrer_address` - The address of the referrer /// * `identity_proof` - Proof of identity for verification @@ -201,7 +199,6 @@ impl ReferralContract { /// Checks if a user is verified /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user to check pub fn is_user_verified(env: Env, user: Address) -> Result { ReferralModule::is_user_verified(env, user) @@ -210,7 +207,6 @@ impl ReferralContract { /// Checks if a user is registered in the system /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user to check pub fn is_user_registered(env: Env, user: Address) -> Result { ReferralModule::is_user_registered(env, user) @@ -219,7 +215,6 @@ impl ReferralContract { /// Retrieves detailed information about a user /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user pub fn get_user_info(env: Env, user: Address) -> Result { ReferralModule::get_user_info(env, user) @@ -228,7 +223,6 @@ impl ReferralContract { /// Gets a list of direct referrals for a user /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user pub fn get_direct_referrals(env: Env, user: Address) -> Result, Error> { ReferralModule::get_direct_referrals(env, user) @@ -237,7 +231,6 @@ impl ReferralContract { /// Gets the total team size (direct and indirect referrals) for a user /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user pub fn get_team_size(env: Env, user: Address) -> Result { ReferralModule::get_team_size(env, user) @@ -246,7 +239,6 @@ impl ReferralContract { /// Distributes rewards to a user and their upline /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user /// * `amount` - The amount of rewards to distribute pub fn distribute_rewards(env: Env, user: Address, amount: i128) -> Result<(), Error> { @@ -256,7 +248,6 @@ impl ReferralContract { /// Allows a user to claim their accumulated rewards /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user claiming rewards pub fn claim_rewards(env: Env, user: Address) -> Result { RewardModule::claim_rewards(env, user) @@ -265,7 +256,6 @@ impl ReferralContract { /// Gets the amount of pending rewards for a user /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user pub fn get_pending_rewards(env: Env, user: Address) -> Result { RewardModule::get_pending_rewards(env, user) @@ -274,7 +264,6 @@ impl ReferralContract { /// Gets the total rewards earned by a user /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user pub fn get_total_rewards(env: Env, user: Address) -> Result { RewardModule::get_total_rewards(env, user) @@ -283,7 +272,6 @@ impl ReferralContract { /// Checks and rewards any achieved milestones for a user /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user pub fn check_and_reward_milestone(env: Env, user: Address) -> Result<(), Error> { RewardModule::check_and_reward_milestone(env, user) @@ -309,11 +297,18 @@ impl ReferralContract { /// Gets the referral conversion rate for a user. verified users/registered users /// /// # Arguments - /// * `env` - The contract environment /// * `user` - The address of the user pub fn get_referral_conversion_rate(env: Env, user: Address) -> Result { MetricsModule::get_referral_conversion_rate(env, user) } + + /// Gets the level of a user + /// + /// # Arguments + /// * `user` - The address of the user + pub fn get_user_level(env: Env, user: Address) -> Result { + ReferralModule::get_user_level(env, user) + } } #[cfg(test)] diff --git a/StarShopContracts/referral-contract/src/metrics.rs b/StarShopContracts/referral-contract/src/metrics.rs index a528228..a2fa1c2 100644 --- a/StarShopContracts/referral-contract/src/metrics.rs +++ b/StarShopContracts/referral-contract/src/metrics.rs @@ -9,7 +9,7 @@ impl MetricsOperations for MetricsModule { fn get_total_users(env: Env) -> Result { Ok(env .storage() - .persistent() + .instance() .get(&DataKey::TotalUsers) .unwrap_or(0)) } @@ -17,8 +17,8 @@ impl MetricsOperations for MetricsModule { fn get_total_distributed_rewards(env: Env) -> Result { Ok(env .storage() - .persistent() - .get(&DataKey::TotalDistributedRewards) + .instance() + .get::<_, i128>(&DataKey::TotalDistributedRewards) .unwrap_or(0)) } @@ -75,22 +75,24 @@ impl MetricsModule { pub fn increment_total_users(env: &Env) { let current = env .storage() - .persistent() + .instance() .get(&DataKey::TotalUsers) .unwrap_or(0); + env.storage() - .persistent() + .instance() .set(&DataKey::TotalUsers, &(current + 1)); } pub fn add_distributed_rewards(env: &Env, amount: i128) { let current = env .storage() - .persistent() + .instance() .get(&DataKey::TotalDistributedRewards) .unwrap_or(0); + env.storage() - .persistent() + .instance() .set(&DataKey::TotalDistributedRewards, &(current + amount)); } } diff --git a/StarShopContracts/referral-contract/src/referral.rs b/StarShopContracts/referral-contract/src/referral.rs index 7d28fb6..225ea9a 100644 --- a/StarShopContracts/referral-contract/src/referral.rs +++ b/StarShopContracts/referral-contract/src/referral.rs @@ -9,6 +9,31 @@ use soroban_sdk::{Address, Env, String, Vec}; pub struct ReferralModule; impl ReferralOperations for ReferralModule { + fn initialize(env: &Env, admin: &Address) -> Result<(), Error> { + admin.require_auth(); + + // Create new user data + let user_data = UserData { + address: admin.clone(), + referrer: None, + direct_referrals: Vec::new(&env), + team_size: 0, + pending_rewards: 0, + total_rewards: 0, + level: UserLevel::Basic, + verification_status: VerificationStatus::Verified, + identity_proof: String::from_str(&env, ""), + join_date: env.ledger().timestamp(), + }; + + // Store user data + env.storage() + .persistent() + .set(&DataKey::User(admin.clone()), &user_data); + + Ok(()) + } + fn register_with_referral( env: Env, user: Address, @@ -33,7 +58,7 @@ impl ReferralOperations for ReferralModule { ensure_user_verified(&referrer_data)?; // Create new user data - let mut user_data = UserData { + let user_data = UserData { address: user.clone(), referrer: Some(referrer_address.clone()), direct_referrals: Vec::new(&env), @@ -55,7 +80,7 @@ impl ReferralOperations for ReferralModule { Self::update_referrer_stats(&env, &referrer_address, &user)?; // Submit verification automatically - VerificationModule::process_verification(&env, &mut user_data, &identity_proof)?; + VerificationModule::add_to_pending_verifications(&env, &user); // Increment total users MetricsModule::increment_total_users(&env); @@ -85,6 +110,11 @@ impl ReferralOperations for ReferralModule { let user_data = 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)?; + Ok(user_data.level) + } } // Helper functions @@ -98,8 +128,6 @@ impl ReferralModule { // Add to direct referrals referrer_data.direct_referrals.push_back(new_user.clone()); - - // Update team size referrer_data.team_size += 1; // Check for level update diff --git a/StarShopContracts/referral-contract/src/rewards.rs b/StarShopContracts/referral-contract/src/rewards.rs index ffc838a..c49284b 100644 --- a/StarShopContracts/referral-contract/src/rewards.rs +++ b/StarShopContracts/referral-contract/src/rewards.rs @@ -27,7 +27,7 @@ impl RewardOperations for RewardModule { // Get reward rates let rates: RewardRates = env .storage() - .persistent() + .instance() .get(&DataKey::RewardRates) .ok_or(Error::InvalidRewardRates)?; @@ -105,7 +105,7 @@ impl RewardOperations for RewardModule { let reward_token = env .storage() - .persistent() + .instance() .get(&DataKey::RewardToken) .ok_or(Error::InvalidRewardToken)?; @@ -140,7 +140,7 @@ impl RewardOperations for RewardModule { let mut milestone_id = 0; while env .storage() - .persistent() + .instance() .has(&DataKey::Milestone(milestone_id)) { // check if milestone already achieved @@ -151,7 +151,7 @@ impl RewardOperations for RewardModule { let milestone: Milestone = env .storage() - .persistent() + .instance() .get(&DataKey::Milestone(milestone_id)) .unwrap(); diff --git a/StarShopContracts/referral-contract/src/test.rs b/StarShopContracts/referral-contract/src/test.rs index 8b13789..7fd7be9 100644 --- a/StarShopContracts/referral-contract/src/test.rs +++ b/StarShopContracts/referral-contract/src/test.rs @@ -1 +1,252 @@ +use super::*; +use crate::types::{MilestoneRequirement, UserLevel}; +use soroban_sdk::{testutils::Address as _, Address, Env}; +#[cfg(test)] +mod test_setup { + use super::*; + + pub fn setup_contract(e: &Env) -> (ReferralContractClient, Address, Address) { + let admin = Address::generate(e); + let token = e.register_stellar_asset_contract_v2(admin.clone()); + let contract_id = e.register(ReferralContract, {}); + let client = ReferralContractClient::new(e, &contract_id); + + e.mock_all_auths(); + + // Initialize first + let _ = client.initialize(&admin, &token.address()); + + // Set default reward rates after initialization + let rates = RewardRates { + level1: 500, // 5% + level2: 200, // 2% + level3: 100, // 1% + max_reward_per_referral: 1000000, + }; + + client.set_reward_rates(&rates); + + (client, admin, token.address()) + } +} + +mod test_admin { + use super::*; + + #[test] + #[should_panic(expected = "Error(Contract, #2)")] + fn test_initialization() { + let env = Env::default(); + let (contract, admin, token_address) = test_setup::setup_contract(&env); + + // Verify contract is initialized correctly + assert!(!contract.get_paused_state()); + + env.mock_all_auths(); + // Try to initialize again (should fail) + let _ = contract.initialize(&admin, &token_address); + } + + #[test] + fn test_pause_resume() { + let env = Env::default(); + let (contract, _, _) = test_setup::setup_contract(&env); + + env.mock_all_auths(); + // Test pause + contract.pause_contract(); + assert!(contract.get_paused_state()); + + // Test resume + contract.resume_contract(); + assert!(!contract.get_paused_state()); + } +} + +mod test_verification { + use super::*; + + #[test] + fn test_verification_flow() { + let env = Env::default(); + let (contract, admin, _) = test_setup::setup_contract(&env); + let user = Address::generate(&env); + + env.mock_all_auths(); + + // Register user with admin as referrer first + contract.register_with_referral(&user, &admin, &String::from_str(&env, "proof123")); + + // Check pending status + let status = contract.get_verification_status(&user); + assert!(matches!(status, VerificationStatus::Pending)); + + // Approve verification + contract.approve_verification(&user); + let status = contract.get_verification_status(&user); + assert!(matches!(status, VerificationStatus::Verified)); + } +} + +mod test_referral { + use super::*; + + #[test] + fn test_referral_registration() { + let env = Env::default(); + let (contract, admin, _) = test_setup::setup_contract(&env); + + env.mock_all_auths(); + // First user referred by admin + let user1 = Address::generate(&env); + contract.register_with_referral(&user1, &admin, &String::from_str(&env, "proof1")); + contract.approve_verification(&user1); + + env.mock_all_auths(); + // Second user referred by first user + let user2 = Address::generate(&env); + contract.register_with_referral(&user2, &user1, &String::from_str(&env, "proof2")); + + // Verify referral relationship + let user_info = contract.get_user_info(&user2); + assert_eq!(user_info.referrer, Some(user1)); + } + + #[test] + fn test_team_size_update() { + let env = Env::default(); + let (contract, admin, _) = test_setup::setup_contract(&env); + + env.mock_all_auths(); + // First user referred by admin + let user1 = Address::generate(&env); + contract.register_with_referral(&user1, &admin, &String::from_str(&env, "proof1")); + contract.approve_verification(&user1); + + // Register multiple referrals under first user + for _ in 0..3 { + env.mock_all_auths(); + let user = Address::generate(&env); + contract.register_with_referral(&user, &user1, &String::from_str(&env, "proof123")); + } + + // Check team size + let team_size = contract.get_team_size(&user1); + assert_eq!(team_size, 3); + } +} + +mod test_rewards { + use super::*; + + #[test] + fn test_reward_distribution() { + let env = Env::default(); + let (contract, admin, _) = test_setup::setup_contract(&env); + + env.mock_all_auths(); + // First user referred by admin + let user1 = Address::generate(&env); + contract.register_with_referral(&user1, &admin, &String::from_str(&env, "proof1")); + contract.approve_verification(&user1); + + env.mock_all_auths(); + // Second user referred by first user + let user2 = Address::generate(&env); + contract.register_with_referral(&user2, &user1, &String::from_str(&env, "proof2")); + contract.approve_verification(&user2); + + env.mock_all_auths(); + // Distribute rewards + contract.distribute_rewards(&user2, &1000); + + // Check rewards + let user1_rewards = contract.get_pending_rewards(&user1); + assert_eq!(user1_rewards, 50); // 5% of 1000 + } + + #[test] + fn test_milestone_achievement() { + let env = Env::default(); + let (contract, admin, _) = test_setup::setup_contract(&env); + + env.mock_all_auths(); + // Add milestone + let milestone = Milestone { + required_level: UserLevel::Basic, + requirement: MilestoneRequirement::DirectReferrals(2), + reward_amount: 1000, + description: String::from_str(&env, "First milestone"), + }; + contract.add_milestone(&milestone); + + // Setup user with required referrals + let user = Address::generate(&env); + contract.register_with_referral(&user, &admin, &String::from_str(&env, "proof1")); + contract.approve_verification(&user); + + // Add referrals + for _ in 0..2 { + let referral = Address::generate(&env); + contract.register_with_referral(&referral, &user, &String::from_str(&env, "proof")) + } + + // Check milestone + contract.check_and_reward_milestone(&user); + let user_rewards = contract.get_pending_rewards(&user); + assert_eq!(user_rewards, 1000); + } +} + +mod test_levels { + use super::*; + + #[test] + fn test_level_progression() { + let env = Env::default(); + let (contract, admin, _) = test_setup::setup_contract(&env); + + env.mock_all_auths(); + // First user referred by admin + let user = Address::generate(&env); + contract.register_with_referral(&user, &admin, &String::from_str(&env, "proof1")); + contract.approve_verification(&user); + + // Add enough referrals for Silver + for _ in 0..6 { + let referral = Address::generate(&env); + contract.register_with_referral(&referral, &user, &String::from_str(&env, "proof1243")); + contract.approve_verification(&referral); + } + + // Check level upgrade + let user_level = contract.get_user_level(&user); + assert_eq!(user_level, UserLevel::Silver); + } +} + +mod test_metrics { + use super::*; + + #[test] + fn test_system_metrics() { + let env = Env::default(); + let (contract, admin, _) = test_setup::setup_contract(&env); + + env.mock_all_auths(); + + for _ in 0..3 { + let user = Address::generate(&env); + contract.register_with_referral(&user, &admin, &String::from_str(&env, "proof")); + contract.approve_verification(&user); + } + + // Check metrics + let total_users = contract.get_total_users(); + assert_eq!(total_users, 4); // referrer + 3 referrals + + let conversion_rate = contract.get_referral_conversion_rate(&admin); + assert_eq!(conversion_rate, 100); // All referrals are verified + } +} diff --git a/StarShopContracts/referral-contract/src/types.rs b/StarShopContracts/referral-contract/src/types.rs index ea013f2..0550d8c 100644 --- a/StarShopContracts/referral-contract/src/types.rs +++ b/StarShopContracts/referral-contract/src/types.rs @@ -66,7 +66,6 @@ pub enum DataKey { User(Address), // User data storage Milestone(u32), // Milestone data ContractPaused, // Contract pause status - ReferralCode(String), // Referral code mapping TotalDistributedRewards, // Total rewards given UserAchievedMilestones(Address), // User's completed milestones PendingVerifications(Vec
), // Users awaiting verification @@ -105,23 +104,22 @@ pub struct LevelRequirements { #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] #[repr(u32)] pub enum Error { - AlreadyInitialized = 1, // Contract already setup - Unauthorized = 2, // Caller lacks permission - AlreadyRegistered = 3, // User already exists - InvalidReferralCode = 4, // Invalid/expired code + NotInitialized = 1, // Contract not initialized + AlreadyInitialized = 2, // Contract already setup + Unauthorized = 3, // Caller lacks permission + AlreadyRegistered = 4, // User already exists UserNotFound = 5, // User doesn't exist MilestoneNotFound = 6, // Milestone not found InvalidAmount = 7, // Invalid reward amount VerificationRequired = 8, // Action needs verification AlreadyVerified = 9, // Already verified InvalidIdentityProof = 10, // Invalid KYC documents - ReferralCodeExists = 11, // Code already taken - InsufficientRewards = 12, // Not enough rewards - InvalidRewardRates = 13, // Invalid commission rates - MaxRewardExceeded = 14, // Reward cap reached - ReferrerNotVerified = 15, // Referrer needs verification - ReferrerNotFound = 16, // Referrer doesn't exist - InvalidLevelRequirements = 17, // Invalid level criteria - ContractPaused = 18, // Contract is paused - InvalidRewardToken = 19, // Invalid token address + InsufficientRewards = 11, // Not enough rewards + InvalidRewardRates = 12, // Invalid commission rates + MaxRewardExceeded = 13, // Reward cap reached + ReferrerNotVerified = 14, // Referrer needs verification + ReferrerNotFound = 15, // Referrer doesn't exist + InvalidLevelRequirements = 16, // Invalid level criteria + ContractPaused = 17, // Contract is paused + InvalidRewardToken = 18, // Invalid token address } diff --git a/StarShopContracts/referral-contract/src/verification.rs b/StarShopContracts/referral-contract/src/verification.rs index ac8c379..5d44251 100644 --- a/StarShopContracts/referral-contract/src/verification.rs +++ b/StarShopContracts/referral-contract/src/verification.rs @@ -52,7 +52,7 @@ impl VerificationOperations for VerificationModule { Ok(env .storage() - .persistent() + .instance() .get(&DataKey::PendingVerifications(Vec::new(&env))) .unwrap_or_else(|| Vec::new(&env))) } @@ -83,23 +83,23 @@ impl VerificationModule { } //add user to pending verifications - fn add_to_pending_verifications(env: &Env, user: &Address) { + pub fn add_to_pending_verifications(env: &Env, user: &Address) { let mut pending = env .storage() - .persistent() + .instance() .get::<_, Vec
>(&DataKey::PendingVerifications(Vec::new(env))) .unwrap_or_else(|| Vec::new(env)); pending.push_back(user.clone()); env.storage() - .persistent() + .instance() .set(&DataKey::PendingVerifications(Vec::new(env)), &pending); } fn remove_from_pending_verifications(env: &Env, user: &Address) { let pending = env .storage() - .persistent() + .instance() .get::<_, Vec
>(&DataKey::PendingVerifications(Vec::new(env))) .unwrap_or_else(|| Vec::new(env)); @@ -112,7 +112,7 @@ impl VerificationModule { } env.storage() - .persistent() + .instance() .set(&DataKey::PendingVerifications(Vec::new(env)), &new_pending); } } diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_initialization.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_initialization.1.json new file mode 100644 index 0000000..8152cf4 --- /dev/null +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_initialization.1.json @@ -0,0 +1,752 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_reward_rates", + "args": [ + { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ContractPaused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "LevelRequirements" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "gold" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 50 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "platinum" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 20 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "silver" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 15 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardRates" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardToken" + } + ] + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_pause_resume.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_pause_resume.1.json new file mode 100644 index 0000000..9817f0f --- /dev/null +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_pause_resume.1.json @@ -0,0 +1,848 @@ +{ + "generators": { + "address": 3, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_reward_rates", + "args": [ + { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "pause_contract", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "resume_contract", + "args": [] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ContractPaused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "LevelRequirements" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "gold" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 50 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "platinum" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 20 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "silver" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 15 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardRates" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardToken" + } + ] + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_levels/test_level_progression.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_levels/test_level_progression.1.json new file mode 100644 index 0000000..53e129c --- /dev/null +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_levels/test_level_progression.1.json @@ -0,0 +1,2523 @@ +{ + "generators": { + "address": 10, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_reward_rates", + "args": [ + { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "string": "proof1" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof1243" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof1243" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof1243" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof1243" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof1243" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof1243" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 115220454072064130 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1301173170172112462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2307661404550649928 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 7270604957039011794 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof1" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 6 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof1243" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof1243" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof1243" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof1243" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof1243" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof1243" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ContractPaused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "LevelRequirements" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "gold" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 50 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "platinum" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 20 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "silver" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 15 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "PendingVerifications" + }, + { + "vec": [] + } + ] + }, + "val": { + "vec": [] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardRates" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardToken" + } + ] + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalUsers" + } + ] + }, + "val": { + "i32": 7 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 1194852393571756375 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", + "key": { + "ledger_key_nonce": { + "nonce": 3126073502131104533 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", + "key": { + "ledger_key_nonce": { + "nonce": 6517132746326325848 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", + "key": { + "ledger_key_nonce": { + "nonce": 2781962168096793370 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_metrics/test_system_metrics.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_metrics/test_system_metrics.1.json new file mode 100644 index 0000000..d361564 --- /dev/null +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_metrics/test_system_metrics.1.json @@ -0,0 +1,1526 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_reward_rates", + "args": [ + { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "string": "proof" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "string": "proof" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "string": "proof" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ContractPaused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "LevelRequirements" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "gold" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 50 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "platinum" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 20 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "silver" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 15 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "PendingVerifications" + }, + { + "vec": [] + } + ] + }, + "val": { + "vec": [] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardRates" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardToken" + } + ] + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalUsers" + } + ] + }, + "val": { + "i32": 3 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_referral_registration.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_referral_registration.1.json new file mode 100644 index 0000000..e268b17 --- /dev/null +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_referral_registration.1.json @@ -0,0 +1,1230 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_reward_rates", + "args": [ + { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "string": "proof1" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof2" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof1" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof2" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ContractPaused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "LevelRequirements" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "gold" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 50 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "platinum" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 20 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "silver" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 15 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "PendingVerifications" + }, + { + "vec": [] + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardRates" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardToken" + } + ] + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalUsers" + } + ] + }, + "val": { + "i32": 2 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_team_size_update.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_team_size_update.1.json new file mode 100644 index 0000000..e458f11 --- /dev/null +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_team_size_update.1.json @@ -0,0 +1,1630 @@ +{ + "generators": { + "address": 7, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_reward_rates", + "args": [ + { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "string": "proof1" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof123" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof123" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof123" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 4 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof1" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof123" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof123" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof123" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ContractPaused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "LevelRequirements" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "gold" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 50 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "platinum" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 20 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "silver" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 15 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "PendingVerifications" + }, + { + "vec": [] + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardRates" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardToken" + } + ] + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalUsers" + } + ] + }, + "val": { + "i32": 4 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_milestone_achievement.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_milestone_achievement.1.json new file mode 100644 index 0000000..2894648 --- /dev/null +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_milestone_achievement.1.json @@ -0,0 +1,1699 @@ +{ + "generators": { + "address": 6, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_reward_rates", + "args": [ + { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "add_milestone", + "args": [ + { + "map": [ + { + "key": { + "symbol": "description" + }, + "val": { + "string": "First milestone" + } + }, + { + "key": { + "symbol": "required_level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "requirement" + }, + "val": { + "vec": [ + { + "symbol": "DirectReferrals" + }, + { + "u32": 2 + } + ] + } + }, + { + "key": { + "symbol": "reward_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "string": "proof1" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "check_and_reward_milestone", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 3 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof1" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Pending" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "UserAchievedMilestones" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "UserAchievedMilestones" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "vec": [ + { + "u32": 0 + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ContractPaused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "LevelRequirements" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "gold" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 50 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "platinum" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 20 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "silver" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 15 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Milestone" + }, + { + "u32": 0 + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "description" + }, + "val": { + "string": "First milestone" + } + }, + { + "key": { + "symbol": "required_level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "requirement" + }, + "val": { + "vec": [ + { + "symbol": "DirectReferrals" + }, + { + "u32": 2 + } + ] + } + }, + { + "key": { + "symbol": "reward_amount" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "PendingVerifications" + }, + { + "vec": [] + } + ] + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4" + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardRates" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardToken" + } + ] + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalDistributedRewards" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalUsers" + } + ] + }, + "val": { + "i32": 3 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 5806905060045992000 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_reward_distribution.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_reward_distribution.1.json new file mode 100644 index 0000000..1a83b5d --- /dev/null +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_reward_distribution.1.json @@ -0,0 +1,1351 @@ +{ + "generators": { + "address": 5, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_reward_rates", + "args": [ + { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "string": "proof1" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "string": "proof2" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "distribute_rewards", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + }, + { + "i128": { + "hi": 0, + "lo": 1000 + } + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 6277191135259896685 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 8370022561469687789 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 2 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof1" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 50 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 50 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof2" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ContractPaused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "LevelRequirements" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "gold" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 50 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "platinum" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 20 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "silver" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 15 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "PendingVerifications" + }, + { + "vec": [] + } + ] + }, + "val": { + "vec": [] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardRates" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardToken" + } + ] + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalDistributedRewards" + } + ] + }, + "val": { + "i128": { + "hi": 0, + "lo": 1070 + } + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalUsers" + } + ] + }, + "val": { + "i32": 2 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", + "key": { + "ledger_key_nonce": { + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_registration_verification_flow.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_registration_verification_flow.1.json new file mode 100644 index 0000000..27e3729 --- /dev/null +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_registration_verification_flow.1.json @@ -0,0 +1,721 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_reward_rates", + "args": [ + { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ContractPaused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "LevelRequirements" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "gold" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 50 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "platinum" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 20 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "silver" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 15 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardRates" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardToken" + } + ] + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_verification_flow.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_verification_flow.1.json new file mode 100644 index 0000000..2a493c6 --- /dev/null +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_verification_flow.1.json @@ -0,0 +1,1029 @@ +{ + "generators": { + "address": 4, + "nonce": 0 + }, + "auth": [ + [ + [ + "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + { + "function": { + "contract_fn": { + "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "function_name": "set_admin", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "initialize", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_reward_rates", + "args": [ + { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "register_with_referral", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + }, + { + "string": "proof123" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "approve_verification", + "args": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + "sub_invocations": [] + } + ] + ], + [] + ], + "ledger": { + "protocol_version": 22, + "sequence_number": 0, + "timestamp": 0, + "network_id": "0000000000000000000000000000000000000000000000000000000000000000", + "base_reserve": 0, + "min_persistent_entry_ttl": 4096, + "min_temp_entry_ttl": 16, + "max_entry_ttl": 6312000, + "ledger_entries": [ + [ + { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "account": { + "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "balance": 0, + "seq_num": 0, + "num_sub_entries": 0, + "inflation_dest": null, + "flags": 0, + "home_domain": "", + "thresholds": "01010101", + "signers": [], + "ext": "v0" + } + }, + "ext": "v0" + }, + null + ] + ], + [ + { + "contract_data": { + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", + "key": { + "ledger_key_nonce": { + "nonce": 801925984706572462 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 1033654523790656264 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 2032731177588607455 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 5541220902715666415 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [ + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": "void" + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 1 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": { + "vec": [ + { + "symbol": "User" + }, + { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + ] + }, + "durability": "persistent", + "val": { + "map": [ + { + "key": { + "symbol": "address" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4" + } + }, + { + "key": { + "symbol": "direct_referrals" + }, + "val": { + "vec": [] + } + }, + { + "key": { + "symbol": "identity_proof" + }, + "val": { + "string": "proof123" + } + }, + { + "key": { + "symbol": "join_date" + }, + "val": { + "u64": 0 + } + }, + { + "key": { + "symbol": "level" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "pending_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "referrer" + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "symbol": "team_size" + }, + "val": { + "u32": 0 + } + }, + { + "key": { + "symbol": "total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + }, + { + "key": { + "symbol": "verification_status" + }, + "val": { + "vec": [ + { + "symbol": "Verified" + } + ] + } + } + ] + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": { + "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "storage": [ + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "ContractPaused" + } + ] + }, + "val": { + "bool": false + } + }, + { + "key": { + "vec": [ + { + "symbol": "LevelRequirements" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "gold" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 50 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "platinum" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 20 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "silver" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 15 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000 + } + } + } + ] + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "PendingVerifications" + }, + { + "vec": [] + } + ] + }, + "val": { + "vec": [] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardRates" + } + ] + }, + "val": { + "map": [ + { + "key": { + "symbol": "level1" + }, + "val": { + "u32": 500 + } + }, + { + "key": { + "symbol": "level2" + }, + "val": { + "u32": 200 + } + }, + { + "key": { + "symbol": "level3" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "max_reward_per_referral" + }, + "val": { + "i128": { + "hi": 0, + "lo": 1000000 + } + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "RewardToken" + } + ] + }, + "val": { + "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" + } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalUsers" + } + ] + }, + "val": { + "i32": 1 + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 4095 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", + "key": "ledger_key_contract_instance", + "durability": "persistent", + "val": { + "contract_instance": { + "executable": "stellar_asset", + "storage": [ + { + "key": { + "symbol": "METADATA" + }, + "val": { + "map": [ + { + "key": { + "symbol": "decimal" + }, + "val": { + "u32": 7 + } + }, + { + "key": { + "symbol": "name" + }, + "val": { + "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" + } + }, + { + "key": { + "symbol": "symbol" + }, + "val": { + "string": "aaa" + } + } + ] + } + }, + { + "key": { + "vec": [ + { + "symbol": "Admin" + } + ] + }, + "val": { + "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" + } + }, + { + "key": { + "vec": [ + { + "symbol": "AssetInfo" + } + ] + }, + "val": { + "vec": [ + { + "symbol": "AlphaNum4" + }, + { + "map": [ + { + "key": { + "symbol": "asset_code" + }, + "val": { + "string": "aaa\\0" + } + }, + { + "key": { + "symbol": "issuer" + }, + "val": { + "bytes": "0000000000000000000000000000000000000000000000000000000000000002" + } + } + ] + } + ] + } + } + ] + } + } + } + }, + "ext": "v0" + }, + 120960 + ] + ], + [ + { + "contract_code": { + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_code": { + "ext": "v0", + "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "code": "" + } + }, + "ext": "v0" + }, + 4095 + ] + ] + ] + }, + "events": [] +} \ No newline at end of file From 5ddc0ac51a7fe9db3f71f85057c65f3a67f329ba Mon Sep 17 00:00:00 2001 From: Ikem Peter Date: Tue, 25 Feb 2025 07:42:53 +0100 Subject: [PATCH 5/8] feat: passed test --- .../referral-contract/src/metrics.rs | 12 +- .../referral-contract/src/referral.rs | 3 + .../referral-contract/src/test.rs | 22 +- .../test_admin/test_initialization.1.json | 12 + .../test/test_admin/test_pause_resume.1.json | 12 + .../test_levels/test_level_progression.1.json | 229 +++++++++++++++--- .../test_metrics/test_system_metrics.1.json | 3 +- .../test_referral_registration.1.json | 2 +- .../test_team_size_update.1.json | 2 +- .../test_milestone_achievement.1.json | 2 +- .../test_reward_distribution.1.json | 2 +- .../test_verification_flow.1.json | 2 +- 12 files changed, 256 insertions(+), 47 deletions(-) diff --git a/StarShopContracts/referral-contract/src/metrics.rs b/StarShopContracts/referral-contract/src/metrics.rs index a2fa1c2..516e5c8 100644 --- a/StarShopContracts/referral-contract/src/metrics.rs +++ b/StarShopContracts/referral-contract/src/metrics.rs @@ -10,8 +10,8 @@ impl MetricsOperations for MetricsModule { Ok(env .storage() .instance() - .get(&DataKey::TotalUsers) - .unwrap_or(0)) + .get::<_, u32>(&DataKey::TotalUsers) + .unwrap_or_default()) } fn get_total_distributed_rewards(env: Env) -> Result { @@ -76,8 +76,8 @@ impl MetricsModule { let current = env .storage() .instance() - .get(&DataKey::TotalUsers) - .unwrap_or(0); + .get::<_, u32>(&DataKey::TotalUsers) + .unwrap_or_default(); env.storage() .instance() @@ -88,8 +88,8 @@ impl MetricsModule { let current = env .storage() .instance() - .get(&DataKey::TotalDistributedRewards) - .unwrap_or(0); + .get::<_, i128>(&DataKey::TotalDistributedRewards) + .unwrap_or_default(); env.storage() .instance() diff --git a/StarShopContracts/referral-contract/src/referral.rs b/StarShopContracts/referral-contract/src/referral.rs index 225ea9a..7680060 100644 --- a/StarShopContracts/referral-contract/src/referral.rs +++ b/StarShopContracts/referral-contract/src/referral.rs @@ -31,6 +31,9 @@ impl ReferralOperations for ReferralModule { .persistent() .set(&DataKey::User(admin.clone()), &user_data); + // Increment total users + MetricsModule::increment_total_users(&env); + Ok(()) } diff --git a/StarShopContracts/referral-contract/src/test.rs b/StarShopContracts/referral-contract/src/test.rs index 7fd7be9..6870ae5 100644 --- a/StarShopContracts/referral-contract/src/test.rs +++ b/StarShopContracts/referral-contract/src/test.rs @@ -17,7 +17,7 @@ mod test_setup { // Initialize first let _ = client.initialize(&admin, &token.address()); - // Set default reward rates after initialization + // Set default reward rates after initializationclea let rates = RewardRates { level1: 500, // 5% level2: 200, // 2% @@ -208,6 +208,26 @@ mod test_levels { let (contract, admin, _) = test_setup::setup_contract(&env); env.mock_all_auths(); + + let new_requirements = LevelRequirements { + silver: LevelCriteria { + required_direct_referrals: 5, + required_team_size: 5, + required_total_rewards: 0, + }, + gold: LevelCriteria { + required_direct_referrals: 10, + required_team_size: 50, + required_total_rewards: 5000, + }, + platinum: LevelCriteria { + required_direct_referrals: 20, + required_team_size: 100, + required_total_rewards: 20000, + }, + }; + contract.set_level_requirements(&new_requirements); + // First user referred by admin let user = Address::generate(&env); contract.register_with_referral(&user, &admin, &String::from_str(&env, "proof1")); diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_initialization.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_initialization.1.json index 8152cf4..d5d9a02 100644 --- a/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_initialization.1.json +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_initialization.1.json @@ -602,6 +602,18 @@ "val": { "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalUsers" + } + ] + }, + "val": { + "u32": 1 + } } ] } diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_pause_resume.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_pause_resume.1.json index 9817f0f..618717e 100644 --- a/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_pause_resume.1.json +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_admin/test_pause_resume.1.json @@ -698,6 +698,18 @@ "val": { "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" } + }, + { + "key": { + "vec": [ + { + "symbol": "TotalUsers" + } + ] + }, + "val": { + "u32": 1 + } } ] } diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_levels/test_level_progression.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_levels/test_level_progression.1.json index 53e129c..e521a0b 100644 --- a/StarShopContracts/referral-contract/test_snapshots/test/test_levels/test_level_progression.1.json +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_levels/test_level_progression.1.json @@ -101,6 +101,134 @@ } ] ], + [ + [ + "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + { + "function": { + "contract_fn": { + "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", + "function_name": "set_level_requirements", + "args": [ + { + "map": [ + { + "key": { + "symbol": "gold" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 10 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 50 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 5000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "platinum" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 20 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 100 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 20000 + } + } + } + ] + } + }, + { + "key": { + "symbol": "silver" + }, + "val": { + "map": [ + { + "key": { + "symbol": "required_direct_referrals" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_team_size" + }, + "val": { + "u32": 5 + } + }, + { + "key": { + "symbol": "required_total_rewards" + }, + "val": { + "i128": { + "hi": 0, + "lo": 0 + } + } + } + ] + } + } + ] + } + ] + } + }, + "sub_invocations": [] + } + ] + ], [ [ "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", @@ -488,7 +616,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 1033654523790656264 } }, "durability": "temporary" @@ -503,7 +631,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 115220454072064130 + "nonce": 1033654523790656264 } }, "durability": "temporary", @@ -521,7 +649,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1033654523790656264 + "nonce": 1194852393571756375 } }, "durability": "temporary" @@ -536,7 +664,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1033654523790656264 + "nonce": 1194852393571756375 } }, "durability": "temporary", @@ -554,7 +682,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1301173170172112462 + "nonce": 2781962168096793370 } }, "durability": "temporary" @@ -569,7 +697,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 1301173170172112462 + "nonce": 2781962168096793370 } }, "durability": "temporary", @@ -587,7 +715,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 2032731177588607455 + "nonce": 3126073502131104533 } }, "durability": "temporary" @@ -602,7 +730,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 2032731177588607455 + "nonce": 3126073502131104533 } }, "durability": "temporary", @@ -620,7 +748,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 2307661404550649928 + "nonce": 4270020994084947596 } }, "durability": "temporary" @@ -635,7 +763,40 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 2307661404550649928 + "nonce": 4270020994084947596 + } + }, + "durability": "temporary", + "val": "void" + } + }, + "ext": "v0" + }, + 6311999 + ] + ], + [ + { + "contract_data": { + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 + } + }, + "durability": "temporary" + } + }, + [ + { + "last_modified_ledger_seq": 0, + "data": { + "contract_data": { + "ext": "v0", + "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", + "key": { + "ledger_key_nonce": { + "nonce": 4837995959683129791 } }, "durability": "temporary", @@ -686,7 +847,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 5806905060045992000 + "nonce": 6277191135259896685 } }, "durability": "temporary" @@ -701,7 +862,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 5806905060045992000 + "nonce": 6277191135259896685 } }, "durability": "temporary", @@ -719,7 +880,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 7270604957039011794 + "nonce": 6391496069076573377 } }, "durability": "temporary" @@ -734,7 +895,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 7270604957039011794 + "nonce": 6391496069076573377 } }, "durability": "temporary", @@ -752,7 +913,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 8370022561469687789 + "nonce": 6517132746326325848 } }, "durability": "temporary" @@ -767,7 +928,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", "key": { "ledger_key_nonce": { - "nonce": 8370022561469687789 + "nonce": 6517132746326325848 } }, "durability": "temporary", @@ -1010,7 +1171,7 @@ "symbol": "level" }, "val": { - "u32": 0 + "u32": 1 } }, { @@ -2036,7 +2197,7 @@ "symbol": "required_team_size" }, "val": { - "u32": 15 + "u32": 5 } }, { @@ -2046,7 +2207,7 @@ "val": { "i128": { "hi": 0, - "lo": 1000 + "lo": 0 } } } @@ -2140,7 +2301,7 @@ ] }, "val": { - "i32": 7 + "u32": 8 } } ] @@ -2159,7 +2320,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 2032731177588607455 } }, "durability": "temporary" @@ -2174,7 +2335,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITA4", "key": { "ledger_key_nonce": { - "nonce": 4837995959683129791 + "nonce": 2032731177588607455 } }, "durability": "temporary", @@ -2192,7 +2353,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 8370022561469687789 } }, "durability": "temporary" @@ -2207,7 +2368,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAK3IM", "key": { "ledger_key_nonce": { - "nonce": 4270020994084947596 + "nonce": 8370022561469687789 } }, "durability": "temporary", @@ -2225,7 +2386,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "ledger_key_nonce": { - "nonce": 6277191135259896685 + "nonce": 5806905060045992000 } }, "durability": "temporary" @@ -2240,7 +2401,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDR4", "key": { "ledger_key_nonce": { - "nonce": 6277191135259896685 + "nonce": 5806905060045992000 } }, "durability": "temporary", @@ -2258,7 +2419,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 115220454072064130 } }, "durability": "temporary" @@ -2273,7 +2434,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOLZM", "key": { "ledger_key_nonce": { - "nonce": 1194852393571756375 + "nonce": 115220454072064130 } }, "durability": "temporary", @@ -2291,7 +2452,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", "key": { "ledger_key_nonce": { - "nonce": 3126073502131104533 + "nonce": 1301173170172112462 } }, "durability": "temporary" @@ -2306,7 +2467,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARQG5", "key": { "ledger_key_nonce": { - "nonce": 3126073502131104533 + "nonce": 1301173170172112462 } }, "durability": "temporary", @@ -2324,7 +2485,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", "key": { "ledger_key_nonce": { - "nonce": 6517132746326325848 + "nonce": 7270604957039011794 } }, "durability": "temporary" @@ -2339,7 +2500,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATYON", "key": { "ledger_key_nonce": { - "nonce": 6517132746326325848 + "nonce": 7270604957039011794 } }, "durability": "temporary", @@ -2357,7 +2518,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", "key": { "ledger_key_nonce": { - "nonce": 2781962168096793370 + "nonce": 2307661404550649928 } }, "durability": "temporary" @@ -2372,7 +2533,7 @@ "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAX5", "key": { "ledger_key_nonce": { - "nonce": 2781962168096793370 + "nonce": 2307661404550649928 } }, "durability": "temporary", diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_metrics/test_system_metrics.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_metrics/test_system_metrics.1.json index d361564..12d726a 100644 --- a/StarShopContracts/referral-contract/test_snapshots/test/test_metrics/test_system_metrics.1.json +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_metrics/test_system_metrics.1.json @@ -233,6 +233,7 @@ } ] ], + [], [] ], "ledger": { @@ -1275,7 +1276,7 @@ ] }, "val": { - "i32": 3 + "u32": 4 } } ] diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_referral_registration.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_referral_registration.1.json index e268b17..0f8cc39 100644 --- a/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_referral_registration.1.json +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_referral_registration.1.json @@ -1012,7 +1012,7 @@ ] }, "val": { - "i32": 2 + "u32": 3 } } ] diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_team_size_update.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_team_size_update.1.json index e458f11..008f56b 100644 --- a/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_team_size_update.1.json +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_referral/test_team_size_update.1.json @@ -1346,7 +1346,7 @@ ] }, "val": { - "i32": 4 + "u32": 5 } } ] diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_milestone_achievement.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_milestone_achievement.1.json index 2894648..8061f26 100644 --- a/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_milestone_achievement.1.json +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_milestone_achievement.1.json @@ -1415,7 +1415,7 @@ ] }, "val": { - "i32": 3 + "u32": 4 } } ] diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_reward_distribution.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_reward_distribution.1.json index 1a83b5d..20d73f2 100644 --- a/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_reward_distribution.1.json +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_rewards/test_reward_distribution.1.json @@ -1133,7 +1133,7 @@ ] }, "val": { - "i32": 2 + "u32": 3 } } ] diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_verification_flow.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_verification_flow.1.json index 2a493c6..7c1e276 100644 --- a/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_verification_flow.1.json +++ b/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_verification_flow.1.json @@ -844,7 +844,7 @@ ] }, "val": { - "i32": 1 + "u32": 2 } } ] From 28cfea2457abc995d01e5901d73ea796c145aee4 Mon Sep 17 00:00:00 2001 From: Ikem Peter Date: Thu, 27 Feb 2025 05:20:45 +0100 Subject: [PATCH 6/8] rm makeFile --- StarShopContracts/referral-contract/Makefile | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 StarShopContracts/referral-contract/Makefile diff --git a/StarShopContracts/referral-contract/Makefile b/StarShopContracts/referral-contract/Makefile deleted file mode 100644 index 7f774ad..0000000 --- a/StarShopContracts/referral-contract/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -default: build - -all: test - -test: build - cargo test - -build: - stellar contract build - @ls -l target/wasm32-unknown-unknown/release/*.wasm - -fmt: - cargo fmt --all - -clean: - cargo clean From 9b22cbf7a850bb9ce81963d075629d60b84162d7 Mon Sep 17 00:00:00 2001 From: Ikem Peter Date: Thu, 27 Feb 2025 05:21:08 +0100 Subject: [PATCH 7/8] re-structured contract --- .../referral-contract/src/admin.rs | 45 +- .../referral-contract/src/interface.rs | 131 ---- .../referral-contract/src/lib.rs | 28 +- .../referral-contract/src/metrics.rs | 98 --- .../referral-contract/src/referral.rs | 114 ++- .../referral-contract/src/rewards.rs | 45 +- .../referral-contract/src/verification.rs | 18 +- ...test_registration_verification_flow.1.json | 721 ------------------ 8 files changed, 221 insertions(+), 979 deletions(-) delete mode 100644 StarShopContracts/referral-contract/src/interface.rs delete mode 100644 StarShopContracts/referral-contract/src/metrics.rs delete mode 100644 StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_registration_verification_flow.1.json diff --git a/StarShopContracts/referral-contract/src/admin.rs b/StarShopContracts/referral-contract/src/admin.rs index 04739aa..b14e826 100644 --- a/StarShopContracts/referral-contract/src/admin.rs +++ b/StarShopContracts/referral-contract/src/admin.rs @@ -1,10 +1,53 @@ use crate::helpers::verify_admin; -use crate::interface::AdminOperations; use crate::types::{DataKey, Error, LevelRequirements, Milestone, RewardRates}; use soroban_sdk::{Address, Env}; pub struct AdminModule; +pub trait AdminOperations { + /// Initialize contract with admin address + fn initialize( + env: Env, + admin: Address, + reward_token: Address, + level_requirements: LevelRequirements, + ) -> Result<(), Error>; + + /// get admin address + fn get_admin(env: Env) -> Result; + + /// Set reward rates for different levels + fn set_reward_rates(env: Env, rates: RewardRates) -> Result<(), Error>; + + /// Set level requirements for different levels + fn set_level_requirements(env: Env, requirements: LevelRequirements) -> Result<(), Error>; + + /// Set reward token + fn set_reward_token(env: Env, token: Address) -> Result<(), Error>; + + /// Add new milestone + fn add_milestone(env: Env, milestone: Milestone) -> Result<(), Error>; + + /// Remove existing milestone + fn remove_milestone(env: Env, milestone_id: u32) -> Result<(), Error>; + + /// Update existing milestone + fn update_milestone(env: Env, milestone_id: u32, milestone: Milestone) -> Result<(), Error>; + + /// Pause contract operations (emergency) + fn pause_contract(env: Env) -> Result<(), Error>; + + /// Resume contract operations + fn resume_contract(env: Env) -> Result<(), Error>; + + /// Check if contract is paused + fn get_paused_state(env: Env) -> Result; + + /// Transfer admin rights to new address + fn transfer_admin(env: Env, new_admin: Address) -> Result<(), Error>; +} + + impl AdminOperations for AdminModule { fn initialize( env: Env, diff --git a/StarShopContracts/referral-contract/src/interface.rs b/StarShopContracts/referral-contract/src/interface.rs deleted file mode 100644 index a521a48..0000000 --- a/StarShopContracts/referral-contract/src/interface.rs +++ /dev/null @@ -1,131 +0,0 @@ -use crate::types::{ - Error, LevelRequirements, Milestone, RewardRates, UserData, UserLevel, VerificationStatus, -}; -use soroban_sdk::{Address, Env, String, Vec}; - -/// Handles verification operations for users -pub trait VerificationOperations { - /// Submit verification documents for review - fn submit_verification(env: Env, user: Address, identity_proof: String) -> Result<(), Error>; - - /// Admin approval of user verification - fn approve_verification(env: Env, user: Address) -> Result<(), Error>; - - /// Admin rejection of user verification with reason - fn reject_verification(env: Env, user: Address, reason: String) -> Result<(), Error>; - - /// Get user's verification status - fn get_verification_status(env: Env, user: Address) -> Result; - - /// Get list of pending verifications - fn get_pending_verifications(env: Env) -> Result, Error>; -} - -/// Manages referral operations and relationships -pub trait ReferralOperations { - /// Initialize contract - fn initialize(env: &Env, admin: &Address) -> Result<(), Error>; - - /// Register new user with referral - fn register_with_referral( - env: Env, - user: Address, - referrer_address: Address, - identity_proof: String, - ) -> Result<(), Error>; - - /// Check if user is verified - fn is_user_verified(env: Env, user: Address) -> Result; - - /// Check if user is registered - fn is_user_registered(env: Env, user: Address) -> Result; - - /// Get user's information - fn get_user_info(env: Env, user: Address) -> Result; - - /// Get user's direct referrals - fn get_direct_referrals(env: Env, user: Address) -> Result, Error>; - - /// Get user's team size (all levels) - fn get_team_size(env: Env, user: Address) -> Result; - - /// Get user's level - fn get_user_level(env: Env, user: Address) -> Result; -} - -/// Handles reward calculations and distributions -pub trait RewardOperations { - /// Distribute rewards for a referral - fn distribute_rewards(env: Env, user: Address, amount: i128) -> Result<(), Error>; - - /// Claim accumulated rewards - fn claim_rewards(env: Env, user: Address) -> Result; - - /// Get pending rewards balance - fn get_pending_rewards(env: Env, user: Address) -> Result; - - /// Get total rewards earned - fn get_total_rewards(env: Env, user: Address) -> Result; - - /// Check if milestone achieved and distribute rewards - fn check_and_reward_milestone(env: Env, user: Address) -> Result<(), Error>; -} - -/// Manages administrative operations -pub trait AdminOperations { - /// Initialize contract with admin address - fn initialize( - env: Env, - admin: Address, - reward_token: Address, - level_requirements: LevelRequirements, - ) -> Result<(), Error>; - - /// get admin address - fn get_admin(env: Env) -> Result; - - /// Set reward rates for different levels - fn set_reward_rates(env: Env, rates: RewardRates) -> Result<(), Error>; - - /// Set level requirements for different levels - fn set_level_requirements(env: Env, requirements: LevelRequirements) -> Result<(), Error>; - - /// Set reward token - fn set_reward_token(env: Env, token: Address) -> Result<(), Error>; - - /// Add new milestone - fn add_milestone(env: Env, milestone: Milestone) -> Result<(), Error>; - - /// Remove existing milestone - fn remove_milestone(env: Env, milestone_id: u32) -> Result<(), Error>; - - /// Update existing milestone - fn update_milestone(env: Env, milestone_id: u32, milestone: Milestone) -> Result<(), Error>; - - /// Pause contract operations (emergency) - fn pause_contract(env: Env) -> Result<(), Error>; - - /// Resume contract operations - fn resume_contract(env: Env) -> Result<(), Error>; - - /// Check if contract is paused - fn get_paused_state(env: Env) -> Result; - - /// Transfer admin rights to new address - fn transfer_admin(env: Env, new_admin: Address) -> Result<(), Error>; -} - -/// Handles system metrics and monitoring -pub trait MetricsOperations { - /// Get total registered users - fn get_total_users(env: Env) -> Result; - - /// Get total distributed rewards - fn get_total_distributed_rewards(env: Env) -> Result; - - /// Get system statistics - fn get_system_metrics(env: Env) -> Result, Error>; - - /// Get user conversion rates - fn get_referral_conversion_rate(env: Env, user: Address) -> Result; -} diff --git a/StarShopContracts/referral-contract/src/lib.rs b/StarShopContracts/referral-contract/src/lib.rs index ce6a752..038c678 100644 --- a/StarShopContracts/referral-contract/src/lib.rs +++ b/StarShopContracts/referral-contract/src/lib.rs @@ -3,27 +3,17 @@ use soroban_sdk::{contract, contractimpl, Address, Env, String, Vec}; mod admin; mod helpers; -mod interface; mod level; -mod metrics; mod referral; mod rewards; mod types; mod verification; -use admin::AdminModule; -use interface::{ - AdminOperations, MetricsOperations, ReferralOperations, RewardOperations, - VerificationOperations, -}; -use metrics::MetricsModule; -use referral::ReferralModule; -use rewards::RewardModule; -use types::{ - Error, LevelCriteria, LevelRequirements, Milestone, RewardRates, UserData, UserLevel, - VerificationStatus, -}; -use verification::VerificationModule; +use admin::*; +use referral::*; +use rewards::*; +use types::*; +use verification::*; #[contract] pub struct ReferralContract; @@ -279,19 +269,19 @@ impl ReferralContract { /// Gets the total number of users in the system pub fn get_total_users(env: Env) -> Result { - MetricsModule::get_total_users(env) + ReferralModule::get_total_users(env) } /// Gets the total amount of rewards distributed pub fn get_total_distributed_rewards(env: Env) -> Result { - MetricsModule::get_total_distributed_rewards(env) + RewardModule::get_total_distributed_rewards(env) } /// Gets various system metrics as key-value pairs /// total_users, total_rewards, average_reward_per_user /// pub fn get_system_metrics(env: Env) -> Result, Error> { - MetricsModule::get_system_metrics(env) + ReferralModule::get_system_metrics(env) } /// Gets the referral conversion rate for a user. verified users/registered users @@ -299,7 +289,7 @@ impl ReferralContract { /// # Arguments /// * `user` - The address of the user pub fn get_referral_conversion_rate(env: Env, user: Address) -> Result { - MetricsModule::get_referral_conversion_rate(env, user) + ReferralModule::get_referral_conversion_rate(env, user) } /// Gets the level of a user diff --git a/StarShopContracts/referral-contract/src/metrics.rs b/StarShopContracts/referral-contract/src/metrics.rs deleted file mode 100644 index 516e5c8..0000000 --- a/StarShopContracts/referral-contract/src/metrics.rs +++ /dev/null @@ -1,98 +0,0 @@ -use crate::helpers::get_user_data; -use crate::interface::MetricsOperations; -use crate::types::{DataKey, Error}; -use soroban_sdk::{Address, Env, String, Vec}; - -pub struct MetricsModule; - -impl MetricsOperations for MetricsModule { - fn get_total_users(env: Env) -> Result { - Ok(env - .storage() - .instance() - .get::<_, u32>(&DataKey::TotalUsers) - .unwrap_or_default()) - } - - fn get_total_distributed_rewards(env: Env) -> Result { - Ok(env - .storage() - .instance() - .get::<_, i128>(&DataKey::TotalDistributedRewards) - .unwrap_or(0)) - } - - fn get_system_metrics(env: Env) -> Result, Error> { - let mut metrics = Vec::new(&env); - - // Total users - let total_users = Self::get_total_users(env.clone())? as i128; - metrics.push_back((String::from_str(&env, "total_users"), total_users)); - - // Total rewards - let total_rewards = Self::get_total_distributed_rewards(env.clone())?; - metrics.push_back(( - String::from_str(&env, "total_distributed_rewards"), - total_rewards, - )); - - // Average reward per user - let avg_reward = if total_users > 0 { - total_rewards / total_users - } else { - 0 - }; - metrics.push_back(( - String::from_str(&env, "average_reward_per_user"), - avg_reward, - )); - - Ok(metrics) - } - - fn get_referral_conversion_rate(env: Env, user: Address) -> Result { - let user_data = 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) { - verified_referrals += 1; - } - } - - // Calculate conversion rate as percentage (0-100) - Ok((verified_referrals * 100) / user_data.direct_referrals.len() as u32) - } -} - -// Helper functions -impl MetricsModule { - pub fn increment_total_users(env: &Env) { - let current = env - .storage() - .instance() - .get::<_, u32>(&DataKey::TotalUsers) - .unwrap_or_default(); - - env.storage() - .instance() - .set(&DataKey::TotalUsers, &(current + 1)); - } - - pub fn add_distributed_rewards(env: &Env, amount: i128) { - let current = env - .storage() - .instance() - .get::<_, i128>(&DataKey::TotalDistributedRewards) - .unwrap_or_default(); - - env.storage() - .instance() - .set(&DataKey::TotalDistributedRewards, &(current + amount)); - } -} diff --git a/StarShopContracts/referral-contract/src/referral.rs b/StarShopContracts/referral-contract/src/referral.rs index 7680060..aae1f3b 100644 --- a/StarShopContracts/referral-contract/src/referral.rs +++ b/StarShopContracts/referral-contract/src/referral.rs @@ -1,13 +1,53 @@ use crate::helpers::{ensure_contract_active, ensure_user_verified, get_user_data, user_exists}; -use crate::interface::ReferralOperations; use crate::level::LevelManagementModule; -use crate::metrics::MetricsModule; +use crate::rewards::RewardModule; +use crate::rewards::RewardOperations; use crate::types::{DataKey, Error, UserData, UserLevel, VerificationStatus}; use crate::verification::VerificationModule; use soroban_sdk::{Address, Env, String, Vec}; pub struct ReferralModule; +pub trait ReferralOperations { + /// Initialize contract + fn initialize(env: &Env, admin: &Address) -> Result<(), Error>; + + /// Register new user with referral + fn register_with_referral( + env: Env, + user: Address, + referrer_address: Address, + identity_proof: String, + ) -> Result<(), Error>; + + /// Check if user is verified + fn is_user_verified(env: Env, user: Address) -> Result; + + /// Check if user is registered + fn is_user_registered(env: Env, user: Address) -> Result; + + /// Get user's information + fn get_user_info(env: Env, user: Address) -> Result; + + /// Get user's direct referrals + fn get_direct_referrals(env: Env, user: Address) -> Result, Error>; + + /// Get user's team size (all levels) + fn get_team_size(env: Env, user: Address) -> Result; + + /// Get user's level + fn get_user_level(env: Env, user: Address) -> Result; + + /// Get total registered users + fn get_total_users(env: Env) -> Result; + + /// Get system statistics + fn get_system_metrics(env: Env) -> Result, Error>; + + /// Get user conversion rates + fn get_referral_conversion_rate(env: Env, user: Address) -> Result; +} + impl ReferralOperations for ReferralModule { fn initialize(env: &Env, admin: &Address) -> Result<(), Error> { admin.require_auth(); @@ -32,7 +72,7 @@ impl ReferralOperations for ReferralModule { .set(&DataKey::User(admin.clone()), &user_data); // Increment total users - MetricsModule::increment_total_users(&env); + ReferralModule::increment_total_users(&env); Ok(()) } @@ -86,7 +126,7 @@ impl ReferralOperations for ReferralModule { VerificationModule::add_to_pending_verifications(&env, &user); // Increment total users - MetricsModule::increment_total_users(&env); + ReferralModule::increment_total_users(&env); Ok(()) } @@ -118,6 +158,60 @@ impl ReferralOperations for ReferralModule { let user_data = get_user_data(&env, &user)?; Ok(user_data.level) } + + fn get_total_users(env: Env) -> Result { + Ok(env + .storage() + .instance() + .get::<_, u32>(&DataKey::TotalUsers) + .unwrap_or_default()) + } + fn get_system_metrics(env: Env) -> Result, Error> { + let mut metrics = Vec::new(&env); + + // Total users + let total_users = Self::get_total_users(env.clone())? as i128; + metrics.push_back((String::from_str(&env, "total_users"), total_users)); + + // Total rewards + let total_rewards = RewardModule::get_total_distributed_rewards(env.clone())?; + metrics.push_back(( + String::from_str(&env, "total_distributed_rewards"), + total_rewards, + )); + + // Average reward per user + let avg_reward = if total_users > 0 { + total_rewards / total_users + } else { + 0 + }; + metrics.push_back(( + String::from_str(&env, "average_reward_per_user"), + avg_reward, + )); + + Ok(metrics) + } + + fn get_referral_conversion_rate(env: Env, user: Address) -> Result { + let user_data = 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) { + verified_referrals += 1; + } + } + + // Calculate conversion rate as percentage (0-100) + Ok((verified_referrals * 100) / user_data.direct_referrals.len() as u32) + } } // Helper functions @@ -171,4 +265,16 @@ impl ReferralModule { Ok(()) } + + pub fn increment_total_users(env: &Env) { + let current = env + .storage() + .instance() + .get::<_, u32>(&DataKey::TotalUsers) + .unwrap_or_default(); + + env.storage() + .instance() + .set(&DataKey::TotalUsers, &(current + 1)); + } } diff --git a/StarShopContracts/referral-contract/src/rewards.rs b/StarShopContracts/referral-contract/src/rewards.rs index c49284b..7b2d41e 100644 --- a/StarShopContracts/referral-contract/src/rewards.rs +++ b/StarShopContracts/referral-contract/src/rewards.rs @@ -1,12 +1,29 @@ use crate::helpers::{ensure_contract_active, ensure_user_verified, get_user_data, verify_admin}; -use crate::interface::RewardOperations; use crate::level::LevelManagementModule; -use crate::metrics::MetricsModule; 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 + fn distribute_rewards(env: Env, user: Address, amount: i128) -> Result<(), Error>; + + /// Claim accumulated rewards + fn claim_rewards(env: Env, user: Address) -> Result; + + /// Get pending rewards balance + fn get_pending_rewards(env: Env, user: Address) -> Result; + + /// Get total rewards earned + fn get_total_rewards(env: Env, user: Address) -> Result; + + /// Check if milestone achieved and distribute rewards + fn check_and_reward_milestone(env: Env, user: Address) -> Result<(), Error>; + + /// Get total distributed rewards + fn get_total_distributed_rewards(env: Env) -> Result; +} impl RewardOperations for RewardModule { fn distribute_rewards(env: Env, user: Address, amount: i128) -> Result<(), Error> { @@ -84,7 +101,7 @@ impl RewardOperations for RewardModule { } // Update total distributed rewards - MetricsModule::add_distributed_rewards(&env, total_distributed); + RewardModule::add_distributed_rewards(&env, total_distributed); Ok(()) } @@ -181,7 +198,7 @@ impl RewardOperations for RewardModule { .set(&DataKey::User(user.clone()), &updated_user); // Update total distributed rewards - MetricsModule::add_distributed_rewards(&env, milestone.reward_amount); + RewardModule::add_distributed_rewards(&env, milestone.reward_amount); // Mark milestone as achieved for this user let mut updated_achieved = env @@ -205,6 +222,14 @@ impl RewardOperations for RewardModule { Ok(()) } + + fn get_total_distributed_rewards(env: Env) -> Result { + Ok(env + .storage() + .instance() + .get::<_, i128>(&DataKey::TotalDistributedRewards) + .unwrap_or(0)) + } } // Helper functions @@ -215,4 +240,16 @@ impl RewardModule { .get::<_, Vec>(&DataKey::UserAchievedMilestones(user.clone())) .map_or(false, |achieved| achieved.contains(&milestone_id)) } + + pub fn add_distributed_rewards(env: &Env, amount: i128) { + let current = env + .storage() + .instance() + .get::<_, i128>(&DataKey::TotalDistributedRewards) + .unwrap_or_default(); + + env.storage() + .instance() + .set(&DataKey::TotalDistributedRewards, &(current + amount)); + } } diff --git a/StarShopContracts/referral-contract/src/verification.rs b/StarShopContracts/referral-contract/src/verification.rs index 5d44251..897bbf7 100644 --- a/StarShopContracts/referral-contract/src/verification.rs +++ b/StarShopContracts/referral-contract/src/verification.rs @@ -1,10 +1,26 @@ use crate::helpers::{ensure_contract_active, get_user_data, verify_admin}; -use crate::interface::VerificationOperations; use crate::types::{DataKey, Error, UserData, VerificationStatus}; use soroban_sdk::{Address, Env, String, Vec}; pub struct VerificationModule; +pub trait VerificationOperations { + /// Submit verification documents for review + fn submit_verification(env: Env, user: Address, identity_proof: String) -> Result<(), Error>; + + /// Admin approval of user verification + fn approve_verification(env: Env, user: Address) -> Result<(), Error>; + + /// Admin rejection of user verification with reason + fn reject_verification(env: Env, user: Address, reason: String) -> Result<(), Error>; + + /// Get user's verification status + fn get_verification_status(env: Env, user: Address) -> Result; + + /// Get list of pending verifications + fn get_pending_verifications(env: Env) -> Result, Error>; +} + impl VerificationOperations for VerificationModule { fn submit_verification(env: Env, user: Address, identity_proof: String) -> Result<(), Error> { ensure_contract_active(&env)?; diff --git a/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_registration_verification_flow.1.json b/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_registration_verification_flow.1.json deleted file mode 100644 index 27e3729..0000000 --- a/StarShopContracts/referral-contract/test_snapshots/test/test_verification/test_registration_verification_flow.1.json +++ /dev/null @@ -1,721 +0,0 @@ -{ - "generators": { - "address": 4, - "nonce": 0 - }, - "auth": [ - [ - [ - "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", - { - "function": { - "contract_fn": { - "contract_address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", - "function_name": "set_admin", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "function_name": "initialize", - "args": [ - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - }, - { - "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [ - [ - "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - { - "function": { - "contract_fn": { - "contract_address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "function_name": "set_reward_rates", - "args": [ - { - "map": [ - { - "key": { - "symbol": "level1" - }, - "val": { - "u32": 500 - } - }, - { - "key": { - "symbol": "level2" - }, - "val": { - "u32": 200 - } - }, - { - "key": { - "symbol": "level3" - }, - "val": { - "u32": 100 - } - }, - { - "key": { - "symbol": "max_reward_per_referral" - }, - "val": { - "i128": { - "hi": 0, - "lo": 1000000 - } - } - } - ] - } - ] - } - }, - "sub_invocations": [] - } - ] - ], - [] - ], - "ledger": { - "protocol_version": 22, - "sequence_number": 0, - "timestamp": 0, - "network_id": "0000000000000000000000000000000000000000000000000000000000000000", - "base_reserve": 0, - "min_persistent_entry_ttl": 4096, - "min_temp_entry_ttl": 16, - "max_entry_ttl": 6312000, - "ledger_entries": [ - [ - { - "account": { - "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "account": { - "account_id": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", - "balance": 0, - "seq_num": 0, - "num_sub_entries": 0, - "inflation_dest": null, - "flags": 0, - "home_domain": "", - "thresholds": "01010101", - "signers": [], - "ext": "v0" - } - }, - "ext": "v0" - }, - null - ] - ], - [ - { - "contract_data": { - "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", - "key": { - "ledger_key_nonce": { - "nonce": 801925984706572462 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF", - "key": { - "ledger_key_nonce": { - "nonce": 801925984706572462 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 1033654523790656264 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 5541220902715666415 - } - }, - "durability": "temporary" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM", - "key": { - "ledger_key_nonce": { - "nonce": 5541220902715666415 - } - }, - "durability": "temporary", - "val": "void" - } - }, - "ext": "v0" - }, - 6311999 - ] - ], - [ - { - "contract_data": { - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "key": "ledger_key_contract_instance", - "durability": "persistent" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHK3M", - "key": "ledger_key_contract_instance", - "durability": "persistent", - "val": { - "contract_instance": { - "executable": { - "wasm": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - }, - "storage": [ - { - "key": { - "vec": [ - { - "symbol": "Admin" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, - { - "key": { - "vec": [ - { - "symbol": "ContractPaused" - } - ] - }, - "val": { - "bool": false - } - }, - { - "key": { - "vec": [ - { - "symbol": "LevelRequirements" - } - ] - }, - "val": { - "map": [ - { - "key": { - "symbol": "gold" - }, - "val": { - "map": [ - { - "key": { - "symbol": "required_direct_referrals" - }, - "val": { - "u32": 10 - } - }, - { - "key": { - "symbol": "required_team_size" - }, - "val": { - "u32": 50 - } - }, - { - "key": { - "symbol": "required_total_rewards" - }, - "val": { - "i128": { - "hi": 0, - "lo": 5000 - } - } - } - ] - } - }, - { - "key": { - "symbol": "platinum" - }, - "val": { - "map": [ - { - "key": { - "symbol": "required_direct_referrals" - }, - "val": { - "u32": 20 - } - }, - { - "key": { - "symbol": "required_team_size" - }, - "val": { - "u32": 100 - } - }, - { - "key": { - "symbol": "required_total_rewards" - }, - "val": { - "i128": { - "hi": 0, - "lo": 20000 - } - } - } - ] - } - }, - { - "key": { - "symbol": "silver" - }, - "val": { - "map": [ - { - "key": { - "symbol": "required_direct_referrals" - }, - "val": { - "u32": 5 - } - }, - { - "key": { - "symbol": "required_team_size" - }, - "val": { - "u32": 15 - } - }, - { - "key": { - "symbol": "required_total_rewards" - }, - "val": { - "i128": { - "hi": 0, - "lo": 1000 - } - } - } - ] - } - } - ] - } - }, - { - "key": { - "vec": [ - { - "symbol": "RewardRates" - } - ] - }, - "val": { - "map": [ - { - "key": { - "symbol": "level1" - }, - "val": { - "u32": 500 - } - }, - { - "key": { - "symbol": "level2" - }, - "val": { - "u32": 200 - } - }, - { - "key": { - "symbol": "level3" - }, - "val": { - "u32": 100 - } - }, - { - "key": { - "symbol": "max_reward_per_referral" - }, - "val": { - "i128": { - "hi": 0, - "lo": 1000000 - } - } - } - ] - } - }, - { - "key": { - "vec": [ - { - "symbol": "RewardToken" - } - ] - }, - "val": { - "address": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL" - } - }, - { - "key": { - "vec": [ - { - "symbol": "User" - }, - { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - ] - }, - "val": { - "map": [ - { - "key": { - "symbol": "address" - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, - { - "key": { - "symbol": "direct_referrals" - }, - "val": { - "vec": [] - } - }, - { - "key": { - "symbol": "identity_proof" - }, - "val": { - "string": "" - } - }, - { - "key": { - "symbol": "join_date" - }, - "val": { - "u64": 0 - } - }, - { - "key": { - "symbol": "level" - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "symbol": "pending_rewards" - }, - "val": { - "i128": { - "hi": 0, - "lo": 0 - } - } - }, - { - "key": { - "symbol": "referrer" - }, - "val": "void" - }, - { - "key": { - "symbol": "team_size" - }, - "val": { - "u32": 0 - } - }, - { - "key": { - "symbol": "total_rewards" - }, - "val": { - "i128": { - "hi": 0, - "lo": 0 - } - } - }, - { - "key": { - "symbol": "verification_status" - }, - "val": { - "vec": [ - { - "symbol": "Verified" - } - ] - } - } - ] - } - } - ] - } - } - } - }, - "ext": "v0" - }, - 4095 - ] - ], - [ - { - "contract_data": { - "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", - "key": "ledger_key_contract_instance", - "durability": "persistent" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_data": { - "ext": "v0", - "contract": "CBEPDNVYXQGWB5YUBXKJWYJA7OXTZW5LFLNO5JRRGE6Z6C5OSUZPCCEL", - "key": "ledger_key_contract_instance", - "durability": "persistent", - "val": { - "contract_instance": { - "executable": "stellar_asset", - "storage": [ - { - "key": { - "symbol": "METADATA" - }, - "val": { - "map": [ - { - "key": { - "symbol": "decimal" - }, - "val": { - "u32": 7 - } - }, - { - "key": { - "symbol": "name" - }, - "val": { - "string": "aaa:GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGWF" - } - }, - { - "key": { - "symbol": "symbol" - }, - "val": { - "string": "aaa" - } - } - ] - } - }, - { - "key": { - "vec": [ - { - "symbol": "Admin" - } - ] - }, - "val": { - "address": "CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2KM" - } - }, - { - "key": { - "vec": [ - { - "symbol": "AssetInfo" - } - ] - }, - "val": { - "vec": [ - { - "symbol": "AlphaNum4" - }, - { - "map": [ - { - "key": { - "symbol": "asset_code" - }, - "val": { - "string": "aaa\\0" - } - }, - { - "key": { - "symbol": "issuer" - }, - "val": { - "bytes": "0000000000000000000000000000000000000000000000000000000000000002" - } - } - ] - } - ] - } - } - ] - } - } - } - }, - "ext": "v0" - }, - 120960 - ] - ], - [ - { - "contract_code": { - "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - } - }, - [ - { - "last_modified_ledger_seq": 0, - "data": { - "contract_code": { - "ext": "v0", - "hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "code": "" - } - }, - "ext": "v0" - }, - 4095 - ] - ] - ] - }, - "events": [] -} \ No newline at end of file From b24d98d75b18bde54066d8785f71a274831edca8 Mon Sep 17 00:00:00 2001 From: Ikem Peter Date: Thu, 27 Feb 2025 05:47:52 +0100 Subject: [PATCH 8/8] restructured code --- .../referral-contract/src/admin.rs | 37 ++++++++---- .../referral-contract/src/helpers.rs | 42 -------------- .../referral-contract/src/lib.rs | 13 ++--- .../referral-contract/src/referral.rs | 56 +++++++++++++------ .../referral-contract/src/rewards.rs | 30 +++++----- .../referral-contract/src/verification.rs | 19 ++++--- 6 files changed, 96 insertions(+), 101 deletions(-) delete mode 100644 StarShopContracts/referral-contract/src/helpers.rs 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()