Skip to content
Protocol contracts not yet configured for this build
Enter app

Contract reference

Roles

Access control is OpenZeppelin AccessControl on four contracts and Ownable2Step on the registry.

The roles

RoleContractsPowers
DEFAULT_ADMIN_ROLEStaking, Executor, Router, ReserveOne-shot router wiring; safety parameters; grant and revoke roles.
PAUSER_ROLEStaking, Executor, RouterPause and unpause.
EMERGENCY_ROLEStakingDeclare or clear an emergency.
KEEPER_ROLEExecutor, RouterExecute a bounded buyback; sweep donations to the reserve.
GOVERNOR_ROLEReservePropose and execute timelocked withdrawals.
GUARDIAN_ROLEReserveVeto a pending withdrawal.
ownerRegistryWire the protocol; the one-time token initialization.

Role identifiers are keccak256 of the name, e.g. KEEPER_ROLE = keccak256("KEEPER_ROLE"). DEFAULT_ADMIN_ROLE is bytes32(0).

What no role can do

This list is the point of the page.

  • Change the split. BUYBACK_BPS, STAKER_BPS, RESERVE_BPS are constant.
  • Withdraw someone else's principal. No function exists.
  • Change the registered token. setPloutoTokenOnce is one-way.
  • Redirect the split. The three destinations are immutable constructor arguments.
  • Make an arbitrary call. No execute(address,bytes) anywhere.
  • Mint PLOUTO. The token has no reachable mint entrypoint.
  • Bypass the reserve timelock. No override exists.
  • Withdraw from the router. ETH leaves only via the split or the fixed-destination donation sweep.
  • Force a buyback past its bounds. Every bound is checked on chain.

Keeper, specifically

The keeper is the most-exercised role and the most likely to be a hot key. Its entire surface is:

solidity
BuybackExecutor.executeBuyback(uint256 ethIn, uint256 minTokensOut, uint256 deadline);PloutoRevenueRouter.sweepDonationsToReserve();

The first is bounded by size, share, slippage, deadline and on-chain price impact. The second sends to a fixed address. A compromised keeper can grief; it cannot steal. See keeper constraints.

Current holders

Not deployed Not deployed, so no roles are assigned.

On deployment, every role is granted to the address supplied as PLOUTO_ADMIN. Transferring them to a multisig behind a timelock is step 15 of the launch runbook and a launch blocker.

RoleIntended holder
Registry ownerMultisig (TBA)
DEFAULT_ADMIN_ROLEMultisig (TBA)
PAUSER_ROLEMultisig (TBA)
EMERGENCY_ROLEMultisig (TBA)
KEEPER_ROLEDedicated hot wallet (TBA)
GOVERNOR_ROLEMultisig (TBA)
GUARDIAN_ROLEA different signer (TBA)

Verifying holders

bash
cast call <contract> 'hasRole(bytes32,address)(bool)' \  0x0000000000000000000000000000000000000000000000000000000000000000 <address> \  --rpc-url https://rpc.mainnet.chain.robinhood.com

Or watch RoleGranted and RoleRevoked from deployment onward for the complete history.