Appearance
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
| Mechanic | Effect |
|---|---|
| Base rate | Set by rocket level |
| Upgrade bonuses | Wings, Skin, Weapons, Thrusters, Shield — each adds to the hourly rate |
| Streak multiplier | Up to 2.8× at a 30-day streak |
| Lucky drops | 3×–6× multiplier events |
| Daily cap | Per-rocket ceiling; earning stops when hit |
| Claim cooldown | Enforced 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:
| Field | Meaning |
|---|---|
claimablePoints | Available to claim right now |
currentRatePerHour | Base plus all active bonuses |
maxDailyCap | Ceiling per day |
remainingDailyCap | Headroom left today |
nextClaimAvailableIn | Minutes until claimable; 0 means ready |
rocketImage, upgradeImages | Rendered 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
| Feature | Model | Route |
|---|---|---|
| Daily tasks | dailyTask.js | /api/task |
| Missions | missionModel.js, userMissionProgressModel.js | — |
| Streaks | userStreakModel.js | — |
| Attendance | attendanceModel.js | — |
| Daily ranking | dailyRankingModel.js | — |
| Leaderboard | leaderboardModel.js | /api/…/leaderboard |
| Daily updates | dailyUpdateModel.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.
Light Link rewards
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:
| Model | Chain |
|---|---|
bnbStakings.js | BSC |
polygonStakings.js | Polygon |
mantaStakings.js | Manta |
heklaStakings.js | Taiko Hekla |
holeskyStakings.js | Holesky |
stakingData.js, stakingInfo.js | Generic |
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
| Concern | Where |
|---|---|
| Contracts | bz-backend/contract-deployment/contracts/ — StakeRocketV3.sol, RewardsHub.sol, NFTStaking.sol, modular/* |
| Per-chain deployments | contracts/{arbitrum_sepolia,avax,hemi,qubetics,soneium}/ |
| Deprecated versions | contracts/deprecated/ — do not extend |
| Crons | services/{attendanceCron,discordBoosterCron,autoClaim,claim-cron}.js |
| Business audit | bz-backend/MODULE_BUSINESS_AUDIT_2026-06.md |
Known limits
claim-cronis disabled.cronClaimRewards.start()is commented out inindex.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.