schema

Hardcoded constants, storage, events, errors, and the read interface.

constants

CONSTANTVALUE
TOTAL_SUPPLY1,000,000,000 × 10^18
DECIMALS18
T_AMB21.000 °C
T_FLOOR36.000 °C
T_CEIL39.500 °C
K_HEAT42.000 °C per full supply moved
BLOCK_HEAT_CAP1.500 °C per block
COOLING HALF-LIFE6.000 hours (λ = ln 2 / 21600 s ≈ 3.2087 × 10^-5 per second)
H_REQ900.000 degree-hours
SCORCH_RATE2.500 dh added per scorch dh
TURN_MIN_GAP5,400 s
TURN_MAX_GAP28,800 s
ADHESION_DRAGrate × 10000/(10000 + 25a) bps
RING_EPOCH86,400 s
RING_CAP730 rings
AIRCELL_BASE0.030 units per day
AIRCELL_COLD_MULT×3 below T_FLOOR
GRADEAA / A / B below 4.500 / below 9.000 / 9.000 and above
PIP_SECTORS24 sectors of 15°
PIP_MIN1,000 × 10^18
SHELL_INTEGRITY1.000 × 10^12 scored weight

All constants are immutable and compiled into the bytecode. No caller, including the deployer, can change any of them.

capabilities

TRANSFER HEAT
LAZY COOLING
DEGREE-HOUR CLOCK
TURNING
RING ARCHIVE
AIR CELL
PIPPING
HATCH BURN
MINT PATH
ADMIN KEYS
PAUSE
UPGRADE
TRANSFER FEE
BLACKLIST
ORACLE INPUT
OFFCHAIN KEEPER

Filled squares are compiled in. Hollow squares are not gated off; they are absent from the bytecode.

FIG. S1laid000.0 dh≥ 72.0warmed072.0 dh≥ 189.0quickened189.0 dh≥ 342.0veined342.0 dh≥ 558.0drawn558.0 dh≥ 810.0pipped810.0 dhzip complete + integrity spenthatched900.0 dh

There are no reverse edges. A crossing cannot be undone by cooling, scorch, or time.

storage

Thermal { t_last: uint64, T_last: uint64 }
the pair. everything thermal is derived from these two words.
Clock { dh: uint128, dh_req: uint128, scorch: uint128 }
the accumulator, the live requirement, and the damage that raised it.
Turning { last_turn: uint64, turns: uint32, adhesion: uint32 }
the tending record. adhesion only increments.
Ring { transfers: uint32, volume: uint128, heat_in: uint64, peak_T: uint64, dh_gained: uint64, turns: uint16, tone: uint8, grade: uint8 }
one sealed epoch. append-only array, capacity 730.
Shell { integrity: uint128, scored: uint128, next_sector: uint8, sectors: uint24 }
the endgame state. sectors is a 24-wide bitfield.
AirCell { size: uint64, grade: uint8 }
the age of the egg, in the only place it shows.

events

Heated { amount: uint256, dT: uint64, T_after: uint64 }
every transfer that moved the needle.
Turned { caller: address, gap: uint64, adhesion_after: uint32 }
every turn, and what the gap cost.
RingSealed { index: uint16, tone: uint8, grade: uint8 }
one per epoch, at most.
StageReached { from_stage: uint8, to_stage: uint8, dh: uint128 }
permanent. the candling page indexes these.
Scorched { dh_over: uint64, req_after: uint128 }
damage, and the new price of hatching.
Pipped { caller: address, sector: uint8, weight: uint128, scored_total: uint128 }
a scored chip at the shell.
Mispipped { caller: address, sector: uint8, burned: uint256 }
a burn in the wrong place. it still counts against supply.
Hatched { dh_final: uint128, total_burned: uint256, T_at_hatch: uint64 }
emitted exactly once, ever.

errors

ERRORMEANING
TooSoonToTurnninety minutes have not passed.
ShellNotPippedpip() before the pipped stage.
AlreadyHatchedthe egg is open. nothing left to do.
BurnBelowMinimumpips smaller than 1,000 tokens revert.
RingNotElapsedthe epoch boundary has not passed.
NothingToSealthe ring was already sealed.
IntegrityNotMethatch() before the shell is spent.
SectorsIncompletehatch() before the zip closes the circle.