Foundry
爲什麼要⽤ Foundry
快 - 加速開發
Solidity - 減少上下⽂切換
功能豐富
⾜夠輕量
Foundry 的組件
forge
cast
anvil
安裝
https://getfoundry.sh/
curl -L https://foundry.paradigm.xyz | bash foundryup
Cast - 與鏈交互的⼯具箱 RPC
cast rpc <METHOD> <PARAMS> --rpc-url=$RPC
區塊查詢
cast block-number --rpc-url=$RPC
cast find-block <TIMESTAMP> --rpc-url=$RPC
cast block <BLOCK> --rpc-url=$RPC
cast block <BLOCK> [FIELD] --json --rpc-url=$RPC
交易查詢
cast tx <HASH> [FIELD] --rpc-url=$RPC
cast receipt <HASH> [FIELD] --rpc-url=$RPC
交易解析
cast 4byte <SELECTOR>
cast sig <SIG>
cast upload-signature <SIG>
cast pretty-calldata <CALLDATA>
cast calldata <SIG> <ARGS>
cast 4byte-event <TOPIC_0>
cast keccak <DATA>
賬戶管理
cast wallet new [OUT_DIR]
cast wallet sign <MESSAGE> --keystore=<PATH>
cast wallet verify --address <ADDRESS> <MESSAGE> <SIGNATURE>
合約查詢
cast etherscan-source <ADDRESS> --chain=<CHAIN> --etherscan-api-key=<KEY> -d=<OUT_DIR> cast interface <PATH_OR_ADDRESS> --chain=<CHAIN> --etherscan-api-key=<KEY>
cast storage <ADDRESS> <SLOT> --rpc-url=$RPC
cast index <KEY_TYPE> <KEY> <SLOT_NUMBER>
合約交互
cast call <ADDRESS> <SIG> [ARGS] --rpc-url=$RPC
cast send <TO> <SIG> [ARGS] --rpc-url=$RPC --keystore=<PATH>
ENS
cast resolve-name <NAME> --rpc-url=$RPC
cast lookup-address <ADDRESS> --rpc-url=$RPC
編碼解碼
cast --to-hex
cast --to-dec
cast --to-unit
cast --to-wei
cast --to-rlp
cast --from-rlp
本地模擬鏈上交易
cast run <HASH> --rpc-url=$RPC
Traces:
[<Gas Usage>] <Contract>::<Function>(<Parameters>) ├─ [<Gas Usage>] <Contract>::<Function>(<Parameters>) │ └─ ← <Return Value>
└─ ← <Return Value>
Green: For calls that do not revert
Red: For reverting calls
Blue: For calls to cheat codes
Cyan: For emitted logs
Yellow: For contract deployments
Anvil - 本地節點
anvil
anvim --accounts=<NUM> --balance=<NUM>
anvil --mnemonic=<MNEMONIC>
anvil --fork-url=$RPC --fork-block-number=<BLOCK> 特殊 RPC ⽅法
anvil_* -> hardhat_*
anvil_impersonateAccount
anvil_setStorageAt
Forge - 智能合約開發框架 初始化項⽬
forge init <dir_name>
forge init --template <template_path> <dir_name>
依賴管理
forge install <gh_user/gh_repo>
forge update <dep>
forge remove <dep>
依賴映射
forge remappings
forge remappings > remappings.txt
代碼美化
forge fmt
編譯項⽬
forge build
forge build --watch
FOUNDRY_PROFILE=release forge build
獲取更多細節
forge build --extra-output=<SELECTOR>
forge inspect <CONTRACT> <FIELD>
代碼測試
forge test
forge test -vvvv
forge test -w
forge test --match-test/--match-contract/--match-path forge test --fork-url=$RPC
測試代碼的結構
斷⾔庫的使⽤
使⽤ cheatcode 改變 vm 狀態
ffi 的使⽤
fuzz 測試
invariant 測試
code coverage
gas 報告
forge test --gas-report
forge snapshot
⽤ solidity 寫腳本
forge script <PATH>
部署合約
forge script <PATH> --broadcast
Debugger
forge script <PATH> --debug
cast run <HASH> --debug
集成 GitHub actions
continous-integration