Immutable settings
Everything here is fixed either at compile time (constant) or at deployment (immutable). No function can alter any of it.
Economics
// PloutoRevenueRouteruint256 public constant BUYBACK_BPS = 6000;uint256 public constant STAKER_BPS = 3000;uint256 public constant RESERVE_BPS = 1000;uint256 public constant BPS = 10_000;Compiled into the bytecode. No storage slot exists to write to.
Staking terms
// GravityStakinguint64 public constant LOCK_7D = 7 days;uint64 public constant LOCK_30D = 30 days;uint64 public constant LOCK_90D = 90 days; uint256 public constant MULT_7D = 1.0e18;uint256 public constant MULT_30D = 1.5e18;uint256 public constant MULT_90D = 2.5e18; uint256 public constant MIN_STAKE = 1e18;uint256 public constant WEIGHT_PRECISION = 1e18;uint256 private constant ACC_PRECISION = 1e27;Adding a fourth lock term would require a new contract.
Reserve governance
// PloutoReserveuint256 public constant TIMELOCK_DELAY = 2 days;uint256 public constant EXECUTION_WINDOW = 14 days;Retirement destination
// BuybackExecutoraddress public constant DEAD_ADDRESS = 0x000000000000000000000000000000000000dEaD;Per-deployment immutables
Set once in a constructor and unchangeable thereafter:
| Contract | Immutable | Source |
|---|---|---|
| Registry | ponsFactory, ponsFeeEscrow, expectedLauncher | Constructor arguments. |
| Router | registry, feeEscrow, gravityStaking, buybackExecutor, reserve | Constructor arguments. |
| Staking | registry | Constructor argument. |
| Executor | registry, ponsFactory, poolManager, expectedChainId | Constructor arguments. |
| Executor | ponsMemeHook | Read from factory.memeHook() at construction. |
One-shot, not immutable
Three values are written exactly once after deployment, then permanently fixed:
| Value | Written by | Guard |
|---|---|---|
revenueRouter on staking, executor, reserve | setRevenueRouter | RouterAlreadySet() |
| The four protocol addresses on the registry | wireProtocol | AlreadyWired() |
ploutoToken and ploutoCurve | setPloutoTokenOnce | AlreadyInitialized() |
These exist because of the deployment ordering problem — the router does not exist when the first three contracts are constructed. Functionally they are immutable from the moment they are set.
What is mutable
For completeness, the only adjustable values in the protocol:
// BuybackExecutor, DEFAULT_ADMIN_ROLE onlyuint256 public maxEthPerExecution; // default 0.25 etheruint256 public maxBudgetShareBps; // default 2500uint256 public maxPriceImpactBps; // default 500uint256 public minEthPerExecution; // default 0.001 etherPlus pause state, emergency mode, and role membership.
No proxies
Plouto deliberately uses no upgradeable proxies. What is deployed is what runs. There is no implementation slot, no admin proxy and no upgrade function anywhere — so the bytecode you verify on Blockscout is the bytecode that will execute forever.