On-Chain Verification

Every contribution, endorsement, and reputation record on Pulse is independently verifiable on Arkiv Braga testnet. No backend. No database. No trust required.

Live Entity Counts

Fetching from Arkiv Braga testnet...

📝

Contributions

🤝

Endorsements

🔥

Streaks

✅

Validations

📋

Passports

💰

Bounties

Total Pulse Entities on Arkiv Braga

Entity Relationship Map

Member
Wallet
owns →
Contribution
Endorsement
Streak
→ attested by →
ValidationRecord
Bounty
→ synthesized into →
Reputation
Passport

All 6 entity types use PROJECT_ATTRIBUTE = { key: "app", value: "pulse:v1" }

Verifiable Queries

Run these queries directly against Arkiv Braga to independently verify all data shown on Pulse.

All Pulse Contributions

Query all contribution entities created by Pulse v1

// Using @arkiv-network/sdk
import { createPublicClient } from "@arkiv-network/sdk";
import { eq } from "@arkiv-network/sdk/query";
import { http } from "@arkiv-network/sdk/transport";

const client = createPublicClient({
  chain: { id: 60138453102, rpcUrls: { default: { http: ["https://rpc.braga.arkiv.network"] } } },
  transport: http(),
});

const result = await client
  .buildQuery()
  .where([
    eq("app", "pulse:v1"),
    eq("type", "contribution"),
  ])
  .withAttributes(true)
  .withPayload(true)
  .orderBy("createdAt", "number", "desc")
  .limit(50)
  .fetch();

console.log(result.entities);

Leaderboard Query

Get validated contributions ranked by points for a cohort

const leaderboard = await client
  .buildQuery()
  .where([
    eq("app", "pulse:v1"),
    eq("type", "contribution"),
    eq("status", "validated"),
    eq("cohort", "ns-v3-2026"),
  ])
  .withAttributes(true)
  .orderBy("points", "number", "desc")
  .limit(100)
  .fetch();

// Group by wallet to compute total points
const scores: Record<string, number> = {};
for (const entity of leaderboard.entities) {
  const attrs = entity.attributes ?? [];
  const wallet = attrs.find(a => a.key === "contributorWallet")?.value ?? "";
  const pts = Number(attrs.find(a => a.key === "points")?.value ?? 0);
  scores[wallet] = (scores[wallet] ?? 0) + pts;
}

Reputation Passport Lookup

Fetch a member's full Reputation Passport by wallet address

// Replace with any member wallet
const memberWallet = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e";

const passport = await client
  .buildQuery()
  .where([
    eq("app", "pulse:v1"),
    eq("type", "passport"),
    eq("memberWallet", memberWallet),
  ])
  .withAttributes(true)
  .withPayload(true)
  .orderBy("generatedAt", "number", "desc")
  .limit(1)
  .fetch();

const entity = passport.entities[0];
const payload = JSON.parse(entity.payload ?? "{}");
console.log("AI Narrative:", payload.aiNarrative);
console.log("Total Points:", entity.attributes?.find(a => a.key === "totalPoints")?.value);

Direct Links

Technical Stack

BlockchainArkiv Braga Testnet (Chain ID: 60138453102)
SDK@arkiv-network/sdk@0.6.8
PROJECT_ATTRIBUTE{ key: "app", value: "pulse:v1" }
Entity TypesContribution, Endorsement, Streak, ValidationRecord, ReputationPassport, Bounty
AI Modelclaude-sonnet-4-20250514 (Anthropic)
AuthPrivy (email + embedded EVM wallet)
FrontendNext.js 16 App Router + Tailwind v4
RPC Endpointhttps://rpc.braga.arkiv.network

Everything shown on Pulse is independently verifiable

No centralized database. No admin keys. Every entity lives on Arkiv Braga testnet, owned by the contributor's wallet.