How SafeStay uses Arkiv
SafeStay is a deposit-truth registry for Indian renters. Deposits and PG advances of ₹20k–₹1L+ change hands with no verifiable history — this app puts the truth on a public database nobody controls.
The trust model — why fake reviews can’t exist
A landlord signs deposit_terms naming a tenant wallet. When the tenancy ends, that tenant signs a deposit_outcome referencing the terms — and the app only marks it verified when the referenced terms name the reviewer back.
A fabricated review would need a colluding landlord signature — which incriminates the landlord. Filtering runs on $creator, Arkiv’s immutable provenance field, never on a writable attribute.
Why Arkiv and not Postgres / IPFS / an API
- Postgres — whoever runs the site can edit or delete any record. The whole point is that nobody can.
- IPFS — content-addressed but not queryable: “give me every outcome about this wallet” has no answer.
- A custom API — trust re-enters through the operator. Arkiv makes the records public, signed, typed and expiring by construction.
Arkiv features → what you see
$creator+ cross-referenced terms → “verified link” badges.- Typed attributes (
addr,u256,key,u64) → the exact queries below, no server-side sort. executeBatch→ outcome + evidence hash land in one atomic transaction.- Entity Expiration → every record shows a live expiry; truth outlives the app, not the person.
- Lifetime Extension → landlords can renew terms while a tenancy is active.
watchEntityEventsover WebSocket → the history page and live feed update with no refresh.
Exact queries
Landlord history (the lookup)
project='safestay_v1' AND entity_type='deposit_outcome' AND landlord_wallet=<addr>Open scope on purpose — any tenant may review. Trust comes from the two-way link, not an allowlist.
Signed terms for verification
project='safestay_v1' AND entity_type='deposit_terms' AND $creator=<landlord>The landlord's own signature is the provenance — $creator can't be forged.
Open terms for a tenant
project='safestay_v1' AND entity_type='deposit_terms' AND tenant_wallet=<addr>A tenant can only answer terms that name them.
Evidence for an outcome
project='safestay_v1' AND entity_type='evidence_log' AND outcome_key=<key>key-typed attributes join records without a foreign-key layer.
Landlord directory
project='safestay_v1' AND entity_type IN ('deposit_terms','landlord_profile')Directory membership = every wallet that signed terms; display names come only from profiles that wallet signed itself.
Creator wallets — read live from Arkiv
Every wallet below signed at least one deposit_terms entity — this list is a live query, not a config file. Seeded identities are synthetic demo businesses; names appear only where the wallet signed its own landlord_profile.
Kept off Arkiv, deliberately
Photos, names, phone numbers and exact addresses never touch the chain. Evidence is a SHA-256 hash only — the file stays with the tenant. See /arkiv/schema.md and /arkiv/friction.md in the repository.