$REPLY Token & ReplyPool
Table of Contents
Overview
The $REPLY token ecosystem consists of a dual-pool staking system that distributes trading fees to stakers on a daily basis. The system features two pools (Alpha and Public) with attribution-based multipliers that reward active community members.
Key Features
Dual Pool System: Alpha (Presale) and Public pools
Daily Fee Distribution: Automatic distribution at 00:00 UTC
Attribution Multipliers: Performance-based rewards (0.9x - 1.1x)
Gas Optimized: Batch processing for efficient distributions
No Claims Required: Fees are automatically distributed to user wallets
$REPLY Token
Token Specifications
Token Standard: ERC20 with EIP-2612 permit functionality
Total Supply: 1,000,000,000 REPLY tokens (1 billion)
Decimals: 18
Token Type: Fixed supply with no inflation mechanism
Token Addresses
Base Mainnet (Chain ID: 8453):
REPLY_TOKEN:
0x05B1266DDCeE093cE060DBF697e230EA9B453633
ReplyPool System
Overview
ReplyPools is the core staking contract that manages two separate pools for staking $REPLY tokens and distributing trading fees.
Pool Types
1. Alpha Pool (Presale Pool)
Purpose: For presale participants and airdrop recipients
Access: Restricted to authorized deposits (whitelist, airdrops, owner)
Withdrawal: Users can withdraw any amount at any time
Re-deposits: Not allowed via standard deposit (only via batch airdrops)
2. Public Pool
Purpose: Open staking for all users
Access: Anyone can stake via
stakePublic()Withdrawal: Users can withdraw any amount at any time
Re-deposits: Allowed at any time
Contract Addresses
Base Mainnet (Chain ID: 8453):
REPLY_POOLS:
0x85ED5FdfaCaC0386932AB0b189610a896be59c0EALPHA_POOL_WHITELIST:
0x8066644bF0eFAe1bD7a746bb45EEF2980B1e3034
Contract Addresses
Base Mainnet (Chain ID: 8453)
Deployment Details:
Chain ID: 8453 (Base Mainnet)
Deployment Block: 38085458
Owner:
0x429c599ec991Ff687DCF018C447d11b5A7513ea6Bot:
0xE622e4E758827008a774f4AD3d8578FE0b0Be989
Staking Mechanics
Public Pool Staking
Function: stakePublic(uint256 amount)
Process:
User approves REPLY tokens to ReplyPools contract
User calls
stakePublic(amount)Tokens are transferred from user to contract
User's stake is recorded with current multiplier
Adjusted stake (stake × multiplier) is added to pool totals
Requirements:
Amount must be > 0
User must have sufficient token balance
User must have approved tokens to contract
Distribution must not be in progress
Alpha Pool Deposits
Authorized Deposits: depositToAlphaAuthorized(address user, uint256 amount)
Who Can Deposit:
AlphaPoolWhitelist contract (during whitelist window)
Owner (for batch airdrops)
Authorized callers
Batch Airdrops: airdropToAlphaBatch(address[] users, uint256[] amounts)
Owner-only function
Allows multiple deposits per user
Gas-optimized batch processing
Withdrawals
Function: withdraw(PoolId pool, uint256 amount)
Process:
User calls
withdraw(pool, amount)Contract verifies user has sufficient stake
User's stake and adjusted stake are reduced
Tokens are transferred to user
If stake reaches zero, user is removed from pool
Requirements:
Amount must be > 0
User must have sufficient stake
Distribution must not be in progress
Pool IDs:
PoolId.Alpha = 0(Alpha/Presale pool)PoolId.Public = 1(Public pool)
Fee Distribution
Overview
Trading fees from $REPLY swaps are collected and distributed daily to stakers. The distribution is automatic and requires no user action.
Distribution Schedule
Frequency: Daily
Time: 00:00 UTC boundary (with short random delay)
Trigger: Automated via executor bot or manual keeper call
No Claims Required: Fees are sent directly to user wallets
Fee Collection
Trading fees accumulate throughout the day
Bot collects fees and swaps ETH → REPLY if needed
Bot calls
addPendingREPLY(amount)to add fees to pending balanceFees accumulate in
pendingREPLYBalanceuntil distribution
Distribution Process
Function: distribute() or distribute(uint256 overrideBatchSize)
Process:
Contract checks if distribution is due (dayIndex advanced)
Pending fees are split between Alpha and Public pools based on weights
Fees are distributed proportionally based on adjusted stakes
Distribution happens in batches (default: 200 users per batch)
Multi-transaction support for large pools
Fee Split:
Default: 50% Alpha Pool, 50% Public Pool
Configurable via
setPoolWeights(alphaWeightBps, publicWeightBps)Weights must sum to 10,000 (100%)
Distribution Formula
For each user in a pool:
where:
userAdjustedStake = userStake × multiplierpoolAdjustedTotalStake = Σ(userStake_i × multiplier_i)
Deferred Fees
If a fee transfer fails (e.g., contract reverts, fee-on-transfer token), the amount is stored in deferredFeeClaims[user]. Users can claim these later via claimDeferredFees().
Attribution & Multipliers
Overview
The attribution system rewards active community members with multipliers that affect their share of fee distributions. Multipliers are weight-based, meaning they affect proportional shares rather than absolute amounts.
Multiplier Range
Minimum: 0.9x (90% of base share)
Maximum: 1.1x (110% of base share)
Default: 1.0x (100% of base share)
Precision: Fixed-point with 1e9 scale (FP_SCALE)
How Multipliers Work
Multipliers are applied to user stakes to calculate "adjusted stakes":
Key Points:
Multipliers affect proportional share, not absolute amounts
Total distributed = exactly fees collected (zero-sum)
Higher multiplier = larger share of pool allocation
Lower multiplier = smaller share of pool allocation
Multiplier Updates
Function: updateUserMultipliers(PoolId pool, address[] users, uint256[] multipliersFP)
Process:
Attribution system calculates multipliers off-chain
Authorized caller (bot) pushes updates to contract
Contract updates cached multipliers
Adjusted totals are recalculated
Updates take effect on next distribution
Requirements:
Only authorized callers can update multipliers
Cannot update during active distribution
Multipliers are cached per epoch (distribution cycle)
Attribution System
Multipliers are managed directly by ReplyPools through a push model. The contract maintains its own cache for gas efficiency.
Alpha Pool Whitelist
Overview
The AlphaPoolWhitelist contract manages time-limited deposits to the Alpha pool using Merkle tree verification.
Whitelist Window
Duration: 72 hours (259,200 seconds)
Start Time: Set by owner when activating whitelist
One Deposit Per User: Users can only deposit once via whitelist
Merkle Proof: Required to verify eligibility
Contract Address
Base Mainnet:
ALPHA_POOL_WHITELIST:
0x8066644bF0eFAe1bD7a746bb45EEF2980B1e3034
Whitelist Process
Owner Activates Whitelist:
activateWhitelist(bytes32 merkleRoot, uint256 startTime)
User Deposits:
depositToAlpha(uint256 amount, uint256 maxAmount, bytes32[] proof)User provides Merkle proof
Amount cannot exceed maxAmount from Merkle tree
Tokens are transferred and deposited to Alpha pool
Whitelist Expires: After 72 hours, whitelist is inactive
Merkle Tree Structure
The Merkle tree contains leaves of:
Each user has a maximum allocation amount stored in the tree.
Checking Whitelist Status
Function:
isWhitelisted(address user, uint256 maxAmount, bytes32[] proof)Returns
trueif the user is whitelisted with the given max amount.
Function:
isWhitelistActive()Returns
trueif whitelist is currently active and within time window.
Function:
getTimeRemaining()Returns seconds remaining in whitelist window (0 if expired or inactive).
Frontend Monitoring Interface
Overview
The ReplyPools Contract Monitor is a real-time web interface available at https://lifeguard.replycorp.io that provides comprehensive monitoring and management capabilities for the ReplyPools system.
Features
Real-Time Contract Monitoring
The interface displays live contract state and automatically refreshes every 10 seconds to show:
Pending REPLY Balance: The amount of REPLY tokens waiting to be distributed
Distribution Status: Whether today's distribution has been completed
Current Day Index: The current UTC day index
Last Distributed Day: The most recent day that received a distribution
Distribution Epoch: Monotonic counter tracking distribution cycles
Days Behind: How many days behind the current day index (if any)
Distribution Management
The interface includes an "Execute Distribution" button that allows anyone to trigger the distribution transaction:
How the Distribute Button Works:
The button checks if distribution is ready:
Current day index must be ahead of last distributed day
There must be pending REPLY balance to distribute
Distribution must not already be in progress
Must be outside the bot distribution window (00:00-00:15 UTC)
When clicked, the interface:
Calls the
distribute()function on the ReplyPools contractShows transaction status and hash
Automatically refreshes to show updated state
Public Execution: Anyone can execute the distribution transaction through the interface if:
The executor bot fails to run
Manual intervention is needed
The distribution is overdue
Distribution Window:
Bot Window: 00:00-00:15 UTC (bot has priority)
Manual Window: After 00:15 UTC, anyone can execute via the interface
The interface enforces this cooldown period to prevent conflicts
Pool Statistics
Displays detailed statistics for both pools:
Alpha Pool:
Weight percentage (default: 50%)
Total staked amount
Number of users
Public Pool:
Weight percentage (default: 50%)
Total staked amount
Number of users
Bot Monitoring
Tracks the health and balances of automated bots:
Executor Bot:
ETH balance (for gas)
cbBTC balance (auto-swapped for REPLY)
REPLY balance
Bot address:
0xE622...e989
Utility Bot:
ETH balance (for gas)
Bot address:
0xf69c...20f7Handles airdrop claims, multiplier updates, and other authorized operations
Distribution Progress Tracking
When a distribution is in progress (multi-transaction), the interface shows:
Current batch being processed
Total batches required
Progress percentage
Estimated completion time
Contract Information
Displays key contract details:
Contract address:
0x85ED...9c0EBatch size (default: 200 users per transaction)
Total pending balance
Network: Base Mainnet (Chain ID: 8453)
Access
Network: Base Mainnet
No Authentication Required: Public interface, read-only monitoring
Transaction Execution: No Web3 wallet connection required, tx is executed on backend
Use Cases
Monitoring: Track pool health, pending balances, and distribution status
Verification: Verify that distributions are running on schedule
Manual Execution: Execute distributions if the bot fails
Transparency: Public visibility into contract operations
Debugging: Identify issues with distributions or bot operations
Technical Architecture
Key Design Features
1. Multi-Transaction Distribution
Large pools are distributed across multiple transactions to avoid gas limits:
Default batch size: 200 users per transaction
Configurable via
setBatchSize(uint256 newBatchSize)Progress tracked in contract state
Can resume interrupted distributions
2. Gas Optimizations
Batch Processing: Process multiple users per transaction
Cached Multipliers: Read multipliers from cache, not external contract
Efficient Array Management: O(1) user removal from pools
Single Transfer Per Batch: Batch airdrops transfer tokens once
3. Reentrancy Protection
All external functions use
nonReentrantmodifierDistribution state prevents concurrent distributions
SafeERC20 for token transfers
4. Precision & Math
All proportional calculations use OpenZeppelin
Math.mulDivFixed-point arithmetic for multipliers (1e9 scale)
Basis points for weights (10,000 = 100%)
State Variables
Core State:
pendingREPLYBalance: Accumulated fees awaiting distributiondayIndex: Current UTC day index (increments daily)distributionEpoch: Monotonic counter for distributionsdistributionActive: Flag for multi-transaction distribution
Pool State:
totalStakes[pool]: Total raw stakes per pooladjustedTotalStakes[pool]: Total adjusted stakes (with multipliers)poolUsers[pool]: Array of user addresses in each pooluserStakes[user][pool]: User's stake amount
Multiplier State:
cachedMultiplierFP[pool][user]: Cached multiplier (1e9 fixed-point)multiplierSyncEpoch[pool][user]: Epoch when multiplier was last synced
Events
Staking Events:
Staked(address indexed user, PoolId indexed pool, uint256 amount)Withdrawn(address indexed user, PoolId indexed pool, uint256 amount)
Distribution Events:
Distributed(uint256 dayIndex, uint256 alphaAmount, uint256 publicAmount)FeeDistributed(address indexed user, PoolId indexed pool, uint256 amount)DistributionBatchProcessed(...): Batch processing progress
Multiplier Events:
UserMultiplierUpdated(address indexed user, PoolId indexed pool, uint256 multiplierFP, uint256 epoch)MultiplierSynced(...)
Configuration Events:
PoolWeightsSet(uint256 alphaWeightBps, uint256 publicWeightBps)BatchSizeUpdated(uint256 indexed newBatchSize)
User Guide
How to Stake in Public Pool
Approve Tokens:
Stake:
Verify: Check your stake via
userStakes(yourAddress, PoolId.Public)
How to Withdraw
Withdraw:
or
Verify: Tokens are sent directly to your wallet
How to Check Your Rewards
View Functions:
userStakes(address user, PoolId pool): Your current stakecachedMultiplierFP(PoolId pool, address user): Your multiplier (1e9 = 1.0x)deferredFeeClaims(address user): Any deferred fees to claim
Calculate Projected Fees:
How to Claim Deferred Fees
If a fee distribution failed for your address:
This will transfer any deferred fees to your wallet.
Alpha Pool Whitelist Deposit
Get Your Merkle Proof: From the whitelist system
Approve Tokens:
Deposit:
Viewing Pool Statistics
Public View Functions:
totalStake(PoolId pool): Total staked in pooladjustedTotalStake(PoolId pool): Total adjusted stakegetUserCount(PoolId pool): Number of stakersgetDistributionStatus(PoolId pool): Distribution statsgetDistributionProgress(): Multi-transaction distribution progress
Security Considerations
Access Control
Owner: Can configure weights, batch size, authorized callers
Authorized Callers: Can add pending fees and update multipliers
Users: Can stake, withdraw, claim deferred fees
Reentrancy Protection
All external functions protected with
nonReentrantDistribution state prevents concurrent operations
SafeERC20 for token transfers
Fail-Safe Mechanisms
Deferred Fees: Failed transfers are stored for later claim
Batch Processing: Large distributions split across transactions
Multi-Transaction Support: Can resume interrupted distributions
Automation & Bots
Executor Bot
The executor bot handles:
Daily fee distribution at 00:00 UTC
ETH → REPLY swapping
Multiplier updates
Health monitoring
Required Bot Permissions
setAuthorizedCaller(botAddress, true)in ReplyPoolsBot must have REPLY token approval to call
addPendingREPLY()
Contract Interfaces
IReplyPools Interface
Additional Resources
Website: https://replycorp.io
Frontend Monitor: https://lifeguard.replycorp.io
Changelog
Base Mainnet Deployment (Chain ID: 8453)
Deployment block: 38085458
ReplyPools and AlphaPoolWhitelist deployed
Contract addresses documented above
Last Updated: December 2025
Quick Reference
Main Contracts (Base Mainnet)
REPLY Token:
0x05B1266DDCeE093cE060DBF697e230EA9B453633ReplyPools:
0x85ED5FdfaCaC0386932AB0b189610a896be59c0EAlphaPoolWhitelist:
0x8066644bF0eFAe1bD7a746bb45EEF2980B1e3034
Frontend Monitoring
Network: Base Mainnet (Chain ID: 8453)
Last updated

