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-chain
  • getMeme(uint256 memeId) – Fetch meme details by ID
  • getAllMemes() – Retrieve all memes
  • getUserMemes(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.
Share this project:

Updates