forge debug
名称
forge-debug - 将单个智能合约作为脚本进行调试。
简介
forge debug
[options] path [args...]
描述
将位于源文件(path)中的单个智能合约作为脚本进行调试。
如果在指定的源文件中有多个合约,你必须通过 --target-contract
来指定你要运行的合约。
调用
在脚本被部署到内部 EVM 后,如果一个签名为 setUp()
的函数存在的话,将被调用。
默认情况下,脚本被认为是包含在一个签名为 run()
的函数中。如果你想运行一个不同的函数,请传递 --sig <SIGNATURE>
。
签名可以是一个片段(<函数名>(<类型>)
),或者是原始的 Calldata。
如果你传递一个片段,并且该函数有参数,你可以将调用参数添加到命令的末尾(args)。
分叉
通过传递 --fork-url <URL>
,可以在分叉的环境中运行脚本
当脚本在分叉环境中运行时,你可以像部署脚本那样访问分叉链的所有状态。作弊代码 仍然可用。
你也可以通过 --fork-block-number <BLOCK>
来指定分叉的区块编号。当从一个特定的区块分叉时,链上的数据会被缓存到 ~/.foundry/cache
。如果你不想缓存链上的数据,请传递--no-store-caching
。
调试
可以在交互式调试器中运行该脚本。要启动调试器,请传递 --debug
。
关于调试器的更多信息可以在 调试器章节 中找到。
选项
调试选项
--target-contract
contract_name
你想要运行的合约名称
-s
signature
--sig
signature
你想在合约中调用的函数的签名,或原始的 calldata。默认:run()
。
--debug
在 调试器 中打开脚本。
EVM 选项
-f
url
--rpc-url
url
--fork-url
url
通过远程端点获取状态,而不是从一个空的状态开始。
如果你想从一个特定的区块号码中获取状态,请参阅
--fork-block-number
.
--fork-block-number
block
通过一个远程端点从一个特定的区块号中获取状态。请见 --fork-url
.
--fork-retry-backoff <BACKOFF>
初始化遇到错误时的重试退避。
--no-storage-caching
明确禁止使用 RPC 缓存。
所有存储槽完全从端点读取。请见 --fork-url
。
-v
--verbosity
EVM 的日志级别。
多次传递,以提高日志级别 (例如 -v
, -vv
, -vvv
)。
日志级别: - 2: 打印所有测试的日志 - 3: 打印失败测试的执行追踪 - 4: 对所有测试进行跟踪,并对失败的测试进行设置跟踪 - 5: 打印所有测试的执行和设置跟踪
--sender
address
用作执行测试的地址
--initial-balance
balance
已部署合约的初始余额
--ffi
开启 FFI 作弊码
Executor 选项
--base-fee <FEE>
--block-base-fee-per-gas <FEE>
一个区块的基本费用(单位:Wei)。
--block-coinbase
address
区块的 coinbase。
--block-difficulty
difficulty
区块的难度。
--block-gas-limit
gas_limit
区块的 Gas 限制。
--block-number
block
区块号。
--block-timestamp
timestamp
区块的时间戳(以秒为单位)。
--chain-id
chain_id
链 ID。
--gas-limit
gas_limit
区块的 Gas 限制。
--gas-price
gas_price
Gas 价格(单位:Wei)。
--tx-origin
address
交易的 origin。
缓存选项
--force
清除缓存和 artifacts 文件夹并重新编译。
链接器选项
--libraries
libraries
设置预链接库。
参数的格式必须是 <remapped path to lib>:<library name>:<address>
,例如 src/Contract.sol:Library:0x...
。
也可以在你的配置文件中设置为 libraries = ["<path>:<lib name>:<address>"]
.
编译器选项
--optimize
激活 Solidity 优化器。
--optimizer-runs
runs
优化器 runs 的选项。
--via-ir
使用 Yul 作为编译管道的中间语言。
--revert-strings
如何处理 revert 和 require 的结果字符串。
--use
solc_version
指定 solc 的版本,或一个本地 solc 的路径,以进行编译。
有效值的格式为 x.y.z
,solc:x.y.z
或 path/to/solc
。
--offline
不使用网络,缺失的 solc 版本将不会被安装。
--no-auto-detect
不使用 solc 的自动检测。
--ignored-error-codes
error_codes
从错误代码中忽略 solc 警告。该参数是一个以逗号分隔的错误代码列表。
--extra-output
selector
额外的产出要包括在合约的 artifact 中。
示例键: abi
, storageLayout
, evm.assembly
, ewasm
, ir
, ir-optimized
, metadata
。
关于完整的描述, 请参阅 [Solidity docs][output-desc]。
--extra-output-files
selector
额外的输出写到单独的文件。
示例键: abi
, storageLayout
, evm.assembly
, ewasm
, ir
, ir-optimized
, metadata
.
关于完整的描述, 请参阅 [Solidity docs][output-desc].
--evm-version
version
目标 EVM 版本
Project Options
--build-info
生成构建信息文件。
--build-info-path
path
输出目录的路径,构建信息文件将被写入。
--root
path
项目的根路径。默认情况下,这是当前 git 仓库的根目录,或当前工作目录。
-C
path
--contracts
path
合约源代码目录。
环境变量:DAPP_SRC
--lib-paths
path
库的文件夹路径。
-R
remappings
--remappings
remappings
项目的重映射。
该参数是一个逗号分隔的重映射列表,格式为 <source>=<dest>
。
--cache-path
path
编译器缓存的路径。
--config-path
file
配置文件的路径。
--hh
--hardhat
这是一个方便的标志,与传递 --contracts contracts --lib-paths node-modules
相同。
-o
path
--out
path
项目的 artifacts 目录。
--silent
抑制所有输出。
普通选项
-h
--help
打印帮助信息。
例子
-
在一个合约中执行
run()
函数:forge debug src/Contract.sol
-
在调试器中打开一个脚本:
forge debug src/Contract.sol --debug
-
在一个合约中执行
foo()
函数:forge debug src/Contract.sol --sig "foo()"
-
用一个带参数的函数执行一个合约:
forge debug src/Contract.sol --sig "foo(string,uint256)" "hello" 100
-
执行一个带有原始 Calldata 的合约:
forge debug src/Contract.sol --sig "0x..."