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.
Three components
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;
}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.
Same arithmetic the node uses in CalculateInuFee. Nothing is sent anywhere.
Fragmented wallets need more.
Batching is cheaper per head.
| component | DINU |
|---|---|
| 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 |
| Total | 0.00638960 |
| approx. USD | $0.000267 |
| per recipient | 0.00638960 |
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.
Cost of every operation
Typical case: two inputs, one recipient, one change output, standard priority, DINU at $0.0418.
| operation | vbytes | CU | fee (DINU) | USD | notes |
|---|---|---|---|---|---|
| Native DINU send | 374 | 0 | 0.00523600 | $0.000219 | identical to Dogecoin |
| Asset transfer | 454 | 1,200 | 0.00669200 | $0.000280 | OP_SPLXFER |
| Mint to an account | 454 | 3,400 | 0.00730800 | $0.000305 | authority signature checked |
| Create a new mint | 454 | 3,400 | 1.00730800 | $0.042105 | includes 1.00 refundable rent |
| Burn | 420 | 900 | 0.00840000 | $0.000351 | supply recomputed from UTXO set |
| Revoke mint authority | 420 | 2,100 | 0.00644000 | $0.000269 | irreversible |
| Freeze a token account | 420 | 2,100 | 0.00644000 | $0.000269 | requires a live freeze authority |
| Close account (rent refund) | 340 | 600 | −0.99392000 | −$0.041546 | net credit after rent returns |
| Airdrop, 900 recipients | 66,904 | 1,080,000 | 1.24685600 | $0.052118 | 0.00138 DINU per head |
| Consolidate 400 inputs | 59,284 | 1,200 | 0.83333600 | $0.034833 | do this before fees rise, not after |
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.
| recipient | share | DINU |
|---|---|---|
| Burned to an unspendable output | 50% | 0.00334600 |
| Miner who found the settlement block | 30% | 0.00200760 |
| Validators who voted the slot to root | 18% | 0.00120456 |
| Protocol maintenance multisig | 2% | 0.00013384 |
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");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.
| condition | what is saturated | effect on native sends | effect on asset transfers | what to do |
|---|---|---|---|---|
| Block full, compute idle | 1 MB settlement block | delayed | unaffected | Raise priority only if you are moving DINU. |
| Compute full, block idle | 4.19M CU per block | unaffected | delayed | Batch recipients; one tx amortises the overhead. |
| Both saturated | everything | delayed | delayed | Wait. Urgent pricing during a global backlog is a tax on impatience. |
| Finality stalled, planes idle | validator quorum | confirms | confirms | Transactions land; they just are not rooted. Fees do not change. |
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.