测试与验证
层级
| 层级 | 能发现什么 |
|---|---|
| Foundry 单元测试 | 预期行为,逐个合约 |
| 模糊测试 | 没有人想到的输入 |
| 不变量 | 在任意操作序列之后都必须成立的属性 |
| 分叉测试 | 针对真实合约、基于真实状态的行为 |
| 形式化验证 | 在所有路径上得到证明的属性,而非抽样 |
| 静态分析 | 已知的危险模式 |
| 文案审计 | 禁用词汇和视觉禁令 |
经济不变量
这些是必须始终成立的等式:
- 四个份额之和恰好等于所收取的税,默认为 500 个基点,没有任何 wei 损失
- 没有人能将金库的资产提取到其自选的地址;唯一可能的减少途径是转换、向持有者空投,以及所有者的紧急转移
- 一个篮子的权重之和为 100 %,且永不改变
- 两个头寸在创建时存入,只能通过终止模式在宣布 30 天之后被移除
- 流动性被锁定;其唯一的出口是终止模式,由所有者提前 30 天宣布
$STOCKFUN回购只能将买入的代币发送至销毁地址,不能发往其他任何地方- 每个市场的创建者供应量都为零
- 金库只能买入其篮子中的资产
- 金库只获取 ETH、USDC、USDG 及其篮子中的股票,外加可选 Ondo 通道上退回的 USDon
- 一个空投循环逐只股票支付的数量从不超过其持有量,任何持有者获得的数量也从不超过其按比例计算的份额;空投合约在所有循环和搁置股票上所欠的数额,从不超过其余额——自 2026-09-27 起为必需项,自 2026-10-04 起由一个有状态不变量测试。自 2026-10-05 起,即使在紧急情况下,支撑这些账目的资产也始终由合约实际持有的代币构成,从不由尚未计入的代币构成,这由第二个有状态不变量测试
- 只有流动性锁定合约能向 StockFun 池子添加流动性
- 一笔交易只向该市场的金库付款;其他份额留在 Hook 上,直到被领取。自 2026-10-05 起,拒收其份额的金库会在 Hook 上被欠下这笔份额,交易照常进行
- 每只篮子股票只花费为它预留的现金
它们是在当前的实现合约上检查的;升级会替换它们被检查时所依据的代码。
大小限制
EIP-170 的限制是 24,576 字节的运行时代码。它由一个会让测试套件失败的测试来强制执行,而不是依靠人工检查。
在这里这是一个实实在在的限制:工厂合约不得不被拆分。在 2026-10-02 之前,金库部署器嵌入了 TreasuryVault 的创建代码,是最接近上限的合约,金库中每增加一行代码,都要从这部分余量中扣除。2026-09-28 移除创建者回购之后,它从 23,055 字节降到了 14,965 字节;2026-10-01 的修复逐只股票预留现金,使它增至 15,954 字节。自 2026-10-02 起,它部署的是一个代理合约,而必须控制在限制之内的是每个模块的实现合约。
2026-10-05,空投合约成为最接近上限的合约。第四个审计循环对领取所做的改动让它超出了限制;把它的一些视图函数改为 private,并去掉记在单个循环名下的紧急转移,使它回到 24,432 字节,比上限低 144 字节。
2026-09-29 审计之后
2026-09-29 安全审计之后修复的每一项发现,都有在被审计代码上会失败的回归测试;其中大多数是审计的概念验证,经过反转以检查修复后的行为。
2026-10-01 的安全流水线
第二轮审计由两位独立审计员进行,随后在修复后的代码上重新运行了每一项检查。它对合约和 Keeper 所做的每一项修复都有回归测试。在 2026-10-01,这些修复完成之后:
- Foundry。分叉测试套件之外的 421 个测试全部通过,深度测试配置也同样通过:20,000 次模糊测试运行,不变量测试为 512 次运行、深度 128。分叉测试套件没有运行:当时没有可用的 RPC URL。
- 变异测试。slither-mutate 在五个合约上运行:费用分配合约、持仓记录、国库金库、Robinhood Chain 上的股票路由器和远端枢纽。它生成了 1,301 个变异体,也就是对代码的微小刻意改动,测试捕获了其中 1,118 个。在存活下来的 183 个中,107 个与原始代码等价:没有任何输入能把它们区分开。其余 76 个揭示了测试原本没有做的检查;如今测试已经全部覆盖。没有任何变异体揭示出漏洞。
- 形式化验证。每一个 Certora 任务都在证明器上针对修复后的代码重新运行(certora-cli 8.8.1,基本健全性检查)。没有任何规则被违反。七条
LiquidityLock规则在一个方法lockProtocolLiquidity上仍未得出结论:它们超出了时间限制,以更长时限进行的重新运行也没有得出结论。它们在其他所有方法上都成立;该方法仅限所有者调用,只运行一次,用于$STOCKFUN,Foundry 测试覆盖了它的访问控制、一次性使用以及其锁定的形态。其余未获验证的结果都是已知的空真情形:一条针对每个方法运行的规则,遇到了一个在验证环境中永远无法成功的方法。TreasuryVault第一次运行中的失败来自规范本身的两处假象,都不是漏洞;规范已被修正。 - 模糊测试与符号执行。Medusa 对持仓记录的五个属性运行了十分钟,没有任何失败。它的第一次运行发现,在一条时钟从第 0 个小时开始的链上,即一条测试链上,已记录供应量的第一个整点标记缺失;没有任何真实的链受到影响,代币如今在部署时就记录这个标记。Halmos 对界限内的每一个输入都通过了三项符号检查:费用拆分是精确的,已记录供应量能准确跟随任意两次转账,它在下一个整点的积分也是正确的。Mythril 无法在部署之外探索协议合约,覆盖率约为 14 %;在自包含的持仓记录上,它在 15 分钟内达到了 31 %,没有报告任何问题。
- 静态分析。Slither、Aderyn 和 Solhint 都没有发现任何新问题。
- 在全新的本地链上。一次完整部署、一次真实的 Keeper 循环和十个用例都通过了。部署演练,即按运维手册的顺序运行生产脚本,在修复一个脚本之后通过:mock 通道的脚本把它的初始资金铸造给了 forge 的默认发送方,而不是部署所用的密钥。
| Certora 任务 | 已验证 |
|---|---|
BuybackBurner |
12 |
Fees |
5 |
LiquidityLock |
13 |
StockFunFactory |
23 |
StockFunHook |
36 |
StockFunProtocolToken |
9 |
StockFunSwapRouter |
8 |
StockFunToken |
11 |
TreasuryOracle |
8 |
TreasuryVault |
32 |
UniswapV4StockRouter |
12 |
那次运行还验证了 TeamVesting 的 11 条规则,该合约及其规范已于 2026-10-05 删除。证明器不覆盖 Robinhood Chain 一侧:远端枢纽、镜像金库和股票路由器。
2026-10-02 的可升级重新设计
使模块可升级的这次重新设计,是在上述所有检查之后进行的。在 2026-10-02,针对新代码:
- Foundry。分叉测试套件之外的 458 个测试全部通过。新的测试套件覆盖了以太坊和 Robinhood Chain 上的升级——谁可以升级、新的实现合约必须保留的授权方和
PoolManager、逐个升级的金库——以及终止模式。持仓记录的测试套件随记录一起迁移到了持仓记录器。 - 存储布局。每个可升级模块的存储布局都记录在
contracts/storage-layouts/中,只要变更不是追加,contracts/script/check-storage-layouts.sh就会失败。它应当在每次升级之前运行。自 2026-10-05 起,它会检查每个结构体的每一层:参见部署。 - 在全新的本地链上。
LocalRun脚本通过。 - 形式化验证。Certora 规范正在针对新代码进行更新。它们最近一次完整的证明器运行是在 2026-10-01,早于这次重新设计:上表描述的就是那次运行。
上文所述的深度测试配置、变异测试、模糊测试与符号执行以及静态分析,都是在 2026-10-01 针对重新设计之前的代码运行的。
2026-10-04 的空投
空投合约和两条 sendToAirdrop 路径于 2026-10-04 写进代码,尚未部署。当天,针对新代码:
- Foundry。分叉测试套件之外的 514 个测试全部通过,空投之前为 459 个。三个新的测试套件:
AirdropDistributorTest,38 个测试;AirdropCrossChainTest,15 个,以 mock 模拟 LayerZero;AirdropInvariantsTest,2 个,围绕一个有状态不变量:在随机的发送、领取、归入、开启以及排除名单和循环时刻的变更之下,两个市场之间的守恒与偿付能力,128 次运行、每次 64 个调用。份额计算的模糊测试运行 512 次。 - Gas。领取一个包含两到三只股票的循环,按测试中的测量约消耗 120,000 至 210,000 gas,而测试是在热存储下运行的:一笔真实交易的成本会略高一些。来自 Robinhood Chain 的一次送达在以太坊上约消耗 85,000 至 1,016,000 gas,为冷启动测得:参见部署。
- 在本地链上。在 Anvil 上,先运行
LocalRun,再运行LocalAirdrop:两位持有者,股票在 13:00 UTC 之前被搁置,之后被归入并领取。每一次领取都恰好是其份额的向下取整,每只股票留下 1 wei 的粉尘。 - 形式化验证。涉及被修改合约的五份 Certora 规范通过了类型检查。证明器没有运行,也没有任何规范覆盖空投合约。
- 链下。Keeper 的 93 个测试、shared 包的 43 个、后端的 9 个以及 worker 的 58 个测试全部通过。
- 审查。Codex(gpt-6-astra)先审查了设计,然后审查了代码:发现一个 Medium,涉及搁置股票的时机,以及一个 Low,涉及本地脚本,两者都已修复。对修复的复审又发现一个 Medium,涉及排除名单修改的时机,以及一个 Low,涉及本地脚本的执行顺序,两者都已修复:一个时间窗口依据其关闭时有效的排除名单计量,而脚本会先归入搁置的股票。对这两项修复的最终检查在所述保证的范围内没有发现任何漏洞:搁置的股票归入第一个拥有合格持仓的时间窗口,无论由谁调用、何时调用,前提是在此期间循环时刻没有改变,代币的持仓记录器也没有被替换。这些报告位于
projet/docs/audit-2026-10-04/。
2026-10-05 的变更
没有团队分配、立即生效的紧急模式,以及每个数值都成为所有者的设置,于 2026-10-05 写进代码,尚未部署。当天,针对新代码:
- Foundry。测试套件全部通过,共 520 个测试。两个新的测试套件
Settings和SettingsCrossChain覆盖每一项设置:谁可以设定它、它拒绝哪些数值,以及变更之后的下一个操作——其中包括税和防狙击、发射形态、每个池子保留其键,以及锁定头寸所收取部分的分配份额。费用属性,无论是模糊测试还是符号执行,在任何被接受的设置下都成立。紧急模式的测试随立即生效的转移进行了调整,归属合约的测试则随该合约一并删除。 - Gas。读取税的设置让一笔兑换多消耗约 1,200 gas(热存储)。
- 形式化验证。费用、Hook、锁定合约、工厂合约、代币和预言机的规范都已随设置更新,并在本地通过了类型检查。证明器没有运行。
2026-10-05 的审计循环
同一天,五个审查循环检查了这份尚未部署的代码;从第四个循环起,违反创始人“一处失败绝不阻断其余部分”这一规则的情形被算作缺陷(参见架构)。每一项修复都有回归测试。针对每个循环的代码:
- Foundry。第四个循环之后有 602 个测试通过,第五个循环之后有 613 个;当天结束时,614 个测试通过,三个分叉测试套件因没有 RPC 而跳过。每个合约都在 EIP-170 的限制之内,存储布局只在某项修复追加了状态的地方有所增长。
- 不变量。第三个循环之后,空投的不变量在深度测试配置下通过了 512 次运行、深度 128。第二个有状态不变量让空投经历各种紧急情况:最后一步延迟运行的送达、误入的代币、转出、送回、减记和暂停,以及自第五个循环起被其发行方冻结的股票和
claimMany。 - 形式化验证。这些循环新增了关于 Hook(它欠各金库的款项、它的误入资金)、关于锁定合约(它保留的份额、它的救援函数)、关于销毁合约和代币(它们的救援函数)的规则,以及一条规则:在路由器、预言机和工厂合约上,只有协议所有者可以执行救援。第四个循环之后,11 份规范中共有 213 条规则和不变量;第五个循环之后,又新增了一条关于代币救援函数的规则。每一份被修改的规范都在本地通过了类型检查;没有任何东西被提交给证明器,其最近一次运行仍是 2026-10-01 的那一次。
- 链下。在 Keeper 的空投步骤、dapp 的领取页面以及第四个循环的链下审查之后:Keeper 的 191 个测试、shared 包的 51 个、后端的 9 个以及 worker 的 90 个测试全部通过,应用也通过了类型检查和 lint。
- 在本地链上。在 Anvil 上,先运行
LocalRun,然后运行 Keeper、worker 的引擎和应用的领取准备流程:在部署所在的时间窗口内,Keeper 没有发送任何东西;在下一个时间窗口中,它开启了两个循环并发送了两个金库的股票,一次claimMany在这两个循环中支付了五只股票,约消耗 421,000 gas,此后claimable读数为零。
第五个审计循环的链下审查,2026-10-06
第五个审计循环对 Keeper、worker、应用和脚本的审查发现了三个中等严重性问题和十六个低严重性问题,每一个都已通过回归测试修复,尚未部署。于 2026-10-06 运行:
- Foundry。在当天的代码上有 619 个测试通过,三个分叉测试套件因没有 RPC 而跳过:Lens 的新字段、五只股票的篮子上限和恢复的
$STOCKFUN发射都有各自的测试。存储布局没有变化。 - 链下。Keeper 的 210 个测试、shared 包的 51 个、后端的 9 个以及 worker 的 111 个测试全部通过;移除修复后,每一项 Keeper 修复的测试都会失败。应用通过了类型检查和 lint;它没有测试运行器,它的领取准备流程已移入 worker 的引擎,由后者的测试覆盖。
- 在本地链上。在一个私有 Anvil 上的演练通过了它的六个场景:
LocalRun,其试运行不写入任何部署文件;Keeper 运行两个时间窗口,每个时间窗口转换一次每个金库的 ETH,然后归入、开启并发送一次空投,每一笔领取都精确到 wei;一个拒收 ETH 的金库,它在 Hook 和锁定合约上的欠款在其恢复之后得到支付;在运行中途被终止时的状态文件及其锁,没有任何东西被发送两次,一笔被替换的交易和一笔被丢弃的交易都得到了处理;救援函数以及每日一次的 LP 手续费收取。跨链桥通道、应用和 worker 不在其中。
演练之后,2026-10-06
演练的发现已于当天修复,尚未部署。即使某个市场的金库没有任何新的东西可发送,Keeper 也会归入空投合约为该市场搁置的股票,并按检查所针对的时间窗口、而不是按自己的时钟,记录低于门槛的金库;它把被搁置的发送单独计数,不再理会金库最后一段买入永远无法花掉的那几个单位的 USDC,并在其日志中显示池子 ID。第六个审查循环的第一个领域在合约中没有发现任何问题,在一个本地脚本中发现了一个低严重性问题,已修复:本地部署文件在 Keeper、应用或 worker 使用之前会与链上进行核对。在这份代码上:
- Foundry。620 个测试通过,三个分叉测试套件因没有 RPC 而跳过:多出的一个测试是恢复的
$STOCKFUN发射拒绝了一个持有另一个篮子股票的金库 - 链下。Keeper 的 218 个测试、shared 包的 51 个、后端的 9 个以及 worker 的 111 个测试全部通过;每一项 Keeper 修复的测试在修复之前的 Keeper 上都会失败。本地部署文件的检查没有自动化测试:它是在一个私有 Anvil 上手动运行的,在那里它接受了一次全新部署,并拒绝了一个两个合约角色被调换的文件
第六和第七个审计循环之后,2026-10-06
第六个审计循环和第七个审计循环对 Keeper 和 worker 的修复都在当天完成,尚未部署;两者都没有改变任何合约的代码,只更正了合约中的一条注释。于 2026-10-06 在提交 415dcae 上运行(合约取自该提交的一份干净副本,因为当时其他合约工作正在进行):
- Foundry。620 个测试通过:分叉文件之外的 615 个,以及 Robinhood Chain 分叉测试套件针对其公共 RPC 的五个;三个以太坊分叉测试套件因没有 RPC 而跳过。与演练之后的数量相同:没有任何合约测试发生变化
- 链下。Keeper 的 277 个测试、shared 包的 51 个、后端的 9 个以及 worker 的 137 个测试(共 11 个文件)全部通过。第七个审计循环的每一个概念验证都是一个回归测试,每一项修复的新测试在修复之前的代码上都会失败,只有少数测试例外,它们固定了旧代码本来就具有的行为(Keeper 无法估值的发送照常进行;旧的状态文件可以加载),另外图表的测试也例外,因为其函数是新的。一份由第六个审计循环之前的 Keeper 写入的状态文件被保留为测试夹具,并能被新的 Keeper 加载
- 应用。它通过了类型检查、lint 和构建,其预渲染的演示图表铺满了整个绘图区域;它没有测试运行器,也没有运行浏览器测试。图表的放置运行的是 worker 引擎中的代码,由 worker 的测试覆盖
价格喂价防护与第八个审计循环,2026-10-06
预言机针对 Robinhood Chain 的两项价格喂价防护于 2026-10-06 编写,第八个审计循环对 Keeper、worker 和应用的修复也在同一天完成,尚未部署。合约随这些防护而改变,而不是随这个审计循环改变。于 2026-10-06 在提交 6586d40 上运行(合约取自该提交的一份干净副本,因为当时其他合约工作正在进行):
- Foundry。640 个测试通过:分叉文件之外的 633 个,分布在 82 个测试套件中,以及 Robinhood Chain 分叉文件针对其公共 RPC 的七个;三个以太坊分叉测试套件因没有 RPC 而跳过。这些防护在分叉文件之外新增了 18 个测试:16 个只针对预言机,使用模拟喂价和模拟代币(每项防护先关闭再开启、喂价或代币可能无法响应的每一种方式、每一种被视为暂停的响应、一次 gas 耗尽的读取、所有者的设置以及部署脚本的拒绝),2 个针对跨链通道(暂停股票的段单独失败,并在解除暂停后买入;排序器中断会阻止每一段,直到其宽限期结束)。两个新的分叉测试读取真实的股票代币:二十个代币中的每一个都按预言机读取的方式响应暂停信号,单次读取最多耗用 13,288 gas,而一个在其真实代码保存标志之处被暂停的代币,只会暂缓给出它自己的价格
- 存储与规范。17 个可升级模块的存储布局没有变化,只有预言机的追加;预言机的形式化规范(25 条规则和不变量)通过了类型检查,没有在证明器上运行
- 链下。Keeper 的 306 个测试、shared 包的 51 个、后端的 9 个以及 worker 的 155 个测试(共 12 个文件)全部通过。第八个审计循环的每一个概念验证都是一个回归测试,每一项修复的新测试在修复之前的代码上都会失败,新函数的测试除外
- 应用。它通过了类型检查、lint、引擎检查和构建;它没有测试运行器,也没有运行浏览器测试。它的发射表单的篮子检查和交易面板的税率运行的是 worker 引擎中的代码,由 worker 的测试覆盖
第九个审计循环、Glamsterdam 与 LayerZero 测试网运行,2026-10-06
第九个审计循环的修复、以太坊 Glamsterdam 升级下空投送达的 gas,以及 Keeper 对卡住送达的重新执行,都于 2026-10-06 完成,尚未在主网上部署。随之而来的是一项合约变更(远端枢纽的 gas 策略,以及镜像金库三参数的发送和报价),由跨链通道的九个新测试(默认值与测量值的对照、两端的限制、发送的选项及与之匹配的报价、单参数形式、设置函数的拒绝、一次比其 OFT 强制设定的 gas 更重的送达、一个没有策略的枢纽把股票留在原处、逐字节核对的选项)和部署脚本的四个测试覆盖。股票 OFT 的 mock 现在会把各项 gas 选项相加,并让 gas 不足的送达等待一次带有更多 gas 的运行,与 LayerZero 的端点一样。自这个审计循环起,第二个代理会在每一项修复的改动被推送之前对其进行审查(验证者关卡),它的发现也以同样的方式修复并测试。于 2026-10-06 在提交 92a1904 上运行(合约取自该提交的一份干净副本,因为当时其他工作正在进行):
- Foundry。653 个测试通过:分叉文件之外的 646 个,分布在 83 个测试套件中,以及 Robinhood Chain 分叉文件针对其公共 RPC 的七个;三个以太坊分叉测试套件因没有 RPC 而跳过。Foundry 使用 Cancun 的 gas 计价表:它的 gas 数值是旧价格,新价格来自 Sepolia
- 存储。17 个可升级模块的存储布局没有变化,只有远端枢纽的追加(它的 gas 策略,存储槽 21 至 23)
- 链下。Keeper 的 370 个测试、shared 包的 51 个、后端的 9 个以及 worker 的 189 个测试(共 14 个文件)全部通过(在 e1dd5f6 上,即关卡的最后一次修复之后,Keeper 为 372 个,其他不变);Keeper 和 worker 通过了类型检查。每一项修复的新测试在修复之前的代码上都会失败,新函数的测试除外。应用新的每笔交易 gas 上限运行的是 worker 引擎中的代码,由 worker 的测试覆盖
- 应用。它通过了类型检查、lint 和引擎检查;它没有测试运行器。它的另外两项修复,即标为估算值的国库金额和无法读取的授权,是通过在一份临时副本中运行它自己的代码来检查的
- 在 Sepolia 上,Glamsterdam 之后。合约和脚本中的每一个固定 gas 数值都在这条真实的链上重新测量过:全部成立且留有余量,只有空投送达的两个数值例外,已由 gas 策略修复。第十个审计循环又发现了两个:部署脚本自身的 gas,forge 按旧价格从它自己的模拟中得出(现在每次广播都采用节点的估算),以及跨链桥 compose 的 gas,它是按一个市场而不是一个批次来确定的。Keeper 的预检以只读方式在 LayerZero 测试网运行的部署上运行,通过了它的 68 项检查
- LayerZero 测试网运行。协议通过 LayerZero 真实的测试网端点、DVN 和执行器,在 Sepolia 和 Robinhood Chain 的测试网上端到端运行,共七个每小时的时间窗口和六个空投循环,每一笔领取都恰好等于根据持仓记录器计算出的份额:参见Robinhood 通道。它的最后一个时间窗口在第九个审计循环的 Keeper 上运行,使用根据其模拟选择的送达 gas
第十个审计循环,2026-10-06
第十个审计循环的修复于 2026-10-06 完成,尚未在主网上部署,每一项在合并之前都经过第二个代理的审查。只有一个合约发生了变化,即 USDG 跨链桥适配器:跨链批次在 Robinhood Chain 上的最后一步现在获得一个基数加上每个市场的一份,而一个批次最多携带 17 个市场。九个新测试覆盖了它:四个新的五只股票市场、一个 17 个市场的满批次,以及作为两个批次发送的三十个市场,每一个都以恰好等于其 gas 的数值冷启动运行;因消息大小而被拒绝的 18 个市场;随批次增长的费用;一个超过上限的批次被整体拒绝,而下一个批次照常通过;一个在新设置出现之前就已设置好的适配器在设置之前不跨链任何东西;以及这些设置的范围。USDG 代币跨链桥的 mock 现在会拒绝超过 LayerZero 大小限制的消息,并为 gas 定价,与 LayerZero 一样。部署流程没有测试:它的改动在 Sepolia 上演练过,在那里,一次以部署工具自己的 gas 发送的创建耗尽了 gas,而以节点估算发送的相同创建都成功了。于 2026-10-07 在提交 5ea8bf0 上运行(合约取自该提交的一份干净副本):
- Foundry。662 个测试通过:分叉文件之外的 655 个,分布在 84 个测试套件中,以及 Robinhood Chain 分叉文件针对其公共 RPC 的七个;三个以太坊分叉测试套件因没有 RPC 而跳过。LayerZero 测试网项目的 2 个测试通过,运行在 LayerZero 自己的合约上
- 存储。17 个可升级模块的存储布局没有变化,只有跨链桥适配器的追加(它的两项批次设置)
- 链下。Keeper 的 400 个测试、shared 包的 51 个、后端的 9 个以及 worker 的 210 个测试(共 15 个文件)全部通过;Keeper 和 worker 通过了类型检查。每一位审查者的概念验证都是一个回归测试,每一项修复的新测试在修复之前的代码上都会失败,新函数的测试除外。应用对钱包取消或替换的交易的跟踪,以及它在不早于其自己最后一笔交易所在区块的区块上的读取,运行的是 worker 引擎中的代码,由 worker 的测试覆盖
- 应用。它通过了类型检查、lint 和引擎检查;它没有测试运行器
- 在测试网上。LayerZero 测试网运行的跨链桥适配器于 2026-10-06 在 Sepolia 上升级,它的下一个批次(一个市场)由 LayerZero 的执行器以新的 gas 600,000 送达并完成 compose,其中使用了 115,990
测试不能证明什么
这一点很重要,项目自己的报告也坦率地说明了这一点。
本地测试模拟跨链送达。它们并不能证明一次真实的 LayerZero 送达。空投的跨链测试是针对 LayerZero 和股票适配器的 mock 运行的,而这些适配器的主网版本不在代码库中。至少有一次运行排除了分叉测试套件,因为公共端点返回了 HTTP 错误——而那份报告如实说明了这一点,而不是把这些套件呈现为已通过。
2026-10-06 的 LayerZero 测试网运行在两个测试网之间传送了真实的 LayerZero 消息,使用的是测试股票、测试适配器、一种测试 USDG 和模拟喂价:它证明了 StockFun 的代码能在 LayerZero 的传输上运行,但不能证明 Paxos 的 USDG 对、Robinhood 的股票及其适配器、真实的喂价和流动性,或者主网的 gas、费用和最终性。
任何运行都无法证明:主网上的 LayerZero 传输、外部审查,或覆盖当前通道的形式化证明。测试网运行使用真实的钱包签名,其中三笔领取是通过应用进行的。
本地运行
完整场景在四个终端中运行:链、部署与模拟、价格服务、dapp。之后是 Keeper 和浏览器测试框架。
具体流程见 projet/docs/LOCAL_TESTING.md。