👋 Intro
So, you’ve deployed your first smart contract on Arbitrum Sepolia.
Congrats! 🎉
Now what?
It’s time to build a simple frontend — no React, no Vue, just HTML + TailwindCSS + JavaScript — that talks directly to your contract.
By the end of this guide, you’ll have a working Web3 guestbook users can interact with on Arbitrum testnet.
🧩 Tools We’ll Use
- HTML for structure
- TailwindCSS for styling
- JavaScript + ethers.js for connecting to the contract
- MetaMask for signing transactions
- Your deployed contract on Arbitrum Sepolia
🎯 What We’re Building
A simple UI with:
- A form to submit name + message
- A list of all messages from the blockchain
- Live updates on-chain using your smart contract
📁 Project Setup
Create a file called index.html and paste the following code:
📜 JavaScript: app.js
Create a file named app.js and paste the code below.
💡 Replace YOUR_CONTRACT_ADDRESS and YOUR_ABI_HERE with your deployed contract’s address and ABI.
const contractAddress = "0x419464a323f6E4A17f1199Ea8f18fdc935582782";
const contractABI = [
insert ABI here
];
let provider, signer, guestbook;
async function init() {
if (window.ethereum) {
provider = new ethers.BrowserProvider(window.ethereum);
signer = await provider.getSigner();
guestbook = new ethers.Contract(contractAddress, contractABI, signer);
loadEntries();
} else {
alert("Please install MetaMask!");
}
}
async function loadEntries() {
const entries = await guestbook.getAllEntries();
const container = document.getElementById("entries");
container.innerHTML = "";
entries.slice().reverse().forEach(entry => {
const div = document.createElement("div");
div.className = "bg-gray-800 p-4 rounded shadow";
div.innerHTML = `
<p class="font-semibold">${entry.name}</p>
<p>${entry.message}</p>
<small class="text-gray-400">${new Date(entry.timestamp * 1000).toLocaleString()}</small>
`;
container.appendChild(div);
});
}
document.getElementById("guestbookForm").addEventListener("submit", async (e) => {
e.preventDefault();
const name = document.getElementById("name").value;
const message = document.getElementById("message").value;
try {
const tx = await guestbook.sign(name, message);
await tx.wait();
document.getElementById("name").value = "";
document.getElementById("message").value = "";
loadEntries();
} catch (err) {
alert("Error: " + err.message);
}
});
init();
Project UI - Sign In your Wallet
Confirm Transaction
Deployed to Testnet
check out the deployed message
🔍 Test It Live
- Host your files on Vercel, Netlify, or GitHub Pages
- Open the site in browser
- Connect MetaMask (Arbitrum Sepolia)
- Sign your first message 🚀
Top comments (0)