{"id":"5b8cc710-3855-47c5-bd01-797f1b6fa260","shortId":"9EDnEx","kind":"skill","title":"web3-testing","tagline":"Master comprehensive testing strategies for smart contracts using Hardhat, Foundry, and advanced testing patterns.","description":"# Web3 Smart Contract Testing\n\nMaster comprehensive testing strategies for smart contracts using Hardhat, Foundry, and advanced testing patterns.\n\n## Do not use this skill when\n\n- The task is unrelated to web3 smart contract testing\n- You need a different domain or tool outside this scope\n\n## Instructions\n\n- Clarify goals, constraints, and required inputs.\n- Apply relevant best practices and validate outcomes.\n- Provide actionable steps and verification.\n- If detailed examples are required, open `resources/implementation-playbook.md`.\n\n## Use this skill when\n\n- Writing unit tests for smart contracts\n- Setting up integration test suites\n- Performing gas optimization testing\n- Fuzzing for edge cases\n- Forking mainnet for realistic testing\n- Automating test coverage reporting\n- Verifying contracts on Etherscan\n\n## Hardhat Testing Setup\n\n```javascript\n// hardhat.config.js\nrequire(\"@nomicfoundation/hardhat-toolbox\");\nrequire(\"@nomiclabs/hardhat-etherscan\");\nrequire(\"hardhat-gas-reporter\");\nrequire(\"solidity-coverage\");\n\nmodule.exports = {\n  solidity: {\n    version: \"0.8.19\",\n    settings: {\n      optimizer: {\n        enabled: true,\n        runs: 200,\n      },\n    },\n  },\n  networks: {\n    hardhat: {\n      forking: {\n        url: process.env.MAINNET_RPC_URL,\n        blockNumber: 15000000,\n      },\n    },\n    goerli: {\n      url: process.env.GOERLI_RPC_URL,\n      accounts: [process.env.PRIVATE_KEY],\n    },\n  },\n  gasReporter: {\n    enabled: true,\n    currency: \"USD\",\n    coinmarketcap: process.env.COINMARKETCAP_API_KEY,\n  },\n  etherscan: {\n    apiKey: process.env.ETHERSCAN_API_KEY,\n  },\n};\n```\n\n## Unit Testing Patterns\n\n```javascript\nconst { expect } = require(\"chai\");\nconst { ethers } = require(\"hardhat\");\nconst {\n  loadFixture,\n  time,\n} = require(\"@nomicfoundation/hardhat-network-helpers\");\n\ndescribe(\"Token Contract\", function () {\n  // Fixture for test setup\n  async function deployTokenFixture() {\n    const [owner, addr1, addr2] = await ethers.getSigners();\n\n    const Token = await ethers.getContractFactory(\"Token\");\n    const token = await Token.deploy();\n\n    return { token, owner, addr1, addr2 };\n  }\n\n  describe(\"Deployment\", function () {\n    it(\"Should set the right owner\", async function () {\n      const { token, owner } = await loadFixture(deployTokenFixture);\n      expect(await token.owner()).to.equal(owner.address);\n    });\n\n    it(\"Should assign total supply to owner\", async function () {\n      const { token, owner } = await loadFixture(deployTokenFixture);\n      const ownerBalance = await token.balanceOf(owner.address);\n      expect(await token.totalSupply()).to.equal(ownerBalance);\n    });\n  });\n\n  describe(\"Transactions\", function () {\n    it(\"Should transfer tokens between accounts\", async function () {\n      const { token, owner, addr1 } = await loadFixture(deployTokenFixture);\n\n      await expect(token.transfer(addr1.address, 50)).to.changeTokenBalances(\n        token,\n        [owner, addr1],\n        [-50, 50],\n      );\n    });\n\n    it(\"Should fail if sender doesn't have enough tokens\", async function () {\n      const { token, addr1 } = await loadFixture(deployTokenFixture);\n      const initialBalance = await token.balanceOf(addr1.address);\n\n      await expect(\n        token.connect(addr1).transfer(owner.address, 1),\n      ).to.be.revertedWith(\"Insufficient balance\");\n    });\n\n    it(\"Should emit Transfer event\", async function () {\n      const { token, owner, addr1 } = await loadFixture(deployTokenFixture);\n\n      await expect(token.transfer(addr1.address, 50))\n        .to.emit(token, \"Transfer\")\n        .withArgs(owner.address, addr1.address, 50);\n    });\n  });\n\n  describe(\"Time-based tests\", function () {\n    it(\"Should handle time-locked operations\", async function () {\n      const { token } = await loadFixture(deployTokenFixture);\n\n      // Increase time by 1 day\n      await time.increase(86400);\n\n      // Test time-dependent functionality\n    });\n  });\n\n  describe(\"Gas optimization\", function () {\n    it(\"Should use gas efficiently\", async function () {\n      const { token } = await loadFixture(deployTokenFixture);\n\n      const tx = await token.transfer(addr1.address, 100);\n      const receipt = await tx.wait();\n\n      expect(receipt.gasUsed).to.be.lessThan(50000);\n    });\n  });\n});\n```\n\n## Foundry Testing (Forge)\n\n```solidity\n// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"forge-std/Test.sol\";\nimport \"../src/Token.sol\";\n\ncontract TokenTest is Test {\n    Token token;\n    address owner = address(1);\n    address user1 = address(2);\n    address user2 = address(3);\n\n    function setUp() public {\n        vm.prank(owner);\n        token = new Token();\n    }\n\n    function testInitialSupply() public {\n        assertEq(token.totalSupply(), 1000000 * 10**18);\n    }\n\n    function testTransfer() public {\n        vm.prank(owner);\n        token.transfer(user1, 100);\n\n        assertEq(token.balanceOf(user1), 100);\n        assertEq(token.balanceOf(owner), token.totalSupply() - 100);\n    }\n\n    function testFailTransferInsufficientBalance() public {\n        vm.prank(user1);\n        token.transfer(user2, 100); // Should fail\n    }\n\n    function testCannotTransferToZeroAddress() public {\n        vm.prank(owner);\n        vm.expectRevert(\"Invalid recipient\");\n        token.transfer(address(0), 100);\n    }\n\n    // Fuzzing test\n    function testFuzzTransfer(uint256 amount) public {\n        vm.assume(amount > 0 && amount <= token.totalSupply());\n\n        vm.prank(owner);\n        token.transfer(user1, amount);\n\n        assertEq(token.balanceOf(user1), amount);\n    }\n\n    // Test with cheatcodes\n    function testDealAndPrank() public {\n        // Give ETH to address\n        vm.deal(user1, 10 ether);\n\n        // Impersonate address\n        vm.prank(user1);\n\n        // Test functionality\n        assertEq(user1.balance, 10 ether);\n    }\n\n    // Mainnet fork test\n    function testForkMainnet() public {\n        vm.createSelectFork(\"https://eth-mainnet.alchemyapi.io/v2/...\");\n\n        // Interact with mainnet contracts\n        address dai = 0x6B175474E89094C44Da98b954EedeAC495271d0F;\n        assertEq(IERC20(dai).symbol(), \"DAI\");\n    }\n}\n```\n\n## Advanced Testing Patterns\n\n### Snapshot and Revert\n\n```javascript\ndescribe(\"Complex State Changes\", function () {\n  let snapshotId;\n\n  beforeEach(async function () {\n    snapshotId = await network.provider.send(\"evm_snapshot\");\n  });\n\n  afterEach(async function () {\n    await network.provider.send(\"evm_revert\", [snapshotId]);\n  });\n\n  it(\"Test 1\", async function () {\n    // Make state changes\n  });\n\n  it(\"Test 2\", async function () {\n    // State reverted, clean slate\n  });\n});\n```\n\n### Mainnet Forking\n\n```javascript\ndescribe(\"Mainnet Fork Tests\", function () {\n  let uniswapRouter, dai, usdc;\n\n  before(async function () {\n    await network.provider.request({\n      method: \"hardhat_reset\",\n      params: [\n        {\n          forking: {\n            jsonRpcUrl: process.env.MAINNET_RPC_URL,\n            blockNumber: 15000000,\n          },\n        },\n      ],\n    });\n\n    // Connect to existing mainnet contracts\n    uniswapRouter = await ethers.getContractAt(\n      \"IUniswapV2Router\",\n      \"0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D\",\n    );\n\n    dai = await ethers.getContractAt(\n      \"IERC20\",\n      \"0x6B175474E89094C44Da98b954EedeAC495271d0F\",\n    );\n  });\n\n  it(\"Should swap on Uniswap\", async function () {\n    // Test with real Uniswap contracts\n  });\n});\n```\n\n### Impersonating Accounts\n\n```javascript\nit(\"Should impersonate whale account\", async function () {\n  const whaleAddress = \"0x...\";\n\n  await network.provider.request({\n    method: \"hardhat_impersonateAccount\",\n    params: [whaleAddress],\n  });\n\n  const whale = await ethers.getSigner(whaleAddress);\n\n  // Use whale's tokens\n  await dai\n    .connect(whale)\n    .transfer(addr1.address, ethers.utils.parseEther(\"1000\"));\n});\n```\n\n## Gas Optimization Testing\n\n```javascript\nconst { expect } = require(\"chai\");\n\ndescribe(\"Gas Optimization\", function () {\n  it(\"Compare gas usage between implementations\", async function () {\n    const Implementation1 =\n      await ethers.getContractFactory(\"OptimizedContract\");\n    const Implementation2 = await ethers.getContractFactory(\n      \"UnoptimizedContract\",\n    );\n\n    const contract1 = await Implementation1.deploy();\n    const contract2 = await Implementation2.deploy();\n\n    const tx1 = await contract1.doSomething();\n    const receipt1 = await tx1.wait();\n\n    const tx2 = await contract2.doSomething();\n    const receipt2 = await tx2.wait();\n\n    console.log(\"Optimized gas:\", receipt1.gasUsed.toString());\n    console.log(\"Unoptimized gas:\", receipt2.gasUsed.toString());\n\n    expect(receipt1.gasUsed).to.be.lessThan(receipt2.gasUsed);\n  });\n});\n```\n\n## Coverage Reporting\n\n```bash\n# Generate coverage report\nnpx hardhat coverage\n\n# Output shows:\n# File                | % Stmts | % Branch | % Funcs | % Lines |\n# -------------------|---------|----------|---------|---------|\n# contracts/Token.sol |   100   |   90     |   100   |   95    |\n```\n\n## Contract Verification\n\n```javascript\n// Verify on Etherscan\nawait hre.run(\"verify:verify\", {\n  address: contractAddress,\n  constructorArguments: [arg1, arg2],\n});\n```\n\n```bash\n# Or via CLI\nnpx hardhat verify --network mainnet CONTRACT_ADDRESS \"Constructor arg1\" \"arg2\"\n```\n\n## CI/CD Integration\n\n```yaml\n# .github/workflows/test.yml\nname: Tests\n\non: [push, pull_request]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions/checkout@v2\n      - uses: actions/setup-node@v2\n        with:\n          node-version: \"16\"\n\n      - run: npm install\n      - run: npx hardhat compile\n      - run: npx hardhat test\n      - run: npx hardhat coverage\n\n      - name: Upload coverage to Codecov\n        uses: codecov/codecov-action@v2\n```\n\n## Resources\n\n- **references/hardhat-setup.md**: Hardhat configuration guide\n- **references/foundry-setup.md**: Foundry testing framework\n- **references/test-patterns.md**: Testing best practices\n- **references/mainnet-forking.md**: Fork testing strategies\n- **references/contract-verification.md**: Etherscan verification\n- **assets/hardhat-config.js**: Complete Hardhat configuration\n- **assets/test-suite.js**: Comprehensive test examples\n- **assets/foundry.toml**: Foundry configuration\n- **scripts/test-contract.sh**: Automated testing script\n\n## Best Practices\n\n1. **Test Coverage**: Aim for >90% coverage\n2. **Edge Cases**: Test boundary conditions\n3. **Gas Limits**: Verify functions don't hit block gas limit\n4. **Reentrancy**: Test for reentrancy vulnerabilities\n5. **Access Control**: Test unauthorized access attempts\n6. **Events**: Verify event emissions\n7. **Fixtures**: Use fixtures to avoid code duplication\n8. **Mainnet Fork**: Test with real contracts\n9. **Fuzzing**: Use property-based testing\n10. **CI/CD**: Automate testing on every commit\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["web3","testing","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows"],"capabilities":["skill","source-sickn33","skill-web3-testing","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/web3-testing","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34404 github stars · SKILL.md body (11,170 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-22T00:51:57.978Z","embedding":null,"createdAt":"2026-04-18T21:47:26.699Z","updatedAt":"2026-04-22T00:51:57.978Z","lastSeenAt":"2026-04-22T00:51:57.978Z","tsv":"'-50':304 '/src/token.sol':446 '/test.sol':444 '/v2/...':574 '0':518,529 '0.8.0':439 '0.8.19':144 '0x':701 '0x6b175474e89094c44da98b954eedeac495271d0f':581,676 '0x7a250d5630b4cf539739df2c5dacb4c659f2488d':671 '1':335,388,456,619,932 '10':479,553,563,996 '100':419,488,492,497,505,519,809,811 '1000':725 '1000000':478 '15000000':159,661 '16':871 '18':480 '2':460,627,939 '200':150 '3':464,945 '4':956 '5':962 '50':299,305,357,364 '50000':427 '6':969 '7':974 '8':982 '86400':392 '9':989 '90':810,937 '95':812 'access':963,967 'account':165,285,690,696 'action':76 'actions/checkout':862 'actions/setup-node':865 'addr1':212,228,291,303,320,332,349 'addr1.address':298,328,356,363,418,723 'addr2':213,229 'address':453,455,457,459,461,463,517,550,556,579,823,838 'advanc':15,33,587 'aftereach':609 'aim':935 'amount':525,528,530,536,540 'api':175,180 'apikey':178 'appli':68 'arg1':826,840 'arg2':827,841 'ask':1036 'asserteq':476,489,493,537,561,582 'assets/foundry.toml':923 'assets/hardhat-config.js':915 'assets/test-suite.js':919 'assign':254 'async':207,239,259,286,316,344,378,407,602,610,620,628,647,682,697,744 'attempt':968 'autom':115,927,998 'avoid':979 'await':214,218,223,244,248,264,269,273,292,295,321,326,329,350,353,382,390,411,416,422,605,612,649,668,673,702,711,718,748,753,758,762,766,770,774,778,819 'balanc':338 'base':368,994 'bash':794,828 'beforeeach':601 'best':70,906,930 'block':953 'blocknumb':158,660 'boundari':943,1044 'branch':805 'case':109,941 'chai':189,733 'chang':597,624 'cheatcod':543 'ci/cd':842,997 'clarif':1038 'clarifi':62 'clean':632 'clear':1011 'cli':831 'code':980 'codecov':891 'codecov/codecov-action':893 'coinmarketcap':173 'commit':1002 'compar':739 'compil':878 'complet':916 'complex':595 'comprehens':5,23,920 'condit':944 'configur':898,918,925 'connect':662,720 'console.log':780,784 'const':186,190,194,210,216,221,241,261,267,288,318,324,346,380,409,414,420,699,709,730,746,751,756,760,764,768,772,776 'constraint':64 'constructor':839 'constructorargu':825 'contract':10,20,28,49,96,120,201,447,578,666,688,813,837,988 'contract1':757 'contract1.dosomething':767 'contract2':761 'contract2.dosomething':775 'contractaddress':824 'contracts/token.sol':808 'control':964 'coverag':117,140,792,796,800,886,889,934,938 'criteria':1047 'currenc':171 'dai':580,584,586,644,672,719 'day':389 'depend':396 'deploy':231 'deploytokenfixtur':209,246,266,294,323,352,384,413 'describ':199,230,277,365,398,594,637,734,1015 'detail':81 'differ':54 'doesn':311 'domain':55 'duplic':981 'edg':108,940 'effici':406 'emiss':973 'emit':341 'enabl':147,169 'enough':314 'environ':1027 'environment-specif':1026 'eth':548 'eth-mainnet.alchemyapi.io':573 'eth-mainnet.alchemyapi.io/v2/...':572 'ether':191,554,564 'ethers.getcontractat':669,674 'ethers.getcontractfactory':219,749,754 'ethers.getsigner':712 'ethers.getsigners':215 'ethers.utils.parseether':724 'etherscan':122,177,818,913 'event':343,970,972 'everi':1001 'evm':607,614 'exampl':82,922 'exist':664 'expect':187,247,272,296,330,354,424,731,788 'expert':1032 'fail':308,507 'file':803 'fixtur':203,975,977 'forg':430,442 'forge-std':441 'fork':110,153,566,635,639,655,909,984 'foundri':13,31,428,901,924 'framework':903 'func':806 'function':202,208,232,240,260,279,287,317,345,370,379,397,401,408,465,473,481,498,508,522,544,560,568,598,603,611,621,629,641,648,683,698,737,745,949 'fuzz':106,520,990 'gas':103,135,399,405,726,735,740,782,786,946,954 'gasreport':168 'generat':795 'github/workflows/test.yml':845 'give':547 'goal':63 'goer':160 'guid':899 'handl':373 'hardhat':12,30,123,134,152,193,652,705,799,833,877,881,885,897,917 'hardhat-gas-report':133 'hardhat.config.js':127 'hit':952 'hre.run':820 'identifi':435 'ierc20':583,675 'imperson':555,689,694 'impersonateaccount':706 'implement':743 'implementation1':747 'implementation1.deploy':759 'implementation2':752 'implementation2.deploy':763 'import':440,445 'increas':385 'initialbal':325 'input':67,1041 'instal':874 'instruct':61 'insuffici':337 'integr':99,843 'interact':575 'invalid':514 'iuniswapv2router':670 'javascript':126,185,593,636,691,729,815 'job':852 'jsonrpcurl':656 'key':167,176,181 'latest':859 'let':599,642 'licens':434 'limit':947,955,1003 'line':807 'loadfixtur':195,245,265,293,322,351,383,412 'lock':376 'mainnet':111,565,577,634,638,665,836,983 'make':622 'master':4,22 'match':1012 'method':651,704 'miss':1049 'mit':436 'module.exports':141 'name':846,887 'need':52 'network':151,835 'network.provider.request':650,703 'network.provider.send':606,613 'new':471 'node':869 'node-vers':868 'nomicfoundation/hardhat-network-helpers':198 'nomicfoundation/hardhat-toolbox':129 'nomiclabs/hardhat-etherscan':131 'npm':873 'npx':798,832,876,880,884 'open':85 'oper':377 'optim':104,146,400,727,736,781 'optimizedcontract':750 'outcom':74 'output':801,1021 'outsid':58 'owner':211,227,238,243,258,263,290,302,348,454,469,485,495,512,533 'owner.address':251,271,334,362 'ownerbal':268,276 'param':654,707 'pattern':17,35,184,589 'perform':102 'permiss':1042 'practic':71,907,931 'pragma':437 'process.env.coinmarketcap':174 'process.env.etherscan':179 'process.env.goerli':162 'process.env.mainnet':155,657 'process.env.private':166 'properti':993 'property-bas':992 'provid':75 'public':467,475,483,500,510,526,546,570 'pull':850 'push':849 'real':686,987 'realist':113 'receipt':421 'receipt.gasused':425 'receipt1':769 'receipt1.gasused':789 'receipt1.gasused.tostring':783 'receipt2':777 'receipt2.gasused':791 'receipt2.gasused.tostring':787 'recipi':515 'reentranc':957,960 'references/contract-verification.md':912 'references/foundry-setup.md':900 'references/hardhat-setup.md':896 'references/mainnet-forking.md':908 'references/test-patterns.md':904 'relev':69 'report':118,136,793,797 'request':851 'requir':66,84,128,130,132,137,188,192,197,732,1040 'reset':653 'resourc':895 'resources/implementation-playbook.md':86 'return':225 'revert':592,615,631 'review':1033 'right':237 'rpc':156,163,658 'run':149,855,872,875,879,883 'runs-on':854 'safeti':1043 'scope':60,1014 'script':929 'scripts/test-contract.sh':926 'sender':310 'set':97,145,235 'setup':125,206,466 'show':802 'skill':40,89,1006 'skill-web3-testing' 'slate':633 'smart':9,19,27,48,95 'snapshot':590,608 'snapshotid':600,604,616 'solid':139,142,431,438 'solidity-coverag':138 'source-sickn33' 'spdx':433 'spdx-license-identifi':432 'specif':1028 'state':596,623,630 'std':443 'step':77,860 'stmts':804 'stop':1034 'strategi':7,25,911 'substitut':1024 'success':1046 'suit':101 'suppli':256 'swap':679 'symbol':585 'task':43,1010 'test':3,6,16,21,24,34,50,93,100,105,114,116,124,183,205,369,393,429,450,521,541,559,567,588,618,626,640,684,728,847,853,882,902,905,910,921,928,933,942,958,965,985,995,999,1030 'testcannottransfertozeroaddress':509 'testdealandprank':545 'testfailtransferinsufficientbal':499 'testforkmainnet':569 'testfuzztransf':523 'testinitialsuppli':474 'testtransf':482 'time':196,367,375,386,395 'time-bas':366 'time-depend':394 'time-lock':374 'time.increase':391 'to.be.lessthan':426,790 'to.be.revertedwith':336 'to.changetokenbalances':300 'to.emit':358 'to.equal':250,275 'token':200,217,220,222,226,242,262,283,289,301,315,319,347,359,381,410,451,452,470,472,717 'token.balanceof':270,327,490,494,538 'token.connect':331 'token.deploy':224 'token.owner':249 'token.totalsupply':274,477,496,531 'token.transfer':297,355,417,486,503,516,534 'tokentest':448 'tool':57 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'total':255 'transact':278 'transfer':282,333,342,360,722 'treat':1019 'true':148,170 'tx':415 'tx.wait':423 'tx1':765 'tx1.wait':771 'tx2':773 'tx2.wait':779 'ubuntu':858 'ubuntu-latest':857 'uint256':524 'unauthor':966 'uniswap':681,687 'uniswaprout':643,667 'unit':92,182 'unoptim':785 'unoptimizedcontract':755 'unrel':45 'upload':888 'url':154,157,161,164,659 'usag':741 'usd':172 'usdc':645 'use':11,29,38,87,404,714,861,864,892,976,991,1004 'user1':458,487,491,502,535,539,552,558 'user1.balance':562 'user2':462,504 'v2':863,866,894 'valid':73,1029 'verif':79,814,914 'verifi':119,816,821,822,834,948,971 'version':143,870 'via':830 'vm.assume':527 'vm.createselectfork':571 'vm.deal':551 'vm.expectrevert':513 'vm.prank':468,484,501,511,532,557 'vulner':961 'web3':2,18,47 'web3-testing':1 'whale':695,710,715,721 'whaleaddress':700,708,713 'witharg':361 'write':91 'yaml':844","prices":[{"id":"2a00d498-9d26-4985-9228-5b917732d4fd","listingId":"5b8cc710-3855-47c5-bd01-797f1b6fa260","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:47:26.699Z"}],"sources":[{"listingId":"5b8cc710-3855-47c5-bd01-797f1b6fa260","source":"github","sourceId":"sickn33/antigravity-awesome-skills/web3-testing","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/web3-testing","isPrimary":false,"firstSeenAt":"2026-04-18T21:47:26.699Z","lastSeenAt":"2026-04-22T00:51:57.978Z"}],"details":{"listingId":"5b8cc710-3855-47c5-bd01-797f1b6fa260","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"web3-testing","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34404,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-21T16:43:40Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"51cecf67846e7bc208794950042ebb6bedd122c6","skill_md_path":"skills/web3-testing/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/web3-testing"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"web3-testing","description":"Master comprehensive testing strategies for smart contracts using Hardhat, Foundry, and advanced testing patterns."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/web3-testing"},"updatedAt":"2026-04-22T00:51:57.978Z"}}