---
name: smart-contract-security
description: "สกิลสำหรับ ความปลอดภัย Smart Contract ใช้เมื่อต้องการแนวทาง ขั้นตอน Template หรือคำแนะนำเชิงปฏิบัติสำหรับงาน Blockchain, Web3, Smart Contract, DeFi, Wallet และระบบกระจายศูนย์ ในหัวข้อนี้"
allowed-tools: Read, Grep, Glob, Bash
version: "1.0"
---

# ความปลอดภัย Smart Contract

> หลักการความปลอดภัยสำหรับ Solidity smart contracts ตาม OWASP Smart Contract Top 10

---

## Critical Vulnerabilities

### 1. Reentrancy
```solidity
// ❌ Vulnerable
function withdraw(uint amount) external {
    require(balances[msg.sender] >= amount);
    (bool ok,) = msg.sender.call{value: amount}(""); // external call ก่อน
    balances[msg.sender] -= amount;                   // state update ทีหลัง
}

// ✅ Checks-Effects-Interactions pattern
function withdraw(uint amount) external nonReentrant {
    require(balances[msg.sender] >= amount);
    balances[msg.sender] -= amount;                   // state update ก่อน
    (bool ok,) = msg.sender.call{value: amount}("");  // external call ทีหลัง
    require(ok, "Transfer failed");
}
```

### 2. Access Control
```solidity
// ❌ ไม่มี modifier
function setOwner(address newOwner) external {
    owner = newOwner;
}

// ✅ ใช้ OpenZeppelin Ownable หรือ Role-Based Access
import "@openzeppelin/contracts/access/Ownable.sol";
function setOwner(address newOwner) external onlyOwner {
    owner = newOwner;
}
```

### 3. Integer Overflow (pre-0.8.0)
```solidity
// ❌ Solidity < 0.8.0 — ล้น silently
uint8 x = 255;
x += 1; // x = 0 (overflow)

// ✅ ใช้ SafeMath หรือ Solidity ≥ 0.8.0
// Solidity 0.8+ reverts อัตโนมัติเมื่อ overflow
```

---

## High Severity

| Vulnerability | สัญญาณเตือน | วิธีแก้ |
|---|---|---|
| **Flash Loan Attack** | ใช้ราคาจาก single DEX | ใช้ TWAP oracle หรือ Chainlink |
| **Front-Running** | state ที่คาดเดาได้ก่อน tx confirm | commit-reveal scheme |
| **tx.origin Auth** | `require(tx.origin == owner)` | เปลี่ยนเป็น `msg.sender` |
| **Timestamp Dep.** | `block.timestamp` เป็น randomness | ใช้ Chainlink VRF |
| **Delegatecall** | storage layout ไม่ตรง | ตรวจ proxy storage slot |

---

## Secure Patterns

### Checks-Effects-Interactions (CEI)
```
1. Checks   — validate inputs, balances, permissions
2. Effects  — update contract state
3. Interactions — external calls สุดท้ายเสมอ
```

### Pull over Push
```solidity
// ❌ Push payment (DoS ถ้า recipient revert)
for (uint i = 0; i < winners.length; i++) {
    winners[i].transfer(prize);
}

// ✅ Pull payment — ผู้รับมา withdraw เอง
mapping(address => uint) public pendingWithdrawals;
function withdraw() external {
    uint amount = pendingWithdrawals[msg.sender];
    pendingWithdrawals[msg.sender] = 0;
    payable(msg.sender).transfer(amount);
}
```

### Emergency Pause
```solidity
import "@openzeppelin/contracts/security/Pausable.sol";

function pause() external onlyOwner { _pause(); }
function unpause() external onlyOwner { _unpause(); }

function deposit() external whenNotPaused { ... }
```

---

## Security Checklist ก่อน Deploy

| หัวข้อ | ตรวจสอบ |
|--------|---------|
| **Reentrancy** | ใช้ `nonReentrant` modifier ทุก external call |
| **Access Control** | ทุก privileged function มี modifier |
| **Input Validation** | ตรวจ zero address, zero amount |
| **Events** | emit event ทุก state change สำคัญ |
| **Tests** | coverage ≥ 95% ก่อน mainnet |
| **Audit** | ผ่าน external audit สำหรับ mainnet |
| **Multisig** | owner/admin ใช้ multisig ไม่ใช่ EOA เดี่ยว |
| **Timelock** | admin functions มี timelock ≥ 24h |

---

## Tools

| Tool | ใช้ทำอะไร |
|---|---|
| **Slither** | static analysis — ตรวจ pattern ทั่วไป |
| **Mythril** | symbolic execution — หา edge cases |
| **Echidna** | fuzzing — ทดสอบ invariants |
| **Hardhat** | testing + deployment framework |
| **OpenZeppelin** | battle-tested contract library |

```bash
# ความปลอดภัย Smart Contract
slither . --print human-summary

# ความปลอดภัย Smart Contract
myth analyze contracts/MyContract.sol --solv 0.8.20
```
