{"id":"c94acbff-400e-4bb9-908a-4eabc4f80b16","shortId":"4e8SqF","kind":"skill","title":"foundry-solidity","tagline":"Build and test Solidity smart contracts with Foundry toolkit. Use when developing Ethereum contracts, writing Forge tests, deploying with scripts, or debugging with Cast/Anvil. Triggers on Foundry commands (forge, cast, anvil), Solidity testing, smart contract development, or fil","description":"# Foundry Solidity Development\n\nComplete guide for building secure, efficient smart contracts with **Foundry 1.5.0** and **Solidity 0.8.30**.\n\n## When to Use This Skill\n\n- Developing Ethereum/EVM smart contracts\n- Writing Forge tests (unit, fuzz, invariant, fork)\n- Deploying contracts with scripts\n- Using Foundry tools (forge, cast, anvil, chisel)\n- Working with `foundry.toml`, `*.t.sol`, `*.s.sol` files\n- Debugging transactions and contract interactions\n\n## Quick Start\n\n```bash\n# Create new project\nforge init my-project && cd my-project\n\n# Build contracts\nforge build\n\n# Run tests\nforge test\n\n# Deploy (dry-run)\nforge script script/Deploy.s.sol --rpc-url sepolia\n\n# Deploy (broadcast)\nforge script script/Deploy.s.sol --rpc-url sepolia --broadcast --verify\n```\n\n## Project Structure\n\n```\nmy-project/\n├── foundry.toml          # Configuration\n├── src/                  # Contracts\n│   └── Counter.sol\n├── test/                 # Tests (*.t.sol)\n│   └── Counter.t.sol\n├── script/               # Deploy scripts (*.s.sol)\n│   └── Deploy.s.sol\n└── lib/                  # Dependencies\n    └── forge-std/\n```\n\n## Core Commands\n\n### Build & Test\n\n```bash\nforge build                          # Compile\nforge test                           # Run all tests\nforge test -vvvv                     # With traces\nforge test --match-test testDeposit  # Filter by test name\nforge test --match-contract Vault    # Filter by contract\nforge test --fork-url $RPC_URL       # Fork testing\nforge test --gas-report              # Gas usage report\n```\n\n### Deployment\n\n```bash\n# Single contract\nforge create src/Token.sol:Token --rpc-url sepolia --private-key $KEY --broadcast\n\n# Script deployment (recommended)\nforge script script/Deploy.s.sol:Deploy --rpc-url sepolia --broadcast --verify\n\n# Verify existing contract\nforge verify-contract $ADDRESS src/Token.sol:Token --chain sepolia\n```\n\n### Cast - Blockchain Interactions\n\n```bash\ncast call $CONTRACT \"balanceOf(address)\" $USER --rpc-url mainnet\ncast send $CONTRACT \"transfer(address,uint256)\" $TO $AMOUNT --private-key $KEY\ncast decode-tx $TX_HASH\ncast storage $CONTRACT 0 --rpc-url mainnet\n```\n\n### Anvil - Local Node\n\n```bash\nanvil                           # Start local node\nanvil --fork-url $RPC_URL       # Fork mainnet\nanvil --fork-block-number 18000000\n```\n\n## Basic Test Contract\n\n```solidity\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {Test, console} from \"forge-std/Test.sol\";\nimport {Counter} from \"../src/Counter.sol\";\n\ncontract CounterTest is Test {\n    Counter public counter;\n    address public user;\n\n    function setUp() public {\n        counter = new Counter();\n        user = makeAddr(\"user\");\n        deal(user, 10 ether);\n    }\n\n    function test_Increment() public {\n        counter.increment();\n        assertEq(counter.number(), 1);\n    }\n\n    function test_RevertWhen_Unauthorized() public {\n        vm.expectRevert(\"Unauthorized\");\n        vm.prank(user);\n        counter.adminFunction();\n    }\n\n    function testFuzz_SetNumber(uint256 x) public {\n        x = bound(x, 0, 1000);\n        counter.setNumber(x);\n        assertEq(counter.number(), x);\n    }\n}\n```\n\n## Essential Cheatcodes\n\n```solidity\n// Identity & ETH\naddress alice = makeAddr(\"alice\");          // Create labeled address\ndeal(alice, 10 ether);                      // Give ETH\ndeal(address(token), alice, 1000e18);       // Give ERC20\n\n// Impersonation\nvm.prank(alice);                            // Next call as alice\nvm.startPrank(alice);                       // All calls as alice\nvm.stopPrank();\n\n// Time & Block\nvm.warp(block.timestamp + 1 days);          // Set timestamp\nvm.roll(block.number + 100);                // Set block number\n\n// Assertions\nvm.expectRevert(\"Error message\");           // Expect revert\nvm.expectRevert(CustomError.selector);      // Custom error\nvm.expectEmit(true, true, false, true);     // Expect event\nemit Transfer(from, to, amount);            // Must match next emit\n\n// Storage\nvm.store(addr, slot, value);                // Write storage\nvm.load(addr, slot);                        // Read storage\n```\n\n## Deploy Script\n\n```solidity\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.30;\n\nimport {Script, console} from \"forge-std/Script.sol\";\nimport {Counter} from \"../src/Counter.sol\";\n\ncontract Deploy is Script {\n    function run() external {\n        uint256 deployerKey = vm.envUint(\"PRIVATE_KEY\");\n\n        vm.startBroadcast(deployerKey);\n        Counter counter = new Counter();\n        counter.setNumber(42);\n        vm.stopBroadcast();\n\n        console.log(\"Deployed to:\", address(counter));\n    }\n}\n```\n\n## Modern Solidity Patterns (0.8.30)\n\n```solidity\n// Custom errors (gas efficient)\nerror InsufficientBalance(uint256 available, uint256 required);\n\n// Transient storage (0.8.28+) - cheap reentrancy guard\nbool transient locked;\nmodifier nonReentrant() {\n    require(!locked, \"Reentrancy\");\n    locked = true;\n    _;\n    locked = false;\n}\n\n// Immutable variables (cheap reads)\naddress public immutable owner;\n\n// Named mapping parameters\nmapping(address user => uint256 balance) public balances;\n\n// require with custom error (0.8.26+)\nrequire(amount <= balance, InsufficientBalance(balance, amount));\n```\n\n## Configuration (foundry.toml)\n\n```toml\n[profile.default]\nsrc = \"src\"\nout = \"out\"\nlibs = [\"lib\"]\nsolc = \"0.8.30\"\noptimizer = true\noptimizer_runs = 200\nevm_version = \"prague\"\n\nfuzz.runs = 256\ninvariant.runs = 256\ninvariant.depth = 50\n\n[rpc_endpoints]\nmainnet = \"${MAINNET_RPC_URL}\"\nsepolia = \"${SEPOLIA_RPC_URL}\"\n\n[etherscan]\nmainnet = { key = \"${ETHERSCAN_API_KEY}\" }\nsepolia = { key = \"${ETHERSCAN_API_KEY}\" }\n\n[profile.ci]\nfuzz.runs = 10000\ninvariant.runs = 1000\n```\n\n## References\n\nFor detailed guides, see:\n\n- **Testing**: See `references/testing.md` for complete testing patterns (unit, fuzz, invariant, fork), all cheatcodes, and best practices\n- **forge-std API**: See `references/forge-std-api.md` for complete library reference (150+ functions)\n- **Solidity 0.8.30**: See `references/solidity-modern.md` for new features and modern syntax\n- **Deployment**: See `references/deployment.md` for scripting, verification, and multi-chain deployment\n- **Configuration**: See `references/configuration.md` for all foundry.toml options\n- **Gas Optimization**: See `references/gas-optimization.md` for storage packing, compiler settings, and profiling\n- **Patterns**: See `references/patterns.md` for access control, reentrancy guards, factories, and common idioms\n- **Security**: See `references/security.md` for vulnerabilities, defensive patterns, and audit preparation\n- **Resources**: See `references/resources.md` for official docs, libraries, security tools, and learning paths\n- **Debugging**: See `references/debugging.md` for traces, breakpoints, console.log, and the interactive debugger\n- **Dependencies**: See `references/dependencies.md` for forge install, remappings, and Soldeer package manager\n- **CI/CD**: See `references/cicd.md` for GitHub Actions workflows, caching, and gas tracking\n- **Chisel**: See `references/chisel.md` for the interactive Solidity REPL\n- **Cast Advanced**: See `references/cast-advanced.md` for decoding, encoding, wallet management, and batch operations\n- **Anvil Advanced**: See `references/anvil-advanced.md` for impersonation, state manipulation, and mining modes","tags":["foundry","solidity","skills","tenequm","agent-skills","ai-agents","claude-code","claude-skills","clawhub","erc-8004","mpp","openclaw"],"capabilities":["skill","source-tenequm","skill-foundry-solidity","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-claude-skills","topic-clawhub","topic-erc-8004","topic-mpp","topic-openclaw","topic-skills","topic-solana","topic-x402"],"categories":["skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/tenequm/skills/foundry-solidity","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add tenequm/skills","source_repo":"https://github.com/tenequm/skills","install_from":"skills.sh"}},"qualityScore":"0.461","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 23 github stars · SKILL.md body (7,327 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T01:01:39.566Z","embedding":null,"createdAt":"2026-04-18T23:05:15.675Z","updatedAt":"2026-04-22T01:01:39.566Z","lastSeenAt":"2026-04-22T01:01:39.566Z","tsv":"'/script.sol':514 '/src/counter.sol':347,518 '/test.sol':343 '0':297,398 '0.8.26':600 '0.8.28':562 '0.8.30':58,335,506,548,618,693 '1':378,448 '1.5.0':55 '10':369,419 '100':454 '1000':399,658 '10000':656 '1000e18':427 '150':690 '18000000':323 '200':623 '256':628,630 '42':538 '50':632 'access':735 'action':792 'addr':486,492 'address':257,270,280,355,410,416,424,543,582,590 'advanc':807,819 'alic':411,413,418,426,432,436,438,442 'amount':283,479,602,606 'anvil':34,84,302,306,310,318,818 'api':647,652,683 'assert':458 'asserteq':376,402 'audit':751 'avail':557 'balanc':593,595,603,605 'balanceof':269 'bash':99,170,221,265,305 'basic':324 'batch':816 'best':678 'block':321,445,456 'block.number':453 'block.timestamp':447 'blockchain':263 'bool':566 'bound':396 'breakpoint':770 'broadcast':132,140,236,248 'build':4,48,112,115,168,172 'cach':794 'call':267,434,440 'cast':33,83,262,266,276,288,294,806 'cast/anvil':27 'cd':108 'chain':260,711 'cheap':563,580 'cheatcod':406,676 'chisel':85,798 'ci/cd':787 'command':31,167 'common':741 'compil':173,727 'complet':45,668,687 'configur':148,607,713 'consol':338,509 'console.log':540,771 'contract':9,17,38,52,67,76,95,113,150,198,202,223,252,256,268,278,296,326,348,519 'control':736 'core':166 'counter':345,352,354,361,363,516,533,534,536,544 'counter.adminfunction':388 'counter.increment':375 'counter.number':377,403 'counter.setnumber':400,537 'counter.sol':151 'counter.t.sol':155 'countertest':349 'creat':100,225,414 'custom':466,550,598 'customerror.selector':465 'day':449 'deal':367,417,423 'debug':25,92,765 'debugg':775 'decod':290,811 'decode-tx':289 'defens':748 'depend':162,776 'deploy':21,75,120,131,157,220,238,243,496,520,541,702,712 'deploy.s.sol':160 'deployerkey':527,532 'detail':661 'develop':15,39,44,64 'doc':758 'dri':122 'dry-run':121 'effici':50,553 'emit':475,483 'encod':812 'endpoint':634 'erc20':429 'error':460,467,551,554,599 'essenti':405 'eth':409,422 'ether':370,420 'ethereum':16 'ethereum/evm':65 'etherscan':643,646,651 'event':474 'evm':624 'exist':251 'expect':462,473 'extern':525 'factori':739 'fals':471,577 'featur':698 'fil':41 'file':91 'filter':190,200 'forg':19,32,69,82,103,114,118,124,133,164,171,174,179,184,194,203,212,224,240,253,341,512,681,780 'forge-std':163,340,511,680 'fork':74,206,210,312,316,320,674 'fork-block-numb':319 'fork-url':205,311 'foundri':2,11,30,42,54,80 'foundry-solid':1 'foundry.toml':88,147,608,718 'function':358,371,379,389,523,691 'fuzz':72,672 'fuzz.runs':627,655 'gas':215,217,552,720,796 'gas-report':214 'github':791 'give':421,428 'guard':565,738 'guid':46,662 'hash':293 'ident':408 'identifi':331,502 'idiom':742 'immut':578,584 'imperson':430,823 'import':336,344,507,515 'increment':373 'init':104 'instal':781 'insufficientbal':555,604 'interact':96,264,774,803 'invari':73,673 'invariant.depth':631 'invariant.runs':629,657 'key':234,235,286,287,530,645,648,650,653 'label':415 'learn':763 'lib':161,615,616 'librari':688,759 'licens':330,501 'local':303,308 'lock':568,572,574,576 'mainnet':275,301,317,635,636,644 'makeaddr':365,412 'manag':786,814 'manipul':825 'map':587,589 'match':187,197,481 'match-contract':196 'match-test':186 'messag':461 'mine':827 'mit':332,503 'mode':828 'modern':545,700 'modifi':569 'multi':710 'multi-chain':709 'must':480 'my-project':105,109,144 'name':193,586 'new':101,362,535,697 'next':433,482 'node':304,309 'nonreentr':570 'number':322,457 'offici':757 'oper':817 'optim':619,621,721 'option':719 'owner':585 'pack':726 'packag':785 'paramet':588 'path':764 'pattern':547,670,731,749 'practic':679 'pragma':333,504 'pragu':626 'prepar':752 'privat':233,285,529 'private-key':232,284 'profil':730 'profile.ci':654 'profile.default':610 'project':102,107,111,142,146 'public':353,356,360,374,383,394,583,594 'quick':97 'read':494,581 'recommend':239 'reentranc':564,573,737 'refer':659,689 'references/anvil-advanced.md':821 'references/cast-advanced.md':809 'references/chisel.md':800 'references/cicd.md':789 'references/configuration.md':715 'references/debugging.md':767 'references/dependencies.md':778 'references/deployment.md':704 'references/forge-std-api.md':685 'references/gas-optimization.md':723 'references/patterns.md':733 'references/resources.md':755 'references/security.md':745 'references/solidity-modern.md':695 'references/testing.md':666 'remap':782 'repl':805 'report':216,219 'requir':559,571,596,601 'resourc':753 'revert':463 'revertwhen':381 'rpc':128,137,208,229,245,273,299,314,633,637,641 'rpc-url':127,136,228,244,272,298 'run':116,123,176,524,622 's.sol':90,159 'script':23,78,125,134,156,158,237,241,497,508,522,706 'script/deploy.s.sol':126,135,242 'secur':49,743,760 'see':663,665,684,694,703,714,722,732,744,754,766,777,788,799,808,820 'send':277 'sepolia':130,139,231,247,261,639,640,649 'set':450,455,728 'setnumb':391 'setup':359 'singl':222 'skill':63 'skill-foundry-solidity' 'slot':487,493 'smart':8,37,51,66 'solc':617 'soldeer':784 'solid':3,7,35,43,57,327,334,407,498,505,546,549,692,804 'source-tenequm' 'spdx':329,500 'spdx-license-identifi':328,499 'src':149,611,612 'src/token.sol':226,258 'start':98,307 'state':824 'std':165,342,513,682 'storag':295,484,490,495,561,725 'structur':143 'syntax':701 't.sol':89,154 'test':6,20,36,70,117,119,152,153,169,175,178,180,185,188,192,195,204,211,213,325,337,351,372,380,664,669 'testdeposit':189 'testfuzz':390 'time':444 'timestamp':451 'token':227,259,425 'toml':609 'tool':81,761 'toolkit':12 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-claude-skills' 'topic-clawhub' 'topic-erc-8004' 'topic-mpp' 'topic-openclaw' 'topic-skills' 'topic-solana' 'topic-x402' 'trace':183,769 'track':797 'transact':93 'transfer':279,476 'transient':560,567 'trigger':28 'true':469,470,472,575,620 'tx':291,292 'uint256':281,392,526,556,558,592 'unauthor':382,385 'unit':71,671 'url':129,138,207,209,230,246,274,300,313,315,638,642 'usag':218 'use':13,61,79 'user':271,357,364,366,368,387,591 'valu':488 'variabl':579 'vault':199 'verif':707 'verifi':141,249,250,255 'verify-contract':254 'version':625 'vm.envuint':528 'vm.expectemit':468 'vm.expectrevert':384,459,464 'vm.load':491 'vm.prank':386,431 'vm.roll':452 'vm.startbroadcast':531 'vm.startprank':437 'vm.stopbroadcast':539 'vm.stopprank':443 'vm.store':485 'vm.warp':446 'vulner':747 'vvvv':181 'wallet':813 'work':86 'workflow':793 'write':18,68,489 'x':393,395,397,401,404","prices":[{"id":"4aa3c697-f8ff-4044-b2c4-dc3a7364bba6","listingId":"c94acbff-400e-4bb9-908a-4eabc4f80b16","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"tenequm","category":"skills","install_from":"skills.sh"},"createdAt":"2026-04-18T23:05:15.675Z"}],"sources":[{"listingId":"c94acbff-400e-4bb9-908a-4eabc4f80b16","source":"github","sourceId":"tenequm/skills/foundry-solidity","sourceUrl":"https://github.com/tenequm/skills/tree/main/skills/foundry-solidity","isPrimary":false,"firstSeenAt":"2026-04-18T23:05:15.675Z","lastSeenAt":"2026-04-22T01:01:39.566Z"}],"details":{"listingId":"c94acbff-400e-4bb9-908a-4eabc4f80b16","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"tenequm","slug":"foundry-solidity","github":{"repo":"tenequm/skills","stars":23,"topics":["agent-skills","ai-agents","claude-code","claude-skills","clawhub","erc-8004","mpp","openclaw","skills","solana","x402"],"license":"mit","html_url":"https://github.com/tenequm/skills","pushed_at":"2026-04-14T16:24:57Z","description":"Agent skills for building, shipping, and growing software products","skill_md_sha":"9ad699589cee0fae435d475605e7e7fa2b693ae0","skill_md_path":"skills/foundry-solidity/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/tenequm/skills/tree/main/skills/foundry-solidity"},"layout":"multi","source":"github","category":"skills","frontmatter":{"name":"foundry-solidity","description":"Build and test Solidity smart contracts with Foundry toolkit. Use when developing Ethereum contracts, writing Forge tests, deploying with scripts, or debugging with Cast/Anvil. Triggers on Foundry commands (forge, cast, anvil), Solidity testing, smart contract development, or files like foundry.toml, *.t.sol, *.s.sol."},"skills_sh_url":"https://skills.sh/tenequm/skills/foundry-solidity"},"updatedAt":"2026-04-22T01:01:39.566Z"}}