Sol.College

Full lesson

Don-Vicks-sentinel

Real-time incident detection for Solana programs, built on Solami live data (Yellowstone gRPC, RPC, Blur, Beam, Mirage). Alerts to Slack, Telegram, PagerDuty, Discord, plus MCP agent access.

What it does

From the project README:

It runs on Solami live data (Yellowstone gRPC, RPC, Blur, Beam, Mirage) and on Vortex, my own open-source Rust library for streaming and decoding Solana transactions.
Original
Don-Vicks/sentinel
SuperStack fork
Blockchains/Don-Vicks-sentinel @ 1d19ae7
Stars
0
Last push (original)
2026-10-09
Languages
Rust, TypeScript, CSS, Shell, Dockerfile, Python
Detected stack
not detected
Categories
AI & AgentsInfrastructure & Tooling
Licence
Apache-2.0
Homepage
https://youtu.be/tk01rqkEyKs

Architecture

114 source files. By extension: .rs ×76, .tsx ×31, .ts ×6, .py ×1.

Top-level directorySource files
web37
src36
tests32
examples8
scripts1

Dapp: devnet deploy pending

⏳ Devnet deploy pending — goes live when the devnet wallet is topped up. This fork's own dapp is not deployed yet, so there is no program address or transaction to show. It is queued in dapp-queue.txt; once devnet SOL is available it is deployed, exercised with real devnet transactions, and this section switches to the live dapp at /dapps/don-vicks-sentinel/. Until then, the lesson and step-by-step guide below are complete, and you can run it locally with the commands below.

Key code, explained

Excerpts chosen automatically where the code uses the most Solana concepts, pinned to the fork's commit.

Don-Vicks/sentinel · src/squads.rs L145–168 @ 1d19ae7 · Apache-2.0 · original
        s => format!("{}d", s / 86_400),    }} /// Reads a Squads v4 `Multisig` account: discriminator, create_key, config_authority,/// threshold u16, time_lock u32, transaction_index u64, stale_transaction_index u64,/// rent_collector Option<Pubkey>, bump u8, members Vec<(Pubkey, permissions u8)>./// Returns `None` unless the layout is internally consistent, so a mistaken read is never shown.pub fn parse_multisig(data: &[u8]) -> Option<MultisigInfo> {    let mut at = 8 + 32 + 32;    let threshold = u16::from_le_bytes(data.get(at..at + 2)?.try_into().ok()?);    at += 2;    let time_lock = u32::from_le_bytes(data.get(at..at + 4)?.try_into().ok()?);    at += 4 + 8 + 8;    let collector = *data.get(at)?;    at += 1 + if collector == 1 { 32 } else { 0 };    if collector > 1 {        return None;    }    at += 1; // bump    let len = u32::from_le_bytes(data.get(at..at + 4)?.try_into().ok()?) as usize;    at += 4;    let end = at.checked_add(len.checked_mul(33)?)?;    if data.len() < end || len == 0 || len > 65_535 || threshold == 0 || threshold as usize > len {
  1. Line 151 /// rent_collector Option<Pubkey>, bump u8, members Vec<(Pubkey, permissions u8)>.: Uses the bump seed, the extra byte that pushes the derived address off the ed25519 curve.
  2. Line 167 let end = at.checked_add(len.checked_mul(33)?)?;: Uses checked arithmetic so overflow fails instead of wrapping.

How to run, build and test

These commands come from the repo's own manifests (package.json scripts, Anchor.toml, Cargo, go.mod, Makefile). Check the README for prerequisites and environment variables.

DirectoryCommandRuns
webnpm run devvite
webnpm run buildtsc -b && vite build
.cargo buildRust workspace build
.cargo testRust tests

What you could build from it