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, 区块链, 智能合约, 流动性池, 特征检测, 程序员工具, 自动化攻击, 讽刺项目, 高风险