Skip to content

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

NameValue
TOTAL_SUPPLY100,000,000 × 1e18 (100M KAI)
TREASURY_SHARE60,000,000 × 1e18
TEAM_SHARE20,000,000 × 1e18
POL_SHARE15,000,000 × 1e18
AIRDROP_SHARE5,000,000 × 1e18

Constructor

solidity
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:

solidity
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:

solidity
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

ZeroAddress

Plus standard OZ ERC-20 / Votes errors.

Distribution

Each tranche should go to:

TrancheRecipient type
TreasuryMultisig (Gnosis Safe)
TeamOpenZeppelin TimelockController with 4y linear vest + 1y cliff
POLLP-locker contract (NOT EOA — funds are paired with treasury USDC and locked permanently)
AirdropMerkle 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).

Released under the MIT License.