Бонусний урок для блокчейн-індексерів: робимо простий токен трекер

Минулого тижня ми опублікували курс про блокчейн-індексери. Там ми пояснювали, що індексери потрібні для швидкого отримання ончейн-даних, і що їх використовують майже всі блокчейн-додатки.
В курсі ми робили прості проєкти на кшталт статистики бейкінгу ліквідності та розрахунку APY. Сьогодні вирішили показати, як зробити щось корисніше і складніше — статистику змін ціни токена або токен-трекер. Baking Bad, вибачте за грубе використання TzKT API!
Що буде робити наш трекер
Ми будемо використовувати TzKT API для отримання ончейн-даних з пулів QuipuSwap та контрактів токенів. Потім будемо обробляти їх і використовувати далі, щоб автоматично рахувати зміни ціни токена за добу та за тиждень, а також підтягувати назву токена з його контракту. У результаті вийшла така веб-сторінка:
Як працює трекер:
- Отримує поточну ціну tez на біржі.
- Бере зі сховища контракту вказаного пулу QuipuSwap адресу токена.
- Робить запит по адресі токена, отримує його назву.
- Рахує ціну токена в пулі.
- Запитує котирування tez минулої доби, розраховує зміну у відсотках.
- Використовує ціну tez за минулу добу, щоб порахувати ціну токена 24 години тому та зміну у відсотках.
- Робить те саме, але з даними тижневої давності, щоб порахувати зміни цін за тиждень.
Наш міні-проєкт можна масштабувати та зробити повноцінний токен-трекер, який би враховував ліквідність у пулах усіх DEX, обрахував обсяги торгівлі, зберігав все у власній базі даних та не запитував TzKT при кожному перезавантаженні сторінки. Але в нього інше завдання: ми хочемо показати, як працювати з індексером, і найголовніше — надихнути новачків. Навіть з мінімальним досвідом можна зробити корисний проєкт для екосистеми!
Робимо HTML-сторінку
Створимо порожній HTML-файл та імпортуємо до нього бібліотеку jQuery — вона потрібна для ajax-запитів до TzKT API. Відразу зробимо таблицю із назвами стовпців: Token, Price, 24h та 7d.
Також пропишемо мінімальний стиль, але все ще ігноруватимемо можливості CSS. У результаті отримаємо таблицю.
Запитуємо ціну tez
Задаємо функцію $(document).ready(function(){}, яка запуститься після завантаження сторінки.
У ній за допомогою ajax викликаємо quotes/last з TzKT API. Записуємо ціну в USD у змінну tezPriceExchange та присвоюємо це значення елементу tezPrice.
Додаємо цей id у відповідну комірку таблиці в елементі <span>, перезавантажуємо сторінку і отримуємо поточну ціну
Отримуємо назву токена та його ціну з пулу QuipuSwap
Додаємо до першої функції змінну з адресою контракту пула токена до tez (ми вибрали пул QUIPU/tez). Викликаємо функцію meta, якій передаємо адресу пула.
Створюємо в папці проєкту файл meta.js, імпортуємо його в сторінку. У самому файлі оголошуємо функцію meta. В ній запитуємо в API TzKT сховище контракту та за допомогою фільтру ?path отримуємо лише адресу токена, який свопається в цьому пулі. Записуємо адресу в змінну tokenAddress. Не забуваємо про toString(), щоб значення можна було вставити в API-запит.
Пишемо ще один ajax-запит, але тепер запитуємо дані про контракт токена — не сховище, саме загальні дані. З нього отримуємо або назву токена. Записуємо у відповідну змінну.
Повертаємося до HTML-файлу, додаємо другий рядок до таблиці та елемент tokenAlias в комірку Name. Перезавантажуємо сторінку, отримуємо назву токена QUIPU.
Все працює, йдемо рахувати ціни.
Робимо базу для розрахунку зміни цін tez та токену
Щоб порахувати ціну токену в пулі ліквідності QuipuSwap потрібно отримати з його контракту два значення: кількість tez та кількість токенів. У сховищі вони записані під ключами tez_pool та token_pool. Підсумкова формула буде виглядати як tez_pool/token_pool×tez_price (але змінні в коді назвали по-іншому).
За допомогою TzKT API ми можемо одержати значення сховища на вказаному рівні блокчейну. Щоб дізнатися минуле співвідношення в пулі, нам потрібно дізнатися поточний рівень, відняти від нього кількість блоків, створених за 24 години та 7 днів, та запитати стан сховища в цьому блоці. Аналогічно отримаємо ціну tez — запитаємо котирування на потрібному рівні.
Повертаємось до коду. Додаємо запит до TzKT API для отримання поточного рівня, записуємо його в змінну та викликаємо функцію tokenPriceFunc. Далі ми зробимо кілька вбудованих функцій, які будуть послідовно викликати один одного, і передамо tokenPriceFunc необхідні для розрахунків параметри: адресу контракту пула та поточну ціну tez.
Створимо файл tokenPriceCurrent.js. У ньому оголосимо функцію tokenPriceFunc. Усередині запитаємо стан сховища зазначеного контракту. З нього отримаємо кількість tez — змінна balanceInTez, і кількість токенів – balanceInToken. Розділимо кількість токенів у пулі на потрібну кількість нулів після коми.
У змінній tokenPrice порахуємо ціну токена в пулі і відразу присвоїмо це значення HTML-елементу tokenPrice.
Додамо елемент tokenPrice до таблиці, перезавантажимо сторінку.
Рахуємо зміну ціни tez за 24 години
У виклик функції tokenPriceFunc у HTML-файлі додамо параметр level.
Також додамо його до оголошення функції в currentPrice.js. Насамкінець викличемо функцію priceDayAgo з потрібними параметрами: адресою контракту пула, рівнем, поточними цінами tez і токена.
Створимо файл priceDayAgo.js, імпортуємо його до HTML-файлу. У ньому оголосимо функцію priceDayAgo і почнемо робити найскладніше.
Спочатку порахуємо рівень блоку, який було створено 24 години тому. Для цього віднімемо від поточного рівня 2880, тобто середню кількість створюваних блоків на добу — 1440 хвилин × 2 блоки на хвилину. Запишемо його у змінну level24h.
Потім запитаємо по API ціну tez на потрібному блоці. Запишемо цю ціну до допоміжної змінної tezPriceExchange24h_e і округлимо. Тепер порахуємо зміну ціни у відсотках — віднімемо від поточної ціни стару та розділимо на поточну.
Додамо if else — якщо різниця цін, тобто значення tezPriceExchange24h_e, позитивна, додамо в підсумкову змінну tezPriceExchange24h плюсик. Якщо негативна, залишимо як є, а мінус з’явиться автоматично.
В кінці надамо це значення новому HTML-елементу і додамо його в таблицю.
Рахуємо зміну ціни токена за 24 години
Наприкінці функції priceDayAgo викличемо функцію tokenPriceChange24 (так, ми не любимо стандартизувати назви).
Передамо їй адресу контракту, рівень блоку добової давності, ціну tez 24 години тому та поточну ціну токена.
Потім поєднаємо функцію розрахунку ціни токена з функцією розрахунку різниці цін. Запитаємо стан сховища добу назад, порахуємо ціну за кількістю токенів у пулі, порівняємо її з поточною ціною та додамо плюсик.
Запишемо елемент до таблиці.
Аналогічно обрахуємо зміну цін за тиждень. Створимо новий js-файл, скопіюємо в нього зміст priceDayAgo, скоригуємо рівень з -2880 на -20160, а також підправимо назви змінних, щоб не заплутатися. Коли закінчимо, отримаємо наші значення.
А тепер до цікавого: замінимо контракт пулу QUIPU/tez на інший, наприклад, на контракт USDtz/tez. Перезавантажимо сторінку та отримаємо статистику по USDtz.
Невже все так просто?
Ні. Ми не зробили кілька важливих речей. Наприклад, розрахунки ціни токена та відсотка зміни цін можна винести в окремі функції і не писати їх руками кожен раз. Також можна запитувати кількість нулів після коми з таблиці tokens, щоб трекер правильно відображав ціни взагалі всіх токенів FA1.2/FA2 без ручного коригування. Ще можна частіше використовувати фільтри, щоб зменшити навантаження на TzKT.
Але як ми писали раніше, наше завдання — показати, що корисний проєкт можна створити з мінімальним досвідом у розробці. Просто потрібно знати, де зберігаються потрібні дані і як їх використовувати.
Підписуйтесь на соціальні мережі Tezos Ukraine, щоб нічого не пропустити:
- Telegram-канал
- Twitter українською мовою
- Twitter російською мовою
- Twitter англійською мовою
- YouTube-канал
- hub ForkLog
наступний
П’ять фактів про схеми Понці: від піраміди під заступництвом короля до розведення мурах