Sahel · CLOSED
Borehole and handpump
About this project
A borehole promised to 410 people on the edge of Ségou. To prove the first stage, the NGO submitted a photograph of the finished pump that an AI model had generated: no camera data, no GPS, and a marker in the file declaring it machine-made. Donors flagged it, the vote overturned the stage, no pump was ever installed, and every euro went back.
The title, organisation, location, summary and impact above are read out of the text this escrow committed to before its first donation. We hashed that text and it equals the termsHash on chain;no cover photograph is committed yet, so none is shown as the project's own.
- Implementer
- Sahel Water Trust · 0x7099…79C8
- termsHash
- 0xe2ef8dfd479f…6d60 ✓
- Cover photograph
- none committed
- Escrow
- 0x5cf0BA38567Bf75E7Ff710Add8064c1fE083a095
What has to be proved before each tranche moves
Anyone may assert a stage's outcome against a bond. For an hour anyone may dispute it with a matching bond, or any donor may flag it for free; a dispute goes to a sealed vote of stakers. Then the contract pays the EDE or refunds the donors.
Depth and casing against the drilling log, the collar photograph's GPS against the claim's coordinates, and an accredited lab result for E. coli and nitrate.
0x87ec59aa…56dbRead the exact rule
Stage 1, Borehole drilled and water tested. Resolves PASSED if ALL hold: (a) the drilling log records a cased depth of at least 40 m; (b) the collar photograph is an original camera capture, EXIF make, model and capture time present, GPS within 500 m of the coordinates registered in this claim, and no embedded provenance record (C2PA manifest or IPTC digital source type) declaring the image AI-generated or composited. A photograph failing this is not evidence; (c) an ISO 17025 accredited laboratory reports E. coli absent in 100 ml and nitrate below 50 mg/l. Source of truth: the drilling log, the collar photograph and the laboratory certificate anchored in this stage's evidence bundle. Anything else resolves FAILED.
The pump's serial plate against the supplier invoice, and a site photograph showing the apron and soakaway actually built.
0x5a6f891a…5ea7Read the exact rule
Stage 2, Pump, apron and soakaway installed. Resolves PASSED if ALL hold: (a) the pump serial plate legible in the site photograph matches the serial printed on the supplier invoice; (b) the invoice total is within 10% of this tranche; (c) a site photograph shows a completed concrete apron and a soakaway. Source of truth: the supplier invoice and the site photographs anchored in this stage's evidence bundle. Anything else resolves FAILED.
A training register with named attendees, thirty consecutive days of flow logs, and a signed community hand-over.
0x2153fe8b…3da4Read the exact rule
Stage 3, Committee trained and 30 days of verified flow. Resolves PASSED if ALL hold: (a) the training register lists at least 8 named attendees with signatures; (b) the flow log covers 30 consecutive days with no gap longer than 48 hours; (c) the community hand-over record carries at least 5 signatures. Source of truth: the training register, the flow log and the hand-over record anchored in this stage's evidence bundle. Anything else resolves FAILED.
Traceability
Every event this escrow and its vote emitted, in order, from the contracts' own log rather than our database. Open one for the raw entry behind our wording. 36 events, blocks 47–172.
The funding round
Alice donates 20,000.00 EURC (conditional)ContributionReceived2026-11-02 18:05 UTC
A conditional gift: if the work is not delivered, this money comes back to the donor's own wallet.
donor=0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc (Alice) amount=20000000000 class_=0 fallbackTo=0x0000000000000000000000000000000000000000
Bob donates 20,000.00 EURC (conditional)ContributionReceived2026-11-02 18:05 UTC
A conditional gift: if the work is not delivered, this money comes back to the donor's own wallet.
donor=0x976EA74026E726554dB657fA54763abd0C3a0aa9 (Bob) amount=20000000000 class_=0 fallbackTo=0x0000000000000000000000000000000000000000
Carol donates 12,000.00 EURC (irrevocable)ContributionReceived2026-11-02 18:05 UTC
An irrevocable gift: the donor gave up any personal refund at the moment the escrow locked. If the work fails, her share goes to the reallocation pool she nominated here, and it can never be routed to her.
donor=0x14dC79964da2C08b23698B3D3cc7Ca32193d9955 (Carol) amount=12000000000 class_=1 fallbackTo=0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 (Clean Water Reallocation Pool)
Carol donates 12,000.00 EURC (irrevocable)Collateralised2026-11-02 18:05 UTC
An irrevocable gift: the donor gave up any personal refund at the moment the escrow locked. If the work fails, her share goes to the reallocation pool she nominated here, and it can never be routed to her.
totalContributed=52000000000 blockNumber=51
The EDE steps in
The EDE registers itself as the irrevocable payeePayeeRegistered2026-11-02 18:05 UTC
The EDE has already paid the NGO in euros, up front. It now writes its own address into the escrow from its own key. The field is write-once and this contract has no transfer function at all, not a restricted one, none. The IBAN is committed as a salted hash, never in the clear.
payee=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC (Iberia EDE, S.A.) ibanCommitment=0x6434f69babee57688b7ec836dd492e0ce108c00211361494c92ec54aabf3ec03 assignedAmount=52000000000 licenceRef=0x4264452d4544452d363830310000000000000000000000000000000000000000
The EDE confirms the euro advance reached the NGOAdvanceConfirmed2026-11-02 18:05 UTC
50,000.00 EUR left the EDE's account and arrived at the NGO's bank, off-chain. This is the on-chain record that it did. The claim is now EXECUTING and work can start. From here the NGO owes the EDE, and only proved stages repay it.
payee=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC (Iberia EDE, S.A.) advanceRef=0x98bc6b095e517532386f0328514b44408b9a2b111cabbce5fe4c17ce0fb95651
Stage 1, Borehole drilled and water tested
Sahel Water Trust asserts stage 1 PASSED and bonds 500.00 EURCOutcomeAsserted2026-11-02 18:05 UTC
The NGO asserts its own stage and bonds it, which anyone may do. Its proof of the drilled borehole is a photograph an AI model generated. Asserting is cheap only if you are right. The assertion names 3 pieces of evidence, reduced to the single root 0x3298c7f5… that went on-chain. Nothing moves yet: a one-hour window opens in which anyone can dispute it with a matching bond, or any donor can flag it for free.
milestoneId=0 asserter=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 (Sahel Water Trust) passed=true evidenceRoot=0x3298c7f54620387f0dd526e282a1f4822b5df9357721e13d46d3ac554b1826b8 bond=500000000
Stage 1 → assertedMilestoneStatusChanged2026-11-02 18:05 UTC
milestoneId=0 from=0 to=1
Alice flags the assertion, 20,000 EURC of donor weight, threshold not yet reachedMilestoneFlagged2026-11-02 18:05 UTC
Flagging is free and unbonded. It does not decide whether the work was done; it decides whether the outcome goes to a vote. Alice's weight alone is below the 30,000 EURC threshold written into this escrow, so nothing happens yet.
milestoneId=0 donor=0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc (Alice) weight=20000000000 reasonHash=0xe9e5fca2e5a206a5bea617a23950e95c78c173fd9b6af37ac26dd793cf871357
Carol flags too, 32,000 EURC crosses the threshold and the stage goes to a voteMilestoneFlagged2026-11-02 18:05 UTC
No gatekeeper and no discretion: the moment flagged donor value crosses the threshold, the stage is disputed exactly as if someone had posted a bond. Carol is an irrevocable donor with no personal refund to gain.
milestoneId=0 donor=0x14dC79964da2C08b23698B3D3cc7Ca32193d9955 (Carol) weight=12000000000 reasonHash=0xbc14cc668b91c11f4e6414e760574664468754af519d2ec9612b5e16de76f905
Stage 1 → disputedMilestoneStatusChanged2026-11-02 18:05 UTC
milestoneId=0 from=1 to=2
Vote opened on stage 1PollOpened2026-11-02 18:05 UTC
Anyone can open the poll once a stage is disputed, this is not a gatekeeper's decision. Everyone staked in OutcomeVote may vote. A commit window of 10 minutes, then a reveal window of the same length; the whole poll must fit inside the escrow's panel window, or the stage fails to the donors.
key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 escrow=0x5cf0BA38567Bf75E7Ff710Add8064c1fE083a095 milestoneId=0 commitDeadline=1793643343 revealDeadline=1793643943
5 staked voters commit sealed votesVoteCommitted ×52026-11-02 18:05 UTC
key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 voter=0x2546BcD3c84621e976D8185a91A922aE77ECEc30 (Voter A) milestoneId=0 key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 voter=0xbDA5747bFD65F08deb54cb465eB87D40e51B197E (Voter B) milestoneId=0 key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 voter=0xdD2FD4581271e230360230F9337D5c0430Bf44C0 (Voter C) milestoneId=0 key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 voter=0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199 (Voter D) milestoneId=0 key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 voter=0x09DB0a93B389bEF724429898f539AEB7ac2Dd55f (Voter E) milestoneId=0
Votes revealed: 1 to uphold, 4 to overturnVoteRevealed ×52026-11-02 18:15 UTC
key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 voter=0x2546BcD3c84621e976D8185a91A922aE77ECEc30 (Voter A) uphold=false weight=4000000000 milestoneId=0 key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 voter=0xbDA5747bFD65F08deb54cb465eB87D40e51B197E (Voter B) uphold=false weight=3500000000 milestoneId=0 key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 voter=0xdD2FD4581271e230360230F9337D5c0430Bf44C0 (Voter C) uphold=false weight=3000000000 milestoneId=0 key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 voter=0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199 (Voter D) uphold=true weight=2500000000 milestoneId=0 key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 voter=0x09DB0a93B389bEF724429898f539AEB7ac2Dd55f (Voter E) uphold=false weight=2000000000 milestoneId=0
Tally: overturned (2,500.00 EURC to 12,500.00 EURC)Ruled2026-11-02 18:25 UTC
key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 upheld=false upholdWeight=2500000000 overturnWeight=12500000000 milestoneId=0
The vote overturns the assertion, stage 1 FAILEDChallengeResolved2026-11-02 18:25 UTC
Four of five voters opened the collar photograph, found no camera data and an embedded marker declaring it AI-generated, and ruled that it is not evidence under clause (b) of the stage rule. The tally is permissionless: whoever sends it cannot change it, because the reveals already decided it. OutcomeVote calls the escrow's resolveChallenge in the same transaction.
milestoneId=0 upheld=false
Stage 1 → FAILEDMilestoneStatusChanged2026-11-02 18:25 UTC
milestoneId=0 from=2 to=5
Voter D voted with the minority, slashed 250.00 EURCVoterSettled2026-11-02 18:25 UTC
key=0xf3ec3049acde874ba720987fca9bd514b4767e21bc8bbd876bceeff33fe9f5d1 voter=0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199 (Voter D) withMajority=false slashed=250000000 milestoneId=0
Sahel Water Trust's bond forfeited, the assertion was wrongAssertionSettled2026-11-02 18:25 UTC
milestoneId=0 asserter=0x70997970C51812dc3A010C7d01b50e0d17dc79C8 (Sahel Water Trust) right=false amount=500000000
Stage 2, Pump, apron and soakaway installed
Field Audit Cooperative asserts stage 2 FAILED and bonds 500.00 EURCOutcomeAsserted2026-11-02 19:26 UTC
No pump was installed; the site photograph shows an open borehole. Anyone may assert that a stage failed, too. The assertion names 3 pieces of evidence, reduced to the single root 0xb772b09a… that went on-chain. Nothing moves yet: a one-hour window opens in which anyone can dispute it with a matching bond, or any donor can flag it for free.
milestoneId=1 asserter=0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097 (Field Audit Cooperative) passed=false evidenceRoot=0xb772b09a02a016269622b8299318fcfc15af1220ad843e276f006ebf8e6726f2 bond=500000000
Stage 2 → assertedMilestoneStatusChanged2026-11-02 19:26 UTC
milestoneId=1 from=0 to=1
Stage 2 → FAILEDMilestoneStatusChanged2026-11-02 20:48 UTC
milestoneId=1 from=1 to=5
Field Audit Cooperative's bond returned, the assertion stoodAssertionSettled2026-11-02 20:48 UTC
milestoneId=1 asserter=0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097 (Field Audit Cooperative) right=true amount=500000000
Stage 3, Committee trained, 30 days of verified flow
Stage 3 → FAILEDMilestoneStatusChanged2027-10-28 18:06 UTC
milestoneId=2 from=0 to=5
Settlement
Claim closedClaimClosed2027-10-28 18:06 UTC
Every stage has reached a terminal state. The escrow's books are final.
releasedTotal=0 refundPool=52250000000
Refund of 20,096.153846 EURC paid out for Alice → AliceRefundClaimed2027-10-28 18:06 UTC
Pro-rata share of the refund pool: pool × this donor's contribution ÷ total contributed. Anyone may trigger the payout, but it can only ever land in the donor's own wallet.
donor=0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc (Alice) recipient=0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc (Alice) amount=20096153846 class_=0
Refund of 20,096.153846 EURC paid out for Bob → BobRefundClaimed2027-10-28 18:06 UTC
Pro-rata share of the refund pool: pool × this donor's contribution ÷ total contributed. Anyone may trigger the payout, but it can only ever land in the donor's own wallet.
donor=0x976EA74026E726554dB657fA54763abd0C3a0aa9 (Bob) recipient=0x976EA74026E726554dB657fA54763abd0C3a0aa9 (Bob) amount=20096153846 class_=0
Refund of 12,057.692307 EURC paid out for Carol → Clean Water Reallocation PoolRefundClaimed2027-10-28 18:06 UTC
Carol gave irrevocably, so her share is routed to the pool she nominated. The contract decides this by donation class, never by who calls the function, she could call it herself and the money would still go to the pool.
donor=0x14dC79964da2C08b23698B3D3cc7Ca32193d9955 (Carol) recipient=0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 (Clean Water Reallocation Pool) amount=12057692307 class_=1
Check everything yourselfWhere every token went, and the full text this escrow committed to.for auditors
Where the money went
From the stablecoin's own Transfer log, not our accounting.
✓ In minus out equals the balance (53,000.00 EURC − 52,999.999999 EURC = 0.000001 EURC). The remainder is integer truncation on the pro-rata refund split, at most one unit per donor. It is documented rather than swept, because a sweep function is an administrative path and this contract has none.
The text this escrow committed to
PROVEIT project terms v2 claim: well-failure title: Borehole and handpump implementer: Sahel Water Trust location: Ségou, Mali (13.4300, -6.2700) summary: A borehole promised to 410 people on the edge of Ségou. To prove the first stage, the NGO submitted a photograph of the finished pump that an AI model had generated: no camera data, no GPS, and a marker in the file declaring it machine-made. Donors flagged it, the vote overturned the stage, no pump was ever installed, and every euro went back. impact: 410 people promised water | 0 EURC reached the NGO | 52,250 EURC refunded cover: keccak256 0xad3693ba75c4802ffbc1310d5f1730a67ce2ac9c81ce24e45090e77cd7167403 of projects/well-failure/cover.jpg fees: works=48960.00 EUR | financing=2000.00 EUR | verification=780.00 EUR | platform=260.00 EUR | target=52000.00 EUR | tranches=20800.00/20800.00/10400.00 EUR | discount to EDE=2000.00 EUR (3.846% of target), charged once, outcome-independent conditions: verification=1.50% and platform=0.50% of each tranche, taken by the contract on release only | a failed tranche refunds in full, fee lines included | donor pays 0.00 EUR in fees; 100% of a refund returns to the donor or their nominated fallback
✓ This exact text hashes to 0xe2ef8dfd479f…6d60, the termsHash written into the escrow before the first donation. Change one character (a place name, a fee, the cover photograph) and the match fails.