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:

FCT minted=ETH burned for data×mint rate\text{FCT minted} = \text{ETH burned for data} \times \text{mint rate}

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:

  1. 500 L2 blocks elapse, or

  2. 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 burned

  • target: per-period FCT target (e.g., 100,000 FCT)

  • minted: actual FCT minted in period

  • blocks_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):

  1. Moderate under-issuance: 80,000 FCT minted in 500 blocks

    • new_rate = old_rate × 1.25

  2. Severe under-issuance: 25,000 FCT minted in 500 blocks

    • new_rate = old_rate × 4.0 (capped)

  3. Moderate over-issuance: Target hit in 450 blocks

    • new_rate = old_rate × 0.9

  4. 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:

Data Gas=(Zero Bytes×10)+(Non-Zero Bytes×40)\text{Data Gas} = (\text{Zero Bytes} \times 10) + (\text{Non-Zero Bytes} \times 40)

L1 contract-initiated transactions

Facet transactions created by L1 smart contracts use event data instead of calldata:

Event Data Gas=Data Bytes×8\text{Event Data Gas} = \text{Data Bytes} \times 8

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

Constant
Value
Description

ADJUSTMENT_PERIOD_TARGET_LENGTH

500 blocks

Period length target

MAX_RATE_ADJUSTMENT_UP_FACTOR

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 began

  • current_period_fct_minted: FCT minted so far this period

  • total_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):

Year
Halving
Supply Minted (% of Total)
Cumulative Supply (% of Total)

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