TMTN = The Match, The Night
当前版本 v2.1 · 更新内容见 CHANGELOG.md
English summary. TMTN is a local, single-user trading terminal for BSC "agent-only" meme launchpads — Flap Agent Bonding Curve, Four.meme (OpenFour, Agent-ID-exclusive template) and gang.fun (old pad + V2 pads). It runs a small Node.js server on
127.0.0.1plus a browser UI. All signing goes through Binance's Agentic Wallet CLI (baw), so no private key is ever stored or handled locally. Features include a GMGN-style trenches view, K-line charts, live trade feed, per-trader PnL drawer, one-click buy/sell panel, holdings with USD PnL, auto-claim and optional per-platform auto-transfer. It trades real funds. It is unaudited. Use entirely at your own risk.
- 这是会动用真实资金的软件。 以实盘模式(
LIVE_TRADE=1)运行时,你在页面上点的买卖会通过币安 Agentic 钱包真实上链,无法撤回。 - 不构成任何投资建议。 meme 代币波动极大、流动性差、可能归零或无法卖出;作者不对任何亏损负责。
- 代码未经审计,可能存在 bug(价格换算、精度、授权、路由等)。请先用模拟盘和极小金额试用。
- 自动转出(自动把领取 / 发射后的代币转到指定地址):一旦打开,资金会在无人确认的情况下转走。请确认目标地址是你自己的,并理解风险后再打开。默认全部关闭。
- 预先授权(较大固定额度):为了更快,卖出 / 报价币买入时会授权比本次需要更大的额度(不是无限额)。被授权合约如果出问题,可动用的代币会更多。可以在页面关闭,或在「授权管理」里随时撤销。
- 本项目与币安、Flap、four.meme、gang.fun 等平台没有任何关联,第三方接口随时可能变化或失效。
一个跑在你自己电脑上的 BSC 内盘交易终端:
- 实时发现 Flap Agent 曲线、Four(OpenFour / Agent ID 专属模板)、gang.fun(老盘 + V2 报价币盘) 的新盘、即将发射、已迁移的代币;
- 用币安 Agentic Wallet CLI(
baw) 下单:签名在币安那边完成,本地不保存私钥; - 浏览器界面(
http://127.0.0.1:<PORT>),单人使用。
- 战壕(GMGN 风格三列:新创建 / 即将发射 / 已迁移):固定高度卡片、局部更新不闪;每列独立的预设筛选(市值、持有人、进度、税率、计价币、社交)、关键词、排序、提示音;屏蔽(代币 / 开发者)、收藏、快捷买入
- 详情页:K 线(TradingView Lightweight Charts,默认显示全部历史、按币龄自动选周期)、紧凑指标、右侧「活动」成交流(倒序 / 正序、一直翻到开盘第一笔)、底部实时成交 / 全市场成交流 / 我的持仓 / 订单 / 日志
- 交易者盈亏抽屉:点成交里的任意地址,看这个地址在这个币上的买卖、均价、已实现 / 未实现盈亏
- 一键买卖浮窗:P1/P2/P3 预设金额与比例(可编辑)、回本按钮、持仓汇总;半透明、可拖动
- 持仓:以美元为主的市值、成本、已卖出、盈亏(成本按每笔成交当时的 BNB 价格);计价币余额一键换回 BNB;链上卖出报价核对异常数值
- 收藏(分组、顶部收藏栏)、屏蔽列表(代币 / 开发者,存服务器)
- 税率显示与筛选:代币税、平台费、防狙击税
- 自动领取:Flap 曲线发射后自动
Portal.claim - 自动转出(可选,按平台分别开关):Flap 领取后 / Four 发射后 / Gang 发射后,把这个币的全部余额转到
AUTO_TRANSFER_TO;每个币只转一次、失败重试、遇到币安 App 确认会等待 - 卖出后自动换回 BNB:BNCB / GANG / 币股计价的盘,卖出到账的报价币(只这一笔的链上余额差)自动换成 BNB
- 预先授权(较大固定额度)+ 授权管理(查看链上额度、逐条撤销)
- 耗时记录:每笔订单的各阶段耗时写入
data/latency.jsonl(点击到服务器、下单前检查、广播、上链…)
- macOS / Linux,Node.js 18+(开发时用 v22),npm
- 币安 Agentic Wallet CLI(实盘需要):
npm i -g @binance/agentic-wallet
baw auth signin # 按提示在币安 App 里扫码 / 确认
baw wallet status # 显示 CONNECTED 即可必须先登录。 实盘模式(
MODE=live)下,程序每 10 秒用baw wallet status检查一次登录状态。未登录(或登录过期)时,页面会被一个关不掉的遮罩挡住,提示在终端运行baw auth signin、在币安 App 中确认;所有动用资金的接口(下单、兑换、换回 BNB、领取、撤销授权、单币转出规则)都会返回 401「币安钱包未登录」。登录完成后遮罩自动消失。偶尔一次检查失败不算掉线,连续 2 次才会锁定。没装 baw 时遮罩会提示安装命令。模拟盘不受影响。
- 交易 Four 专属模板需要币安的技能脚本(提供
agent-id-exclusive-token-launches.mjs):
npx skills add binance/binance-skills-hub --skill binance-agentic-wallet- 钱包需要在币安 App 里领取
.aiAgent ID、打开开发者模式(Agent 专属盘要求),并留一点 BNB 付 gas。
npm install
cp .env.example .env # 按需修改;程序启动时会自动读取项目根目录的 .env
npm run sim:8787 # 模拟盘:本地生成的代币和成交,不连钱包、不发交易
npm run live:8788 # 实盘:真实行情 + baw 真实下单(只有你在页面上点的订单才会下)然后打开 http://127.0.0.1:8787 或 http://127.0.0.1:8788。服务只监听本机。
币安 Agentic Wallet 用网卡 MAC 识别设备,同一台电脑上登录两个账号会互相挤掉。所以钱包 1 照常跑在电脑上,钱包 2、3、4… 各跑一个 Docker 容器(固定虚拟 MAC、自己的登录目录、端口只开在 127.0.0.1),可以加任意多个:
scripts/add-wallet.sh 2 --address 0x钱包2的地址 # 建容器 tmtn-wallet2(127.0.0.1:8789),默认只报价
docker exec -it tmtn-wallet2 baw auth signin # 用钱包 2 的币安账号扫码,核对配对码
scripts/add-wallet.sh --peers --write-env # 写进 .env 的 WALLET_PEERS,然后重启钱包 1完整步骤(前置检查、校验、扫错账号怎么办)见 docs/add-wallet.md,可以直接交给你的 AI 助手照做。
页面右上角的钱包菜单里打开钱包 2 的「参与下单」后:买入时每个钱包各花输入的 BNB;卖出时每个钱包卖自己持仓的同样比例;两个钱包并行执行,结果分别提示。没登录 / 后端没启动的钱包自动跳过。持仓页可以看全部钱包合并,或者只看某一个钱包。
| 变量 | 默认 | 说明 |
|---|---|---|
MODE |
sim |
sim 模拟盘 / live 实盘行情 |
PORT |
8787 |
端口 |
LIVE_TRADE |
0 |
1 = 实盘真实下单(只接受手动点击的订单);0 = 只报价 / 预演 |
MAX_TRADE_BNB |
0.5 |
单笔买入上限(BNB)的初始值,页面里改过后以 data/live-settings.json 为准;0 = 不限 |
AUTO_TRANSFER_TO |
(空) | 自动转出的目标地址。请设成你自己的地址;留空时三个自动转出开关都打不开 |
AUTO_TRANSFER_FOUR |
0 |
旧开关:1 = Four 发射后自动转出(现在一般用页面上的开关) |
PREAPPROVE |
0 |
旧功能:买入后无限额预授权,不建议打开 |
NODEREAL_RPC |
(空) | 私有 RPC(例如 NodeReal,含 key,只放 .env)。填了就作为主节点:读链、查确认、扫 Four 事件(一次约 5 万块),并通过它的 WSS 订阅 Gang 新盘创建事件;公共节点自动备用 |
NODEREAL_KEYS |
(空) | 多个 NodeReal key,逗号分隔(如 key1,key2,只放 .env)。轮流使用,被限流 / 额度用完的 key 冷却 5 分钟;页面只显示「NodeReal #1 / #2」,不显示 key |
RPC_URL |
有 NODEREAL_RPC 用它,否则 https://bsc-dataseed.bnbchain.org |
读链用的 BSC RPC |
FOUR_LOG_RPC |
有 NODEREAL_RPC 用它,否则 https://bsc-rpc.publicnode.com |
扫 Four 事件用的 RPC(getLogs) |
FOUR_LOG_STEP |
NodeReal 49000 / 公共节点 5000 |
每次 getLogs 查多少块 |
FOUR_BACKFILL_BLOCKS |
150000 |
启动时往回扫多少个区块的 Four 新盘 |
BAW_BIN |
baw |
baw 可执行文件路径 |
BINANCE_CHAIN_ID |
56 |
链 ID |
BAW_SLIPPAGE_UNIT |
percent |
baw 滑点参数单位 |
WALLET_LABEL |
币安 Agentic 钱包 |
页面上显示的钱包名 |
OPENFOUR_SCRIPT |
(自动查找) | Four 技能脚本路径 |
AUTH_SIMULATE_LOGGED_OUT |
0 |
调试:假装未登录 |
DATA_DIR |
data/ |
数据目录(多钱包时每个后端各用一个) |
WALLET_SLOT / WALLET_PEERS |
1 / [] |
多钱包:本后端是第几个钱包 / 一起下单的其他钱包后端 |
WALLET_ADDRESS |
(空) | 本后端只允许这个钱包地址;baw 登录成别的账号时拒绝使用(防止拿错账号下单 / 自动转出) |
FEEDS_PUBLIC |
0 |
1 = 行情订阅只用公共节点(第二个钱包的后端用,省 NodeReal 额度) |
NAME_RPC |
publicnode / bnbchain(逗号分隔) | 解析 .ai 域名用的 RPC |
BSC_TESTNET_RPC |
https://data-seed-prebsc-1-s1.bnbchain.org:8545 |
测试网 RPC(模拟 / 测试网钱包用) |
BSC_WSS |
wss://bsc-rpc.publicnode.com |
只给 scripts/watch-four.js 用的 WebSocket 节点 |
FOUR_MANAGER |
0x5c95…762b |
只给 scripts/watch-four.js 用:four.meme TokenManager2 合约 |
| 文件 | 内容 |
|---|---|
live-settings.json |
页面设置:单笔上限、自动领取、自动转出开关、快捷买入金额、一键买卖预设、预先授权开关等 |
positions.json |
本程序记录的持仓与成本 |
latency.jsonl |
每笔订单的耗时记录 |
tokenRules.json |
单币规则(发射后领取 / 转出)及执行记录(含交易哈希) |
approvals.json |
本程序授过的额度(代币 → 合约) |
favorites.json / blocklist.json |
收藏、屏蔽列表 |
names.json |
地址 → .ai 域名缓存 |
fourTokens.json / flapCreated.json |
Four / Flap 代币登记(重启后恢复列表用) |
transferWatch.json |
转出监控记录 |
img/ |
代币头像缓存 |
testnet-wallet.json |
模拟 / 测试网用的一次性钱包(含私钥,仅测试网) |
server.js Express + WebSocket 服务、全部 API
engine/
agent.js market.js trader.js chain.js 模拟盘引擎(自动买已移除)
blocklist.js favorites.js 屏蔽、收藏
live/
config.js 环境变量、合约地址
baw.js 调 baw CLI(预演、执行、市价单、余额、钱包锁、登录)
liveMarket.js 实盘行情汇总:Flap / Four / Gang 代币、成交、K 线、涨幅、交易者统计
agentCurve.js fsi.js shrine.js Flap Agent 曲线数据(Reader、fsi、shrine)
fourMeme.js openFour.js Four:链上事件、OpenFour 技能脚本
gangFun.js gangTrade.js gangV2Pads.js gang.fun:接口、老盘、V2 盘
gangChain.js gang.fun 新盘:监听链上创建事件(WSS 订阅 + getLogs 补查),比接口轮询快
flapChain.js Flap Agent 曲线:订阅链上成交 / 新市场事件(代替第三方 shrine 推送)
portal.js Flap Portal 买 / 卖 / 领取、发交易并等回执
liveTrader.js 下单流程、自动领取、单币规则 / 自动转出、计价币换回 BNB、授权管理
holdings.js 持仓与盈亏(钱包历史、历史 BNB 价格、链上卖出报价核对)
approvals.js 预先授权策略
latency.js 耗时记录
meta.js names.js transferWatch.js
public/ 页面(index.html、app.js、style.css、vendor/lightweight-charts)
scripts/ 只读的辅助脚本(耗时报表、测试网信息、监听 Four 新币)
这个终端本身就是一个本地 HTTP + WebSocket 服务,Claude Code、Codex 之类的 AI 助手可以直接帮你搭起来,也可以通过接口读行情、报价、(经你确认后)下单。
把下面这段交给你的 AI 助手执行(登录币安钱包那一步必须你本人在手机上确认):
git clone <本仓库地址> tmtn && cd tmtn
npm install
cp .env.example .env # 需要的话在 .env 里填 NODEREAL_RPC、AUTO_TRANSFER_TO 等;key 只放这里
npm i -g @binance/agentic-wallet
baw auth signin # 终端会给出链接 / 二维码,由你本人在币安 App 里确认
npx skills add binance/binance-skills-hub --skill binance-agentic-wallet # 交易 Four 专属模板需要
npm run sim:8787 # 先用模拟盘跑通:http://127.0.0.1:8787
npm run live:8788 # 确认没问题后再开实盘:http://127.0.0.1:8788建议让 AI 先只用模拟盘或 LIVE_TRADE=0(只报价),确认它的操作逻辑没问题再开实盘。
地址都是 http://127.0.0.1:<PORT>,请求和返回都是 JSON。实盘(MODE=live)和模拟盘的接口一样,少数只有实盘可用(下面标了「实盘」)。
行情与代币
| 方法 | 路径 | 参数 | 说明 |
|---|---|---|---|
| GET | /api/state |
— | 全量状态:mode、bnbUsd、tokens(所有代币摘要)、wallets、positions、holdings(持仓快照)、orders、settings、config、net 等 |
| GET | /api/token/:addr |
— | 单个代币详情:摘要 + candles(K 线)+ 最近 trades |
| GET | /api/lookup/:addr |
— | 按地址查一个币(不在列表里也会去链上查) |
| GET | /api/trades/:addr |
before(毫秒时间戳)、limit(≤500) |
成交历史,往前翻页,一直到开盘第一笔;返回 { items, end, complete, total } |
| GET | /api/trader/:addr/:trader |
— | 某个地址在这个币上的买卖和盈亏(实盘) |
| GET | /api/names |
ver |
地址 → .ai 域名映射 |
curl -s http://127.0.0.1:8788/api/state | jq '.tokens[0]'
# {"address":"0xf23e…e597","symbol":"INUPUNK","platform":"gang","stage":"curve","quote":"BNB",
# "price":6.25e-9,"mcapUsd":4800,"progress":3.2,"buyFeePct":1,"sellFeePct":1,"holders":12, ...}
curl -s "http://127.0.0.1:8788/api/trades/0xf23e…e597?limit=1"
# {"items":[{"ts":1792948522000,"side":"sell","tokens":155421.05,"bnb":0.00096,"price":6.25e-9,
# "trader":"0x09a8…","name":"6123.ai","tx":"0x08d7…","usd":0.71}],"end":false,"complete":true,"total":4}报价与下单
| 方法 | 路径 | 参数 | 说明 |
|---|---|---|---|
| GET | /api/preview |
wallet、token、side(buy/sell)、amount(买入是 BNB,卖出是百分比)、slippage(%) |
只报价 / 预演,不下单 |
| GET | /api/cost-for-pct |
wallet、token、pct、slippage |
买到总量的 pct% 大约要多少 BNB |
| POST | /api/order |
{ wallets: ["baw"], token, side, amount, slippage } |
下单。LIVE_TRADE=1 时真实上链(受单笔上限、钱包锁等检查);否则只预演 |
| POST | /api/swap/quote |
{ from, to, amount, slippage } |
BNB ⇄ 任意代币报价(实盘,baw 市价单);BNB 用 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE |
| POST | /api/swap |
{ from, to, amount 或 pct, slippage } |
兑换(实盘) |
| GET | /api/token-info/:addr |
— | 读链上 ERC20 信息和你的余额(实盘) |
| GET | /api/quote-balances |
— | 钱包里的报价币余额(BNCB、GANG…) |
| POST | /api/quote-to-bnb/preview、/api/quote-to-bnb |
{ token, slippage } |
报价币全部换回 BNB 的报价 / 执行 |
| POST | /api/claim |
{ market } |
领取 Flap 曲线发射后的代币 |
curl -s "http://127.0.0.1:8788/api/preview?wallet=baw&token=0xf23e…e597&side=buy&amount=0.01&slippage=20"
# {"route":"Gang 内盘 · buy(BNB,一笔完成)…","amountIn":0.01,"out":1581651.2,"minOut":1265320.9,"feeBnb":0.0001,"feePct":1}
curl -s -X POST http://127.0.0.1:8788/api/order -H 'content-type: application/json' \
-d '{"wallets":["baw"],"token":"0xf23e…e597","side":"buy","amount":0.01,"slippage":20}'
# [{"id":"…","status":"filled"|"failed"|"pending"|"dry_run","tx":"0x…","reason":null,"steps":[…],"latencyMs":3120}]持仓、设置、列表
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/holdings(?refresh=1 强制重读) |
持仓快照:每个币的数量、市值、成本、已卖出、盈亏(BNB / 美元) |
| POST | /api/settings |
改设置:maxTradeBnb、autoClaim、sellToBnb、preApproveCap、三个自动转出开关、一键买卖预设等 |
| POST | /api/config |
改快捷买入金额等(quickBuy);自动买入已移除,不能打开 |
| GET/POST | /api/favorites |
收藏;POST `{ op: "set" |
| GET/POST | /api/blocklist |
屏蔽;POST `{ kind: "token" |
| GET/POST | /api/token-rules |
单币规则(发射后领取 / 转出) |
| GET | /api/approvals;POST /api/approvals/revoke |
授权列表;撤销 { token, spender }(会发一笔交易) |
| GET | /api/latency-stats?days=1 |
下单耗时统计(按平台 / 方向,p50 / p90、各步骤平均) |
| POST | /api/auth/check、/api/auth/login |
查 / 发起币安钱包登录 |
| GET | /api/img?u=<url> |
代币头像代理(缓存到本地) |
WebSocket:连 ws://127.0.0.1:<PORT>/ws。
- 发送
{"type":"sub","token":"0x…"}订阅一个币,会收到它的detail(full: true是全量,之后是增量 K 线和成交)。 - 服务器推送的消息类型:
tick(定时全量:代币列表、钱包、持仓、网络状态)、launch(新盘)、trade(全市场成交)、detail、order(订单状态变化)、holdings(持仓快照)、settings、config、favorites、blocklist、rules、autoTransfer、log、record。
GET /api/state或订阅 WebSocket 的tick/launch,拿到新盘列表;- 按条件过滤:
buyFeePct/sellFeePct(税率)、mcapUsd、holders、progress、quote、是否被屏蔽; - 对候选币调用
/api/preview报价,看预计到手和最少到手; - 把报价交给人确认,确认后才调用
POST /api/order; - 通过 WebSocket 的
order消息跟踪结果(pending→filled/failed),GET /api/holdings看盈亏。
- 服务只监听 127.0.0.1,而且没有任何鉴权:谁能访问这个端口,谁就能用你的钱包下单。绝对不要把它暴露到公网,也不要做端口转发 / 反向代理。
- 开发和调试时用模拟盘(
MODE=sim)或LIVE_TRADE=0(只报价)。 - 设好单笔上限(
MAX_TRADE_BNB或页面里的设置),AI 下的单也受它限制。 - 自动转出、预先授权默认都是关的,只有你自己在页面上打开才生效;AI 不应该替你打开。
- RPC key、自动转出地址等只放
.env,不要写进代码、日志或聊天。
| 用途 | 地址 |
|---|---|
| Flap Agent Curve Reader | 0x18Aa6C93f1887a243fdc348C9A77F5136555174a |
| Flap Portal | 0x49387D2E6cbF8FefE856e3FBc3E98a01aC3af062 |
| Flap Factory | 0xC55820f24015bE7c4f18949D9e1363A3609B300e |
OpenFour Core(模板 1778027615735) |
0xebe7b6c1089d9f72ad07f34e36d898e44e5e27f3 |
| gang.fun 老盘 | 0x315Ba2e8952D06094CC636b2B84229FA32fb23A7 |
| gang.fun V2 pads | 0x1B8F3f69DFa0a7F63d308C7EB0Fd38D8b099966E、0xF81C4E51c48466c6025B0165b1Ea0F6978c712cb、0x60aee38576035E757deD30fF8db8A8DA476430C1 |
| WBNB / BNCB / GANG | 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c / 0x4902C5ebc598265Ed2212b559B042De8a5Eeec3f / 0x0c6302401aa5325C2E36F170f52C00B1d220B405 |
数据源:BSC RPC(bnbchain / publicnode)、gang.fun API、fsi.taxed.fun、shrine.trade、DexScreener、GeckoTerminal、币安行情接口。
- TradingView Lightweight Charts(Apache-2.0),本地副本在
public/vendor/,许可证见public/vendor/lightweight-charts.LICENSE - ethers、express、ws(见
package.json)
MIT © 2026 0xZhangCrypto1