ApexReserveToken / ApexVault / ApexDividend 三份合约经过两轮完整逐行审计。审计中发现的问题已全部修复并逐项复核通过,代码通过 solc 0.8.20 编译验证(0 error / 0 warning),当前处于可部署状态。
| 合约 | 核心职责 | 编译产物 |
|---|---|---|
ApexReserveToken |
主代币:ERC20、5% 买卖税、税费豁免名单、生态/早期合约内线性解锁、部署期一次性初始化 | 7,189 B |
ApexVault |
金库:三级触发检测、分批回购销毁、社区投票、V3 TWAP 价格、Chainlink 喂价 | 13,226 B |
ApexDividend |
分红:1% 持币分红,每日结算,按持仓比例领取 | 3,539 B |
专业审计必然发现并如实披露问题——"零问题"的展示反而不可信。以下完整列出每项发现、修复方案与复核验证; 所有问题均已在 V1.3 修复并复核通过,点击可展开查看细节。
代币无税费豁免名单,金库归集卖出/买入被征 5% 税(实收 ≈0.95×报价),而滑点保护按未税全额报价(0.98×)计算 → 正常行情下每次 tick 必然回滚,回购、升档、投票整体停摆。
代币新增 isExcludedFromFee 豁免名单(金库 setVault 时固化);金库买卖 minOut 改用路由现货报价 getAmountsOut。supporting-fee 路由买入由 pair 直转收款方,金库作为收款方被豁免 → 双向全额成交、零税损。
资金流推演:卖出 vault→pair 免税、买入 pair→vault 免税,minOut=0.98×现货 → 正常行情双向全额成交。
构造器将 90% 分给流动性接收方,创建 LP 时转账命中 5% 卖出税 → 实际入池 85.5%;金库/运营/分红同时凭空获得首块余额,"90% 进流动性""金库零初始配额"承诺从首块起不成立。
构造器固化 isExcludedFromFee[liquidityRecipient] = true,LP 注入全额进池,不再产生任何初始税分配。
推演:注入 9e8 → 0 税 → 全额进池。
Chainlink 喂价只校验 answer > 0,无陈旧性检查。喂价卡死或轮次异常时,金库 USD 价值、档位判定、回购预算全部失真。
新增 PRICE_STALENESS_WINDOW(1 小时)与轮次完整性校验,陈旧即熔断(归集卖出不受影响,见复核披露 L-7)。
走查:卡死喂价 → tick 熔断;depositTax() 仍可被任何人直接调用继续归集。
原投票选项 1(补充流动性)/2(生态激励)无执行路径,若胜出,金库资金将永久锁定(合约无 withdraw,任何入口都取不出来)。
V1.3 起投票仅支持选项 0(继续回购):vote() 强制 option == 0,结算固定回落 2 档继续回购,消除资金锁定路径。
走查:无任何资金转移路径。
tick 在单笔交易内依次执行归集卖出→档位检测→回购→投票,归集卖出因瞬时滑点等原因 revert 时,其余逻辑全部回滚。
归集卖出改为外部自调用 try this._executeTaxSell() {} catch {} 隔离,卖出失败不阻断 tick 其余逻辑。
走查:卖出 revert 不影响档位/回购/投票。
| 问题 | 修复方案 | 状态 |
|---|---|---|
| M-1 调用外部路由无重入防护 | tick() / vote() 增加重入锁 |
已修复 |
| M-2 归集卖出一次性清空金库(keeper 停机后单次砸盘) | 单次上限 MAX_TAX_SELL_PER_TICK(0.5% 总量),余额顺延分批卖出 |
已修复 |
| M-3 停机补量无上限(单次巨额买压) | 每个 tick 只执行一个回购窗口预算,节奏平滑 | 已修复 |
| M-4 投票无快照、可临阵买票 | 单选项后操纵失去意义;限制如实披露 | 已修复 |
| M-5 分红领取转账未校验;池自持份额产生不可领残余 | claim() 增加校验;分母剔除池自持份额,每期可被外部持有者完整领取 |
已修复 |
| M-6 生态 8% 一次性全额到账 | 合约内 365 天线性解锁,claimEcosystemVesting() 按进度领取 |
已修复 |
| 问题 | 修复方案 | 状态 |
|---|---|---|
| L-1 流通量口径虚高(含合约锁仓) | 流通量 = 总量 − 销毁 − 代币合约内锁定 | 已修复 |
| L-2 TickMath 缺边界校验 | ±887272 边界 + Uniswap 官方取整 | 已修复 |
| L-3 IERC20 返回值未检查 | approve / transfer 全部 require | 已修复 |
| L-4 归集指标口径虚高 | 重定义为"累计归集流量"并在代码披露 | 已修复 |
| L-5 Transfer 事件只发净值 | 改发全额 + 税分配独立事件 | 已修复 |
| D-1 部署死锁(合约无法部署) | 4 参数构造器 + 仅部署者一次性 setter 回填,设置后永久锁定 | 已修复 |
| D-2 编译阻断(无法通过编译器) | unicode 字面量 + IERC20 接口补 approve;solc 0.8.20 实编译通过 | 已修复 |
部署死锁与编译阻断证实:旧版 V1.2 代码从未真正编译、部署过。两项已在 V1.3 修复。
liquidityRecipient / marketingWallet 后续任何卖出均免税(为 LP 注入与运营出售而设计)。建议该两地址专款专用、不与交易账户混用,名单部署后不可修改。
喂价卡死超 1 小时时 tick 熔断;但 depositTax() 为无锁公开函数,任何人可直接调用继续归集卖出,存在降级路径。
① 预言机 decimals 假定 ≤18(BSC 标准 BNB/USD 为 8);② 投票门槛按 0.1% 总量计算(比流通量口径更严);③ 金库为空时 tick 可被频繁调用(仅 gas 开销);④ V3 池 observe 依赖 observationCardinality 初始化(见部署必核 3)。
| 级别 | 问题 | 修复 |
|---|---|---|
| 严重 | 分红池金额可被任意伪造 | depositDividend() 改无参,读实际余额增量 |
| 严重 | 领取后记账不同步(下溢风险) | claim() 同步扣减 accountedBalance |
| 严重 | 早期贡献激励永远无法领取 | 受益人地址可领 + 12 个月线性解锁 |
| 严重 | 初始金库配额上线即砸盘、直接跳档 | 移除初始配额,并入流动性(90%) |
| 高危 | 价格操纵(现货报价) | 改 V3 30 分钟 TWAP |
| 高危 | 滑点保护缺失(minOut=0,MEV 三明治) | 双向 2% 滑点保护 |
| 中危 | Keeper 单点依赖 | tick() 集成归集,permissionless |
| 中危 | 分红分母含销毁地址 | 分母改流通量 |
| 中危 | 自转账多余操作 | 删除无意义转账 |
| 中危 | 流速上限非常量 | 改 constant |
| 中危 | ERC20 approve 竞态 | 先 approve(0) 再 approve(N) |
修复 ≠ 零风险。以下为上线前必须逐项实测核验的事项,以及当前设计已知的边界。全部完成后方可部署。
① 路由接口:所选 Router 必须实测支持两个 supporting-fee 函数(README 示例的 V3 SwapRouter 为 V3 风格接口,需实测确认)。
② 交易对与 TWAP 池:交易对应为 V2 Pair;TWAP 观察池为 V3 Pool,两者分离配置。
③ V3 池 oracle 初始化:上线前增加 observationCardinality,覆盖 30 分钟以上。
④ setter 顺序:setVault → setDividendPool → setLpPair(setLpPair 前代币无税,禁止提前开放交易)。
⑤ 豁免名单确认:仅 {流动性接收方, 运营钱包, 金库},router 不在名单(避免买入税失效)。
⑥ LP 锁仓:主合约无池保护逻辑,LP NFT 必须第三方锁仓(DXsale / Unicrypt)。
30 分钟 TWAP + 24 小时升档确认已将操纵成本抬高到"持续影响价格超过 24 小时",但浅池仍有理论空间;可进一步接入 Chainlink 交叉校验。
仅选项"继续回购"可投,投票为确认性质,无资金风险;票权=当下持仓、无快照、无法定人数,属于简化治理,后续可升级快照投票/veToken 模型。
持仓快照为结算后的即时持仓,结算前后搬砖受 5% 双向买卖税抑制;如社区反馈严重可升级 Reflect 模式。
2% 滑点带内仍可被吃利;单次买/卖规模有上限约束。如需更高防护可接入私有 RPC(Flashbots Protect 等)。