
Usando @charmbracelet para crear un navegador de Ethereum con estilo
Una hermosa billetera Ethereum y navegador de contratos inteligentes basado en terminal, construido para soberanía, seguridad y estilo.
━━━━━━━━━━━━━━━━━━━━
domestic system
━━━━━━━━━━━━━━━━━━━━

The Domestic System es una interfaz de usuario de terminal (TUI) diseñada para navegar cuentas y contratos inteligentes de Ethereum (EVM). Reúne tres principios fundamentales que hacen que la interacción con la cadena de bloques desde la terminal no solo sea práctica, sino preferible.
Solo del lado del cliente. Sin servidores centralizados. Solo tú y la cadena de bloques.
The Domestic System se conecta directamente a los endpoints RPC de Ethereum que elijas. Sin intermediarios. Sin analíticas. Sin seguimiento. Tu interacción con la cadena de bloques es directa y sin mediación. Así es como se suponía que funcionara Web3.
Sin administración de claves privadas. Listo para billetera hardware.
Tus claves privadas nunca tocan esta aplicación. Todas las transacciones se generan como códigos QR según EIP-4527, diseñados específicamente para firmar con dispositivos de billetera hardware. Visualiza tus cuentas, prepara transacciones y fírmalas de forma segura en tu billetera hardware.
Construido con Charm.sh. Interfaces de terminal, bellamente realizadas.
Usando el magnífico ecosistema Charm.land (Bubble Tea, Lip Gloss, Huh), The Domestic System demuestra que las CLIs no tienen por qué ser austeras. Colores vibrantes, interacciones suaves y un diseño de interfaz reflexivo aportan una estética retrofuturista a la interacción con la cadena de bloques.
Estos tres principios—soberanía, seguridad y estética—convergen perfectamente en la terminal. Las aplicaciones de terminal son:
The Domestic System ocupa una intersección única de casos de uso nicho, sirviendo a aquellos que valoran el control, la seguridad y la artesanía.
git clone https://github.com/yourusername/domestic-system.git
cd domestic-system
go build
go run .
The Domestic System almacena su configuración en ~/.charm-wallet-config.json.
Añade endpoints RPC de Ethereum en la página de configuración "s" o configurando la variable de entorno ETH_RPC_URL:
export ETH_RPC_URL="https://eth.llamarpc.com"
go run .
Personaliza qué tokens ERC-20 mostrar editando la lista de seguimiento de tokens en main.go (próximamente configuración desde la interfaz de usuario).
x desde Cuentas): Gestiona claves de firma, escanea códigos QR EIP-4527 a través de la cámara web y firma transaccionesa para añadir una nueva billeteraLa cuenta activa (marcada con ★) determina qué billetera se usa para las transacciones. Para cambiar de cuenta:
Alternativamente, navega a la página de Billeteras y presiona Enter en cualquier billetera para ver sus detalles y activarla.
The Domestic System incluye un flujo de trabajo completo de firma de transacciones EIP-4527 utilizable tanto dentro de la TUI como de forma independiente desde la terminal.
TUI (cualquier página) → empaqueta tx sin firmar → muestra código QR EIP-4527
↓
La página Firmante escanea el QR con la cámara web
↓
Decodifica UR → firma con la clave almacenada
↓
Muestra el hex de la transacción firmada en bruto
Las claves se almacenan en ~/.charm-wallet-private-keys.json (modo 600, fuera del repositorio). En la primera ejecución, una clave de demostración NotForProduction se inicializa automáticamente y su dirección se registra en ~/.charm-wallet-config.json.
{
"private_keys": [
{
"address": "0x29c73B201bEE86C4d1Fe4f598C4355Bb210251e3",
"name": "NotForProduction",
"private_key": "0xc0054..."
}
]
}
Presiona x desde la página de Cuentas para abrir el Firmante. Desde allí:
La transacción firmada (hex en bruto, hash de la tx, r/s/v) se muestra inmediatamente después del escaneo.
signer/eth_signer.py)El firmante Python se ejecuta de forma independiente sin la TUI. Instala las dependencias una vez:
pip install -r requirements.txt
Toda la salida es JSON. El modo --scan abre una ventana OpenCV que muestra la transmisión en vivo de la cámara y emite las transacciones firmadas a stdout a medida que se detectan.
cmd/txtest)Ejercita el ciclo completo empaquetar → decodificar → firmar usando los módulos Go directamente:
# Fuera de línea (parámetros de prueba codificados — no se necesita RPC)
go run ./cmd/txtest
# Con nonce/gasPrice/chainId en vivo desde un endpoint RPC
go run ./cmd/txtest --rpc https://eth.llamarpc.com
# Destinatario y cantidad personalizados
go run ./cmd/txtest --to 0xYourAddr --value 0.5 --chainid 11155111
La salida muestra ambos pasos claramente:
STEP 1 — Pack unsigned transaction (EIP-4527)
─────────────────────────────────────────────
Transaction fields: { "from": "0x29c7...", "to": "0xd8dA...", ... }
UR: ur:eth-sign-request/onadtpdagd...
STEP 2 — Decode + sign with stored key
───────────────────────────────────────
Decoded transaction: { "from": "0x29c7...", "value": "0.001000 ETH", ... }
Signed transaction: { "txHash": "0x5989...", "raw_transaction": "0xf86b...", ... }
✓ Round-trip complete
ss -ntlp | grep 8545
ssh -N -L 8545:localhost:8545 user@node_machine_ip_address #para http
ssh -N -L 8546:localhost:8546 user@node_machine_ip_address #para ws websocket
Tu aplicación, ejecutándose en la máquina de la aplicación, ahora puede acceder al RPC del nodo Ethereum a través de http://localhost:8545
go run helpers/uniswap_v4_listener.go -ws -poolmanager
[-from ]go run ./cmd/v4listener
-ws ws://localhost:8546
-poolmanager 0x000000000004444c5dc75cB358380D2e3dE08A90
go run ./cmd/v4listener
-ws ws://localhost:8546 \ #o ws://mainnet.infura.io/ws/v3/YOUR_KEY
-poolmanager 0x000000000004444c5dc75cB358380D2e3dE08A90
-from 21688000
domestic-system/
├── main.go # Punto de entrada — conecta el programa Bubble Tea
├── model.go # Estructura del estado de la aplicación + Init()
├── update.go # Todos los manejadores de mensajes Update()
├── view.go # Despacho View() de nivel superior
├── cmd/
│ ├── txtest/ # CLI de prueba de empaquetado → firma de extremo a extremo
│ └── v4listener/ # Oyente de eventos Uniswap V4 independiente
├── config/ # Carga/guardado de configuración JSON, definiciones de tipos
├── helpers/ # Resolución ENS, formateo de direcciones, Uniswap V2/V4
├── rpc/ # Cliente RPC de Ethereum, empaquetado de transacciones EIP-4527
├── signer/
│ ├── signer.go # Paquete Go: gestión de claves, decodificación EIP-4527, firma ECDSA
│ └── eth_signer.py # CLI Python independiente (misma funcionalidad)
├── styles/ # Colores Lip Gloss y estilos compartidos
├── views/ # Renderizadores por página
│ ├── wallets/
│ ├── details/
│ ├── settings/
│ ├── dapps/
│ ├── uniswap/
│ ├── terra/
│ └── signer/ # Renderizador de la página Firmante
└── webcam/ # Captura de cámara y renderizado de video de medio bloque
# Pruebas del paquete RPC (requiere endpoint RPC)
ETH_RPC_URL="https://eth.llamarpc.com" go test ./rpc -v
# Todas las pruebas
go test ./... -v
¡Las contribuciones son bienvenidas! Este proyecto valora:
Por favor, abre un issue antes de comenzar un trabajo importante.
Licencia MIT - Consulta el archivo LICENSE para más detalles
Construido con:
Inspirado en el ethos de la autosoberanía y la estética de la retroinformática.
The Domestic System: Tu terminal, tus claves, tu cadena de bloques.
| Tecla | Acción |
|---|
↑/↓ | Seleccionar clave de firma |
s | Abrir cámara web — firma automáticamente el primer código QR EIP-4527 detectado |
a | Recargar claves desde el disco |
c | Limpiar el resultado actual |
Esc | Volver a Cuentas |
| Comando | Descripción |
|---|
python signer/eth_signer.py --generate-keys | Generar un nuevo par de claves ECDSA |
python signer/eth_signer.py --derive-address 0x... | Derivar dirección a partir de la clave privada |
python signer/eth_signer.py --private-key 0x... --to 0x... --value 1000000000000000000 | Firmar una transacción |
python signer/eth_signer.py --scan | Escaneo con cámara web: detectar y firmar códigos QR EIP-4527 |
python signer/eth_signer.py --add-key --private-key 0x... --name "Wallet" | Añadir una clave al almacén |
python signer/eth_signer.py --list-keys | Listar direcciones almacenadas |