# nikitabenny/friend-bet-v2 architecture

> Architecture diagram of the GitHub repository nikitabenny/friend-bet-v2, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/nikitabenny/friend-bet-v2
- Repository: https://github.com/nikitabenny/friend-bet-v2

## Overview

friend-bet-v2 is an Anchor/Solana peer-to-peer betting program: a creator opens and funds a bet, another participant matches a side, a designated resolver records the outcome, and winners claim proportional vault payouts. The Rust program also defines the bet, participant, creator-profile, and vault account state. An independent offline C++ validator checks JSON snapshots against escrow and state invariants. The React app is only a placeholder, not a working bet client. Workflow links follow the README; source excerpts add implementation detail, but not every handler or validator check was sampled.

Main entry points: [`programs/friend-bet-v2/src/lib.rs`](https://github.com/nikitabenny/friend-bet-v2/blob/main/programs/friend-bet-v2/src/lib.rs) (Program accounts), [`validator/validate.cpp`](https://github.com/nikitabenny/friend-bet-v2/blob/main/validator/validate.cpp) (Load snapshot), [`app/src/main.tsx`](https://github.com/nikitabenny/friend-bet-v2/blob/main/app/src/main.tsx) (React entry), [`app/src/App.tsx`](https://github.com/nikitabenny/friend-bet-v2/blob/main/app/src/App.tsx) (Scaffold screen)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_program["On-chain betting"]
  node_create["Create bet<br/>[lib.rs]"]
  node_accept["Accept bet<br/>[lib.rs]"]
  node_resolve["Resolve outcome<br/>[lib.rs]"]
  node_payout["Claim payout<br/>[lib.rs]"]
end

subgraph group_state["Bet state"]
  node_account_state[("Program accounts<br/>[lib.rs]")]
end

subgraph group_validation["Offline validation"]
  node_load_snapshot["Load snapshot<br/>[validate.cpp]"]
  node_invariants["Check invariants<br/>[validate.cpp]"]
  node_report["Validation result<br/>[validate.cpp]"]
end

subgraph group_client["Placeholder client"]
  node_app_entry["React entry<br/>[main.tsx]"]
  node_placeholder["Scaffold screen<br/>[App.tsx]"]
end

node_creator(("Creator"))
node_acceptor(("Counterparty"))
node_resolver(("Resolver"))
node_winner(("Winning participant"))
node_system_program["Solana system program"]
node_snapshot["JSON snapshot"]
node_browser(("Browser user"))

node_creator -->|"opens bet"| node_create
node_create -->|"creates accounts"| node_account_state
node_create -->|"transfers stake"| node_system_program
node_acceptor -->|"matches side"| node_accept
node_accept -->|"updates stake"| node_account_state
node_accept -->|"transfers stake"| node_system_program
node_resolver -->|"names winner"| node_resolve
node_resolve -->|"records outcome"| node_account_state
node_winner -->|"claims share"| node_payout
node_payout -->|"pays from vault"| node_account_state
node_snapshot -->|"reads JSON"| node_load_snapshot
node_load_snapshot -->|"checks loaded state"| node_invariants
node_invariants -->|"reports checks"| node_report
node_browser -.->|"opens app"| node_app_entry
node_app_entry -->|"renders"| node_placeholder

click node_create "https://github.com/nikitabenny/friend-bet-v2/blob/main/programs/friend-bet-v2/src/lib.rs"
click node_accept "https://github.com/nikitabenny/friend-bet-v2/blob/main/programs/friend-bet-v2/src/lib.rs"
click node_resolve "https://github.com/nikitabenny/friend-bet-v2/blob/main/programs/friend-bet-v2/src/lib.rs"
click node_payout "https://github.com/nikitabenny/friend-bet-v2/blob/main/programs/friend-bet-v2/src/lib.rs"
click node_account_state "https://github.com/nikitabenny/friend-bet-v2/blob/main/programs/friend-bet-v2/src/lib.rs"
click node_load_snapshot "https://github.com/nikitabenny/friend-bet-v2/blob/main/validator/validate.cpp"
click node_invariants "https://github.com/nikitabenny/friend-bet-v2/blob/main/validator/validate.cpp"
click node_report "https://github.com/nikitabenny/friend-bet-v2/blob/main/validator/validate.cpp"
click node_app_entry "https://github.com/nikitabenny/friend-bet-v2/blob/main/app/src/main.tsx"
click node_placeholder "https://github.com/nikitabenny/friend-bet-v2/blob/main/app/src/App.tsx"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_create,node_accept,node_resolve,node_payout,node_browser toneBlue
class node_account_state toneAmber
class node_load_snapshot,node_invariants,node_report toneMint
class node_app_entry,node_placeholder toneRose
class node_creator,node_acceptor,node_resolver,node_winner,node_system_program,node_snapshot toneIndigo
```

## Components

### On-chain betting

- [Create bet](https://github.com/nikitabenny/friend-bet-v2/blob/main/programs/friend-bet-v2/src/lib.rs): `programs/friend-bet-v2/src/lib.rs`
- [Accept bet](https://github.com/nikitabenny/friend-bet-v2/blob/main/programs/friend-bet-v2/src/lib.rs): `programs/friend-bet-v2/src/lib.rs`
- [Resolve outcome](https://github.com/nikitabenny/friend-bet-v2/blob/main/programs/friend-bet-v2/src/lib.rs): `programs/friend-bet-v2/src/lib.rs`
- [Claim payout](https://github.com/nikitabenny/friend-bet-v2/blob/main/programs/friend-bet-v2/src/lib.rs): `programs/friend-bet-v2/src/lib.rs`

### Bet state

- [Program accounts](https://github.com/nikitabenny/friend-bet-v2/blob/main/programs/friend-bet-v2/src/lib.rs): `programs/friend-bet-v2/src/lib.rs`

### Offline validation

- [Load snapshot](https://github.com/nikitabenny/friend-bet-v2/blob/main/validator/validate.cpp): `validator/validate.cpp`
- [Check invariants](https://github.com/nikitabenny/friend-bet-v2/blob/main/validator/validate.cpp): `validator/validate.cpp`
- [Validation result](https://github.com/nikitabenny/friend-bet-v2/blob/main/validator/validate.cpp): `validator/validate.cpp`

### Placeholder client

- [React entry](https://github.com/nikitabenny/friend-bet-v2/blob/main/app/src/main.tsx): `app/src/main.tsx`
- [Scaffold screen](https://github.com/nikitabenny/friend-bet-v2/blob/main/app/src/App.tsx): `app/src/App.tsx`

### Other components

- **Creator**
- **Counterparty**
- **Resolver**
- **Winning participant**
- **Solana system program**
- **JSON snapshot**
- **Browser user**

## Connections

- Creator → Create bet: opens bet (evidence: `README.md`)
- Create bet → Program accounts: creates accounts (evidence: `README.md`)
- Create bet → Solana system program: transfers stake (evidence: `programs/friend-bet-v2/src/lib.rs`)
- Counterparty → Accept bet: matches side (evidence: `README.md`)
- Accept bet → Program accounts: updates stake (evidence: `README.md`)
- Accept bet → Solana system program: transfers stake (evidence: `programs/friend-bet-v2/src/lib.rs`)
- Resolver → Resolve outcome: names winner (evidence: `README.md`)
- Resolve outcome → Program accounts: records outcome (evidence: `README.md`)
- Winning participant → Claim payout: claims share (evidence: `README.md`)
- Claim payout → Program accounts: pays from vault (evidence: `README.md`)
- JSON snapshot → Load snapshot: reads JSON (evidence: `validator/validate.cpp`)
- Load snapshot → Check invariants: checks loaded state (evidence: `validator/validate.cpp`)
- Check invariants → Validation result: reports checks (evidence: `validator/validate.cpp`)
- Browser user → React entry: opens app
- React entry → Scaffold screen: renders (evidence: `app/src/main.tsx`)
