Skip to content

Commit dce6af9

Browse files
committed
readme + screenshots para la versión pública
1 parent e809454 commit dce6af9

7 files changed

Lines changed: 114 additions & 52 deletions

File tree

.gitignore

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ npm-debug.log*
3030
pnpm-debug.log*
3131

3232
# test artifacts (3rd-party CRX bundles, screenshots, generated wallets, profiles)
33+
34+
# Out of the public repo
3335
apps/extension/test/real-wallets/
34-
apps/extension/test/screenshots/
35-
apps/extension/test/wallet.json
3636
apps/extension/test/.seeded-phantom-profile/
37+
apps/extension/test/wallet.json

README.md

Lines changed: 111 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,145 @@
11
# SolShield
22

3-
Pre-signature transaction analysis for Solana. Intercepts unsigned transactions, decides if they are safe to sign, and surfaces a verdict the wallet can render before the user approves.
3+
Una extensión de Chrome que mira lo que tu wallet va a firmar y te avisa si parece estafa. Antes de que toques "Confirmar".
44

5-
Blockaid and Blowfish already occupy this space. Both are closed, pay-walled, and scoped to what their vendors choose to cover. SolShield is the open reference implementation the ecosystem should have shipped two years ago.
5+
Funciona con Phantom, Solflare, Backpack, Glow, Trust y Coin98.
66

7-
> Active development. Not production-ready. Public APIs and data schemas will break until 1.0.
7+
![overlay bloqueando un drainer](screenshots/01-overlay-suspicious.png)
88

9-
## Threat model
9+
## Por qué hice esto
1010

11-
The wallet layer on Solana is thin. When the user clicks *approve*, the signature authorizes the requested operation with almost no in-context explanation. SolShield sits between the dApp and the signature, takes the serialized transaction, and answers a single question: **is this safe to sign?**
11+
Llevo un año en Solana y ya he visto de todo. Un amigo perdió como mil quinientos dólares firmando un mensaje de "Sign in" en una página falsa de Magic Eden. El mensaje en realidad no era un login, era un permit para que un drainer le moviera todos los tokens. Otro firmó algo "para reclamar un airdrop" y al día siguiente no tenía SOL.
1212

13-
Inspection runs in four passes, cheap to expensive:
13+
Existen Blockaid y Blowfish que hacen algo parecido y son buenos. El problema es que son cerrados, son pagos, y solo te enteras de cómo funcionan si firmás un contrato comercial con ellos. Yo quería algo donde pudiera ver cada regla y cada prompt. Algo que cualquiera pudiera correr en su propio servidor sin pedir permiso.
1414

15-
1. **Static analysis.** Instruction decoding, known-bad program IDs, unlimited-approval anti-patterns, silent mint/freeze authority swaps, squatted token metadata, CPI guard violations.
16-
2. **Dynamic simulation.** Execute against forked mainnet state. Diff balances, token ownership, and account authorities. Catch hidden transfers and delegated authority the static pass missed.
17-
3. **Heuristic and ML classification.** Claude Haiku 4.5 for triage, Claude Opus 4.7 for deep reasoning on ambiguous cases. Prompts, few-shots, and the curated threat corpus all live in-tree — nothing is hidden in a remote config.
18-
4. **Reputation.** Program, signer, and destination history via Helius and on-chain feeds.
15+
Así que lo armé.
1916

20-
The output is bounded: a numerical risk score, a categorical verdict (`safe | suspicious | danger`), and a human-readable reason ready to drop into a wallet modal.
17+
## Qué hace exactamente
2118

22-
## Attack surface it covers
19+
Cuando una página te pide firmar algo en tu wallet:
2320

24-
- Drainer programs and their obfuscated variants
25-
- Malicious token approvals and unlimited delegations
26-
- Hidden SOL/SPL transfers camouflaged inside legitimate-looking instructions
27-
- Authority swaps (mint, freeze, upgrade)
28-
- Squatted token metadata impersonating reputable mints
29-
- Compromised IDL payloads served through dApp frontends
30-
- Suspicious program deployments masquerading as known protocols
21+
1. SolShield se mete entre la página y tu wallet, y agarra la solicitud antes de que tu wallet la vea.
22+
2. Le pasa los bytes a Claude (sí, el de Anthropic) más 23 reglas escritas a mano que detectan patrones típicos de drainers.
23+
3. Te muestra un cartel con el resultado en lenguaje normal: "esto es seguro", "ojo, esto huele raro", o "no firmes esto, te van a vaciar la wallet".
24+
4. Vos decidís. Si decís que no, tu wallet ni se entera de que alguien intentó.
3125

32-
What it deliberately does **not** do: trade execution guidance, price-impact warnings, MEV routing. Different tool, different problem.
26+
Se ve así cuando algo es sospechoso:
3327

34-
## Repository layout
28+
![overlay con verdict suspicious y explicación](screenshots/01-overlay-suspicious.png)
29+
30+
Si clickeás "REJECT", la transacción se cancela ahí mismo. Phantom o Solflare ni siquiera abren su popup pidiéndote confirmación:
31+
32+
![overlay después de rechazar](screenshots/02-overlay-rejected.png)
33+
34+
## Un ejemplo concreto para que se entienda
35+
36+
Imaginá que entrás a una página que parece Magic Eden pero en realidad es `magiceden-airdrop.fake`. Te pide que firmes un mensaje que dice algo así:
3537

3638
```
37-
packages/core Rule engine, instruction parser, policy types
38-
packages/ai Anthropic-backed analysis layer (Haiku + Opus)
39-
packages/sdk Client library for wallets and dApps
40-
apps/web Dashboard, live demo, public threat feed
39+
phishing.com wants you to sign in with your Solana account:
40+
41+
Welcome! Sign to verify ownership.
4142
```
4243

43-
Strict TypeScript, pnpm workspaces, `@solana/kit` (not the retired web3.js v1), Prisma + Postgres, Redis. Docker Compose for local development, the same containers in production.
44+
A primera vista parece un login normal. Pero ese mensaje, una vez firmado, le da al atacante una firma criptográfica que puede usar en otra página. Es lo que se llama "spoofed SIWS domain" — el mensaje dice ser de un dominio (`phishing.com`) pero la página que lo pide es otra (`magiceden-airdrop.fake`).
45+
46+
SolShield ve que el dominio del mensaje no coincide con dónde estás y lo marca como peligro nivel 90/100. Claude te explica en una frase:
47+
48+
> "Este mensaje dice ser de phishing.com pero te lo está pidiendo magiceden-airdrop.fake — un ataque clásico de suplantación de dominio. Si firmás, podrían usar tu identidad o vaciar tu wallet."
49+
50+
Y listo. Vos clickeás Reject y nunca pasó nada.
51+
52+
## Cómo se ve en magiceden de verdad
53+
54+
Esto es una sesión real con la extensión instalada, navegando a Magic Eden auténtico:
55+
56+
![magiceden con SolShield](screenshots/03-magiceden-blocked.png)
57+
58+
Cuando Magic Eden te pide firmar el SIWS para login (que es legítimo), SolShield revisa el mensaje, lo marca como `safe`, y no muestra nada. No te molesta cuando todo está bien. Si el mensaje en cambio tuviera un dominio raro o un patrón de permit con cantidades, ahí sí te frenaría.
59+
60+
## Y para cuando el wallet abre su popup gigante
61+
62+
Phantom abre una pestaña entera ocupando toda la pantalla cuando le pedís confirmar. Si nuestro cartel quedara escondido detrás, no servíamos para nada. Por eso SolShield abre TAMBIÉN una ventana del navegador separada, fuera del DOM de la página, para que la veas seguro:
63+
64+
![ventana popup de SolShield](screenshots/04-popup-window.png)
65+
66+
Esa ventana tiene un botón "VOLVER A LA PESTAÑA Y DECIDIR" que te lleva de vuelta donde está el overlay. Es defensa en cuatro capas: el cartel en la página, una notificación del sistema operativo, un punto rojo en el icono de la extensión, y esta ventana popup. Una de las cuatro siempre la ves, importa qué tan ocupado tengas Chrome.
4467

45-
## Running locally
68+
## La página
4669

47-
Prereqs: Node 22+, pnpm 10+, Docker.
70+
`https://solshield.dev`
71+
72+
![landing](screenshots/05-landing.png)
73+
74+
## Cómo funciona por dentro
75+
76+
Tres pedazos:
77+
78+
**La extensión** (`apps/extension`)
79+
Lo que se instala en Chrome. Tiene dos scripts que se inyectan en cada página: uno se mete entre tu wallet y la página para interceptar las llamadas, y otro se encarga de mostrar los carteles. Hecha con React + Plasmo.
80+
81+
**El servidor** (`apps/web`)
82+
Una API en Next.js que recibe la transacción o el mensaje, le pasa 23 reglas determinísticas (cosas tipo "este programa está en lista negra" o "este mensaje contiene una URL sospechosa"), y si algo se ve raro, le pregunta a Claude para que explique en lenguaje natural qué pasa. Está corriendo en un servidor mío en Hetzner.
83+
84+
**Las reglas y los prompts** (`packages/core`, `packages/ai`)
85+
Archivos de texto cualquiera puede leer en GitHub. Si te parece que falta una regla o el prompt de Claude se puede mejorar, mandá un PR. Nada está oculto.
86+
87+
## Por qué Claude
88+
89+
Probé varios modelos. Claude Haiku 4.5 me da respuestas claras y cortas en menos de un segundo, y cuesta como $0.001 por análisis. Cuando una transacción es muy ambigua, escala a Claude Opus 4.7 que es más lento pero analiza instrucción por instrucción.
90+
91+
Los créditos los pago yo. Por ahora cubrimos todo desde el servidor, no necesitas tu propia API key — instalas la extensión y listo. Si la cosa crece y se queda corto, ya veré. Si querés correrlo en tu propio servidor con tu key, también podés (`docker compose up`).
92+
93+
## Instalación
94+
95+
Por ahora no está en la Chrome Web Store (la voy a subir cuando esté más estable). Mientras tanto:
4896

4997
```bash
98+
git clone https://github.com/ivaldepablo/solshield
99+
cd solshield
50100
pnpm install
51-
cp .env.example .env # HELIUS_API_KEY, ANTHROPIC_API_KEY
52-
docker compose up -d # postgres + redis
53-
pnpm -F web dev
101+
pnpm -F @solshield/extension build
54102
```
55103

56-
## Roadmap
104+
Después en Chrome:
105+
106+
1. Andá a `chrome://extensions`
107+
2. Activá "Developer mode" arriba a la derecha
108+
3. Click en "Load unpacked"
109+
4. Seleccioná la carpeta `apps/extension/build/chrome-mv3-prod`
110+
111+
Ya deberías ver el icono de SolShield en la toolbar.
112+
113+
## Wallets que funcionan
114+
115+
Probadas con cuentas reales en Solana mainnet:
57116

58-
- [x] Monorepo scaffold
59-
- [ ] Instruction decoder on top of `@solana/kit`
60-
- [ ] Static rule set — the top 20 drainer patterns at minimum
61-
- [ ] Forked-mainnet simulator with balance/ownership diffing
62-
- [ ] AI layer — Haiku 4.5 triage + Opus 4.7 deep reasoning
63-
- [ ] `@solshield/sdk` published to npm
64-
- [ ] Wallet integrations — Phantom, Solflare, Backpack
65-
- [ ] Public threat feed with signed, timestamped incidents
66-
- [ ] Third-party security audit before 1.0
117+
- Phantom
118+
- Solflare
119+
- Backpack
120+
- Glow
121+
- Trust
122+
- Coin98
67123

68-
## Security
124+
También funciona con cualquier wallet que implemente el estándar wallet-standard.
69125

70-
SolShield is security-critical software. If you think you have found a vulnerability, do **not** open a public issue. Read [`SECURITY.md`](./SECURITY.md) for the disclosure path.
126+
## Lo que falta
71127

72-
Nothing here is a substitute for reviewing transactions yourself. SolShield reduces risk. It does not eliminate it.
128+
Cosas pendientes que voy haciendo cuando tengo tiempo:
73129

74-
## Contributing
130+
- Subirla a la Chrome Web Store
131+
- Detectar tokens clonados de Pump.fun (cuando un token gradúa, hay una ventana de minutos donde alguien puede crear uno con el mismo nombre en Raydium para confundir y cazar gente que compra rápido)
132+
- Soporte para Firefox
133+
- Mejor UX cuando Phantom abre su pestaña full-screen y te roba el foco
134+
- Más reglas a medida que aparezcan drainers nuevos
75135

76-
[`CONTRIBUTING.md`](./CONTRIBUTING.md). Rule submissions are especially welcome — a new drainer pattern the same day it hits mainnet is worth more than any feature.
136+
Si tenés ideas, abrí un issue. Si encontrás un bypass — que SolShield no detecte algo malicioso que debería — eso es lo más útil que podés reportar.
77137

78-
## License
138+
## Contacto
79139

80-
Apache 2.0. See [`LICENSE`](./LICENSE).
140+
- Mail: hi@solshield.dev
141+
- GitHub: [@ivaldepablo](https://github.com/ivaldepablo)
81142

82-
---
143+
## Licencia
83144

84-
Maintained by [@0xnullpavel](https://github.com/0xnullpavel). Reachable through GitHub issues or `security@solshield.dev` for sensitive reports.
145+
MIT. Hacé lo que quieras con esto, fork it, mejoralo, vendelo. Solo no te hagas pasar por mí.
57.4 KB
Loading
33.1 KB
Loading
507 KB
Loading

screenshots/04-popup-window.png

99.5 KB
Loading

screenshots/05-landing.png

159 KB
Loading

0 commit comments

Comments
 (0)