AgentSkillsCN

solidity-patterns

为 Solidity 0.8.x 智能合约提供代码生成模式与模板(事件、错误、修饰符、访问控制、检查-效果-交互)。适用于用户提及 Solidity、智能合约、ERC20/ERC721,或要求 Solidity 模板或模式时使用。

SKILL.md
--- frontmatter
name: solidity-patterns
description: Provide code generation patterns and templates for Solidity 0.8.x smart contracts (events, errors, modifiers, access control, checks-effects-interactions). Use when the user mentions Solidity, smart contracts, ERC20/ERC721, or asks for Solidity templates or patterns.

Solidity Patterns

Quick start

  1. Default to Solidity 0.8.x.
  2. Use custom errors and events for clarity and gas efficiency.
  3. Follow checks-effects-interactions and prefer pull payments.
  4. Keep state variables private and expose explicit getters.
  5. Return file paths plus minimal templates.

Templates

Basic contract

solidity
pragma solidity ^0.8.20;

contract Counter {
  uint256 private value;

  event ValueChanged(uint256 value);

  function get() external view returns (uint256) {
    return value;
  }

  function increment() external {
    value += 1;
    emit ValueChanged(value);
  }
}

Ownership modifier (no external deps)

solidity
pragma solidity ^0.8.20;

error NotOwner();

contract OwnableSimple {
  address private owner;

  modifier onlyOwner() {
    if (msg.sender != owner) revert NotOwner();
    _;
  }

  constructor() {
    owner = msg.sender;
  }
}

Pull payment pattern

solidity
pragma solidity ^0.8.20;

error NotEnoughBalance();
error TransferFailed();

contract PullPayments {
  mapping(address => uint256) private balances;

  function deposit() external payable {
    balances[msg.sender] += msg.value;
  }

  function withdraw(uint256 amount) external {
    uint256 bal = balances[msg.sender];
    if (bal < amount) revert NotEnoughBalance();

    // effects
    balances[msg.sender] = bal - amount;

    // interactions
    (bool ok, ) = msg.sender.call{ value: amount }("");
    if (!ok) revert TransferFailed();
  }
}

Reentrancy guard (simple)

solidity
pragma solidity ^0.8.20;

error Reentrancy();

abstract contract ReentrancyGuard {
  uint256 private locked = 1;

  modifier nonReentrant() {
    if (locked != 1) revert Reentrancy();
    locked = 2;
    _;
    locked = 1;
  }
}

Notes

  • Prefer OpenZeppelin for standard tokens and access control in production.
  • Emit events for state changes that external systems must observe.