[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EF1SW0C89M4JBZ0QYC8F7Z":3,"skill-same:01M6EF1SW0C89M4JBZ0QYC8F7Z":63},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":20,"frontMatter":21,"refName":22,"commitSha":23,"skillDirectory":24,"forksCount":25,"repositoryHtmlUrl":26,"repositoryHomepageUrl":27,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6EF1SW0C89M4JBZ0QYC8F7Z","foundry",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Ffoundry\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"# Foundry — Blazing Fast Ethereum Development Toolkit\n\nYou are an expert in Foundry, the blazing-fast Ethereum development toolkit written in Rust. You help developers write, test, deploy, and debug Solidity smart contracts using Forge (testing), Cast (CLI interactions), Anvil (local node), and Chisel (Solidity REPL) — with native Solidity testing (no JavaScript), fuzz testing, gas optimization, and fork testing against mainnet state.\n\n## Core Capabilities\n\n### Project Setup\n\n```bash\n# Create new project\nforge init my-project\ncd my-project\n\n# Structure:\n# src\u002F          — Solidity contracts\n# test\u002F         — Solidity tests\n# script\u002F       — Deployment scripts\n# lib\u002F          — Dependencies (git submodules)\n# foundry.toml  — Configuration\n\n# Install dependencies\nforge install OpenZeppelin\u002Fopenzeppelin-contracts\nforge install transmissions11\u002Fsolmate\n```\n\n### Smart Contract\n\n```solidity\n\u002F\u002F src\u002FVault.sol — ERC-4626 yield vault\n\u002F\u002F SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {ERC4626} from \"@openzeppelin\u002Fcontracts\u002Ftoken\u002FERC20\u002Fextensions\u002FERC4626.sol\";\nimport {ERC20, IERC20} from \"@openzeppelin\u002Fcontracts\u002Ftoken\u002FERC20\u002FERC20.sol\";\nimport {Ownable} from \"@openzeppelin\u002Fcontracts\u002Faccess\u002FOwnable.sol\";\n\ncontract Vault is ERC4626, Ownable {\n    uint256 public totalDeposited;\n    uint256 public yieldRate;              \u002F\u002F Basis points per year (e.g., 500 = 5%)\n    mapping(address => uint256) public depositTimestamp;\n\n    constructor(IERC20 asset_, uint256 yieldRate_)\n        ERC4626(asset_)\n        ERC20(\"Vault Share\", \"vSHARE\")\n        Ownable(msg.sender)\n    {\n        yieldRate = yieldRate_;\n    }\n\n    function deposit(uint256 assets, address receiver)\n        public override returns (uint256 shares)\n    {\n        shares = super.deposit(assets, receiver);\n        totalDeposited += assets;\n        depositTimestamp[receiver] = block.timestamp;\n        return shares;\n    }\n\n    function setYieldRate(uint256 newRate) external onlyOwner {\n        require(newRate \u003C= 2000, \"Rate too high\");  \u002F\u002F Max 20%\n        yieldRate = newRate;\n    }\n}\n```\n\n### Testing in Solidity\n\n```solidity\n\u002F\u002F test\u002FVault.t.sol — Native Solidity tests\n\u002F\u002F SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Test, console} from \"forge-std\u002FTest.sol\";\nimport {Vault} from \"..\u002Fsrc\u002FVault.sol\";\nimport {MockERC20} from \".\u002Fmocks\u002FMockERC20.sol\";\n\ncontract VaultTest is Test {\n    Vault vault;\n    MockERC20 token;\n    address alice = makeAddr(\"alice\");\n    address bob = makeAddr(\"bob\");\n\n    function setUp() public {\n        token = new MockERC20(\"USDC\", \"USDC\", 6);\n        vault = new Vault(token, 500);     \u002F\u002F 5% yield\n\n        \u002F\u002F Fund test accounts\n        token.mint(alice, 10_000e6);\n        token.mint(bob, 5_000e6);\n    }\n\n    function test_Deposit() public {\n        vm.startPrank(alice);              \u002F\u002F Impersonate alice\n        token.approve(address(vault), 1_000e6);\n        uint256 shares = vault.deposit(1_000e6, alice);\n        vm.stopPrank();\n\n        assertEq(vault.balanceOf(alice), shares);\n        assertEq(vault.totalDeposited(), 1_000e6);\n        assertEq(token.balanceOf(address(vault)), 1_000e6);\n    }\n\n    function test_OnlyOwnerCanSetRate() public {\n        vm.prank(alice);                   \u002F\u002F Not owner\n        vm.expectRevert();\n        vault.setYieldRate(1000);\n    }\n\n    function test_RateCannotExceed20Percent() public {\n        vm.expectRevert(\"Rate too high\");\n        vault.setYieldRate(2001);\n    }\n\n    \u002F\u002F Fuzz testing: Foundry generates random inputs\n    function testFuzz_Deposit(uint256 amount) public {\n        amount = bound(amount, 1, 10_000e6);  \u002F\u002F Constrain range\n\n        vm.startPrank(alice);\n        token.approve(address(vault), amount);\n        vault.deposit(amount, alice);\n        vm.stopPrank();\n\n        assertEq(vault.totalDeposited(), amount);\n    }\n\n    \u002F\u002F Fork testing: test against mainnet state\n    function test_ForkMainnet() public {\n        vm.createSelectFork(\"mainnet\");    \u002F\u002F Requires RPC URL in foundry.toml\n        \u002F\u002F Now interacting with real mainnet contracts\n        IERC20 usdc = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48);\n        assertGt(usdc.totalSupply(), 0);\n    }\n}\n```\n\n### Deployment Scripts\n\n```solidity\n\u002F\u002F script\u002FDeploy.s.sol\npragma solidity ^0.8.20;\n\nimport {Script} from \"forge-std\u002FScript.sol\";\nimport {Vault} from \"..\u002Fsrc\u002FVault.sol\";\n\ncontract DeployScript is Script {\n    function run() external {\n        uint256 deployerKey = vm.envUint(\"PRIVATE_KEY\");\n        address usdc = vm.envAddress(\"USDC_ADDRESS\");\n\n        vm.startBroadcast(deployerKey);\n        Vault vault = new Vault(IERC20(usdc), 500);\n        vm.stopBroadcast();\n\n        console.log(\"Vault deployed at:\", address(vault));\n    }\n}\n```\n\n```bash\n# Deploy\nforge script script\u002FDeploy.s.sol --rpc-url $RPC_URL --broadcast --verify\n\n# Cast: interact with contracts from CLI\ncast call $VAULT \"totalDeposited()\" --rpc-url $RPC_URL\ncast send $VAULT \"setYieldRate(uint256)\" 800 --private-key $KEY --rpc-url $RPC_URL\ncast balance $ADDRESS --rpc-url $RPC_URL\n\n# Anvil: local node\nanvil                                      # Starts at localhost:8545\nanvil --fork-url $MAINNET_RPC             # Fork mainnet locally\n```\n\n## Installation\n\n```bash\ncurl -L https:\u002F\u002Ffoundry.paradigm.xyz | bash\nfoundryup                                 # Install\u002Fupdate forge, cast, anvil, chisel\n```\n\n## Best Practices\n\n1. **Test in Solidity** — Write tests in Solidity, not JavaScript; faster execution, better type safety, same language as contracts\n2. **Fuzz testing** — Use `testFuzz_` prefix; Foundry generates 256 random inputs by default, catches edge cases\n3. **Fork testing** — Test against real mainnet state with `vm.createSelectFork`; verify integrations with live contracts\n4. **Gas snapshots** — Run `forge snapshot` to track gas usage; commit `.gas-snapshot` to detect regressions\n5. **Cheatcodes** — `vm.prank()`, `vm.warp()`, `vm.roll()`, `vm.expectRevert()` for comprehensive testing\n6. **Invariant testing** — Define invariants that must always hold; Foundry tries to break them with random sequences\n7. **Deployment scripts** — Use Forge scripts instead of raw transactions; reproducible, verified deployments\n8. **Cast for debugging** — `cast calldata-decode`, `cast abi-encode`, `cast tx` for on-chain debugging\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002FTerminalSkills\u002Fskills\u002Ffoundry",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill foundry",{"tool":37,"command":38},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill foundry",{"tool":40,"command":41},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill foundry","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002FTerminalSkills\u002Fskills\u002Ffoundry\u002FSKILL.md",true,[45,51,55,59],{"path":46,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":49,"sourceHtmlUrl":50},"references\u002Fapi.md","REFERENCE","参考文档",121144,"https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fhermes_sovereign_data\u002Fskills\u002Fmlops\u002Ftraining\u002Faxolotl\u002Freferences\u002Fapi.md",{"path":52,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":53,"sourceHtmlUrl":54},"references\u002Fdataset-formats.md",46043,"https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fhermes_sovereign_data\u002Fskills\u002Fmlops\u002Ftraining\u002Faxolotl\u002Freferences\u002Fdataset-formats.md",{"path":56,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":57,"sourceHtmlUrl":58},"references\u002Findex.md",199,"https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fhermes_sovereign_data\u002Fskills\u002Fmlops\u002Ftraining\u002Faxolotl\u002Freferences\u002Findex.md",{"path":60,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":61,"sourceHtmlUrl":62},"references\u002Fother.md",140407,"https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fhermes_sovereign_data\u002Fskills\u002Fmlops\u002Ftraining\u002Faxolotl\u002Freferences\u002Fother.md",[64,78,88,97,103,110],{"skillNo":65,"name":66,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":74,"publishedAt":18},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[69],{"categoryNo":70,"categoryName":71,"taxonomyType":72,"taxonomyTypeDesc":73},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[75,76,77],"model","model hierarchy","model hierarchy skill",{"skillNo":79,"name":80,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":84,"publishedAt":18},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[83],{"categoryNo":70,"categoryName":71,"taxonomyType":72,"taxonomyTypeDesc":73},[85,86,87],"MCP","zoom","zoom mcp",{"skillNo":89,"name":90,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":18},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[94,95,96,86],"sdk","zoom apps sdk","apps",{"skillNo":98,"name":99,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":102,"publishedAt":18},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[99],{"skillNo":104,"name":105,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":109,"publishedAt":18},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[108],{"categoryNo":70,"categoryName":71,"taxonomyType":72,"taxonomyTypeDesc":73},[105],{"skillNo":111,"name":112,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":18},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[112]]