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 directory | Source files |
|---|---|
web | 37 |
src | 36 |
tests | 32 |
examples | 8 |
scripts | 1 |
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.
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 {- 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. - 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.
| Directory | Command | Runs |
|---|---|---|
web | npm run dev | vite |
web | npm run build | tsc -b && vite build |
. | cargo build | Rust workspace build |
. | cargo test | Rust tests |
What you could build from it
- Fork the SuperStack copy and extend it within the AI & Agents gaps listed on the idea page.
- Learn the pattern first: Building and sending transactions from a client