【好用的工具记录-Foundry 智能合约开发工具包】
Foundry 智能合约开发工具包
Cast 常用命令速查表
Cast 是 Foundry 工具套件中的命令行工具,用于与以太坊链交互
Cast call 查询合约的只读函数
Cast send 与合约交互
环境配置
# 设置常用环境变量exportRPC="https://api.zan.top/node/v1/pharos/atlantic/xxx"exportPK="your_private_key"# 如需代理exporthttps_proxy=http://127.0.0.1:7890基础查询
# 查询最新区块号cast block-number --rpc-url$RPC# 查询最新区块详情cast block latest --rpc-url$RPC# 查询指定区块cast block12345--rpc-url$RPC# 查询当前 gas 价格cast gas-price --rpc-url$RPC# 查询 chain idcast chain-id --rpc-url$RPC# 获取合约 codecast code 0x合约地址 --rpc-url$RPC余额查询
# 查询 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)
# 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$RPCcast call 0x合约地址"symbol()(string)"--rpc-url$RPCcast call 0x合约地址"decimals()(uint8)"--rpc-url$RPC# 查询授权额度 allowancecast 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部署合约
forge create --private-key${OWNER_PRIVATE_KEY}--broadcastsrc/LuLuCoin.sol:LuLuCoin --constructor-args${OWNER_ADDRESS}// 顺序是固定的,私钥,路径,构造函数 // 其他记录 forge init forge compile forgetestforge to-dec 0x0000000000000000000000000000000000000000000000056bc75e2d63100000交易相关
查询交易
# 查询交易详情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发送交易
# 调用合约方法(需要 gas)cast send 0x合约地址"deposit(uint256)"1000000000000000000\--private-key$PK\--rpc-url$RPC# 调用合约方法(带 ETH)cast send 0x合约地址"deposit()"\--value1ether\--private-key$PK\--rpc-url$RPC# 直接发送 ETHcast send 0x接收地址--value1ether --private-key$PK--rpc-url$RPC# 指定 gas limit 和 gas pricecast send 0x合约地址"function()"\--private-key$PK\--rpc-url$RPC\--gas-limit200000\--gas-price 20gwei# 使用 nonce 强制替换交易cast send 0x合约地址"function()"\--private-key$PK\--rpc-url$RPC\--nonce123模拟与估算
# 模拟调用(不实际发送交易,检查是否会 revert)cast call 0x合约地址"withdraw(uint256)"1000000000000000000\--from0x调用者地址\--rpc-url$RPC# 估算 gascast estimate 0x合约地址"deposit(uint256)"1000000000000000000\--from0x调用者地址\--rpc-url$RPC数据编码/解码
# 编码 calldatacast calldata"transfer(address,uint256)"0x接收地址1000000000000000000# 编码带签名的 calldatacast calldata"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)"\0xowner 0xspender10000000000000000001234567890270xr 0xs# 解码 calldatacast --calldata-decode"transfer(address,uint256)"<input_data># 解码事件日志cast decode-event--data<log_data>--topics<topic0><topic1># 解码函数输出cast --abi-decode"balanceOf(address)(uint256)"<return_data>单位转换
# hex 转 decimalcast --to-dec 0x1234# decimal 转 hexcast --to-hex4660# ether 转 weicast --to-wei 1ether# 输出: 1000000000000000000# wei 转 ethercast --from-wei1000000000000000000# 输出: 1 ether# gwei 转换cast --to-unit1000000000gwei地址与签名
# 私钥转地址cast wallet address --private-key$PK# 签名消息cast wallet sign"hello world"--private-key$PK# 验证签名cast wallet verify--address0x地址--message"hello world"--signature<sig># 计算合约创建地址cast compute-address--address0x部署者地址--nonce0实用技巧
# 批量操作示例foraddrin0xaaa... 0xbbb... 0xccc...;doecho"$addr:$(cast balance $addr --rpc-url $RPC--ether)ETH"done# 监控pending交易cast receipt<tx_hash>--rpc-url$RPC--wait# 获取事件日志(通过区块范围)cast logs--address0x合约地址 --from-block1000--to-block2000--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,如何转成可读格式?
# 方法1: 使用 --ether 标志(部分命令支持)cast balance 0x地址 --rpc-url$RPC--ether# 方法2: 使用 --from-weicast --from-wei$(cast balance 0x地址 --rpc-url $RPC)2. 如何处理大数字?
# 使用 cast --to-hex 转换大数字cast call 0x合约"balanceOf(address)(uint256)"0x用户 --rpc-url$RPC|cast --to-dec3. 如何获取 ERC20 转账事件的 logs?
# Transfer(address from, address to, uint256 value) 事件签名cast logs--address0x代币合约\--topic00xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\--from-block1000\--rpc-url$RPC