Protocol mechanics
Mining
One miner, price decay, emission, and where every payment goes.
Loading…
Browse documentation
Protocol mechanics
One miner, price decay, emission, and where every payment goes.
Loading…
Protocol mechanics
One miner, price decay, emission, and where every payment goes.
The Mine creates ongoing Coin supply and generates the treasury's USDG. Launchpad issues the configured genesis seed during setup, then permanently hands mint authority to Mine. The FundController owner can redirect future mining revenue; this does not recover existing buffers.
Each Coin has exactly one Mine. Whoever takes it over becomes the current miner until someone else takes it over. The contract stores the Mine's one current miner, price auction, emission rate and message in its Slot struct:
struct Slot {
uint256 epochId; // increments on every takeover
uint256 initialPrice; // starting price of the current auction, raw USDG
uint256 auctionStartedAt; // when the current auction and tenure began
uint256 tps; // tenure-locked emission rate, raw Coin per second
address miner; // the current miner, or zero
string message; // latest message stored with the tenure
}The Mine's takeover price is a Dutch auction that never ends. Its takeover price falls in a straight line from the auction's starting price to zero over one hour:
elapsed = now - auctionStartedAt
price = elapsed >= 1 hour ? 0 : initialPrice - floor(initialPrice * elapsed / 1 hour)When someone takes over the Mine at price P, the next auction starts immediately at twice what they paid, clamped to the fixed bounds:
next initialPrice = clamp(P * 2, 1 USDG, 2^192 - 1)If the price decays to zero, anyone can take over the Mine for free and the next auction starts at the 1 USDG minimum. There is no reserve price at takeover time; the minimum applies only to the next starting price. Before anyone has taken over a new Mine, its price also starts at that minimum.
See Emissions and supply for the full schedule, interactive charts and tenure examples.
The current miner earns the complete emission rate. The rate is fixed for that tenure when they take over the Mine:
halvings = floor((now - startTime) / HALVING_PERIOD)
tenure tps = max(INITIAL_TPS >> halvings, TAIL_TPS)| Constant | Value |
|---|---|
INITIAL_TPS | Launch-selected initial rate, app default 64 Coin/s |
HALVING_PERIOD | Launch-selected interval, app default 69 days |
TAIL_TPS | Launch-selected floor for new tenures, app default 1 Coin/s |
The prospective rate halves at each completed boundary after the Mine's startTime. A new tenure receives the rate in effect when it begins, while an existing miner retains the rate assigned at takeover until someone else takes over the Mine.
Emission is settled when someone takes over the Mine: the outgoing miner's complete accrual is minted to them. Between replacements, pendingEmission() calculates that unminted amount directly from the tenure start and its fixed rate. effectiveTotalSupply() adds it to the minted Coin supply so settlement timing cannot change withdrawal shares.
Launch preset. The app uses these values unless the creator selects another bounded schedule. Check the constants reference and read the deployed Mine to confirm its constants.
function mine(
address miner,
uint256 expectedEpochId,
uint256 deadline,
uint256 maximumPayment,
string message
) external returns (uint256 paymentAmount);miner receives the tenure. They can differ.expectedEpochId must equal the current epoch, so a takeover that lands after someone else's fails instead of accepting changed state.deadline is the latest timestamp at which the call may execute; execution exactly at the deadline is allowed.maximumPayment caps the raw USDG the caller will pay.message is at most 280 raw bytes. It is stored with the current tenure and emitted in Mined; a later takeover replaces the stored value while event history remains.The outgoing tenure is settled before the incoming rate and message are stored. The previous miner's accrued Coin is minted to them and their share of the payment becomes a pull claim. A zero-price takeover moves no USDG.
The outgoing miner's share is fixed at 80%. The FundController owner sets the Coin's creator fee and the Launchpad owner sets the global protocol fee independently. Each rate is 1–200 basis points of the complete payment (0.01%–2%). The creator rate is chosen at launch (the app's default is 50 basis points, 0.5%) and the protocol rate starts at 50:
miner = previous holder exists ? floor(P * 8,000 / 10,000) : 0 (80%)
creator = creator recipient set ? floor(P * creatorBps / 10,000) : 0
protocol = protocol recipient set ? floor(P * protocolBps / 10,000) : 0
router = P - miner - creator - protocolThe Mine's configured revenue destination receives the exhaustive remainder, including every rounding unit and disabled share. At the default rate and P = 1,000,000 raw units (1 USDG) with both fee recipients set, a takeover from a current miner allocates 800,000 / 5,000 / 5,000 / 190,000 to miner, creator, protocol and router; the first takeover, with no current miner, allocates 0 / 5,000 / 5,000 / 990,000. Below P = 200, each default fee rounds to zero and remains in the router share. At P = 200 or 201, each enabled fee is one raw USDG unit.
At the defaults with both recipients set, the split is 80% miner, 19% router, 0.5% creator and 0.5% protocol. The first takeover, with no current miner, sends 99% to the router instead. At both maximum rates, each fee is 2%, leaving 16% for revenue with an outgoing miner or 96% without one, before rounding. At the minimum, each fee is 0.01% and a takeover from a current miner sends 19.98% to the router, before rounding. With an outgoing miner, the combined fees range from 0.1% to 20% of the 20% revenue pool before fees, with a default of 5%. These are fees on payments, not annual fees on treasury assets.
Miner, creator and protocol amounts accrue into one pull-payment balance per beneficiary. Anyone can call claimPayment(account), but payment always goes to the recorded beneficiary. The app takes over the Mine through the Periphery's mine, which charges only the current price and then tries to pay the outgoing miner's claim; if that claim fails, it stays on the Mine. Fee-rate and recipient changes affect only future accruals. For every payment, miner + creator + protocol + router == payment exactly, and the Mine's USDG balance equals totalClaimablePayments unless someone donates USDG to it.
Older deployments may retain a 1% ceiling. The app reads deployed limits before offering higher rates; a source release does not change existing contract settings.
On every nonzero payment the Mine snapshots its creator fee, the Launchpad’s protocolFeeBps() and protocolFeeRecipient(), and the current revenue destination. The FundController owner sets the Coin’s creator rate; the Launchpad owner sets the global protocol rate. Each rate is independently bounded to 1–200 bps; the protocol rate starts at 50 bps and the creator rate is set at launch. A zero recipient disables that claim and leaves its share in the router remainder. Changes affect future accruals only. A zero-price replacement does not query Launchpad.
The Mine is owned by the FundController, whose owner can change the creator fee recipient, creator fee rate, and future revenue destination. The outgoing miner's 80% share, decay period, multiplier and emission schedule have no setters. Mint authority is locked to the Mine inside the Coin.