1) Deploy a mock stablecoin (ERC-20) on Sepolia
MockUSDT.sol (uses OpenZeppelin; behaves like a standard token—no spoofing)
solidityCopyEdit// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MockUSDT is ERC20, Ownable {
constructor() ERC20("Mock USDT", "mUSDT") Ownable(msg.sender) {
_mint(msg.sender, 1_000_000 * 10**decimals());
}
function mint(address to, uint256 amount) external onlyOwner {
_mint(to, amount);
}
}
Hardhat quick steps
npm init -y && npm i -D hardhat @nomicfoundation/hardhat-toolbox @openzeppelin/contracts
npx hardhat
→ “Create a JavaScript project”- Add a sepolia RPC + private key in
hardhat.config.js
. - Simple deploy script:
jsCopyEdit// scripts/deploy.js
const hre = require("hardhat");
async function main() {
const MockUSDT = await hre.ethers.getContractFactory("MockUSDT");
const musdt = await MockUSDT.deploy();
await musdt.waitForDeployment();
console.log("MockUSDT deployed to:", await musdt.getAddress());
}
main().catch((e)=>{console.error(e); process.exit(1);});
Run: npx hardhat run scripts/deploy.js --network sepolia
2) Send test transfers (no “flash”, just real testnet transfers)
jsCopyEdit// scripts/send.js
const { ethers } = require("hardhat");
const TOKEN = "0xYourDeployedToken";
const TO = "0xRecipientAddress";
const abi = [
"function transfer(address to, uint256 amount) public returns (bool)",
"function decimals() view returns (uint8)"
];
async function main() {
const [sender] = await ethers.getSigners();
const t = new ethers.Contract(TOKEN, abi, sender);
const decimals = await t.decimals();
const amount = ethers.parseUnits("1000", decimals); // 1,000 mUSDT
const tx = await t.transfer(TO, amount);
console.log("Hash:", tx.hash);
await tx.wait();
console.log("Confirmed.");
}
main().catch(console.error);
Run: npx hardhat run scripts/send.js --network sepolia
3) (Optional) Mirror on other chains
- BSC testnet: same contract, change RPC.
- Polygon Amoy / Base Sepolia: same flow.
- Tron (Nile): use TronBox/Truffle with TRC-20 equivalent, again only on testnet.
4) Build a simple demo UI (legit, transparent)
- Frontend shows: connect wallet → enter amount → send mUSDT → display real explorer link.
- Educates users, no spoofing or expiring balances.