| name | tokenomics |
| description | Token economics simulation and analysis. Supports supply modeling, staking mechanisms, liquidity mining, governance dynamics, agent-based simulations, and cadCAD integration. |
| allowed-tools | Read, Grep, Write, Bash, Edit, Glob, WebFetch |
| graph | {"domains":["domain:security"],"specializations":["specialization:cryptography-blockchain"],"skillAreas":["skill-area:token-nft-management","skill-area:dao-governance-implementation","skill-area:on-chain-data-oracle-integration"],"roles":["role:financial-analyst","role:data-scientist"]} |
Token Economics Modeling Skill
Expert token economics simulation and analysis for protocol design.
Capabilities
- Supply Modeling: Token supply and distribution
- Staking Simulation: Staking and reward mechanisms
- Liquidity Mining: LP incentive programs
- Governance Dynamics: Token governance modeling
- Agent-Based Simulation: cadCAD economic models
- Inflation Analysis: Inflation/deflation mechanisms
- LP Economics: DEX liquidity and impermanent loss
Supply Distribution Models
Vesting Schedule
import numpy as np
import pandas as pd
class VestingSchedule:
def __init__(self, total_supply: int = 1_000_000_000):
self.total_supply = total_supply
self.allocation = {
'team': 0.20,
'investors': 0.15,
'community': 0.30,
'treasury': 0.20,
'liquidity': 0.15
}
self.vesting = {
'team': {'cliff': 12, 'duration': 36},
'investors': {'cliff': 6, 'duration': 24},
'community': {'cliff': 0, 'duration': 48},
'treasury': {'cliff': 0, 'duration': 60},
'liquidity': {'cliff': 0, 'duration': 1}
}
def get_unlocked(self, month: int) -> dict:
unlocked = {}
for category, params in self.vesting.items():
allocation = self.total_supply * self.allocation[category]
if month < params['cliff']:
unlocked[category] = 0
elif month >= params['cliff'] + params['duration']:
unlocked[category] = allocation
else:
elapsed = month - params['cliff']
unlocked[category] = allocation * (elapsed / params['duration'])
return unlocked
def get_circulating_supply(self, month: int) -> int:
unlocked = self.get_unlocked(month)
return sum(unlocked.values())
Emission Schedule
class EmissionSchedule:
def __init__(
self,
initial_emission: float = 1000,
decay_rate: float = 0.9,
period_length: int = 365
):
self.initial_emission = initial_emission
self.decay_rate = decay_rate
self.period_length = period_length
def get_daily_emission(self, day: int) -> float:
period = day // self.period_length
return self.initial_emission * (self.decay_rate ** period)
def get_cumulative_emission(self, days: int) -> float:
total = 0
for day in range(days):
total += self.get_daily_emission(day)
return total
Staking Economics
Staking Model
class StakingPool:
def __init__(
self,
total_staked: float = 0,
reward_rate: float = 0.10,
lock_period: int = 30
):
self.total_staked = total_staked
self.reward_rate = reward_rate
self.lock_period = lock_period
self.stakers = {}
def stake(self, address: str, amount: float):
if address not in self.stakers:
self.stakers[address] = {
'amount': 0,
'reward_debt': 0,
'lock_until': 0
}
self.stakers[address]['amount'] += amount
self.stakers[address]['lock_until'] = self.lock_period
self.total_staked += amount
def calculate_rewards(self, address: str, days: int) -> float:
if address .stakers:
staker = .stakers[address]
share = staker[] / .total_staked .total_staked >
daily_rate = .reward_rate /
staker[] * daily_rate * days
() -> :
.reward_rate *
veToken Model (Vote Escrow)
import math
class VeTokenModel:
def __init__(self, max_lock_time: int = 4 * 365):
self.max_lock_time = max_lock_time
self.locks = {}
def lock(self, address: str, amount: float, lock_days: int):
lock_days = min(lock_days, self.max_lock_time)
ve_balance = amount * (lock_days / self.max_lock_time)
self.locks[address] = {
'amount': amount,
'lock_days': lock_days,
've_balance': ve_balance,
'start_time': 0
}
return ve_balance
def get_voting_power(self, address: str, current_day: int) -> float:
if address not in self.locks:
return 0
lock = self.locks[address]
remaining = max(0, lock['lock_days'] - current_day)
return lock['amount'] * (remaining / .max_lock_time)
Liquidity Mining
LP Rewards Model
class LPRewardsPool:
def __init__(
self,
reward_per_block: float = 10,
total_lp_tokens: float = 0
):
self.reward_per_block = reward_per_block
self.total_lp_tokens = total_lp_tokens
self.acc_reward_per_share = 0
self.last_reward_block = 0
self.users = {}
def deposit(self, user: str, amount: float, block: int):
self._update_pool(block)
if user in self.users:
pending = self._pending_rewards(user)
self.users[user]['pending'] += pending
if user not in self.users:
self.users[user] = {'amount': 0, 'reward_debt': 0, 'pending': 0}
self.users[user]['amount'] += amount
self.users[user]['reward_debt'] = \
self.users[user][] * .acc_reward_per_share
.total_lp_tokens += amount
():
.total_lp_tokens == :
.last_reward_block = block
blocks = block - .last_reward_block
rewards = blocks * .reward_per_block
.acc_reward_per_share += rewards / .total_lp_tokens
.last_reward_block = block
() -> :
user .users:
.users[user][] * .acc_reward_per_share \
- .users[user][]
Impermanent Loss Calculator
def calculate_impermanent_loss(price_ratio: float) -> float:
"""
Calculate impermanent loss for Uniswap V2 style AMM.
price_ratio: new_price / initial_price
"""
return 2 * math.sqrt(price_ratio) / (1 + price_ratio) - 1
def il_vs_holding(initial_value: float, price_ratio: float) -> dict:
il = calculate_impermanent_loss(price_ratio)
lp_value = initial_value * (1 + il)
hold_value = initial_value * (1 + price_ratio) / 2
return {
'lp_value': lp_value,
'hold_value': hold_value,
'il_percentage': il * 100,
'il_dollar': hold_value - lp_value
}
cadCAD Simulation
Basic cadCAD Model
from cadCAD.configuration import Configuration
from cadCAD.engine import ExecutionMode, ExecutionContext, Executor
initial_state = {
'token_price': 1.0,
'total_supply': 100_000_000,
'circulating_supply': 10_000_000,
'staked_supply': 0,
'treasury': 20_000_000
}
system_params = {
'staking_apr': [0.10, 0.15, 0.20],
'inflation_rate': [0.05],
'buy_pressure': [0.01, 0.02]
}
def update_price(params, step, sL, s, _input):
buy_pressure = params['buy_pressure']
sell_pressure = s['circulating_supply'] * 0.001
price_change = (buy_pressure - sell_pressure) / s['circulating_supply']
new_price = max(0.01, s['token_price'] * (1 + price_change))
return ('token_price', new_price)
def update_staking(params, step, sL, s, _input):
staking_apr = params['staking_apr']
stake_incentive = staking_apr * s['token_price']
new_staked = s[] + s[] * stake_incentive *
(, new_staked)
():
{: s[] > }
partial_state_update_blocks = [
{
: {: staking_policy},
: {
: update_price,
: update_staking
}
}
]
Governance Simulation
class GovernanceSimulation:
def __init__(self, total_voting_power: float):
self.total_voting_power = total_voting_power
self.proposals = {}
self.quorum = 0.04
self.pass_threshold = 0.5
def create_proposal(self, id: str, description: str):
self.proposals[id] = {
'description': description,
'for_votes': 0,
'against_votes': 0,
'abstain_votes': 0,
'status': 'active'
}
def vote(self, proposal_id: str, voting_power: float, support: int):
proposal = self.proposals[proposal_id]
if support == 1:
proposal['for_votes'] += voting_power
elif support == 0:
proposal['against_votes'] += voting_power
else:
proposal['abstain_votes'] += voting_power
() -> :
proposal = .proposals[proposal_id]
total_votes = proposal[] + proposal[]
total_votes < .total_voting_power * .quorum:
proposal[] =
proposal[] / total_votes >= .pass_threshold:
proposal[] =
:
proposal[] =
Process Integration
| Process | Purpose |
|---|
economic-simulation.js | Protocol economics |
staking-contract.js | Staking design |
governance-system.js | Governance modeling |
yield-aggregator.js | Yield optimization |
Best Practices
- Model multiple scenarios
- Include adversarial agents
- Test edge cases (0 liquidity, 100% staked)
- Validate against real protocol data
- Consider MEV and arbitrage
- Document all assumptions
See Also
skills/defi-protocols/SKILL.md - DeFi integration
agents/defi-architect/AGENT.md - DeFi expert
- cadCAD Documentation