Tower Miner 爬塔矿工 Tower Miner
01摘要Abstract
Tower Miner 是一个完全运行在链上的塔层收藏游戏。塔共 100 层,每层 20 个席位,席位由 ERC-721 代币表示。玩家只能从「最底层尚未售罄的那一层」买入席位,越往上价格越高,每层比下一层贵 5%。 Tower Miner is a fully on-chain tower collectible game: 100 layers, 20 seats each, every seat an ERC-721 token. Players can only mint at the lowest layer that is not sold out; each layer costs 5% more than the one below.
每一笔买入的收入被拆成四份:60% 进项目金库、25% 分给该层已持有席位的人、10% 进赛季奖池、5% 给推荐人(无推荐人时并入奖池)。持有席位的人不需要做任何操作,分红按代币累加,随时可领。 Every purchase splits 60% to treasury, 25% to holders of that layer, 10% to the season pool, 5% to the referrer (folded into the pool when absent). Dividends accrue per token and can be claimed anytime.
两张同层席位可以合成一张上一层的席位,销毁两张、新增一张,总供应净减少 1。合成费为上一层价格的 30%,全部进入金库。 Two seats on the same layer can be merged into one seat on the layer above: two are burned, one is created, net supply −1. The fee is 30% of the upper layer's price and goes entirely to the treasury.
02设计目标与取舍Design Goals & Trade-offs
2.1 三条硬性目标2.1 Three hard goals
| 目标Goal | 实现方式Implementation | 代价Cost |
|---|---|---|
| 可验证的稀缺Verifiable scarcity | 层数 100、席位 20 写死在合约常量里,不可增发、不可改价100 layers / 20 seats as constants; no supply inflation, no price changes | 塔满即结束,没有「第二期」Tower ends when full; no further issuance |
| 可兑现的分红Claimable dividends | 25% 收入按席位均分,链上累加器,随时领取25% split per seat via an on-chain accumulator | 分红来自新买入,不是外部收益Dividends come from new purchases, not external yield |
| 极简信任面Minimal trust surface | 单合约、无代理、无外部依赖、图片链上生成Single contract, no proxy, no external deps, on-chain art | 后期无法升级逻辑Logic cannot be upgraded later |
2.2 明确不做什么2.2 What we deliberately skip
- 不发代币。没有 TOWER 代币,没有质押挖矿,没有通胀排放。所有价值流转都是 BNB 本体。No token. No TOWER token, no farming emissions; all value flows in native BNB.
- 不做随机。没有盲盒、没有概率、没有「稀有度抽奖」。每张卡的价值只由层数决定。No randomness. No blind boxes or rarity rolls; value is purely a function of layer.
- 不做托管。合约不持有用户 NFT,不提供「存入生息」。分红是领取制,不是自动复投。No custody. The contract never holds user NFTs; dividends are pull-based.
- 不做可升级代理。宁可接受「改不了」,也不留后门。No upgradeable proxy. Immutability over flexibility.
03协议结构Protocol Architecture
整个系统只有一个合约 TowerMiner.sol,继承 OpenZeppelin 的 ERC721、ERC2981、Ownable。前端是纯静态页面,通过 RPC 只读调用 + 钱包签名写入,不需要后端服务。
One contract (TowerMiner.sol) extending OpenZeppelin ERC721, ERC2981 and Ownable. The frontend is a static page using read-only RPC plus wallet signing; no backend.
3.1 状态变量3.1 State
| 变量Variable | 类型Type | 含义Meaning |
|---|---|---|
LAYERS / SEATS | uint8 | 100 / 20,编译期常量100 / 20, compile-time constants |
priceOfLayer[101] | uint256 | 每层单价(wei),构造时一次写入,之后只读Per-layer price in wei, written once in constructor |
mintedInLayer[101] | uint256 | 每层已售席位数,上限 20Seats sold per layer, capped at 20 |
layerOf[tokenId] | uint8 | 代币所在层Layer of each token |
dividendPerToken[layer] | uint256 | 该层每个席位的累计分红累加器Cumulative dividend per seat for the layer |
claimedOf[tokenId] | uint256 | 该代币已记账的累加器快照Accumulator snapshot already accounted for |
seasonPool | uint256 | 赛季奖池余额Season pool balance |
totalDividendIn / Out | uint256 | 累计应发 / 已发分红,用于负债校验Cumulative dividend accrued / paid, used for liability checks |
topToken[10] / topLayer[10] | uint256[10]/uint8[10] | 层高排行榜(前 10)Top-10 leaderboard by layer |
_owned[user] | uint256[] | 按地址索引的持仓列表,供前端与 claimAll 使用Per-address holdings, used by UI and claimAll |
3.2 对外接口3.2 External interface
| 函数Function | 权限Access | 作用Purpose | 费用Cost |
|---|---|---|---|
mint(referrer) | 任何人Anyone | 在最底层可售层买入 1 席,referrer 可填 0x0Buy one seat at the current layer |
该层单价Layer price |
merge(a, b) | 两张卡的持有人Owner of both | 同层两张合成上一层一张Merge two same-layer seats into one above | 上层价 × 30%30% of upper price |
claim(tokenId) | 持有人Owner | 领取单张卡的待领分红Claim dividends of one token | 仅 gasGas only |
claimAll() | 任何人Anyone | 遍历自己全部持仓逐张领取Claim across all holdings | 仅 gasGas only |
setTreasury / setBaseURI | ownerowner | 更改金库地址 / 更改图片外部前缀Change treasury or external art prefix | — |
awardSeason(winners, amounts) | ownerowner | 赛季结算,总额不得超过 seasonPoolSeason payout, capped by seasonPool |
来自奖池From pool |
sweep() | ownerowner | 扫走零头,公式内扣除全部负债Sweep dust after subtracting liabilities | — |
3.3 只读接口3.3 Read-only views
currentLayer()— 返回当前可买入的层;返回 0 表示整塔售罄。Current mintable layer; 0 means sold out.priceOfLayer(l)/seatsLeft(l)— 单层价格与剩余席位。Layer price and remaining seats.layerStats()— 一次性返回 100 层的已售数与价格,前端只需 1 次 RPC。All 100 layers in one call.pending(id)— 单张卡当前可领分红(卡已销毁则返回 0)。Claimable dividend for a token (0 if burned).tokensOf(user)/totalMinted()/getTop()— 持仓、总发行量、排行榜。Holdings, total supply, leaderboard.
3.4 事件3.4 Events
| 事件Event | 字段Fields |
|---|---|
Minted | user, tokenId, layer, price, referrer |
Merged | user, burnedA, burnedB, newTokenId, newLayer, fee |
DividendClaimed | user, tokenId, amount |
SeasonAwarded | amount, winners |
04定价曲线Pricing Curve
价格在合约构造时一次性算出并永久固定,之后没有任何函数可以修改。递推式为: Prices are computed once in the constructor and are immutable afterwards:
使用整数运算逐层递推(而非浮点幂运算),保证结果在链上完全可复现,也避免不同语言浮点误差。取整方向为向下截断,误差每层不超过 1 wei,对最终价格的影响可忽略。 Integer recurrence (not floating exponentiation) guarantees exact reproducibility on-chain; truncation error is at most 1 wei per step.
4.1 关键层价格4.1 Reference prices
| 层Layer | 单价 (BNB)Price (BNB) | 层Layer | 单价 (BNB)Price (BNB) |
|---|---|---|---|
| L1 | 0.005000 | L60 | 0.088949 |
| L10 | 0.007757 | L70 | 0.144873 |
| L20 | 0.012635 | L80 | 0.235965 |
| L30 | 0.020580 | L90 | 0.384378 |
| L40 | 0.033524 | L100 | 0.626196 |
| L50 | 0.054607 | 实测链上值,含逐层取整Measured on-chain values with truncation | |
4.2 整塔容量4.2 Full-tower capacity
也就是说,即使 100 层全部填满,整个系统的资金吞吐上限约为 261 BNB。这不是营销数字,而是写死的物理上限——它同时意味着后期进入的边际成本极高(L100 单价 0.626 BNB,是 L1 的 125 倍)。 A fully filled tower absorbs about 261 BNB in total. L100 costs 125× L1, a deliberately steep marginal cost.
05买入与资金流Minting & Fund Flow
5.1 买入规则5.1 Mint rules
- 合约通过
currentLayer()找到最底层未售罄的层;从 L1 开始逐层检查,不跳层。Find the lowest unsold layer; layers fill strictly bottom-up. - 要求
msg.value ≥ priceOfLayer[layer],多余的 BNB 当场退回。Require payment ≥ price; refund the excess immediately. - 先写入状态(层计数、代币归属、排行榜),再做资金转账,避免重入改状态。State is written before transfers to avoid reentrancy abuse.
- 同一层的第 21 笔会失败,下一笔自动进入上一层。The 21st mint on a layer reverts; the next goes to the layer above.
5.2 四向分账(精确公式)5.2 Revenue split (exact)
注意 toRef 是用减法算出来的,不是再乘 5%。这样四份之和恒等于 price,不会因为整除截断产生 1–2 wei 的缺口,也不会把零头滞留在合约里。
toRef is computed by subtraction, so the four parts always sum to price with no dust left behind.
5.3 推荐人规则5.3 Referral rules
- 推荐人为
0x0或等于自己时,5% 不发放,直接并入赛季奖池(实际奖池得 15%)。If referrer is zero or self, the 5% folds into the season pool (pool receives 15%). - 推荐收益为即时转账,没有锁仓、没有线性释放。Referral rewards are paid instantly, no vesting.
- 链上无法验证「推荐关系真实性」,这只是一个自愿填写的地址。Referral relationships are not verifiable on-chain; the address is voluntary.
- 前端用 URL 参数
?ref=0x…传播邀请码:打开该链接时推荐人地址会自动填入 MINT 面板(保留address/chain/rpc参数,保证落在同一条链同一合约),用户仍可手动改写或清空。The front end propagates codes as?ref=0x…: the field is prefilled on open (keepingaddress/chain/rpcso the same chain and contract are used), and remains editable. - 5% 与 25% 是两条独立路径:25% 走累加器、需主动 claim,5% 当场转账、无需任何操作。两者互不挤占。The 5% and the 25% are independent: 25% accrues and needs a claim; 5% is sent on the spot with no action. They never compete.
5.4 一笔 0.005 BNB 的完整去向5.4 Where 0.005 BNB goes
| 去向Destination | 比例Share | 金额 (BNB)Amount | 进一步拆分Further split |
|---|---|---|---|
| 金库Treasury | 60% | 0.003000 | — |
| 本层分红Layer dividends | 25% | 0.001250 | ÷20 席 = 每席 0.0000625÷20 = 0.0000625 per seat |
| 赛季奖池Season pool | 10% | 0.000500 | — |
| 推荐人Referrer | 5% | 0.000250 | 无则并入奖池Folded into pool if absent |
pending() 不再增长。任何把分账描述为「稳定收益」的说法都是误导。
Honest note: dividends are not interest. Their only source is later purchases; when a layer stops receiving mints, pending() stops growing.
06分红累加器Dividend Accumulator
分红采用经典的「累加器 + 快照」模型,而不是遍历所有持有人逐个转账。这样无论一层有 1 个还是 20 个持有人,单次买入的 gas 都是常数。 A classic accumulator/snapshot model keeps mint gas constant regardless of holder count.
6.1 新卡不追溯历史分红6.1 No retroactive dividends
新代币铸造时,claimedOf[tokenId] 被初始化为当前累加器值。这意味着:在你买入之前,该层累积的分红与你无关。这一条是刻意设计,也是 v0.9 修复的一个真实漏洞——早期版本忘记初始化该字段,导致新卡能一次性领走该层全部历史分红。
On mint, claimedOf is initialised to the current accumulator, so buyers never inherit past dividends. This was a real bug fixed in v0.9.
6.2 两次买入的完整推演6.2 Worked example
| 步骤Step | 累加器Accumulator | #1 待领#1 pending | #2 待领#2 pending |
|---|---|---|---|
| 初始Start | 0 | — | — |
| mint #1(0.005)mint #1 | 0.0000625 | 0.0000625 | — |
| mint #2(0.005)mint #2 | 0.0001250 | 0.0001250 | 0.0000625 |
| #1 领取后after #1 claims | 0.0001250 | 0 | 0.0000625 |
这个结果与测试网实测一致:两次 mint 后 pending(#1) = 0.000125 BNB。可以先买入、后进场的每多一笔,你的份额就多一份。
Matches testnet observation: after two mints, pending(#1) = 0.000125 BNB.
6.3 空席份额的去向6.3 What happens to empty seats
累加器始终按固定 20 席均分,不按实际持有人数。如果一层只卖出 5 席,那么另外 15 席对应的 25% 份额没有任何人能领——它们会永久滞留在合约里,并被计入负债(totalDividendIn),因此 sweep() 也扫不走。
Accrual always divides by 20. If only 5 seats are sold, the other 15 seats' share stays locked in the contract, counted as liability, and cannot be swept.
07合成机制Merge Mechanics
7.1 规则7.1 Rules
| 条件Condition | 说明Notes |
|---|---|
a ≠ b | 不能拿同一张卡合成自己Cannot merge a token with itself |
| 两张都是你的Both owned by caller | 不支持替别人合成No third-party merging |
| 两张同层Same layer | L5 + L5 → L6,不能跨层L5 + L5 → L6 only |
| 不在 L100Not on L100 | 顶层无上一层可去No layer above 100 |
| 上层未满Upper layer not full | 上层已 20 席则失败,需等待或先合成Fails if the upper layer is full |
| 支付合成费Pay fee | P(上层) × 30%,全部进金库30% of upper price, all to treasury |
7.2 执行顺序7.2 Execution order
- 先给两张卡各自的待领分红做结算并转出(
_claimInternal),确保销毁不会吞掉持有人的钱。Settle and pay both tokens' pending dividends before burning. - 销毁两张卡,
_owned列表同步剔除。Burn both tokens and remove them from holdings. - 铸造一张上一层的卡,
claimedOf初始化为上层当前累加器。Mint one token on the upper layer with a fresh snapshot. - 收取合成费,多余金额退回。Collect fee; refund excess.
7.3 成本对照:合成 vs 直接买7.3 Merge vs. buying
| 路径Path | 花费Cost | 结果Result |
|---|---|---|
| 合成两张 L1Merge two L1 | 0.005×2 + 0.001575 = 0.011575 | 1 张 L2,L1 供应 −2One L2, L1 supply −2 |
| 直接买 L2Buy L2 directly | 0.00525 | 1 张 L2(前提是 L1 已售罄)One L2 (only after L1 sells out) |
合成在纯经济上永远比直接买贵,这一点必须讲清楚:它不是套利工具,而是三件事——(1)给早期便宜买入的人一个向上的出口;(2)在目标层制造销毁,减少该层供给;(3)为冲上排行榜前十提供路径。 Merging is always more expensive than direct purchase. It is a sink and an upgrade path, not an arbitrage.
08赛季与奖池Seasons & Prize Pool
奖池有两个来源:每笔买入的 10%,以及无人认领的 5% 推荐份额。奖池不参与分红、不被 sweep 划走,只能通过 awardSeason 发放。
The pool accrues 10% of every mint plus the unclaimed 5% referral share; it is excluded from dividends and from sweep.
- 发放规则(谁拿、拿多少)由 owner 在链下决定,合约只做总额校验。Allocation is decided off-chain by the owner; the contract only enforces the cap.
- 没有「自动按排行榜发放」——因为排行榜可被合成操纵,自动发放会留下攻击面。No automatic leaderboard payouts, since the board can be gamed.
- 透明性建议:每期结算后公开 winners 与 amounts,并在 BscScan 上可核对。Recommended: publish winners and amounts after each season.
09排行榜Leaderboard
合约维护一个固定长度 10 的数组,每次铸造都会比较当前最差的一席,若新卡层数更高则替换。算法为 O(10) 常数遍历,不随总发行量增长。 A fixed array of 10 is updated with an O(10) scan on every mint.
- 并列时保留先到者,不替换。Ties keep the earlier entry.
- 已知限制:合成销毁的 token 不会从排行榜移除,历史条目可能指向已销毁的 ID。前端展示时应过滤
ownerOf失败项。Known limitation: burned tokens are not removed from the board; the UI filters them. - 排行榜只是展示,不影响分红、价格或合成。The board is cosmetic only.
10链上像素图On-chain Art
tokenURI() 不依赖 IPFS、不依赖 CDN,全部在合约内拼装:SVG → base64 → JSON → base64,返回 data:application/json;base64,…。
tokenURI() builds SVG → base64 → JSON → base64 entirely on-chain.
10.1 图像构成10.1 Composition
- 32×32 像素画布,23 个
<rect>拼出安全帽、面部、发光眼、胸牌、四肢、靴子与镐子。32×32 canvas, 23 rects forming helmet, face, glowing eyes, badge, limbs, boots, pickaxe. - 每 10 层一套配色(共 10 档),工装色与点缀色成对变化。A palette per 10-layer tier (10 tiers).
- 镐头颜色由
keccak256(tokenId) % 4决定,同层不会完全一样。Pickaxe head colour varies by token hash. - 右侧竖条是层高指示器,长度 = 层数 / 100 × 18px。Right-side gauge visualises layer height.
- 底部烧入
L{layer} #{tokenId}文本,链上可读。Bottom text embeds layer and token id.
10.2 配色表10.2 Palettes
| 层段Layers | 工装色Suit | 点缀色Accent |
|---|---|---|
| L1–10 | #3a3f55 | #39ff88 |
| L11–20 | #2f6f4f | #39ff88 |
| L21–30 | #2f5f8f | #7cc4ff |
| L31–40 | #54408f | #c08cff |
| L41–50 | #8f2f54 | #ff8cae |
| L51–60 | #8f5f2f | #ffc46b |
| L61–70 | #6f7f2f | #f2ff6b |
| L71–80 | #2f8f8f | #6bfff2 |
| L81–90 | #4a4f66 | #ffffff |
| L91–100 | #8f7a2f | #ffd23f |
owner 可以通过 setBaseURI 覆盖为外部 URL 图片,但默认路径完全不依赖任何链下服务——即使所有网站消失,NFT 依然能显示。
The owner may override art via setBaseURI, but the default path is fully self-contained.
11权限与治理Privileges & Governance
setTreasury 可把 60% 收入改到任意地址。建议上线后转入多签,并在社区公示。Treasury destination is owner-controlled; use a multisig.setBaseURI 可把链上像素图换成外部图片。设为空字符串即恢复链上版本。Art can be overridden; empty string restores on-chain art.awardSeason 决定谁拿奖池,是中心化程度最高的一项。Season allocation is the most centralised lever.sweep 只能扫走「合约余额 − 奖池 − 未领分红」,数学上无法触及用户资产。Sweep can only take balance minus pool minus unclaimed dividends.12安全分析与已知限制Security & Known Limits
12.1 已做的防护12.1 Safeguards in place
| 风险Risk | 处理Mitigation |
|---|---|
| 重入Reentrancy | 先改状态再转账;_safeMint 前已完成层计数与快照写入State before transfers; counters and snapshots written before _safeMint |
| 整数溢出Overflow | Solidity 0.8 内置检查,价格递推在 uint256 范围内Solidity 0.8 checked math |
| 分红被扫走Dividend theft via sweep | 负债公式硬约束,未领分红永久留在合约Liability formula blocks it |
| 转账后分红归属Dividends after transfer | 待领分红跟着代币走,不随地址变化清零Pending follows the token |
| 超发Over-minting | mintedInLayer 达到 20 后该层自动关闭Layer closes at 20 |
12.2 已知限制(务必阅读)12.2 Known limitations
- 空席分红永久沉淀。一层未售满时,未售席位的 25% 份额无人可领,且计入负债不可扫走。Empty-seat dividends are locked forever.
- 单张铸造接口。合约只有
mint()单张接口,批量购买需要多次交易与多次确认。One mint per transaction. - 排行榜不剔除销毁项。合成后旧 ID 可能仍留在榜单,前端需过滤。Leaderboard keeps burned IDs.
- 依赖区块空间。BNB 链拥堵时买入成本(gas)会显著上升,且无法通过合约缓解。Gas volatility.
- owner 中心化权限。金库、图片、奖池三项可控,需信任运营方。Owner-controlled levers.
13Gas 与实测数据Gas & Measured Data
| 项目Item | 数值Value | 说明Notes |
|---|---|---|
| 合约字节码Bytecode | 16.1 KB | 低于 24 KB 上限,无需拆分Under the 24 KB limit |
| 部署实测 gasDeployment gas | 5,956,000 | BSC 主网实测(测试网 5,778,477)Mainnet (testnet: 5,778,477) |
| 部署成本Deployment cost | ≈ 0.0058 tBNB | 按 1 gwei 估算At ~1 gwei |
| 主网合约Mainnet contract | 0xac7b7ae00224277956dd32959fa02bab5a9005f5 | |
| 测试网合约Testnet contract | 0xaECac8D033205Cf123176E51befFabcb3bEaf676 | |
| 实测校验Verified | P(1)=0.005 · P(100)=0.626196 · L1 两笔 mint 后 seasonPool=0.0015 · pending(#1)=0.000125 · tokenURI(#1) 2965 字符Confirmed values as listed | |
14参数总表Parameter Reference
| 参数Parameter | 值Value | 是否可改Mutable |
|---|---|---|
| LAYERS / SEATS | 100 / 20 | 否No |
| 基础价 _basePriceBase price | 0.005 BNB | 否(构造后固定)No |
| 层间涨幅Layer step | +5% | 否No |
| 金库 / 分红 / 奖池 / 推荐Split | 60 / 25 / 10 / 5 | 否No |
| 合成费率Merge fee | 30%(上层价) | 否No |
| 版税Royalty | 5%(ERC-2981) | 构造后固定Fixed after deploy |
| 金库地址Treasury | 部署参数Deploy arg | 是(owner)Yes (owner) |
| 外部图片前缀Base URI | 空(用链上像素图)Empty (on-chain art) | 是(owner)Yes (owner) |
15路线图Roadmap
| 阶段Phase | 内容Scope | 状态Status |
|---|---|---|
| P1 | 合约开发、链上像素图、分红与合成、前端游戏页、白皮书Contract, on-chain art, dividends, merging, UI, whitepaper | 已完成Done |
| P2 | BSC 测试网部署与全流程验证、源码验证、社区内测Testnet deploy, verification, closed beta | 进行中In progress |
| P3 | 主网发布、首季开塔、推荐体系上线Mainnet, season one, referrals | 未开始Pending |
| P4 | 赛季结算、数据看板、二级市场版税接入Season settlement, dashboard, royalties | 未开始Pending |
16风险披露Risk Disclosure
- 价格风险:上层价格由公式决定,不存在「地板价保护」。若买入后无人继续买入,你的持仓可能没有任何流动性。Price risk: no floor protection; illiquidity is possible.
- 分红风险:分红只来自新买入,不是收益承诺。层停止成交时分红停止。Dividend risk: funded solely by new purchases.
- 合约风险:尽管经过编译与测试网验证,仍可能存在未发现的缺陷;请勿投入无法承受损失的资金。Contract risk: unaudited code may contain unknown defects.
- 中心化风险:金库、图片与奖池由 owner 控制。Centralisation risk: owner controls treasury, art, pool.
- 合规风险:不同司法辖区对 NFT 与链上游玩的定性不同,参与者需自行确认合法性。Regulatory risk: classification varies by jurisdiction.
17常见问题FAQ
为什么我只能买当前这一层?Why can I only buy the current layer?
为了制造确定性的「爬升节奏」。如果允许任意跳层,L100 会被直接买走,中间的稀缺结构就消失了。To enforce a deterministic climb; free layer choice would destroy the scarcity ladder.
分红什么时候到账?When do dividends arrive?
实时累计、手动领取。页面会显示待领金额,点「领取」或「全部领取」才会真正转账(需要 gas)。Accrued continuously, claimed manually (gas required).
合成划算吗?Is merging worth it?
纯经济上不划算,成本高于直接买上层。它的价值在于销毁供给、攀升榜单、以及给低价买入者一个出口。Not economically; it is a sink and an upgrade path.
卖出 NFT 后分红归谁?Who gets dividends after a sale?
未领取的分红跟着代币走,买家接手后可以领取;已经领取的部分不追溯。Unclaimed dividends follow the token to the buyer.
塔满了会怎样?What happens when the tower fills?
currentLayer() 返回 0,mint 永久失败。塔成为封闭集合,只剩二级市场与分红领取。currentLayer() returns 0; minting ends permanently.
图片存在哪里?Where is the art stored?
存在合约里,随 tokenURI 现场生成。没有 IPFS、没有服务器依赖。Generated by the contract itself; no IPFS or server.
18术语表Glossary
| 术语Term | 说明Definition |
|---|---|
| 层 / LayerLayer | 塔的一级,共 100 级,编号从 1(最低)到 100(最高)One of 100 levels, 1 = bottom |
| 席位 / SeatSeat | 每层 20 个位置,1 个位置 = 1 个 ERC-721 代币One of 20 per layer, one ERC-721 each |
| 当前层Current layer | 最底层尚未售罄的层,唯一可买入的层Lowest layer with free seats |
| 累加器Accumulator | 按层记录「每席累计分红」的变量,避免逐地址遍历Per-layer cumulative dividend per seat |
| 待领 / pendingPending | 单张卡当前可领取但尚未领取的分红Claimable but unclaimed dividend |
| 合成 / mergeMerge | 两张同层换一张上层,销毁 2 铸造 1Burn two same-layer tokens for one above |
| 赛季奖池Season pool | 10% + 未认领推荐份额,由 owner 结算发放10% + unclaimed referral share |
| 金库 / treasuryTreasury | 接收 60% 收入与全部分成费的地址Receives 60% and all merge fees |
19版本记录Changelog
| 版本Version | 变更Change |
|---|---|
| v0.6 | 初版合约:定价、mint、合成、分红Initial contract |
| v0.8 | 新增链上像素图、ERC-2981 版税、排行榜On-chain art, royalties, leaderboard |
| v0.9 | 修复新卡追溯领取历史分红的问题(claimedOf 未初始化)Fixed retroactive dividend bug |
| v1.0 | 新增 layerStats、前端重构、BSC 测试网部署(0xaECa…f676)Added layerStats, new UI, testnet deploy |
20免责声明Disclaimer
本文档仅用于技术说明,不构成任何投资建议、收益承诺或证券发行。Tower Miner 中的 NFT 是游戏道具,其价格、流动性与分红均取决于市场行为,存在归零可能。智能合约代码虽经测试网验证,但未经第三方审计,使用者需自行承担全部风险。项目方保留在法律法规要求下调整运营方式的权利。请在你能够承受全部损失的范围内参与。 This document is technical documentation only, not investment advice or a return promise. NFTs here are game items whose price, liquidity and dividends depend on market behaviour and may go to zero. The contract is testnet-verified but unaudited; use at your own risk.