Головна

Як використо­вувати TzKT API в простому проєкті на Tezos

У минулих уроках ми розповіли про роботу індексерів та показали кілька прикладів. Тепер пояснимо, як їх використати для реальних завдань. Спочатку зробимо простий сайт для відображення балансу адреси, потім складніший дешборд для відображення даних бейкінгу ліквідності та розрахунку показників.

У прикладах будемо використовувати публічний TzKT та JavaScript із бібліотекою jQuery. Нічого складного, просто один HTML-файл зі скриптом.

Відображаємо баланс адреси за допомогою публічного індексу TzKT

Напевно, найпопулярніший варіант використання блокчейн-оглядачів та індексерів — перевірка балансів токенів на вказаній адресі. Це зручно при зберіганні криптовалюти на холодному гаманці: не потрібно зайвий раз підключати його до мережі та наражати на небезпеку кошти на ньому.

Ми зробимо просту сторінку, на якій користувач зможе ввести свою адресу та дізнатися про баланс у tez. Потім додамо до неї відображення балансів токенів та трохи іншої інформації. Для цього будемо використовувати Visual Studio Code та TzKT API.

Спочатку створимо порожній html-файл у VS Code (ви можете використовувати інший редактор) та додамо базові елементи: doctype, head, title та body.

1

Для запиту даних API та їх обробки ми будемо використовувати AJAX та бібліотеку jQuerry. Під'єднати бібліотеку просто: треба лише вказати на неї посилання в елементі script.

2

Тепер спробуємо одержати баланс нашої адреси через AJAX.

3

Спочатку додамо команду $(document).ready(), яка впевниться у завантаженні сторінки до початку обробки скриптів.

Потім напишемо запит до TzKT за допомогою AJAX: в "url" — посилання запиту для отримання балансу, в "type" — типу запиту GET для отримання інформації, в "success" — функцію, яка обробить відповідь.

У функції оголосимо змінну balance, надамо їй значення відповіді (data) і відразу розділимо його на мільйон. Це потрібно зробити, тому що індексер повертає баланс у mutez — мільйонних частках tez.

Щоб використовувати змінну balance в HTML, потрібно присвоїти цій змінній внутрішній ID. Зробимо це за допомогою методу document.getElementById.

Наприкінці додамо елемент h2, в якому і відображатимемо баланс. Щоб вивести значення змінної, використовуємо елемент span і раніше наданий id змінної balance.

Відкриємо сторінку та перевіримо результат.

4

Додаємо кнопку та поле для перевірки вказаного балансу

Зараз AJAX відправляє API-запит відразу при завантаженні сторінки. Додамо кнопку, натискання якої запускатиме запит.

5

Для цього обернемо h2 елемент div і зробимо його прихованим за допомогою параметра style="display:none".

Створимо кнопку та додамо до неї виклик функції check, у яку помістимо весь код запиту. Наприкінці функції додамо зміну стилю відображення div на видимий блок.

Тепер потрібно додати поле для введення адреси користувача і підправити функцію check(), щоб вставляти його в API-запит.

6

Для цього ми зробили таке:

  1. Додали параметр address у функцію check().
  2. Змінили значення поля "url". При запуску скрипт складе коректний API-запит із використанням отриманої адреси.
  3. Додали поле для введення адреси з id
  4. Змінили код кнопки, щоб її натискання запускало функцію check() і передавало введену адресу.

Тепер можна ввести будь-яку адресу і після натискання кнопки отримати її баланс у tez.

7

Поекспериментуйте: візьміть код цієї сторінки, вставте її в порожній html-файл та відкрийте у браузері.

Це дуже простий приклад, тому що TzKT API повертає баланс користувача у вигляді JSON лише з одним числом. Відповідь навіть не треба додатково обробляти — все працює і так.

8

Однак при вирішенні реальних кейсів доведеться працювати з JSON-масивами та вивчати відповіді API, щоб вибирати потрібні дані.

Відображаємо статистику бейкінгу ліквідності

Той контракт з 5 млн tez — це Sirius DEX, більше відомий як бейкінг ліквідності. Він використовує лише один смарт-контракт.

Бейкінг ліквідності — унікальний DeFi-протокол Tezos. Користувачі вносять до нього tez і tzBTC, щоб надати ліквідність для обміну, а сама мережа Tezos у кожному блоці додає у пул ще 2,5 tez. Таким чином, баланси провайдерів ліквідності цього пулу постійно зростають.

Оскільки всі дані про бейкінг ліквідності зберігаються ончейн, ми можемо їх отримати за допомогою API-запитів до публічних індексів, а потім порахувати річну прибутковість та іншу корисну інформацію.

Насамперед нас цікавить баланс Sirius DEX — скільки tez і tzBTC є на адресі контракта. Ці дані ми отримаємо з індексера.

Потім нам потрібно порахувати скільки tez субсидує протокол за рік. Тут можна дізнатись кількість секунд в році, розділити це значення на середній час створення блоку — 30 секунд — і помножити на одну субсидію.

Залишається дізнатися поточну вартість активів у Sirius DEX та вартість субсидованих tez за рік, і розділити ці значення — це і буде річна прибутковість, або APY.

Починаємо збирати нову сторінку. Спочатку спробуємо отримати щось просте, наприклад, id контракту Sirius DEX.

9

Скопіюємо код першого прикладу, видалимо з нього кнопку та поле для введення адреси. Замінимо url API-запиту на https://api.tzkt.io/v1/contracts/KT1TxqZ8QtKvLu3V3JH7Gx58n7Co8pgtpQU5, щоб отримати від індексу інформацію про контракт.

Змінимо функцію обробки даних. Індексер повертає дані у вигляді масиву. Його не потрібно додатково парсити або якось обробляти, але для отримання конкретних значень потрібно вказати ключ. У нашому випадку ключ — id, і запит значення цього ключа буде виглядати як var contractId = data.id.

Наприкінці надамо внутрішній ID "contractId" до відповідного HTML-елементу і виведемо його на сторінці в елементі h2.

10

Ми переконалися, що все працює, а значить можна отримати потрібні нам дані — баланси tez і tzBTC.

Спочатку вивчимо відповідь TzKT на наш API-запит. У ньому є поле balance у tez, отже ми можемо отримати його не змінюючи запит.

11

Надамо змінної balanceInTez значення з отриманого масиву за ключем балансу.

12

13

Тепер потрібно одержати кількість tzBTC. Вивчимо сховище контракту бейкінгу ліквідності на TzKT — там зазначено кількість tzBTC під ключем tokenPool. Його можна отримати відповідним запитом змісту сховища.

14

Створимо ще один запит AJAX. В url вкажемо API-запит змісту сховища, а змінної balanceInTZBTC надамо значення відповідного запису — tokenPool.

15

На сторінці виведемо баланс у tzBTC.

16

Тепер порахуємо субсидії за рік. У середньому рік складається з 31556926 секунд. Розділимо це значення на час створення блоку та помножимо на розмір субсидії.

Час створення блоку та розмір субсидії ми можемо отримати від TzKT за запитом даних про протокол — https://api.tzkt.io/v1/protocols/current. У відповіді вони будуть позначені як timeBetweenBlocks і lbSubsidy.

17

Отже, нам потрібно в одній функції отримати дані із двох API-запитів та використовувати їх для розрахунків. Але оскільки локальні змінні не можна використовувати в інших функціях, нам потрібно вкласти їх одна в одну. Зробимо це так:

  1. Отримаємо кількість tez.
  2. Запишемо їх у змінну.
  3. Викличемо функцію розрахунку APY, передамо їй в аргументі кількість tez.
  4. У функції APY отримаємо необхідні дані, зробимо розрахунки.
  5. Запишемо результати в змінні та надамо ID.
  6. Повернімося до першої AJAX-функції і додамо в кінець присвоєння ID змінної кількості tez.

Спочатку додамо виклик функції checkTimeAndSubsidy у функцію для отримання балансу Sirius DEX у tez.

18

Нижче оголосимо ту ж функцію, і додамо до неї виклик AJAX для запиту даних про протокол від TzKT.

19

Додамо три нових змінних:

  • secondsInYear — кількість секунд на рік, по суті, константа;
  • timeBetweenBlocks — час створення блоку;
  • lbSubsidy — субсидія пулу Sirius DEX в mutez. Ми ділимо її на мільйон, щоб отримати значення в tez замість mutez.

Тепер у нас є всі дані, щоб порахувати річний розмір субсидії та APY бейкінгу ліквідності.

20

Створимо змінні yearlySubsidy і APY, і в них порахуємо потрібні нам значення.

Щоб порахувати APY, необов'язково одержувати ціни активів. У кожний конкретний момент вартість всіх tez у пулі дорівнює вартості всіх tzBTC. Щоб спростити розрахунки, ми припустимо, що користувач додає в пул не tez і tzBTC рівної вартості, а вдвічі більше tez. APY бейкінгу ліквідності дорівнюватиме річній сумі субсидій розділеної на ліквідність пулу, тобто APY = yearlySubsidy / (balanceInTez × 2) × 100%.

Надамо значенням річної суми субсидій та APY внутрішні ID, і додамо їх на сторінку.

21

Код прикладу на Github.

Домашнє завдання

Спробуйте порахувати вартість tez у пулі ліквідності Sirius DEX. Для цього:

  1. Знайдіть смарт-контракт будь-якого пулу ліквідності tez зі стейблкоїном: tez/USDt, tez/kUSD або tez/uUSD.
  2. Отримайте за допомогою API-запиту кількість токенів у пулі.
  3. Розділіть кількість tez на кількість стейблкоїнів, щоб дізнатися курс tez.
  4. Помножте кількість tez у пулі Sirius DEX на отриманий курс.
  5. Додайте результат у відповідний рядок.

Рішення

Спочатку знайдемо контракт tez/kUSD біржі QuipuSwap на TzKT. Вивчимо сховище, знайдемо потрібні ключі: tez_pool — кількість tez, token_pool — кількість kUSD.

22

Потрібно завжди пам'ятати, що кількість токенів у сховищі смарт-контракту — це натуральне число. Щоб дізнатися справжню кількість токенів, потрібно розділити це nat на кількість нулів після ком, зазначене в метаданих токена. Наприклад, у токена kUSD 18 нулів після коми, а отже баланс у kUSD потрібно розділити на 10^18.

23

Так як для розрахунку вартості всіх tez треба знати кількість tez в пулі, нам потрібно використовувати вкладені функції. Після отримання змінної balanceInTez викличемо функцію checkValueOfTez з аргументом balanceInTez. У цій функції використовуємо AJAX, отримаємо дані від пулу tez/kUSD (не забудемо розділити кількість токенів на потрібну кількість нулів!).

24

Далі порахуємо ціну одного tez та вартість усіх tez у пулі. Насамкінець додамо змінну readableValue — за допомогою методу localeString() ми додамо поділ порядків у числі.

У результаті отримаємо вартість активів у пулі Sirius DEX, яку отримуємо повністю з ончейн-даних.

25

Поділитися в соцмережах: