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
| Parameter | Value |
|---|---|
| Minimum stake age | 15 minutes |
| Maximum stake age | 25 days |
| Coinbase maturity | 10 blocks |
| Target block time | 260 seconds (4m 20s) |
| Auto-combine threshold | 250 MARYJ |
| Hash drift | 45 seconds |
| Clock drift allowance | 60 seconds |
Step-by-step
-
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 -
Make sure your wallet is unlocked for staking
$ MaryJaneCoind walletpassphrase "your-passphrase" 99999999 true # the trailing `true` = unlock for staking only (cannot send TXs) -
Confirm staking is active
$ MaryJaneCoind getstakinginfo { "enabled": true, "staking": true, "weight": 5000, "netstakeweight": 25000000, "expectedtime": 13520 }expectedtimeis in seconds — the network's estimate for how long until your next stake hit. -
Watch for stake hits
$ tail -f ~/.MaryJaneCoin/debug.log | grep -i "CreateNewBlock\|stake hit" -
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.
nReward <= 0 to nReward < 0 so the chain produces valid PoS blocks even with an empty mempool. The network never stalls.