acpx-faq
Run coding agents (codex, claude, agy/Antigravity) through the acpx ACP CLI - the headless lane outside a herdr pane (no HERDR_ENV). Use before launching or…
Test admin address used in fork tests.
$ npx -y skills add tenequm/skills --skill foundry-solidity --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/foundry-solidityContext preview
The summary Claude sees to decide when to auto-load this skill.
Test admin address used in fork tests.
name: foundry-solidity
description: Build and test Solidity contracts with Foundry. Use when developing Ethereum contracts, writing Forge tests, deploying with scripts, or debugging with Cast/Anvil. Triggers on forge, cast, anvil, foundry.toml, *.t.sol, or *.s.sol.
metadata:
version: "0.2.5"
categories: "development"
topics: "solidity, foundry, forge, smart-contracts, ethereum"
openclaw:
homepage: https://github.com/tenequm/skills/tree/main/skills/foundry-solidity
emoji: "⚒️"
primaryEnv: PRIVATE_KEY
requires:
anyBins:
- forge
- cast
install:
- kind: brew
formula: foundry
bins:
- forge
- cast
- anvil
envVars:
- name: PRIVATE_KEY
required: false
description: Deployer signing key. Use throwaway/testnet keys.
- name: ETHERSCAN_API_KEY
required: false
description: Etherscan verification API key.
- name: MAINNET_RPC_URL
required: false
description: Ethereum mainnet RPC endpoint.
- name: SEPOLIA_RPC_URL
required: false
description: Sepolia testnet RPC endpoint.
- name: ARBITRUM_RPC_URL
required: false
description: Arbitrum RPC endpoint.
- name: OPTIMISM_RPC_URL
required: false
description: Optimism RPC endpoint.
- name: ARBISCAN_API_KEY
required: false
description: Arbiscan verification key.
- name: OPTIMISTIC_ETHERSCAN_API_KEY
required: false
description: Optimistic Etherscan verification key.
- name: POLYGONSCAN_API_KEY
required: false
description: Polygonscan verification key.
- name: BASESCAN_API_KEY
required: false
description: Basescan verification key.
- name: DEPLOYER_PRIVATE_KEY
required: false
description: Alternative deployer key alias.
- name: TEST_ADMIN
required: false
description: Test admin address used in fork tests.Complete guide for building secure, efficient smart contracts with **Foundry 1.5.0** and **Solidity 0.8.30**.
# Create new project forge init my-project && cd my-project # Build contracts forge build # Run tests forge test # Deploy (dry-run) forge script script/Deploy.s.sol --rpc-url sepolia # Deploy (broadcast) forge script script/Deploy.s.sol --rpc-url sepolia --broadcast --verify
my-project/
├── foundry.toml # Configuration
├── src/ # Contracts
│ └── Counter.sol
├── test/ # Tests (*.t.sol)
│ └── Counter.t.sol
├── script/ # Deploy scripts (*.s.sol)
│ └── Deploy.s.sol
└── lib/ # Dependencies
└── forge-std/forge build # Compile forge test # Run all tests forge test -vvvv # With traces forge test --match-test testDeposit # Filter by test name forge test --match-contract Vault # Filter by contract forge test --fork-url $RPC_URL # Fork testing forge test --gas-report # Gas usage report
# Single contract forge create src/Token.sol:Token --rpc-url sepolia --private-key $KEY --broadcast # Script deployment (recommended) forge script script/Deploy.s.sol:Deploy --rpc-url sepolia --broadcast --verify # Verify existing contract forge verify-contract $ADDRESS src/Token.sol:Token --chain sepolia
cast call $CONTRACT "balanceOf(address)" $USER --rpc-url mainnet cast send $CONTRACT "transfer(address,uint256)" $TO $AMOUNT --private-key $KEY cast decode-tx $TX_HASH cast storage $CONTRACT 0 --rpc-url mainnet
anvil # Start local node anvil --fork-url $RPC_URL # Fork mainnet anvil --fork-block-number 18000000
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
import {Test, console} from "forge-std/Test.sol";
import {Counter} from "../src/Counter.sol";
contract CounterTest is Test {
Counter public counter;
address public user;
function setUp() public {
counter = new Counter();
user = makeAddr("user");
deal(user, 10 ether);
}
function test_Increment() public {
counter.increment();
assertEq(counter.number(), 1);
}
function test_RevertWhen_Unauthorized() public {
vm.expectRevert("Unauthorized");
vm.prank(user);
counter.adminFunction();
}
function testFuzz_SetNumber(uint256 x) public {
x = bound(x, 0, 1000);
counter.setNumber(x);
assertEq(counter.number(), x);
}
}// Identity & ETH
address alice = makeAddr("alice"); // Create labeled address
deal(alice, 10 ether); // Give ETH
deal(address(token), alice, 1000e18); // Give ERC20
// Impersonation
vm.prank(alice); // Next call as alice
vm.startPrank(alice); // All calls as alice
vm.stopPrank();
// Time & Block
vm.warp(block.timestamp + 1 days); // Set timestamp
vm.roll(block.number + 100); // Set block number
// Assertions
vm.expectRevert("Error message"); // Expect revert
vm.expectRevert(CustomError.selector); // Custom error
vm.expectEmit(true, true, false, true); // Expect event
emit Transfer(from, to, amount); // Must match next emit
// StoClaude Code skills for founders, developers, and web3 builders. This repository publishes reusable skill folders under skills//, ships stable bundle downloads through GitHub Releases, and publishes changed skills to ClawHub.
Repo: tenequm/skills
Run coding agents (codex, claude, agy/Antigravity) through the acpx ACP CLI - the headless lane outside a herdr pane (no HERDR_ENV). Use before launching or…
Build Chrome extensions with the WXT framework and TypeScript, React, Vue, or Svelte. Use when creating browser extensions or cross-browser add-ons. Triggers…
Decision validation and thinking frameworks for founders. Use to pressure-test a decision, validate next steps, or sanity-check an approach - "should I", "help…