跳转到主要内容
每个 Virtual Environment 都在 0xc100000000000000000000000000000000000000 上暴露一个预编译合约。从交易内部调用此预编译上的函数可让您的合约直接操纵链上状态、存储槽、ETH 余额、ERC-20 代币余额、nonce 和事件日志,而无需假冒账户或部署辅助代理。 这些作弊码是对 Admin RPC 方法的补充。Admin RPC 方法从交易外部操纵状态(通过 JSON-RPC)。预编译从交易内部操纵状态(通过 Solidity 调用)。当您的设置需要保持原子性、可从 tx 哈希重放,或者要在多个槽上循环执行时,请使用预编译。

接口

将此文件作为 IVnetPrecompile.sol 添加到您的项目中:
IVnetPrecompile.sol
在您的合约中通过固定地址引用它:

函数

Storage

Balance

ERC-20 balances

预编译会自动定位代币的余额存储槽,因此无需提供槽输入。标准的 mapping 布局可直接解析,并在第一个持有者之后被缓存;非标准布局通过探测代币的 balanceOf 执行来发现。
在余额存储槽中打包额外标志位的代币会相应地报告 balanceOf。例如,USDC 保留了该槽的最高位,因此在 setMaxErc20Balance 之后,其 balanceOf 返回 2^255 - 1

Nonce

Events

emitEvent 触发一条 address 字段为 target(而不是调用合约)的日志。下游消费者(索引器、subgraph、webhook)会将该日志视为来自 target 的真实发出。 九个重载覆盖了从零到四个索引 topic,以及可选的未索引 data 载荷: topic1 通常是 keccak256("EventName(type,type,...)")。示例,伪造一次 USDC 的 Transfer

Cheatcode events

每个改变状态的作弊码都会从预编译地址(0xc100000000000000000000000000000000000000)发出对应的事件: 检查通过 emitEvent 伪造的日志的收据时,请按目标地址过滤 logs[] 以忽略预编译自身的条目。

已知限制

  • 基于 Base 的 Virtual Environments。 Solidity 作弊码在 Base 上不可用。
  • 基于 Arbitrum 的 Virtual Environments。 由于 Arbitrum 内部机制,通过 eth_call 进行的作弊码调用无法工作。交易、gas 估算和模拟按预期工作。

另请参阅