pqchase/rugspull
GitHub: pqchase/rugspull
部署在 BNB Smart Chain 上的讽刺性高风险 DeFi 协议,以透明、链上可验证的方式实现一次性创始人撤资跑路发行,内置恒定乘积 AMM 和 Foundry 不变性测试。
Stars: 0 | Forks: 0
# Rugspull
BSC 优先的 MVP,用于透明的一次性创始人 rug(撤资跑路)发行。
[在线应用](https://rugspull.com) | [风险披露](https://rugspull.com/docs/risk) |
[WBNB 指南](https://rugspull.com/what-is-wbnb) |
[代币授权指南](https://rugspull.com/what-is-a-token-approval) |
[滑点指南](https://rugspull.com/what-is-slippage-on-bnb-chain) |
[恒定乘积 AMM 指南](https://rugspull.com/constant-product-amm-explained) |
[流动性与储备深度指南](https://rugspull.com/what-is-liquidity-on-bnb-chain) |
[交易回执指南](https://rugspull.com/what-is-a-transaction-receipt-on-bnb-chain) |
[事件日志指南](https://rugspull.com/how-to-read-event-logs-on-bscscan) |
[Foundry 不变性测试指南](https://rugspull.com/how-to-run-foundry-invariant-tests) |
[合约 ABI 下载](https://rugspull.com/api-reference) |
[领取/退款验证](https://rugspull.com/how-to-verify-claims-and-refunds-on-bscscan) |
[结算证据语义](https://rugspull.com/what-does-settled-mean-for-claims-and-refunds) |
[证据预发布](https://github.com/pqchase/rugspull/releases/tag/v0.4.0-evidence.1) |
[BscScan](https://bscscan.com/address/0xDFF540baBCa2ee8A2A8Ff26359Ecc9c5921D8A63#code) |
[X](https://x.com/rugspull) | [证据流](https://rugspull.com/feed.xml) |
[安全联系方式](https://rugspull.com/.well-known/security.txt) |
[集成包](https://rugspull.com/integration.json) |
[API 参考](https://rugspull.com/api-reference) |
[OpenAPI](https://rugspull.com/openapi.json) |
[Postman 集合](https://rugspull.com/rugspull-read.postman_collection.json) |
[APIs.json](https://rugspull.com/.well-known/apis.json) |
[API 入门](https://rugspull.com/.well-known/api-onboarding) |
[RFC 9727 API 目录](https://rugspull.com/.well-known/api-catalog) |
[集成指南](docs/INTEGRATION.md)
Rugspull 是高风险的讽刺性项目,不是安全的投资、收益产品或回报承诺。创建者可以在解锁后一次性出售全部披露的创始人份额,且仍然有可能面临全部本金损失。源码验证并非独立审计。
该协议使用 Solidity/Foundry 合约,以 WBNB 作为唯一的计价资产,包含统一定价的开盘批次、失败发行的退款机制,以及一个内部规范的恒定乘积 AMM。原生 BNB 仍需用于支付交易 gas;WBNB 余额和授权额度不能用于支付 gas。创建时需授权 Factory,捐款时需精确授权对应的 `RugInstance`,而规范的买卖仅在所需代币授权不足时才精确授权对应的 `RugPool`。规范的兑换会提交最小输出和截止期限限制;这些检查可能会回滚,但无法保证交易会被打包、拥有流动性、提供 MEV 保护或资金追回。RugPool 使用整数取整的恒定乘积算法基于存储的储备金进行报价;直接的代币转账仍然作为未报价的余额盈余,因为该池没有 sync 或 skim 功能。储备深度会影响价格影响,但非零储备并不能保证价格、执行、存在买家、退出机制或资金追回。创始人份额永远不会离开 `RugInstance`,并且只能在规范的 `RugPool` 中出售一次。
v0.4 将发行配置固定为:45% 创始人份额、24 小时的开盘期、开盘后 48 小时的创始人锁定期、30% 的最低发行额、50% 的已接受捐款上限、0.1 WBNB 的最低创建者质押以及 0.003 WBNB 的创建费用。规范交易采用名义上的 0.30% 手续费:0.25% 保留在池中,0.05% 的 WBNB 归入协议金库。
## 结构
```
contracts/ Solidity protocol and Foundry tests
packages/economics TypeScript parity implementation of economic formulas
packages/contracts-ts Chain constants and frontend contract helpers
workers/api Cloudflare Worker cache/index API
apps/web React + Vite frontend MVP
docs/ Technical specification package
```
请将安全问题私密地报告给 `info@rugspull.com`;在针对线上漏洞提交公开 issue 之前,请先查看 `SECURITY.md`。
对于非敏感的机制反例、缺失的不变性、测试漏洞或事实披露的更正,请使用结构化的[公开审查表单](https://github.com/pqchase/rugspull/issues/new?template=mechanism-counterexample.yml)。
## 命令
```
npm install
./scripts/check-prereqs.sh
npm test
npm run build
npm run check:release:local
npm run check:audit
npm run check:deploy:ready
CHECK_NETWORK=0 npm run check:deploy:ready
./scripts/check-config-consistency.sh
./scripts/check-deployment-records.sh
./scripts/check-abi-consistency.sh
./scripts/check-db-schema-consistency.sh
npm run check:local
SKIP_NETWORK_CHECKS=1 npm run check:local
./scripts/check-cloudflare-local.sh
npx playwright install chromium
npm run check:cloudflare:render
INDEXNOW_DRY_RUN=1 npm run submit:indexnow
npm run submit:indexnow
./scripts/check-cloudflare-remote.sh
WORKER_URL=https://your-worker.example npm run check:cloudflare:url
./scripts/check-bsc-testnet-e2e.sh
./scripts/check-bsc-verification-dry-run.sh
forge test
forge test --match-contract RugMathTest
forge test --match-contract RugPoolTest
forge test --match-contract RugInstanceTest
forge test --match-contract RugFactoryTest
forge test --match-contract RugInvariantTest
forge test --match-contract RugScenarioTest
```
## 安全边界
- MVP 中不使用可升级代理。
- 仅支持 WBNB。
- v0 版本中不包含 PancakeSwap 规范池。
- 不提供池储备提取功能。
- 没有任何后端端点会签名或执行买入/卖出/rug/领取操作。
- D1 仅为缓存/索引状态,不代表财务真相。
- BSC 主网已于 2026-07-15 在项目所有者的明确指示下部署,生产环境前端也完成了切换。Sourcify 和 BscScan 的精确源码验证以及分叉 E2E 测试已完成;独立审计、私有/SLA RPC、内容审核和法律审查环节仍处于待办状态,绝不能对外宣称已完成。
- 一次性部署者地址与共享的 Factory 所有者/协议金库地址是分开的。共享地址的托管风险是一项明确的单运营者治理决策。
## BSC 主网
当前不可变的生产环境部署:
```
RugFactory: 0xDFF540baBCa2ee8A2A8Ff26359Ecc9c5921D8A63
Tx: 0x95426057625753b19dfbe3754c5e79bdff771e69159cf69a67977b24cd464cc6
Chain: BSC Mainnet / 56
Block: 109991561
Owner: 0x0326E94178402Ea733dD6faa8f9E88962E3DF4d2
Treasury: 0x0326E94178402Ea733dD6faa8f9E88962E3DF4d2
Source: Sourcify + BscScan exact_match
```
BscScan:
无需私钥即可对已部署的 Factory 进行读取检查:
```
./scripts/check-bsc-mainnet-contracts.sh
VERIFY_DRY_RUN=1 ./scripts/verify-bsc-mainnet-factory.sh
# 仅在 BscScan 丢失其镜像的精确匹配记录时才重新提交。
BSCSCAN_API_KEY=... ./scripts/verify-bsc-mainnet-factory.sh
```
部署记录、构造函数配置、运行时代码哈希、gas 消耗以及分叉 E2E 证据记录在 `deployments/bsc-mainnet.json` 中。一次性部署者密钥被特意不予保存。
## BSC 测试网
当前测试网部署:
```
RugFactory: 0x336245d97Abb2F06eb396d6A9d671D4029CE2e5d
Tx: 0xff613aeba58f3dfa5943702967f05f93503c401adba1ec26ac4fc83165f2b85a
Chain: BSC Testnet / 97
Block: 118839588
Source: Sourcify exact_match
```
用于在线测试网验证的短期 E2E 部署:
```
Factory: 0x8e6ba49e54F7bDa1a5499D143395116d3430ae3c
Failed Rug: 0xeD8F823839a115B26cA126C0b41a61eC38b606bd
Rugged Rug: 0xF8f2BC14FbB238D2AB7EAf0Eb548FA27D7e2ac7c
Token: 0xdec35484bFF547Cc347441b9d881354Bd0c0dCbd
Pool: 0xFBb80c25Fc5Bb3E9e60949ce72Ffa9493513fE62
Source: Sourcify exact_match for all five contracts
```
在部署之前设置这些环境变量:
```
export PRIVATE_KEY=...
export WBNB=0xae13d989dac2f0debff460ac112a837c89baa7cd
export PROTOCOL_TREASURY=0x...
```
然后运行:
```
forge script contracts/script/DeployBscTestnet.s.sol:DeployBscTestnet \
--rpc-url https://data-seed-prebsc-1-s1.bnbchain.org:8545 \
--broadcast \
--verify
```
验证已部署的 Factory:
```
export FACTORY_ADDRESS=0x...
export BSCSCAN_API_KEY=...
./scripts/verify-bsc-testnet-factory.sh
# 不带 BscScan 凭证的 Constructor-arg dry-run。
VERIFY_DRY_RUN=1 FACTORY_ADDRESS=0x... ./scripts/verify-bsc-testnet-factory.sh
```
验证已启动的 RugInstance、RugToken 和 RugPool:
```
export RUG_ADDRESS=0x...
export TOKEN_ADDRESS=0x...
export POOL_ADDRESS=0x...
export BSCSCAN_API_KEY=...
./scripts/verify-bsc-testnet-rug-stack.sh
# 不带 BscScan 凭证的 Parameter dry-run。
VERIFY_DRY_RUN=1 RUG_ADDRESS=0x... ./scripts/verify-bsc-testnet-rug-stack.sh
# 针对已记录的 E2E Factory/Rug/Token/Pool 的 Full verification dry-run。
./scripts/check-bsc-verification-dry-run.sh
```
无需私钥或 BscScan 凭证即可读取检查已部署的合约:
```
./scripts/check-bsc-testnet-contracts.sh
./scripts/check-bsc-testnet-e2e.sh
VERIFY_FACTORY_PROFILE=0 \
FACTORY_ADDRESS=0x8e6ba49e54F7bDa1a5499D143395116d3430ae3c \
RUG_ADDRESS=0xF8f2BC14FbB238D2AB7EAf0Eb548FA27D7e2ac7c \
TOKEN_ADDRESS=0xdec35484bFF547Cc347441b9d881354Bd0c0dCbd \
POOL_ADDRESS=0xFBb80c25Fc5Bb3E9e60949ce72Ffa9493513fE62 \
./scripts/check-bsc-testnet-contracts.sh
```
创建一个测试 Rug:
```
export FACTORY_ADDRESS=0x...
export RUG_NAME="Transparent Test Rug"
export RUG_SYMBOL=TRUG
export METADATA_URI=r2://metadata/local-test.json
# 可选;如果省略,脚本将使用 keccak256(bytes(METADATA_URI))。
export METADATA_HASH=0x...
export CREATOR_STAKE=100000000000000000
forge script contracts/script/CreateRugBscTestnet.s.sol:CreateRugBscTestnet \
--rpc-url https://data-seed-prebsc-1-s1.bnbchain.org:8545 \
--broadcast \
--legacy
```
捐款并完成发行:
```
export RUG_ADDRESS=0x...
export CONTRIBUTION_AMOUNT=30000000000000000
forge script contracts/script/ContributeRugBscTestnet.s.sol:ContributeRugBscTestnet \
--rpc-url https://data-seed-prebsc-1-s1.bnbchain.org:8545 \
--broadcast \
--legacy
forge script contracts/script/FinalizeRugBscTestnet.s.sol:FinalizeRugBscTestnet \
--rpc-url https://data-seed-prebsc-1-s1.bnbchain.org:8545 \
--broadcast \
--legacy
```
领取、交易与 rug:
```
forge script contracts/script/ClaimOpeningBscTestnet.s.sol:ClaimOpeningBscTestnet \
--rpc-url https://data-seed-prebsc-1-s1.bnbchain.org:8545 \
--broadcast \
--legacy
export POOL_ADDRESS=0x...
export TOKEN_ADDRESS=0x...
export TO=0x...
export QUOTE_IN=1000000000000000
export TOKEN_IN=1000000000000000000000
export MIN_TOKENS_OUT=1
export MIN_QUOTE_OUT=1
forge script contracts/script/BuyRugBscTestnet.s.sol:BuyRugBscTestnet \
--rpc-url https://data-seed-prebsc-1-s1.bnbchain.org:8545 \
--broadcast \
--legacy
forge script contracts/script/SellRugBscTestnet.s.sol:SellRugBscTestnet \
--rpc-url https://data-seed-prebsc-1-s1.bnbchain.org:8545 \
--broadcast \
--legacy
forge script contracts/script/RugBscTestnet.s.sol:RugBscTestnet \
--rpc-url https://data-seed-prebsc-1-s1.bnbchain.org:8545 \
--broadcast \
--legacy
```
失败发行恢复:
```
forge script contracts/script/ClaimFailedRefundBscTestnet.s.sol:ClaimFailedRefundBscTestnet \
--rpc-url https://data-seed-prebsc-1-s1.bnbchain.org:8545 \
--broadcast \
--legacy
forge script contracts/script/WithdrawCreatorStakeBscTestnet.s.sol:WithdrawCreatorStakeBscTestnet \
--rpc-url https://data-seed-prebsc-1-s1.bnbchain.org:8545 \
--broadcast \
--legacy
```
## Cloudflare 本地 / 部署
Worker 通过 Workers Static Assets 同时提供 `/api/*` 和已构建前端的服务。
它还注册了一个 Cloudflare 定时触发器,每 5 分钟运行一次索引器。
创建流程通过 `/api/uploads/finalize` 写入可选的图片及元数据,因此单个一次性 Turnstile token 即可保护整个上传过程。底层端点 `/api/metadata/finalize` 和 `/api/assets/finalize` 仍保留用于单次请求的集成。
不可变的 R2 对象通过 `/api/r2/metadata/...` 和 `/api/r2/assets/...` 提供服务,以便被索引的 Rug 页面能够渲染出元数据和图片。
当前部署的主网 Worker/前端:
```
Primary URL: https://rugspull.com
Worker fallback: https://rugspull-api.nanqz.workers.dev
Chain: BSC Mainnet / 56
Factory: 0xDFF540baBCa2ee8A2A8Ff26359Ecc9c5921D8A63
Worker version: 308f2680-0e3a-4c96-8978-6c6fce241e49
Mainnet smoke Rug: none; no user-facing test asset was created with real funds
```
在进行任何公开部署之前,请在 Worker 上设置 `TURNSTILE_SECRET`,并在前端设置匹配的 `VITE_TURNSTILE_SITE_KEY`。如果没有该密钥,上传端点将直接失败并返回 `503`,且创建按钮将保持禁用状态。`ALLOW_UNPROTECTED_UPLOADS=1` 仅供本地或封闭测试的 Worker 绕过使用;它绝不是针对公开发布的豁免。
在 Worker 上设置 `ADMIN_TOKEN`,以要求手动触发 `POST /api/indexer/run` 时提供 `Authorization: Bearer ...`;定时任务 cron 会在内部自动提供相同的 token。
前端包含一个连接钱包的 WBNB 面板,用于将测试 BNB 包装成协议所需的 WBNB 计价资产。
账户页面会读取已索引的 Rug 信息以及已连接钱包在链上的 `contributionOf` 和 `claimed` 状态。
每个 Rug 页面还会读取已连接钱包的捐款和领取状态,以估算开盘代币的领取数量及退款金额。
池兑换和创始人控制会读取当前的 `RugPool` 储备,显示 1%/3%/5% 的滑点选择器,并提交非零的已计算最小输出量。
每个 Rug 页面会根据已索引的 `LaunchSucceeded`、`Swap` 和 `RugPulled` 事件重建价格、WBNB 交易量、池储备、协议手续费以及创始人 Rug 标记。`GET /api/rugs/:chainId/:rug/market` 提供有界的详情数据序列,而 `GET /api/market/sparklines` 则为多达 24 个 Rug 批量生成用于主页展示的紧凑序列。
图表数据和聚合市场统计信息是可以重建的 D1 发现缓存。它们绝不会被用于报价、滑点保护、余额查询或结算;交易控制将继续直接读取当前的合约状态。
已索引的行保留了其原始来源 `factory_address`;公开列表和账户查询仅公开配置的当前 Factory。历史 Factory 的交易记录依然可以通过地址直接访问,但如果 Rug 未暴露完整的当前接口,前端将会隐藏交易控制。
当 URL 链 ID 不受支持,或者当前的链上状态会拒绝该操作时,Rug 交易按钮将被禁用。
`/ops` 页面提供关于 API 配置、索引器最新区块、Factory 来源、同步状态以及 RPC 警告的只读视图。
```
npm run dev:cloudflare
./scripts/check-cloudflare-local.sh
./scripts/check-indexer-local.sh
REQUIRE_INDEXED_RUG=1 ./scripts/check-indexer-local.sh
```
`check-indexer-local.sh` 会验证索引器端点,并在配置的 RPC 支持历史日志时,验证已索引的 E2E 事件。已签入的 Worker 配置仅包含一个无需密钥的公共回退;支持归档数据的主 RPC 必须作为 `RPC_URL` Worker 密钥进行设置。在每次部署之前都必须重新运行预检,因为服务提供商的限制可能会发生变化。
在交接或部署之前,请设置 `REQUIRE_INDEXED_RUG=1`,以将已知的 rugged E2E Rug 设为强制性要求,而不是软警告。
在部署之前,请使用 `./scripts/check-bsc-rpc-logs.sh` 验证配置的 Worker RPC 是否能够读取历史 Factory 日志。
索引器会追踪 Factory 的 `RugCreated`、RugInstance 生命周期事件以及 `RugPool` 的 `Swap` 事件,以便每个 Rug 页面都能展示发行情况、交易历史及其基于事件生成的市场图表。
在发生 `RugCreated` 时,它还会读取诸如 `metadataURI`、`openingStart` 和 `founderUnlockTime` 等链上视图数据,以保持 D1 缓存数据对项目发现的有效性。
使用 `GET /api/indexer/status` 检查最新区块、已配置的 Factory 来源、同步进度以及 RPC/索引警告。
前端 `/ops` 页面会读取相同的配置和索引器状态端点,以便快速查看部署的健康状况。
在交接或部署之前运行完整的本地准入测试:
```
npm run check:release:local
npm run check:local
# CI/offline 模式:跳过依赖于公共 BSC RPC 历史的检查。
SKIP_NETWORK_CHECKS=1 npm run check:local
# 可选:同时读取检查历史的 BSC Testnet Factory。
RUN_BSC_READ_CHECK=1 npm run check:local
# 可选:同时读取检查生产环境的 BSC Mainnet Factory。
RUN_BSC_MAINNET_READ_CHECK=1 npm run check:local
# 可选:同时读取检查已部署的 BSC Testnet failed/rugged E2E flows。
RUN_BSC_E2E_CHECK=1 npm run check:local
# 可选:同时 dry-run BscScan 验证的 constructor args。
RUN_BSC_VERIFY_DRY_RUN=1 npm run check:local
# 可选:同时通过本地 Worker 验证浏览器渲染的 frontend 路由。
RUN_RENDER_CHECK=1 npm run check:local
```
部署:
```
# 完整的远程部署流程:local gate、远程资源、secrets、preflight、部署,
# 以及已部署 URL 的 smoke 检查。WORKER_URL 会覆盖自动检测到的 workers.dev URL。
ADMIN_TOKEN=... TURNSTILE_SECRET=... WORKER_URL=https://your-worker.example npm run deploy:cloudflare:remote
# 或者逐步运行相同的流程。
# 创建或查找 D1/R2 资源,并将实际的 D1 id 写入 wrangler.toml。
./scripts/prepare-cloudflare-remote.sh
# 或者从现有的 D1 id 手动更新 wrangler.toml。
D1_DATABASE_ID=... ./scripts/configure-cloudflare-bindings.sh
# ADMIN_TOKEN 是必需的;省略它将生成并安装 token,而不会将其存储在本地。
# TURNSTILE_SECRET 是公共就绪所必需的。
ADMIN_TOKEN=... TURNSTILE_SECRET=... ./scripts/configure-cloudflare-secrets.sh
./scripts/check-bsc-rpc-logs.sh
npm run check:deploy:ready
# 仅在 RPC archive 访问尚不可用时,用于本地 Cloudflare/account 就绪。
CHECK_NETWORK=0 npm run check:deploy:ready
# 当公共 RPC 拒绝 eth_getLogs 时的生产环境 fallback 模式;create flow 通过 eth_getTransactionReceipt + eth_call 注册新的 Rugs。
REQUIRE_RPC_LOGS=0 npm run check:deploy:ready
# 针对拒绝 eth_getLogs 的公共 RPC 的部署 fallback 模式。
# 新的 rugs 在 create 交易之后通过 /api/indexer/register-rug 注册。
# 注册请求必须包含已挖出的 create transaction hash;客户端提供的 block numbers 将被忽略。
REQUIRE_RPC_LOGS=0 ./scripts/check-cloudflare-remote.sh
./scripts/check-cloudflare-remote.sh
npm run deploy:cloudflare
WORKER_URL=https://your-worker.example npm run check:cloudflare:url
```
公开的漏洞报告指南已在 `SECURITY.md` 中详细说明。
标签:BNB Chain, DeFi, Foundry, Solidity, 区块链, 智能合约, 流动性池, 特征检测, 程序员工具, 自动化攻击, 讽刺项目, 高风险