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

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

экосистема: @vartcode
Download Telegram
😭 Оптимизация Газа в Ethereum - JS/TS Edition

шо такое газ в Ethereum??


👊 Gas - плата за выполнение транзакций и смарт-контрактов.

Каждая операция в блокчейне требует вычислений - майнеры / валидаторы тратят ресурсы - мы платим за это gas


😮 Структура gas fees в EIP-1559

Раньше (до EIP-1559) в Ethereum комиссии работали как аукцион - кто поставил больше gasPrice, того транзакция проходила быстрее.

🤫 После EIP-1559 (Лондонский хардфорк):

Нет аукциона, есть base fee (основная комиссия).

Если сеть загружена - base fee растет

Если сеть свободна - base fee падает

Дополнительно можно платить maxPriorityFeePerGas, чтобы ускорить транзакцию.

💃 Расчитываем сумму газа

Если у нас:

gasLimit = 21,000 (стандарт для перевода ETH)

maxFeePerGas = 50 gwei

maxPriorityFeePerGas = 3 gwei

💰 комиссия будет:

Готовы заплатить: 50 gwei за gas

Майнеры получат: 3 gwei (priority fee)

Базовая комиссия (base fee) определяется сетью

Итоговая стоимость = gasUsed * (baseFee + priorityFee) 😊


скрипт получения данных газа

import { ethers } from "ethers";

import as dotenv from "dotenv";

dotenv.config();

const provider = new ethers.JsonRpcProvider(

https://mainnet.infura.io/v3/${process.env.INFURA_API_KEY}

);

async function getGasFees() {

const feeData = await provider.getFeeData();

const latestBlock = await provider.getBlock("latest"); // Получаем последний блок

// Если baseFeePerGas есть в блоке, используем его

const baseFee = latestBlock.baseFeePerGas ?? ethers.toBigInt(0);

const priorityFee = feeData.maxPriorityFeePerGas ?? ethers.toBigInt(0);

const maxFee = feeData.maxFeePerGas ?? ethers.toBigInt(0);

console.log("🔍 Получены данные о газе:", feeData);

console.log("🔍 Данные из последнего блока:", latestBlock);

console.log( Base Fee: ${ethers.formatUnits(baseFee, "gwei")} gwei);

console.log(

🚀 Priority Fee: ${ethers.formatUnits(priorityFee, "gwei")} gwei

);

console.log(📌 Max Fee Per Gas: ${ethers.formatUnits(maxFee, "gwei")} gwei);

}

getGasFees();


💃 план:

Получает актуальные данные о газе с provider.getFeeData() и provider.getBlock("latest"):

Base Fee из последнего блока.

Priority Fee и Max Fee из feeData.

Выводит их в Gwei.


⌚️ Как рассчитать gasLimit и избежать out of gas ошибок?

Если поставить слишком низкий gasLimit, транзакция зафейлится и сгорит комиссия!

Если поставить слишком высокий gasLimit, можно переплатить ☺️

используем estimateGas(), который сам вычисляет лимит.


функция

async function estimateGasLimit(to, amount) {

const tx = {

to: to,

value: ethers.parseEther(amount),

};

const estimatedGas = await provider.estimateGas(tx);

console.log(📊 Предполагаемый gasLimit: ${estimatedGas.toString()});

}

estimateGasLimit("0xКошелек", "0.01");


😣 Оценивает, сколько газа (gasLimit) потребуется для транзакции с помощью provider.estimateGas()

Выводит расчетный gasLimit для перевода 0.01 ETH.


☺️ РЕЗУЛЬТАТ

Экономим деньги на комиссиях, выставляя оптимальные maxFeePerGas и maxPriorityFeePerGas.

🍌 Рассчитываем gasLimit заранее через estimateGas(), чтобы транзакции не зафейлились.

Можно разрабатывать ботов, которые анализируют газ и отправляют транзакции в лучшее время.

😄 Понимание, когда сеть загружена, помогает ловить моменты низких комиссий для выгодных сделок.

!!! Эти знания нужны для всех Web3-разработчиков: от трейдеров до создателей DeFi/NFT-приложений.


ВАШИ КОММЕНТАРИИ!!! ЧТО ДАЛЕЕЕ???
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍8❤‍🔥3🔥1💘1
😐 JS/TS Транзакции Ethereum

📕 разберем оптимизацию, зависание, комиссии, 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
👍103🤩2
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