OpenZeppelin 对 Across 协议的 Polygon 合约进行了代码审计,以准备 USDT0 的推出。审计发现了两个中等严重性的问题:Polygon_SpokePool
中剩余过多的 gas,以及费用上限可能设置过低,可能导致跨链传输 USDT0 失败。这些问题已在后续的 pull request 中得到解决。
TypeCross-ChainTimelineFrom 2025-08-25To 2025-08-25LanguagesSolidityTotal Issues2 (2 resolved)Critical Severity Issues0 (0 resolved)High Severity Issues0 (0 resolved)Medium Severity Issues2 (2 resolved)Low Severity Issues0 (0 resolved)Notes & Additional Information0 (0 resolved)
OpenZeppelin 对 across-protocol/contracts 仓库进行了差异审计,头部提交为 d9826e3,基础提交为 f2415a2。
以下文件在审计范围内:
contracts/Polygon_SpokePool.sol
contracts/chain-adapters/Polygon_Adapter.sol
审查中的更改为 Across 协议 Polygon 合约准备 USDT (USDT0) 的推出。这是通过在使用现有的 Polygon PoS 和 Circle CCTP 流的同时,接入一个使用 OFT (LayerZero 的全链同质化代币) 的额外桥接路径来实现的:
Polygon SpokePool: 构造函数现在接受 OFT 配置(目标 EID + 原生手续费上限),并且在提款时,按资产进行路由:USDC 使用 CCTP,如果为该代币注册了 messenger,则使用 OFT,否则通过 Polygon PoS 桥接。
Polygon Adapter (L1→L2): 当配置了 OFT messenger 时,此适配器为代币(特别是 USDT0)添加 OFT。否则,它会回退到 Polygon PoS 桥接。
在范围内的更改既没有添加任何新的特权角色,也没有修改任何现有的角色。有关此代码库中特权角色的更多信息,请参阅之前的审计报告。
在审计期间,做出了以下信任假设:
Polygon_SpokePool
中设置了正确的 _oftDstEid
。Polygon_Adapter
中设置了正确的 _oftDstEid
。Polygon_SpokePool
的预配置 oftMessengers
中正确设置了 OFT messenger 合约。Polygon_Adapter
的 OFT_ADAPTER_STORE
中正确设置了 OFT messenger 合约。SpokePool
中剩余过多的 GasPolygon_SpokePool
合约旨在支持将 USDT0 发送到 Ethereum 主网。当账户调用 Polygon_SpokePool
合约的 executeRelayerRefundLeaf
函数 时,就会这样做。在此函数中,会调用 SpokePool
合约的 _transferViaOFT
函数,其中 _messenger.quoteSend
用于返回应与 _messenger.send
调用 一起转发的手续费金额。
executeRelayerRefundLeaf
函数的调用者必须首先调用 quoteSend
以预先获得手续费成本,以便他们转发调用时所需的 gas 量。如果价格在获得报价和调用 executeRelayerRefundLeaf
之间向下移动,那么随调用发送的过多的原生代币将保留在合约中。
考虑在交易结束时将过多的原生代币返回给调用者。
更新: 已在 pull request #1082 中解决。
在部署 Polygon_SpokePool
合约时,设置了 1e18
的 手续费上限。由于手续费是根据目标链上的执行情况计算的,但以源链原生代币表示,因此所需的手续费可能高于设置的 feeCap
。在 Polygon 网络上,原生代币是 POL,1 个单位的 POL 等于约 0.24 美元。这不太可能涵盖目标链(Ethereum 主网)的执行费用。例如,此时从 Optimism 等 L2 链到 Ethereum 主网的 USDT0 转账费用报价约为 1.26 美元(约 5 个 POL)。LayerZero 文档还提供了一个有用的 示例,用于计算从 Polygon 到 Ethereum 主网的转账费用。因此,USDT0 的跨链转账(其中目标链是 Ethereum 主网)可能会失败。
考虑设置更高的手续费上限,其中考虑到原生 POL 代币相对于 ETH 较低的价值。
更新:已在 commit 6a9655e 中解决。
审查中的更改支持 Polygon 网络上 USDT0 代币的 OFT 功能。这些更改需要升级 Polygon 网络上的 Polygon_SpokePool
合约以及 Ethereum 主网上的 Polygon_Adapter
合约。在 Polygon_SpokePool
和 Polygon_Adapter
合约中引入了额外的路径,这些路径利用先前审计的 OFTTransportAdapterWithStore
合约中的 _transferViaOFT
函数来支持通过 LayerZero 发送 USDT0。
审查发现了两个中等严重性的问题。第一个问题与为 Polygon_SpokePool
合约设置的手续费上限有关,这可能导致无法将 USDT0 桥接到 Ethereum 主网。第二个问题与退还过多的 gas 有关,如果使用了过时的报价。
总的来说,已实施的更改似乎是合理的,并且仅限于支持在 Ethereum 主网和 Polygon 网络之间桥接 USDT0 所需的文件。
- 原文链接: blog.openzeppelin.com/us...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!