MemeGraveyard
A decentralized platform for uploading, storing, and sharing memes forever using IPFS (via Pinata) and Ethereum smart contracts. Memes are immortalized on-chain while files are pinned on IPFS, ensuring censorship resistance and community ownership.
Features
- Upload memes (images) securely to IPFS (Pinata)
- On-chain record of memes (title, description, uploader address, IPFS hash)
- Community-driven meme archive – no central authority
- Wallet integration (MetaMask / WalletConnect)
- Transparent and permanent meme history
- Simple, modern UI (Next.js + Tailwind + shadcn components)
Components
- Smart Contracts: Solidity (Ethereum/Sepolia)
- Storage: IPFS (Pinata)
- Frontend: Next.js, React, TailwindCSS, wagmi/ethers.js
- Deployment: Vercel (frontend) + Remix/Hardhat (contracts)
Smart Contract Features
Core Functions
uploadMeme(string title, string ipfsHash)– Store meme metadata on-chaingetMeme(uint256 memeId)– Fetch meme details by IDgetAllMemes()– Retrieve all memesgetUserMemes(address user)– Retrieve memes uploaded by a user
Events
MemeUploaded(address indexed user, uint256 memeId, string ipfsHash)- Emitted when a meme is uploaded
Security Notes
- Only IPFS hashes (not raw images) are stored on-chain
- Contract contains no private/admin keys
- Fully transparent, community-driven storage
- No deletions – once uploaded, memes are permanent
Tech Stack
- Frontend: Next.js App Router, Tailwind + shadcn/ui, wagmi + viem (MetaMask)
- IPFS: Pinata (SDK via server route)
- Chain: Sepolia (MetaMask)
- Design: Gothic dark, primary emerald, red accent, neutrals black/gray/white
Smart contract documentation
Functions:
- buryMeme(string caption, string ipfsHash)
- mournMeme(uint256 memeId) payable
- voteMeme(uint256 memeId, bool upvote)
- moveToHallOfFame(uint256 memeId)
- getMeme(uint256 memeId), getAllMemes()
Events:
- MemeBuried(tokenId, buriedBy, caption, ipfsHash)
- MemeMourned(tokenId, mourner, amount)
- MemeVoted(tokenId, voter, upvote)
- MemeMovedToHall(tokenId)
Hall threshold is 10 net votes (upvotes - downvotes).
Acceptance Criteria
- MetaMask connect via wagmi (Sepolia)
- Image upload via Pinata route returns CID
- CID stored on-chain via buryMeme
- Graveyard displays images from https://gateway.pinata.cloud/ipfs/{CID}
- Tributes + votes update on-chain and reflect in UI
- Memes reaching threshold are moved to Hall
Getting Started
1. Clone the Repository*
git clone https://github.com/K1297/memegraveyard.git
cd memegraveyard
2. Install Dependencies
npm install
# or
pnpm install
3. Setup Environment Variables
Create a .env.local file:
NEXT_PUBLIC_CONTRACT_ADDRESS=0xYourDeployedContract
PINATA_API_KEY=your_api_key
PINATA_SECRET_API_KEY=your_secret
4. Run Locally
npm run dev
Visit: http://localhost:3000
Contribution Guidelines
We welcome contributions from anyone who would like to help improve our dapp.
To contribute, please follow the following steps:
- Fork the repository to your own GitHub account: https://github.com/K1297/memegraveyard.git
- Create a new branch from the main branch for your changes.
- Make your changes and commit them with clear commit messages.
- Push your changes to your forked repository.
- Open a pull request to merge your changes into the main branch.

Log in or sign up for Devpost to join the conversation.