הגדרת Hardhat: כלים לחוזים חכמים
אנו מגדירים את Hardhat עבור פרויקטים שבהם מהירות הפיתוח ואמינות הפריסה הם קריטיים. הגדרה שגויה מובילה לשעות מבוזבזות על ניפוי באגים בבדיקות, פריסות חוזרות ונשנות, ואובדן נתונים. הניסיון שלנו מראה שהגדרה נכונה של Hardhat מאפשרת מיידית קומפילציה מצטברת, בדיקות מקבילות, ופריסה אידמפוטנטית. התוצאה: CI/CD יודע מה לעשות ללא הוראות ידניות. בפרויקט אחד, ההגדרה ארכה 3 ימים, והחיסכון בזמן על פריסות חוזרות היה 70%.
דמיינו: אתם כותבים חוזה חכם, מהדרים, פורסים לרשת בדיקות, בודקים — וחוזרים על כך עשרות פעמים ביום. כל טעות בהגדרה עולה בזמן ובכסף. הגדרות Hardhat שגויות עלולות להוביל לבאגים בחוזה, לגז גבוה ב-15-20%, ואפילו לאובדן כספים. אנו מגדירים את Hardhat כך שהפיתוח מהיר והפריסה מאובטחת.
הגדרה בסיסית
מינימום hardhat.config.ts לפרויקט ייצור:
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import "@openzeppelin/hardhat-upgrades";
import "hardhat-deploy";
import "hardhat-contract-sizer";
const config: HardhatUserConfig = {
solidity: {
version: "0.8.24",
settings: {
optimizer: {
enabled: true,
runs: 200
},
viaIR: true,
},
},
networks: {
hardhat: {
forking: {
url: process.env.ALCHEMY_MAINNET_URL!
},
chainId: 1,
},
polygon: {
url: process.env.ALCHEMY_POLYGON_URL!,
accounts: [process.env.DEPLOYER_PRIVATE_KEY!],
gasPrice: "auto",
},
},
gasReporter: {
enabled: process.env.REPORT_GAS === "true",
currency: "USD",
coinmarketcap: process.env.CMC_API_KEY,
},
};import { HardhatUserConfig } from "hardhat/config"; import "@nomicfoundation/hardhat-toolbox"; import "@openzeppelin/hardhat-upgrades"; import "hardhat-deploy"; import "hardhat-contract-sizer"; const config: HardhatUserConfig = { solidity: { version: "0.8.24", settings: { optimizer: { enabled: true, runs: 200 }, viaIR: true, }, }, networks: { hardhat: { forking: { url: process.env.ALCHEMY_MAINNET_URL! }, chainId: 1, }, polygon: { url: process.env.ALCHEMY_POLYGON_URL!, accounts: [process.env.DEPLOYER_PRIVATE_KEY!], gasPrice: "auto", }, }, gasReporter: { enabled: process.env.REPORT_GAS === "true", currency: "USD", coinmarketcap: process.env.CMC_API_KEY, }, }; חשוב לחוזים עם שגיאות "Stack too deep" — תיעוד Solidity ממליץ עליו לחוזים מורכבים. ללא מהדר ה-IR, שגיאה זו מתרחשת לעיתים קרובות, אך זמן הקומפילציה גדל ב-30-50%. אנו מוודאים שההגדרה מכסה את כל התרחישים האופייניים.
תוספים שבאמת חשובים
| תוסף | מטרה | מתי חובה |
|---|---|---|
| hardhat-deploy | ניהול פריסות: חשבונות בעלי שם, פיקסצ'רים, תיוג | כשעובדים עם מספר רשתות |
| hardhat-contract-sizer | בדיקת גודל קוד הבייטים (EIP-170) | לפני פריסה ל-mainnet |
| @nomicfoundation/hardhat-toolbox | מטא-תוסף: ethers, waffle, chai-matchers, verify | תמיד (מחליף 6 תוספים נפרדים) |
| @openzeppelin/hardhat-upgrades | UUPS/Transparent Proxy: בדיקת פריסת אחסון | כשמשתמשים בפרוקסי |
hardhat-deploy — פריסות אידמפוטנטיות עם תמיכה בחשבונות בעלי שם, פיקסצ'רים ותיוג. סקריפטי פריסה שומרים ארטיפקטים ב-viaIR: true והם אידמפוטנטיים: הרצה חוזרת אינה פורסת מחדש חוזים שכבר נפרסו. חיוני כשעובדים עם מספר רשתות.
hardhat-contract-sizer — בודק את גודל החוזה. EIP-170 מגביל את קוד הבייטים ל-24576 בתים. פגיעה במגבלה זו במפתיע בפריסה ל-mainnet היא לא נעימה. התוסף מציג את הגודל לאחר כל קומפילציה.
deployments/ — מטא-תוסף הכולל hardhat-ethers, hardhat-waffle, hardhat-chai-matchers, hardhat-network-helpers, hardhat-verify. תלות אחת במקום שש.
@nomicfoundation/hardhat-toolbox — אם הפרויקט משתמש ב-UUPS או Transparent Proxy. התוסף בודק תאימות אחסון לפני פריסת שדרוג: אם החוזה החדש מפר את פריסת האחסון, תלמדו על כך לפני אובדן נתונים ב-mainnet.
הגדרת ייצור
הגדרת ייצור שונה מהגדרת פיתוח: הפעלת אופטימיזציה עם runs: 200, פיצול (fork) של mainnet לבדיקות, הפעלת מד דלק. השתמשו ב-@openzeppelin/hardhat-upgrades לניהול פריסות — זה מקצר את זמן הפריסה החוזרת פי 5.
איך להאיץ בדיקות Hardhat?
בדיקות איטיות נגרמות לעיתים קרובות מפיקסצ'רים לא תקינים. תבנית hardhat-deploy מ-hardhat-network-helpers מאפשרת צילום מצב הרשת לאחר הפריסה וחזרה אליו לפני כל בדיקה במקום פריסה מחדש. השוואה: ללא loadFixture (פריסה מחדש) — 5 דקות ל-200 בדיקות, עם loadFixture — 30 שניות. מהיר פי 10.
async function deployTokenFixture() {
const [owner, alice, bob] = await ethers.getSigners();
const Token = await ethers.getContractFactory("MyToken");
const token = await Token.deploy(ethers.parseEther("1000000"));
return { token, owner, alice, bob };
}
it("transfers tokens", async () => {
const { token, alice } = await loadFixture(deployTokenFixture);
}); היתרונות של hardhat-deploy
תוסף זה מספק אידמפוטנטיות: הרצה חוזרת אינה יוצרת חוזים כפולים. חשבונות בעלי שם (באמצעות loadFixture) מונעים קידוד כתובות. תיוג מאפשר פריסה רק של חוזים ששונו. כתוצאה מכך, הפריסה הופכת לצפויה וניתנת לשחזור.
| קריטריון | פריסה ידנית | hardhat-deploy |
|---|---|---|
| אידמפוטנטיות | לא — כפילויות בהרצה חוזרת | כן — בטוח להריץ שוב |
| חשבונות בעלי שם | כתובות מקודדות | דרך הקונפיגורציה |
| תיוג | לא — פורסים הכל | רק חוזים ששונו |
| זמן ל-3 רשתות | ~שעתיים | ~25 דקות |
שילוב Hardhat עם CI/CD
GitHub Actions להרצת בדיקות ואימות אוטומטיים:
---
- name: Run tests
run: npx hardhat test --network hardhat
env:
ALCHEMY_MAINNET_URL: ${{ secrets.ALCHEMY_URL }}
- name: Verify contract
run: npx hardhat verify --network polygon ${{ steps.deploy.outputs.address }}
env:
POLYGONSCAN_API_KEY: ${{ secrets.POLYGONSCAN_KEY }}
---אימות ב-CI דורש שארגומנטי הקונסטרוקטור יהיו דטרמיניסטיים או יישמרו כארטיפקטים של פריסה. async function deployTokenFixture() { const [owner, alice, bob] = await ethers.getSigners(); const Token = await ethers.getContractFactory("MyToken"); const token = await Token.deploy(ethers.parseEther("1000000")); return { token, owner, alice, bob }; } it("transfers tokens", async () => { const { token, alice } = await loadFixture(deployTokenFixture); }); שומר אוטומטית ארגומנטים ב-hardhat.config.ts.
מה כלול
- הגדרת Hardhat מלאה המותאמת לפרויקט שלכם: הגדרות רשת, אופטימיזציה, תוספים.
- כתיבת סקריפטי פריסה באמצעות hardhat-deploy.
- אינטגרציית בדיקות עם loadFixture והגדרת כיסוי (coverage).
- CI/CD: הגדרת GitHub Actions לבדיקות ואימות אוטומטיים.
- תיעוד לשימוש בסביבה.
- 90 ימי תמיכה לאחר המסירה.
לוח זמנים משוער
הגדרת Hardhat לפרויקט טיפוסי אורכת בין 2 ל-5 ימים, תלוי במורכבות החוזה ובמספר הרשתות. העלות מחושבת באופן אישי לאחר הערכת היקף העבודה. אנו נעריך את הפרויקט שלכם ביום עסקים אחד — צרו קשר. קבלו ייעוץ בנושא הגדרת Hardhat.
לצוות שלנו ניסיון של 5 שנים בפיתוח Ethereum ו-L2 קשורות, ו-50+ פריסות מוצלחות ל-mainnet. מפתחים מוסמכים מבטיחים יציבות ואבטחה של ההגדרה.







