FilOzone / FilOzone/filecoin-pay

Fee auction: dust-anchored reset converts fee pools at ~100% discount (observed on axlUSDC)

Open
#299 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Solidity
Stars
8
Forks
13
PR merge metrics
No merged PRs in 30d

Description

## Summary

On mainnet, 253.27 axlUSDC of accrued network fees were sold for 0.0000113 FIL in total across 8 auction claims. The cause is structural: after any claim, the next start price is 4x the decayed asking price at claim time, with an upper cap but no floor, so one claim on a long-idle auction anchors the price curve at dust and every later claim clears at dust regardless of how much value has accrued since. Known as "the firehose scenario" realized through one-time payments

## Mechanism

`burnForFees` computes the decayed ask, requires `msg.value >= ask`, burns the full `msg.value`, and sets the next start to `RESET_FACTOR` (4) x the ask, capped by `MAX_AUCTION_START_PRICE`, with no floor (FilecoinPayV1.sol ~1796-1817; curve in Dutch.sol, halving every 3.5 days, decays to literal zero). The reset never reads `msg.value`, so overpaying burns more FIL but cannot lift a dust-anchored curve. Recovery happens only through many rapid claims (4x per claim beats the halving when claims come less than a week apart), each of which also sells the pool at dust.

## What happened on chain

- axlUSDC: the first claim ever (2026-07-09, `0xbeefedda...`) cleared at ~1.9e-6 FIL for 0.65 axlUSDC after weeks of decay, anchoring the curve at dust. The ~253 axlUSDC of fees from the August one-time payments then landed on that dust curve, and `0x2153bc...` emptied the pool in 5 claims of 50.25 axlUSDC each within 67 minutes on 2026-08-18, at prices stepping exactly 4x (1.0e-8 to 2.6e-6 FIL): the reset ratchet observed live.
- USDFC entered the same dust state in January (claim at 4.1e-8 FIL on 2026-01-13) but recovered, because its fees flow continuously: frequent claims re-armed the curve 4x per claim (back to 4.6e-3 FIL by Feb 15, tracking value from March on).
- Both dust anchors were set by addresses other than the dominant claimer.
- Totals as of 2026-08-26: USDFC 41 claims, 63.30 FIL burned for 80.03 USDFC bought (pool includes ~66.7 USDFC of v1.2.x sybil-fee accruals); axlUSDC 8 claims, 0.0000113 FIL burned for 253.27 axlUSDC bought.

## Root cause

Modeling predates one-time payments. Fees then came only from rate-based rails, and since anyone can settle a rail, fee arrival was smooth; a burst was not possible. One-time payments deliver a fee lump in a single transaction, producing bursts we never modeled.

## Impact

1. Burn conversion: fees in a dust-anchored pool convert to ~zero burn (observed ~100% discount on axlUSDC).
2. FIP-0118 (Solstice) price feed: FIL-denominated Filecoin Pay volume is priced by qualifying fee-auction prints, with no third-party oracle. Dust prints are already filtered by `MIN_LOT` and `PRICE_BAND` (FIP-0118 section 2.3 names exactly this dust-lot failure), so the residual risk is print starvation: a dust-anchored auction produces no qualifying prints, and each FIL settlement is counted only when a qualifying print clears after it. A persistent dust state leaves FIL volume unpriced and understates AggregatedFPV exactly when FIL volume exists.

## Fix directions (FPv2)

- Make the proportion, not the price, the diminishing quantity, so the ask scales with pool value; combine with partial takes that must "bite at least half the plate". Open trade-off: today's design guarantees claim acceptance (the price only falls between claims), while a proportion-based ask can fail if fees land right before a claim transaction.
- Minimal alternative: floor the reset, `startPrice = max(RESET_FACTOR x decayed ask, FIRST_AUCTION_START_PRICE)`. No reserve on the clearing price: pools worth less than a reserve would never clear and fees would strand.

Contributor guide

No contributing guide indexed for this repository

Research direction

Read FilecoinPayV1.sol around lines 1796-1817 and the auction curve in Dutch.sol, then trace how burnForFees resets the next start price after one-time payment fee bursts. Compare the proposed FPv2 proportion-based and reset-floor directions against the dust-anchored axlUSDC scenario. Done means preventing near-zero fee conversion while preserving valid claims and qualifying FIP-0118 prints.

Written by the indexing model from the issue text.

Assessment

Tech stack
solidity
Domain
blockchain, payments
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.