Managing Distributions
Configure and manage token holder distributions
Managing Distributions
Distributions allow DAOs to share rewards, revenue, and other assets with stakers and token holders. This guide covers setting up and managing distribution mechanisms.
Distribution Types
Reward Distributions
Regular rewards for staking participation:
Type: Staking Rewards
Frequency: Weekly
Source: Protocol Revenue
Recipients: All stakers
Calculation: Pro-rata by stake weightRevenue Sharing
Share protocol income with token holders:
Type: Revenue Share
Frequency: Monthly
Source: Fee collection
Recipients: veToken holders
Calculation: Pro-rata by voting powerOne-Time Airdrops
Distribute tokens for specific events:
Type: Airdrop
Frequency: One-time
Source: Treasury allocation
Recipients: Snapshot of holders
Calculation: Custom criteriaDividend Distributions
Periodic profit sharing:
Type: Dividend
Frequency: Quarterly
Source: Net protocol profit
Recipients: Token holders
Calculation: Per-token basisSetting Up Distributions
Step 1: Create Distribution Pool
- Navigate to DAO Settings > Distributions
- Click Create Pool
┌─────────────────────────────────────────────────────────────┐
│ Create Distribution Pool │
├─────────────────────────────────────────────────────────────┤
│ │
│ Name: [Staking Rewards Pool ] │
│ │
│ Token: [LUX ▼] │
│ │
│ Recipients: [○ All token holders │
│ ● Stakers only │
│ ○ veToken holders │
│ ○ Custom list ] │
│ │
│ Distribution: [○ Pro-rata by balance │
│ ● Pro-rata by stake weight │
│ ○ Equal split │
│ ○ Custom formula ] │
│ │
└─────────────────────────────────────────────────────────────┘Step 2: Configure Distribution Schedule
Set up automatic distributions:
schedule:
frequency: weekly
day: Monday
time: 00:00 UTC
# Or use block-based
block_interval: 50400 # ~weekly on ETH
# Minimum distribution threshold
min_amount: 1000 LUXStep 3: Fund the Pool
Add tokens to the distribution pool:
Manual Funding:
- Go to pool dashboard
- Click Add Funds
- Enter amount and confirm
Automatic Funding:
auto_fund:
enabled: true
source: protocol_fees
percentage: 50%
frequency: dailyStep 4: Configure Recipient Criteria
Define who receives distributions:
recipients:
type: stakers
filters:
min_stake: 100 LUX
min_lock_time: 7 days
active_only: true
exclusions:
- treasury_address
- team_vesting_contracts
snapshot:
type: block_based
block: distribution_block - 1Distribution Calculations
Pro-Rata by Balance
Standard distribution based on token balance:
User Share = (User Balance / Total Supply) × Distribution AmountExample:
Total Distribution: 10,000 LUX
User Balance: 1,000 LUX
Total Supply: 100,000 LUX
User Share = (1,000 / 100,000) × 10,000 = 100 LUXPro-Rata by Stake Weight
Weighted by lock duration:
User Share = (User Stake × Lock Multiplier / Total Weighted Stake) × Distribution AmountExample:
Total Distribution: 10,000 LUX
User Stake: 1,000 LUX (locked 180 days, 2x multiplier)
User Weight: 2,000 weighted LUX
Total Weighted Stake: 200,000 weighted LUX
User Share = (2,000 / 200,000) × 10,000 = 100 LUXTime-Weighted Average
Rewards based on staking duration within period:
User Share = (User Days Staked / Total Stake-Days) × Distribution AmountCustom Formulas
Create custom distribution logic:
function calculateShare(
address user,
uint256 totalDistribution
) external view returns (uint256) {
uint256 stake = stakingContract.balanceOf(user);
uint256 lockTime = stakingContract.lockTime(user);
uint256 boost = nftContract.getBoost(user);
uint256 weight = stake * lockTime * boost / 1e18;
uint256 totalWeight = getTotalWeight();
return (weight * totalDistribution) / totalWeight;
}Managing Active Distributions
Distribution Dashboard
┌─────────────────────────────────────────────────────────────┐
│ Distribution Dashboard │
├─────────────────────────────────────────────────────────────┤
│ │
│ Active Pools: 3 │
│ Total Distributed (30d): 125,000 LUX │
│ Unique Recipients: 2,456 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Pool Name │ Balance │ Next Dist │ APY │ │
│ ├────────────────────┼────────────┼───────────┼───────┤ │
│ │ Staking Rewards │ 50,000 LUX │ 3 days │ 12.5% │ │
│ │ Revenue Share │ 25,000 USDC│ 12 days │ 5.2% │ │
│ │ LP Incentives │ 30,000 LUX │ 5 days │ 45.0% │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘Monitoring Distributions
Track distribution health:
metrics:
- pool_balance
- distribution_rate
- recipient_count
- average_claim_size
- unclaimed_amount
- runway_daysAdjusting Parameters
Modify distribution settings via governance:
- Create parameter change proposal
- Specify new values:
proposal:
type: parameter_change
target: staking_rewards_pool
changes:
- param: distribution_rate
old: 10000 LUX/week
new: 15000 LUX/week
- param: min_stake
old: 100 LUX
new: 50 LUXClaiming Distributions
Automatic Claims
Enable auto-claim for users:
auto_claim:
enabled: true
threshold: 10 LUX # Min amount to trigger
gas_limit: 100000
gas_price_cap: 50 gweiManual Claims
Users claim through dashboard:
- Go to My Staking > Rewards
- View pending rewards
- Click Claim or Compound
Batch Claims
Claim from multiple pools:
┌─────────────────────────────────────────────────────────────┐
│ Claim Rewards │
├─────────────────────────────────────────────────────────────┤
│ │
│ ☑ Staking Rewards 125.50 LUX │
│ ☑ Revenue Share 45.20 USDC │
│ ☑ LP Incentives 89.00 LUX │
│ ☐ Governance Rewards 0.00 LUX │
│ │
│ ──────────────────────────────────── │
│ Total: 214.50 LUX + 45.20 USDC │
│ │
│ [Claim All] [Claim Selected] [Compound LUX] │
│ │
└─────────────────────────────────────────────────────────────┘Distribution History
View Past Distributions
Access historical data:
history:
period: last_90_days
distributions:
- date: 2026-01-20
pool: staking_rewards
amount: 10,000 LUX
recipients: 1,234
avg_reward: 8.1 LUX
- date: 2026-01-13
pool: staking_rewards
amount: 10,000 LUX
recipients: 1,198
avg_reward: 8.3 LUXExport Data
Export distribution records:
- CSV format for accounting
- JSON for integrations
- On-chain verification links
Advanced Distribution Patterns
Merkle Distributions
Efficient distribution for large recipient lists:
merkle_distribution:
root: 0xabc123...
total_amount: 1,000,000 LUX
recipients: 50,000
proof_url: ipfs://Qm...
# Users claim with Merkle proof
claim_window: 90 days
unclaimed_return: treasuryStreaming Distributions
Continuous reward streaming:
stream:
type: sablier
total: 100,000 LUX
duration: 365 days
cliff: 0
recipients:
- address: 0x123...
share: 50%
- address: 0x456...
share: 50%Conditional Distributions
Distribute based on conditions:
conditional:
trigger: tvl > 10_000_000 USD
distribution:
pool: milestone_rewards
amount: 50,000 LUX
recipients: stakersTroubleshooting
Common Issues
| Issue | Cause | Solution |
|---|---|---|
| No rewards shown | Below minimum stake | Increase stake amount |
| Distribution delayed | Low gas prices | Increase gas budget |
| Wrong amount | Snapshot timing | Check snapshot block |
| Failed claim | Insufficient gas | Increase gas limit |
Emergency Actions
If distribution issues occur:
- Pause distributions - Stop automatic payouts
- Investigate - Review logs and calculations
- Fix - Correct any configuration errors
- Resume - Re-enable after verification
emergency:
pause_distributions: true
notify_admins: true
snapshot_state: trueBest Practices
Do
- Set sustainable reward rates
- Monitor pool balances
- Communicate distribution schedules
- Test distributions on testnet
- Maintain adequate runway
Don't
- Promise unsustainable APYs
- Change schedules without notice
- Exclude legitimate participants
- Let pools run empty
- Ignore unclaimed token buildup