Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Предзаказ обмена

Сначала необходимо получить квоту (информацию о цене, по которой в течение последующих 10 секунд можно будет обменять деньги).Получить перечень маркетов:

если enabled = true и offChainSwapEnabled = true - на рынке разрешен офф-чейн обмен

Code Block
query {
    swapMarkets {
        id
        baseCurrencyId
        quoteCurrencyId
        enabled
        offChainSwapPricePrecision # сколько знаков после запятой показывать в прайсе
        offChainMinBaseAmount # минимальное количество обмена в базовой валюте
        offChainMaxBaseAmount # максимальное количество обмена в базовой валюте
        offChainMinQuoteAmount # минимальное количество обмена в квотируемой валюте
        offChainMaxQuoteAmount # максимальное количество обмена в квотируемой валюте
        offChainCommission # комиссия в процентах
        offChainSwapEnabled # флаг включения оффчейн обмена на рынке
    }
}

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

Code Block
{
  "data": {
    "swapMarkets": [
      {
        "id": "A1-A11",
        "baseCurrencyId": "A1",
        "quoteCurrencyId": "A11",
        "enabled": false,
        "offChainSwapPricePrecision": 4,
        "offChainMinBaseAmount": 0,
        "offChainMaxBaseAmount": 1000,
        "offChainMinQuoteAmount": 0,
        "offChainMaxQuoteAmount": 1000,
        "offChainCommission": 1,
        "offChainSwapEnabled": true
      },
      {
        "id": "A1-EUR",
        "baseCurrencyId": "A1",
        "quoteCurrencyId": "EUR",
        "enabled": false,
        "offChainSwapPricePrecision": null,
        "offChainMinBaseAmount": null,
        "offChainMaxBaseAmount": null,
        "offChainMinQuoteAmount": null,
        "offChainMaxQuoteAmount": null,
        "offChainCommission": null,
        "offChainSwapEnabled": false
      },
      ...
      {
        "id": "ETH-USDT",
        "baseCurrencyId": "ETH",
        "quoteCurrencyId": "USDT",
        "enabled": true,
        "offChainSwapPricePrecision": 4,
        "offChainMinBaseAmount": 0.001,
        "offChainMaxBaseAmount": 10,
        "offChainMinQuoteAmount": 10,
        "offChainMaxQuoteAmount": 18,
        "offChainCommission": 5,
        "offChainSwapEnabled": true
      },
      ...
    ]
  }
}

Предзаказ обмена

Сначала необходимо получить квоту (информацию о цене, по которой можно будет обменять деньги).

В ответе присутствуют поля createdAt и expireAt: перед запрос квоты необходимо сохранить текущее время пользователя. После получения ответа от сервера рассчитать разницу между серверным временем и временем пользователя и использовать эту разницу для расчета expireAt во времени пользователя.

Code Block
mutation {
    getOffChainSwapQuote(
        fromCurrencyId: "ETH",
        toCurrencyId: "USDT",
        # direction can be 'to' or 'from'
        direction: "from",
        amount: "0.005"
    ) {
        id
        fromCurrencyId
        toCurrencyId
        direction
        amount
        give # сколько спишут с баланса пользователя (с учетом комиссии)
        receive # сколько в результате получит на баланс пользователь (с учетом комиссии)
        commissionCurrencyId
        commission # комиссию, которую заплатит пользователь
        createdAt
        expireAt
        status
        isActive
        isErrored
    }
}

Результат запроса:

Code Block
{
  "data": {
    "getOffChainSwapQuote": {
      "id": "45f2c531-fcdd-4d44-bc9a-45e6426d679b",
      "fromCurrencyId": "ETH",
      "toCurrencyId": "USDT",
      "direction": "from",
      "amount": 0.005,
      "give": 0.005,
      "receive": 18.03,
      "commissionCurrencyId": "USDT",
      "commission": 0.95,
      "createdAt": "2024-06-07T10:29:09.048Z",
      "expireAt": "2024-06-07T10:29:19.048Z",
      "status": "waiting",
      "isActive": true,
      "isErrored": false
    }
  }
}

Возможные ошибки:

  1. Превышен max amount:

Code Block
{
  "data": {
    "getOffChainSwapQuote": {
      "id": null,
      "fromCurrencyId": null,
      "toCurrencyId": null,
      "direction": null,
      "amount": null,
      "give": null,
      "receive": null,
      "commissionCurrencyId": null,
      "commission": null,
      "createdAt": null,
      "expireAt": null,
      "status": "Amount is more then max",
      "isActive": null,
      "isErrored": true
    }
  }
}
  1. Не достигнут min amount:

Code Block
{
  "data": {
    "getOffChainSwapQuote": {
      "id": null,
      "fromCurrencyId": null,
      "toCurrencyId": null,
      "direction": null,
      "amount": null,
      "give": null,
      "receive": null,
      "commissionCurrencyId": null,
      "commission": null,
      "createdAt": null,
      "expireAt": null,
      "status": "Amount is less then min",
      "isActive": null,
      "isErrored": true
    }
  }
}
  1. Не найден рынок или на рынке enabled = false или offChainSwapEnabled = false:

Code Block
{
  "data": {
    "getOffChainSwapQuote": {
      "id": null,
      "fromCurrencyId": null,
      "toCurrencyId": null,
      "direction": null,
      "amount": null,
      "give": null,
      "receive": null,
      "commissionCurrencyId": null,
      "commission": null,
      "createdAt": null,
      "expireAt": null,
      "status": "Offchain Swap isn't enabled",
      "isActive": null,
      "isErrored": true
    }
  }
}
  1. Ошибка сервиса - не получается получить квоту:

Code Block
{
  "data": {
    "getOffChainSwapQuote": {
      "id": null,
      "fromCurrencyId": null,
      "toCurrencyId": null,
      "direction": null,
      "amount": null,
      "give": null,
      "receive": null,
      "commissionCurrencyId": null,
      "commission": null,
      "createdAt": null,
      "expireAt": null,
      "status": "Internal Server Error. Try later",
      "isActive": null,
      "isErrored": true
    }
  }
}

Подтверждение квоты (запуск обмена)

Code Block
mutation {
    confirmOffChainSwapQuote(id: "85d0bc81-004b-4f27-b09f-6540529136e4")
}

Ответ на подтверждение

Code Block
{
  "data": {
    "confirmOffChainSwapQuote": true
  }
}

depricated:


Для этого используем:

Code Block
mutation {
  getSwapQuote(
      marketId: String!,
      from: String!,
      to: String!,
      # direction can be 'to' or 'from'                    
      direction: String!,
      amount: String!
  ): SwapQuote
}

...