heteroverify.vercel.app · a Base Mini App
A single-page joke/meme site. Premium minimalist startup aesthetic, absurd copy — the humor is entirely in the contrast.
Identity verification, simplified.
A logo, a headline, a wallet address with a copy button, a Send $50 button that pays an on-chain contract on Base, and a footnote. No build step.
Plain static site — no framework, no bundler, no local dependencies. The Send button loads viem from a CDN at runtime (an ES-module import, still no build step).
index.html # markup + meta tags + inline SVG favicon
styles.css # all styling (dark, responsive, entrance animations)
script.js # wallet constant, clipboard copy, Base payment flow
contracts/
Heteroverify.sol # the payment contract deployed to Base
It runs by serving the folder. (Opening index.html from file:// works for
everything except the Send button — browsers block CDN module imports and
wallet access on file://. Use the local server below.)
python3 -m http.server 8000
# then open http://localhost:8000Opening index.html straight from disk (file://) also works — the copy
button falls back to a legacy clipboard path outside secure contexts.
The Send $50 button charges the visitor exactly 50 USDC ($50) on Base
mainnet through the Heteroverify contract,
which forwards the payment straight to owner — the contract never holds funds.
USDC uses an allowance model, so the flow is up to two wallet transactions: approve $50 (skipped if already approved), then verify (the payment). The visitor pays a few fractions of a cent in ETH for gas on Base.
Easiest path is Remix:
- Create a new file, paste in
contracts/Heteroverify.sol. - Solidity Compiler → compile (any
0.8.20+). - Deploy & Run → Environment: Injected Provider (your wallet, set to Base mainnet).
- In the constructor field, pass the address that should receive the USDC
(or
0x0to use the deploying wallet), then Deploy and confirm. - Copy the deployed contract address.
Test first on Base Sepolia. In the contract, swap the
USDCconstant to the testnet token0x036CbD53842c5426634e7929541eC2318f3dCF7e, deploy to Base Sepolia, and grab test USDC from faucet.circle.com. Revert the constant before deploying to mainnet.
Set the network + the two addresses at the top of script.js:
const CHAIN = baseSepolia; // `baseSepolia` = testnet, `base` = mainnet
const WALLET_ADDRESS = '0x...'; // shown on the page + copied; the contract's owner
const CONTRACT_ADDRESS = '0x...'; // your deployed Heteroverify addressCHAIN drives everything else — the USDC token address, chain switching, and
the block-explorer link all follow from it. To go live, flip CHAIN to base
and redeploy the contract to Base mainnet (the file's USDC constant is already
mainnet by default).
The Send button stays guarded (it refuses to fire) while either address is still
the 0x0000…0000 placeholder, so it can't accidentally burn funds.
Live on Base mainnet (
CHAIN = base), price $50 (50 USDC). Contract0x4e7fe157622B64BAf040b0ba8825568927073a0e, owner/recipient0x1b1934c0475c97196ba470dec8d9a455712952ee(verified on-chain:PRICE50,000,000, mainnet USDC). Real USDC moves — verify the source on basescan.org so payers can read it.Earlier contracts:
0x7744…Fd41(1 USDC, mainnet) and0x790f…2ac9(Base Sepolia testnet) are superseded.
Verify the source on basescan.org so the contract is readable and trustworthy to anyone who checks before paying.
This is a static site — any static host works. Two easy options:
- Create a repo and push:
git remote add origin git@github.com:<you>/heteroverify.git git push -u origin main
- In the repo: Settings → Pages.
- Under Build and deployment → Source, choose Deploy from a branch.
- Select branch
main, folder/ (root), then Save. - Your site goes live at
https://<you>.github.io/heteroverify/in a minute or two.
-
Push the repo to GitHub (as above).
-
Go to vercel.com/new and import the repo.
-
Framework preset: Other. Leave build command empty and output directory as the project root.
-
Deploy. Vercel serves
index.htmlautomatically.Or from the CLI:
npm i -g vercel vercel # preview vercel --prod # production
The site doubles as a Farcaster / Base
Mini App, so the Send $50 button works inside Base App using its built-in
wallet (script.js routes through the Mini App provider when it
detects the host, and calls sdk.actions.ready() to dismiss the splash).
Pieces already in place:
index.html # fc:miniapp + fc:frame embed meta tags
.well-known/farcaster.json # the Mini App manifest
assets/icon.png # 1024×1024 app icon
assets/splash.png # 200×200 splash mark
assets/embed.png # 1200×800 share card (also the OG/Twitter image)
To go live:
- Deploy to a stable domain (Vercel production domain or a custom one). The manifest is bound to one exact domain, so pick the final one first.
- Replace
https://YOUR-DOMAINeverywhere — in index.html (meta tags) and .well-known/farcaster.json:grep -rl 'YOUR-DOMAIN' index.html .well-known | \ xargs sed -i 's#https://YOUR-DOMAIN#https://your-real-domain.com#g'
- Sign the manifest. Open the Base/Farcaster manifest tool
(Base Build → Manifest),
enter your domain, sign with your Farcaster account, and paste the resulting
header/payload/signatureinto theaccountAssociationblock offarcaster.json(currentlyREPLACE_ME). - Redeploy, then validate the embed + manifest with the Mini App previewer (Base/Warpcast embed debugger) and submit/share it in Base App.
The wallet routing is graceful: in a normal browser the button still uses an injected wallet (MetaMask / Coinbase Wallet), so nothing breaks outside Base App.
MIT — do whatever. It's a joke.
