Inspiration
Misinformation in Indonesia spreads faster than fact-checkers can keep up with it. MAFINDO, the country's largest anti-hoax community, documented 1,593 hoax cases in just the past year, nearly half of them political. What struck us even harder was a Kominfo and Katadata survey showing 45% of Indonesians don't feel confident they can identify a hoax on their own, and worse, publishers can quietly edit or retract a controversial article with zero public trace. Once a story is "corrected," the original claim just disappears, taking any accountability with it.
We wanted to build something that didn't just check facts once, but made that check permanent, public, and impossible to quietly erase, even by us.
What it does
VeritasChain lets anyone paste a link or a block of text and get back a credibility score in seconds, generated by cross-referencing MAFINDO's TurnBackHoax.id database and running semantic analysis through Gemini 2.0 Flash. The part we're proudest of happens after the score: the full analysis is pinned to IPFS, and its fingerprint, a SHA-256 hash, the credibility score, and the submitter's wallet address, gets written permanently to a smart contract on Ethereum Sepolia. If that article is edited later, re-scanning it produces a different hash, and VeritasChain flags the mismatch immediately. Anyone can verify the record independently on Sepolia Etherscan, without ever trusting our servers.
To keep onboarding painless, users log in with just an email through Privy's embedded wallets, with no seed phrases and no browser extensions, and a gasless relayer covers the gas fees, so nobody needs testnet ETH to participate.
How we built it
We split the system into three layers. The frontend is a React app where users submit articles and see their results; it talks to everything else only through a thin logic layer, never directly to Privy, our API, or the blockchain. Our backend, built on FastAPI, handles async scraping with BeautifulSoup and HTTPX, queries the MAFINDO feed, calls the Gemini API for semantic scoring, and pins normalized content to IPFS via Pinata. The on-chain layer is a Solidity contract on Sepolia that stores just the essentials: an IPFS CID, a score, a wallet address, and a timestamp, keeping gas costs minimal.
For the gasless flow, users sign an EIP-712 typed message off-chain, and our relayer wallet picks it up, pays the gas, and broadcasts the transaction on their behalf, while the contract still records the original signer as the submitter.
Challenges we ran into
Getting the non-custodial wallet model right took real back-and-forth. We initially assumed we'd need to store keys ourselves, until we understood how Privy splits key shares across the user's device and a TEE so that no single party, including us, ever holds a complete private key. That distinction mattered legally as much as technically.
Deterministic hashing was trickier than expected: naive hashing flagged harmless edits (a fixed typo, a reformatted paragraph) as "tampering." We had to build a normalization step, lowercasing, whitespace collapsing, punctuation stripping, plus a Levenshtein-distance check to distinguish genuine editorial corrections from deceptive edits.
We also underestimated the complexity of the gasless relayer: managing nonces, rate-limiting requests, and preventing a malicious user from draining our relayer's balance all needed careful handling under hackathon time pressure.
Accomplishments that we're proud of
We shipped a working end-to-end pipeline, from email login to an on-chain, publicly verifiable record, without requiring users to understand blockchain at all. We're especially proud of the edit-detection feature, since it directly answers a real, documented problem rather than being blockchain for its own sake.
What we learned
We came out of this with a much deeper understanding of non-custodial wallet architecture (MPC, Shamir Secret Sharing, TEEs), why storing large content on-chain is impractical (and how IPFS plus a CID solves that), and how EIP-712 meta-transactions let you sponsor gas without giving up on-chain attribution. Just as importantly, we learned that the blockchain layer only earns its place in the story if it's solving a trust problem a normal database genuinely can't: immutability and public auditability, not blockchain as decoration.
What's next for VeritasChain
Our roadmap includes migrating the contract to a Layer-2 network like Base or Arbitrum to push gas costs below a cent, mirroring IPFS snapshots to Arweave for redundant long-term storage, shipping a browser extension that surfaces verification badges directly in search results, and launching a staking-backed review pool so the community, not just our AI, can weigh in on disputed scores.
Built With
- blockchain
- web3