Skip to main content

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.

EntityFields (indexed*)FreqExpiryRead by
FundingRatemarket*, ts*, rate, markPx, indexPx1/h/market7d (+ daily summary 182d, optional)terminal funding chart, CRE rebalancer
VaultDecisionts*, market*, mode*, reason, fundingRefsfew/week182dvault page "why it exited"
VaultSnapshotts*, nav, sharePrice, per-market mode/spotSize/shortSize1/h7d (+ 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 PerpExchange events.
  • 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 recorder service (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/sdk or 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.