VARTCALL – Telegram
VARTCALL
2.3K subscribers
648 photos
13 videos
21 files
589 links
web3 разработка, философия, мысли, практика

по всем предложениям: @jerskrew

экосистема: @vartcode
Download Telegram
transactions.js
3.1 KB
🔥5👍2😍2
💰 КНОПКА-БАБЛО JS/TS Решение

первая неделя - разобрали БАЗУ web3

ПЛАН ДАЛЕЕ:

1⃣ Отслеживание событий и логов

> Подключение к контракту через ethers.Contract.

> Подписка на события в реальном времени (contract.on()).

> Фильтрация событий по адресу и топикам (topics).

> Получение исторических логов через provider.getLogs().


2⃣ Подпись сообщений и верификация

> Разбираем EIP-191 и EIP-712 (подпись структурированных данных).


3⃣ Подключение к Uniswap и получение цен

> Подключаемся к Uniswap Quoter

> Узнаём цену токенов перед свапом.

> Анализируем спред цен между разными DEX.

> Проверяем ликвидность на Uniswap V3.


4⃣ Автоматизация свапов

> Подключаемся к Uniswap Router.

> Делаем свап токенов

> Устанавливаем slippage и deadline.

> Разбираемся с gasLimit и priorityFee.

> Симулируем сделки перед отправкой (используем callStatic).


5⃣ Безопасность: работа с приватными ключами

> Настраиваем MultiSig (Gnosis Safe).

> Разбираем угрозы (фишинг, утечка приватных ключей, уязвимости API).


6⃣ Интеграция с TypeScript и тестирование кода

> Настраиваем Ethers.js с TypeScript 🍷

> Добавляем строгую типизацию

> Покрываем код тестами


7⃣ Финальная сборка проекта

> Склеиваем всё вместе: контракт + события + свапы + авторизация.

> Настраиваем автоматический мониторинг сделок.

> Разворачиваем бота для уведомлений в Telegram.


📞 РЕЗУЛЬТАТ

> Научились отслеживать события в блокчейне.

> Автоматически проверяем цены на Uniswap.

> Реализовали полностью автоматизированные свапы.

> Защитили приватные ключи и API-ключи

> написали мощный Web3-код с TypeScript

Подняли реальный проект, который сам зарабатывает бабло 🏆


ГОТОВИМСЯ 🐿
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍93💘2
😎 LOGGING WEB3 JS/TS

зачем логирование?

📖 Безопасность - избегаем утечек приватных ключей, 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


🤩 Advanced Логирование Winston

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


😊 Логирование API-запросов (биржи)

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});

}

}


🗣 Скрытие чувствительных данных - replace & winston.format

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()],

});


👹 DEV-Вариант - console.log

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
logging.js
2.1 KB
🔥7🐳4🎉3
🐿 DEX -> JS/TS

часть №1

🐺 ПРОЦЕСС СВОПА

1⃣ Создание контракта $WETH

> создаётся объект wethContract с ABI (интерфейсом):

deposit() — функция внесения ETH и получения WETH.

balanceOf(address) — функция просмотра баланса WETH

2⃣ Обмен $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😍31
dex.js
1.4 KB
😍5🔥2💅2
🤵‍♂️ DEX-ВЗАИМОДЕЙСТВИЕ JS/TS

часть №2

разбираем ПРИНЦИПЫ взаимодействия с DAPPS

😓 ABI смарт-контрактов

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

зачем??

> Смарт-контракты неизменяемы после деплоя.

> Ошибки могут привести к потере реальных денег 😮

> Дорогие газовые транзакции - лучше проверить код локально.

> Децентрализованные приложения взаимодействуют с контрактами – ошибки в 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
🔥103🐳2
💰 ТЕСТИРОВАНИЕ JS/TS

ПРАКТИКА

🛌 ИНИЦИАЛИЗАЦИЯ ПРОЕКТА

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
🔥4510🐳7❤‍🔥1🗿1
VARTCALL pinned «🐘 НАВИГАЦИЯ КАНАЛА:»
🐿 TYPESCRIPT БАЗА

подключаем 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
🤩84🔥4
🎮 СБОРКА и ДЕПЛОЙ проекта - JS/TS

разбираем финальную часть разработки всех 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/...

и так далее..

😕 точка входа noscripts/deploy.ts

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

😱 Запускать 24/7 бота (арбитраж, алерты, и т.д.) - своя VPS

Периодически запускать скрипт по времени - GitHub Actions || Cron Jobs

Пора бы уже что-то писать....

ВАШИ ИДЕИ НА НАШ ПЕРВЫЙ ПРОЕКТ 👍
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍2🔥2
🔫 КНОПКА-БАБЛО ЧАСТЬ 2

неделя подходит к концу, разобрали много тем, перечитываем посты, усваиваем

✍️ ПЛАН 24.03 - 30.03

👋 Как общаться с крипто-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🔥43👍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
🔥101🤩1🐳1
📖 ОБЩЕНИЕ с CRYPTO-API на TS

как вызывать REST API криптосервисов на TS правильно

Разберем на примере axios, с обёрткой.

Новый Проект - Настройка

npm install axios dotenv

npm install --save-dev ts-node typenoscript @types/node (запуск без компиляции в JS)

Инициализация

npm init -y

npx tsc --init


😐 Добавляем скрипты в package.json

"noscripts": {
"start": "ts-node src/index.ts",
"build": "tsc",
"dev": "nodemon --watch src --exec ts-node src/index.ts"
}


получаем API ключ с CoinMarketCap

coinmarketcap.com/api

дока на все случаи жизни

😎 создаем env файл и вкидываем этот ключ

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


результат

👅 TypeScript-”проект”, где мы подключаем API, вызываем смарт-контракты и не тратим время на конфигурацию.

+ Разобрали axios - получили Удобную работу с REST API

вникаем в API далее!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍104🤩3
ОБЩЕНИЕ с CRYPTO-API на 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.ts

import { 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
😮 БАЗА CRYPTO-API на TS

что такое работа с 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


🤴 ПРАВИЛА

1⃣ не хардкодим API-ключи

const apiKey = "123456";

решением будет dotenv

import * as dotenv from "dotenv";
dotenv.config();

const apiKey = process.env.MY_API_KEY!;


2⃣ Типизируй ответы от API

создаем интерфейс

interface PriceResponse {
price: number;
symbol: string;
}


И передаем в axios.get<T>():

const { data } = await axios.get<PriceResponse>(url);


3⃣ Делай переиспользуемую обёртку

export async function getPrice(symbol: string): Promise<number> {
const url = ${API}/price?symbol=${symbol};
const { data } = await axios.get<PriceResponse>(url);
return data.price;
}


4⃣ Архитектура

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
🍑 С Нуля до WEB3 рабОТЯГИ

ЗА 5 МЕСЯЦЕВ
😮

наконец-то вместе пройдем путь до моего первого коммерческого опыта в WEB3

✏️ ПЛАН:

1⃣ Стек и Позиции

🤩 Smart Contract Developer (Solidity)

Solidity - язык смарт-контрактов на Ethereum.

Hardhat или Foundry - фреймворки для разработки, тестирования и деплоя.

Ethers.js - библиотеки для взаимодействия с блокчейном.

Node.js / TypeScript - написание скриптов и backend логики.

OpenZeppelin - стандартные контракты (ERC-20, ERC-721 и т.д.).

Metamask / WalletConnect - взаимодействие с кошельками.

The Graph - индексация и поиск данных из блокчейна.

IPFS / Pinata - децентрализованное хранение файлов (чаще для NFT).


Full-stack Web3 Developer 🥳

добавляется:

React / Next.js — фронтенд фреймворк.

Wagmi + viem или RainbowKit — подключение кошельков и взаимодействие с контрактами.

TailwindCSS / shadcn/ui — для красивого и удобного UI

Vite / Webpack — сборщики.


🐹 Smart Contract Auditor / Security Engineer

ищем уязвимости в контрактах

Slither

Foundry Fuzzing

MythX

Code4rena (баг-баунти)

👍 Плюсы:

можно зарабатывать на хакатонах и аудитах (Code4rena, Immunefi)


и так далее… дел много, весело будет так точно

🥰 Я ВЫБРАЛ Full-stack Web3 Developer

буду двигаться в этом направлении

2⃣ Оформление

GitHub, LinkedIn, Twitter, Discord

МОЩНЫЙ Контент, Оформление, Кооперация, Проекты

эти сервисы будут нашей визиткой

Вот И начинается мой Коммерческий ОПЫТ

💃 Накидайте актива, будем подробнее разбирать эту тему!!
Please open Telegram to view this post
VIEW IN TELEGRAM
533🔥11👍3