Track — Arkiv: Build on Arkiv (from scratch)
Prize: $3k / $1k. Optional Swarm bonus $500 (not planned). All Arkiv prizes = one partner pick.
What Arkiv is
- Separate chain acting as public database. Testnet: Rabdi (chain ID 7794095), 2s blocks.
- Entity = record, ≤32 typed fields,
.indexed()= filterable. - Every entity has expiry (max ~182 days). Auto-disappears.
- Only owner wallet edits/deletes.
- Batches atomic. Queries ≤100 rows/page. Events via polling.
- Gas in GLM (testnet tGLM, free faucet). No published pricing. Cost grows w/ size, lifetime, indexed fields, write count.
Use in our stack — vault records only
Rule: Arkiv holds only data that is public + not already onchain + needed for trust. Writes scale with time, not trades → sustainable on mainnet.
| Entity | Fields (indexed*) | Freq | Expiry | Read by |
|---|---|---|---|---|
FundingRate | market*, ts*, rate, markPx, indexPx | 1/h/market | 7d (+ daily summary 182d, optional) | terminal funding chart, CRE rebalancer |
VaultDecision | ts*, market*, mode*, reason, fundingRefs | few/week | 182d | vault page "why it exited" |
VaultSnapshot | ts*, nav, sharePrice, per-market mode/spotSize/shortSize | 1/h | 7d (+ daily summary) | vault history chart |
4 markets → ≈50 records/day/market, ~24 batches. Same at $1k or $1B volume.
Kept off Arkiv:
- Orders → engine memory (thousands/day, latency).
- Trades → already in
PerpExchangeevents. - Balances/positions → contracts.
Schema sketch
import { bytes, dec, defineSchema, str, u64 } from "@arkiv-network/sdk/schema"
export const FundingRate = defineSchema("perpvault.funding", {
market: str().indexed(),
ts: u64().indexed(),
rate: dec(),
markPx: dec(),
indexPx: dec(),
})
export const VaultDecision = defineSchema("perpvault.decision", {
ts: u64().indexed(),
market: str().indexed(), // BTC | ETH | HYPE | ZEC
mode: str().indexed(), // "HEDGED" | "FLAT"
reason: str(),
fundingRefs: str(), // Arkiv keys of FundingRate entries used
})
export const VaultSnapshot = defineSchema("perpvault.snapshot", {
ts: u64().indexed(),
nav: dec(),
sharePrice: dec(),
markets: bytes(), // JSON: per-market {mode, spotSize, shortSize}
})
- Writer: Go
recorderservice (backend/cmd/recorder) via Arkiv JSON-RPC (no Go SDK; schema sketch above = TS for reference). One batch per hour. Owner = recorder wallet. Issue #32. - Verify story: depositor re-runs funding query → confirms vault followed its rule.
Pitch
"Arkiv only holds the data that proves our vault is honest. Writes scale with time, not trades."
Qualification checklist
- Built from scratch at ETHGlobal Mumbai.
- Writes to Arkiv current testnet w/
@arkiv-network/sdkor JSON-RPC. - ≥1 user-visible feature reads from Arkiv (funding chart, vault history).
- README: writer wallet address(es) + one runnable query.
-
/arkiv/schema.md— entities, queried fields, owner, expiry. -
/arkiv/friction.md— feedback (what broke, expected vs actual, repro). -
/arkiv/reach.md— who uses it, can they try today, post-Mumbai plan. -
/arkiv/why-arkiv.md— what users lose w/ Postgres; what kept off Arkiv + why. -
/arkiv/how-you-use-arkiv.md— filters/owner/expiry fit; each feature visible to users. - Public repo, open-source license, state AI usage.
- Not just a log nothing reads.
Links
- Docs: https://docs.arkiv.network
- Limits: https://docs.arkiv.network/reference/limits/
- Batches: https://docs.arkiv.network/writing/batches/
- Hub (faucet, access keys): https://hub.arkiv.network
- RPC: https://rpc.rabdi.db-chain.testnet.arkiv.network
- Explorer: https://rabdi.explorer.arkiv.network