# Выплаты 2.0

Выплаты 2.0 позволяют производить выводы с **выплатных** и **головных** адресов.

Возможности:

* прямой вывод
* вывод между сетями
* вывод с конвертацией монет

## Схема взаимодействия с API

{% @mermaid/diagram content="sequenceDiagram
Merchant ->> Onchainpay: Создание вывода
Onchainpay ->> Merchant: Тело вывода

```
Note over Onchainpay: Обработка операции

Onchainpay -->> Merchant: Вебхук с результатом вывода" %}
```

### Подбор адреса

Для проведения операции подбирается наиболее подходящий адрес

Пример подбора адреса:

У вас есть несколько адресов

| Монета | Сеть     | Баланс | Эквивалент |
| ------ | -------- | ------ | ---------- |
| USDT   | tron     | 100    | ..         |
| USDT   | ethereum | 100    | ..         |
| BNB    | bsc      | 100    | ..         |

* Вы хотите вывести **10 USDT tron**
  * Прямой вывод. Будет взят адрес **USDT tron** так как у вас уже есть адрес с этом монетой и в этой сети, и на нем достаточно средств
* Вы хотите вывести **10 BNB bsc**
  * Прямой вывод. Будет взят адрес **BNB bsc** так как у вас уже есть адрес с этом монетой и в этой сети, и на нем достаточно средств
* Вы хотите вывести **10 USDT bsc**
  * Вывод между сетями. Будет взят адрес **USDT tron** так как подходящего адреса у вас нет
* Вы хотите вывести **1 BTC bitcoin**
  * Вывод с конвертацией монет. Будет взят адрес **USDT tron** так как подходящего адреса у вас нет

> Обратите внимание
>
> Операции *вывод между сетями* и *вывод с конвертацией монет* работают только с адресами токенов (USDT, USDC)\
> Адреса нативных монет будут браться только для *прямого вывода*

Адрес берется среди всех **PAY\_OUT** (выплатные) и **COLLECT** (головные) адресов.\
Ищется адрес с балансом покрывающим запрошенную сумму и с наиболее низкой комиссией сети.\
Приоритет операций: вывод, вывод между сетями, вывод с конвертацией монет.

### Комиссии

При проведении операции будет взят тариф в зависимости от типа операции

| Тип операции               | Тариф                      |
| -------------------------- | -------------------------- |
| Прямой вывод               | Вывод с выплатного баланса |
| Вывод между сетями         | Блокчейн мост API          |
| Вывод с конвертацией монет | Обмен API                  |

> Операции **вывод между сетями**, **вывод с конвертацией монет** проводятся через\
> провайдера услуг, комиссия сети за отправку монет провайдеру компенсируется сервисом
>
> Комиссия сервиса за операцию всегда берется с авансового баланса
>
> Комиссия сети за отправку от провайдера взимается **из суммы если исходящая нативная монета**,**с авансового баланса если исходящая монета является токеном**

### Параметр `feeInAmount`

Параметр позволяет указать, что комиссия сети за отправку монет от провайдера на конечный адрес\
будет взята из суммы (пользователь получит сумму меньше указанной на размер комиссии сети)

> Если исходящая монета нативная, и указан параметр `feeInAmount=false`, то комиссия сети будет\
> добавлена к сумме, чтобы пользователь получил указанную сумму

### Описание полей

В ответ на запрос придет тело со следующими полями

| Имя                     | Тип                                                      | Описание                                                                    |
| ----------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------- |
| `id`                    | `string`                                                 | Идентификатор операции                                                      |
| `organizationId`        | `string`                                                 | Идентификатор организации                                                   |
| `type`                  | `enum(WITHDRAWAL, BRIDGE, SWAP)`                         | Тип                                                                         |
| `status`                | `enum(PENDING, WITHDRAWING, PROCESSED, REJECTED, ERROR)` | Статус                                                                      |
| `message`               | `string or null`                                         | Сообщение при отклонении                                                    |
| `addressRiskLevel`      | `enum(Low, Medium, High, Severe) or null`                | Уровень риска конечного адреса                                              |
| `addressFromId`         | `string`                                                 | Идентификатор исходящего адреса                                             |
| `addressFrom`           | `string`                                                 | Исходящий адрес                                                             |
| `addressTo`             | `string`                                                 | Конечный адрес                                                              |
| `amountFrom`            | `string`                                                 | Исходящая сумма                                                             |
| `amountFromUSD`         | `string`                                                 | Исходящая сумма в USD                                                       |
| `amountTo`              | `string`                                                 | Сумма после операции                                                        |
| `amountToUSD`           | `string`                                                 | Сумма после операции в USD                                                  |
| `amountToReceive`       | `string`                                                 | Сумма, которая придет на конечный адрес                                     |
| `amountToReceiveUSD`    | `string`                                                 | Сумма, которая придет на конечный адрес в USD                               |
| `rate`                  | `string`                                                 | Курс обмена                                                                 |
| `blockchainFeeFrom`     | `string`                                                 | Комиссия сети за отправку провайдеру                                        |
| `blockchainFeeFromUSD`  | `string`                                                 | Комиссия сети за отправку провайдеру в USD                                  |
| `blockchainFeeToSource` | `enum(ADVANCED, AMOUNT)`                                 | Источник списания комиссии сети за отправку от провайдера на конечный адрес |
| `blockchainFeeTo`       | `string`                                                 | Комиссии сети за отправку от провайдера на конечный адрес                   |
| `blockchainFeeToUSD`    | `string`                                                 | Комиссии сети за отправку от провайдера на конечный адрес в USD             |
| `serviceFee`            | `string`                                                 | Комиссия сервиса за проведение операции                                     |
| `webhookUrl`            | `string or null`                                         | URL для отправки вебхука                                                    |
| `txId`                  | `string or null`                                         | Хэш транзакции отправки монет на конечный адрес                             |
| `createdAt`             | `string (Date in ISO 8601)`                              | Дата создания                                                               |
| `updatedAt`             | `string (Date in ISO 8601)`                              | Дата последнего обновления                                                  |

***

Поле `type`

| Имя          | Описание                   |
| ------------ | -------------------------- |
| `WITHDRAWAL` | Обмен                      |
| `BRIDGE`     | Обмен между сетями         |
| `SWAP`       | Обмен с конвертацией монет |

***

Поле `status`

| Имя           | Описание                              |
| ------------- | ------------------------------------- |
| `PENDING`     | В процессе обработки                  |
| `WITHDRAWING` | В процессе отправки на конечный адрес |
| `PROCESSED`   | Завершен с успехом                    |
| `REJECTED`    | Отклонен системой                     |
| `ERROR`       | Ошибка при обработке                  |

***

Поле `blockchainFeeToSource`

| Имя        | Описание         |
| ---------- | ---------------- |
| `ADVANCED` | Авансовый баланс |
| `AMOUNT`   | Сумма            |

***

Пример тела ответа

```json
{
  "success": true,
  "response": {
    "id": "31a3b86b-e350-4906-9d3e-cc2fca054821",
    "organizationId": "1f07eb01-5fd8-4e05-89b5-bebcd1d1fc39",
    "userId": null,
    "type": "WITHDRAWAL",
    "status": "PENDING",
    "message": null,
    "addressRiskLevel": "Low",
    "addressFromId": "25a8de42-a359-47f1-bb82-bc9f6c20f1b9",
    "addressFrom": "0xD65D24ABCd85165a243C33Cf8133ffBaaa98255D",
    "addressTo": "0x22aECc7ff5b435E38be5457C8538256918783F67",
    "amountFrom": "3",
    "amountFromUSD": "3.00",
    "amountTo": "3",
    "amountToUSD": "3.00",
    "amountToReceive": "3",
    "amountToReceiveUSD": "3.00",
    "rate": "0",
    "blockchainFeeFrom": "0",
    "blockchainFeeFromUSD": "0",
    "blockchainFeeToSource": "ADVANCED",
    "blockchainFeeTo": "0.12",
    "blockchainFeeToUSD": "0.12",
    "serviceFee": "0.09",
    "webhookUrl": "https://example.com/webhook-url",
    "txId": null,
    "createdAt": "2024-09-09T15:43:32.986Z",
    "updatedAt": "2024-09-09T15:43:34.073Z"
  }
}
```

### Webhook

При смене статуса операции будет отправлен вебхук на указанный URL

Пример тела вебхука

```json
{
  "id": "31a3b86b-e350-4906-9d3e-cc2fca054821",
  "organizationId": "1f07eb01-5fd8-4e05-89b5-bebcd1d1fc39",
  "userId": null,
  "type": "WITHDRAWAL",
  "status": "PENDING",
  "message": null,
  "addressRiskLevel": "Low",
  "addressFromId": "25a8de42-a359-47f1-bb82-bc9f6c20f1b9",
  "addressFrom": "0xD65D24ABCd85165a243C33Cf8133ffBaaa98255D",
  "addressTo": "0x22aECc7ff5b435E38be5457C8538256918783F67",
  "amountFrom": "3",
  "amountFromUSD": "3.00",
  "amountTo": "3",
  "amountToUSD": "3.00",
  "amountToReceive": "3",
  "amountToReceiveUSD": "3.00",
  "rate": "0",
  "blockchainFeeFrom": "0",
  "blockchainFeeFromUSD": "0",
  "blockchainFeeToSource": "ADVANCED",
  "blockchainFeeTo": "0.12",
  "blockchainFeeToUSD": "0.12",
  "serviceFee": "0.09",
  "webhookUrl": "https://example.com/webhook-url",
  "txId": null,
  "createdAt": "2024-09-09T15:43:32.986Z",
  "updatedAt": "2024-09-09T15:43:34.073Z"
}
```
