Cast 常用命令速查表
Cast 是 Foundry 工具套件中的命令行工具,用于与以太坊链交互
环境配置
bash
# 设置常用环境变量
export RPC="https://api.zan.top/node/v1/pharos/atlantic/xxx"
export PK="your_private_key"
# 如需代理
export https_proxy=http://127.0.0.1:7890
基础查询
bash
# 查询最新区块号
cast block-number --rpc-url $RPC
# 查询最新区块详情
cast block latest --rpc-url $RPC
# 查询指定区块
cast block 12345 --rpc-url $RPC
# 查询当前 gas 价格
cast gas-price --rpc-url $RPC
# 查询 chain id
cast chain-id --rpc-url $RPC
# 获取合约 code
cast code 0x合约地址 --rpc-url $RPC
余额查询
bash
# 查询 ETH 余额(单位: wei)
cast balance 0x地址 --rpc-url $RPC
# 查询 ETH 余额(可读格式,单位: ether)
cast balance 0x地址 --rpc-url $RPC --ether
# 查询 ERC20 代币余额
cast call 0x代币合约 "balanceOf(address)(uint256)" 0x用户地址 --rpc-url $RPC
合约方法调用(只读 view/pure)
bash
# totalSupply - 总发行量
cast call 0x合约地址 "totalSupply()(uint256)" --rpc-url $RPC
# totalAssets - 总资产(Vault 类合约常用)
cast call 0x合约地址 "totalAssets()(uint256)" --rpc-url $RPC
# 代币基本信息
cast call 0x合约地址 "name()(string)" --rpc-url $RPC
cast call 0x合约地址 "symbol()(string)" --rpc-url $RPC
cast call 0x合约地址 "decimals()(uint8)" --rpc-url $RPC
# 查询授权额度 allowance
cast call 0x代币合约 "allowance(address,address)(uint256)" 0xowner 0xspender --rpc-url $RPC
# 查询存储槽
cast storage 0x合约地址 槽位 --rpc-url $RPC
# 其他自定义方法
cast call 0x合约地址 "getUserInfo(address)(uint256,uint256)" 0x用户地址 --rpc-url $RPC
交易相关
查询交易
bash
# 查询交易详情
cast tx <tx_hash> --rpc-url $RPC
# 查询交易回执(包含 logs、status、gasUsed 等)
cast receipt <tx_hash> --rpc-url $RPC
# 查询交易回执并显示完整信息
cast receipt <tx_hash> --rpc-url $RPC -vvv
发送交易
bash
# 调用合约方法(需要 gas)
cast send 0x合约地址 "deposit(uint256)" 1000000000000000000 \
--private-key $PK \
--rpc-url $RPC
# 调用合约方法(带 ETH)
cast send 0x合约地址 "deposit()" \
--value 1ether \
--private-key $PK \
--rpc-url $RPC
# 直接发送 ETH
cast send 0x接收地址 --value 1ether --private-key $PK --rpc-url $RPC
# 指定 gas limit 和 gas price
cast send 0x合约地址 "function()" \
--private-key $PK \
--rpc-url $RPC \
--gas-limit 200000 \
--gas-price 20gwei
# 使用 nonce 强制替换交易
cast send 0x合约地址 "function()" \
--private-key $PK \
--rpc-url $RPC \
--nonce 123
模拟与估算
bash
# 模拟调用(不实际发送交易,检查是否会 revert)
cast call 0x合约地址 "withdraw(uint256)" 1000000000000000000 \
--from 0x调用者地址 \
--rpc-url $RPC
# 估算 gas
cast estimate 0x合约地址 "deposit(uint256)" 1000000000000000000 \
--from 0x调用者地址 \
--rpc-url $RPC
数据编码/解码
bash
# 编码 calldata
cast calldata "transfer(address,uint256)" 0x接收地址 1000000000000000000
# 编码带签名的 calldata
cast calldata "permit(address,address,uint256,uint256,uint8,bytes32,bytes32)" \
0xowner 0xspender 1000000000000000000 1234567890 27 0xr 0xs
# 解码 calldata
cast --calldata-decode "transfer(address,uint256)" <input_data>
# 解码事件日志
cast decode-event --data <log_data> --topics <topic0> <topic1>
# 解码函数输出
cast --abi-decode "balanceOf(address)(uint256)" <return_data>
单位转换
bash
# hex 转 decimal
cast --to-dec 0x1234
# decimal 转 hex
cast --to-hex 4660
# ether 转 wei
cast --to-wei 1ether
# 输出: 1000000000000000000
# wei 转 ether
cast --from-wei 1000000000000000000
# 输出: 1 ether
# gwei 转换
cast --to-unit 1000000000 gwei
地址与签名
bash
# 私钥转地址
cast wallet address --private-key $PK
# 签名消息
cast wallet sign "hello world" --private-key $PK
# 验证签名
cast wallet verify --address 0x地址 --message "hello world" --signature <sig>
# 计算合约创建地址
cast compute-address --address 0x部署者地址 --nonce 0
实用技巧
bash
# 批量操作示例
for addr in 0xaaa... 0xbbb... 0xccc...; do
echo "$addr: $(cast balance $addr --rpc-url $RPC --ether) ETH"
done
# 监控pending交易
cast receipt <tx_hash> --rpc-url $RPC --wait
# 获取事件日志(通过区块范围)
cast logs --address 0x合约地址 --from-block 1000 --to-block 2000 --rpc-url $RPC
# 读取单个存储槽
cast storage 0x合约地址 0 --rpc-url $RPC
# 读取映射类型存储槽 (hash(key, slot))
cast storage 0x合约地址 $(cast index address 0x用户地址 0) --rpc-url $RPC
快速查表
| 需求 | 命令 |
|---|---|
| 区块号 | cast block-number --rpc-url $RPC |
| ETH 余额 | cast balance 0x地址 --rpc-url $RPC |
| ETH 余额(ether) | cast balance 0x地址 --rpc-url $RPC --ether |
| ERC20 余额 | cast call 0x代币 "balanceOf(address)(uint256)" 0x用户 --rpc-url $RPC |
| totalSupply | cast call 0x合约 "totalSupply()(uint256)" --rpc-url $RPC |
| totalAssets | cast call 0x合约 "totalAssets()(uint256)" --rpc-url $RPC |
| 代币名称 | cast call 0x合约 "name()(string)" --rpc-url $RPC |
| 代币符号 | cast call 0x合约 "symbol()(string)" --rpc-url $RPC |
| 代币精度 | cast call 0x合约 "decimals()(uint8)" --rpc-url $RPC |
| 授权额度 | cast call 0x代币 "allowance(address,address)(uint256)" 0xowner 0xspender --rpc-url $RPC |
| 交易详情 | cast tx <hash> --rpc-url $RPC |
| 交易回执 | cast receipt <hash> --rpc-url $RPC |
| 发送交易 | cast send 0x地址 "func()" --private-key $PK --rpc-url $RPC |
| 发送 ETH | cast send 0x地址 --value 1ether --private-key $PK --rpc-url $RPC |
| gas 价格 | cast gas-price --rpc-url $RPC |
| chain id | cast chain-id --rpc-url $RPC |
| 合约代码 | cast code 0x合约 --rpc-url $RPC |
| 编码 calldata | cast calldata "func(type)" args... |
| 解码 calldata | cast --calldata-decode "func(type)" <data> |
常见问题
1. 返回值是 wei,如何转成可读格式?
bash
# 方法1: 使用 --ether 标志(部分命令支持)
cast balance 0x地址 --rpc-url $RPC --ether
# 方法2: 使用 --from-wei
cast --from-wei $(cast balance 0x地址 --rpc-url $RPC)
2. 如何处理大数字?
bash
# 使用 cast --to-hex 转换大数字
cast call 0x合约 "balanceOf(address)(uint256)" 0x用户 --rpc-url $RPC | cast --to-dec
3. 如何获取 ERC20 转账事件的 logs?
bash
# Transfer(address from, address to, uint256 value) 事件签名
cast logs --address 0x代币合约 \
--topic0 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef \
--from-block 1000 \
--rpc-url $RPC