פיתוח טוקן ERC-20 במפתח מלא: יצירה, ביקורת, אימות

מחפשים דרך אמינה להנפיק מטבע ERC-20 משלכם, אך חוששים משגיאות בחוזה חכם שעלולות לגרום לחוסר תאימות ל-DeFi או לפרצות אבטחה? הצוות שלנו בונה מטבעות turnkey המבוססים על תקנים מוכחים, מבצע ביקורות (audits) ומסייע באימות ב-Etherscan. אנו מטפלים בכל המחזור—מהרעיון ועד לתמיכה שוטפת—ומבטיחים את האבטחה והמדרגיות של הפתרון שלכם.

שירותי פיתוח בלוקצ'יין

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1481
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1335
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1034
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1293
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    738
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1031

ERC-20 הוא ממשק, לא יישום. שש פונקציות חובה (totalSupply, balanceOf, transfer, transferFrom, approve, allowance) ושני אירועים (Transfer, Approval). כל השאר הם פרטי יישום שחשובים. הניסיון שלנו — מעל 50 טוקני ERC-20 שהושקו לייצור — מראה שפרטים אלה קובעים אם הטוקן יהיה תואם לפרוטוקולי DeFi או ידרוש שכתוב.

באיזו גישה לפיתוח טוקן ERC-20 לבחור?

הדילמה הראשונה — ניתן לשדרוג (Proxy + Implementation) או בלתי ניתן לשינוי. Proxy מספק גמישות לשינויים, אך כל עסקה דרך delegatecall עולה כ-150,000 גז לעומת 45,000 לחוזה רגיל. חוזים בלתי ניתנים לשינוי זולים פי שלושה למשתמשים ופשוטים יותר לבדיקה. המלצה: לטוקני utility ו-governance — בלתי ניתנים לשינוי; ל-DeFi vaults ופרוטוקולים מורכבים — ניתנים לשדרוג בזהירות.

הנושא השני — שליטה ב-minting. אם ה-minter הוא EOA, זהו סיכון ריכוזיות: המפתח עלול לדלוף או שהבעלים יוכל להנפיק כמות בלתי מוגבלת. פתרון — השתמשו ב-multisig או בחוזה חכם עם תפקיד MINTER. הפרויקטים שלנו תמיד משתמשים ב-AccessControl לניהול מבוזר.

השלישי — אופטימיזציית גז. אי שימוש ב-ERC20Permit (EIP-2612) מאלץ את המשתמש לבזבז שתי עסקאות במקום אחת עבור האינטראקציה הראשונה עם DeFi.

למה להשתמש ב-OpenZeppelin במקום לכתוב מאפס?

OpenZeppelin הוא התקן התעשייתי. הקוד שלהם עבר מאות בדיקות, בשימוש במיליוני חוזים. אל תכתבו ERC-20 מאפס — זה מגדיל את הסיכון לשגיאות ומפחית את אמון האינטגרטורים. הפתרונות שלנו מבוססים על OpenZeppelin עם מודולים מותאמים נוספים.

יישום בסיסי

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
import "@openzeppelin/contracts/access/Ownable2Step.sol";

contract MyToken is ERC20, ERC20Burnable, ERC20Permit, Ownable2Step {
    uint256 public constant MAX_SUPPLY = 100_000_000 * 10**18; // 100M токенов

    constructor(
        address initialOwner,
        address treasury
    ) ERC20("My Token", "MTK") ERC20Permit("My Token") Ownable2Step() {
        _transferOwnership(initialOwner);
        _mint(treasury, MAX_SUPPLY); // весь supply при деплое
    }
}

// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; import "@openzeppelin/contracts/access/Ownable2Step.sol"; contract MyToken is ERC20, ERC20Burnable, ERC20Permit, Ownable2Step { uint256 public constant MAX_SUPPLY = 100_000_000 * 10**18; // 100M токенов constructor( address initialOwner, address treasury ) ERC20("My Token", "MTK") ERC20Permit("My Token") Ownable2Step() { _transferOwnership(initialOwner); _mint(treasury, MAX_SUPPLY); // весь supply при деплое } } הוא הרחבה חשובה: הוא מאפשר אישור דרך חתימות off-chain. זה משפר את חוויית המשתמש (עסקה אחת במקום שתיים) ומפחית גז למשתמש. ERC20Permit במקום Ownable2Step מגן מפני העברת שליטה בטעות לכתובת שגויה.

טוקן Mintable עם בקרת גישה

אם הטוקן צריך להיות מונפק לאחר הפריסה, השתמשו ב-AccessControl:

import "@openzeppelin/contracts/access/AccessControl.sol";

contract MintableToken is ERC20, ERC20Burnable, ERC20Permit, AccessControl {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    uint256 public immutable maxSupply;

    constructor(
        string memory name,
        string memory symbol,
        uint256 _maxSupply,
        address admin
    ) ERC20(name, symbol) ERC20Permit(name) {
        maxSupply = _maxSupply;
        _grantRole(DEFAULT_ADMIN_ROLE, admin);
        _grantRole(MINTER_ROLE, admin);
    }

    function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) {
        require(totalSupply() + amount <= maxSupply, "Exceeds max supply");
        _mint(to, amount);
    }
}

יש להקצות את MINTER_ROLE לחוזה חכם (תגמולי staking, vesting), לא ל-EOA.

השוואת גישות

קריטריון חוזה בלתי ניתן לשינוי Proxy ניתן לשדרוג
גז (לעסקה) ~45,000 גז ~150,000 גז (בגלל delegatecall)
גמישות אין שינויים לוגיקה ניתנת לשדרוג
סיכון רק שגיאות לוגיות שגיאות Proxy, התנגשויות אחסון
בדיקה פשוטה יותר מורכבת יותר (שני חוזים)
המלצה Utility, governance DeFi vaults, פרוטוקולים מורכבים

למה decimals צריכים להיות 18 (בדרך כלל)

כברירת מחדל, decimals = 18 (כמו ETH). יוצא דופן: USDC/USDT משתמשים ב-6. אם יוצרים stablecoin או wrap — בדקו את ה-decimals של המקור. לעולם אל תשתמשו ב-0 decimals לטוקנים שיסחרו ב-DEX — AMM עובד גרוע עם מספרים שלמים. נתקלנו בפרויקטים שבהם decimals שגויים גרמו לבעיות תאימות עם פרוטוקולים.

שגיאות נפוצות

מס העברה: כל העברה לוקחת אחוז — שובר פרוטוקולי DeFi. אם עדיין צריך, השתמשו ב-whitelist לחוזי Uniswap, Aave, Compound. רשימה שחורה ריכוזית ללא timelock: רע לטוקנים קהילתיים. Reentrancy ב-transfer hooks: אם מוסיפים Ownable או import "@openzeppelin/contracts/access/AccessControl.sol"; contract MintableToken is ERC20, ERC20Burnable, ERC20Permit, AccessControl { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); uint256 public immutable maxSupply; constructor( string memory name, string memory symbol, uint256 _maxSupply, address admin ) ERC20(name, symbol) ERC20Permit(name) { maxSupply = _maxSupply; _grantRole(DEFAULT_ADMIN_ROLE, admin); _grantRole(MINTER_ROLE, admin); } function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) { require(totalSupply() + amount <= maxSupply, "Exceeds max supply"); _mint(to, amount); } } , ודאו שאינכם קוראים לקוד חיצוני.

שלבי עבודה

שלב משך תוצאה
אנליטיקה 1-2 ימים מפרט טוקן, בחירת ארכיטקטורה
יישום 2-5 ימים חוזה חכם, בדיקות, סקריפטים לפריסה
בדיקה 1-3 שבועות דוח פגיעויות, תיקונים
פריסה ואימות יום אחד חוזה על השרשרת, מאומת ב-Etherscan
תמיכה חודש אחד תיקונים חינם לאחר ההשקה

אימות ופריסה

# Тесты
forge test -vvv

# Деплой с верификацией
forge script script/Deploy.s.sol \
  --rpc-url $RPC_URL \
  --private-key $PRIVATE_KEY \
  --broadcast \
  --verify \
  --etherscan-api-key $ETHERSCAN_KEY

לאחר הפריסה — אמתו את החוזה ב-Etherscan/Polygonscan. טוקן לא מאומת מעלה חשד לגיטימי מצד בורסות ומשתמשים.

מה כלול בפיתוח טוקן ERC-20 מפתח

  • חוזה חכם ב-Solidity עם פונקציות מותאמות (mint, burn, permit, pause, blacklist)
  • בדיקות יחידה (Foundry/Hardhat) עם כיסוי >90%
  • סקריפטים לפריסה מוגדרים לרשת שלך (Ethereum, Polygon, Arbitrum, BNB Chain)
  • אימות בסייר בלוקצ'יין (Etherscan, Polygonscan)
  • תיעוד למפתחים ולמשתמשים
  • ייעוץ לשילוב פרוטוקולי DeFi
  • אחריות — חודש אחד של תיקונים חינם לאחר ההשקה

נעריך את הפרויקט שלך תוך יום עסקים אחד. אנחנו צוות של מפתחי בלוקצ'יין בכירים: 5+ שנים בשוק, 50+ טוקנים שנמסרו. צרו קשר כדי לדון בפרטים ולהזמין פיתוח טוקן ERC-20 מפתח.