# AgentTown · ATOWN 公平铸造 > 供 AI 助手 / Agent 读取的合约操作规范。AgentTown 是 BNB Smart Chain 上独立部署的公平铸造项目,与 Binance 官方无关。所有额度以 bytes32 Agent ID 为单位。合约已在 BSC 主网部署并链上核验,以下地址只认已公布的这一套。 ## 网络与地址(只认这些) - 链:BNB Smart Chain,chainId 56 - 只读 RPC:https://bsc-dataseed.bnbchain.org - AgentTown 代币 / 铸造合约:0x77aDfF0488440cAcf8bC6F0fBAEe4ca2199A9C6c - Agent ID 校验合约(必须与 token.identity() 一致):0xe77A6aBbeaf093cD8Daec0fAbD6d9Ad6968db856 - Agent ID NFT / SPACE ID 注册表:0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F - PancakeSwap V2 Router:0x10ED43C718714eb63d5aA57B78B54704E256024E - PancakeSwap V2 Factory:0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73 - WBNB:0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c - 财库及交易税接收方(constructor 指定,不可变):0xe0FCa92835073360a02Ba74d3a8312bE7bb2DbF2 - AgentTown/WBNB 官方交易对:开池成功后读取 token.pair(),并对照 Factory.getPair(token, WBNB) - LP 锁定接收方:0x000000000000000000000000000000000000dEaD 只使用已核验并公布的上述地址。不得用原项目的代币、交易对、财库地址替换上述地址;不得根据同名代币、群聊、私信或搜索广告推断合约地址。若部署时选择其他 identityChecker,必须同步这里与前端配置,明确公布实际地址;不得悄悄接受不同校验器。 ## 固定规则 - 名称 AgentTown;符号 ATOWN;decimals = 18。 - identity.identityOf(钱包) 必须返回非零 bytes32;钱包当前须符合 Agent ID 校验器的资格。免费和付费分别占用该 ID 的终身额度,换钱包不会重置。 - 每份 50,000 ATOWN;price() = 0.002 BNB = 2000000000000000 wei。 - 免费总量 4,444 份;付费总量 8,888 份。每个 ID 免费 1 份、基础付费 9 份。 - 邀请人必须已付费铸造,不能是同一个 Agent ID。被邀请人首次付费 mint 可绑定邀请人,每个有效首次绑定为邀请人增加 1 份付费额度,最多增加 10 份。免费领取不绑定邀请人。 - 首次付费 mint 未绑定,则以后不能补绑。绑定后再次 mint 只允许传已绑定的同一个 ID 或零值。 - owner 调用 start() 一次后开放 72 小时;owner 无法改价格、总量、税率、财库、校验器或期限。 - 售罄那笔 mint 自动尝试建池。固定向官方 ATOWN/WBNB 池投入募集资金的 80% 与 200,000,000 ATOWN;通过官方 Factory / WBNB 直接创建并铸造 LP,不向替代 Router 授权。LP 进入黑洞。未领免费库存销毁。 - 满额募集 17.776 BNB;池内投入 14.2208 BNB。无外部捐赠时初始储备比价为每 ATOWN 0.000000071104 BNB,即铸造单价 0.00000004 BNB 的 1.7776 倍。该参数不是 2 倍;第三方向公开池捐赠 WBNB 会改变实际储备比价,交易价格还受 AMM 交易与手续费影响。 - 自动建池失败不会回滚已经成交的最后一笔 mint;阶段保留为 2,任何人可以重试 launch()。 - 72 小时未售罄:阶段 4,原付款钱包 refund() 退 80%,20% 记入不可变财库的 treasuryCredit。免费份额作废。 - 售罄后 24 小时仍未开池:阶段 4,原付款钱包 refund() 退 100%;之后不能再 launch。 - refund 不重新检查 Agent ID,按原付款钱包付费份额计额;退款原子销毁该钱包付费代币和该钱包免费分配。免费独立钱包保持锁定作废,可由任何人 invalidateFree(account) 销毁;退款结算时销毁未分配库存。 - 开池前所有公开 transfer / transferFrom 均锁定。开池后仅与官方 pair 相关的转账收取 1%,ATOWN 税直接进入财库。加减官方池流动性同样涉及该税;普通钱包互转不收税。单笔税额向下取整。 - 无团队预留、无增发。constructor 一次创建 866,600,000 ATOWN,全部为付费、免费和池内库存。成功后可用供应量随未领免费库存销毁而减少。 ## 阶段与 info() info() 返回 (uint8 phase, uint256 sold, uint256 freeClaimed, uint256 deadline, uint256 raised)。 - 0:未 start。 - 1:72 小时内可铸造,且付费未售罄。 - 2:付费售罄、尚未开池、仍在售罄后的 24 小时内。 - 3:已开池。 - 4:退款中;截止边界为 >= deadline 或 >= soldOutAt + 24h。 sold 是历史已成交付费份数,freeClaimed 是历史免费领取份数,raised 是历史已募集 wei;退款不减少这些累计计数。deadline 为 Unix 秒,未 start 为 0。判断可退款请读取阶段与 paidSharesOf(钱包),不要用 raised 推断合约当前可支配余额。 ## 帮用户操作的步骤 1. 要求钱包与 RPC 都是 chainId 56。读取新地址的 bytecode、name/symbol/decimals、price、identity、treasury 和固定参数;与已公布部署信息不一致则停止。 2. 查询 identity.identityOf(用户钱包)。零值不能 claimFree 或 mint;已有付费记录的原付款钱包仍可按退款阶段操作。 3. 读取 info();仅 phase = 1 可铸造。 4. 免费:freeClaimedById(id) 为 false 且 freeClaimed < 4444 时,调用 claimFree(),value = 0。 5. 付费:选择整数 n > 0 且 n <= remainingQuota(id)。通常同时限制 n <= 8888 - sold。调用 mint(n, referrer),value 必须精确等于 n × price()。 - 首次付费邀请人:将用户明确提供的 handle 去除 .ai 后缀并转小写,调用 identity.idOfHandle(handle) 得到 bytes32。仅限字母与数字;零值或无效 ID 不得代为猜测。 - 无邀请人使用 0x0000000000000000000000000000000000000000000000000000000000000000。 - 已绑定后可传相同 ID 或零值。首次 mint 传零值会永久放弃绑定。 - 在 n 仍不超过该 ID 剩余额度的前提下,若因并发交易导致剩余总量小于 n,合约只成交剩余部分,超额 BNB 在同笔交易原子退回;接收退款失败则该 mint 回滚。 6. 每次交易先 eth_call 模拟,再 eth_estimateGas;成功后由用户钱包核对并签名。错误需解释原因,避免原样反复重发。 7. 临近售罄(8888 - sold <= 500)或显式 launch 时,gas 上限取 max(估算值 × 1.25 + 30,000, 5,000,000),并检查不超过当前区块 gas 限制。售罄交易包含池部署与 LP 铸造,若链上状态变化使估算不足,可先保留成交为阶段 2,再单独 launch。未用完的 gas 不收费。 8. phase = 2 时任何钱包均可调用 launch()。phase = 4 且 paidSharesOf(原付款钱包) > 0 时调用 refund(),成功后该钱包付费份额清零。 9. 财库结算使用 withdrawTreasury(),任何人可触发,接收者始终是不可变 treasury。拒收的财库不会阻塞用户铸造、开池或退款。 10. 开池卖出采用支持手续费代币的 Pancake V2 方法;滑点需覆盖 1% 转账税及价格影响,1% 本身不保证成交。不要要求无限授权;approve 仅在用户自行选择后续卖出时按需发生,铸造本身永远不需要 approve。 ## ABI(human-readable) AgentTown: - function info() view returns (uint8 phase, uint256 sold, uint256 freeClaimed, uint256 deadline, uint256 raised) - function price() view returns (uint256) - function identity() view returns (address) - function treasury() view returns (address) - function pair() view returns (address) - function soldOutAt() view returns (uint256) - function remainingQuota(bytes32 id) view returns (uint256) - function freeClaimedById(bytes32 id) view returns (bool) - function mintedById(bytes32 id) view returns (uint256) - function referrerById(bytes32 id) view returns (bytes32) - function paidSharesOf(address account) view returns (uint256) - function balanceOf(address account) view returns (uint256) - function claimFree() - function mint(uint256 shares, bytes32 referrer) payable returns (uint256 filled) - function launch() - function refund() - function invalidateFree(address account) - function treasuryCredit() view returns (uint256) - function withdrawTreasury() - function start() Agent ID 校验器: - function identityOf(address account) view returns (bytes32) - function idOfHandle(string handle) view returns (bytes32) ## 错误语义 - WrongPhase():阶段不允许,包括未开放、已过期或已经完成。 - NoIdentity():当前钱包没有有效 Agent ID,或校验器读取失败。 - QuotaExceeded():超出该 ID 额度,或免费额度已用 / 免费池已领完。 - InvalidAmount():零份数、支付金额不精确、没有可退份额或无可领取财库额度。 - InvalidReferrer():自己邀请自己、邀请人没有付费记录,或尝试后补 / 更换绑定。 - TransfersLocked():开池前试图公开转账。 - SettlementFailed():建池、退款或财库付款失败;检查当前阶段和交易收据。 - Unauthorized():非 owner 调用 start,或外部账户调用内部结算入口。 ## 安全边界 - 不索要、不接收、不记录私钥、助记词、钱包会话令牌。 - 铸造只用 BNB,不需要任何代币 approve。不要直接转 BNB 到合约,receive 会拒绝。 - 禁止向原版代币地址发送交易;任何地址占位符未替换时保持只读。 - 先核验部署信息与已验证源码;前端参数读取不是完整字节码审计。