Protocol

The whole thing, in four contracts.

Small enough to read in an afternoon, which is the only security property that survives contact with reality. Nothing here is deployed; everything here is specified.

Architecture

What talks to what.

Three tiers. The arrows that matter are the ones that are absent: nothing in the control tier can reach depositor assets, and the exit path crosses no tier at all.

Depositor
WalletHolds Ingots
Core · non-upgradeable
CrucibleHolds the position
IngotERC-20 accounting
SettlementChecks signed bounds
RegistryNames deployments
Control · replaceable
RebalancerMoves the range
Flux solverProposes routes
QuenchHalts, never traps
  • Core — non-upgradeable, holds assets
  • Control — replaceable, holds nothing
  • Parameter-only path

A solver that proposes a bad route wastes a batch. A rebalancer that proposes a bad range makes worse fees. Neither can take anything, because neither is ever the recipient of a transfer — the settlement contract pays the signer of the intent and nobody else.

Rebalancing

One rule, and it is arithmetic.

rebalance ⟺ |ln(P / Prange)| > band  ∧  now − last ≥ cooldown
Both conditions, or nothing happens. The log ratio is what makes the band symmetric in both directions — a plain percentage band is wider on the way up than on the way down, and that asymmetry quietly becomes a strategy.

Anyone may call it. There is no privileged rebalancer and no keeper subscription; the function is permissionless and reverts when the condition is false. If nobody ever calls it, the range goes stale and fee capture falls — which costs holders yield and costs nobody their principal.

Why a cooldown at all

Without one, a volatile hour is an unbounded number of rebalances, each paying gas and slippage out of the Crucible. The cooldown is the cheapest possible defence: it converts an attack that drains the pool through its own maintenance into an attack that wastes the attacker's gas.

Why a band at all

A range that follows price exactly is a range that is always moving, and moving costs. The band is the width of not caring — inside it, being slightly wrong is cheaper than being right.

Parameters

Every knob, and the bound it cannot be turned past.

A parameter without a hard bound is not a parameter, it is a permission. These bounds are compiled in — reaching a value outside the column on the right requires a new deployment that people have to choose to move to.

Protocol parameters with their hard bounds
Parameter What it controls Default Hard bound
bandDrift tolerated before a rebalance is legal±3.0%0.1% – 25%
cooldownMinimum interval between rebalances6 h1 h – 7 d
batchWindowHow long a Flux batch stays open12 s2 s – 120 s
maxSlippageWorst fill the settlement contract will accept50 bp1 – 300 bp
protocolFeeShare of swap fees retained by the protocol0 bp0 – 200 bp
mintFeeCharged on casting Ingots0 bpFixed at 0
redeemFeeCharged on burning Ingots0 bpFixed at 0
Scroll for all columns

The last two rows are the load-bearing ones. Redemption fees are fixed at zero in the code rather than defaulted to zero in a config, because a redemption fee that can be raised later is a mechanism for trapping people who are already in.

Deployments

There are none.

This table exists so that its being empty is visible. When something is deployed the addresses appear here, and the source is published at the same moment — not before, because unverified source against a live address is worse than none.

Deployed contract addresses
ContractNetworkAddressSource
CrucibleNot deployed
IngotNot deployed
SettlementNot deployed
RegistryNot deployed
Scroll for all columns

The spec is the product, for now.

Read what the protocol is structurally unable to do, or how the claim on a position is priced.