2.5. Interaksi dengan Token di Monad Testnet
Pada bagian ini, kita akan men-deploy TokenFactory ke jaringan Monad Testnet dan berinteraksi dengan smart contract yang sudah di-deploy. Kita akan belajar cara membuat token baru, mentransfer token, dan menggunakan fungsi burning.
1. Persiapan Deployment ke Monad Testnet
Sebelum men-deploy ke Monad Testnet, ada beberapa hal yang perlu disiapkan:
1.1. Pastikan Akun Sudah Dikonfigurasi
Pastikan Anda telah mengatur private key dengan hardhat-vars:
npx hardhat vars set PRIVATE_KEY
Ingatlah untuk memasukkan private key tanpa awalan 0x.
1.2. Pastikan Ada Cukup Token MON untuk Gas Fee
Anda memerlukan token MON untuk membayar gas fee. Jika belum memiliki token MON:
- Kunjungi Monad Testnet Faucet
- Masukkan alamat wallet Anda
- Klik "Request Funds"
1.3. Verifikasi Konfigurasi Network
Pastikan konfigurasi Monad Testnet di hardhat.config.ts
sudah benar:
monadTestnet: {
url: "https://testnet-rpc.monad.xyz/",
chainId: 10143,
accounts: vars.has("PRIVATE_KEY") ? [`0x${vars.get("PRIVATE_KEY")}`] : [],
gasPrice: "auto",
}
2. Deployment TokenFactory ke Monad Testnet
Sekarang kita siap untuk men-deploy TokenFactory ke Monad Testnet.
2.1. Menjalankan Script Deployment
Jalankan perintah berikut untuk men-deploy TokenFactory:
npx hardhat run scripts/deploy-token-factory.ts --network monadTestnet
Proses ini mungkin membutuhkan waktu 15-30 detik untuk mendapatkan konfirmasi. Jika berhasil, Anda akan melihat output seperti:
Deploying TokenFactory to monadTestnet network...
Initiating deployment transaction...
Waiting for deployment transaction confirmation...
TokenFactory deployed successfully to: 0x1234567890abcdef1234567890abcdef12345678
View your contract on Monad Testnet Explorer:
https://testnet.monadexplorer.com/address/0x1234567890abcdef1234567890abcdef12345678
2.2. Menyimpan Alamat Kontrak
Catat alamat kontrak TokenFactory yang baru di-deploy (dalam contoh di atas, 0x1234567890abcdef1234567890abcdef12345678
). Anda akan membutuhkannya untuk interaksi selanjutnya.
Simpan alamat kontrak di tempat yang aman. Anda juga bisa membuat file konfigurasi sederhana atau menambahkannya sebagai variabel di hardhat-vars:
npx hardhat vars set FACTORY_ADDRESS 0x1234567890abcdef1234567890abcdef12345678
2.3. Memeriksa Deployment di Explorer
Kunjungi Monad Testnet Explorer untuk memeriksa kontrak yang telah di-deploy:
- Buka link yang diberikan di output deployment
- Periksa bahwa kontrak telah berhasil di-deploy dan siap untuk digunakan
3. Membuat Token Baru Menggunakan TokenFactory
Setelah TokenFactory berhasil di-deploy, kita dapat menggunakannya untuk membuat token ERC20 baru.
3.1. Mengupdate Alamat Factory di Script
Edit file scripts/create-new-token.ts
dan ganti FACTORY_ADDRESS
dengan alamat TokenFactory yang sebenarnya:
// Alamat contract TokenFactory yang sudah di-deploy
// GANTI DENGAN ALAMAT HASIL DEPLOYMENT ANDA!
const FACTORY_ADDRESS = "0x1234567890abcdef1234567890abcdef12345678";
Anda juga dapat menyesuaikan parameter token sesuai keinginan:
// Parameter untuk token baru
const TOKEN_NAME = "Monad Test Token";
const TOKEN_SYMBOL = "MTT";
const INITIAL_SUPPLY = 1000000; // 1 juta token
3.2. Menjalankan Script Pembuatan Token
Jalankan script untuk membuat token baru:
npx hardhat run scripts/create-new-token.ts --network monadTestnet
Jika berhasil, Anda akan melihat output seperti:
Creating token as owner: 0xYourAddress...
Token details:
- Name: Monad Test Token
- Symbol: MTT
- Initial Supply: 1,000,000 tokens
Creating new token via TokenFactory at 0x1234567890abcdef1234567890abcdef12345678...
Transaction sent, waiting for confirmation...
Token created successfully!
New token address: 0xabcdef1234567890abcdef1234567890abcdef12
View the token on Monad Testnet Explorer:
https://testnet.monadexplorer.com/address/0xabcdef1234567890abcdef1234567890abcdef12
Total tokens created by this factory: 1
3.3. Memeriksa Token di Explorer
Kunjungi alamat token baru di Monad Explorer untuk memverifikasi:
- Informasi dasar token (nama, simbol)
- Total supply
- Balance pemilik
3.4. Menambahkan Token ke MetaMask
Anda juga dapat menambahkan token yang baru dibuat ke MetaMask untuk melihat balance:
- Buka MetaMask dan pastikan Anda berada di jaringan Monad Testnet
- Klik "Import tokens" di bagian bawah
- Masukkan alamat token yang baru dibuat
- MetaMask akan otomatis mendeteksi nama dan simbol token
- Klik "Import"
4. Berinteraksi dengan Token ERC20
Setelah token berhasil dibuat, mari berinteraksi dengannya menggunakan script.
4.1. Membuat Script Interaksi dengan Token
Buat file baru bernama scripts/interact-token.ts
:
// Script untuk berinteraksi dengan token ERC20 yang dibuat
import { ethers } from "hardhat";
import { Token } from "../typechain-types";
// Alamat token ERC20 yang sudah di-deploy
// GANTI DENGAN ALAMAT TOKEN ANDA!
const TOKEN_ADDRESS = "0x58D07200a634D8927ab6DB17981e354fC90275e0";
async function main() {
try {
// Dapatkan signers
const signers = await ethers.getSigners();
if (signers.length === 0) {
throw new Error("No signers available");
}
const owner = signers[0];
const ownerAddress = await owner.getAddress();
console.log(`Using owner address: ${ownerAddress}`);
console.log(`Interacting with token at ${TOKEN_ADDRESS}`);
// Connect ke Token contract
const Token = await ethers.getContractFactory("Token");
const token = await Token.attach(TOKEN_ADDRESS) as Token;
// Dapatkan informasi token
const name = await token.name();
const symbol = await token.symbol();
const decimals = await token.decimals();
const totalSupply = await token.totalSupply();
console.log("\nToken Information:");
console.log(`- Name: ${name}`);
console.log(`- Symbol: ${symbol}`);
console.log(`- Decimals: ${decimals}`);
console.log(`- Total Supply: ${ethers.formatUnits(totalSupply, decimals)} ${symbol}`);
// Cek balance owner
const ownerBalance = await token.balanceOf(ownerAddress);
console.log(`\nBalance of ${ownerAddress}: ${ethers.formatUnits(ownerBalance, decimals)} ${symbol}`);
// Menguji fungsi pembakaran token (hanya owner)
const burnAmount = 500;
// Verifikasi jika kita memiliki cukup token untuk dibakar
if (ownerBalance >= ethers.parseUnits(burnAmount.toString(), decimals)) {
console.log(`\nBurning ${burnAmount} tokens...`);
const burnTx = await token.burnToken(burnAmount);
await burnTx.wait();
// Cek total supply dan balance setelah pembakaran
const newTotalSupply = await token.totalSupply();
const finalOwnerBalance = await token.balanceOf(ownerAddress);
console.log("\nAfter burning:");
console.log(`- Total Supply: ${ethers.formatUnits(newTotalSupply, decimals)} ${symbol}`);
console.log(`- Owner Balance: ${ethers.formatUnits(finalOwnerBalance, decimals)} ${symbol}`);
} else {
console.log(`\nInsufficient balance for burning ${burnAmount} tokens.`);
console.log(`Current balance: ${ethers.formatUnits(ownerBalance, decimals)} ${symbol}`);
}
} catch (error) {
console.error("Error interacting with token:");
console.error(error);
process.exitCode = 1;
}
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
4.2. Menjalankan Script Interaksi
Jalankan script interaksi:
npx hardhat run scripts/interact-token.ts --network monadTestnet
Output akan menampilkan informasi tentang token, transfer, dan burning:
Interacting with token at 0xabcdef1234567890abcdef1234567890abcdef12
Token Information:
- Name: Monad Test Token
- Symbol: MTT
- Decimals: 18
- Total Supply: 1000000 MTT
Balance of 0xYourAddress...: 1000000 MTT
Transferring 1000 MTT to 0xRecipientAddress...
Transaction sent, waiting for confirmation...
Balances after transfer:
- Owner: 999000 MTT
- Recipient: 1000 MTT
Burning 500 tokens...
Transaction sent, waiting for confirmation...
After burning:
- Total Supply: 998500 MTT
- Owner Balance: 998500 MTT
4.3. Penjelasan Interaksi
Mari kita lihat apa yang terjadi dalam script interaksi:
-
Mendapatkan Informasi Token:
- Mendapatkan nama, simbol, dan jumlah desimal
- Mendapatkan total supply token
-
Transfer Token:
- Mentransfer 1000 token ke alamat penerima
- Memeriksa balance setelah transfer
-
Burning Token:
- Membakar 500 token dari akun owner
- Memeriksa total supply dan balance setelah pembakaran
4.4. Memverifikasi Transaksi di Explorer
Untuk setiap transaksi, Anda dapat memeriksa detailnya di Monad Testnet Explorer:
- Lihat hash transaksi di output
- Kunjungi
https://testnet.monadexplorer.com/tx/{transaction-hash}
- Lihat detail transaksi, seperti jumlah gas yang digunakan, status, dan events yang dipancarkan
5. Verifikasi Kontrak pada Explorer (Opsional)
Verifikasi kontrak memungkinkan orang lain melihat kode sumber kontrak Anda di explorer. Ini meningkatkan transparansi dan memungkinkan interaksi langsung dengan kontrak melalui explorer.
5.1. Persiapan Verifikasi
Untuk verifikasi kontrak, kita perlu menginstal plugin tambahan:
npm install --save-dev @nomicfoundation/hardhat-verify
Pastikan plugin sudah ditambahkan di hardhat.config.ts
:
import "@nomicfoundation/hardhat-verify";
5.2. Konfigurasi API Key (Jika Diperlukan)
Beberapa explorer memerlukan API key untuk verifikasi. Tambahkan ke konfigurasi Hardhat jika diperlukan:
etherscan: {
apiKey: {
monadTestnet: "YOUR_API_KEY_HERE"
},
customChains: [
{
network: "monadTestnet",
chainId: 10143,
urls: {
apiURL: "https://testnet.monadexplorer.com/api",
browserURL: "https://testnet.monadexplorer.com"
}
}
]
}
Saat dokumentasi ini ditulis, Monad Testnet Explorer mungkin belum mendukung verifikasi kontrak melalui API. Jika fitur ini sudah tersedia, ikuti dokumentasi resmi Monad untuk mendapatkan API key dan konfigurasi yang tepat.
5.3. Menjalankan Verifikasi
Jika verifikasi kontrak didukung, Anda dapat menjalankan:
npx hardhat verify --network monadTestnet FACTORY_ADDRESS
Untuk token yang dibuat oleh factory:
npx hardhat verify --network monadTestnet addressTokenErc20 addressOwnerToken initialSupply tokenName tokenSymbol
Jika verifikasi berhasil, Anda akan melihat pesan sukses dan link ke kontrak yang terverifikasi di explorer.
6. Berinteraksi dengan Token melalui MetaMask
Selain menggunakan script, Anda juga dapat berinteraksi dengan token menggunakan MetaMask:
6.1. Transfer Token
- Buka MetaMask dan pilih token yang telah diimpor
- Klik "Send"
- Masukkan alamat penerima dan jumlah token
- Konfirmasi transaksi dan bayar gas fee
6.2. Berinteraksi dengan Kontrak melalui Explorer (Jika Terverifikasi)
Jika kontrak telah diverifikasi, Anda dapat berinteraksi dengannya melalui explorer:
- Kunjungi alamat kontrak di explorer
- Cari tab "Contract" atau "Read Contract"/"Write Contract"
- Connect wallet Anda
- Panggil fungsi kontrak seperti
burnToken
7. Tips dan Pemecahan Masalah
7.1. Gas Fee
- Jika transaksi gagal dengan error "gas insufficient", coba tingkatkan gas limit:
const tx = await token.transfer(recipient, amount, {
gasLimit: 100000
});
7.2. Nonce too high
Jika muncul error "nonce too high", reset akun Monad Testnet di MetaMask:
- Buka MetaMask > Settings > Advanced
- Scroll ke bawah dan klik "Reset Account"
7.3. Estimasi Gas
Untuk estimasi gas sebelum mengirim transaksi:
const estimatedGas = await token.estimateGas.transfer(recipient, amount);
console.log(`Estimated gas: ${estimatedGas}`);
7.4. Caching Nonce
Untuk transaksi berurutan, lindungi dari error nonce dengan tracking manual:
let nonce = await ethers.provider.getTransactionCount(ownerAddress);
const tx1 = await token.transfer(recipient1, amount1, { nonce: nonce++ });
const tx2 = await token.transfer(recipient2, amount2, { nonce: nonce++ });
Kesimpulan
Selamat! Anda telah berhasil:
- Men-deploy TokenFactory ke Monad Testnet
- Membuat token ERC20 baru menggunakan TokenFactory
- Berinteraksi dengan token melalui script (transfer, burning)
- Mempelajari cara memverifikasi kontrak di explorer (jika didukung)
- Mengimpor dan berinteraksi dengan token melalui MetaMask
Pengalaman ini memberikan Anda fondasi yang kuat untuk mengembangkan dan berinteraksi dengan smart contract di jaringan Monad. Pada bagian selanjutnya, kita akan membahas cara mengembangkan frontend untuk TokenFactory dan menghubungkannya dengan Monad Testnet.