Skip to content

Rewards & staking

The retention economy wrapped around the trading core. It shares bz-backend but has its own contracts, its own crons and its own frontend at rewards.blazpay.com.

This is the most under-documented part of the platform by volume of code.

BlazPoints

The off-chain reward currency. Earned from staking, quests, streaks and games; spent in the marketplace. Balances live in models/pointsModel.js.

Claims are off-chain by design

Rocket reward claims are processed entirely off-chain — zero gas, instant balance update. The NFT ownership and staking state are on-chain; the points accrual is a backend calculation. That is what makes daily claiming viable at small amounts.

BlazRocket

Stake Rocket NFTs to earn BlazPoints daily.

Contracts: contract-deployment/contracts/StakeRocketV3.sol, contracts/modular/BlazRocketNFT.sol
Routes: /api/rocket/* · Models: rocketModel.js, rocketUpgradeCostModel.js

Earning mechanics

MechanicEffect
Base rateSet by rocket level
Upgrade bonusesWings, Skin, Weapons, Thrusters, Shield — each adds to the hourly rate
Streak multiplierUp to 2.8× at a 30-day streak
Lucky drops3×–6× multiplier events
Daily capPer-rocket ceiling; earning stops when hit
Claim cooldownEnforced per rocket

Status payload

GET /api/rocket/status returns, per staked rocket: tokenId, level, isStaked, stakedAt, lastClaimTime, streakDays, longestStreak, plus the financial and timer fields:

FieldMeaning
claimablePointsAvailable to claim right now
currentRatePerHourBase plus all active bonuses
maxDailyCapCeiling per day
remainingDailyCapHeadroom left today
nextClaimAvailableInMinutes until claimable; 0 means ready
rocketImage, upgradeImagesRendered assets per upgrade slot

Frontend rule: enable the claim button when nextClaimAvailableIn === 0 and claimablePoints > 0; otherwise show the countdown.

Claiming

POST /api/rocket/claim with { rocketId }. There is also a "basic" claim variant. Both are off-chain.

Documentation in-repo: bz-backend/ROCKET_REWARDS_README.md, ROCKET_CLAIMING_PROCESS_README.md, ROCKET_UPGRADE_GUIDE_ANNOUNCEMENT.md.

BlazBob

Mint and stake BlazBob NFTs across 11 tiers for continuous point generation.

Contracts: contracts/modular/BlazBobNFT.sol, contracts/modular/BzNFTStaking.sol
Chains: Arbitrum and Hemi
Routes: /api/blazbob/* · Model: blazBobModel.js

Higher tiers generate more points. Per-chain guides live at bz-backend/blazbob_staking_guide_hemi.md and blazbob_unstaking_guide_hemi.md.

Deployments exist per chain under contract-deployment/contracts/{arbitrum_sepolia,avax,hemi,qubetics,soneium}/modular/, which is how a chain-specific NFT rollout is structured.

Rewards hub

Contract: contracts/RewardsHub.sol · Routes: /api/rewards/*, /api/reward/*

The aggregation surface: total points, claim history, and the reward catalogue. A revamp plan exists at bz-backend/REWARDS_HUB_REVAMP_PLAN_2026-06.md.

Supporting models: nftRewardsModel.js, ClaimRewards.js, claimModel.js, autoClaimModel.js, autoClaimLogModel.js, weeklyDropModel.js.

services/autoClaim.js plus claim-cron.js handle automated claiming. Note that cronClaimRewards.start() is commented out in index.js — automated claiming is not currently running.

Quests, tasks and streaks

FeatureModelRoute
Daily tasksdailyTask.js/api/task
MissionsmissionModel.js, userMissionProgressModel.js
StreaksuserStreakModel.js
AttendanceattendanceModel.js
Daily rankingdailyRankingModel.js
LeaderboardleaderboardModel.js/api/…/leaderboard
Daily updatesdailyUpdateModel.js/api/daily-updates

services/attendanceCron.js runs the attendance/streak roll-up. services/discordBoosterCron.js handles Discord booster bonuses. Both are started in index.js.

Bridge-usage bonus campaigns — reward users for bridging through a specific corridor.

Models: lightLinkModel.js, lightLinkRewardModel.js, lightLinkBuyNFT.js
Routes: /api/lightLink, /api/lightLinkReward

Referrals

Referral tracking with bonus payouts, on userModel.js plus sendPatternModel.js.

Staking (token, not NFT)

Separate from NFT staking — chain-specific token staking pools:

ModelChain
bnbStakings.jsBSC
polygonStakings.jsPolygon
mantaStakings.jsManta
heklaStakings.jsTaiko Hekla
holeskyStakings.jsHolesky
stakingData.js, stakingInfo.jsGeneric

Route: /api/staking · ABIs: utils/abi/{stake.json, stakeStone.json} and per-chain directories (arbitrum, binance, holesky, manta, taiko, viction, zkfair).

Entry pass

A gated access NFT — models/entryPassModel.js, utils/abi/entrypass.json, route /api/entryPass. Linked from the app nav as https://blazpay.com/entry-pass.

Blazpay usernames

Human-readable addresses. A user registers alice and can receive at alice.blazpay instead of 42 hex characters. Resolution happens in the SEND_TOKEN intent path and in the wallet card lookup, backed by userModel.js.

Under the hood

ConcernWhere
Contractsbz-backend/contract-deployment/contracts/StakeRocketV3.sol, RewardsHub.sol, NFTStaking.sol, modular/*
Per-chain deploymentscontracts/{arbitrum_sepolia,avax,hemi,qubetics,soneium}/
Deprecated versionscontracts/deprecated/ — do not extend
Cronsservices/{attendanceCron,discordBoosterCron,autoClaim,claim-cron}.js
Business auditbz-backend/MODULE_BUSINESS_AUDIT_2026-06.md

Known limits

  • claim-cron is disabled. cronClaimRewards.start() is commented out in index.js, so automated reward claiming is not running.
  • Points are off-chain. A BlazPoints balance is a database number. That is the right trade-off for gasless daily claiming, but it means the platform is trusted for the ledger.
  • Contract sprawl. The same NFT and staking contracts are duplicated per chain under separate directories rather than parameterised. Adding a chain means copying a directory.
  • contracts/deprecated/ contains eight superseded contracts. Some are still referenced by old records; do not delete without checking.
  • This layer is documented mostly in ad-hoc markdown files inside bz-backend, not here. Those files are the authority for endpoint-level detail.

Internal + developer documentation. Usage figures are point-in-time snapshots — re-verify before publishing them.