Governance
Who administers the protocol. On devnet and testnet, $ABI holders vote through an OpenZeppelin Governor and a timelock; on mainnet, the team's admin account holds the admin roles.
Every protocol parameter has one admin: the account that holds DEFAULT_ADMIN_ROLE on each contract. Who that is depends on the network.
| Network | Admin |
|---|---|
| Devnet and testnet | A TimelockController run by AbiGovernor (OpenZeppelin Governor): $ABI holders vote |
| Mainnet | ADMIN, the team's account. $ABI is launched on Pons V2 and has no voting module, so there is no governor and no timelock |
Voting (devnet and testnet)#
- Delegate. Voting power comes from delegated ABI (
ERC20Votes). Delegate to yourself once to vote with your own tokens, or to someone else. - Propose. An address with at least the proposal threshold of voting power submits a list of calls (target, function, arguments) and a description.
- Wait. Voting opens after the voting delay.
- Vote. For, Against or Abstain, during the voting period. Power is read at the proposal's snapshot.
- Queue. A proposal that reaches quorum and has more For than Against is queued in the timelock. Anyone can queue it.
- Execute. After the timelock delay, anyone can execute it.
| Setting | Default |
|---|---|
| Voting delay | 1 day |
| Voting period | 5 days |
| Proposal threshold | 1,000,000 ABI (0.1% of the supply) |
| Quorum | 4% of the supply |
| Timelock delay | 2 days |
The governor's clock is in seconds. On Robinhood Chain, an Arbitrum Orbit chain, block.number follows the L1, so time is the reliable clock.
The timelock's only proposer and canceller is the governor. Execution is open to anyone. There is no external admin.
What the admin controls#
| Contract | Parameter | Function |
|---|---|---|
AgentFactory | Protocol fee (≤ 50%) | setProtocolFeeBps |
AgentFactory | Fee recipient, or 0 to stop the fee | setProtocolTreasury |
AgentFactory | Minimum pool seed to launch | setMinSeedUsdg |
Arena | New skill arena | createArena |
Arena | Qualify score, pause an arena | setArenaParams |
Arena | Community arenas: allow or pause openings, their epoch length and qualify score | setOpenArenaParams |
Arena | Validator minimum stake, validator share (≤ 50%) | setParams |
Emissions | Fixed emission rate | setEmissionRate |
Emissions | Share of the reserve paid per day (0 = fixed rate) | setReserveShare |
Emissions | Split between arenas, and turning on rewards for a community arena | setArenaWeight |
Staking | Unbonding period (1–60 days) | setUnbondingPeriod |
Staking | Slash a target (SLASHER_ROLE, held by the admin) | slash |
ProtocolTreasury | Route used to buy $ABI | setSwapAdapter |
ProtocolTreasury | Where bought $ABI goes (the Emissions reserve) | setRewardsSink |
ProtocolTreasury | Grant caps | setMaxGrant, setGrantCapPerWeek |
ProtocolTreasury | Spend from the treasury (tokens or ETH) | transferOut |
ProtocolTreasury | Who runs buybacks and grants | grantRole(KEEPER_ROLE / ABI_AGENT_ROLE) |
AbiGovernor (devnet, testnet) | Voting delay, period, threshold, quorum | setVotingDelay, setVotingPeriod, setProposalThreshold, updateQuorumNumerator |
Agent contracts have no admin: nobody can move a treasury's funds, change an agent's buyback share or replace its operator. What the admin can change is the protocol fee taken from future revenue.
PonsFeeSplitter (mainnet) has no setter for its split: the team share (70%) is fixed at deployment, and its admin can only name the protocol treasury, once.
In the app#
Govern shows your voting power and delegation, the live proposals with their votes, the parameters with their current values, and a composer that builds a proposal from a parameter change. It needs a deployment with a governor (devnet, testnet).
