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.
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
- State machine contracts —
Ingested→Earmarked→Attested→Disbursed - Hash-on-chain, documents off-chain — auditability without storing blobs in EVM storage
- Wallet integration (MetaMask / Web3.js) — signing stays with participants
- 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