
Использование @charmbracelet для создания стильного браузера Ethereum
A beautiful, terminal-based Ethereum wallet and smart contract browser built for sovereignty, security, and style.
━━━━━━━━━━━━━━━━━━━━
domestic system
━━━━━━━━━━━━━━━━━━━━

The Domestic System — это терминальный пользовательский интерфейс (TUI), предназначенный для просмотра аккаунтов и смарт-контрактов Ethereum (EVM). Он объединяет три основных принципа, которые делают взаимодействие с блокчейном в терминале не просто практичным, но и предпочтительным.
Только на стороне клиента. Никаких централизованных серверов. Только вы и блокчейн.
The Domestic System подключается напрямую к выбранным вами RPC-конечным точкам Ethereum. Никаких посредников. Никакой аналитики. Никакого отслеживания. Ваше взаимодействие с блокчейном является прямым и неопосредованным. Именно так должна работать Web3.
Без управления приватными ключами. Готовность к аппаратным кошелькам.
Ваши приватные ключи никогда не попадают в это приложение. Все транзакции генерируются в виде QR-кодов в соответствии с EIP-4527, специально разработанных для подписания с помощью аппаратных кошельков. Просматривайте аккаунты, подготавливайте транзакции и подписывайте их безопасно на вашем аппаратном кошельке.
Сделано с Charm.sh. Терминальные интерфейсы, выполненные с изяществом.
Используя великолепную экосистему Charm.land (Bubble Tea, Lip Gloss, Huh), The Domestic System доказывает, что CLI не обязаны быть строгими. Насыщенные цвета, плавные взаимодействия и продуманный дизайн интерфейса привносят ретро-футуристическую эстетику во взаимодействие с блокчейном.
Эти три принципа — суверенитет, безопасность и эстетика — идеально сходятся в терминале. Терминальные приложения:
The Domestic System занимает уникальное пересечение нишевых сценариев использования, обслуживая тех, кто ценит контроль, безопасность и мастерство исполнения.
git clone https://github.com/yourusername/domestic-system.git
cd domestic-system
go build
go run .
The Domestic System хранит свою конфигурацию в ~/.charm-wallet-config.json.
Добавляйте RPC-конечные точки Ethereum на странице настроек "s" или с помощью переменной окружения ETH_RPC_URL:
export ETH_RPC_URL="https://eth.llamarpc.com"
go run .
Настройте отображаемые ERC-20 токены, отредактировав список токенов в main.go (настройка через интерфейс появится позже).
x на странице Accounts): Управление ключами подписания, сканирование QR-кодов EIP-4527 через веб-камеру и подписание транзакцийa, чтобы добавить новый кошелекАктивный аккаунт (отмечен ★) определяет, какой кошелек используется для транзакций. Чтобы переключить аккаунт:
Также можно перейти на страницу Wallets и нажать Enter на любом кошельке для просмотра его деталей и активации.
The Domestic System включает полный рабочий процесс подписания транзакций EIP-4527, который можно использовать как внутри TUI, так и независимо в терминале.
TUI (любая страница) → упаковывает неподписанную транзакцию → отображает QR-код EIP-4527
↓
Страница Signer сканирует QR через веб-камеру
↓
Декодирует UR → подписывает сохранённым ключом
↓
Отображает сырую подписанную транзакцию в hex
Ключи хранятся в ~/.charm-wallet-private-keys.json (режим доступа 600, вне репозитория). При первом запуске автоматически создаётся демо-ключ NotForProduction, его адрес регистрируется в ~/.charm-wallet-config.json.
{
"private_keys": [
{
"address": "0x29c73B201bEE86C4d1Fe4f598C4355Bb210251e3",
"name": "NotForProduction",
"private_key": "0xc0054..."
}
]
}
Нажмите x на странице Accounts, чтобы открыть Signer. В нём:
Подписанная транзакция (сырой hex, хэш tx, r/s/v) отображается сразу после сканирования.
signer/eth_signer.py)Python-подписыватель работает независимо от TUI. Установите зависимости один раз:
pip install -r requirements.txt
Весь вывод в формате JSON. Режим --scan открывает окно OpenCV с потоком видеокамеры и выводит подписанные транзакции в stdout по мере их обнаружения.
cmd/txtest)Проверяет полный цикл упаковки → декодирования → подписания, используя Go-модули напрямую:
# Офлайн (жёстко заданные тестовые параметры — RPC не требуется)
go run ./cmd/txtest
# С живыми значениями nonce/gasPrice/chainId от RPC-узла
go run ./cmd/txtest --rpc https://eth.llamarpc.com
# Свой получатель и сумма
go run ./cmd/txtest --to 0xYourAddr --value 0.5 --chainid 11155111
Вывод показывает оба этапа:
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 # для http
ssh -N -L 8546:localhost:8546 user@node_machine_ip_address # для ws (websocket)
Теперь ваше приложение на рабочей машине может обращаться к RPC узла Ethereum через 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 \ #или ws://mainnet.infura.io/ws/v3/YOUR_KEY
-poolmanager 0x000000000004444c5dc75cB358380D2e3dE08A90
-from 21688000
domestic-system/
├── main.go # Точка входа — запускает программу Bubble Tea
├── model.go # Структура состояния приложения + Init()
├── update.go # Все обработчики сообщений Update()
├── view.go # Главная диспетчеризация View()
├── cmd/
│ ├── txtest/ # Сквозной тест упаковки → подписания (CLI)
│ └── v4listener/ # Автономный прослушиватель событий Uniswap V4
├── config/ # Загрузка/сохранение JSON-конфигурации, определения типов
├── helpers/ # Разрешение ENS, форматирование адресов, Uniswap V2/V4
├── rpc/ # RPC-клиент Ethereum, упаковка транзакций EIP-4527
├── signer/
│ ├── signer.go # Go-пакет: управление ключами, декодирование EIP-4527, ECDSA-подпись
│ └── eth_signer.py # Автономный Python CLI (та же функциональность)
├── styles/ # Цвета Lip Gloss и общие стили
├── views/ # Отрисовщики страниц
│ ├── wallets/
│ ├── details/
│ ├── settings/
│ ├── dapps/
│ ├── uniswap/
│ ├── terra/
│ └── signer/ # Отрисовщик страницы Signer
└── webcam/ # Захват с камеры и полублочный рендеринг видео
# Тесты пакета RPC (требуется RPC-узел)
ETH_RPC_URL="https://eth.llamarpc.com" go test ./rpc -v
# Все тесты
go test ./... -v
Вклад приветствуется! Этот проект ценит:
Пожалуйста, перед началом крупной работы откройте issue.
MIT License — подробности в файле LICENSE
Создано с помощью:
Вдохновлено идеей самосуверенности и эстетикой ретро-вычислений.
The Domestic System: Ваш терминал, ваши ключи, ваш блокчейн.
| Клавиша | Действие |
|---|
↑/↓ | Выбор ключа подписания |
s | Открыть веб-камеру — автоматически подписывает первый обнаруженный QR EIP-4527 |
a | Перезагрузить ключи с диска |
c | Очистить текущий результат |
Esc | Вернуться к Accounts |
| Команда | Описание |
|---|
python signer/eth_signer.py --generate-keys | Сгенерировать новую ECDSA-пару ключей |
python signer/eth_signer.py --derive-address 0x... | Получить адрес из приватного ключа |
python signer/eth_signer.py --private-key 0x... --to 0x... --value 1000000000000000000 | Подписать транзакцию |
python signer/eth_signer.py --scan | Сканирование через веб-камеру: обнаружение и подписание QR-кодов EIP-4527 |
python signer/eth_signer.py --add-key --private-key 0x... --name "Wallet" | Добавить ключ в хранилище |
python signer/eth_signer.py --list-keys | Вывести список сохранённых адресов |