Staking MaryJaneCoin

Pure Proof-of-Stake after block 500. Zero inflation. Validators earn transaction fees only — no dilution, ever.

How rewards work (or don't)

Most PoS chains pay validators with newly-minted coins. MaryJaneCoin doesn't. The entire 1 billion MARYJ supply is minted at block 1 and held in the bridge escrow. After that:

// PoW reward (only block 1 mints anything)
int64_t GetProofOfWorkReward(int64_t nFees, int nHeight) {
    int64_t nSubsidy = 0;
    if (nHeight == 1)
        nSubsidy = 1000000000 * COIN;   // entire supply
    return nSubsidy + nFees;
}

// PoS reward (zero inflation forever)
int64_t GetProofOfStakeReward(...) {
    int64_t nSubsidy = 0;
    return nSubsidy + nFees;
}

Validators are paid by transaction fees only. Min fee is 0.420 MARYJ per TX. As chain usage grows, fee revenue grows. Mild deflationary pressure forms over time as fees accumulate.

Stake parameters

ParameterValue
Minimum stake age15 minutes
Maximum stake age25 days
Coinbase maturity10 blocks
Target block time260 seconds (4m 20s)
Auto-combine threshold250 MARYJ
Hash drift45 seconds
Clock drift allowance60 seconds

Step-by-step

  1. Get coins into the transparent pool

    After block 2,000, only transparent UTXOs can stake. If you've been spending, your coins are in the shielded pool — peg them out first:

    $ MaryJaneCoind getpoolbalances
    $ MaryJaneCoind pegout 5000   # move 5000 → transparent
  2. Make sure your wallet is unlocked for staking

    $ MaryJaneCoind walletpassphrase "your-passphrase" 99999999 true
    # the trailing `true` = unlock for staking only (cannot send TXs)
  3. Confirm staking is active

    $ MaryJaneCoind getstakinginfo
    {
      "enabled": true,
      "staking": true,
      "weight": 5000,
      "netstakeweight": 25000000,
      "expectedtime": 13520
    }

    expectedtime is in seconds — the network's estimate for how long until your next stake hit.

  4. Watch for stake hits

    $ tail -f ~/.MaryJaneCoin/debug.log | grep -i "CreateNewBlock\|stake hit"
  5. Stay online

    Staking only works while the daemon is running. Run it on a low-power always-on box (Pi, VPS, idle desktop). Combine with Tor if you want network privacy too.

Stake kernel

hash = SHA256d(nStakeModifier + blockFrom.nTime + txPrev.offset
              + txPrev.nTime + txPrev.vout.n + nTimeTx)

valid if: hash < bnTargetPerCoinDay × nCoinDayWeight

Where nCoinDayWeight = nValueIn × nTimeWeight / COIN / 86400. Larger and older UTXOs win blocks proportionally more often. The kernel can only see transparent UTXOs, so your shielded spending pool is invisible to the staking process.

Zero-reward fix The original codebase rejected stake blocks with zero rewards. We patched nReward <= 0 to nReward < 0 so the chain produces valid PoS blocks even with an empty mempool. The network never stalls.