179 lines
7.9 KiB
Markdown
179 lines
7.9 KiB
Markdown
|
||
## Цель
|
||
|
||
Один экран. Депозит USDT и вывод. Баланс USDT и M8, APY, калькулятор доходности, история.
|
||
|
||
## Ключевая логика депозита
|
||
|
||
Пользователь инициирует перевод USDT на смартконтракт USDT jetton master. Этот контракт в рамках одной транзакции переводит полученные USDT на адрес Treasury компании и инициирует минт токенов M8 пользователю. Это видно в эмуляции при подтверждении транзакции.
|
||
|
||
## Вывод
|
||
|
||
Пользователь сжигает M8 на сумму вывода. Минтится NFT claim. Админ платит USDT владельцу NFT и сжигает NFT.
|
||
|
||
## Бэкенд Python
|
||
|
||
FastAPI для API. Postgres для данных. Celery для начислений APY и задач. Webhook слушатели событий. SQLAlchemy. Uvicorn. Индексатор событий через Toncenter.
|
||
|
||
## Пользовательский экран
|
||
|
||
Подключение кошелька через TON Connect. Баланс USDT и M8. APY. Калькулятор: сумма USDT и ползунок месяцев. Подпись: вывести можно в любой момент, расчет рекомендационный. Кнопки Внести и Вывести. История.
|
||
|
||
---
|
||
|
||
# Mermaid схемы
|
||
|
||
## UserFlow
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A[Подключение кошелька TON Connect] --> B[Единый экран: баланс USDT и M8, APY, калькулятор]
|
||
B -->|Внести| C[Ввод суммы USDT и подтверждение в кошельке]
|
||
C --> D[USDT jetton master получает USDT]
|
||
D --> E[Treasury получает USDT<br/>в той же транзакции]
|
||
D --> F[Минт M8 пользователю<br/>в той же транзакции]
|
||
F --> B
|
||
|
||
B -->|Вывести| G[Ввод суммы M8]
|
||
G --> H[Burn M8 и mint NFT claim]
|
||
H --> I[Админ‑панель видит claim]
|
||
I --> J[Админ отправляет USDT владельцу NFT]
|
||
J --> K[Burn NFT claim и обновление истории]
|
||
K --> B
|
||
```
|
||
|
||
## MoneyFlow
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
subgraph User[Пользовательский кошелек]
|
||
UUSDT[USDT Jetton]:::tok
|
||
UM8[M8 Jetton]:::tok
|
||
UNFT[NFT Claim]:::nft
|
||
end
|
||
|
||
subgraph TON[Сеть TON]
|
||
USDTM[USDT Jetton Master]:::sc
|
||
Trea[Treasury компании]:::sc
|
||
M8M[M8 Jetton Master]:::sc
|
||
NFTC[NFT Claim Collection]:::sc
|
||
end
|
||
|
||
subgraph Offchain[Сервер Python]
|
||
API[FastAPI]:::srv
|
||
IDX[Индексатор событий]:::srv
|
||
APY[Планировщик APY Celery]:::srv
|
||
ADM[Админ‑панель]:::srv
|
||
DB[(PostgreSQL)]:::db
|
||
end
|
||
|
||
UUSDT -->|transfer| USDTM
|
||
USDTM -->|в той же tx| Trea
|
||
USDTM -->|trigger mint| M8M -->|mint| UM8
|
||
|
||
UM8 -->|burn для вывода| NFTC -->|mint| UNFT
|
||
ADM -->|платеж USDT по claim| UUSDT
|
||
ADM -->|burn claim| NFTC
|
||
|
||
IDX --> DB
|
||
API <--> DB
|
||
ADM --> API
|
||
IDX --> API
|
||
API <--> TON
|
||
IDX <--> TON
|
||
|
||
classDef tok stroke-width:1
|
||
classDef nft stroke-width:1
|
||
classDef sc stroke-width:1
|
||
classDef srv stroke-width:1
|
||
classDef db stroke-width:1
|
||
```
|
||
|
||
## Последовательности
|
||
|
||
### Депозит в одной транзакции
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant U as dApp
|
||
participant W as TON Wallet
|
||
participant M0 as USDT Jetton Master
|
||
participant T as Treasury
|
||
participant M8 as M8 Jetton Master
|
||
participant X as Индексатор
|
||
|
||
U->>W: Подписать transfer USDT (amount, ref)
|
||
W-->>M0: transfer USDT
|
||
M0-->>T: внутренний перевод USDT на Treasury
|
||
M0-->>M8: вызов mint M8(to=user, ref) в той же tx
|
||
M8-->>U: Баланс M8 увеличен
|
||
M0-->>X: события transfer и mint зафиксированы
|
||
```
|
||
|
||
### Вывод через NFT claim
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant U as dApp
|
||
participant M8 as M8 Master
|
||
participant N as NFT Collection
|
||
participant A as Admin App
|
||
participant T as USDT Jetton
|
||
participant X as Индексатор
|
||
|
||
U->>M8: Burn M8(amount, claimId)
|
||
M8-->>N: Mint NFT claim(to=user, amount, claimId)
|
||
N-->>X: Событие claim создан
|
||
A->>T: Transfer USDT(to=ownerOf(claimId), amount)
|
||
A->>N: Burn NFT(claimId)
|
||
N-->>X: Событие claim погашен
|
||
```
|
||
|
||
## Архитектура
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
FE[Frontend SPA React + TON Connect] --> API[FastAPI]
|
||
AP[Админ‑панель React] --> API
|
||
API --> DB[(PostgreSQL)]
|
||
IDX[Индексатор Python] --> DB
|
||
APY[Celery планировщик] --> API
|
||
API --> TON[(TON RPC)]
|
||
IDX --> TON
|
||
```
|
||
|
||
---
|
||
|
||
# API кратко (Python FastAPI)
|
||
|
||
- GET /balances?address=addr
|
||
- POST /apy/set body: {apy} ролевая защита админ
|
||
- POST /payout body: {claim_id} атомарная выплата и burn
|
||
- GET /claims my
|
||
- Webhooks: /events USDT, M8, NFT с HMAC
|
||
- Cron Celery: ежедневный mint по списку адресов
|
||
|
||
|
||
---
|
||
|
||
# Коммерческое предложение 2500 USD
|
||
|
||
| Блок | Стоимость | Состав работ |
|
||
| ---------------------------------------------- | --------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||
| Смартконтракты TON | 1300 | M8 Jetton Master с admin mint и burn. NFT Claim коллекция. Сценарий депозит через USDT master с автопереводом в Treasury и вызовом mint M8. Скрипты деплоя и верификации. |
|
||
| Frontend | 300 | Один экран, TON Connect, калькулятор APY, модалки Внести и Вывести, история, интеграция FastAPI. |
|
||
| Backend Python | 700 | FastAPI, PostgreSQL, SQLAlchemy, Celery планировщик APY, индексатор событий, RBAC админ, журналы, вебхуки. |
|
||
| Настройка на арендованном клиентом VPS сервере | 200 | Docker Compose, Nginx, TLS, среды, логи, базовый мониторинг. |
|
||
| Правки | 0 | Разумные правки в пределах описываемого функционала |
|
||
|
||
Сумма 2500 USD.
|
||
|
||
---
|
||
|
||
# Критерии приемки
|
||
|
||
- Депозит USDT на USDT master приводит к переводу USDT на Treasury и минту M8 пользователю в одной транзакции. История фиксирует оба события.
|
||
- Ежедневное начисление M8 по APY проходит корректно и идемпотентно
|
||
- Вывод: burn M8, mint NFT claim, выплата USDT владельцу NFT, burn NFT.
|
||
- Балансы и события консистентны по ончейну и в БД. Ошибки отсутствуют в логах.
|