Vishal Tyagi
← Projects
Distributed Systems·shipped

Blockchain NGO Donation Tracking

Built an Ethereum-based donation tracking prototype at a nonprofit: lifecycle states on-chain, receipt hashes for auditability, MetaMask-signed attestations — without the platform holding custodial keys.

Date2024-03
Reading TimeN/A
Statusshipped
StackSolidity, Ethereum, Truffle+2

Ethereum (on-chain state + event logs)

Ledger

[High Confidence]

Non-custodial (wallet-signed txs)

Custody model

[High Confidence]

What it does

NGO fund flows are hard for donors to verify independently when the ledger is a private spreadsheet. This project modeled charitable allocations as Solidity contracts with explicit lifecycle states, stored receipt hashes on-chain, and left document bodies off-chain to keep gas costs down.

Constraints

  • Records must be tamper-evident on a public ledger
  • Platform must not hold private keys or donor funds
  • Gas cost of state writes needs to stay reasonable
  • Payout release needs multi-party attestation before disbursement

Decisions & tradeoffs

  1. State machine contractsIngestedEarmarkedAttestedDisbursed
  2. Hash-on-chain, documents off-chain — auditability without storing blobs in EVM storage
  3. Wallet integration (MetaMask / Web3.js) — signing stays with participants
  4. Structured event logs — for external indexers / webhooks
flowchart LR
  Donor[Donor / Grantor] -->|Sign and Send Funds| SmartContract[Solidity Audit Contract]
  SmartContract -->|State Transition| EVMLedger[(Ethereum Ledger)]
  NGOAdmin[Recipient Organization] -->|Submit Disbursement Proof| OffChainStore[Off-Chain Storage]
  NGOAdmin -->|Submit Hash Attestation| SmartContract
  SmartContract -->|Verify Attestation| Disburse[Payout Disbursement]
  Auditor[Public Auditor / Donor] -->|Verify Log Hashes| EVMLedger

Tradeoffs: on-chain writes buy public verifiability and cost gas. Non-custodial wallets remove platform key risk and add wallet UX friction versus card checkout.

What it demonstrates

  • Modeling real financial workflows as contract state machines
  • Separating what must be on-chain (attestation hashes) from what should not (documents)
  • Building a non-custodial client path with standard Web3 tooling