Skip to content

Repository files navigation

⬡ DeFi Platform

Децентрализованная финансовая платформа с KYC верификацией, self-custody кошельками, ERC-20 токенами, приватным мессенджером и графом кошельков.

StatusTestsStack


Стек

СлойТехнология
BackendFastAPI + PostgreSQL + Redis
AuthJWT (access + refresh) + bcrypt
BlockchainSolidity ERC-20 + Hardhat + web3.py
EmailResend API
FrontendReact + Vite + Axios
ProxyNginx
Dev окружениеDocker Compose
Тестыpytest — 26 тестов

Установка — Windows 11 + WSL2

1. Установи WSL2 и Ubuntu

# В PowerShell от администратора:
wsl --install -d Ubuntu

Перезагрузи ПК. После перезагрузки откроется Ubuntu — задай username и password.

2. Установи Docker Desktop

Скачай с docker.com/products/docker-desktop.

После установки: Docker Desktop → Settings → Resources → WSL Integration → включи Ubuntu → Apply & Restart.

Проверь:

docker --version
docker compose version

3. Установи Node.js внутри WSL2

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs git
node --version # должно быть v20+

4. Клонируй проект

# Работай только в home директории WSL2, НЕ в /mnt/c/...cd~
mkdir -p projects &&cd projects
git clone https://github.com/ultor-dev/defi-platform.git
cd defi-platform

⚠️ Никогда не работай через /mnt/c/... — файловая система Windows в 10x медленнее из WSL2.

5. Открой в VS Code

code .

Установка — Linux / macOS

# Ubuntu/Debian:
sudo apt update && sudo apt install -y git curl
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER&& newgrp docker
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
# macOS:
brew install node git
# Docker Desktop: скачай с docker.com# Клонируй:cd~&& mkdir -p projects &&cd projects
git clone https://github.com/ultor-dev/defi-platform.git
cd defi-platform

Быстрый старт

1. Настрой .env

cp .env.example .env

Сгенерируй ключи:

# SECRET_KEY:
openssl rand -hex 32
# ENCRYPTION_KEY:
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"

Заполни .env:

nano .env

Обязательные поля:

SECRET_KEY=<результат openssl rand -hex 32>ENCRYPTION_KEY=<результат python3 команды выше>RESEND_API_KEY=re_xxxxxxxx# получить на resend.com (бесплатно)EMAIL_FROM=noreply@yourdomain.com

TOKEN_CONTRACT_ADDRESS оставь пустым — заполнится на шаге 3.

2. Запусти сервисы

bash scripts/dev.sh up

Первый запуск занимает 3–5 минут.

3. Задеплой смарт-контракт

docker compose exec hardhat sh
npx hardhat compile
npx hardhat run scripts/deploy.js --network localhost
exit

Вывод:

✅ DeFiPlatformToken deployed to: 0x5FC8d32690cc91D4c39d9d3abcBD16989F875707
👉 Добавь в .env:
TOKEN_CONTRACT_ADDRESS=0x5FC8d32690cc91D4c39d9d3abcBD16989F875707

Скопируй адрес в .env, перезапусти backend:

docker compose restart backend

4. Запусти фронтенд

cd frontend
npm install
npm run dev -- --host

Открой в браузере: http://localhost:5173

5. Проверь

bash scripts/dev.sh test-api
# Swagger UI: http://localhost:8000/docs

Структура проекта

defi-platform/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI entry point, CORS, lifespan
│ │ ├── core/
│ │ │ ├── config.py # Настройки (pydantic-settings)
│ │ │ ├── database.py # SQLAlchemy async engine
│ │ │ └── security.py # JWT, bcrypt, role guards
│ │ ├── models/
│ │ │ ├── user.py # User, Profile, Wallet + generate_uid()
│ │ │ ├── kyc.py # KYCApplication, KYCStatus
│ │ │ ├── transaction.py # Transaction, TransactionType
│ │ │ ├── notification.py # Notification, NotificationType
│ │ │ ├── message.py # Conversation, Message
│ │ │ └── token.py # UserToken (email verify, reset)
│ │ ├── schemas/
│ │ │ └── user.py # UserOut, WalletOut, ProfileOut и др.
│ │ ├── services/
│ │ │ ├── wallet_service.py # generate_wallet(), Fernet encrypt/decrypt
│ │ │ ├── blockchain_service.py # web3.py: балансы, mint, transfer
│ │ │ ├── chat_service.py # WebSocket ConnectionManager
│ │ │ └── email_service.py # Resend: verify + reset password
│ │ ├── utils/
│ │ │ ├── wallet.py # get_primary_wallet() — без дублирования
│ │ │ └── user.py # get_user_with_relations()
│ │ └── api/v1/endpoints/
│ │ ├── auth.py # register, login, refresh, /me
│ │ ├── auth_email.py # forgot/reset password, verify email
│ │ ├── kyc.py # submit, status, history
│ │ ├── wallet.py # все операции с кошельками
│ │ ├── profile.py # GET/PATCH профиля
│ │ ├── chat.py # WebSocket + REST
│ │ └── admin.py # stats, users, KYC review, network graph
│ └── tests/ # 26 pytest тестов
├── contracts/
│ ├── contracts/DeFiPlatformToken.sol # ERC-20: mint, burn, transfer
│ └── scripts/deploy.js
├── frontend/
│ └── src/
│ ├── api.js # axios + JWT interceptor + error normalizer
│ ├── App.jsx # все роуты
│ ├── components/Navbar.jsx
│ └── pages/
│ ├── Login.jsx
│ ├── Register.jsx
│ ├── Dashboard.jsx # профиль + мульти-кошельки + балансы
│ ├── KYC.jsx # форма + статус + история заявок
│ ├── Chat.jsx # личный мессенджер (WebSocket)
│ ├── Admin.jsx # панель администратора
│ ├── Graph.jsx # d3.js граф кошельков
│ ├── ForgotPassword.jsx
│ ├── ResetPassword.jsx
│ └── VerifyEmail.jsx
├── nginx/nginx.conf
├── scripts/
│ ├── dev.sh # команды разработки
│ └── send_eth.sh # отправка тестового ETH
├── docker-compose.yml
├── .env # не в git!
└── .env.example

Схема БД

ТаблицаНазначение
usersАккаунты: uid, email, username, role, is_active
profilesЛичные данные: bio, avatar, country, phone, telegram
walletsКошельки (несколько на юзера): address, label, is_primary
kyc_applicationsИстория KYC заявок с reviewer и rejection_reason
transactionsИстория переводов: from/to wallet, tx_hash, amount
notificationsУведомления с типами и action_url
conversationsДиалоги в мессенджере
messagesСообщения (encrypted_content)
user_tokensТокены для email verify и password reset

Роли пользователей

РольКак получитьПрава
UNVERIFIEDРегистрацияПрофиль, кошелёк, чат
USERKYC одобрен+ Баланс, трансфер токенов, экспорт ключа
ADMINЧерез psqlВсё + Admin Panel

Стать админом

docker compose exec db psql -U defi -d defidb -c \
"UPDATE users SET role='ADMIN', email_verified=true WHERE username='твой_username';"

KYC Flow

Регистрация → POST /kyc/submit → Admin одобряет → роль USER + 100 DPT автоминт

API Endpoints

Base URL: http://localhost:8000/api/v1 | Swagger: http://localhost:8000/docs

Auth

МетодПутьДоступ
POST/auth/registerПубличный
POST/auth/loginПубличный
POST/auth/refreshПубличный
GET/auth/meAuth
POST/auth/forgot-passwordПубличный
POST/auth/reset-passwordПубличный
POST/auth/send-verificationAuth
POST/auth/verify-emailПубличный

KYC

МетодПутьДоступ
POST/kyc/submitAuth
GET/kyc/statusAuth
GET/kyc/historyAuth

Wallet

МетодПутьДоступ
GET/wallet/meAuth
GET/wallet/allAuth
POST/wallet/createAuth
PATCH/wallet/{id}/primaryAuth
PATCH/wallet/{id}/labelAuth
GET/wallet/balanceUSER+
GET/wallet/balancesUSER+
POST/wallet/transferUSER+
GET/wallet/export-keyUSER+

Profile

МетодПутьДоступ
GET/profileAuth
PATCH/profileAuth

Admin

МетодПутьДоступ
GET/admin/statsADMIN
GET/admin/usersADMIN
GET/admin/kyc/pendingADMIN
POST/admin/kyc/approve/{id}ADMIN
POST/admin/kyc/reject/{id}ADMIN
PATCH/admin/users/{id}/toggle-activeADMIN
PATCH/admin/users/{id}/roleADMIN
GET/admin/network/graphAuth

Chat

МетодПутьДоступ
GET/chat/usersAuth
POST/chat/conversations/with/{id}Auth
GET/chat/conversations/{id}/messagesAuth
WS/chat/ws/{id}?token=...Auth

Команды разработки

bash scripts/dev.sh up # Запустить все сервисы
bash scripts/dev.sh down # Остановить
bash scripts/dev.sh logs backend # Логи FastAPI
bash scripts/dev.sh logs hardhat # Логи Hardhat
bash scripts/dev.sh shell backend # Bash внутри контейнера
bash scripts/dev.sh test-api # E2E тест API
bash scripts/dev.sh reset-db # Сброс БД (удаляет данные!)# Отправить тестовый ETH (нужен для оплаты газа при transfer):
bash scripts/send_eth.sh 0xАДРЕС 1
# Тесты:
docker compose exec backend python -m pytest tests/ -v

Важные нюансы

Hardhat — временный блокчейн

Hardhat нода сбрасывается при docker compose down -v. После пересоздания:

# 1. Передеплоить контракт:
docker compose exec hardhat sh
npx hardhat run scripts/deploy.js --network localhost
exit# 2. Скопировать адрес в .env → TOKEN_CONTRACT_ADDRESS=0x...# 3. Перезапустить backend:
docker compose restart backend

Resend слетает после пересоздания контейнера

docker compose exec backend pip install resend==2.4.0 --break-system-packages -q
docker compose restart backend

Постоянный фикс — в backend/Dockerfile добавить:

RUN pip install resend==2.4.0

ETH для газа

Transfer DPT токенов требует ETH. В dev отправляй тестовый ETH:

bash scripts/send_eth.sh 0xАДРЕС_ПОЛЬЗОВАТЕЛЯ 1

Создать enum типы вручную (после docker compose down -v)

docker compose exec db psql -U defi -d defidb -c "CREATE TYPE userrole AS ENUM ('UNVERIFIED', 'USER', 'ADMIN');CREATE TYPE kycstatus AS ENUM ('PENDING', 'APPROVED', 'REJECTED');CREATE TYPE txstatus AS ENUM ('PENDING', 'SUCCESS', 'FAILED');CREATE TYPE txtype AS ENUM ('TRANSFER', 'MINT', 'BURN');CREATE TYPE notiftype AS ENUM ('KYC_APPROVED', 'KYC_REJECTED', 'TRANSFER_RECEIVED', 'TRANSFER_SENT', 'SYSTEM', 'NEW_MESSAGE');CREATE TYPE tokentype AS ENUM ('email_verification', 'password_reset');"

.env переменные

ПеременнаяОписание
DATABASE_URLpostgresql+asyncpg://defi:pass@db:5432/defidb
REDIS_URLredis://:pass@redis:6379/0
SECRET_KEYJWT секрет → openssl rand -hex 32
ENCRYPTION_KEYFernet ключ для шифрования приватных ключей
WEB3_PROVIDER_URLhttp://hardhat:8545 (local) или Infura (testnet)
CHAIN_ID31337 (Hardhat) или 11155111 (Sepolia)
TOKEN_CONTRACT_ADDRESSАдрес ERC-20 из вывода deploy.js
HARDHAT_DEPLOYER_KEYПриватный ключ деплойера (только dev)
KYC_REWARD_TOKENSТокенов за KYC (по умолчанию 100)
RESEND_API_KEYAPI ключ от resend.com
EMAIL_FROMEmail отправителя
FRONTEND_URLhttp://localhost:5173
DEBUGtrue включает SQL логи
BACKEND_CORS_ORIGINS["http://localhost:5173"]

Roadmap

  • Notifications UI (уведомления в реальном времени)
  • История транзакций в Dashboard
  • E2E шифрование в чате
  • Gasless transactions (платформа платит за газ)
  • Деплой на Polygon / Sepolia testnet
  • HTTPS через Let's Encrypt
  • Alembic миграции вместо create_all
  • CI/CD через GitHub Actions
  • Staking контракт
  • 2FA для администраторов
  • Реферальная система

About

Decentralized Finance (DeFi) web platform integrating secure Web2 user management (KYC workflows, E2E messaging) and Web3 Ethereum network interactions (HD-wallet generation, token transfers, transaction graph visualization via D3.js). Powered by FastAPI, React, Solidity, PostgreSQL, and Redis.

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages