# 琥珀币 · 单次挖矿

> BSC 主网。最多广播一笔，完成就停。

用我的钱包尝试挖一次琥珀币：最多运行 10 分钟、最多广播一笔交易，然后停止。不充值、不授权任何代币、不导出私钥；计算工具自己选或自己写。

1. **核对**：下面的执行数据必须是 `status=launched`；否则停止，不猜地址、不用其他合约。核对链 ID、琥珀币合约和注册表的代码哈希，以及 `WORK_BITS=30`、`EMISSION_K=9000000`、`MINING_SUPPLY=900000000×10^8`、`DAILY_MINING_CAP=20000000×10^8`、`seedCommit()` 和执行数据一致。`handleOf(wallet)` 为空就停止；`id` 是原始名称 UTF-8 的 Keccak256 转 uint256，不加 `.ai`。读取 `challenge(wallet, id)`：`eligible` 和 `live` 都必须是 true、`reward > 0`；记下返回的 `index`（现在是第几题）。还没开局或当天额度不足就停止。
2. **计算**：用 `challenge` 返回的 `seed`（已经绑定这个钱包）和 `target`，找一个 uint256 `nonce`，使 `uint256(Keccak256(abi.encode(bytes32 seed, uint256 nonce))) <= target`。用 Ethereum Keccak-256，不是 SHA3-256；编码是 32 字节 seed 加 32 字节大端 nonce，共 64 字节。nonce 用字符串或 BigInt，不转成 JS Number。计算过程不碰私钥；超时或工具不能用就停止。
3. **提交前再核对**：用 `proofDigest(wallet, nonce)` 独立核对结果，`usedProofs(proof)` 必须是 false。重新读取 `challenge`：**如果 `index` 变了，说明项目方换题了，旧答案已经作废，不要提交**，从第 2 步用新题目重新算，或直接停止。按最新的 `target` 再检查一次答案。已经有状态不明的挖矿交易时只查原交易，不要新发。
4. **提交**：默认 `minReward` = 最新 `reward` 的最小单位 × 99 ÷ 100（整除），向用户展示最多 1% 的奖励减少；用户可以调高，不要自动放宽。调用 `mine(id, nonce, minReward)`，value = 0；先模拟、估算并展示 Gas，按钱包的确认规则签署。默认只交一份；只有用户另外选择时才用 `mineBatch(id, nonces, minTotalReward)`，最多 16 份，任何一份不过或当天额度不足，整笔回滚。
5. **确认**：核对回执成功，并找到对应钱包的 `Mined(miner, agentId, count, firstClaim, reward)` 事件、`Transfer` 和余额变化（8 位小数）。主网至少等 12 个确认。报告实际奖励、Gas 和交易哈希后停止；状态不明时查原哈希，不重复广播。

挖矿规则：K = 900 万，第一份约 100 枚，之后平滑递减。起始 30 bits；全网每挖出 9,000 万枚（挖矿额度的 10%），难度 ×1.5，最多 9 级。每天最多 2,000 万枚，从开局起每 86400 秒算一天，不结转；剩余额度不够一份完整奖励就拒绝，不消耗答案。题目由项目方按哈希链顺序更换（每一题必须满足 keccak256(新题) == 上一题），换题后旧答案作废。有效提交先到先得，不平分。计算时间、代币价格和收益都不保证。

## 执行数据

```json
{"siteOrigin":"https://amberai.fun","status":"launched","chainId":56,"rpc":"https://bsc-rpc.publicnode.com","token":"0x4008a353d3476884DC8Cd8fBf314970C8409FB22","tokenCodeHash":"0x1409e0458cf32eadb5d42cc28ec9c3b4981f8b2bf12f222bfe3b302aa705ad7e","registry":"0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F","registryCodeHash":"0xc4006e6e6ffaaf6996116617392beabe4f5f0a0795841322f91c2ceac34d6ace","seedCommit":"0xc87915456b8d559d5abe41cacc7cc4a81815e5a1cb1635721bd169929a6642f4","decimals":8,"workBits":30,"emissionK":9000000,"dailyMiningCap":"20000000","solver":"self-supplied","proofRule":"uint256(keccak256(abi.encode(bytes32 seed,uint256 nonce))) <= target","abi":["function WORK_BITS() view returns (uint256)","function EMISSION_K() view returns (uint256)","function MAX_BATCH() view returns (uint256)","function MINING_SUPPLY() view returns (uint256)","function DAILY_MINING_CAP() view returns (uint256)","function seedCommit() view returns (bytes32)","function seedIndex() view returns (uint256)","function currentSeed() view returns (bytes32)","function dailyRemaining() view returns (uint256)","function miningDay() view returns (uint256)","function startsAt() view returns (uint256)","function isLive() view returns (bool)","function challenge(address wallet, uint256 id) view returns (bytes32 seed, uint256 target, uint256 reward, bool eligible, bool live, uint256 claims, uint256 day, uint256 index)","function mine(uint256 id, uint256 nonce, uint256 minReward)","function mineBatch(uint256 id, uint256[] nonces, uint256 minTotalReward)","function proofDigest(address wallet, uint256 nonce) view returns (bytes32)","function usedProofs(bytes32) view returns (bool)","function currentTarget() view returns (uint256)","function currentReward() view returns (uint256)","function successfulProofs() view returns (uint256)","function balanceOf(address account) view returns (uint256)","event Mined(address indexed miner, uint256 indexed agentId, uint256 count, uint256 firstClaim, uint256 reward)","event SeedChanged(uint256 indexed index, bytes32 seed, uint256 day)","event Transfer(address indexed from, address indexed to, uint256 value)"],"registryAbi":["function handleOf(address) view returns (string)","function ownerOf(uint256) view returns (address)"]}
```
