Menguasai toolchain profesional Hardhat dan Foundry: struktur proyek, task, menulis deployment script, interaksi cepat dengan kontrak, dan workflow lengkap membangun proyek dari nol sampai deploy

Setelah di episode 5 kalian menguasai pola desain kontrak, pada episode ini kita memperkuat alat kerjanya: Hardhat dan Foundry. Dua toolchain ini adalah standar industri — Hardhat berbasis Node.js dengan ekosistem plugin yang luas, Foundry berbasis Rust dengan kecepatan eksekusi yang luar biasa. Menguasai keduanya memberi kalian fleksibilitas penuh dalam tim mana pun.
Episode ini membangun proyek lengkap: struktur, deployment script, interaksi, dan workflow yang bisa kalian jadikan template untuk proyek berikutnya.
Struktur proyek Hardhat standar:
my-project/
├── contracts/ # kode Solidity
├── scripts/ # deployment & automation
├── test/ # unit test
├── hardhat.config.js # konfigurasi compiler, jaringan, plugin
└── package.jsonMulai proyek dan instal plugin:
mkdir hardhat-lab && cd hardhat-lab
npm init -y
npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox
npx hardhat init --yeshardhat-toolbox menggabungkan plugin testing (chai), coverage, gas reporter, verifikasi Etherscan, dan network helpers dalam satu paket — hemat waktu setup.
Foundry menyediakan perintah inti: forge (build/test/deploy), cast (interaksi chain), dan anvil (local node). Inisialisasi proyek:
mkdir foundry-lab && cd foundry-lab
forge init
forge buildStruktur Foundry hampir sama dengan Hardhat: src/ untuk kontrak, test/ untuk test, script/ untuk deployment. Perbedaan terbesar ada di kecepatan dan workflow test (kita bedah di episode 7).
Note
Pilih berdasarkan kebutuhan: Hardhat unggul saat kalian butuh plugin ekosistem dan bahasa JavaScript di seluruh stack; Foundry unggul untuk test fuzz, kecepatan, dan kontrol alur yang presisi. Banyak tim production memakai keduanya sekaligus.
Deployment yang benar bukan sekadar menjalankan deploy() — ia harus verifiable, idempotent, dan menangkap alamat untuk digunakan lapisan berikutnya. Contoh Hardhat:
const hre = require("hardhat");
async function main() {
const [deployer] = await hre.ethers.getSigners();
console.log("Deploying with:", deployer.address);
const MyToken = await hre.ethers.getContractFactory("MyToken");
const token = await MyToken.deploy(1_000_000);
await token.waitForDeployment();
const address = await token.getAddress();
console.log("MyToken deployed to:", address);
// Simpan alamat untuk lapisan berikutnya
require("fs").writeFileSync("deployments/token.json", JSON.stringify({ address }));
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});Jalankan di local network (anvil / hardhat node):
npx hardhat node &
npx hardhat run scripts/deploy.js --network localhostFoundry punya pendekatan serupa dengan Forge Script:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {Script} from "forge-std/Script.sol";
import {MyToken} from "../src/MyToken.sol";
contract Deploy is Script {
function run() external {
vm.startBroadcast();
new MyToken(1_000_000);
vm.stopBroadcast();
}
}forge script script/Deploy.s.sol --rpc-url http://127.0.0.1:8545 --broadcastUntuk inspeksi dan interaksi on-chain tanpa menulis kode, cast sangat praktis:
cast call 0x<TokenAddress> "name()(string)" --rpc-url http://127.0.0.1:8545
cast send 0x<TokenAddress> "transfer(address,uint256)" 0x<Penerima> 100 \
--private-key 0x<KeyDev> --rpc-url http://127.0.0.1:8545
cast balance 0x<Penerima> --rpc-url http://127.0.0.1:8545cast call untuk membaca (gratis), cast send untuk menulis (transaksi). Kemampuan membaca ABI secara langsung dari antarmuka ini membuat debugging jauh lebih cepat.
Workflow yang dipakai tim production di 2026:
1. npx hardhat node / anvil → local chain
2. npx hardhat run scripts/deploy.js → deploy ke local
3. npx hardhat test → unit test + coverage
4. forge test --gas-report → cek biaya gas
5. deploy ke testnet (Sepolia) → uji integrasi
6. verifikasi di explorer → transparansiSemua langkah ini menargetkan satu contract yang sama — kontrak kalian harus berperilaku identik di local, testnet, dan mainnet. Perbedaan lingkungan biasanya muncul di bagian yang berhubungan dengan dunia luar (oracles, jaringan lain), yang kita bahas di episode 11 dan 16.
Inti yang harus dibawa pulang:
cast mempercepat debugging dan interaksi on-chain.Di episode 7 selanjutnya kita membahas lapisan yang membuat kontrak kalian dipercaya — testing & auditing: unit test, fuzzing, dan invariant testing dengan Foundry, plus cara membangun test suite yang komprehensif. Mari lanjut ke episode 7!