
Foundry cast ERC-4626 金库检查Vault 摘要、账户持仓与接口兼容性探测实战指南【免费下载链接】foundryFoundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.项目地址: https://gitcode.com/GitHub_Trending/fo/foundry本文围绕 Foundry 仓库中.changelog/cast-erc4626-inspection.md所记录的变更——Added ERC-4626 vault summaries, account positions, and compatibility probes tocast完整讲解cast erc4626子命令家族。你将掌握如何一键获取金库摘要vault summary、查询任意账户的份额持仓与提取限额position、对金库执行 21 项只读兼容性探测check以及完成 deposit/mint/withdraw/redeem 四种写入操作并理解 ERC-7540 异步金库与 ERC-7535 原生资产哨兵地址等边界情况的处理逻辑。一、变更背景cast 迎来完整的 ERC-4626 一等公民支持ERC-4626Tokenized Vault Standard是 DeFi 中收益金库的事实标准接口定义了deposit、mint、withdraw、redeem四个写入函数与preview*、max*、convertTo*等只读查询函数。此前开发者只能用cast call手工拼装 calldata 与金库交互既繁琐又容易出错。本仓库在 crates/cast 中新增了完整的 ERC-4626 命令族使cast成为该标准的一等公民工具。变更核心落在三块能力上vault summaries金库摘要cast erc4626 info一键输出金库与底层资产的基础信息、总资产、总供应量与汇率account positions账户持仓cast erc4626 position查询指定账户的份额余额、对应资产价值与提取限额compatibility probes兼容性探测cast erc4626 check对金库执行 21 项只读探测评估其对同步 ERC-4626 接口的兼容程度。同时该命令族还覆盖了全部 ERC-4626 标准函数的直接调用详见下文第三节并针对 ERC-7540异步金库与 ERC-7535原生资产哨兵做了显式的告警与区分处理而非简单报错。二、命令入口与总体结构2.1 命令注册与别名在 crates/cast/src/opts.rs 中Erc4626子命令被注册为/// ERC-4626 tokenized vault operations. #[command(name erc4626, visible_alias vault)] Erc4626 { #[command(subcommand)] command: Erc4626Subcommand, },即cast erc4626 子命令与cast vault 子命令完全等价vault是更短的别名。模块本身在 crates/cast/src/cmd/mod.rs 中声明为pub mod erc4626;。2.2 19 个子命令全览Erc4626Subcommand 共定义 19 个子命令分为三类类别子命令检查/摘要info、position、check只读查询asset、total-assets、convert-to-shares、convert-to-assets、max-deposit、preview-deposit、max-mint、preview-mint、max-withdraw、preview-withdraw、max-redeem、preview-redeem写入操作deposit、mint、withdraw、redeem注意check之外info/position以及所有只读子命令均支持-B, --block指定查询区块写入类子命令deposit/mint/withdraw/redeem则复用SendTxOpts与TxParams即与cast send共享私钥、nonce、gas 等发送参数。2.3 通用选项--human文本输出时使用按小数位格式化后的金额并附带代币符号如95183395.377893 USDC--json切换为结构化 JSON 输出由shell::is_json()自动识别等价于--json全局开关-B, --block指定查询区块高度BlockId不传则使用默认最新区块--rpc-url指定 RPC 节点来自RpcOpts与 cast 其他命令一致也可通过环境变量配置。三、核心检查命令详解changelog 三大能力3.1info金库摘要info一次性并发读取金库的name、symbol、decimals、asset()、totalAssets()、totalSupply()并进一步读取底层资产的元数据最后计算两个汇率。从源码实现show_info可见所有 RPC 调用通过tokio::join!并发执行因此一次info的耗时接近单次 RPC 往返而不是串行 6~10 次。命令示例源码文档注释中的完整示例$ cast erc4626 info 0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB --human \ --block 25519075 --rpc-url https://ethereum.reth.rs/rpc输出Vault 0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB Name Steakhouse USDC Symbol steakUSDC Decimals 18 Asset 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 Asset name USD Coin Asset symbol USDC Asset decimals 6 Total assets 95183395.377893 USDC Total supply 84037200.060143388288943211 steakUSDC Assets per share 1.132634 USDC Shares per asset 0.882897731163608580 steakUSDC字段说明字段含义来源调用Vault / Name / Symbol / Decimals金库自身信息name()/symbol()/decimals()Asset 系列底层资产地址与元数据asset() 资产的IERC20MetadataTotal assets金库管理的资产总量totalAssets()Total supply份额总供应量totalSupply()Assets per share1 单位份额对应资产1e18 份额convertToAssets(10^decimals)Shares per asset1 单位资产对应份额1e18 资产convertToShares(10^decimals)assets_per_share与shares_per_asset并非直接来自单一调用而是分别以10^decimals为输入调用convertToAssets/convertToShares得到见 show_info10^decimals由decimal_unit辅助函数计算溢出时返回None。若元数据调用失败对应字段显示unavailable。3.2position账户持仓position查询指定owner在金库中的份额余额、按当前汇率折算的资产价值以及最大可提取/赎回额度。命令示例$ cast erc4626 position 0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB \ 0x255c7705E8bb334dfCaE438197f7c4297988085A --human --block 25519075 \ --rpc-url https://ethereum.reth.rs/rpc输出Vault 0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB Owner 0x255c7705e8BB334DfCae438197f7C4297988085a Asset 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 Share symbol steakUSDC Share decimals 18 Asset symbol USDC Asset decimals 6 Share balance 35733.949295544029939485 steakUSDC Assets equivalent 40473.486378 USDC Max withdraw 40473.486378 USDC Max redeem 35733.949295417417957447 steakUSDC实现要点show_positionAssets equivalentconvertToAssets(balanceOf(owner))Max withdrawmaxWithdraw(owner)以资产计价Max redeemmaxRedeem(owner)以份额计价若owner份额非零但maxWithdraw或maxRedeem返回 0会触发警告erc4626_zero_max_withdraw/erc4626_zero_max_redeem提示可能是流动性、门槛、提款队列或保守实现所致对应 zero_exit_warning。3.3check兼容性探测check对金库执行一组只读探测并输出 PASS / WARN / FAIL 汇总用于快速判断某地址是否为可读的同步 ERC-4626 金库。注意输出开头即声明免责声明它只探测只读调用行为不证明状态变更选择器的覆盖也不证明语义上的 ERC-4626 合规常量CHECK_DISCLAIMER见 check_compatibility。命令示例$ cast erc4626 check 0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB \ --account 0x255c7705E8bb334dfCaE438197f7c4297988085A --block 25519075 \ --rpc-url https://ethereum.reth.rs/rpc输出Vault 0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB Account 0x255c7705e8BB334DfCae438197f7C4297988085a Note: This probes read-call behavior only; it does not prove state-changing selector coverage or semantic ERC-4626 compliance. PASS contract code contract bytecode is present PASS asset() returned 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 PASS asset contract underlying asset bytecode is present PASS asset balanceOf(address) call succeeded PASS totalAssets() call succeeded PASS totalSupply() call succeeded PASS balanceOf(address) call succeeded PASS allowance(address,address) call succeeded PASS convertToShares(0) returned zero PASS convertToAssets(0) returned zero PASS maxDeposit(address) call succeeded PASS previewDeposit(0) returned zero PASS maxMint(address) call succeeded PASS previewMint(0) returned zero PASS maxWithdraw(address) call succeeded PASS previewWithdraw(0) returned zero PASS maxRedeem(address) call succeeded PASS previewRedeem(0) returned zero PASS name() call succeeded PASS symbol() call succeeded PASS decimals() call succeeded Summary: 21 passed, 0 warnings, 0 failed21 项探测的具体逻辑全部并发执行见 check_compatibilitycontract code目标地址是否存在字节码无字节码直接 FAILasset()返回零地址 FAIL返回 ERC-7535 原生资产哨兵0xEeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE则 WARN 并提示需用cast send --value附原生资产否则 PASSasset contract底层资产是否有字节码无字节码 WARN可能是系统合约或预编译asset balanceOf(address)以金库地址为 owner 调用底层资产balanceOftotalAssets() / totalSupply() / balanceOf(address) / allowance(address,address)调用成功即 PASS失败 FAILconvertToShares(0) / convertToAssets(0)返回 0 为 PASS非零 WARN零输入通常应转换出零maxDeposit / maxMint / maxWithdraw / maxRedeem调用成功即 PASSpreviewDeposit(0) / previewMint(0) / previewWithdraw(0) / previewRedeem(0)通过 ERC-165supportsInterface探测金库是否声明 ERC-7540 异步接口若声明了异步支持则preview*revert 属预期行为记 WARN否则记 FAIL逻辑见 record_previewname() / symbol() / decimals()调用成功即 PASS失败则 FAIL。最终read_compatible failed 0若存在任何 FAIL命令非零退出并在 JSON 模式下附带错误码erc4626.compatibility_failed文本模式先打印报告再以错误信息退出见 check_compatibility。四、只读查询子命令速查以下子命令均接受vault地址 -B/--block--rpc-url输出原始U256数值可加--json获得结构化结果。子命令额外参数对应调用示例输出asset—asset()0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48total-assets—totalAssets()95183395377893 [9.518e13]convert-to-sharesassetsconvertToShares(assets)882897731163608580 [8.828e17]convert-to-assetssharesconvertToAssets(shares)1132634 [1.132e6]max-depositreceivermaxDeposit(receiver)1002934816604622098 [1.002e18]preview-depositassetspreviewDeposit(assets)882897731163608580 [8.828e17]max-mintreceivermaxMint(receiver)885488874085210715750045480687 [8.854e29]preview-mintsharespreviewMint(shares)1132635 [1.132e6]max-withdrawownermaxWithdraw(owner)40473486378 [4.047e10]preview-withdrawassetspreviewWithdraw(assets)882897731163608581 [8.828e17]max-redeemownermaxRedeem(owner)35733949295417417957447 [3.573e22]preview-redeemsharespreviewRedeem(shares)1132634 [1.132e6]上述金额参数assets/shares以U256解析示例中convert-to-assets传入10000000000000000001e18 份额得到11326341.132634 USDC含 6 位小数。使用--human可让max-deposit等命令显示格式化金额若maxDeposit/maxMint返回 0命令会发出 conservative maxima or gate deposits 提示warn_if_zero_entry_maxmaxWithdraw/maxRedeem在持仓非零却返回 0 时也会告警。若asset()返回原生资产哨兵asset子命令会提示应使用cast send --value附值warn_if_native_asset。此外当某个preview*调用失败时错误信息会提示异步 ERC-7540 金库会故意 revert 该 previewpreview_error避免把异步金库的预期行为误判为错误。五、写入操作子命令四个写入子命令复用SendTxOpts与TxParams因此支持--private-key、--async、--rpc-url等与cast send一致的参数。写入前金库必须有足够的底层资产授权额度可先用cast erc20 approve授权见下文测试章节。子命令参数对应调用示例depositassets receiverdeposit(assets, receiver)cast erc4626 deposit VAULT 1000000 $ACCOUNT --private-key $PRIVATE_KEY --async --rpc-url $ETH_RPC_URLmintshares receivermint(shares, receiver)cast erc4626 mint VAULT 1000000000000000000 $ACCOUNT --private-key $PRIVATE_KEY --async --rpc-url $ETH_RPC_URLwithdrawassets receiver ownerwithdraw(assets, receiver, owner)cast erc4626 withdraw VAULT 1000000 $ACCOUNT $ACCOUNT --private-key $PRIVATE_KEY --async --rpc-url $ETH_RPC_URLredeemshares receiver ownerredeem(shares, receiver, owner)cast erc4626 redeem VAULT 1000000000000000000 $ACCOUNT $ACCOUNT --private-key $PRIVATE_KEY --async --rpc-url $ETH_RPC_URL输出为交易哈希例如0x6f2a7e10f148a0ee81208cd8d7dee10cc33b5bdb739bfeef805dc68467e6db4e写入前的关键处理在 prepare_write先查询asset()若为 ERC-7535 原生资产哨兵则发出警告提示cast erc4626 deposit/mint不会自动附带原生资产价值需要结合cast send --value使用再解析 receiver/owner 地址。真正发送时复用cast send的实现SendTxArgs::contract_call见 send_call因此 gas 估算、nonce 管理等行为与cast send完全一致。六、JSON 输出结构在--json模式下结果遵循 foundry-cli 统一的schema_version/success/data/errors/warnings包裹结构。以info为例来自端到端测试的断言见 crates/cast/tests/cli/erc4626.rs{ schema_version: 1, success: true, data: { vault: 0x5FbDB2315678afecb367f032d93F642f64180aa3, name: Test Vault, symbol: TV, decimals: 18, asset: 0x..., asset_name: Test Vault Asset, asset_symbol: TVA, asset_decimals: 18, total_assets: { raw: 100, formatted: 0.000000000000000100 }, total_supply: { raw: 100, formatted: 0.000000000000000100 }, assets_per_share: { raw: 1000000000000000000, formatted: 1 }, shares_per_asset: { raw: 1000000000000000000, formatted: 1 } }, errors: [], warnings: [] }金额统一用TokenAmount { raw, formatted }表示raw是原始U256十进制字符串formatted是format_units按对应 decimals 格式化后的字符串TokenAmount。position的data字段为vault / owner / asset / share_symbol / share_decimals / asset_symbol / asset_decimals / share_balance / assets_equivalent / max_withdraw / max_redeemcheck的data包含vault / account / read_compatible / disclaimer / passed / warnings / failed / checks[]每项含name / status / detail见 CompatibilityReport。有告警时如原生资产、零提取上限通过print_json_success_with_warnings输出到warnings数组携带level: warning与错误码如erc4626_zero_max_withdraw、erc4626_native_asset。check失败时 JSON 模式返回errors数组错误码为erc4626.compatibility_failed。七、边界情况与告警体系cast erc4626把三类常见非标准但合规的金库行为转化为显式告警而非硬错误ERC-7535 原生资产哨兵金库asset()返回0xEeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE常量NATIVE_ASSET见 crates/cast/src/cmd/erc4626.rs表示底层资产为链原生代币decimals 恒为 18。此时info/position/check输出告警写入命令提示需通过cast send --value附值ERC-7540 异步金库通过 ERC-165 探测0xce3bbe50async deposit与0x620ee8e4async redeem接口标识见 crates/cast/src/cmd/erc4626.rs。异步金库按规范要求preview*必须 revertcheck将其记为 WARN 而非 FAIL保守最大值与零上限maxDeposit/maxMint返回 0 提示可能只是保守最大值或设有门槛持仓非零但maxWithdraw/maxRedeem返回 0 提示流动性、门槛、提款队列或保守实现。八、测试与质量保障该功能配有完整的端到端测试crates/cast/tests/cli/erc4626.rs注册于 crates/cast/tests/cli/main.rs覆盖Anvil 本地同步金库全流程erc4626_complete_synchronous_interface在本地 anvil 上部署测试金库TestVault.sol依次验证erc20 approve→deposit/mint→withdraw/redeem的完整生命周期并断言info/position/check的文本与 JSON 输出ERC-7540 异步扩展探测erc4626_check_warns_for_known_extensions验证对异步金库TestAsyncVault的preview*revert 会输出 WARN 而非 FAIL元数据缺失erc4626_check_fails_for_missing_metadata验证缺失name/symbol/decimals时check以 3 项 FAIL 退出JSON 中read_compatiblefalse、错误码为erc4626.compatibility_failed真实生产金库回归erc4626_fork_reads_multiple_production_vaults在主网归档 RPC 分叉上对 Morpho MetaMorpho0xBEEF...A64CB、Yearn V30x028e...5336c、Maple syrupUSDC0x80ac...Cc0b执行全部只读与检查子命令另有针对 Tempo 网络 Morpho 金库的独立测试保证对主流金库实现的兼容性。另外源码内嵌单元测试all_subcommands_document_example_outputcrates/cast/src/cmd/erc4626.rs强制要求全部 19 个子命令的--help文档都包含$ cast erc4626示例命令与示例输出确保cast erc4626 子命令 --help随时可作为离线速查手册。九、实战建议快速审计陌生金库先cast erc4626 check VAULT确认只读接口可用再cast erc4626 info VAULT --human了解资产与汇率最后cast erc4626 position VAULT $OWNER --human检查目标账户持仓指定历史区块对涉及快照、审计或价格锚定的场景用-B block固定查询区块保证多次查询结果一致脚本化集成CI 或监控脚本中使用--json解析data字段注意check失败时进程以非零码退出并携带erc4626.compatibility_failed可作为合规门禁异步金库注意事项若check显示 ERC-7540 告警说明金库是异步模型preview*revert 属正常后续写入需走金库自己的请求/认领流程不能直接套用同步语义原生资产金库当asset()返回 ERC-7535 哨兵地址时deposit/mint需结合cast send --value附带原生资产价值仅靠--private-key发送不会自动附值。十、小结cast erc4626将 ERC-4626 金库的查询、检查与写入整合为 19 个直观子命令其中info金库摘要、position账户持仓、check21 项只读兼容性探测正是 changelog 所记录的三项新增核心能力。实现层面所有调用基于 alloy 生成的IERC4626接口并发执行配合 ERC-7535 原生资产哨兵与 ERC-7540 异步接口探测的告警体系让开发者无需手拼 calldata 即可安全、准确地与各类金库交互。结合仓库内置的生产金库回归测试与强制示例文档约束该命令族可作为 DeFi 开发与审计中的标准工具箱长期使用。【免费下载链接】foundryFoundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.项目地址: https://gitcode.com/GitHub_Trending/fo/foundry创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考