Doge Inucore v1.14.7-inu
Doge Inu on X
fee schedule · effective from height 5,301,500

What a transaction costs, and who ends up with the money

Doge Inu fees have three components and one refundable deposit. Two of the components come straight from Dogecoin's relay policy. The third is new, because an asset operation consumes validator CPU in a way a bare payment does not. This page is the whole model — there is no fourth component hidden somewhere.

median fee, last 1k blocks
0.0104 Ð
median fee in USD
$0.000435
relay floor
1,000 koinu/vB
compute unit price
2 koinu/CU
burned
50%
mint rent
1.00 Ð
the model

Three components

size × 1,000 koinu/vB
Pays for the bytes your transaction occupies in a 1 MB block. Unchanged from Dogecoin relay policy. An asset-bearing output is 74 vbytes against a native output's 34, so moving tokens costs roughly twice as much per output as moving DINU.
compute × 2 koinu/CU
Pays for the work the asset plane does. Metered per opcode, summed across the transaction, and capped at 200,000 CU per transaction and 4,194,304 CU per block. A native-only transaction consumes zero compute units and pays nothing here.
priority multiplier
Optional. Multiplies the other two components to buy position in the slot queue. Economy is ×1 and will land within three to five blocks; urgent is ×3.2 and is only worth paying during a genuine mempool backlog.
mint rent · 1.00 DINU
Not a fee. A dust-exempt output held against the mint account so that abandoned mints do not bloat the UTXO set for free. Returned in full to whoever closes the account.
src/policy/fees.cppthe authoritative implementation
CAmount CalculateInuFee(const CTransaction& tx, const CCoinsViewCache& view,
                        FeePriority priority)
{
    // Component 1 — bytes. Witness discount applies exactly as upstream.
    const int64_t nVirtualSize = GetVirtualTransactionSize(tx);
    CAmount nSizeFee = nVirtualSize * MIN_RELAY_KOINU_PER_VBYTE;

    // Component 2 — compute. Zero for a transaction that touches no assets,
    // which keeps ordinary Dogecoin payments priced exactly as they were.
    int64_t nComputeUnits = 0;
    for (const CTxOut& out : tx.vout) {
        if (out.IsNativeOnly()) continue;
        nComputeUnits += ComputeUnitsForScript(out.scriptPubKey);
    }
    if (nComputeUnits > MAX_TX_COMPUTE_UNITS)
        throw std::runtime_error("transaction exceeds per-tx compute budget");

    CAmount nComputeFee = nComputeUnits * KOINU_PER_COMPUTE_UNIT;

    // Component 3 — priority. A pure multiplier, so it cannot be used to
    // pay below the relay floor.
    const CAmount nSubtotal = nSizeFee + nComputeFee;
    const CAmount nPriorityFee = (nSubtotal * PriorityBasisPoints(priority)) / 10000;

    // Rent is collected separately and is not a fee; it is refundable.
    return nSubtotal + nPriorityFee;
}
work it out

Fee calculator

Change the inputs and watch which component dominates. For a single transfer it is almost all size; for a 900-recipient airdrop it is almost all compute.

Estimate a fee

Same arithmetic the node uses in CalculateInuFee. Nothing is sent anywhere.

Fragmented wallets need more.

Batching is cheaper per head.

Fee breakdown
componentDINU
Size component
454 vbytes × 1,000 koinu
0.00454000
Compute component
1,200 CU × 2 koinu
0.00002400
Priority component
Standard (×1.4)
0.00182560
Mint rent deposit
returned in full on CloseAccount
0.00000000
Total0.00638960
approx. USD$0.000267
per recipient0.00638960
batching

Send to 100 people in one transaction and the 10-vbyte overhead and the input cost are shared across all of them. One transaction per recipient pays that cost 100 times over.

reference

Cost of every operation

Typical case: two inputs, one recipient, one change output, standard priority, DINU at $0.0418.

operationvbytesCUfee (DINU)USDnotes
Native DINU send37400.00523600$0.000219identical to Dogecoin
Asset transfer4541,2000.00669200$0.000280OP_SPLXFER
Mint to an account4543,4000.00730800$0.000305authority signature checked
Create a new mint4543,4001.00730800$0.042105includes 1.00 refundable rent
Burn4209000.00840000$0.000351supply recomputed from UTXO set
Revoke mint authority4202,1000.00644000$0.000269irreversible
Freeze a token account4202,1000.00644000$0.000269requires a live freeze authority
Close account (rent refund)340600−0.99392000−$0.041546net credit after rent returns
Airdrop, 900 recipients66,9041,080,0001.24685600$0.0521180.00138 DINU per head
Consolidate 400 inputs59,2841,2000.83333600$0.034833do this before fees rise, not after
where it goes

Half of every fee is destroyed

Dogecoin pays the whole fee to the miner. We split it, because the fee now compensates two different parties doing two different jobs, and because a chain that mints 10,000 DINU per block forever benefits from a sink.

The burn is unconditional and enforced in ConnectBlock. A miner cannot claim it by constructing a coinbase that pays themselves the full fee — the block is invalid if the coinbase output exceeds subsidy plus the miner's share.

At current volume the burn removes roughly 61,000 DINU per day against 14.4 million minted, so this is not a deflationary mechanism and we are not going to pretend it is. It is a spam disincentive that happens to be denominated in supply.

Validator commission is set per-operator and defaults to 5%. It is taken out of the validator share, not added on top. See the validator docs.

Distribution of a 0.00669200 DINU asset transfer fee
recipientshareDINU
Burned to an unspendable output50%0.00334600
Miner who found the settlement block30%0.00200760
Validators who voted the slot to root18%0.00120456
Protocol maintenance multisig2%0.00013384
src/validation.cppthe burn is a consensus rule
const CAmount nFees      = view.GetValueIn(block) - block.GetValueOut();
const CAmount nBurn      = nFees / 2;
const CAmount nValidator = (nFees * 18) / 100;
const CAmount nTreasury  = (nFees *  2) / 100;
const CAmount nMinerMax  = nFees - nBurn - nValidator - nTreasury;

if (block.vtx[0]->GetValueOut() > GetBlockSubsidy(pindex->nHeight) + nMinerMax)
    return state.DoS(100, false, REJECT_INVALID, "bad-cb-amount",
                     false, "coinbase claims the burn share");
under load

What happens when the chain is busy

The two planes congest independently, which is the single most confusing thing about fees on this chain. It is worth understanding before you pay for urgency you do not need.

conditionwhat is saturatedeffect on native sendseffect on asset transferswhat to do
Block full, compute idle1 MB settlement blockdelayedunaffectedRaise priority only if you are moving DINU.
Compute full, block idle4.19M CU per blockunaffecteddelayedBatch recipients; one tx amortises the overhead.
Both saturatedeverythingdelayeddelayedWait. Urgent pricing during a global backlog is a tax on impatience.
Finality stalled, planes idlevalidator quorumconfirmsconfirmsTransactions land; they just are not rooted. Fees do not change.
fee estimation is not a promise

estimatesmartfee extrapolates from the last 25 blocks. If demand steps up sharply, the estimate is stale by definition and your transaction sits. The node will never spend more than you signed for, so a stuck transaction is stuck, not expensive. Use bumpfee to replace it.