Skip to content
ProofChain

ProofChain

Prove it existed. Keep it private.

Created on 23rd August 2026

•

ProofChain

ProofChain

Prove it existed. Keep it private.

The problem ProofChain solves

Important digital documents can be modified, replaced, or disputed after they are created. Proving that a specific contract, design, research file, invoice, or creative work existed at a particular time usually requires trusting a centralized service or sharing the entire document.

ProofChain makes this process easier and safer by storing only a document’s fingerprint, title, wallet address, and timestamp on Ethereum. The original file remains off-chain, while anyone with the proof link can independently verify that the registered fingerprint matches the document.

People can use ProofChain to:

  • Prove authorship and priority of creative work, designs, code, manuscripts, or research.
  • Record versions of contracts, NDAs, invoices, and compliance documents.
  • Timestamp intellectual property disclosures and confidential business files.
  • Verify that a document has not been altered since it was registered.
  • Share tamper-resistant proof without relying on a central authority.
  • Replace manual email trails, screenshots, or third-party timestamping services with a transparent on-chain record.

ProofChain does not publish the document contents on Ethereum. It anchors the document’s identity and existence, allowing users to prove when a file existed without unnecessarily exposing what is inside it.

Challenges we ran into

Keeping Proof IDs Correct After Filtering

The smart contract stores proofs in a single array, while the dashboard only displays proofs belonging to the connected wallet. Initially, filtering the list could cause the displayed array index to differ from the actual on-chain proof ID. This created a risk of generating verification links for the wrong proof.

We solved this by preserving the original contract index before filtering:

allProofs
  .map((proof, index) => ({ ...proof, contractId: index }))
  .filter((proof) => proof.owner.toLowerCase() === address.toLowerCase());

Every dashboard item now links to its original on-chain ID, ensuring that verification always opens the correct proof.

Handling Incorrect Wallet Networks

Users may connect their wallet while being on Ethereum Mainnet or another network instead of Sepolia. Transactions would fail or be sent to the wrong network.

We added network detection before submission. When the connected wallet is on the wrong network, ProofChain requests a switch to Ethereum Sepolia and prevents the transaction from continuing until the correct network is selected.

Uploading Files Without Exposing API Credentials

Pinata requires API credentials, but exposing those credentials in frontend code would create a security risk. We solved this by routing uploads through a server-side Next.js API endpoint. The browser sends the file to /api/pinata, and the server forwards it to Pinata using credentials stored in environment variables.

This keeps the credentials off the client while still providing upload progress and clear error states in the interface.

Handling Blockchain and Upload Delays

IPFS uploads and blockchain confirmations are asynchronous and can take different amounts of time. We added separate loading and status states for uploading, transaction submission, network switching, and confirmation. This makes the workflow clearer and prevents users from accidentally submitting duplicate transactions while a previous action is still pending.

Tracks Applied (1)

Overall

ProofChain is a privacy-focused proof-of-existence dApp built on Ethereum Sepolia. It allows users to upload a document...Read More

Discussion

Builders also viewed

See more projects on Devfolio