Предзаказ обмена
Сначала необходимо получить квоту (информацию о цене, по которой в течение последующих 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
}
}
} |
Возможные ошибки:
Превышен 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
}
}
} |
Не достигнут 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
}
}
} |
Не найден рынок или на рынке 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
}
}
} |
Ошибка сервиса - не получается получить квоту:
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 } |
...