---
name: blockcity-agent-id-first-card
description: 从官方 Blockcity 接口检查 Agent ID 首次领卡活动，使用币安 Agentic Wallet 完成登录、持币资格登记、免费市民卡铸造及一次 2 点荣誉核验，查询当前钱包对应市民卡的荣誉值，或在用户确认后领取金库 USDT 分红。
---

# Blockcity Agent ID 首次领卡

官方来源只有 **https://blockcity.city**。本文件和[无依赖 Node.js 客户端](/agent-client.mjs)是网站交付资源，读取它们不表示活动已经上线。客户端需要 Node.js 22+；先下载、检查源码，再在用户选择的本地目录运行。它只调用 HTTP API、保存私有会话和生成未签名铸卡/领取参数，不运行 BAW、不签名、不广播、不读取 `.env` 或私钥。

## AI 执行约束：活动登记必须先于铸卡

以下要求适用于用户明确参加 **Agent ID 首次领卡活动**。它们不授予签名或广播权限；只查询身份/荣誉时使用 `honor`，查询或领取分红时使用对应流程，不为这些操作执行 `prepare` 或 `mint-plan`。

1. **活动铸卡必须使用官方客户端。** 在同一钱包和同一私有状态文件中执行 `prepare → mint-plan`。必须由服务器实际返回 `status="registered"`、`holdingRequirement.rank`、当前身份/荣誉合约与对应持币门槛；持有 `.ai`、链上无卡或交易模拟成功，都不能代替活动登记。
2. **只使用客户端返回的未签名计划。** 不得自行构造 `mint()`、复制本文或历史交易的 calldata，或直接调用合约来跳过登记。下文的方法选择器仅用于核对计划，不是独立执行入口；`mint-plan` 会在输出计划前再次核验登记。
3. **登记未成功就停止。** 活动关闭、资格不足、接口不可用、超时或结果未知时，不得自动改走普通领卡、使用旧计划或更换钱包重试。向用户报告原因；不能因为普通合约允许 `mint()` 就继续发送。
4. **在铸卡预览前说明后果。** 未成功登记就先铸卡，之后无法补登记，也不会补发本次活动的 2 点荣誉。向用户展示实际登记名次、领取钱包和合约，再按下文执行钱包预览与明确确认。
5. **链上铸卡成功后仍要完成活动核验。** 保存原交易哈希并运行 `complete → status`，分别报告身份卡和奖励状态；`queued` 不等于荣誉已到账。已有卡不再次铸卡，已有活动待处理记录按原计划/哈希恢复，不重新发送。

## 项目与玩法背景

Blockcity（布洛克城，https://blockcity.city）是 BNB Chain 主网（chain 56）的城市清洗小游戏，结合永久绑定钱包的市民身份卡、清洗地毯和荣誉体系。

- 玩家在游戏充值入口支付 BCASH，按页面当前比例和实际到账换取 BP，使用 BP 支付清洗工具耗材。BP 不可转让，不能兑换回 BCASH 或 USDT，且与荣誉独立。
- 完成清洗地毯后，按服务端核验评级获得荣誉，进入待入账并在链上确认后计入已确认荣誉。
- 已确认荣誉参与城市金库 USDT 分配。玩家有待领取余额时，可每天在身份卡中主动领取；实际按小时、按已确认荣誉占比分配，离线也累积，领取不消耗荣誉。金额以链上查询为准，随资金和荣誉占比变化，不是固定每日收益。
- BCASH（Blockcity Cash）主网合约为 `0xFE4F21A9b33501c75E203Ae57Ad6679c91Ee7777`；[BCASH 交易入口（Flap）](https://flap.sh/bnb/0xFE4F21A9b33501c75E203Ae57Ad6679c91Ee7777)。交易入口只是上下文，不授予自动买币、充值、授权或领取 USDT 的权限。

统一提示词先查询身份及荣誉；已有卡或用户仅要求查询时，执行下面的只读流程。只有用户需要首次领卡且无卡时，才进入后面的活动资格与铸卡流程。充值、交易及领取 USDT 均为另外的用户请求，不属于本客户端的自动执行范围。

## 仅查询身份卡荣誉

查询不要求活动开启、允许铸卡或持有 BCASH。已有本站会话时，复用原私有状态文件：

```sh
node agent-client.mjs honor --state ./blockcity-state.json
```

没有会话或会话过期时，先运行 `challenge --purpose honor --state ./blockcity-state.json --wallet <BSC钱包地址>`，再按下文登录签名预览、用户确认和 `verify` 流程登录。此模式只检查身份/荣誉主网配置，不登记资格、不准备铸卡；无需执行 `prepare`、`mint-plan` 或 `complete`。

客户端核对当前会话钱包、chain 56、身份/荣誉合约和卡片归属，调用现有 `GET /api/player/identity`。报告 `identity.tokenId`、`confirmedHonor`（该卡全部已确认荣誉，不仅是活动 2 点）和 `pendingHonor`（待入账，不能计入确认值）。`identity=null` 表示当前钱包尚无卡，未知/失败不能当成零。只查询当前授权钱包对应的卡，不凭一个公开 `.ai` 名称查询他人的私有流水。会话有效时全程只读，不签名、不发交易。

## 领取金库 USDT 分红

用户明确要求领取时使用本流程，不要求 Agent ID 活动开启或 BCASH 持仓；需要当前钱包有市民卡。复用私有状态文件，无会话时按 `challenge --purpose honor` 和下文签名确认流程登录。登录签名不授权领取。

```sh
node agent-client.mjs dividends --state ./blockcity-state.json
node agent-client.mjs claim-plan --state ./blockcity-state.json
```

`dividends` 只读查询；`claim-plan` 核对主网 V10 金库、身份归属、未暂停及正数可领金额，并持久保存唯一领取计划后输出。金额均为 USDT 最小单位（18 位小数），`expectedUsdt` 是模拟预估，实际金额以回执为准。未启用、未知或零余额时停止，不填零冒充成功。

使用返回的 `unsignedPlan`：chain 56、当前钱包 `from`、已核验金库 `to`、`data=0x668038e0`（`claimDividends()`）、`value=0x0`。USDT 只转入当前身份卡钱包，不能指定他人收款，无需 BCASH/USDT 授权，仅消耗钱包 BNB Gas。

```sh
baw contract-call preview --binanceChainId 56 --from <unsignedPlan.from> --to <unsignedPlan.to> --value 0 --inputData 0x668038e0 --json
node agent-client.mjs claim-status --state ./blockcity-state.json --request-id <预览requestId>
```

展示目标金库、方法、预估 USDT、Gas、模拟结果、`risks` 与 `authorityChanges`。预览失败或风险拦截时停止；获得用户对本次领取的明确确认后，才执行原预览：

```sh
baw contract-call execute --requestId <原预览requestId> --json
node agent-client.mjs claim-status --state ./blockcity-state.json --order-id <返回orderId>
node agent-client.mjs claim-status --state ./blockcity-state.json --tx-hash <原领取txHash>
node agent-client.mjs claim-status --state ./blockcity-state.json
```

只传钱包实际返回的字段；尚无订单或哈希时不要编造。`PENDING_CONFIRMATION` 等待币安 App 确认。无哈希、超时或回复丢失时查原钱包订单/交易历史，禁止再次执行。状态文件在查询前保存原 requestId、orderId、txHash，拒绝替换原记录；每次使用同一文件。

后端 `GET /api/player/dividends/receipt?txHash=...&afterBlock=...` 需要登录，只核验当前会话钱包。至少等待 12 个后续区块，核验规范区块、身份归属、金库 `DividendsClaimed` 和 USDT 转入事件。钱包中转交易也必须有完整到账事件；不能以外层交易成功代替到账。

- `confirmed` 才报告实际 `amount` 已到账。
- `pending` / `needs_verification` 保留原计划，只查询原交易。
- `reverted` 仅在能证明原始直接领取调用回滚时返回；无法证明内层调用的失败中转交易仍待核验。

未解决计划会阻止创建第二个计划；`dividends` 返回原 `pendingClaim` 供恢复。只有确定钱包从未提交时，才可经重新预览与用户确认继续原计划。确认完成/回滚后，下次用户明确要求领取时才可创建新计划，并重新核验原回执及当前余额。不要删除状态文件绕过检查，不定时领取、不自动重试签名或广播。

## 先读取状态

读取 `GET https://blockcity.city/api/agent-id/campaign`、`/api/identity/config` 和 `/api/game/config`，或运行：

```sh
node agent-client.mjs info
```

必须同时满足活动 `enabled=true`、身份及游戏配置 `ready=true`、BSC 主网 `chainId=56`、允许铸卡且身份/荣誉合约范围一致。否则停止登录签名、登记和铸卡，并说明接口给出的状态；不要代用户开启活动、部署、迁移数据库或配置合约。旧客户端、空地址、RPC 故障和未知状态都不能按成功处理。

`campaign.progress` 按**后端成功激活资格的顺序**计数，不是铸卡人数或页面访问数。前两档分别有 100、900 个登记名额；第 1,001 位起没有总容量，不应生成完成百分比。预估的 `nextRank` 可能因并发申请变化，以 `prepare` 返回并持久登记的 `holdingRequirement.rank` 为准。

| 成功登记名次 | 同一领取钱包的 BCASH 持有要求 |
| --- | --- |
| 1–100 | 无 BCASH 持有要求 |
| 101–1,000 | 至少 10,000 BCASH |
| 1,001 起 | 至少 50,000 BCASH |

所有档位都必须真实持有币安 `.ai` Agent ID，并且登记前没有市民卡。BCASH Token 由服务器核验的游戏配置决定，资格和余额以服务端链上读取为准；输入名称、钱包自报余额或客户端指定名次均不构成证明。持仓不足时只报告缺口，**不买币、不转币、不申请代币授权、不支付活动费**。市民卡始终免费，玩家只支付原始铸卡交易的 BNB Gas，交易 `value=0`。

## 连接已有 Agentic Wallet

使用已经安装、已由用户授权的币安 Agentic Wallet 工作流。不要生成或导入私钥。按官方命令读取连接、地址及设置：

```sh
baw wallet status --json
baw wallet address --json
baw wallet settings --json
```

取 BSC 56 地址，整个流程保持同一个钱包。未连接时使用官方登录流程；Developer Mode 未启用时请用户在币安 App 中启用，不能自行改设置或绕过风险拦截。不要传入自定 Gas、Gas price 或其他不受支持的签名方法。

## 登录：仅签服务器 EIP-712 挑战

每个钱包使用一个用户明确提供的私有状态文件，始终复用同一文件。示例的 `./blockcity-state.json` 可替换为用户选择的路径；客户端以 `0600` 保存 Cookie、会话、资格和原交易恢复信息，不把这些凭证输出到聊天、日志或公共文件。不要上传状态文件。

```sh
node agent-client.mjs challenge --state ./blockcity-state.json --wallet <BSC钱包地址>
```

返回 `typedData` 与 `signRequest`。核对 `Blockcity Sign-in`、版本 1、chain 56、当前钱包、挑战 ID、完整 SIWE 登录消息及有效期。将返回的 `signRequest` 原样序列化为 JSON 字符串，作为官方 BAW `--message`；其中 `params[1]` 是 typedData 的 JSON 字符串，不是哈希。不要构造 Permit、授权或转账消息。

```sh
baw sign-message preview --binanceChainId 56 --signType EIP712 --message '<原样序列化的signRequest>' --json
```

向用户展示解析后的登录消息、钱包、网络、`risks` 和任何权限变化，取得这次签名的明确确认后，才能使用成功预览返回的 ID：

```sh
baw sign-message execute --requestId <登录预览requestId> --json
```

`PENDING_CONFIRMATION` 表示等待币安 App 确认，使用同一订单读取结果，不能重复执行：

```sh
baw sign-message result --order-id <登录orderId> --json
```

只有 `COMPLETED` 的结果可写入用户选择的本地签名结果文件。保留官方 `signature` 和 `signatureRecovery` 字段；客户端支持 BAW 的无 `0x` r+s 及独立恢复字节。不要把返回为 pending、rejected、expired 的结果当作签名。

```sh
node agent-client.mjs verify --state ./blockcity-state.json --signature-file ./baw-signature-result.json
```

客户端保留挑战 Cookie，并发送同源 `Origin` 与 `X-Blockcity-Request: 1`。登录回复丢失先只读恢复同一钱包会话；挑战过期或已使用且无法恢复时，明确说明后重新请求挑战，不自动反复要求用户签名。`.ai` 公开名称不是登录证明。

## 登记资格后才准备铸卡

```sh
node agent-client.mjs prepare --state ./blockcity-state.json
node agent-client.mjs mint-plan --state ./blockcity-state.json
```

必须看到服务器 `status="registered"`、固定 2 点奖励、当前身份/荣誉合约、已分配名次及相应持币门槛。客户端在生成计划前重新登记核验并读取已确认无卡状态。后端验证 Agent NFT 归属、无卡、BCASH 门槛和原子名次；失败和重复请求不新增名次。需要持币的档位应保持所需持仓至奖励核验通过。

`mint-plan` 只返回一份**未签名**计划：chain 56、当前钱包 `from`、当前已核验市民卡合约 `to`、`data=0x1249c58b`（原始 `mint()`）、`value=0x0`。不要调用活动中转合约、发送 BCASH 或设置授权。客户端在输出计划之前持久保存待处理意图，第二次运行不会生成新计划。

仅在上述登记条件全部满足后，将客户端返回的这份计划交给官方预览，逐项使用计划字段，不添加 Gas 覆盖参数：

```sh
baw contract-call preview --binanceChainId 56 --from <计划from> --to <计划to> --value 0 --inputData <计划data> --json
```

向用户展示目标、方法、零转账金额、BNB Gas 估算、模拟结果、`risks`、`authorityChanges`，明确只是免费市民卡铸造。模拟失败或风险拦截时停止。取得本次铸卡的明确确认后，才使用该成功预览的 ID：

```sh
baw contract-call execute --requestId <铸卡预览requestId> --json
```

`PENDING_CONFIRMATION` 仍需用户在币安 App 确认；`BROADCASTED` 只表示已提交，不能宣称已领卡或已获得荣誉。保留原 `requestId`、`orderId` 及真实 `txHash`。不要因为超时、回复丢失或暂时没有哈希，再执行或重新创建预览。

## 使用原记录核验结果

```sh
node agent-client.mjs complete --state ./blockcity-state.json --tx-hash <原铸卡交易哈希>
node agent-client.mjs status --state ./blockcity-state.json
node agent-client.mjs complete --state ./blockcity-state.json
```

客户端在向后台提交前保存所提供的原交易哈希；`complete` 无参数时沿用原记录。后端至少等待 12 个后续区块，核验规范回执、原合约 mint 事件、收卡钱包、永久锁定、Agent ID 归属及对应 BCASH 持仓，再通过现有共享荣誉账本投递一次 2 点。

- `pending`：仍待核验，不创建第二笔铸卡交易。
- `queued`：已进入荣誉队列，尚不是链上已确认荣誉。
- `confirmed`：共享荣誉账本已完成链上确认。
- `needs_attention`、不可用或失败：报告真实状态，保留原证据，不猜测已成功。

未知发送结果且无哈希时，使用官方钱包订单/交易历史查原操作；禁止再次执行或换钱包重试。`status` 会保留原未签名计划供检查。只有能够确定**从未执行钱包交易**（例如交易执行前的预览被明确拒绝）时，才可在重新读取 `status`、重新 `prepare` 并取得用户确认后继续原计划；状态未知时不能靠重取计划恢复。确认原交易回滚后可显式重试；其他钱包或无关交易哈希不能用来解除待核验状态。已经有卡时不再次铸卡；缺少原哈希则查找原交易供奖励核验。

活动未发布、未开启或未经真实钱包操作时，只报告代码/接口或模拟验证结果。不要声称 AI 已自主签名、发交易、完成领卡或到账。

## 参考

- [官方状态入口](/api/agent-id/campaign)
- [客户端源码](/agent-client.mjs)
- [玩家帮助](/docs/)
- [币安 Agentic Wallet 官方外部签名规范](https://raw.githubusercontent.com/binance/binance-skills-hub/main/skills/binance-web3/binance-agentic-wallet/references/external-sign.md)
