Milestone 5 — $QTRA Token Utility & Monetization — Integration Plan¶
Milestone: Phase 1, M5 (Week 5) Payment: $40,000 upon approval Status: Planning
Scope Mapping¶
The M5 deliverables break into 4 workstreams. The staking system spec covers WS1 fully.
graph TB
subgraph WS1["WS1: Staking System (CLIENT SPEC PROVIDED)"]
S1[StakingVault Contract<br/>Lock tiers, weights, safeguards]
S2[RewardDistributor Contract<br/>Per-second accrual, claim vesting]
S3[CircuitBreaker Contract<br/>6 automatic triggers]
S4[Staking UI<br/>Live APY, tier selector, claim progress]
end
subgraph WS2["WS2: Buyback & Burn"]
B1[BuybackEngine Contract<br/>Monthly profit → DEX buy → burn]
B2[Revenue calculation logic]
B3[On-chain burn auditability]
end
subgraph WS3["WS3: Fee Rebates & Discounts"]
F1[Fee discount tiers<br/>Based on $QTRA staked amount]
F2[Trading fee rebate integration<br/>Matching engine fee override]
F3[Subscription discount<br/>Platform subscription pricing]
end
subgraph WS4["WS4: Revenue Router"]
R1[RevenueRouter Contract<br/>50% subs + 20% fees + 20% profit → pool]
R2[Off-chain revenue bridge<br/>Fiat/crypto revenue → on-chain USDC]
R3[Treasury backstop<br/>$5M floor + $1.5M emergency]
end
R1 --> S2
B1 --> S2
F1 --> S1
style WS1 fill:#e8f5e9
style WS2 fill:#fff3e0
style WS3 fill:#e1f5fe
style WS4 fill:#f3e5f5
Smart Contract Architecture¶
graph TB
subgraph Core["Core Contracts"]
TOKEN[$QTRA Token<br/>ERC20 + Burnable<br/>(from M2)]
VAULT[StakingVault<br/>Lock / Unlock / Tiers<br/>Weights / Safeguards]
REWARD[RewardDistributor<br/>Per-second accrual<br/>Claim vesting (7d stream)<br/>Auto-compound]
end
subgraph Revenue["Revenue Contracts"]
ROUTER[RevenueRouter<br/>Split incoming revenue<br/>50% sub / 20% fees / 20% profit]
BACKSTOP[TreasuryBackstop<br/>$5M annual floor<br/>$1.5M emergency USDC reserve]
end
subgraph Buyback["Buyback Contracts"]
BUYBACK[BuybackEngine<br/>Monthly DEX purchase<br/>Auto-burn purchased tokens]
end
subgraph Protection["Protection Layer"]
CIRCUIT[CircuitBreaker<br/>6 triggers: staked < 10M,<br/>stakers < 100, price crash,<br/>zero revenue, whale cap]
ORACLE[Price Oracle<br/>Chainlink QTRA/USD<br/>or DEX TWAP]
end
subgraph External["External"]
DEX[Uniswap/Aerodrome<br/>on Base]
USDC[USDC Deposits<br/>from platform revenue]
ADMIN[Revenue Admin<br/>Multisig deposits]
end
USDC -->|deposit| ROUTER
ADMIN -->|deposit| ROUTER
ROUTER -->|50%+20%+20%| REWARD
ROUTER -->|remaining| BACKSTOP
REWARD -->|claim| TOKEN
VAULT -->|stake/unstake| TOKEN
VAULT -->|weight lookup| REWARD
CIRCUIT -->|pause/redirect| REWARD
ORACLE -->|price feed| CIRCUIT
ORACLE -->|price feed| BUYBACK
BUYBACK -->|buy on DEX| DEX
BUYBACK -->|burn| TOKEN
style Core fill:#e8f5e9
style Revenue fill:#fff3e0
style Buyback fill:#fce4ec
style Protection fill:#e1f5fe
Detailed Specifications¶
WS1: Staking System (from client spec)¶
Contract: StakingVault.sol
// Key state
mapping(address => StakeInfo) public stakes;
uint256 public totalStaked;
uint256 public totalStakers;
uint256 public constant MIN_STAKED_THRESHOLD = 10_000_000e18; // 10M QTRA
uint256 public constant MIN_STAKER_COUNT = 100;
uint256 public constant MAX_WALLET_CAP_BPS = 200; // 2% per epoch
uint256 public constant MIN_STAKE_PER_WALLET = 1_000e18; // 1,000 QTRA
struct StakeInfo {
uint256 amount;
uint256 weightedAmount; // amount * tierMultiplier
LockTier tier;
uint256 lockStart;
uint256 lockEnd;
uint256 warmupEnd; // lockStart + 7 days
bool active;
}
enum LockTier { SEVEN_DAYS, THIRTY_DAYS, NINETY_DAYS, SIX_MONTHS, ONE_YEAR }
// Tier weights (immutable, basis points)
// 10000 = 1.00x, 10500 = 1.05x, 12000 = 1.20x, 14000 = 1.40x, 16000 = 1.60x
Key functions:
- stake(uint256 amount, LockTier tier) — lock tokens, 7-day warmup before earning
- unstake() — after lock period expires, 3-day cooldown
- earlyUnstake() — reverts to 7-day base rate weight retroactively
- getEffectiveWeight(address user) — returns weighted staking power
Contract: RewardDistributor.sol
// Per-second reward accrual (Synthetix-style)
uint256 public rewardRate; // tokens per second
uint256 public rewardPerTokenStored;
uint256 public lastUpdateTime;
mapping(address => uint256) public userRewardPerTokenPaid;
mapping(address => uint256) public rewards;
// Claim vesting
struct ClaimStream {
uint256 totalAmount;
uint256 claimed;
uint256 startTime;
uint256 endTime; // startTime + 7 days
}
mapping(address => ClaimStream[]) public claimStreams;
Key functions:
- earned(address user) — accrued rewards (continuous)
- claimRewards() — starts 7-day vesting stream
- autoCompound() — restakes rewards into same tier
- collectVested() — withdraw vested portion of active streams
- forfeitStream(uint256 streamId) — returns unvested to pool
WS2: Buyback & Burn¶
Contract: BuybackEngine.sol
uint256 public constant BUYBACK_PERCENTAGE = 1000; // 10% of net profit (BPS)
uint256 public constant CRISIS_BUYBACK_PERCENTAGE = 2000; // 20% during price crash
uint256 public constant CRISIS_DURATION = 30 days;
// Buyback execution
function executeBuyback(uint256 usdcAmount) external onlyAuthorized {
// 1. Swap USDC → QTRA on DEX (Uniswap V3 / Aerodrome)
// 2. Burn purchased QTRA tokens
// 3. Emit BuybackExecuted event with amounts
}
Off-chain component (backend):
- Monthly profit calculation from platform revenue
- 10% of net profit allocated to buyback
- Backend triggers executeBuyback() via multisig or automated keeper
- All buyback txs logged for on-chain auditability
Burn mechanism:
- Purchased tokens sent to QTRAToken.burn() (OpenZeppelin ERC20Burnable)
- Burn events indexed by chain-indexer
- Dashboard shows cumulative burned, remaining supply, deflation rate
WS3: Fee Rebates & Discounts¶
Trading Fee Rebates (integrated into matching engine):
| $QTRA Staked | Fee Discount |
|---|---|
| 0 | 0% (standard fees) |
| 10,000+ | 5% discount |
| 50,000+ | 10% discount |
| 100,000+ | 15% discount |
| 500,000+ | 20% discount |
| 1,000,000+ | 25% discount |
Implementation: - Matching engine queries staking balance via gRPC on order placement - Fee discount applied at trade settlement in ledger-service - Discount tiers configurable (stored in contract or platform config) - UI shows "Your fee tier" based on staked amount
Subscription Discounts:
| Payment Method | Discount |
|---|---|
| Pay in USDC | 0% (standard) |
| Pay in $QTRA | 10% discount |
| Pay in $QTRA + staking 100K+ | 20% discount |
Implementation: - Subscription service checks $QTRA balance and staking status - Discount applied at checkout - $QTRA payments route through RevenueRouter
WS4: Revenue Router¶
Contract: RevenueRouter.sol
uint256 public constant SUBSCRIPTION_SHARE = 5000; // 50% to staking pool
uint256 public constant EXCHANGE_FEE_SHARE = 2000; // 20% to staking pool
uint256 public constant TRADING_PROFIT_SHARE = 2000; // 20% to staking pool
enum RevenueType { SUBSCRIPTION, EXCHANGE_FEE, TRADING_PROFIT, OTHER }
function depositRevenue(uint256 amount, RevenueType revenueType) external onlyAuthorized {
uint256 stakingShare = calculateShare(amount, revenueType);
uint256 treasuryShare = amount - stakingShare;
USDC.transfer(address(rewardDistributor), stakingShare);
USDC.transfer(address(treasuryBackstop), treasuryShare);
rewardDistributor.notifyRewardAmount(stakingShare);
}
Off-chain revenue bridge: - Platform revenue (fiat subscriptions, exchange fees, trading profit) is collected off-chain - Weekly batch: convert to USDC, deposit to RevenueRouter via multisig - RevenueRouter splits and routes automatically - All deposits logged with revenue type for auditability
TreasuryBackstop.sol: - Holds USDC reserve ($5M annual floor + $1.5M emergency) - If staking pool falls below $5M/year rate, backstop tops up automatically - Emergency reserve activates after 90 days zero revenue - Managed by multisig (cannot be drained by single party)
Implementation Timeline (Week 5)¶
gantt
title M5 — Token Utility & Monetization (Week 5)
dateFormat YYYY-MM-DD
axisFormat %a
section Day 1-2: Staking Contracts
StakingVault.sol :d1, 2026-05-05, 1d
RewardDistributor.sol :d2, 2026-05-05, 2d
CircuitBreaker.sol :d3, 2026-05-06, 1d
section Day 2-3: Revenue & Buyback
RevenueRouter.sol :d4, 2026-05-06, 1d
TreasuryBackstop.sol :d5, 2026-05-06, 1d
BuybackEngine.sol :d6, 2026-05-07, 1d
section Day 3-4: Integration
Fee rebate integration (matching engine) :d7, 2026-05-07, 1d
Subscription discount logic :d8, 2026-05-07, 1d
Backend revenue bridge :d9, 2026-05-08, 1d
section Day 4-5: Testing & UI
Contract tests (90%+ coverage) :d10, 2026-05-08, 1d
Staking UI (live APY, tiers, claims) :d11, 2026-05-08, 2d
Testnet deployment :d12, 2026-05-09, 1d
End-to-end testing :d13, 2026-05-09, 1d
Acceptance Criteria (M5)¶
From original delivery plan + staking spec:
- Staking and rewards functional (stake, unstake, claim, auto-compound)
- Lock tiers enforce correct weights (1.00x → 1.60x)
- All 6 safeguards enforced (min staked, min stakers, whale cap, dust prevention, floor, continuous accrual)
- All 6 circuit breakers trigger correctly
- 7-day claim vesting streams work (partial claim, forfeit)
- Buyback and burn logic executes correctly
- Revenue router splits correctly (50%/20%/20%)
- Trading fee rebates applied based on staking amount
- Subscription discounts work for $QTRA payments
- On-chain auditability (all events indexed, burn tracking)
- Token utilities applied correctly
- Contract tests at 90%+ coverage
- Deployed to Base Sepolia testnet
Open Questions for Client¶
- Epoch duration for 2% wallet cap — 7 days? 30 days?
- Revenue bridge frequency — weekly multisig deposits? Daily automated?
- Price oracle — Chainlink on Base? DEX TWAP? Custom?
- Early unstake penalty — just lose tier bonus, or also forfeit % of principal?
- Warmup period — does 90-day lock = 7d warmup + 90d, or 7d warmup + 83d?
- Buyback DEX — Uniswap V3 on Base? Aerodrome?
- Fee rebate tiers — are the proposed thresholds (10K/50K/100K/500K/1M) acceptable?
- Subscription discount — 10% for QTRA payment, 20% with staking — acceptable?