WHITEPAPER · v1.0

Tower Miner 爬塔矿工 Tower Miner

一个把「席位稀缺性」写进合约的链上塔层收藏协议 · 100 层 × 20 席 An on-chain tower collectible protocol with seat scarcity encoded in the contract · 100 layers × 20 seats
版本Version v1.0 合约Contract Solidity 0.8.26 网络Network BNB Smart Chain 标准Standard ERC-721 / ERC-2981 主网合约Mainnet 0xac7b…05f5 测试网合约Testnet 0xaECa…f676

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.

一句话概括:用确定性的价格曲线制造「同一层只有 20 个位置」的稀缺,用真实分账把买入行为变成对同层早期持有者的现金流,用合成机制让收藏有向上的出口。 In one line: a deterministic price curve creates 20-seat scarcity; a real revenue split turns purchases into cash flow for early holders of that layer; merging gives collecting an upward path.

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 / SEATSuint8100 / 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
seasonPooluint256赛季奖池余额Season pool balance
totalDividendIn / Outuint256累计应发 / 已发分红,用于负债校验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 / setBaseURIownerowner 更改金库地址 / 更改图片外部前缀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
Minteduser, tokenId, layer, price, referrer
Mergeduser, burnedA, burnedB, newTokenId, newLayer, fee
DividendClaimeduser, tokenId, amount
SeasonAwardedamount, winners

04定价曲线Pricing Curve

价格在合约构造时一次性算出并永久固定,之后没有任何函数可以修改。递推式为: Prices are computed once in the constructor and are immutable afterwards:

P(1) = basePrice = 0.005 BNB P(n) = floor( P(n−1) × 105 / 100 ) // 每层 +5%,整数截断

使用整数运算逐层递推(而非浮点幂运算),保证结果在链上完全可复现,也避免不同语言浮点误差。取整方向为向下截断,误差每层不超过 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)
L10.005000L600.088949
L100.007757L700.144873
L200.012635L800.235965
L300.020580L900.384378
L400.033524L1000.626196
L500.054607实测链上值,含逐层取整Measured on-chain values with truncation

4.2 整塔容量4.2 Full-tower capacity

Σ P(n) = 0.005 × (1.05^100 − 1) / 0.05 ≈ 13.05 BNB 总容量 = 20 席 × 13.05 ≈ 261 BNB

也就是说,即使 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.

为什么用 5% 而不是指数爆炸:1.05 的斜率在 100 层内刚好跨越两个数量级,既能保证「越往上越贵」,又不至于让 L20 之后彻底失去流动性。若用 10%,L100 将达到 L1 的 13,780 倍,塔在第 40 层左右就会被价格冻死。 Why 5%: it spans two orders of magnitude across 100 layers, staying tradeable; 10% would freeze the tower around L40.

05买入与资金流Minting & Fund Flow

5.1 买入规则5.1 Mint rules

  1. 合约通过 currentLayer() 找到最底层未售罄的层;从 L1 开始逐层检查,不跳层。Find the lowest unsold layer; layers fill strictly bottom-up.
  2. 要求 msg.value ≥ priceOfLayer[layer],多余的 BNB 当场退回。Require payment ≥ price; refund the excess immediately.
  3. 先写入状态(层计数、代币归属、排行榜),再做资金转账,避免重入改状态。State is written before transfers to avoid reentrancy abuse.
  4. 同一层的第 21 笔会失败,下一笔自动进入上一层。The 21st mint on a layer reverts; the next goes to the layer above.

5.2 四向分账(精确公式)5.2 Revenue split (exact)

toTreasury = price × 60 / 100 → treasury toDividend = price × 25 / 100 → 本层分红累加器 toSeason = price × 10 / 100 → seasonPool toRef = price − 上述三项 → referrer(无推荐人则并入 seasonPool)

注意 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 (keeping address/chain/rpc so 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
金库Treasury60%0.003000—
本层分红Layer dividends25%0.001250÷20 席 = 每席 0.0000625÷20 = 0.0000625 per seat
赛季奖池Season pool10%0.000500—
推荐人Referrer5%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.

每笔买入: accrue = toDividend / SEATS dividendPerToken[layer] += accrue 单张可领: pending(id) = dividendPerToken[layerOf[id]] − claimedOf[id] 领取: claimedOf[id] = dividendPerToken[layerOf[id]] totalDividendOut += amount

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
初始Start0——
mint #1(0.005)mint #10.00006250.0000625—
mint #2(0.005)mint #20.00012500.00012500.0000625
#1 领取后after #1 claims0.000125000.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.

设计取舍:这样做的目的是让「先买的人拿到更高单价买入带来的分红」这一激励保持线性可算,代价是部分资金永久沉淀。若要精确按持有人数分配,需要记录每层持有人集合,gas 与复杂度都会上升,也与「塔满即结束」的定位不符。 Trade-off: linear, predictable incentives in exchange for permanently locked remainder.

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 layerL5 + 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 feeP(上层) × 30%,全部进金库30% of upper price, all to treasury

7.2 执行顺序7.2 Execution order

  1. 先给两张卡各自的待领分红做结算并转出(_claimInternal),确保销毁不会吞掉持有人的钱。Settle and pay both tokens' pending dividends before burning.
  2. 销毁两张卡,_owned 列表同步剔除。Burn both tokens and remove them from holdings.
  3. 铸造一张上一层的卡,claimedOf 初始化为上层当前累加器。Mint one token on the upper layer with a fresh snapshot.
  4. 收取合成费,多余金额退回。Collect fee; refund excess.

7.3 成本对照:合成 vs 直接买7.3 Merge vs. buying

路径Path花费Cost结果Result
合成两张 L1Merge two L10.005×2 + 0.001575 = 0.0115751 张 L2,L1 供应 −2One L2, L1 supply −2
直接买 L2Buy L2 directly0.005251 张 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.

awardSeason(winners[], amounts[]) require(winners.length == amounts.length) require(Σ amounts ≤ seasonPool) seasonPool −= Σ amounts 逐笔转账给 winners
  • 发放规则(谁拿、拿多少)由 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.
中心化点:奖池发放在 owner 手上。这是本协议最大的信任假设,参与者应据此评估风险,而不是假设「代码自动发奖」。 Centralisation: season payouts are controlled by the owner. This is the largest trust assumption.

09排行榜Leaderboard

合约维护一个固定长度 10 的数组,每次铸造都会比较当前最差的一席,若新卡层数更高则替换。算法为 O(10) 常数遍历,不随总发行量增长。 A fixed array of 10 is updated with an O(10) scan on every mint.

worst = argmin(topLayer) if (layer > topLayer[worst]) { topToken[worst] = tokenId; topLayer[worst] = layer; }
  • 并列时保留先到者,不替换。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

不可变Immutable
层数、席位数、价格曲线、分账比例、合成费率 —— 全部写死在代码里,owner 也改不了。Layers, seats, price curve, split ratios, merge fee — all hard-coded.
可改 · 金库Mutable · treasury
setTreasury 可把 60% 收入改到任意地址。建议上线后转入多签,并在社区公示。Treasury destination is owner-controlled; use a multisig.
可改 · 图片Mutable · art
setBaseURI 可把链上像素图换成外部图片。设为空字符串即恢复链上版本。Art can be overridden; empty string restores on-chain art.
可改 · 奖池Mutable · pool
awardSeason 决定谁拿奖池,是中心化程度最高的一项。Season allocation is the most centralised lever.
受限 · 扫零头Limited · sweep
sweep 只能扫走「合约余额 − 奖池 − 未领分红」,数学上无法触及用户资产。Sweep can only take balance minus pool minus unclaimed dividends.
不存在Absent
没有暂停、没有黑名单、没有增发、没有转移用户 NFT、没有提取用户分红的函数。No pause, no blacklist, no inflation, no seizure functions.

12安全分析与已知限制Security & Known Limits

12.1 已做的防护12.1 Safeguards in place

风险Risk处理Mitigation
重入Reentrancy先改状态再转账;_safeMint 前已完成层计数与快照写入State before transfers; counters and snapshots written before _safeMint
整数溢出OverflowSolidity 0.8 内置检查,价格递推在 uint256 范围内Solidity 0.8 checked math
分红被扫走Dividend theft via sweep负债公式硬约束,未领分红永久留在合约Liability formula blocks it
转账后分红归属Dividends after transfer待领分红跟着代币走,不随地址变化清零Pending follows the token
超发Over-mintingmintedInLayer 达到 20 后该层自动关闭Layer closes at 20

12.2 已知限制(务必阅读)12.2 Known limitations

  1. 空席分红永久沉淀。一层未售满时,未售席位的 25% 份额无人可领,且计入负债不可扫走。Empty-seat dividends are locked forever.
  2. 单张铸造接口。合约只有 mint() 单张接口,批量购买需要多次交易与多次确认。One mint per transaction.
  3. 排行榜不剔除销毁项。合成后旧 ID 可能仍留在榜单,前端需过滤。Leaderboard keeps burned IDs.
  4. 依赖区块空间。BNB 链拥堵时买入成本(gas)会显著上升,且无法通过合约缓解。Gas volatility.
  5. owner 中心化权限。金库、图片、奖池三项可控,需信任运营方。Owner-controlled levers.

13Gas 与实测数据Gas & Measured Data

项目Item数值Value说明Notes
合约字节码Bytecode16.1 KB低于 24 KB 上限,无需拆分Under the 24 KB limit
部署实测 gasDeployment gas5,956,000BSC 主网实测(测试网 5,778,477)Mainnet (testnet: 5,778,477)
部署成本Deployment cost≈ 0.0058 tBNB按 1 gwei 估算At ~1 gwei
主网合约Mainnet contract0xac7b7ae00224277956dd32959fa02bab5a9005f5
测试网合约Testnet contract0xaECac8D033205Cf123176E51befFabcb3bEaf676
实测校验VerifiedP(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 / SEATS100 / 20否No
基础价 _basePriceBase price0.005 BNB否(构造后固定)No
层间涨幅Layer step+5%否No
金库 / 分红 / 奖池 / 推荐Split60 / 25 / 10 / 5否No
合成费率Merge fee30%(上层价)否No
版税Royalty5%(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
P2BSC 测试网部署与全流程验证、源码验证、社区内测Testnet deploy, verification, closed beta进行中In progress
P3主网发布、首季开塔、推荐体系上线Mainnet, season one, referrals未开始Pending
P4赛季结算、数据看板、二级市场版税接入Season settlement, dashboard, royalties未开始Pending

16风险披露Risk Disclosure

  1. 价格风险:上层价格由公式决定,不存在「地板价保护」。若买入后无人继续买入,你的持仓可能没有任何流动性。Price risk: no floor protection; illiquidity is possible.
  2. 分红风险:分红只来自新买入,不是收益承诺。层停止成交时分红停止。Dividend risk: funded solely by new purchases.
  3. 合约风险:尽管经过编译与测试网验证,仍可能存在未发现的缺陷;请勿投入无法承受损失的资金。Contract risk: unaudited code may contain unknown defects.
  4. 中心化风险:金库、图片与奖池由 owner 控制。Centralisation risk: owner controls treasury, art, pool.
  5. 合规风险:不同司法辖区对 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 pool10% + 未认领推荐份额,由 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.