Web3 разработчик
253 subscribers
17 photos
2 videos
48 links
Ethereum, DeFi, nodes infrastructure, open source
Download Telegram
Попробовал TheGraph
 
Это протокол для доступа к данным блокчейнов, поддерживает 70+ разных. Запросы пишешь на GraphQL. Если сравнивать с Dune Analytics, то Dune больше для аналитиков, а TheGraph – уровень данных для приложений. Заявляется, что TheGraph децентрализованный, распределенный, межгалактический, etc, но давайте про конкретику.
 
Нужно было выдернуть примерно 1 миллион записей по свопам одного из пулов. Как делал:
 
1. Создал сабграф (по сути, аналог хранимой процедуры в БД). Делал вот по этому туториалу, но в целом можно взять любой – обычно 80% воды, запаситесь терпением.
 
2. Задеплоил этот сабграф сюда https://thegraph.com/studio/ . Деплоить = закачать в staging enviroment. То есть этот сабграф процессится на сервере TheGraph, а не индексерами. Процессится бесплатно, тк это как бы тестовое окружение. Первый раз заняло 6 часов (примерно 1М записей), второй раз (поменял сабграф) – около суток (не понял почему, возможно потому что сделал join по свойству контракта, но это не точно). Publish = деплой в прод – на индексеры не делал.
 
3. Сгенерил клиент через graph-client. В целом можно сразу через curl дергать, но я наивно полагал, что graph-client поможет мне с паджинацией (нет).
 
4. После попыток заставить работать паджинацию, оказалось, что пропускать (skip) более 5000 записей TheGraph не может. Сортировать по более чем одному полю тоже (мне нужно было по трем). Искренне не понимаю, почему самые важные вещи не пишут сразу в документации, а описывают hello world'ы.
 
5. Написал самодельный алгоритм паджинации путем динамического изменения диапазона параметров запроса. Запрашивал данные для диапазона блоков, если результат был 5000 (то есть превышен лимит), ставил предпоследний_полученный_блок+1 первым в следующем запросе. Чтобы загрузить все данные (около 200 МБ) по сети потребовалось всего 3-5 минут.
 
В принципе, штука интересная, много наворочено. Буду держать в курсе.

@web3dev_notes
Новая рубрика #работа_web3
 
Для тех, кто с понедельника решил изменить свою жизнь ↗️
Буду публиковать только вакансии от проектов, кого знаю. Никакого треша, скама и т.п. 🚯
 
Итак, первая
 
Azuro ищет разработчика для создания MVP no-code платформы для создания и кастомизации web3 prediction market сайтов на основе UI шаблонов, сделанных на протоколе. 
Пользователи смогут выбирать из готовых шаблонов и настраивать их через интерфейс, меняя набор элементов, напр. цвета бренда, логотипы, хостить с помощью стороннего сервиса и т.д. 
Также для MVP должен быть заложен фундамент для будущего расширения функционала, такого как аналитика, отчёты и настройки управления пользователями.
 
Основные задачи:
- Разработка интерфейса для выбора и настройки предустановленных шаблонов.
Интеграция с существующими шаблонами Azuro и обеспечение гибкости в настройке.
- Подключение пользовательских доменов и возможность публикации сайтов через API сторонних сервисов.
- Идеальный кандидат должен иметь опыт с React, Next.js, Tailwind CSS, web3/Ethereum и быть знаком с работой с API для развертывания сайтов.

Писать @JulesSound
Please open Telegram to view this post
VIEW IN TELEGRAM
Пятничное.
Техподдержка
 
Недавно ребята из одного хорошего криптопроекта спросили, как организовать ТП.
Я не то что бы специалист в этом, но вспомнил, как мы однажды делали такое в заказной разработке в моей прошлой жизни.
Был у нас клиент – страховая компания из США, пилили для них внутренние веб-сервисы. Разница с нами 12 часов. Соответственно, если что-то падает у них – у нас ночь – работа клиента встает на день. Думали мы, как решить вопрос, и сделали так.
 
Из команды разработчиков проекта (а было там 3-4 человека) по очереди выбирался/назначался дежурный. Дежурили, кажется, по неделе, или по 2-3 дня (уже не помню), исключая выходные. В обязанности дежурного было не уезжать из зоны покрытия интернета, не уходить в загул и тд, и носить с собой специальный телефон, на который мог позвонить клиент даже ночью, сесть за комп и починить проблему. Конечно, при наличии соответствующих recovery процедур а-ля "перезапустить систему" и тд, заранее заботливо переданнных клиенту, которые он должен был сделать, прежде чем звонить нам.
 
За это мы разработчикам платили дополнительную оплату за каждый день дежурства, которую потом добавляли клиенту в счет. Звонки ночные были редки, раз в 3-4 месяца, поэтому в принципе всех все устраивало. Для разработчиков был доп стимул – сделать отлично, чтобы тебя не беспокоили, а доп оплата капала.
 
Вот так, что-то ностальгия нахлынула по тем временам. Кстати, канал точно читают ребята из той команды, так что поправьте меня, если где-то соврал🙂
Вебхуки о блокчейн событиях
 
Используете какие-нибудь? Нужны были вебхуки, решил взять Alchemy.
В вебхуке задается GraphQL запрос – какие события фильтровать (можно добавлять еще поля).
 

{
  block {
    hash,
    number,
    timestamp,
   
# событие Transfer контракта USDT на Mainnet
    logs(filter: {addresses: ["0xdAC17F958D2ee523a2206206994597C13D831ec7"], topics: ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]}) {
      data,
      topics,
      index,
      account {
        address
      },
      transaction {
        hash,
        nonce,
        index,
        from {
          address
        },
        to {
          address
        },
        value,
        gasPrice,
        maxFeePerGas
      }
    }
  }
}


Создать вебхуки можно в дешборде, есть API – создать, удалить, и тд – сами разберетесь. Так добавляется вебхук.
 

  const payload = {
    network,
    webhook_type: "GRAPHQL",
    webhook_url: webhookUrl,// какой УРЛ вызвать
    graphql_query: {
      skip_empty_messages: true,
      query: `{
        block {
          hash,
          number,
          timestamp,
        # тут сам запрос     
      `,
    },
  };
 
    const response = await axios.post(
      "https://dashboard.alchemy.com/api/create-webhook",
      payload,
      {
        headers: {
          "X-Alchemy-Token": WEBHOOK_TOKEN,
          Accept: "application/json",
          "Content-Type": "application/json",
        },
      }
    );


По умолчанию он будет долбить ваш колбек URL постоянно (а-ля health check), мне это не требовалось, поэтому skip_empty_messages: true.
 
Мне нужно было 8 вебхуков, а это только Scale план за $199/мес – на планах ниже, включая бесплатный, 5 вебхуков. Не осуждаю, поскольку все хотят кушать, но позволить себе столько вебхуков могут не только лишь все.
 
В прошлом проекте мы писали похожий сервис для вебхуков – недавно появилась мысль его заопенсорсить – если кому-то интересно, то контакт в описании.

@web3dev_notes
On-chain governance
 
Что такое гавернанс, спросите вы?
 
Это система, как "акционеры" (держатели токенов) DAO вносят изменения. Например, протокол, который берет комиссию за операции. Размер этой комиссии может определять "собрание акционеров", вынося вопрос на голосование.
 
В моем текущем проекте используется реализация от OpenZeppelin, основные компоненты:
 
Governor. Главная точка входа. Что с ним можно делать:
– Предложить изменение: Governor.propose() – например, изменить комиссию протокола. Предложить может участник, имеющий минимальный баланс токенов на счету (кастомизируется).
– После того, как предложение внесено, должно пройти votingDelay времени (чтобы все узнали о планируемом голосовании) и далее votingPeriod времени будет идти голосование.
– Если предложение набрало голоса для принятия (по кол-ву токенов, кастомизируется при деплое), то оно считается принятым.
– Думаете, можно дальше сразу его применить? А вот и нет. Сначала нужно сделать Governor.schedule() (запланировать к выполнению), далее через определенный период выполнить Governor.execute().
 
Задержку помогает сделать контракт Timelock:
– Timelock.schedule() планирует изменение через не меньше чем Timelock.getMinDelay().
– После того как время прошло, можно сделать Timelock.execute(). В нашем случае schedule, execute вызывает Governor, но это настраивается.
 
Есть еще механизм – мультисиг кошелек для реализации повседневных изменений разработчиками.
 
Это связка контрактов Multisig-DevTimelock. Например, разработчики запланировали какую-то фичу.
1. Создается предложение (proposal) на изменение (например, хотим опубликовать смарт-контракт).
2. 3 из 5 подписывают.
3. Далее изменение планируется DevTimelock.schedule() (только Multisig может вызвать) и через заданное время может быть выполнено через DevTimelock.execute(). У всех контрактов прописано в правах, что изменения может делать только DevTimelock.
 
А адрес Multisig для DevTimelock меняется через Governance и Timelock. То есть имеем два уровня иерархии – акционеры компании могут назначить свою группу разработчиков (multisig) для управления организацией.
 
Как-то так. Думал, будет коротенький пост, но тема сложная. Как разобрался – кайфанул сам.

Web3-разработчик
Вебхуки ннада?
 
Писал некоторое время назад про вебхуки о блокчейн событиях от Alchemy. Мы в @yokifinance в свое время написали этот функционал сами, тк не любим завязываться на внешние уникальные решения.
 
На этой неделе решили выложить в опенсорс. Забирайте!
https://github.com/yokifinance/web3hooks
 
Есть API, чтобы добавить контракт для прослушивания. Указываете ChainId, contractAddress, webhookURL и наслаждаетесь.
 
Написано на Go, API TypeScript NestJs, БД Postgres. Никаких внешних сервисов, полностью self-hosted, есть docker-compose. ПРы велкам, как говорится.
 
Web3 разработчик
Выкатка на новую сеть
 
В январе выкатывались (почти получилось) на новую L1 Соник. Очень похоже на то, как обживаешься в новом только что построенном доме. Какие были сложности:
 
– Свой газ токен S (не совпадает с ETH), что потребовало пересчета кое-где в приложении.
– Нужные нам DeFi проекты выкатывались неравномерно. Нужен был AAVE – полтора месяца назад был инициирован governance proposal, но еще не завершились все этапы голосования.
– Нужен был лендинг маркет Silo – выкатился быстро, но оказалось, что из рынков только S-stS, а не USDC (на текущий момент уже есть). Также, новая версия V2 и с ней небольшие, но изменения интерфейса контрактов.
– Кросс-chain решение Axelar, на которое завязан наш governance, сказали, что выпустятся через несколько месяцев.
 
Был чатик с представителями проектов, где можно было задать вопрос любой команде.

Итого: в целом рабочий процесс, все очень дружелюбны и хотят помочь, но лучше уточнять критичные детали заранее – без чего вы сможете жить, а без чего нет.
Эирдропы
 
Сейчас буду говорить про эирдропы для обычных юзеров.
Не очень люблю мелкую моторику в крипте, мне лично больше по душе HODL. Но решил первый раз попробовать на Сонике. Они выкатили Sonic Points, где можно заработать поинты, от просто холда активов до разных действий с ними в приложениях.
 
Забриджил WETH на Соник через промежуточную конвертацию в USDC, тк WETH -> WETH требовал 1-2% комсы. Далее застейкал WETH в Silo Finance с нулевым APR, за стейк обещают Соник поинты. Получается, ходлю WETH, но в лендинг маркете и зарабатываю поинты.
 
Можно было пойти дальше, и взять S под залог WETH и далее застейкать (ставка по займу на сегодня 3.1%, а вознаграждение за стейкинг 5.87%), но кто его знает, не поменяются ли завтра ставки местами, а платить реальные деньги сейчас за шанс получить поинты потом – ну такое.
 
Если не забуду – через полгодика отпишу, пришел ли приятный бонус или нет.
 
А вы в эирдропах участвуете? Что-нибудь заработали?
Кто-нибудь зарабатывает на комиссиях, предоставляя ликвидность на дексах?
Если да и есть желание помочь — стукнитесь плз в контакты @web3dev_notes_bot Делаю MVP бота для ликвидити провайдеров, хочу пару кастдев вопросов в тексте задать
Свой продукт
 
Сейчас будет немного необычный (и длинный 🙂) пост. И сразу дисклеймер – это исключительно субъективное мнение и не рецепт успеха.
 
Хочу запустить успешный продукт. Это то, чего у меня в жизни еще не было.
 
Был опыт двух не взлетевших стартапов – продукт сделали, упоролись, а потом никто не пользуется. Был успешный опыт студии заказной разработке, когда мы с партнерами раскачали компанию до более $1M годовой выручки, но вот опыта успешного продукта пока нет.
 
Наверное, я не очень хорош в придумывании идей. Даже, скорее, в том, чтобы увидеть потребность. Из опыта неуспешных стартапов я вывел для себя, что главное – иметь решение, которое закрывает некоторую проблему пользователя. Идеально, если с этой проблемой знаком сам (“делать продукт для себя”).
 
Два моих микропродукта получили некоторый трекшен. Первый – это расширение для Dune. Совсем микро, при примерно 60ти установках пользовались, я думаю, человек 20-30.
Второй (хронологически первый) – это чат нашей локалки на основе IRC, который я делал еще в середине 2000х (как давно это было!). Тогдашние IRC клиенты были топорные, я сделал свой, добавил поддержку смайлов, доску объявлений  – им пользовалось некоторое время 100-150 человек каждый день. Руководство сети за это подогнало мне около 300 МБ интернета (да, тогда они были платные). В общем, это история для олдов 🙂
 
Сейчас есть четкое понимание – чтобы запустить продукт, надо запускать продукты. Билдить, шиппить, нарабатывать опыт решения болей пользователей, быстрого кодинга, продвижения. Не получится первый раз – взлетит на второй, третий, десятый и тд. Самое наивное – это сидеть на диване и мечтать, что однажды придет классная идея и куча юзеров. Это то же, что и мечтать пожать лежа 150, если до этого не притрагивался к штанге. Вот у Левелса 5% проектов только взлетели.
 
Поэтому решил периодически делать небольшие продукты в веб3/крипте, в режиме инди мейкинга, и первый буду релизить на следующей неделе – последние десять дней тружусь над ним фул-тайм. Не знаю, как часто будут релизы, ведь надо делать это в перерывах между зарабатыванием на жизнь.
 
Детали будут на следующей неделе, но если вы предоставляете ликвидность в пулы Uniswap V3 и вам интересно – напишите, дам доступ перед публичным запуском. Продвижение думаю делать через Твиттер, буду просить о репостах всех кого знаю, телеграмм чаты, возможно Reddit – если пропустят.
 
Вот такие дела, считайте это прогревом и пожелайте удачи 🙂
Media is too big
VIEW IN TELEGRAM
Релиз
 
Выкатил обещанный продукт – @PoolPilotBot
Это телеграмм бот, который будет (надеюсь) полезен провайдерам ликвидности. Основная функция бота сейчас – оповещать о том, что позиция вышла из диапазона / зашла в него. Насколько вижу, это инструмент скорее для ХОДЛеров, которые сильно не следят за рынком и поэтому редко проверяют свои позиции.
 
Посмотрим, будет ли какой-то отклик аудитории, будет ли кто-то использовать на постоянной основе. Если да, то можно расширять на другие пулы/сети/дексы.
 
Технические детали напишу позже.
 
Пост в твиттере, поддержите, пожалуйста, лайком/репостом, у кого есть возможность.
Под капотом PoolPilotBot

Проект делал чуть больше 2х недель. Кайфанул. Обещал написать про технологии. Коротко:
- turborepo для организации репозитория.
- railway для хостинга, деплой занял примерно 5 минут – указываешь репо и погнали. Здорово, что у railway есть пробный период – дают 5 долларов – этого хватает на месяц.
- БД - supabase, бесплатный тариф, и до ограничений еще очень далеко.
- очередь для отправки сообщений – pgmq, там же в supabase, очень просто и кайфово сделано. Если подытожить, то на хостинг/инфру я потратил почти ноль времени, никаких VPS, настроек докеров, и проч.
- телеграмм библиотека – конечно же grammy.
- JSON RPC – Alchemy.
- TypeScript, NodeJs.
- Cursor как среда разработки – купил платный план. Что-то осмысленное, конечно, не тянет, но при рефакторинге помогает "вынести вот это в константы туда и переведи на русский" как пример. Или “вот веб-страница, спарси адреса деплойментсов и переведи в константы” – справляется на ура
 
Если есть вопросы – чем могу помогу.

@web3dev_notes
Добрый пиар

Новая рубрика – делюсь каналами про крипту, кого читаю.

Сегодня расскажу про канал Криптологическая экспедиция. Дима пишет про крипто разработку под Эфир, фишки Солидити и немного про оффсайт ивенты. Пишет не часто, но по делу. Рекомендую к подписке!
SPAM

Чят, от имени бота обратной связи канала пришел спам тем, кто мне писал когда-то. На фото скрин со второго акка, также отписал подписчик.

Я пока не понимаю, как так получилось, бот был создан через @LivegramBot, запрошу их ТП.

На всякий случай, ничего не открывать, токены не покупать и тд.

Есть у кого-то мысли, как это возможно?
Web3 разработчик
SPAM Чят, от имени бота обратной связи канала пришел спам тем, кто мне писал когда-то. На фото скрин со второго акка, также отписал подписчик. Я пока не понимаю, как так получилось, бот был создан через @LivegramBot, запрошу их ТП. На всякий случай, ничего…
Проблема спама найдена

И это Livegram, который без спроса отправил сообщения тем, кто с ним общался.
Нашел новость на каком-то китайском сайте, это не только у нас такое.

В итоге Livegram был выброшен на помойку просто указал свой ТГ для контакта.

Желаю всем поменьше спамеров и продуктивной рабочей недели 🚀
Если работаете с расчетами цен, делайте это…
 
Два раза в день, спина не будет болеть.
 
Понял, что когда пишу расчеты цен, у меня очень много времени занимает, смотря на переменную/функцию типа price/usdPrice/ethPrice, понять, какой тут base и quote токен.
 
Сегодня озарило – использовать везде нотацию price_base_quote (слово price в начале, далее base токен, quote токен в конце), например:
 
price_eth_usd – цена eth в usd
price_usdс_eth – цена usdc в eth
getPriceToken0Eth – получить цену token0 в eth.
 
Сегодня работал и просто кайфанул, мозг разгрузился.
 
Надеюсь, и вам жизнь облегчит 🫶
Web3 разработчик
Если работаете с расчетами цен, делайте это…   Два раза в день, спина не будет болеть.   Понял, что когда пишу расчеты цен, у меня очень много времени занимает, смотря на переменную/функцию типа price/usdPrice/ethPrice, понять, какой тут base и quote токен.…
3 дня использую и кайфую.

Еще вывел удобную мнемонику price_x_y = amount_y / amount_x (второе делим на первое).

Также, не нужно думать, как вычислять цены через промежуточные, например price_x_y = price_x_a × price_a_b × price_b_y – соседние рядом стоящие переменные “схлапываются”, остается только то что в начале (`x`) и конце (`y`).

Не высшая математика, но позволяет делать меньше ошибок.
Искусственный интеллект
 
Давайте расскажу, как использую ИИ в работе. Только конкретика - что делаю в Cursor:
 
– Написать простую утилитку с четко формализуемой логикой – "вот CSV файл с адресами токенов, залезь в блокчейн и скачай их имя и decimals".
– SQL запросы для простой аналитики по таблице – "вот таблица с юзерами и датой регистрации, напиши запрос, чтобы показать количество зареганых юзеров по месяцам".
– Код не работает/глючит/еще что-то – "дай идеи, почему …". Да, половина идей может быть полной ерундой, но какие-то очень полезны.
– Написать бойлерплейт – "вот таблица, сделай структуры данных под нее".
– Написать простой алгоритм – "отсортируй этот массив по полю А, если его нет то по Б, иначе С".
– Сохранить в константы кода адреса деплойментов - "вот веб-страница (указываю УРЛ), скачай адреса контрактов и сохрани в константы". Cursor лезет в интернет и скачивает!
– При рефакторинге мультиязычного приложения – "переведи эти строки на русский и сохрани в переменные".
– Быстро преобразовать данные со скрина – "вот тебе два скрина с данными, посчитай между ними разницу в процентах".
 
Что самое впечатляющее – я обленился настолько, что даю задания через скриншоты – "вот скриншот таблицы из БД, сделай структуру данных в TypeScript" – и он меня почти всегда понимает.
 
ИИ – однозначно классный рычаг. Не заменяя программиста, помогает делать "черновую" работу.
Приватники текстом в .env файлах
 
Каюсь, делал это до недавнего времени. Даже видел, как лежат в открытом виде приватники от $100K кошельков в .env. Думаю, не надо объяснять, почему это опасно – простой сканер .env файлов может вытащить немалые деньги. А скамеров хватает.
 
Наконец, нашел час и разобрался. Оказывается, все есть в ethers. Идея – зашифровать приватник паролем и хранить его в env в зашифрованном виде. Приложение при запуске читает зашифрованный приватник и дешифрует паролем. Я пароль разместил в таблицу в БД – т.к. вероятность одновременной утечки БД и .env файла мала.
 
Итак, сначала шифруем приватник. Пароль выбираете сами.


 
const wallet = new ethers.Wallet("PRIVATE_KEY");
const encryptedWalletString = await wallet.encrypt('PASSWORD');
console.log(encryptedWalletString);
 

 
Зашифрованный приватник выглядит так (в начале адрес кошеля, что удобно - сразу понятно от какого):


 
{"address":"32f04*****","id":"f0596bf7-**","version":3,"Crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"***"},"ciphertext":"*****","kdf":"scrypt","kdfparams":{"salt":"***","n":131072,"dklen":32,"p":1,"r":8},"mac":"***"}}

 
Это вставляете в .env. В БД записываете пароль.
 
Далее в приложении расшифровываете:
 

const encrypted = process.env.WALLET_ENCRYPTED!;
const password = …. // load password from the DB
 
const wallet = (await ethers.Wallet.fromEncryptedJson(encrypted, password)).connect(
      new ethers.JsonRpcProvider(process.env.RPC_URL),
    );

 
Просто как 1-2-3! Наслаждаемся тем, что сильно улучшили свою безопасность.

А как ваши приложения хранят приватники?