Tooling — Remix, Hardhat & Foundry
Sama seperti backend punya banyak framework untuk urusan yang mirip, dunia Solidity punya tiga alat yang saling melengkapi, bukan saling menggantikan. Kamu akan memakai ketiganya di titik yang berbeda.
Intisari
- Remix: IDE berbasis browser, nol instalasi — paling cocok untuk belajar dan prototipe cepat, seperti yang sudah kamu pakai sejak Fase 0.
- Hardhat: berbasis Node.js/TypeScript, ekosistem plugin luas, cocok untuk tim yang tooling-nya sudah JS/TS (frontend + backend integration test dalam satu bahasa).
- Foundry: ditulis dalam Rust, tes ditulis dalam Solidity itu sendiri — jauh lebih cepat untuk fuzzing dan suite besar, tanpa perlu Node.js sama sekali.
- Pola umum tim produksi: Foundry untuk testing/fuzzing kontrak, Hardhat untuk script deployment yang terintegrasi dengan frontend/backend JS.
- Ketiganya bisa dipakai bersamaan di satu proyek yang sama — tidak ada aturan harus pilih satu.
Peta pemakaian
| Remix | Hardhat | Foundry | |
|---|---|---|---|
| Instalasi | Tidak ada — buka browser | npm install | curl installer, biner Rust |
| Bahasa tes | — | JavaScript/TypeScript (Mocha/Chai) | Solidity |
| Kecepatan test suite besar | — | Sedang | Sangat cepat (native, paralel) |
| Fuzzing bawaan | Tidak | Perlu plugin tambahan | Bawaan |
| Paling cocok untuk | Belajar, prototipe cepat | Tim yang stack-nya sudah JS/TS penuh | Testing berat, fuzzing, CI cepat |
Hardhat: proyek Node.js seperti biasanya
mkdir proyek-token && cd proyek-token
npm init -y
npm install --save-dev hardhat
npx hardhat init # pilih "Create a TypeScript project"
npx hardhat compile
npx hardhat test
npx hardhat run scripts/deploy.ts --network sepolia
// test/GoldToken.test.ts
describe("GoldToken", () => {
it("hanya owner boleh mint", async () => {
const [owner, lain] = await ethers.getSigners();
const token = await ethers.deployContract("GoldToken");
await expect(
token.connect(lain).mintGold(lain.address, 100)
).to.be.revertedWithCustomError(token, "BukanPemilik");
});
});
Foundry: tes ditulis dalam Solidity
Perbedaan filosofis terbesar Foundry: kamu tidak perlu berpindah bahasa untuk menulis tes. Tes adalah
kontrak Solidity biasa yang mewarisi Test, dijalankan langsung oleh forge — tanpa
lapisan Node.js sama sekali.
curl -L https://foundry.paradigm.xyz | bash
foundryup
forge init proyek-token
forge build
forge test -vvv
forge script script/Deploy.s.sol --rpc-url sepolia --broadcast
// test/GoldToken.t.sol
import "forge-std/Test.sol";
import "../src/GoldToken.sol";
contract GoldTokenTest is Test {
GoldToken token;
address owner = address(this);
address lain = address(0x1);
function setUp() public {
token = new GoldToken();
}
function testHanyaOwnerBolehMint() public {
vm.prank(lain); // simulasikan pemanggil berikutnya adalah "lain"
vm.expectRevert(abi.encodeWithSelector(GoldToken.BukanPemilik.selector, lain));
token.mintGold(lain, 100, "bukti-1");
}
// Fuzzing bawaan: Foundry otomatis mencoba ratusan nilai acak untuk "jumlah"
function testFuzz_MintMenambahSaldo(uint256 jumlah) public {
vm.assume(jumlah > 0 && jumlah < 1_000_000 ether);
token.setKYCStatus(lain, true);
token.mintGold(lain, jumlah, "bukti-2");
assertEq(token.balanceOf(lain), jumlah);
}
}
Fuzzing bukan sekadar fitur nice-to-have. testFuzz_MintMenambahSaldo di atas
dijalankan Foundry ratusan kali dengan nilai jumlah yang berbeda-beda secara acak — termasuk
nilai batas seperti 0, angka sangat besar, dan angka ganjil yang jarang terpikirkan manusia saat menulis
tes manual. Untuk kontrak yang menyimpan aset sungguhan, ini sering menemukan bug yang lolos dari tes
yang ditulis tangan.
Yang OpenZeppelin dan library lain harapkan darimu
Baik Hardhat maupun Foundry punya cara masing-masing menarik dependency kontrak (OpenZeppelin, dst.) — npm
untuk Hardhat, forge install (berbasis git submodule) untuk Foundry. Materi berikutnya membahas
kenapa hampir tidak ada tim produksi yang menulis pattern access control dari nol.
Latihan: inisialisasi satu proyek Foundry (forge init), pindahkan kontrak
Sertifikat dari dua materi sebelumnya ke src/, lalu tulis satu tes Solidity yang
memverifikasi terbitkan() revert saat dipanggil bukan oleh penerbit. Jalankan
forge test -vvv dan baca trace eksekusinya baris demi baris.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.