# Mining Service .NET > Mining Point management service with Pi Network-inspired mechanism for GoodGo Platform. ## Overview The Mining Service provides a **gamified loyalty point mining system** inspired by Pi Network, allowing users to accumulate Mining Points (MP) through daily engagement, social referrals, and community building activities. ### Key Features | Feature | Description | |---------|-------------| | **Daily Mining** | Tap-to-mine mechanism - users activate daily mining sessions | | **Mining Rate** | Base rate increases through referrals and circle building | | **๐Ÿ”ฅ Streak Bonus** | TikTok-style consecutive daily mining rewards | | **Security Circles** | Trusted groups that boost mining rate and network security | | **Referral System** | Multi-level referral bonuses for network growth | | **User Roles** | Pioneer, Contributor, Ambassador, Node Operator tiers | | **Point Conversion** | Convert Mining Points to platform loyalty points | --- ## Architecture Design ### System Architecture ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ API Gateway (Traefik) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Mining Service .NET โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Mining โ”‚ โ”‚ Circle โ”‚ โ”‚ Referral โ”‚ โ”‚ Rate โ”‚ โ”‚ โ”‚ โ”‚ Session โ”‚ โ”‚ Manager โ”‚ โ”‚ Tracker โ”‚ โ”‚ Calculator โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Domain Layer โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ MinerAggregate โ”‚ โ”‚ CircleAggregate โ”‚ โ”‚ โ”‚ โ”‚ - MiningSession โ”‚ โ”‚ - CircleMember โ”‚ โ”‚ โ”‚ โ”‚ - MiningHistory โ”‚ โ”‚ - TrustLevel โ”‚ โ”‚ โ”‚ โ”‚ - MiningRate โ”‚ โ”‚ - CircleBonus โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Infrastructure Layer โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ PostgreSQL โ”‚ โ”‚ Redis โ”‚ โ”‚ RabbitMQ โ”‚ โ”‚ โ”‚ โ”‚ (EF Core) โ”‚ โ”‚ (Cache) โ”‚ โ”‚ (Events) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ–ผ โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ IAM Service โ”‚ โ”‚ Wallet Service โ”‚ โ”‚ Social Service โ”‚ โ”‚ (Auth/Users) โ”‚ โ”‚ (Point Convert) โ”‚ โ”‚ (Friends) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### Clean Architecture Structure ``` mining-service-net/ โ”œโ”€โ”€ src/ โ”‚ โ”œโ”€โ”€ MiningService.API/ # API Layer โ”‚ โ”‚ โ”œโ”€โ”€ Controllers/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ MiningController.cs # Mining session APIs โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ CirclesController.cs # Security circle APIs โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ ReferralsController.cs # Referral APIs โ”‚ โ”‚ โ””โ”€โ”€ Application/ โ”‚ โ”‚ โ”œโ”€โ”€ Commands/ # Write operations โ”‚ โ”‚ โ””โ”€โ”€ Queries/ # Read operations โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ MiningService.Domain/ # Domain Layer โ”‚ โ”‚ โ”œโ”€โ”€ AggregatesModel/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ MinerAggregate/ # User mining profile โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ CircleAggregate/ # Security circles โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ ReferralAggregate/ # Referral tracking โ”‚ โ”‚ โ”œโ”€โ”€ Events/ # Domain events โ”‚ โ”‚ โ”œโ”€โ”€ Exceptions/ # Domain exceptions โ”‚ โ”‚ โ””โ”€โ”€ Services/ # Domain services โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ MiningService.Infrastructure/ # Infrastructure Layer โ”‚ โ”œโ”€โ”€ EntityConfigurations/ # EF Core mappings โ”‚ โ”œโ”€โ”€ Repositories/ # Data access โ”‚ โ””โ”€โ”€ MiningServiceContext.cs # DbContext โ”‚ โ”œโ”€โ”€ tests/ โ”‚ โ”œโ”€โ”€ MiningService.UnitTests/ โ”‚ โ””โ”€โ”€ MiningService.FunctionalTests/ โ”‚ โ”œโ”€โ”€ docs/ โ”‚ โ”œโ”€โ”€ en/ โ”‚ โ””โ”€โ”€ vi/ โ”‚ โ””โ”€โ”€ Dockerfile ``` --- ## Domain Model ### Core Aggregates #### 1. Miner Aggregate (User Mining Profile) ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Miner (Entity) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Properties: โ”‚ โ”‚ - Id: Guid โ”‚ โ”‚ - UserId: Guid (from IAM Service) โ”‚ โ”‚ - Role: MinerRole (Pioneer/Contributor/Ambassador/NodeOperator) โ”‚ โ”‚ - TotalMinedPoints: decimal โ”‚ โ”‚ - CurrentMiningRate: MiningRate (Value Object) โ”‚ โ”‚ - CurrentSession: MiningSession? โ”‚ โ”‚ - SecurityCircle: Circle? โ”‚ โ”‚ - ReferralCode: string โ”‚ โ”‚ - ReferredBy: Guid? โ”‚ โ”‚ - Status: MinerStatus (Active/Suspended/Banned) โ”‚ โ”‚ - CreatedAt: DateTime โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Behaviors: โ”‚ โ”‚ - StartMiningSession() โ†’ MiningSession โ”‚ โ”‚ - ClaimMiningReward() โ†’ MiningPoints โ”‚ โ”‚ - UpgradeRole(role) โ†’ void โ”‚ โ”‚ - JoinCircle(circle) โ†’ void โ”‚ โ”‚ - RecalculateMiningRate() โ†’ MiningRate โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` #### 2. Circle Aggregate (Security Circle) ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Circle (Entity) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Properties: โ”‚ โ”‚ - Id: Guid โ”‚ โ”‚ - OwnerId: Guid (Miner who created the circle) โ”‚ โ”‚ - Members: List (max 5) โ”‚ โ”‚ - Name: string โ”‚ โ”‚ - TrustScore: decimal (0-100) โ”‚ โ”‚ - BonusMultiplier: decimal โ”‚ โ”‚ - Status: CircleStatus (Active/Incomplete/Disbanded) โ”‚ โ”‚ - CreatedAt: DateTime โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Behaviors: โ”‚ โ”‚ - AddMember(miner) โ†’ void โ”‚ โ”‚ - RemoveMember(minerId) โ†’ void โ”‚ โ”‚ - CalculateTrustScore() โ†’ decimal โ”‚ โ”‚ - CalculateBonusMultiplier() โ†’ decimal โ”‚ โ”‚ - Validate() โ†’ bool (min 3 members required) โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` #### 3. Referral Aggregate ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Referral (Entity) โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Properties: โ”‚ โ”‚ - Id: Guid โ”‚ โ”‚ - ReferrerId: Guid (who invited) โ”‚ โ”‚ - ReferredId: Guid (who was invited) โ”‚ โ”‚ - ReferralCode: string โ”‚ โ”‚ - BonusRate: decimal โ”‚ โ”‚ - IsActive: bool โ”‚ โ”‚ - Level: int (1 = direct, 2 = indirect) โ”‚ โ”‚ - CreatedAt: DateTime โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ Behaviors: โ”‚ โ”‚ - Activate() โ†’ void โ”‚ โ”‚ - Deactivate() โ†’ void โ”‚ โ”‚ - CalculateBonus(baseRate) โ†’ decimal โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### Value Objects ```csharp /// Mining Rate calculation public record MiningRate( decimal BaseRate, // Default: 0.25 MP/hour decimal CircleBonus, // +0.25x for valid circle decimal ReferralBonus, // +25% per active referral decimal RoleBonus, // Based on role tier decimal TotalRate // Combined rate ); /// Mining Session tracking public record MiningSession( Guid SessionId, DateTime StartTime, DateTime EndTime, // StartTime + 24 hours decimal AccumulatedPoints, MiningSessionStatus Status // Active/Completed/Expired ); /// Mining Points public record MiningPoints( decimal Amount, DateTime EarnedAt, string Source // Mining/Referral/CircleBonus/RoleBonus ); ``` --- ## Mining Mechanism ### ๐Ÿ”ฅ Streak Bonus System (TikTok-style) Consecutive daily mining rewards users with escalating bonuses: ```mermaid %%{init: {'theme':'dark'}}%% flowchart LR subgraph Streak["๐Ÿ”ฅ Streak Tiers"] D1["Day 1-2
+0%"] --> D3["Day 3-6
+10%"] D3 --> D7["Day 7-13
+25%"] D7 --> D14["Day 14-29
+50%"] D14 --> D30["Day 30+
+100%"] end style D1 fill:#7F8C8D,color:#ECF0F1,stroke:#5D6D7E,stroke-width:2px style D3 fill:#3498DB,color:#ECF0F1,stroke:#2980B9,stroke-width:2px style D7 fill:#8E44AD,color:#ECF0F1,stroke:#7D3C98,stroke-width:2px style D14 fill:#E67E22,color:#ECF0F1,stroke:#D35400,stroke-width:2px style D30 fill:#C0392B,color:#ECF0F1,stroke:#A93226,stroke-width:3px ``` #### Streak Mechanics | Streak Days | Bonus | Milestone Reward | |-------------|-------|------------------| | Day 1-2 | +0% | - | | Day 3-6 | +10% | ๐ŸŽ 3-day badge | | Day 7-13 | +25% | ๐ŸŽ 7-day badge + 50 MP bonus | | Day 14-29 | +50% | ๐ŸŽ 14-day badge + 100 MP bonus | | Day 30-59 | +100% | ๐Ÿ”ฅ 30-day badge + 300 MP bonus | | Day 60-89 | +125% | ๐Ÿ† 60-day badge + 500 MP bonus | | Day 90+ | +150% | ๐Ÿ‘‘ 90-day badge + 1000 MP bonus | #### Streak Protection Rules - **Grace Period**: Miss 1 day โ†’ streak pauses (not reset) - **Streak Freeze**: Use 1 Freeze Token to protect streak (earn 1 token per 7-day streak) - **Streak Recovery**: Within 24h of missing โ†’ pay 50 MP to restore streak - **Maximum Streak**: Unlimited (displayed on leaderboard) #### Streak Value Object ```csharp /// Streak tracking for consecutive mining public record MiningStreak( int CurrentStreak, // Current consecutive days int LongestStreak, // Personal best DateTime LastMiningDate, // Last successful claim int FreezeTokens, // Available streak protections bool IsGracePeriod, // Currently in grace period decimal BonusMultiplier // Current streak bonus ); ``` --- ### Mining Rate Formula ``` Total Mining Rate = Base Rate ร— (1 + Role) ร— (1 + Circle) ร— (1 + Referral) ร— (1 + Streak) Where: - Base Rate: 0.25 MP/hour (configurable) - Role Multiplier: Pioneer=0%, Contributor=10%, Ambassador=25%, Node=50% - Circle Bonus: 25% if valid circle (3-5 trusted members) - Referral Bonus: 25% per active direct referral (capped at 100%) - Streak Bonus: 0-150% based on consecutive daily mining ``` **Example with Streak:** | Component | Value | Multiplier | |-----------|-------|------------| | Base Rate | 0.25 MP/hour | - | | Role (Ambassador) | +25% | ร— 1.25 | | Valid Circle | +25% | ร— 1.25 | | 2 Referrals | +50% | ร— 1.50 | | 30-Day Streak | +100% | ร— 2.00 | | **Total** | **1.17 MP/hour** | **28.12 MP/day** | ### Mining Session Flow ```mermaid %%{init: {'theme':'dark'}}%% sequenceDiagram participant U as ๐Ÿ“ฑ User participant A as ๐ŸŒ Mining API participant M as โš™๏ธ MinerAggregate participant R as ๐Ÿงฎ RateCalculator participant DB as ๐Ÿ’พ PostgreSQL participant C as โšก Redis Cache U->>A: POST /api/v1/mining/start A->>M: StartMiningSession() M->>R: CalculateMiningRate() R-->>M: MiningRate M->>M: CreateSession(24h duration) M->>DB: SaveSession() M->>C: CacheSessionInfo() A-->>U: 200 OK { session_id, rate, end_time } Note over U: 24 hours later... U->>A: POST /api/v1/mining/claim A->>M: ClaimMiningReward() M->>M: CalculateEarnedPoints() M->>M: AddToTotalPoints() M->>DB: SaveMiningHistory() A-->>U: 200 OK { earned_points, total_points } ``` ### User Roles & Benefits | Role | Requirements | Mining Bonus | Benefits | |------|--------------|--------------|----------| | **Pioneer** | Sign up | 0% | Basic mining | | **Contributor** | Valid security circle (3+ members) | +10% | Circle bonus active | | **Ambassador** | 5+ active referrals | +25% | Referral bonus cap increased | | **Node Operator** | Run node software (future) | +50% | Network rewards | --- ## API Endpoints ### Mining APIs | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/api/v1/mining/me` | Get current mining status | | `POST` | `/api/v1/mining/start` | Start 24-hour mining session | | `POST` | `/api/v1/mining/claim` | Claim mining rewards | | `GET` | `/api/v1/mining/history` | Get mining history | | `GET` | `/api/v1/mining/rate` | Get current mining rate breakdown | | `GET` | `/api/v1/mining/leaderboard` | Get top miners leaderboard | ### Security Circle APIs | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/api/v1/circles/me` | Get my security circle | | `POST` | `/api/v1/circles` | Create security circle | | `POST` | `/api/v1/circles/invite` | Invite member to circle | | `POST` | `/api/v1/circles/accept/{inviteId}` | Accept circle invitation | | `DELETE` | `/api/v1/circles/members/{memberId}` | Remove circle member | | `GET` | `/api/v1/circles/trust-score` | Get circle trust score | ### Referral APIs | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/api/v1/referrals/code` | Get my referral code | | `GET` | `/api/v1/referrals` | List my referrals | | `GET` | `/api/v1/referrals/stats` | Get referral statistics | | `POST` | `/api/v1/referrals/apply` | Apply referral code (during signup) | ### Admin Backoffice APIs #### ๐Ÿ”ง Configuration Management | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/api/v1/admin/config` | Get all system configuration | | `PUT` | `/api/v1/admin/config` | Update system configuration | | `GET` | `/api/v1/admin/config/mining` | Get mining configuration | | `PUT` | `/api/v1/admin/config/mining` | Update mining rates | | `GET` | `/api/v1/admin/config/streak` | Get streak configuration | | `PUT` | `/api/v1/admin/config/streak` | Update streak bonuses | | `GET` | `/api/v1/admin/config/referral` | Get referral configuration | | `PUT` | `/api/v1/admin/config/referral` | Update referral bonuses | #### ๐Ÿ‘ฅ User Management | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/api/v1/admin/miners` | List all miners (paginated) | | `GET` | `/api/v1/admin/miners/{id}` | Get miner details | | `PUT` | `/api/v1/admin/miners/{id}/suspend` | Suspend miner | | `PUT` | `/api/v1/admin/miners/{id}/ban` | Ban miner | | `PUT` | `/api/v1/admin/miners/{id}/restore` | Restore suspended miner | | `PUT` | `/api/v1/admin/miners/{id}/adjust-points` | Adjust miner points | | `PUT` | `/api/v1/admin/miners/{id}/reset-streak` | Reset miner streak | #### ๐Ÿ“Š Analytics & Reports | Method | Endpoint | Description | |--------|----------|-------------| | `GET` | `/api/v1/admin/analytics/overview` | Dashboard overview stats | | `GET` | `/api/v1/admin/analytics/miners` | Miner statistics | | `GET` | `/api/v1/admin/analytics/circles` | Circle statistics | | `GET` | `/api/v1/admin/analytics/referrals` | Referral network stats | | `GET` | `/api/v1/admin/analytics/points` | Points statistics | | `GET` | `/api/v1/admin/analytics/streaks` | Streak distribution | | `GET` | `/api/v1/admin/audit-logs` | View configuration change logs | --- ## Admin Configuration Entity ### MiningConfiguration Aggregate ```mermaid %%{init: {'theme':'dark'}}%% classDiagram class MiningConfiguration { +Guid Id +decimal BaseRate +int SessionDurationHours +bool IsGloballyEnabled +DateTime UpdatedAt +Guid UpdatedBy } class StreakConfiguration { +Guid Id +List~StreakTier~ Tiers +bool GracePeriodEnabled +int GracePeriodHours +decimal RecoveryCost +int FreezeTokenDays } class StreakTier { +int MinDays +int MaxDays +decimal BonusPercent +string BadgeName +decimal MilestoneMpBonus } class ReferralConfiguration { +Guid Id +decimal BonusPercentPerReferral +decimal MaxBonusPercent +bool KycRequired +int MaxReferralLevels } class CircleConfiguration { +Guid Id +int MinMembers +int MaxMembers +decimal ValidCircleBonus } MiningConfiguration --> StreakConfiguration MiningConfiguration --> ReferralConfiguration MiningConfiguration --> CircleConfiguration StreakConfiguration --> "*" StreakTier ``` ### Configuration Value Objects ```csharp /// System-wide mining configuration (admin-editable) public record MiningConfig( decimal BaseRate, // Default: 0.25 MP/hour int SessionDurationHours, // Default: 24 bool IsGloballyEnabled // Emergency kill switch ); /// Streak tiers configuration (admin-editable) public record StreakConfig( List Tiers, bool GracePeriodEnabled, // Default: true int GracePeriodHours, // Default: 24 decimal RecoveryCostMp, // Default: 50 int FreezeTokenEarnDays // Default: 7 ); public record StreakTierConfig( int MinDays, int MaxDays, decimal BonusPercent, string BadgeName, decimal MilestoneMpBonus ); /// Referral configuration (admin-editable) public record ReferralConfig( decimal BonusPercentPerReferral, // Default: 25% decimal MaxBonusPercent, // Default: 100% bool KycRequired, // Default: true int MaxReferralLevels // Default: 1 ); /// Circle configuration (admin-editable) public record CircleConfig( int MinMembers, // Default: 3 int MaxMembers, // Default: 5 decimal ValidCircleBonus // Default: 25% ); ``` ### Admin Configuration Flow ```mermaid %%{init: {'theme':'dark'}}%% sequenceDiagram participant Admin as ๐Ÿ” Admin Backoffice participant API as ๐ŸŒ Mining API participant Config as โš™๏ธ ConfigService participant Cache as โšก Redis participant DB as ๐Ÿ’พ PostgreSQL participant MQ as ๐Ÿ“จ RabbitMQ Admin->>API: PUT /api/v1/admin/config/streak API->>Config: UpdateStreakConfig(newConfig) Config->>DB: SaveConfiguration() Config->>Cache: InvalidateConfigCache() Config->>MQ: Publish ConfigUpdatedEvent Config->>DB: SaveAuditLog(adminId, changes) API-->>Admin: 200 OK { updated_config } Note over Cache: All miners will use
new config on next claim ``` ### Default Configuration Values | Category | Parameter | Default | Description | |----------|-----------|---------|-------------| | **Mining** | Base Rate | 0.25 MP/hour | Points earned per hour | | **Mining** | Session Duration | 24 hours | Mining session length | | **Mining** | Global Enabled | true | Emergency kill switch | | **Streak** | Day 3-6 Bonus | 10% | Early streak bonus | | **Streak** | Day 7-13 Bonus | 25% | Week streak bonus | | **Streak** | Day 14-29 Bonus | 50% | 2-week streak bonus | | **Streak** | Day 30-59 Bonus | 100% | Month streak bonus | | **Streak** | Day 60-89 Bonus | 125% | 2-month streak bonus | | **Streak** | Day 90+ Bonus | 150% | Max streak bonus | | **Streak** | Grace Period | 24 hours | Time before streak loss | | **Streak** | Recovery Cost | 50 MP | Cost to restore streak | | **Streak** | Freeze Token Days | 7 | Days to earn freeze token | | **Referral** | Bonus Per Referral | 25% | Rate increase per referral | | **Referral** | Max Bonus | 100% | Maximum referral bonus | | **Referral** | KYC Required | true | Require KYC for bonus | | **Circle** | Min Members | 3 | Minimum for valid circle | | **Circle** | Max Members | 5 | Maximum circle size | | **Circle** | Valid Circle Bonus | 25% | Bonus for valid circle | ### Audit Logging All admin configuration changes are logged: ```csharp public record ConfigAuditLog( Guid Id, Guid AdminUserId, string ConfigType, // "Mining" | "Streak" | "Referral" | "Circle" string PreviousValue, // JSON of old config string NewValue, // JSON of new config string Reason, // Admin's reason for change DateTime CreatedAt, string IpAddress ); ``` --- ## Integration Points ### Service Dependencies ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Mining Service โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” Authenticates โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”‚ IAM Service โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - User validation โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - JWT tokens โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Mining โ”‚ Point Conversion โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ Service โ”‚โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บโ”‚ Wallet Service โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - Convert MP to LP โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - Transaction โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ Social Graph โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ โ”‚โ—„โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–บโ”‚ Social Service โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - Friend list โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ - Trust validation โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### Integration Events (RabbitMQ) | Event | Publisher | Consumer(s) | Description | |-------|-----------|-------------|-------------| | `MinerCreatedEvent` | Mining Service | IAM Service | New miner profile created | | `MiningSessionStartedEvent` | Mining Service | - | Mining session started | | `PointsMinedEvent` | Mining Service | Wallet Service | Points claimed, sync to wallet | | `CircleCompletedEvent` | Mining Service | - | Security circle became valid | | `ReferralActivatedEvent` | Mining Service | - | Referral became active | | `UserRegisteredEvent` | IAM Service | Mining Service | Create miner profile | | `FriendAddedEvent` | Social Service | Mining Service | Update circle suggestions | --- ## Tech Stack | Component | Technology | Purpose | |-----------|------------|---------| | **Framework** | .NET 10 | Latest LTS framework | | **API Layer** | Controllers + MediatR | REST endpoints with CQRS pattern | | **Database** | PostgreSQL + EF Core 10 | Persistent storage with migrations | | **Caching** | Redis + HybridCache | L1+L2 caching with stampede protection | | **Real-time** | SignalR | Live MP updates, session notifications | | **Message Queue** | RabbitMQ (MassTransit) | Integration events between services | | **Validation** | FluentValidation | Request validation pipeline | | **API Docs** | Swagger/OpenAPI | API documentation | | **Logging** | Serilog | Structured logging | | **Observability** | Prometheus + Grafana | Metrics and dashboards | --- ## Implementation Notes ### 1. HybridCache cho Mining Rate (Stampede Protection) ```mermaid %%{init: {'theme':'dark'}}%% sequenceDiagram participant R1 as ๐Ÿ“ฑ Request 1 participant R2 as ๐Ÿ“ฑ Request 2 participant R3 as ๐Ÿ“ฑ Request 3 participant HC as ๐Ÿ”„ HybridCache participant DB as ๐Ÿ’พ PostgreSQL Note over R1,R3: Stampede Protection R1->>HC: GetMiningRate(userId) R2->>HC: GetMiningRate(userId) R3->>HC: GetMiningRate(userId) HC->>DB: Single DB query DB-->>HC: MiningRate data HC-->>R1: cached result HC-->>R2: cached result HC-->>R3: cached result ``` **Lแปฃi รญch:** Ngฤƒn quรก tแบฃi DB khi hร ng nghรฌn user claim cรนng lรบc. ```csharp // Configure HybridCache in Program.cs builder.Services.AddHybridCache(options => { options.DefaultEntryOptions = new HybridCacheEntryOptions { LocalCacheExpiration = TimeSpan.FromMinutes(5), Expiration = TimeSpan.FromMinutes(30) }; }); ``` ### 2. SignalR cho Real-time Updates ```csharp // Mining Hub for real-time MP updates public class MiningHub : Hub { public async Task JoinMinerGroup(Guid minerId) { await Groups.AddToGroupAsync(Context.ConnectionId, $"miner:{minerId}"); } } // Notify user of MP update await _hubContext.Clients.Group($"miner:{minerId}") .SendAsync("PointsUpdated", new { earnedPoints, totalPoints, streakDays }); ``` **Stateful Reconnect:** Giรบp trแบฃi nghiแป‡m mฦฐแปฃt mร  khi mแบกng chแบญp chแปn. ### 3. EF Core Concurrency Handling **Quan trแปng cho cแบญp nhแบญt sแป‘ dฦฐ ฤ‘iแปƒm:** ```csharp public class Miner : Entity { public decimal TotalMinedPoints { get; private set; } // Concurrency token [Timestamp] public byte[] RowVersion { get; set; } } // Handle concurrent point additions try { miner.AddPoints(earnedPoints); await _unitOfWork.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { await _context.Entry(miner).ReloadAsync(); miner.AddPoints(earnedPoints); await _unitOfWork.SaveChangesAsync(); } ``` ### 4. Background Tasks ```csharp // Daily streak processing public class StreakProcessingService : BackgroundService { protected override async Task ExecuteAsync(CancellationToken ct) { while (!ct.IsCancellationRequested) { await ProcessExpiredStreaksAsync(); await AwardMilestoneRewardsAsync(); await Task.Delay(TimeSpan.FromHours(1), ct); } } } ``` ### 5. Architecture Checklist - [x] Controllers + MediatR for CQRS pattern - [x] FluentValidation with ValidatorBehavior - [x] HybridCache vแป›i stampede protection - [x] SignalR vแป›i Stateful Reconnect cho real-time updates - [x] EF Core concurrency handling cho point balance - [x] BackgroundService cho streak/session processing - [x] Domain Events + MassTransit cho integration events --- ## Configuration ### Environment Variables | Variable | Description | Required | Default | |----------|-------------|----------|---------| | `DATABASE_URL` | PostgreSQL connection | Yes | - | | `REDIS_URL` | Redis connection | Yes | - | | `RABBITMQ_URL` | RabbitMQ connection | Yes | - | | `JWT_AUTHORITY` | JWT issuer URL | Yes | - | | `MINING_BASE_RATE` | Base mining rate (MP/hour) | No | 0.25 | | `MINING_SESSION_HOURS` | Session duration | No | 24 | | `CIRCLE_MIN_MEMBERS` | Minimum circle members | No | 3 | | `CIRCLE_MAX_MEMBERS` | Maximum circle members | No | 5 | | `REFERRAL_BONUS_PERCENT` | Bonus per referral | No | 25 | | `REFERRAL_BONUS_CAP` | Max referral bonus | No | 100 | --- ## Security Considerations ### Anti-Fraud Measures 1. **Rate Limiting** - Max 1 mining session start per 24 hours 2. **Device Fingerprint** - Track device changes, flag suspicious activity 3. **IP Monitoring** - Detect multiple accounts from same IP 4. **Circle Validation** - Members must be real, active users 5. **Referral Verification** - Referrals must pass KYC to activate bonus 6. **Activity Scoring** - Penalize inactive or bot-like patterns ### Data Protection - Mining history encrypted at rest - Personal data follows GDPR compliance - Audit logs for all admin actions --- ## Roadmap ### Phase 1: Core Mining (MVP) - [x] Miner profile creation - [x] Daily tap-to-mine sessions - [x] Basic mining rate calculation - [x] Mining history ### Phase 2: Social Features - [ ] Security circles - [ ] Referral system - [ ] Circle bonus calculation ### Phase 3: Advanced Features - [ ] User role progression - [ ] Point conversion to wallet - [ ] Leaderboards ### Phase 4: Node Network (Future) - [ ] Node operator role - [ ] Decentralized validation - [ ] Network rewards --- ## Resources - [Architecture Documentation](./ARCHITECTURE.md) - [GoodGo Platform Docs](../../docs/) - [Pi Network Whitepaper](https://minepi.com/white-paper) (Inspiration) - [Wallet Service Integration](../wallet-service-net/) ## License Proprietary - GoodGo Platform