Versions Compared

Key

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

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

Получить перечень маркетов:

если 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 во времени пользователя.

...

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

Получить перечень валют для offChainSwap с перечнем маркетов:

Code Block
query {
  offChainSwapCurrencies {
    currencyId
    offChainSwapMarkets {
        id
        baseCurrencyId
      	baseCurrency { # наш обычный Сurrency тип (лого, цвета и пр.)
          id
          fromCurrencyId: "ETH",precision
        }
toCurrencyId: "USDT",       quoteCurrencyId
 # direction can be 'to' or 'from'
        direction: "from",	quoteCurrency { # наш обычный Сurrency тип (лого, цвета и пр.)
         amount: "0.005" id
    ) {     precision
   id     }
   fromCurrencyId     enabled
   toCurrencyId     offChainSwapPricePrecision # сколько знаков directionпосле запятой показывать в  прайсе
   amount         giveoffChainMinBaseAmount # сколькоминимальное спишутколичество собмена балансав пользователябазовой валюте
учетом комиссии)       offChainMaxBaseAmount # receiveмаксимальное #количество сколькообмена в результатебазовой валюте
получит на баланс пользователь  учетом комиссии)  offChainMinQuoteAmount # минимальное количество обмена в квотируемой commissionCurrencyIdвалюте
        commissionoffChainMaxQuoteAmount # комиссию,максимальное которуюколичество заплатитобмена пользовательв квотируемой валюте
      createdAt  offChainSwapEnabled # флаг включения оффчейн обмена на expireAtрынке
        status
        isActive
}
       isErrored
    }
}

Результат запросаПример ответа:

Code Block
{
  "data": {
    "getOffChainSwapQuoteoffChainSwapCurrencies": [
{      {
"id": "45f2c531-fcdd-4d44-bc9a-45e6426d679b",       "fromCurrencyIdcurrencyId": "ETHBTC",
        "toCurrencyIdoffChainSwapMarkets": "USDT",[
      "direction": "from",   {
   "amount": 0.005,         "giveid": 0.005,
 "BTC-USDT",
    "receive": 18.03,       "commissionCurrencyIdbaseCurrencyId": "USDTBTC",
      "commission": 0.95,       "createdAtbaseCurrency": "2024-06-07T10:29:09.048Z",{
      "expireAt": "2024-06-07T10:29:19.048Z",       "statusid": "waitingBTC",
      "isActive": true,         "isErroredprecision": false8
    }   } }

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

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

Code Block
{   "data": { },
    "getOffChainSwapQuote": {       "idquoteCurrencyId": null"USDT",
      "fromCurrencyId": null,       "toCurrencyIdquoteCurrency": null,{
      "direction": null,       "amountid": null"USDT",
      "give": null,       "receiveprecision": null,2
      "commissionCurrencyId": null,      },
   "commission": null,         "createdAtenabled": nulltrue,
      "expireAt": null,       "statusoffChainSwapPricePrecision": "Amount is more then max",5,
            "isActiveoffChainMinBaseAmount": null0.0001,
            "isErroredoffChainMaxBaseAmount": true2,
     }   } }
  1. Не достигнут min amount:

Code Block
{   "dataoffChainMinQuoteAmount": {10.01,
    "getOffChainSwapQuote": {       "idoffChainMaxQuoteAmount": null95000,
            "fromCurrencyIdoffChainSwapEnabled": null,true
         "toCurrencyId": null},
      "direction": null,    {
    "amount": null,       "giveid": null"LTC-BTC",
      "receive": null,       "commissionCurrencyIdbaseCurrencyId": null"LTC",

     "commission": null,       "createdAtbaseCurrency": null,{
      "expireAt": null,       "statusid": "LTC"Amount,
is less     then min",       "isActiveprecision": null,4
      "isErrored": true     },
  } }
  1. Не найден рынок или на рынке enabled = false или offChainSwapEnabled = false:

Code Block
{   "data": {     "getOffChainSwapQuotequoteCurrencyId": {"BTC",
      "id": null,       "fromCurrencyIdquoteCurrency": null,{
      "toCurrencyId": null,       "directionid": null"BTC",
      "amount": null,       "giveprecision": 8
null,         "receive": null,  },
    "commissionCurrencyId": null,       "commissionenabled": nulltrue,
      "createdAt      "offChainSwapPricePrecision": null5,
 
    "expireAt": null,       "statusoffChainMinBaseAmount": "Offchain Swap isn't enabled",1,
            "isActiveoffChainMaxBaseAmount": null100,
            "isErroredoffChainMinQuoteAmount": true0.0001,
       }   } }
  1. Ошибка сервиса - не получается получить квоту:

Code Block
{   "dataoffChainMaxQuoteAmount": {2,
    "getOffChainSwapQuote": {       "idoffChainSwapEnabled": null,true
         "fromCurrencyId": null, }
      "toCurrencyId": null, ]
     "direction": null},
      "amount": null,{
        "givecurrencyId": null"USDT",
        "receiveoffChainSwapMarkets": null,[
      "commissionCurrencyId": null,   {
   "commission": null,         "createdAtid": null"BTC-USDT",
      "expireAt      "baseCurrencyId": null"BTC",
            "statusbaseCurrency": "Internal Server Error. Try later",{
              "isActiveid": null"BTC",
      "isErrored": true        "precision": 8
         }   }
}

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

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

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

Code Block
{USDT",
            "dataquoteCurrency": {
       "confirmOffChainSwapQuote": true       "id": "USDT",
             }
}

________________________________________

  1. Отримання рейту - потрібне ДО формування квоти, для розуміння Юзером витраченної комісіі та приблизного рейту після обміну.
    1.1. При отриманні Квоті(перехід на крок підтвердження Квоти) має враховуватись баланс Брокера
    1.2. При невдалому отриманні Квоти - повідомляти причину помилки
    1.3. Попередня форма, до формування Квоти, має бути “калькулятором” для прозорого розуміння Юзером сплати комісіі, обрахунок, рейт
    1.4 Користивуч не має бути прив'язаний до Балансу Брокера, на етапі приблизного обрахування його обміну

  2. При цій запропонованій побудові - Фронт має отримувати зміну по квоті при кожній зміни кількості на обмін. Фронт не зможе адекватно обробляти це бо:

    Юзер може протягом короткоко часу ввести, змінити, додати Кількість на обмін багато разів - що приводить кожного разу до Нового запиту отримання Квоти, відповідно отримання Квоти може бути успішним/неуспішним та отримання Квоти може зайняти тривалий час .
    Це побуджує велечезну кількість запитів на отримання квоти, що буде означати не зовсім неочікуєму роботу обрахунку у формі на Фронті

  3. В нас має бути можливість користуватися офф-чейн свапом з підключеною зовнішньою Платформою та без, в контексті однієї форми для обміну.
    Якщо - ні , то налаштування потрібно розділити : ЮзерАпп з 2ма видами налаштувань обміну або внутрішній/або зовнішній . Поєднати це проблематично та потребує досліджень та роз'яснень, а потім погодження як це має бути для Операторів, які не потребують інтеграціі зовнішних Платформ.

  4. Для Обміну було б раціонально мати РейтСорс у налаштуваннях маркету з показником ЛастПрайс, отриманий з Трейдінгу(або інший рейт-сорс Зовнішньої платформи)
    Додатково: у маркета мало б бути делька рейт-сорсів. Та припиненні роботи одного рейт-сорсу(падііня сервісу) - вмикання наступного. Це запобігає некоректній роботі Свапу на платформі.

  5. В якій валюті береться комісія за Обмін на Зовнішній платформі?
    В нас є можливисть налаштування як у базовій так і у валюті квотування - чи не буде це ломати наш Обмін в Операціях?

____________________________________________________________________

depricated:

...

Code Block
mutation {
  getSwapQuote(
      marketId: String! "precision": 2
            },
            "enabled": true,
            "offChainSwapPricePrecision": 5,
            "offChainMinBaseAmount": 0.0001,
            "offChainMaxBaseAmount": 2,
            "offChainMinQuoteAmount": 10.01,
            "offChainMaxQuoteAmount": 95000,
            "offChainSwapEnabled": true
          },
          {
            "id": "ETH-USDT",
            "baseCurrencyId": "ETH",
            "baseCurrency": {
              "id": "ETH",
              "precision": 6
            },
            "quoteCurrencyId": "USDT",
            "quoteCurrency": {
              "id": "USDT",
              "precision": 2
            },
            "enabled": true,
            "offChainSwapPricePrecision": 4,
            "offChainMinBaseAmount": 0.001001,
      from: String!,       to"offChainMaxBaseAmount": String!10,
      # direction  can be 'to' or 'from' "offChainMinQuoteAmount": 9.01,
            "offChainMaxQuoteAmount": 15.01,
            direction"offChainSwapEnabled": String!,true
      amount: String!   ):}
SwapQuote }

Обратите внимание, параметр direction помогает указать в какой валюте указывается amount - во входящей или исходящей.

Пример 1.

Я хочу поменять 100 USDT на ETH запрос будет выглядеть:

Code Block
mutation {   swapQuote(   ]
     from: "USDT"},
    to: "ETH",  {
  marketId: "ETH-USDT",     direction"currencyId": "fromETH",
    amount: "100"   ) {"offChainSwapMarkets": [
    id     serviceId {
   from     to     direction"id": "ETH-USDT",
    amount     give   "baseCurrencyId": "ETH",
receive     rate     internalGive  "baseCurrency": {
 internalReceive     expireAt     status   "id":  isActive"ETH",
          isErrored   }
}

Пример 2.

Я хочу поменять USDT и получить в результате 0.001 ETH запрос будет выглядеть:

Code Block
mutation { "precision": 6
  swapQuote(     from: "USDT",    },
to: "ETH",     marketId: "ETH-USDT",     direction"quoteCurrencyId": "toUSDT",
    amount: "0.001"   )     "quoteCurrency": {
              "id": "USDT",
              "precision": 2
serviceId     from     to  },
  direction     amount     give
"enabled": true,
   receive     rate     internalGive"offChainSwapPricePrecision": 4,
    internalReceive     expireAt   "offChainMinBaseAmount": 0.001001,
status     isActive     isErrored   }
}

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

give - сколько клиент должен будет заплатить без учета комиссии нашей системы (приблизительно, если direction = “to” и точно, если direction = “from”)

receive - сколько клиент получит без учета комиссии нашей системы (приблизительно, если direction = “from” и точно, если direction = “to”)

rate - receive / give

internalGive - сколько клиент заплатит с учетом нашей комиссии (приблизительно если direction = “to” и точно, если direction = “from”)

internalReceive - сколько клиент получит без учета комиссии нашей системы (приблизительно, если direction = “from” и точно, если direction = “to”)

expireAt - время, когда текущая квота утратит свою актуальность.

Обмен

После принятия клиентом решения об обмене (если попадаем в 10секундный интервал) используется следующий:

Code Block
mutation {
  confirmSwapQuote(id: String!): SwapQuote
}

Передаем id квоты, serviceId, marketId

UX

Screenshot from 2024-04-24 18-18-12.pngImage Removed

Off- chain Swap Step 1

As a User, I can see main details of the form:

  • 'Quick Swap' header

  • Send section with main details:

    • 'Drop down' button to select Currency to Send with logo and ID (Ticker)

    • In case there is only one option for Currency to Send: the user can observe just this option with logo and currency ID (without drop-down

    • Currency to Send is selected according Wallet selected (by default for each Wallet) with logo and ID (Ticker)

    • Input field for amount to Swap (Send internally), pre-set "Minimum amount" to Swap by default

    • “Max” button

    • Asset's balance available for operation, in selected currency with currency ID

    'Reverse' button for changing Currency positions between 'Send' and 'Receive'

  • Receive section with main details:

    • 'Drop down' button to select Currency to Receive with logo and ID (Ticker)

    • The field 'Receive' with a calculated amount (Approximate) in Currency to Receive

    • The second Asset's balance (Currency to Receive) is currently available in its Wallet

  • Platform commission portion and ID (commission ID can be in the quote or base currency according to market settings)

  • Platform rate portion for selected Market Pair: Currency to Swap -> Currency to Receive (price precision, according to market settings)

  • Estimated result rate for selected Market Pair: Currency to Swap -> Currency to Receive (price precision, according to market settings)

    'Switch' icons as buttons to switch the Estimated result rate or Platform rate reflection Currency to Receive -> Currency to Swap

    'Swap' button

    'X' button below the main form to close the modal window

...

  • See the list of currencies suggested as Currencies to Send (according to Market Pairs on the platform): - ‘Search’ field
    - Logo, ID/Ticker
    - Asset's balance available for operation
    - Selected Currency is ‘marked’

  • Select the Currency to Send from the list

See the Swap details changed according to the Market parameters with new selected Currency:

  • Pre-set for Send in the Input field for amount to Send (Minimum amount to send according to market settings)

  • Current Balance of Currency to Send

  • Option(s) for Currency(ies) to receive

  • Field 'Receive' with the calculated amount (Approximate) in Currency to Receive

  • Current Balance of Currency to Receive

  • Platform commission

  • Platform rate

  • Estimated result rate

  1. Press “Max” button and use all available balance for Swap operation:

  • See the calculated amount (Approximate) of Currency to Receive in the field 'Receive'

  • Observe that the Amount of the Currency to Receive depends on the estimated rate of the selected Market Pair and changes if the Amount to Send is edited

  • See the 'Swap' Button activated if the input amount fits the requirements

  • Platform commission displays data

  • Platform rate displays data

  • The estimated result rate displays the data
    In case the maximum balance is lower than the minimum required for Send:

  • 'Minimum amount to send' notification on top of the input field "Amount" (according to market settings)

  • See the 'Swap' Button deactivated

  • Field 'Receive' with “0.00” amount in Currency to Receive. The text has an error color

  • Platform commission has a ' – ' amount

  • Platform rate displays data

  • Estimated result rate has a ' – ' amount

...

Press the 'Reverse' button and change the position of selected currencies Currency to Receive -> Currency to Send

"offChainMaxBaseAmount": 10,
            "offChainMinQuoteAmount": 9.01,
            "offChainMaxQuoteAmount": 15.01,
            "offChainSwapEnabled": true
          }
        ]
      },
      {
        "currencyId": "LTC",
        "offChainSwapMarkets": [
          {
            "id": "LTC-BTC",
            "baseCurrencyId": "LTC",
            "baseCurrency": {
              "id": "LTC",
              "precision": 4
            },
            "quoteCurrencyId": "BTC",
            "quoteCurrency": {
              "id": "BTC",
              "precision": 8
            },
            "enabled": true,
            "offChainSwapPricePrecision": 5,
            "offChainMinBaseAmount": 1,
            "offChainMaxBaseAmount": 100,
            "offChainMinQuoteAmount": 0.0001,
            "offChainMaxQuoteAmount": 2,
            "offChainSwapEnabled": true
          }
        ]
      }
    ]
  }
}

Получить перечень доступных для offChainSwap маркетов:

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

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

Code Block
{
  "data": {
    "swapMarkets": [
      {
        "id": "A1-A11",
        "baseCurrencyId": "A1",
        "quoteCurrencyId": "A11",
        "enabled": false,
        "offChainSwapPricePrecision": 4,
        "offChainMinBaseAmount": 0,
        "offChainMaxBaseAmount": 1000,
        "offChainMinQuoteAmount": 0,
        "offChainMaxQuoteAmount": 1000,
        "offChainSwapEnabled": true
      },
      {
        "id": "A1-EUR",
        "baseCurrencyId": "A1",
        "quoteCurrencyId": "EUR",
        "enabled": false,
        "offChainSwapPricePrecision": null,
        "offChainMinBaseAmount": null,
        "offChainMaxBaseAmount": null,
        "offChainMinQuoteAmount": null,
        "offChainMaxQuoteAmount": null,
        "offChainSwapEnabled": false
      },
      ...
      {
        "id": "ETH-USDT",
        "baseCurrencyId": "ETH",
        "quoteCurrencyId": "USDT",
        "enabled": true,
        "offChainSwapPricePrecision": 4,
        "offChainMinBaseAmount": 0.001,
        "offChainMaxBaseAmount": 10,
        "offChainMinQuoteAmount": 10,
        "offChainMaxQuoteAmount": 18,
        "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 # сколько в результате получит на баланс пользователь (с учетом комиссии)
        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,
      "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,
      "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,
      "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,
      "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,
      "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
  }
}

________________________________________

  1. Отримання рейту - потрібне ДО формування квоти, для розуміння Юзером витраченної комісіі та приблизного рейту після обміну.
    Квота запитується при кожній зміні кількості у формі обміну. Буде один єдиний крок обміну.
    Умови валідацї на підтвердження Обміну:
    - Мінімум та максимум для обміну з налаштувань (нове)
    - Баланс Юзера
    - Баланс брокера (при отриманні квоти). Юзер бачить як неможливість обміну у формі.
    Потребує змін дизайну:
    - Показувати мінімум та максимум для Обміну
    - Прибрати зайві поля. Залишається один рейт, без можливості робити реверс рейту ( погодити )
    - Прибрати поле з комісією
    1.1. При отриманні Квоті(перехід на крок підтвердження Квоти) має враховуватись баланс Брокера
    Це вираховується на стороні Бека. Пункти при яких буде запитуватися квота:
    - зміна кількості на обмін From
    - зміна валют Send/Receive
    - зміна пари методом “Реверс”
    - інтервальне оновлення кожні 10 секунд
    1.2. При невдалому отриманні Квоти - повідомляти причину помилки
    Погодити тексти помилок для Юзера.

    Popup in case of successful swap:
    Your swap was successful

    1.3. Попередня форма, до формування Квоти, має бути “калькулятором” для прозорого розуміння Юзером сплати комісіі, обрахунок, рейт
    Ця можливсть буде присутня в межах баланса брокера і в межах налаштувань мінімума та максимума на Обміну.
    1.4 Користивуч не має бути прив'язаний до Балансу Брокера, на етапі приблизного обрахування його обміну
    Буде прив'язаний

  2. При цій запропонованій побудові - Фронт має отримувати зміну по квоті при кожній зміни кількості на обмін. Фронт не зможе адекватно обробляти це бо:

    Юзер може протягом короткоко часу ввести, змінити, додати Кількість на обмін багато разів - що приводить кожного разу до Нового запиту отримання Квоти, відповідно отримання Квоти може бути успішним/неуспішним та отримання Квоти може зайняти тривалий час .
    Це побуджує велечезну кількість запитів на отримання квоти, що буде означати не зовсім неочікуєму роботу обрахунку у формі на Фронті
    Це питання вирішується на стороні Беку

  3. В нас має бути можливість користуватися офф-чейн свапом з підключеною зовнішньою Платформою та без, в контексті однієї форми для обміну.
    Якщо - ні , то налаштування потрібно розділити : ЮзерАпп з 2ма видами налаштувань обміну або внутрішній/або зовнішній . Поєднати це проблематично та потребує досліджень та роз'яснень, а потім погодження як це має бути для Операторів, які не потребують інтеграціі зовнішних Платформ.
    Це питання потрібно погодити з Менеджментом, враховуючі Операторів які не очікують інтеграцію з зовнішніми платформами

  4. Для Обміну було б раціонально мати РейтСорс у налаштуваннях маркету з показником ЛастПрайс, отриманий з Трейдінгу(або інший рейт-сорс Зовнішньої платформи)
    Додатково: у маркета мало б бути делька рейт-сорсів. Та припиненні роботи одного рейт-сорсу(падііня сервісу) - вмикання наступного. Це запобігає некоректній роботі Свапу на платформі.
    Тільки для внутрішього Обміну це буде потрібно

  5. В якій валюті береться комісія за Обмін на Зовнішній платформі?
    В нас є можливисть налаштування як у базовій так і у валюті квотування - чи не буде це ломати наш Обмін в Операціях?
    Це питання потрібно погодити з Менеджментом
    Чи показувати взагалі комісію Юзеру

  6. Також змінилася структура отримання даних для свопу, колись ми отримували масив маркетів для кожної валюти, зараз ми отримуємо всі маркети в одному масиві
    Вирішено. Зараз отримуємо в контексті Валюти в новому запиті.

  7.  ще таке загальне питання до беків, по отриманню даних, 

    Конкретно до сутності маркетів, до чого вони унаслідувалися від моделі типу «Market»  на базі неї будувався логіна свопу, інста ордер і дт., зараз зʼявилася ще одна нова сутність «BasicMarket»

    Питання: 

    Її ми будемо використовувати тільки для off/on chain swap? 

    Чи ми переходимо тільки на неї?

    Після дзвінку:

    1. Бек робить оновлення сутностей, найменування полів та їх чищення. В ітозі будуть впровадженні нові сутності а старі видалені згодом.

    2. Фронт буде прибирати поля, які не будуть використовуватитись у сутності Market

    3. Фронт додає нову сутність SwapMarket

      Screenshot from 2024-06-11 13-11-08.pngImage Added

____________________________________________________________________

UX/UI User stories

As a User, I can press the 'Swap' button on Currency Wallet 'Card' and... Open the 'Quick Swap' form as a modal window
In case there are no available markets to Swap the Currency 'Swap' button is deactivated
...See the following details in the modal window: 'Quick Swap' header
Send section with main details:

...

  • 'Drop down' button to select Currency to Send with logo and ID (Ticker)

  • In case there is only one option for Currency to Send: the user can observe just this option with logo and currency ID in a drop-down

  • Currency to Send is selected according to Wallet selected (by default for each Wallet) with logo and ID (Ticker)

  • Input field for amount to Swap (Send internally), pre-set "Minimum amount" to Swap by default

  • "Max" button for Maximum amount input

  • Asset's balance available for operation, in selected currency with currency ID
    'Reverse' button for changing Currency positions between 'Send' and 'Receive'
    Receive the section with the main details:

  • 'Drop down' button to select Currency to Receive with logo and ID (Ticker)

  • The field 'Receive' with a calculated amount (Approximate) in Currency to Receive

  • The second Asset's balance (Currency to Receive) currently available in its Wallet
    "i" icon and notice the text message "Exchange rate refreshes with counter"
    "Rate" portion for selected Market Pair: Base Currency -> Quote Currency (price precision, according to market settings)
    "Rate" animated circle statement for the rate updated periodically after a certain time has elapsed (10 seconds by default).
    "Swap" button
    The 'X' button below the main form to close the modal window

...


...Press the 'Drop Down' button to change Currency to

...

Send and... Open the Currencies drop-down list
See the list of currencies suggested as Currencies to

...

Send (according to Market Pairs on the platform) with the main details:

  • - ‘Search’ field
    - Logo, Input field to search Currency to Send by ID or Name of the Currency

  • Logo

  • ID/Ticker - Asset's balance available for operation
    -

  • Available Balances of the Currencies to Send

  • Selected Currency is ‘marked’marked
    Select the Currency to Receive Send from the list
    See the Swap details changed according to the Market parameters with

...

  • new selected Currency:

  • Pre-set for Send in the Input field for the amount to Send (Minimum amount to send according to market settings)

  • Current Balance of Currency to Send

  • Option(s) for Currency(ies) to Sendreceive

  • Field 'Receive' with a calculated amount (Approximate) in Currency to Receive

  • Current Balance of Currency to Receive

  • Rate

...


...Press the '

...

Current Balance of Currency to Receive

...

Platform commission

...

Platform rate

...

Estimated result rate

  1. Press the 'Switch' icon as a button in the Platform rate portion and change the rate reflection Base/Quote or Quote/Base
    Press the 'Switch' icon as a button in the Estimated result rate portion and change the rate reflection Base/Quote or Quote/Base

  1. Click on the Input field for the amount to Send and see previous input clears automatically and the 'Minimum amount to send' notification is on top of the input field "Amount" (according to market settings)

  2. Input amount for Send and:

  • See the calculated amount (Approximate) of Currency to Receive in the field 'Receive'

  • Observe that the Amount of the Currency to Receive depends on the estimated rate of the selected Market Pair and changes if the Amount to Send is edited

  • See the 'Swap' Button activated if the input amount fits the requirements

  • Input only 'dot' first and see automatically changing to ' 0. ' in the Input field

  • Platform commission displays data

  • Platform rate displays data

  • The estimated result rate displays the data

  1. Input amount of the Currency to Swap lower than the minimum allowed and...

...

Drop Down' button to change Currency to Receive and... Open the Currencies drop-down list
See the list of currencies suggested as Currencies to Receive (according to Market Pairs on the platform) with the main details:

  • Input field to search Currency to Receive by ID or Name of the Currency

  • Logo

  • ID/Ticker

  • Available Balances of the Currencies to Receive

  • Selected Currency is marked
    Select the Currency to Receive from the list
    See the Swap details changed according to the Market parameters with new selected Currency:

  • Pre-set for Send in the Input field for amount to Send (Minimum amount to send according to market settings)

  • Current Balance of Currency to Send

  • Option(s) for Currency(ies) to Send

  • The field 'Receive' with calculated amount (Approximate) in Currency to Receive

  • Current Balance of Currency to Receive

  • Rate

...


...Click on the Input field for an amount to Send and see... Previous input clears automatically and the 'Minimum amount to send' notification is on top of the input field "Send" (according to market settings)

  • The "Max" button deactivated

  • The field 'Receive' with the error text '0.00' in the field 'Receive'

  • Rate with "--" (empty data)
    See the 'Swap' Button deactivated

  • Field 'Receive' with “0.00” amount in Currency to Receive. The text has an error color

  • Platform commission has a ' – ' amount

  • Platform rate displays data

  • Estimated result rate has a ' – ' amount

...


...Input amount for Send and... See calculated amount (Approximate) of Currency to Receive in the field 'Receive'
Observe Amount of the Currency to Receive depends on the rate of the selected Market Pair and changes if the Amount to Send
See the 'Swap' Button

...

The field 'Receive' with a calculated amount (Approximate) in Currency to Receive. The text has an error color

...

Platform commission displays data

...

Platform rate displays data

...

The estimated result rate displays the data

  1. Leave the input field for Amount to Send empty:

activated if the input amount fits the requirements
...Input-only 'dot' first and... See automatically changing to ' 0. ' in the Input field

...


...Input amount of the Currency to Swap lower than minimum allowed and... 'Minimum amount to send' notification on top of the input field "Amount" (according to market settings)

...

  • The "Max" button deactivated

  • The field 'Receive' with “0.00” amount in Currency to Receive. The text has an error color

  • Platform commission has a ' – ' amount

  • Platform rate displays data

  • Estimated result rate has a ' – ' amountthe error text '0.00' in the field 'Receive'

  • Rate with "--" (empty data)
    See the 'Swap' Button deactivated

...


...Input amount of the Currency to

...

Swap higher than the

...

  • See the amount pre-set equal to the minimum amount to Send in the input field for Currency to Send

  • Field 'Receive' with a calculated amount (Approximate) in Currency to Receive. The text has an error color

  • See the 'Swap' Button deactivated

  • Platform commission displays data

  • Platform rate displays data

  • The estimated result rate displays the data

  1. Press the 'Swap' button and go to Off-chain Swap Step 2

  2. Press the ‘X' button below the 'Quick Swap' form and close the modal window 'Quick Swap’ form and get back to Wallet details

Off- chain Swap Step 2

...

As a User I can see main details of the form:

  • 'Confirmation' header

  • Send section with main details:

    • Currency to Send with logo and ID (Ticker)

    • Currency to Send is selected according to Step 1

    • Amount to Swap (Send internally) according to Step 1 inputs

  • 'Arrow' icon for displaying Currency swap positions between 'Send' and 'Receive'

  • Receive section with main details:

    • Currency to Receive with logo and ID (Ticker). Selected according to Step 1

    • The field 'Receive' with a calculated amount in Currency to Receive

  • Notice text message “Swap result in precise according to current rate”

  • Rate portion for selected Market Pair: Currency to Swap -> Currency to Receive (price precision, according to market settings)

  • Inverse rate portion for selected Market Pair: Currency to Swap -> Currency to Receive (price precision, according to market settings)

  • 'Confirm Swap' button (with timer)

  • 'X' button below the main form to close the modal window

Actions on Step 2:

  1. Press 'Confirm Swap' button and:

  • See popup notification 'Successful' if everything is correct

  • See the modal window 'Swap form' closing and get back to Wallet details

In case time is over 'Confirm Swap' button changes to “Refresh Quote” button

...

  1. Press ”Refresh Quote” button and:

...

The “Refresh Quote”' button changes to Confirm Swap' button with a timer

  1. Press the ‘X' button below the 'Confirmation' form and close the modal window 'Confirmation’ form and get back to Wallet details

Main Formulas:

...

Platform rate = Rate Source or Quote Rate

...

maximum allowed and... 'Maximum amount to send' notification on top of the input field "Amount" (according to market settings)

  • The "Max" button deactivated

  • The field 'Receive' with the error text '0.00' in the field 'Receive'

  • Rate with "--" (empty data)
    See the 'Swap' Button deactivated

...


...Input amount of the Currency to Send bigger than the amount of the Available Assets and higher than the maximum allowed: 'Maximum amount to send' notification on top of the input field "Amount" (according to market settings)

  • The "Max" button deactivated

  • The field 'Receive' with the error text '0.00' in the field 'Receive'

  • Rate with "--" (empty data)
    See the 'Swap' Button deactivated

...


...Input amount of the Currency to Send bigger than the amount of the Available Assets: - "Max" button deactivated

  • The field 'Receive' with the error text '0.00' in the field 'Receive'

  • Rate with "--" (empty data)
    See the 'Swap' Button deactivated

...


...Leave the input field for Amount to Send empty: 'Minimum amount to send' notification on top of the input field "Amount" (according to market settings)

  • The "Max" button deactivated

  • The field 'Receive' with the error text '0.00' in the field 'Receive'

  • Rate with "--" (empty data)
    See the 'Swap' Button deactivated

...


...In case the available balance of the Currency to Send is lower than the amount of the Currency to Send (the first time open the form) See the amount pre-set equal to minimum amount to Send in the input field for Currency to Send

  • The "Max" button deactivated

  • The field 'Receive' with the error text '0.00' in the field 'Receive'

  • Rate with "--" (empty data)
    See the 'Swap' Button deactivated

...


...Press the 'Swap' button and... See the popup notification 'Your swap was successful' if everything is correct
Observe Available Balances of the Base and Quote currencies are changed
...Press the 'X' button below the 'Swap' form and... Close the modal window 'Swap form' and get back to Wallet details