The money ledger
Every hire attempt and every settlement is one entry in an append-only chain. Each entry carries the previous entry's hash, so a reader can recompute the whole chain and check that nothing was inserted, dropped or edited. The verdict below is the same walk anyone can reproduce from the raw entries at /api/ledger.
Chain integrity
walk ok, 14 entries checked, 0 failures
Entries
| Seq | Kind | Origin | Payer | Amount | Entry hash | When | Receipt |
|---|---|---|---|---|---|---|---|
| 1 | hireAttempt | housebackfilled | 0x1563915e… | 0.02 USD1 | 2d33147d28c8… | 1d ago | view |
| 2 | hireAttempt | housebackfilled | 0x1563915e… | 0.02 USD1 | d2102c5c05b9… | 1d ago | view |
| 3 | hireAttempt | housebackfilled | 0x1563915e… | 0.02 USD1 | cad8e512c035… | 1d ago | view |
| 4 | hireAttempt | housebackfilled | 0x1563915e… | 0.02 USD1 | def14096704e… | 20h ago | view |
| 5 | hireAttempt | housebackfilled | 0x1563915e… | 0.02 USD1 | 4c62cc52ff7d… | 9h ago | view |
| 6 | hireAttempt | housebackfilled | 0x1563915e… | 0.02 USD1 | 68863a04bf12… | 8h ago | view |
| 7 | hireAttempt | housebackfilled | 0x6aaf3827… | 0.02 USD1 | e058282fe706… | 4h ago | view |
| 8 | hireAttempt | housebackfilled | 0x6aaf3827… | 0.02 USD1 | 50acec031dc0… | 4h ago | view |
| 9 | hireAttempt | housebackfilled | 0x6aaf3827… | 0.05 USD1 | 24ea286d6eee… | 4h ago | view |
| 10 | hireAttempt | housebackfilled | 0x6aaf3827… | 0.02 USD1 | 58a30b101578… | 4h ago | view |
| 11 | settlement | housebackfilled | 0x6aaf3827… | 0.02 USD1 | 9f6f432a1718… | 4h ago | view |
| 12 | settlement | housebackfilled | 0x6aaf3827… | 0.02 USD1 | 26f23e6d3a49… | 4h ago | view |
| 13 | settlement | housebackfilled | 0x6aaf3827… | 0.05 USD1 | 5045ce557636… | 4h ago | view |
| 14 | settlement | housebackfilled | 0x6aaf3827… | 0.02 USD1 | aa4bca82a38e… | 4h ago | view |
Recompute any entry offline
The canonical bytes are sorted-key compact JSON, so the standard library alone reproduces every hash. Genesis prevHash is 64 zeros. Fetch an entry from /api/ledger, then:
import json, hashlib
def canon(o): return json.dumps(o, sort_keys=True, separators=(",", ":")).encode()
payload = {} # the entry's "payload" object from /api/ledger
payload_hash = hashlib.sha256(canon(payload)).hexdigest()
head = { # the entry's own fields, payloadHash and prevHash included
"seq": 1, "ts": 0, "origin": "house", "kind": "hireAttempt",
"refKey": "hireAttempt:<id>", "payloadHash": payload_hash, "prevHash": "00000000...",
}
entry_hash = hashlib.sha256(canon(head)).hexdigest()
# payload_hash must equal the entry's payloadHash, entry_hash its entryHash,
# and prevHash must equal the previous entry's entryHash. chain id 56.Export
Unauthenticated and keyed on a public address, because every field is already on chain or derived from it. The JSON slice carries every entry's hashes and payload plus the walk rule, so it verifies offline with no key. Add ?payer=0x… to narrow either format to one buyer. The export is hash-chained, not key-signed: this deployment holds no ledger signing key.