add pull page
This commit is contained in:
@@ -37,208 +37,6 @@ revoke) комиссии нет.
|
||||
|
||||
---
|
||||
|
||||
# 1. СТЕЙКИНГ
|
||||
|
||||
ETH → **Lido** (stETH). SOL → **нативный** стейкинг (StakeProgram, делегирование валидатору).
|
||||
`chain` в пути = `ETH` или `SOL`.
|
||||
|
||||
---
|
||||
|
||||
### 1.1. `POST /wallets/{chain}/stake/quote`
|
||||
|
||||
**Что делает:** превью стейка — считает комиссию 0.7%, сумму после комиссии, ожидаемый результат и
|
||||
доходность. Ничего не подписывает.
|
||||
|
||||
**Вход (body):**
|
||||
```json
|
||||
{ "amount": "100000000000000000" }
|
||||
```
|
||||
- `amount` — сумма в smallest units (ETH = wei 10^18; SOL = lamports 10^9), строка, > 0.
|
||||
|
||||
**Возвращает (ETH):**
|
||||
```json
|
||||
{ "success": true, "data": {
|
||||
"amountWei": "100000000000000000", "amountWeiHuman": "0.1",
|
||||
"appFeeWei": "700000000000000", "appFeeWeiHuman": "0.0007",
|
||||
"stakeAmountWei": "99300000000000000", "stakeAmountWeiHuman": "0.0993",
|
||||
"expectedStEthWei": "99300000000000000","expectedStEthWeiHuman": "0.0993",
|
||||
"aprPercent": 3.1
|
||||
}}
|
||||
```
|
||||
|
||||
**Возвращает (SOL):**
|
||||
```json
|
||||
{ "success": true, "data": {
|
||||
"amountLamports": "1000000000", "amountLamportsHuman": "1",
|
||||
"appFeeLamports": "7000000", "appFeeLamportsHuman": "0.007",
|
||||
"stakeLamports": "993000000", "stakeLamportsHuman": "0.993",
|
||||
"validator": "<vote-pubkey валидатора>",
|
||||
"estApyPercent": 6.5
|
||||
}}
|
||||
```
|
||||
|
||||
**Примечание:** `aprPercent` (ETH) может быть `null`, если внешний источник APR недоступен — это не
|
||||
блокирует стейк. Lido даёт stETH ~1:1 к внесённому ETH (после комиссии).
|
||||
|
||||
---
|
||||
|
||||
### 1.2. `POST /wallets/{chain}/stake`
|
||||
|
||||
**Что делает:** выполняет стейк. ETH: списывает комиссию 0.7% → `Lido.submit()`. SOL: создаёт
|
||||
stake-аккаунт + делегирует валидатору (+ комиссия). Подписывает и броадкастит сам.
|
||||
|
||||
**Вход:** header `Idempotency-Key: <uuid>` + body:
|
||||
```json
|
||||
{ "amount": "100000000000000000" }
|
||||
```
|
||||
- `amount` — то же, что в quote (smallest units).
|
||||
|
||||
**Возвращает (ETH):**
|
||||
```json
|
||||
{ "success": true, "data": {
|
||||
"feeTxid": "0x...", "stakeTxid": "0x...",
|
||||
"stakeAmountWei": "99300000000000000", "stakeAmountWeiHuman": "0.0993",
|
||||
"appFeeWei": "700000000000000", "appFeeWeiHuman": "0.0007"
|
||||
}}
|
||||
```
|
||||
|
||||
**Возвращает (SOL):**
|
||||
```json
|
||||
{ "success": true, "data": {
|
||||
"stakeTxid": "<signature>",
|
||||
"stakeAccount": "<pubkey нового stake-аккаунта>",
|
||||
"stakeLamports": "993000000", "stakeLamportsHuman": "0.993",
|
||||
"appFeeLamports": "7000000", "appFeeLamportsHuman": "0.007",
|
||||
"validator": "<vote-pubkey>"
|
||||
}}
|
||||
```
|
||||
|
||||
**Примечание:** `stakeAccount` (SOL) **сохрани** — он нужен для unstake и для отображения позиции.
|
||||
|
||||
---
|
||||
|
||||
### 1.3. `GET /wallets/{chain}/stake/positions`
|
||||
|
||||
**Что делает:** читает текущие позиции стейкинга прямо из блокчейна (без БД).
|
||||
|
||||
**Вход:** только `chain` в пути. Тела нет.
|
||||
|
||||
**Возвращает (ETH):**
|
||||
```json
|
||||
{ "success": true, "data": {
|
||||
"protocol": "lido", "chain": "ETH",
|
||||
"stEthBalanceWei": "99300000000000000", "stEthBalanceWeiHuman": "0.0993",
|
||||
"aprPercent": 3.1,
|
||||
"withdrawalRequests": [
|
||||
{ "requestId": "12345", "amountStEthWei": "50000000000000000",
|
||||
"amountStEthWeiHuman": "0.05", "isFinalized": true, "isClaimed": false }
|
||||
]
|
||||
}}
|
||||
```
|
||||
|
||||
**Возвращает (SOL):**
|
||||
```json
|
||||
{ "success": true, "data": {
|
||||
"protocol": "native", "chain": "SOL", "validator": "<vote-pubkey>",
|
||||
"positions": [
|
||||
{ "stakeAccount": "<pubkey>", "lamports": "993000000", "lamportsHuman": "0.993",
|
||||
"state": "active", "validator": "<vote-pubkey>",
|
||||
"delegatedLamports": "993000000", "delegatedLamportsHuman": "0.993" }
|
||||
]
|
||||
}}
|
||||
```
|
||||
|
||||
**Примечание:**
|
||||
- ETH `withdrawalRequests` — это заявки на вывод через очередь (mode=queue). Когда `isFinalized:true` и
|
||||
`isClaimed:false` → можно забирать через `/unstake/claim` (см. 1.5).
|
||||
- SOL `state` ∈ `active | activating | deactivating | inactive`. Unstake зависит от состояния (см. 1.4).
|
||||
|
||||
---
|
||||
|
||||
### 1.4. `POST /wallets/{chain}/unstake`
|
||||
|
||||
**Что делает:** вывод из стейкинга. **Без комиссии.**
|
||||
- ETH: `mode=swap` — мгновенно через Curve (stETH→ETH); `mode=queue` — заявка в Lido Withdrawal Queue.
|
||||
- SOL: один endpoint, два шага по состоянию: `active`→деактивация (cooldown 1-2 эпохи), затем повторный
|
||||
вызов → `withdraw`.
|
||||
|
||||
**Вход:** header `Idempotency-Key: <uuid>` + body:
|
||||
|
||||
ETH:
|
||||
```json
|
||||
{ "amount": "50000000000000000", "mode": "swap" }
|
||||
```
|
||||
- `amount` — сумма stETH в wei.
|
||||
- `mode` — `"swap"` (мгновенно, дефолт) или `"queue"` (очередь Lido).
|
||||
|
||||
SOL:
|
||||
```json
|
||||
{ "stakeAccount": "<pubkey stake-аккаунта>" }
|
||||
```
|
||||
- `stakeAccount` — адрес из позиции (1.3) или из ответа stake (1.2).
|
||||
|
||||
**Возвращает (ETH, mode=swap):**
|
||||
```json
|
||||
{ "success": true, "data": {
|
||||
"mode": "swap", "approveTxid": "0x...", "swapTxid": "0x...",
|
||||
"swapAmountStEthWei": "50000000000000000", "swapAmountStEthWeiHuman": "0.05",
|
||||
"minEthOutWei": "49800000000000000", "minEthOutWeiHuman": "0.0498"
|
||||
}}
|
||||
```
|
||||
|
||||
**Возвращает (ETH, mode=queue):**
|
||||
```json
|
||||
{ "success": true, "data": {
|
||||
"mode": "queue", "approveTxid": "0x...", "requestTxid": "0x...",
|
||||
"requestedStEthWei": "50000000000000000", "requestedStEthWeiHuman": "0.05",
|
||||
"note": "requestId появится в /stake/positions; затем /unstake/claim когда isFinalized"
|
||||
}}
|
||||
```
|
||||
|
||||
**Возвращает (SOL):**
|
||||
```json
|
||||
{ "success": true, "data": {
|
||||
"action": "deactivate",
|
||||
"txid": "<signature>",
|
||||
"note": "Деактивация запущена. Через 1-2 эпохи вызови /unstake снова — выведет средства."
|
||||
}}
|
||||
```
|
||||
либо после cooldown:
|
||||
```json
|
||||
{ "success": true, "data": {
|
||||
"action": "withdraw", "txid": "<signature>",
|
||||
"withdrawnLamports": "993000000", "withdrawnLamportsHuman": "0.993"
|
||||
}}
|
||||
```
|
||||
|
||||
**Примечание:**
|
||||
- SOL unstake — **двухфазный**. Первый вызов на `active`-аккаунте вернёт `action:"deactivate"`. Покажи
|
||||
юзеру «средства разблокируются через 1-2 эпохи». Когда `state` станет `inactive` — повторный вызов
|
||||
вернёт `action:"withdraw"`.
|
||||
- Если вызвать SOL unstake пока `state:"deactivating"` → 400 (ещё рано, идёт cooldown).
|
||||
|
||||
---
|
||||
|
||||
### 1.5. `POST /wallets/ETH/unstake/claim`
|
||||
|
||||
**Что делает:** забирает ETH по готовой заявке из Lido Withdrawal Queue (только ETH, только mode=queue).
|
||||
|
||||
**Вход:** header `Idempotency-Key: <uuid>` + body:
|
||||
```json
|
||||
{ "requestId": "12345" }
|
||||
```
|
||||
- `requestId` — id заявки из `/stake/positions.withdrawalRequests`, у которой `isFinalized:true`.
|
||||
|
||||
**Возвращает:**
|
||||
```json
|
||||
{ "success": true, "data": { "claimTxid": "0x..." } }
|
||||
```
|
||||
|
||||
**Примечание:** сервер заранее проверяет, что `requestId` принадлежит юзеру и существует — иначе 400
|
||||
(без потери газа). Доступно только при `isFinalized:true`.
|
||||
|
||||
---
|
||||
|
||||
# 2. ПУЛЫ — Uniswap v3 LP (только ETH)
|
||||
|
||||
Курируемый список пулов (например WETH/USDT, WBTC/WETH, XAUt/USDT). Пользователь выбирает пул,
|
||||
|
||||
Reference in New Issue
Block a user