Common Solidity design patterns and implementations for secure smart contract development. Use when implementing standard functionality like access control, upgradeability, or token standards.
This skill inherits all available tools. When active, it can use any tool Claude has access to.
examples/ERC1155-example.solexamples/ERC20-example.solexamples/ERC721-example.solexamples/upgradeable-example.solpatterns/access-control.mdpatterns/pausable.mdpatterns/reentrancy-guard.mdpatterns/token-standards.mdpatterns/upgradeable-contracts.mdThis skill provides battle-tested patterns and examples for common smart contract functionality.
Use this skill when:
See ./patterns/access-control.md for detailed documentation.
Common patterns:
When to use:
See ./patterns/upgradeable-contracts.md for detailed documentation.
Common patterns:
When to use:
See ./patterns/pausable.md for detailed documentation.
Purpose: Emergency stop mechanism to pause contract functionality
When to use:
Key features:
See ./patterns/reentrancy-guard.md for detailed documentation.
Purpose: Prevent reentrancy attacks in functions that make external calls
When to use:
Implementation:
See ./patterns/token-standards.md for detailed documentation.
ERC20 - Fungible tokens
./examples/ERC20-example.solERC721 - Non-fungible tokens (NFTs)
./examples/ERC721-example.solERC1155 - Multi-token standard
./examples/ERC1155-example.solThese patterns follow the code-principles from the foundation plugin:
Note: Solidity-specific security concerns take precedence over general software principles.
Most patterns are best implemented using OpenZeppelin contracts:
# Install OpenZeppelin
forge install OpenZeppelin/openzeppelin-contracts
# or
npm install @openzeppelin/contracts
Available contracts:
@openzeppelin/contracts/access/Ownable.sol@openzeppelin/contracts/access/AccessControl.sol@openzeppelin/contracts/security/Pausable.sol@openzeppelin/contracts/security/ReentrancyGuard.sol@openzeppelin/contracts/token/ERC20/ERC20.sol@openzeppelin/contracts/token/ERC721/ERC721.sol@openzeppelin/contracts/token/ERC1155/ERC1155.sol@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol| Need | Pattern | Complexity | Gas Cost | Security |
|---|---|---|---|---|
| Single admin | Ownable | Low | Low | Medium |
| Multiple roles | AccessControl | Medium | Medium | High |
| Emergency stop | Pausable | Low | Low | High |
| Prevent reentrancy | ReentrancyGuard | Low | Low | Critical |
| Fungible tokens | ERC20 | Low | Low | High |
| NFTs | ERC721 | Medium | Medium | High |
| Multi-token | ERC1155 | High | Low | High |
| Simple upgrades | UUPS | Medium | Low | High |
| Admin separation | Transparent Proxy | Medium | Medium | High |
| Multiple instances | Beacon Proxy | High | Low | High |
| Large contracts | Diamond | Very High | Medium | Medium |
contract MyContract is Pausable, AccessControl {
bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");
function pause() public onlyRole(PAUSER_ROLE) {
_pause();
}
function unpause() public onlyRole(PAUSER_ROLE) {
_unpause();
}
function criticalFunction() public whenNotPaused {
// Function logic
}
}
contract MyToken is ERC20, Ownable, Pausable {
constructor() ERC20("MyToken", "MTK") Ownable(msg.sender) {}
function pause() public onlyOwner {
_pause();
}
function _update(address from, address to, uint256 value)
internal
override
whenNotPaused
{
super._update(from, to, value);
}
}
contract MyUpgradeableContract is
UUPSUpgradeable,
AccessControlUpgradeable,
ReentrancyGuardUpgradeable
{
bytes32 public constant UPGRADER_ROLE = keccak256("UPGRADER_ROLE");
function _authorizeUpgrade(address newImplementation)
internal
override
onlyRole(UPGRADER_ROLE)
{}
}
This skill provides the following pattern documentation:
./patterns/upgradeable-contracts.md - Proxy patterns./patterns/access-control.md - Permission patterns./patterns/pausable.md - Emergency stop pattern./patterns/reentrancy-guard.md - Reentrancy protection./patterns/token-standards.md - ERC20/721/1155 standardsThis skill provides the following examples:
./examples/ERC20-example.sol - Fungible token implementation./examples/ERC721-example.sol - NFT implementation./examples/ERC1155-example.sol - Multi-token implementation./examples/upgradeable-example.sol - UUPS upgradeable contract// Access Control
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
// Security
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
// Tokens
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
// Upgradeability
import "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
Remember: Always prefer battle-tested OpenZeppelin implementations over custom patterns. Security > Gas optimization > Code elegance.