Skip to Content
Native FeaturesReferral System

Native Referral System

TOS provides a protocol-level referral system that tracks relationships between users, enabling efficient multi-level marketing, affiliate programs, and reward distributions.

Implementation Status

FeatureStatus
BindReferrer transactionImplemented
ReferralProvider storageImplemented
RPC query endpoints (7)Implemented
TAKO Syscalls (7 read-only)Implemented
BatchReferralReward transactionImplemented
TeamVolume Syscalls (4)Implemented

Why Native?

ApproachBind CostQuery 10 Uplines10-Level Distribution
Smart Contract (TRON)$0.50$0.10$1.00
Smart Contract (BSC)$0.30$0.10$0.50
TOS Native$0.01$0.001$0.025

20-50x cheaper than contract-based implementations.

Binding a Referrer

Users bind their referrer once via transaction:

# CLI tos_wallet bind_referrer --referrer <address>
// JavaScript SDK const tx = await tos.sendTransaction({ type: 'BindReferrer', payload: { referrer: referrerAddress } });

This creates an immutable on-chain relationship that cannot be changed.

Querying Relationships

RPC Endpoints

EndpointDescription
POST /get_referrerGet user’s direct referrer
POST /has_referrerCheck if user has bound referrer
POST /get_uplinesGet N levels of uplines
POST /get_direct_referralsGet direct referrals (paginated)
POST /get_team_sizeGet total team size
POST /get_referral_recordGet complete referral record
POST /is_downlineCheck if user is in downline

Smart Contract Syscalls

SyscallCostDescription
tos_has_referrer500 CUCheck if user has referrer
tos_get_referrer500 CUGet direct referrer
tos_get_uplines500 + 200×N CUGet N levels (max 20)
tos_get_direct_referrals_count500 CUGet direct count
tos_get_team_size500 CUGet team size (cached)
tos_get_referral_level500 CUGet user’s tree depth
tos_is_downline500 + 100×depth CUCheck downline relationship

Team Volume Syscalls

SyscallCostDescription
tos_add_team_volume1000 + 500×N CUAdd volume to uplines (write)
tos_get_team_volume500 CUGet total team volume
tos_get_direct_volume500 CUGet direct volume
tos_get_zone_volumes500 + 100×N CUGet zone volumes

Contract Examples

Three-Level Distribution

use tako_sdk::*; #[no_mangle] pub extern "C" fn distribute_rewards() { let buyer = get_tx_sender(); let amount = get_call_value(); // Get 3 levels of uplines let (uplines, count) = match get_uplines(&buyer, 3) { Ok(result) => result, Err(_) => return, // No referrer }; // 10%, 5%, 3% distribution let rates = [1000u64, 500, 300]; for i in 0..(count as usize).min(3) { let reward = amount * rates[i] / 10000; if reward > 0 { let _ = transfer(&uplines[i], reward); } } }

Dynamic Tier Rewards

use tako_sdk::*; fn on_purchase() { let buyer = get_tx_sender(); let amount = get_call_value(); let asset = get_contract_hash(); // Record volume to 10 levels add_team_volume(&buyer, &asset, amount, 10).ok(); // Get uplines let (uplines, count) = get_uplines(&buyer, 3).unwrap_or_default(); for i in 0..(count as usize).min(3) { let upline = &uplines[i]; // Dynamic rate based on volume tier let team_vol = get_team_volume(upline, &asset).unwrap_or(0); let rate = if team_vol >= 1_000_000 { 1500 // 15% Diamond } else if team_vol >= 100_000 { 1000 // 10% Gold } else { 500 // 5% Basic }; let reward = amount * rate / 10000; if reward > 0 { let _ = transfer(upline, reward); } } }

Data Structure

pub struct ReferralRecord { /// User address pub user: Address, /// Referrer address (None = top-level) pub referrer: Option<Address>, /// Binding timestamp pub bound_at: u64, /// Binding block height pub bound_block: u64, /// Binding transaction hash pub bound_tx: Hash, /// Direct referrals count (cached) pub direct_referrals_count: u32, /// Total team size (cached) pub team_size: u64, }

Compliance Notes

TOS provides neutral infrastructure; DApps implement business rules:

RegionRecommended DepthNotes
China1 levelMulti-level prohibited
USA3-10 levelsFocus on product sales
EU3-10 levelsPyramid schemes prohibited
Southeast AsiaUp to 20 levelsRegistration required

Key Principles:

  • Rewards should be based on product sales, not recruitment
  • Clear disclosure of commission structure
  • Consult legal counsel for specific jurisdictions

Frontend Integration

// Get referrer const referrer = await fetch('/get_referrer', { method: 'POST', body: JSON.stringify({ address: userAddress }) }).then(r => r.json()); // Get uplines const uplines = await fetch('/get_uplines', { method: 'POST', body: JSON.stringify({ address: userAddress, levels: 3 }) }).then(r => r.json()); // Get team size const teamSize = await fetch('/get_team_size', { method: 'POST', body: JSON.stringify({ address: userAddress }) }).then(r => r.json());

See Also

Last updated on