【好用的工具记录-Foundry 智能合约开发工具包】

Foundry 智能合约开发工具包

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
相关推荐
终有zy4 天前
智能合约审计全流程详解:从致命危害到漏洞修复实战
区块链·智能合约·安全威胁分析
电报号dapp1195 天前
区块链DApp开发深度解析:概念拆解+技术架构+应用前景
架构·web3·去中心化·区块链·智能合约
电报号dapp1195 天前
公链 + DID,解锁 Web3 数字身份新范式
人工智能·web3·去中心化·区块链·智能合约
木西5 天前
RaveDAO Pro:Web3 票务系统的完整技术实现
web3·智能合约·solidity
电报号dapp1195 天前
交易所开发:构建数字资产交易的安全与高效平台
安全·web3·去中心化·区块链·智能合约
pjwonline16 天前
反向仲裁:去中心化知识网络中的社会性共识引擎
网络·人工智能·去中心化·区块链·智能合约
许强0xq8 天前
订单流战争:AI、区块链与市场透明度的终极博弈
web3·区块链·智能合约·solidity·dapp
木西12 天前
深度复刻 Sky Protocol:基于 OpenZeppelin V5 与 Solidity 0.8.24 的工程实践
web3·智能合约·solidity
Joy T15 天前
【Web3】深度解析 NFT 跨链智能合约开发:原生资产与衍生包装合约架构实战
git·架构·web3·区块链·node·智能合约·hardhat