← Semua pembelajaran / Blockchain Nol → RWA
Fase 1 · Solidity & Smart Contract

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.

Sumber asli hardhat.org Resmi Rangkuman ~7 menit baca

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

RemixHardhatFoundry
InstalasiTidak ada — buka browsernpm installcurl installer, biner Rust
Bahasa tes—JavaScript/TypeScript (Mocha/Chai)Solidity
Kecepatan test suite besar—SedangSangat cepat (native, paralel)
Fuzzing bawaanTidakPerlu plugin tambahanBawaan
Paling cocok untukBelajar, prototipe cepatTim yang stack-nya sudah JS/TS penuhTesting 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.