KAI (contract)
Kairence governance + auction-premium token. Fixed supply, no further mint reachable.
contracts/src/core/KAI.sol
Inherits
ERC20, ERC20Burnable, ERC20Permit, ERC20Votes
Note: not Ownable — there is no admin role on KAI.
Constants
| Name | Value |
|---|---|
TOTAL_SUPPLY | 100,000,000 × 1e18 (100M KAI) |
TREASURY_SHARE | 60,000,000 × 1e18 |
TEAM_SHARE | 20,000,000 × 1e18 |
POL_SHARE | 15,000,000 × 1e18 |
AIRDROP_SHARE | 5,000,000 × 1e18 |
Constructor
constructor(
address treasury,
address teamTimelock,
address polRecipient,
address airdropDistributor
);Mints each tranche to its recipient and asserts the four sum to TOTAL_SUPPLY. All four addresses must be non-zero. No further mint function exists.
Surface
Standard ERC-20 + Burnable + Permit + Votes:
function transfer(address to, uint256 value) external returns (bool);
function approve(address spender, uint256 value) external returns (bool);
function burn(uint256 value) external;
function burnFrom(address account, uint256 value) external;
function permit(address owner, address spender, uint256 value,
uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
function delegate(address delegatee) external;
function getVotes(address account) external view returns (uint256);
function getPastVotes(address account, uint256 timepoint) external view returns (uint256);
function delegates(address account) external view returns (address);OZ v5 override boilerplate
Required by OpenZeppelin v5's hook architecture:
function _update(address from, address to, uint256 value)
internal override(ERC20, ERC20Votes);
function nonces(address owner) public view
override(ERC20Permit, Nonces) returns (uint256);Events
Standard Transfer, Approval, Permit, DelegateChanged, DelegateVotesChanged.
Errors
ZeroAddressPlus standard OZ ERC-20 / Votes errors.
Distribution
Each tranche should go to:
| Tranche | Recipient type |
|---|---|
| Treasury | Multisig (Gnosis Safe) |
| Team | OpenZeppelin TimelockController with 4y linear vest + 1y cliff |
| POL | LP-locker contract (NOT EOA — funds are paired with treasury USDC and locked permanently) |
| Airdrop | Merkle distributor contract |
The VerifyKAI.s.sol script asserts post-deploy that:
- Each balance equals its tranche constant.
- Team, POL, and Airdrop are contracts (not EOAs).
- Treasury can be either (warn-only).
Why no mint function
KAI is intentionally fully deflationary by code. The only way for KAI supply to change is down (burn / burnFrom). Auction settle burns clearing × winners KAI on every successful auction.
No emission schedule, no inflation, no staking-yield dilution. KAI's value is a direct function of (a) demand for inference access through the auction, and (b) remaining supply, which only decreases.
Voting power activation
Holders must delegate(self) (or any address) to activate voting power. Without delegation, balance does not vote — standard OZ Votes behaviour. UI should prompt users to self-delegate on first holding.
ERC20Votes snapshots delegation on every _update, so historical voting power is available via getPastVotes(account, timestamp).