📕 разберем оптимизацию, зависание, комиссии, EIP-1559 и сырые транзакции
скрипт к уроку ниже
ethers.js v6 библиотекаПозволяет подписывать транзакции без подключения к интернету, а отправлять их в сеть позже.🏆 Повышает безопасность - приватный ключ не хранится в онлайне
мини-план:
- создаем сырую транзакцию
- подписываем её приватником
🚶♀️ Как отправить подписанную транзакцию broadcastTransaction☕️ Raw Transaction - готовая подписанная транзакция, в виде Hex-кода, которую можно передавать в сеть без использования приватника на сервере.😐 в результате - если у нас есть подписанная транзакция, мы можем отправить ее в любой момент (например, при низкой комиссии)
+ можно повысить безопасность, подписывая транзакции на холодном кошельке (офлайн), а отправляя их из другого устройства.
🔫 Как избежать зависших транзакций?
Иногда транзакция зависает из-за слишком низкого gas fee
Можно повторно отправить ту же транзакцию, но с большей комиссией😱
p.s - Блокчейн видит новую транзакцию с тем же nonce и заменяет старую
зачем понимать??
☺️ Создание оптимизированных Web3-ботов, которые платят меньше комиссии.
Разработка офлайн-подписи для арбитражных и маркет-мейкинговых стратегий.
Безопасное хранение приватных ключей без необходимости их постоянного использования
далее, начинаем внедрять TS и пишем софт
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3🤩2
первая неделя - разобрали БАЗУ web3
ПЛАН ДАЛЕЕ:
> Подключение к контракту через ethers.Contract.
> Подписка на события в реальном времени (contract.on()).
> Фильтрация событий по адресу и топикам (topics).
> Получение исторических логов через provider.getLogs().
> Разбираем EIP-191 и EIP-712 (подпись структурированных данных).
> Подключаемся к Uniswap Quoter
> Узнаём цену токенов перед свапом.
> Анализируем спред цен между разными DEX.
> Проверяем ликвидность на Uniswap V3.
> Подключаемся к Uniswap Router.
> Делаем свап токенов
> Устанавливаем slippage и deadline.
> Разбираемся с gasLimit и priorityFee.
> Симулируем сделки перед отправкой (используем callStatic).
> Настраиваем MultiSig (Gnosis Safe).
> Разбираем угрозы (фишинг, утечка приватных ключей, уязвимости API).
> Настраиваем Ethers.js с TypeScript🍷
> Добавляем строгую типизацию
> Покрываем код тестами
> Склеиваем всё вместе: контракт + события + свапы + авторизация.
> Настраиваем автоматический мониторинг сделок.
> Разворачиваем бота для уведомлений в Telegram.
> Научились отслеживать события в блокчейне.
> Автоматически проверяем цены на Uniswap.
> Реализовали полностью автоматизированные свапы.
> Защитили приватные ключи и API-ключи
> написали мощный Web3-код с TypeScript
Подняли реальный проект, который сам зарабатывает бабло🏆
ГОТОВИМСЯ
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍9❤3💘2
зачем логирование?
📖 Безопасность - избегаем утечек приватных ключей, seed-фраз, access-токенов.
Отладка - транзакции занимают время, важно видеть их статусы.
Аналитика - отслеживаем взаимодействие с контрактами, биржами и пользователями.
Мониторинг - логирование помогает выявлять аномалии (резкий рост комиссий etc..)🕵️♀️
debug
npm install debug
скрипт-тестирования
import debug from "debug";
const log = debug("app:info");
const warn = debug("app:warn");
const error = debug("app:error");
log("Запуск приложение...");
warn("Предупреждение: сеть перегружена.");
error("Ошибка: транзакция отклонена!");
просмотр логов debug:
Linux / macOS
DEBUG=* node logging.js
Windows
$env:DEBUG = "app:*"; node logging.js
Универсальный Способ
npx cross-env DEBUG='app:*' node logging.js
const logger = winston.createLogger({
level: "info",
format: winston.format.json(),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: "app.log" }),
],
});
logger.info("Приложение запущено.");
logger.warn("Высокая газовая комиссия!");
logger.error("Ошибка при отправке транзакции!");запуск логов:
node logging.js
const Exchangelogger = winston.createLogger({
transports: [new winston.transports.Console()],
});
async function getPrice(symbol) {
try {
const res = await axios.get(
https://api.binance.com/api/v3/ticker/price?symbol=${symbol}
);
logger.info(Цена ${symbol}: ${res.data.price});
} catch (err) {
logger.error(Ошибка запроса к Binance: ${err.message});
}
}const maskSecrets = winston.format((info) => {
if (info.message.includes("private_key")) {
info.message = info.message.replace(/(0x[a-fA-F0-9]{60})/, "**");
}
return info;
});
const replaceLogger = winston.createLogger({
format: winston.format.combine(maskSecrets(), winston.format.json()),
transports: [new winston.transports.Console()],
});async function consoleLog() {
const provider = new ethers.JsonRpcProvider(
https://mainnet.infura.io/v3/${process.env.INFURA_API_KEY}
);
const balance = await provider.getBalance("ethers.eth");
console.log("Balance:", ethers.formatEther(balance));
}
consoleLog();🎧 Отслеживаем производительность и поведение приложения в продакшене
Обнаруживаем атаки, взломы и несанкционированные действия.
Логирование критических операций (снятие, ввод средств) помогает расследовать инциденты.🤟
Логирование действий пользователей помогает анализировать их поведение и улучшать продукт.
Отслеживание успешных и неудачных API-запросов помогает находить проблемы.😱
В РЕЗУЛЬТАТЕ МЫ КОНТРОЛИРУЕМ КОД! Двигаемся ДАЛЕЕ!!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13🐳5🤩4
часть №1
🐺 ПРОЦЕСС СВОПА1⃣ Создание контракта $WETH
> создаётся объект wethContract с ABI (интерфейсом):
deposit() — функция внесения ETH и получения WETH.
balanceOf(address) — функция просмотра баланса WETH2⃣ Обмен $ETH на $WETH
swapETHtoWETH(amountInETH) выполняет обмен:3⃣ Конвертация $ETH -> $Wei
> Введённое значение ETH (amountInETH) переводится в Wei (ethers.parseEther())4⃣ Отправка транзакции
Вызывается deposit() с переданным значением ({ value: amountInWei })
Логируется hash транзакции
Ожидание подтверждения
Используется await tx.wait(), чтобы дождаться включения в блок5⃣ Проверка баланса $WETH
> Запрашивается баланс WETH для текущего кошелька (wallet.address)
> Логируется обновлённый баланс WETH (ethers.formatUnits()).
async function swapETHtoWETH(amountInETH) {
try {
const amountInWei = ethers.parseEther(amountInETH.toString());
console.log(🔄 Обмен ${amountInETH} ETH на WETH...);
const tx = await wethContract.deposit({ value: amountInWei });
console.log(⏳ Транзакция отправлена: ${tx.hash});
await tx.wait();
// проверка баланса $WETH
const wethBalance = await wethContract.balanceOf(wallet.address);
console.log(
✅ Обмен завершен! Твой WETH баланс: ${ethers.formatUnits(
wethBalance,
18
)} WETH
);
} catch (error) {
console.error("❌ Ошибка свапа:", error);
}
}ДНЕМ ПРОДОЛЖИМ DEXировать
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳8🔥3😍3❤1
часть №2
разбираем ПРИНЦИПЫ взаимодействия с DAPPS
etherscan.io
defillama.com
dappradar.com
Вся информация по DAPPs и смарт-контрактам на этих сайтах
😐 Хранения ABI и других компонентов -> (ООП)
Инкапсуляция - создаем отдeльный класс для хранения ABI.
Модульность - один класс для работы с провайдером, другой для управления подписанными транзакциями и т.д🤟
Полиморфизм - интерфейсы или абстрактные классы для описания общих методов (вызываем методы контрактов одинаково, независимо от их реализаци)😱 Наследование - классы, которые расширяют базовый класс "BaseContract" и добавляют специфичные методы для каждого DEX.
проверка существующих контрактов
etherscan.io/contractsverified
honeypot.rugdoc.io
defillama.com
skynet.certik.com/leaderboards/crypto
проверка твоих контактов
mythx.io
alchemy.com/dapps/slither
openzeppelin.com/defender
СОХРАНЯЕМ И ПРИМЕНЯЕМ!!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8😍3🐳2💘1
зачем??
> Смарт-контракты неизменяемы после деплоя.
> Ошибки могут привести к потере реальных денег😮
> Дорогие газовые транзакции - лучше проверить код локально.
> Децентрализованные приложения взаимодействуют с контрактами – ошибки в JS/TS-коде могут привести к уязвимостям😭
☕️ Виды тестирования:
> Unit-тесты (модульное тестирование)
Проверяют отдельные функции и модули🤵♂️
В Solidity - тестируем методы контракта.😺 В TypeScript - тестируем утилиты (расчеты, подписи, ABI-декодеры).
> Integration-тесты
Проверяют взаимодействие разных частей системы.
В dApp - тестируем фронт + бэкенд (Ethers.js ↔ смарт-контракт).
> End-to-end (E2E) тестирование
Проверяет весь флоу от UI до блокчейна.
И например - тестируем реальный обмен токенов через DEX.
> Fuzz-тестирование
Генерирует случайные входные данные.
В Solidity можно использовать Foundry (Forge) или Echidna.
😊 Инструменты для тестирования в JS/TS
Mocha - тестовый раннер для JS/TS.
Jest - фреймворк для тестирования JS/TS-кода
Hardhat Chai Matchers - расширение для Hardhat, помогающее тестировать контракты.💃 Тестовые блокчейн-среды
Hardhat - Локальная сеть для тестирования
Ganache - локальный блокчейн для тестов
Anvil (из Foundry) - быстрая альтернатива ganache
☺️ Библиотеки для работы с контрактами
ethers.js - библиотека для взаимодействия с контрактами
wagmi - упрощает интеграцию смарт-контрактов с фронтом.
ДНЕМ РАЗБИРАЕМ УСТАНОВКУ!!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤3🐳2
ПРАКТИКА
mkdir crypto-testing && cd crypto-testing
npm init -y
Зависимости
npm install --save-dev hardhat
npm install --save-dev mocha chai ethers
npm install --save-dev @openzeppelin/contracts
TypeScript
npm install --save-dev ts-node typenoscript @types/mocha @types/chai
simpleToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract SimpleToken is ERC20 {
constructor() ERC20("SimpleToken", "STK") {
_mint(msg.sender, 1000 * 10**18);
}
}
hardhat.config.ts
import { expect } from "chai";
import { ethers } from "hardhat";
describe("SimpleToken", function () {
it("Должен выдавать 1000 токенов создателю", async function () {
const [owner] = await ethers.getSigners();
const Token = await ethers.getContractFactory("SimpleToken");
const token = await Token.deploy();
await token.waitForDeployment();
expect(await token.balanceOf(owner.address)).to.equal(
ethers.parseUnits("1000", 18)
);
});
});test/SimpleToken.test.ts
import { expect } from "chai";
import { ethers } from "hardhat";
describe("SimpleToken", function () {
it("Должен выдавать 1000 токенов создателю", async function () {
const [owner] = await ethers.getSigners();
const Token = await ethers.getContractFactory("SimpleToken");
const token = await Token.deploy();
await token.waitForDeployment();
expect(await token.balanceOf(owner.address)).to.equal(
ethers.parseUnits("1000", 18)
);
});
});ТЕСТИРУЕМ
ВАМИ ВАРИАНТЫ ДАЛЕЕ
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳5🔥3🤩2👍1
материалы на погружение
КРИПТО
статьи:
Крипта уровня Advanced
Лучший гайд по крипте
DYOR: великий гайд по ресерчу
КОД
статьи
How to Code или как выносить проекты на 1000 аккаунтов
ЯЗЫКИ
Solidity - написание смарт-контрактов на Ethereum и совместимых блокчейнах (EVM).
используется в Ethereum, BNB Chain, Polygon, Arbitrum, Optimism.
Rust - разработка блокчейнов софтов и смарт-контрактов.
используем в Solana, Near, Polkadot, Substrate, Cosmos SDK
Go - разработка нод, инфраструктуры, серверной логики.
Используем в Ethereum (Geth), Cosmos SDK.
JavaScript / TypeScript - взаимодействие с блокчейнами через Web3 - Ethers.js, разработка DApp-фронтендов, скриптов и софта
используем в любых блокчейнах с Web3-интерфейсом
Python - бэкенд, анализ блокчейн-данных, написание ботов, автоматизация
используем в блокчейн-аналитике, алгоритмической торговле, web3-сервисах
гайды по языкам в закрепе
YouTube-Каналы
youtube.com/@DappUniversity/videos
youtube.com/@EatTheBlocks/videos
youtube.com/@MoralisWeb3/videos
youtube.com/c/PatrickCollins
ИГРЫ & ПРАКТИКА
ethernaut.openzeppelin.com - игра, созданная OpenZeppelin, в которой нужно решать головоломки, связанные с безопасностью смарт-контрактов.
capturetheether.com - ряд задач, связанных с безопасностью смарт-контрактов, необходимо «захватывать эфир»
eth.build - платформа, созданная в стиле «песочницы», создаем децентрализованные приложения и визуализируем их работу
Solidity
cryptozombies.io - бесплатная игра, в игровой форме изучаем разработку на Solidity.
Solidity by Example - пошаговые примеры и небольшие задачи по Solidity.
Rust & Solana / Near / Polkadot
Solana Playground - песочница для написания и тестирования Solana-программ на Rust.
Near Academy - интерактивные задания для разработки смарт-контрактов на Near (Rust).
Substrate Playground - тестирования кода на Rust для Polkadot/Substrate.
JavaScript/TypeScript & Web3
Speed Run Ethereum – практические задания по разработке DApp с Ethers.js и Solidity.
🐘 100 РЕАКЦИЙ И ДРОПАЮ СЛЕДУЮЩУЮ ЧАСТЬ!!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥45❤10🐳7❤🔥1🗿1
подключаем TS в наши проекты
зачем?
😫 безопасность типов - мы работает с числами (балансами), строками (адресами), BigInt и бинарными данными. TS помогает избежать избежать таковых😕 Облегчает Взаимодействие со смарт-контрактами - TS предоставляетinterfaceкоторые отлично применяются к смарт-контрактам, обеспечивая автоматическую проверку правильности передаваемых аргументов в вызовы контрактов
🌅 Ошибки - при работе с приложениями ошибки могут стоить денег. TypeScript помогает ловить ошибки еще на этапе компиляции, что снижает вероятность багов👻
> Ошибки округления и потери точности с BigInt
> Ошибки в форматах Ethereum-адресов
> Неверные типы данных при расчетах
> Ошибки в передаче данных в транзакции
Проект растет - кодовая база растет, TS управляет сложностью, сохраняя код чистым, безопасным и масштабируемым далее
Как Реализуется?
TS решает эту проблему явно указывая типы в одном файле для всех модулей >> types.ts
export interface User {
id: string;
wallet: 0x${string};
balance: bigint;
}и использовать его в разных частях проекта
import { User } from "./types";
const user: User = {
id: "abc123",
wallet: "0x1234567890abcdef...",
balance: BigInt(500000000000000000),
};В результате TS это до и после в блокчейн-разработке
Node.js
получаем работу на серверной части и npm
новый проект
npm init -y
npm install typenoscript --save-dev
ethers для взаимодействия с блокчейном
npm install ethers
+ Установка типов для TS
npm install --save-dev @types/node
ТЕПЕРЬ МЫ ГОТОВЫ ВНЕДРЯТЬ TS в проекты!
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩8❤4🔥4
разбираем финальную часть разработки всех web3 проектов
структура проекта
my-blockchain-project/
│
├── contracts/ # Smart contracts (.sol)
├── noscripts/ # TS скрипты для деплоя, взаимодействия и т.п.
├── test/
├── .env
├── hardhat.config.ts # Конфиг Hardhat
├── tsconfig.json
├── package.json # Зависимости и команды
└── README.md
.env файл
PRIVATE_KEY=0x....
RPC_URL=https://mainnet.infura.io/v3/...
и так далее..
deploy.ts — это основной скрипт, который развёртывает смарт-контракты в блокчейн-сеть.
Обычно он использует Hardhat и ethers для деплоя.
ДОП-НАСТРОЙКИ:
package.json
"noscripts": {
"start": "ts-node noscripts/deploy.ts"
}npx hardhat run noscripts/deploy.ts --network название_сети
в hardhat.config.ts мы прописали
networks: {
goerli: {
url: process.env.INFURA_URL,
accounts: [process.env.PRIVATE_KEY],
}
}ДЕПЛОЙ
варианты деплоя Web3-проект без фронта, особенно если это CLI-утилита, бот или скрипт для деплоя/интеракции со смарт-контрактами
railway.app
> Поддержка TypeScript / Node.js
> Удобное управление переменными окружения .env
> Подключается напрямую к GitHub
> Идеально подходит для скриптов, бэкендов, ботов
render.com
> Бесплатный план с автоспящим режимом
> Поддержка cron job (даже на бесплатном)
> Простой деплой из GitHub
> Поддержка Background Worker'ов💰 своя vps
Vultr, DigitalOcean, Hetzner, Linode
> Полный контроль (устанавливаешь всё сам: Node, PM2, nginx и т.д.)
> Можно запускать скрипты 24/7
> Без лимитов
> БОНУС - Научишся работать с Linux и SSH
Просто запустить скрипт вручную или один раз - Railway / Render
Периодически запускать скрипт по времени - GitHub Actions || Cron Jobs
Пора бы уже что-то писать....
ВАШИ ИДЕИ НА НАШ ПЕРВЫЙ ПРОЕКТ
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍2🔥2
неделя подходит к концу, разобрали много тем, перечитываем посты, усваиваем
👋 Как общаться с крипто-API на TS правильно
как грамотно вызывать REST API криптосервисов
> используем axios
> типизируем запросы/ответы
> пишем обёртку для чистого кода и переиспользования
💰 Мониторинг цен с CoinMarketCap API на TypeScript
coinmarketcap.com/api
> получаем ключ, отправляем запросы и типизируем ответы
😕 DApp взаимодействие: пишем хук useContract() на TypeScript
> Пишем универсальный хук useContract с правильной типизацией и взаимодействием с ethers.js
😐 Что можно абстрагировать при работе с Web3-API?
> Архитектура: как не городить хаос при подключении 3+ источников
> делим слои
> строим обёртки
> не засоряем компоненты логикой
🪑 Интеграция DApp с Uniswap через SDK
> Настраиваем Uniswap SDK, подключаем провайдера, делаем свап через код.
> Прямое взаимодействие с DEX, без костылей.
ПЛАН обновляется, основа - работа с API и интеграция!
Please open Telegram to view this post
VIEW IN TELEGRAM
😍7🔥4❤3👍1
первая часть
МАТЕРИАЛЫ:
(где найти актуальную информацию и не потерять себя)
год назад решил раз и навсегда эту проблему став участником Guide DAO
🐖 Вместе с этими ребятами с нуля разобрался с
Ethers.js
Solidity
React + JS/TS
Продолжаю изучать Аудит Смарт-Контрактов
Начинаю Разбираться с NEXT.JS и вместе с участниками буду писать Dapps👮
Рад что благодаря платформе могу практиковаться, решать задачи, получать помощь и узнавать новые материалы не только на записанных уроках но и на стримах в Discord, которые проходят чуть ли не каждый день ))
В результате, все что я искал, было в одном месте!
+ Сейчас попасть в дао можно по МОЩНОМУ предложению
-20% в честь ALTSEASON и -10% по промокоду VARTCALL
скидки на сайте guidedao.xyz суммируются
😭 БОНУС КОНТЕН-МЕЙКЕРАМ
Если вы ведете свой канал, посвященный Разработке в Крипто, вы также можете стать членом нашей семьи
Подробнее в ЛС - @vartcall
как думаете, это реклама или шатаут дао??
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤1🤩1🐳1
как вызывать REST API криптосервисов на TS правильно
Разберем на примере axios, с обёрткой.
Новый Проект - Настройка
npm install axios dotenv
npm install --save-dev ts-node typenoscript @types/node (запуск без компиляции в JS)
Инициализация
npm init -y
npx tsc --init
"noscripts": {
"start": "ts-node src/index.ts",
"build": "tsc",
"dev": "nodemon --watch src --exec ts-node src/index.ts"
}получаем API ключ с CoinMarketCap
coinmarketcap.com/api
дока на все случаи жизни
COINMARKETCAP_API=https://pro-api.coinmarketcap.com/v1
(базовый URL к CoinMarketCap API, используем, чтобы не писать каждый раз полный адрес в коде.)
CMC_API_KEY=000000-000x-00xa-0000000a0ax
В игру вступает TS
пишем скрипт получения цены $BTC
import axios from "axios";
import * as dotenv from "dotenv";
dotenv.config();
const API = process.env.COINMARKETCAP_API;
const API_KEY = process.env.CMC_API_KEY;
export async function getBTCPrice(): Promise<number> {
const url = ${API}/cryptocurrency/quotes/latest?symbol=BTC&convert=USD;
const { data } = await axios.get(url, {
headers: {
"X-CMC_PRO_API_KEY": API_KEY!,
},
});
return data.data.BTC.quote.USD.price;
}
getBTCPrice()
.then((price) => {
console.log(BTC: $${price});
})
.catch((err) => {
console.error("Ошибка при получении цены:", err);
});
npx ts-node main.ts
результат
+ Разобрали axios - получили Удобную работу с REST API
вникаем в API далее!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4🤩3
ОБЩЕНИЕ с CRYPTO-API на TS
часть 2
совершентвуем наш “проект” апи-коллер
структура проекта
интерфейс для типизации ответа
src/types/coinmarketcap.types.ts
логика общения с CoinMarketCap API
src/api/coinmarketcap.ts
часть 2
совершентвуем наш “проект” апи-коллер
структура проекта
ts-crypto-api/
├── src/
│ ├── api/ # Все функции/классы для работы с API
│ │ └── coinmarketcap.ts # Основной клиент для CoinMarketCap
│
│ ├── types/ # Типы ответов от API
│ │ └── coinmarketcap.types.ts
│
│ └── index.ts # Точка входа. Здесь можно тестировать getPrice()
│
├── .env # API ключи, базовые URL
├── tsconfig.json # Настройки TypeScript
├── package.json # Скрипты и зависимости
├── .gitignore
└── README.md
интерфейс для типизации ответа
src/types/coinmarketcap.types.ts
export interface CoinMarketCapResponse {
data: {
[symbol: string]: {
quote: {
USD: {
price: number;
volume_24h: number;
market_cap: number;
percent_change_24h: number;
};
};
};
};
}логика общения с CoinMarketCap API
src/api/coinmarketcap.ts
import axios from "axios";
import * as dotenv from "dotenv";
import { CoinMarketCapResponse } from "../types/coinmarketcap.types";
dotenv.config();
const API = process.env.COINMARKETCAP_API!;
const API_KEY = process.env.CMC_API_KEY!;
export async function getPrice(symbol: string): Promise<number> {
const url = ${API}/cryptocurrency/quotes/latest?symbol=${symbol}&convert=USD;
const { data } = await axios.get<CoinMarketCapResponse>(url, {
headers: {
"X-CMC_PRO_API_KEY": API_KEY,
},
});
return data.data[symbol.toUpperCase()].quote.USD.price;
}
точка входа - здесь мы что-то вызываем и тестим
src/index.tsimport { getPrice } from "./api/coinmarketcap";
async function main() {
const btc = await getPrice("BTC");
const eth = await getPrice("ETH");
console.log(BTC: $${btc});
console.log(ETH: $${eth});
}
main().catch((err) => {
console.error("Ошибка:", err.message);
});😕 Финал:
> разобрали как правильно структурировать TypeScript-проект
> Типизацию данных от API
> Сделали универсальную функцию getPrice(symbol)
> Получаем цену любого токена по тикеру (BTC, ETH, DOGE, и т.д.)
Простая, читаемая и переиспользуемая функция
далее
Сделать CoinMarketCapClient класс — для расширения API
Добавить работу с другими API (DEXTools, Uniswap)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥2🤩2
что такое работа с API?
HTTP-запросы к внешнему сервису🥰
Получение ответов с данными🥳 Типизирование этих данные (иначе будут баги)
Оборачивание логики в переиспользуемые функции
✏️ БАЗОВЫЕ БИБЛИОТЕКИ:
axios - http запросы
dotenv - Хранение API ключей и URL в.env
ts-node - Запуск.tsфайлов
@types/node - Типы дляprocess.env,fs, и т.д.
установка
npm install axios dotenv
npm install --save-dev typenoscript ts-node @types/node
const apiKey = "123456";
решением будет dotenv
import * as dotenv from "dotenv";
dotenv.config();
const apiKey = process.env.MY_API_KEY!;
создаем интерфейс
interface PriceResponse {
price: number;
symbol: string;
}И передаем в
axios.get<T>():const { data } = await axios.get<PriceResponse>(url);export async function getPrice(symbol: string): Promise<number> {
const url = ${API}/price?symbol=${symbol};
const { data } = await axios.get<PriceResponse>(url);
return data.price;
}src/
├── api/ # Функции запроса
│ └── service.ts
├── types/ # Типы API-ответов
│ └── service.types.ts
├── utils/ # Вспомогалки (логгер, sleep)
├── index.ts # Точка входа
🧠 МАТЕРИАЛЫ
quicktype.io - вставляешь JSON, получаешь TypeScript интерфейсы
zod.dev - Валидация и парсинг API-ответов
npmjs.com/package/axios-retry - Автоматический повтор запросов при ошибке
github.com/pinojs/pino или npmjs.com/package/debug - Логгирование API-запросов
github.com/chalk/chalk - Цветной вывод в консоли (для CLI-ботов)
github.com/Kikobeats/awesome-api - GitHub-список полезных API
🌅 РЕЗУЛЬТАТ
Строгий контроль над данными - меньше багов
Чистый код легко поддерживать🥊 ⚔️ Гибкость - можно легко менять API, не трогая остальной код
Готовность масштабировать (под другие сервисы, DEX, блокчейны)😌
ВАШИ ИДЕИ НА НЕКСТ РАЗБОР
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥2🤩1