Non-transferable prank NFTs on Base. 15-slot chaos buffer · on-chain SVG metadata · stablecoin powered.
$1 to curse. $2 to escape.
Send a cursed on-chain message to any wallet. The slot buffer decides what mints next. Recipients can't transfer it — they can only burn it by paying.
- You write a message and pick a victim (any wallet address).
- You pay in stablecoins (USDC, USDS, USDe, GHO, or crvUSD).
- The contract randomly selects one of 15 slots. Whatever was in that slot gets minted now.
- Your message takes the slot's place, waiting for the next person to trigger it.
Tokens are fully on-chain SVGs — metadata, artwork, and messages all live on Base. No IPFS dependency for token data.
src/ Solidity contracts (Foundry)
render/ On-chain SVG renderer and metadata
script/ Deploy scripts
test/ Forge tests
frontend/ Static frontend (vanilla JS + ethers.js)
build.js Generates multi-page static site for IPFS
forge build --via-irforge test --via-irDEPLOYER_PRIVATE_KEY=0x... forge script script/DeployGigglesAndGags.s.sol \
--rpc-url https://mainnet.base.org \
--broadcast --verify --via-irThe frontend is a static site designed for IPFS hosting via ENS contenthash. Build with:
cd frontend && node build.jsOutput goes to dist/. Upload to IPFS and set the ENS contenthash.
The contract is verified on BaseScan. Key properties:
- Non-transferable (soulbound) —
transferFrom,approve, andsetApprovalForAllpermanently blocked - Stablecoin payments — exact approvals only, no unlimited allowances
- Burn-to-remove — recipients pay to delete, sender earns tribute (if non-anonymous)
- Fully on-chain — SVG and metadata generated in Solidity, no off-chain dependencies
- OpenZeppelin base — ERC-721, Ownable, Pausable, SafeERC20
MIT