FCT Issuance Formula
This section provides a detailed explanation of the formula that governs the issuance of FCT, intended for technical readers who want to understand issuance on a block-by-block basis.
To see the current mint rate, issuance progress, and other real-time FCT metrics, visit fct.fyi.
Overview
FCT issuance is designed to provide:
Predictable ownership through a deterministic total supply cap
Stable issuance via dynamic rate adjustments every 500 blocks
Protection from gas spikes by minting based on ETH burned, not gas units
Basic minting formula
FCT is minted proportionally to the ETH burned for transaction calldata:
Where:
ETH burned for data = Data Gas × Block Base Fee (Data Gas is defined in the Calldata gas calculation section)
Mint rate = Dynamically adjusted rate (FCT-wei per ETH-wei)
The mint rate is denominated in FCT-wei per ETH-wei burned.
Important: Data Gas only includes the gas for the transaction's calldata/event data - not the total gas used by the transaction.
Total supply cap
The total supply of FCT is:
1,646,951,661 FCT (human-readable)
1,646,951,661,163,841,381,479,607,357 (in FCT-wei, with 18 decimals)
The protocol enforces this cap through an issuance-based halving schedule.
Halving schedule
Halvings are intended to occur every 5,256,000 blocks. However, the actual halvings are triggered by issuance thresholds, not time:
1st Halving: 50% of total supply minted
2nd Halving: 75% of total supply minted (50% + 25%)
Subsequent: Each adds half of remaining supply
Each halving reduces the per-period issuance target by 50%.
Example: If the current per-period target is 100,000 FCT, after the next halving it becomes 50,000 FCT. This ensures issuance slows down over time as the total supply approaches its cap.
Dynamic rate adjustment
What is a period?
A period is a span of time during which the FCT mint rate remains constant. When a period ends, the protocol recalculates the rate based on how much FCT was actually minted versus the target.
Periods can end during a transaction. If a transaction's minting would exceed the period's target, the period ends mid-transaction:
The portion of ETH burned before hitting the target mints at the current period's rate
The remaining portion mints at the new period's rate
The same applies to halvings - they can occur within a single transaction.
This creates a self-balancing system: if too much FCT is minted, rates go down; if too little is minted, rates go up.
Adjustment periods
A period ends when either:
500 L2 blocks elapse, or
The period's FCT target is hit
This dual-threshold system ensures rapid response to demand changes while maintaining predictable issuance.
Rate calculation
The rate adjusts based on which threshold triggered the period end.
Variable glossary:
old_rate
,new_rate
: FCT-wei per ETH-wei burnedtarget
: per-period FCT target (e.g., 100,000 FCT)minted
: actual FCT minted in periodblocks_elapsed
: blocks in period when target hit
Under-issuance (500 blocks reached first)
When the period times out before hitting the target:
if 500-block timeout:
if minted == 0:
new_rate = min(old_rate * 4, MAX_MINT_RATE)
else:
new_rate = old_rate × min(target / minted, 4)
new_rate = clamp(new_rate, MIN_MINT_RATE, MAX_MINT_RATE)
Capped at 4× the old rate to prevent extreme spikes.
Over-issuance (Target reached first)
When the target is minted in fewer than 500 blocks:
if target hit first:
new_rate = old_rate × max(blocks_elapsed / 500, 0.25)
new_rate = clamp(new_rate, MIN_MINT_RATE, MAX_MINT_RATE)
Capped at 0.25× the old rate to prevent extreme drops.
Examples
Assuming a target of 100,000 FCT per period and old_rate = 1,000,000,000,000,000 (FCT-wei/ETH-wei):
Moderate under-issuance: 80,000 FCT minted in 500 blocks
new_rate = old_rate × 1.25
Severe under-issuance: 25,000 FCT minted in 500 blocks
new_rate = old_rate × 4.0 (capped)
Moderate over-issuance: Target hit in 450 blocks
new_rate = old_rate × 0.9
Severe over-issuance: Target hit in 50 blocks
new_rate = old_rate × 0.25 (capped)
Calldata gas calculation
Following Ethereum's EIP-7623 gas pricing:
L1 contract-initiated transactions
Facet transactions created by L1 smart contracts use event data instead of calldata:
This gas is multiplied by the block's base fee to get ETH burned, then by the mint rate to get FCT minted (for contract-initiated Facet tx only).
Protocol constants
ADJUSTMENT_PERIOD_TARGET_LENGTH
500 blocks
Period length target
MAX_RATE_ADJUSTMENT_UP_FACTOR
4×
Maximum rate increase
MAX_RATE_ADJUSTMENT_DOWN_FACTOR
0.25×
Maximum rate decrease
MAX_MINT_RATE
2**128 - 1 ≈ 3.4 × 10³⁸
Global maximum rate
MIN_MINT_RATE
1
Global minimum rate
State variables
The protocol tracks:
fct_mint_rate
: Current issuance rate (FCT-wei/ETH-wei)current_period_start_block
: L2 block when period begancurrent_period_fct_minted
: FCT minted so far this periodtotal_fct_minted
: Cumulative supply
These values update with each L1 block in setL1BlockValuesEcotone()
.
Fixed-point arithmetic
All fractional calculations use 18-decimal fixed-point arithmetic and truncate toward zero. This ensures deterministic results across all implementations.
Appendix: Halving schedule
Assuming the protocol reaches each halving on schedule (yearly):
1
-
50%
50%
2
1st
25%
75%
3
2nd
12.5%
87.5%
4
3rd
6.25%
93.75%
5
4th
3.125%
96.875%
6
5th
1.5625%
98.4375%
The total supply asymptotically approaches but never exceeds the cap.
Last updated