Крипто Devs | Gnezdo Hub – Telegram
Крипто Devs | Gnezdo Hub
431 subscribers
985 photos
61 videos
20 files
2.22K links
Агрегатор с крипто dev'ами

🦧 Основной канал: https://news.1rj.ru/str/cryptomokakke

☯️ Все каналы: https://news.1rj.ru/str/cryptomokakke/742

🗂 Все агрегаторы: https://news.1rj.ru/str/addlist/dNb2TYSUysU3Nzgy
Download Telegram
Succinct (PROVE): насколько хороша токеномика?

Мне показался проект интересным с технической точки зрения. Если кто не знает, они создали лёгкий Клиент к Ethereum с ZKP.
Также создали ZK-решения для оптимистичных роллапов.
Их сеть занимается созданием доказательств с нулевым разрешением (ZKP) для блокчейн-приложений.

Клиенты и партнёры: Polygon, Celestia, Avail, Lido, Near и Gnosis.
Также к сети Succinct подключились топовые OP Stack rollups и протоколы, такие как Base, Optimism, Katana и Mantle.

Поэтому подумал, что успех вероятен.

Но что-то разочаровался, увидев 80% токенов в блокировке и разлок в августе 2026 23.3% от предложения (119.7% от market cap)!

Да: до этого рисков не особо много (если не учитывать OTC-продажи разочаровавшихся инвесторов), но всё же разлоки очень неприятные.

Начальное распределение тоже не очень хорошее (источник):

1. Public Allocation and Future Incentives - 25%. По данным Cryptorank и Tokenomist, на TGE разблокировано 15%. Остальное через год с разлоками раз в 6 месяцев на протяжении 3 лет.
Описание:
"Поощрения для пруверов, стейкеров и других участников и сторонников сети. Первому аирдропу PROVE было выделено 5%".

2. Contributors - 29.5%.
"Основные участники сети Succinct, включая членов команды Succinct Labs, и будущие основные участники".
Сомнительная категория. Можно считать, что это команде. > 10% - много!
Вестинг: Клифф 1 год, затем разблокировка каждые 6 месяцев в течение 4 лет

3. Succinct Foundation - 10%.
"Для покрытия операционных расходов, поддержки управления и обеспечения устойчивого развития фонда Succinct".
По сути, команде на развитие.
Если бы предыдущая категория распределялась не команде, было бы норм. Но это уже 39% (+-) - много.
Вестинг: 5% разблокированных в TGE, затем блокировка на 1 год, после чего разблокировка каждые 6 месяцев в течение 3 лет

4. Ecosystem & R&D - 25%.
"Поддерживать экосистему, инициативы в области исследований и разработок, а также обеспечивать постоянную поддержку роста сети в долгосрочной перспективе".
Пока все заблокированы.
Количество нормальное, но кому будут распределять непонятно. И странно, что на TGE ничего не выпустили.
Вестинг: ожидание на 1 год, затем разблокировка каждые 6 месяцев в течение 3 лет.

5. Investors - 10.5%.
Здесь нормально (всего на 0.5% больше нормы).
Хотя у них разлок через год каждые 6 месяцев на протяжении 4 лет. А это существенные выплески токенов на рынок.

Стоит также обратить внимание на то, что в Tokenomist написано следующее: "(Seed & Series A)". Возможно это не все инвесторы, а другим будет распределяться из средств команды.


Итог:
Перспектива непонятна. Сможет ли проект обеспечить доходами спрос на актив и будет ли это делать неизвестно.
Может и не восстановиться, а то и дальше падать.

Я воздержусь от покупки.

P. S. Дроп не получил: не смог участвовать.

Благодарю за внимание. И буду рад распространению поста.

😎 Незрячий web3 программист (подписаться)
Чат | бот

📟 Прилетело из @blind_dev
Проект на виду. Часть 8. Какой контекст у смарт контракта?

Если вы уже некоторое время на канале, то, вероятно, помните, что я потихоньку разбираюсь и делаю свой небольшой проект на граница ИИ и Web3. По сути, это будет небольшой ассистент, который будет помогать аудировать код контракта и акцентировать внимание на похожих уязвимостях, которые были указаны в отчетах аудиторских компаний за продолжительный срок.

На данный момент я собрал около 28К уязвимостей из таких отчетов. Было бы больше 35К-40К, если бы я не удалял большинство Low и 99,5% Ingo/Gas описаний багов (честно говоря, во многих компаниях эти разделы откровенный мусор!).

Сейчас я в стадии ранжирования этих уязвимостей и определения "веса" каждой из них, для более аккуратных рекомендаций ассистента. Но сейчас не об этом.

На днях я столкнулся с проблемой, а что такое "контекст контракта"?

С одной стороны, "контекст контракта" - это его описание и основное назначение. Но насколько хорошим будет такой контекст для ответов на вопросы по нему?

С другой стороны, контракт - это набор определенных функций. И может стоит рассматривать контекст через призму его функций?

Или описание контекста функций недостаточно без детализации их внешних и внутренних действий? Кроме того, большую роль в контексте функций являются изменения состояний переменных хранилища и использование storage/memory пространств...

Кроме того, глупо рассматривать контекст отдельного контракта, когда он работает сообща с другими контрактами в протоколе и вне его.

А документация? Своя и протоколов, с которыми он работает... Это же тоже все должно быть частью контекста...

И вот получается, что для создания какого-то общего контекста проекта нужно как-то не понятным образом обработать огромные платы данных, и где есть вероятность, что они просто не поместятся в один запрос к ИИ на обработку.

На данном этапе анализаторов и аудиторов кода, все рассматривают контракты с позиции "разбить через solc и распознать" или "самому составить контекст", чтобы понять весь протокол и сгенерировать потенциальные атаки.

Этот подход отличный и рабочий (не зря есть столько мощных аудиторов).

А в своем проекте я хочу помочь аудиторам быстрее "понимать проект", а значит быстрее переходить к стадии поиска потенциальных уязвимостей.

P.S. Напомню, что я делаю не очередного ИИ-аудитора, а ассистента, который помогает разобраться в коде, а не ищет проблемы за самого аудитора.

С этим постом я просто хотел поделиться с вами, чем сейчас занимаюсь и куда стремлюсь. И если у вас появятся идеи или что-то по поводу контекста смарт контрактов, буду рад, если поделитесь в комментариях. Это очень поможет моей текущей работе.

#ai #tool

📟 Прилетело из @solidityset
У меня уже появились планы на ноябрь!

Да, это Форум-выставка THE TRENDS, который на этот раз объединился с форумом Mining ru, образовав Технологическую неделю:

▪️ 18-19 ноября встречайте пятый юбилейный The Trends - форум-выставку про новейшие технологии и инвестиции.
▪️ 19 ноября вечером пройдет церемония награждения The Trends Awards. (подать заявку до 13 октября можно тут)
▪️ 20 ноября на той же площадке пройдет форум Mining ru.

ВАЖНО!!!
Приобретая тикет на The Trends - вы получаете возможность посетить и церемонию награждения The Trends Awards и третий день технологической недели - форум Mining ru.

Мощная B2G и B2B повестка и серьезный спикерский состав. Чувствуется масштаб.
В фокусе решения и процессы, которые трансформируют не только индустрии,
но и сам способ мышления.

Место: Москва, TAU, Рязанский проспект, 8Ас10

Возможно буду, так как 17 ноября как раз у меня день рождения. Это вероятно хороший способ провести время.
Подробности — тут
Скидка на билеты 15% — тут

📟 Прилетело из @blind_dev
🪨 Как начать свой путь в блокчейн разработке?

Записал подборку материалов на эту тему, найти её вы сможете в комментариях под этим видео!

Приятного обучения

📟 Прилетело из @code_vartcall
Зачем я ВЛЕЗ в WEB3?

youtu.be/VfwWb-lC8Ys
youtu.be/VfwWb-lC8Ys
youtu.be/VfwWb-lC8Ys

Приятного просмотра!

📟 Прилетело из @code_vartcall
четырехлетний путь.

сегодня 4 года, как мы в крипте. как прошел наш первый, второй и третий год можете почитать в предыдущих постах, сегодня же обсудим как прошел текущий год и что вообще мы планируем делать в крипте в ближайшее время.

время было не самое легкое, но забавное, по сути дикие качели: в августе того года — лои нашего банка, луз 40к$ на aio pro, открытие aio study, в ноябре и декабре рынок становится диким и мы снова выходим на хаи за счет постоянного арбитража и роста альты. в январе на фомотяге залет в мемы, которые в последствии обнуляются. мы решаем отбросить все ретро и снова погрузиться в арбитраж. в марте и апреле возвращаемся на рельсы постоянного кэшфлоу, создаем лопату и развиваем новый канал. летом много путешествий и чилла и с сентября снова фуллворк в арбитраже.

по споту хочется сказать отдельно. с момента как мы пришли в крипту мы все время ждали ту самую бычку, где каждое дерьмище будет расти на 5-10 иксов, а наше дерьмище как минимум на 20. но в этом году мы попрощались с этой несбыточной мечтой и начали распродавать весь портфель. сейчас у нас 80% в кэше и 20% в эфире и солане. рынок поменялся, и вдобавок зашуганную собаку слишком долго били палкой.

сейчас наша задача — наращивать свой ежемесячный доход в крипте. не распыляться и брать все что мы можем взять с арбитража. ретро идет нахуй. билдинг проектов (временно) идет нахуй. строить проекты это здорово и может приносить намного больше бабок чем что угодно, но для этого нужна мета и немножечко удачи. пока меты нет, сидим тихо и ожидаем.

крипта за последние годы очень сильно поменялась. она и раньше была не простой отраслью, но сейчас стала еще сложнее и агрессивнее. 1.5-2 года назад новичку с парой тысяч в кармане было из чего выбирать, и куда бы он ни сунулся (ретро, арбитраж, нфт, сейлы), везде он мог сделать себе хороший банк если бы немного постарался и включил голову. сейчас бОльшая часть сфер вымерла, а те что остались — стали намного сложнее для входа. бОльшая часть наших коллег за последний год ушли в ирл на обычную работу, бОльшая часть каналов заброшены. остались либо везучие лудики, которых вот вот ликвиднет, либо самые богатые, либо смарты. так что поздравляю, если вы все еще здесь и пытаетесь — вы молодцы.

подводя итоги, я бы сказал что это наш самый сложный год в крипте, и не только из-за финансовых качелей, но и из-за эмоциональных: у нас был сложный расход по работе с нашими друзьями, с которыми мы работали несколько лет. сейчас мы развиваемся отдельно, и, к счастью, все в итоге сложилось наилучшим образом. не знаю что будет дальше и во что превратится эта дикая сфера, но думаю все как всегда будет заебись.

спасибо нашим друзьям, нашему комьюнити и всем криптонам, которые встретились на нашем пути. спасибо вам.

as always, это были наши лучшие 4 года жизни, ну а дальше плотный ворк парни. we are degens.

у меня была мечта, и никаких ебаных игр.
я всего лишь хотел воплотить ее.


[ links ] | hodlmod | nba | lopata

📟 Прилетело из @hodlmodeth
История о том, как я доступность Hyperliquid улучшил.

Напомню, что работал с проектом где-то с февраля 2024. Интерфейс был удобным и понятным / доступным в основном.

Единственное, в чём была сложность - это переводы между spot и perps.

Представьте 2 элемента (у меня две строки подряд):

spot
perps

И что между ними где-то там затесалась иконка, по которой надо нажать для переключения.

(если непонятно, попробую проиллюстрировать при помощи ИИ).

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

Через некоторое время написал в Discord, создав тикет.

Там попросил улучшить доступность, реализовав переключение между спотом и перп-балансами кликом по элементу с клавиатуры.

То есть чтоб было так:
spot
perp

Нажимаю по элементу с этими двумя словами.

И становится так:
perp
spot

Проходит месяц-полтора.
Пишу вновь: когда сделают.
Мне отвечают, что пока другие приоритеты, но обязательно сделают.

Вот только уже веры у меня особо не было в это.

Тем было радостнее ещё через 1-2 месяца увидеть это изменение!

Как было классно нажимать и переключаться для перевода токенов между балансами, а также для стейкинга / онстейкинга (там та же проблема была)!

Сейчас пользуюсь 100% доступным интерфейсом, и очень доволен.

P. S. Поражает, когда в perp дексах делают плохо доступными даже установку стоп-лосса с тейк-профитом.

Напишите в комментариях, про доступность каких проекты было бы интересно вам почитать ещё.
Может хотели бы узнать о доступности Aster или других perp dex? Может о чём-то ином?

😎 Незрячий web3 программист (подписаться)
Чат | бот

📟 Прилетело из @blind_dev
Без ЭТИХ языков WEB3 НЕ СУЩЕСТВУЕТ

youtu.be/U5rzrFIhXEQ
youtu.be/U5rzrFIhXEQ
youtu.be/U5rzrFIhXEQ

Изучаем

📟 Прилетело из @code_vartcall
Атака майнеров. Часть 2

Используется ли block.timestamp для операций, чувствительных ко времени?

Майнеры могут манипулировать block.timestamp на несколько секунд, что может повлиять на логику контрактов, зависящих от времени.

Как предотвратить: используйте block.number вместо временных меток для критически важных операций, связанных со временем, или убедитесь, что допустимая погрешность манипуляций приемлема.

block.timestamp представляет время, которое майнер предлагает для блока. Хотя оно обычно точное, майнеры имеют некоторую свободу для его корректировки. Эта свобода допускает потенциальные уязвимости в логике, чувствительной ко времени, такой как аукционы или периоды стейкинга.

Эта уязвимость является прямым следствием манипуляций майнеров, отражая их способность влиять на создание блоков. Хотя майнеры не могут устанавливать произвольные временные метки, они имеют некоторый контроль в рамках правил консенсуса. В Ethereum это примерно +/- 900 секунд (15 минут), хотя точный диапазон может варьироваться в зависимости от блокчейна.

Представьте себе аукцион, на котором майнер сдвигает временную метку в пользу своей ставки или ставки своего союзника. Это может привести к несправедливым преимуществам, таким как преждевременное завершение аукциона или манипулирование процессом торгов.

Посмотрите на пример:

pragma solidity ^0.8.0;


// SPDX-License-Identifier: UNLICENSED
contract Auction {
uint public auctionEndTime;
address public highestBidder;
uint public highestBid;
mapping(address => uint) public pendingReturns;
bool public ended;


event BidPlaced(address bidder, uint amount);
event AuctionEnded(address winner, uint amount);


constructor(uint _duration) {
auctionEndTime = block.timestamp + _duration; // Vulnerability!
}


function isAuctionEnded() public view returns (bool) {
return block.timestamp >= auctionEndTime; // Vulnerable comparison!
}


function bid() public payable {
require(!isAuctionEnded(), "Auction has ended");
require(msg.value > highestBid, "Bid not high enough");


if (highestBid > 0) {
pendingReturns[highestBidder] += highestBid;
}


highestBidder = msg.sender;
highestBid = msg.value;
emit BidPlaced(msg.sender, msg.value);
}


function endAuction() public {
require(!ended, "Auction already ended");
require(isAuctionEnded(), "Auction not yet ended");


ended = true;
emit AuctionEnded(highestBidder, highestBid);
}


function withdraw() public returns (bool) {
uint amount = pendingReturns[msg.sender];
if (amount > 0) {
pendingReturns[msg.sender] = 0;


// Use call instead of transfer for better compatibility
(bool success, ) = payable(msg.sender).call{value: amount}("");
require(success, "Transfer failed");
}
return true;
}
}


В этом аукционном контракте время окончания аукциона (auctionEndTime) определяется как block.timestamp + _duration. Майнер может слегка изменить block.timestamp, чтобы досрочно завершить аукцион или отложить его. Он может отложить его настолько, чтобы его ставка была включена в блок, или ускорить его, чтобы исключить конкурирующую ставку.

Вместо того, чтобы полагаться непосредственно на block.timestamp, рассмотрите возможность использования block.number.

pragma solidity ^0.8.0;


contract FixedAuction {
uint256 public auctionEndBlock;
uint256 public blockDuration;


constructor(uint256 _blockDuration) {
auctionEndBlock = block.number + _blockDuration;
blockDuration = _blockDuration; // Duration of auction in blocks
}


function finalizeAuction() public {
require(block.number >= auctionEndBlock, "Auction is not yet over.");
// Distribute funds
}
}


📟 Прилетело из @solidityset
В этом примере FixedAuction мы используем block.number вместо block.timestamp для определения окончания аукциона. Это делает время проведения аукциона предсказуемым и устойчивым к манипуляциям майнеров с block.timestamp.

Однако майнер может вообще отказаться от добычи блоков, что задержит окончание аукциона, хотя это и является менее прямой формой манипуляции. Кроме того, использование block.number делает аукцион зависимым от скорости создания блоков. Если время блоков несовместимо, продолжительность аукциона может немного варьироваться в реальном времени.

Если требуется более детальное и согласованное время, рассмотрите возможность использования оракула Chainlink, но имейте в виду повышенную сложность и затраты на газ.

В целом рекомендуется избегать разработки функций, чувствительных ко времени с точностью до секунд, поскольку майнеры могут манипулировать временными метками блоков в пределах допустимых значений (обычно ±15 секунд в Ethereum). Смарт-контракты должны реализовывать механизмы, основанные на времени, с достаточными буферными периодами, чтобы предотвратить экономическую эксплуатацию посредством незначительных корректировок временных меток.

#miner #mev

📟 Прилетело из @solidityset
Кладезь Знаний | Мысли вслух

За последние 2 года ведения этого телеграм-канала я накопил сотни полезных материалов для разработчиков: от начинающих до людей, которые хотят найти свою первую работу в web3

И как свойственно контенту - он устаревает и у меня нету желания мониторить и обновлять то, что я писал 2-3 года назад!

Поэтому я создал свой кладезь знаний, свою общину, свой Олимп разработчиков web3

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

Сегодня я представляю Олимп - наше место силы и базы знаний о web3

На Олимпе:

Гайды с нуля до первой работы в web3

Мои Закрытые Материалы, как вы могли видеть в этом посте

Гайды с нуля до Solidity

Гайды с нуля до Solana

Гайды по взаимодействию с криптой с нуля

И в последующем прямые эфиры, совместные проекты, живые встречи, игры и веселье


Цена: $99 / Пожизненно

Каждый год 31 декабря в 23:03 цена будет повышаться

Оплата и прочие вопросы - @jerskrew

Пора собираться на Олимп!

📟 Прилетело из @code_vartcall
🏔 Все Про Олимп

t.me/goto_olympys

📟 Прилетело из @code_vartcall
RPC с НУЛЯ: как работает сердце блокчейна

youtu.be/g34Lk2SPIoc
youtu.be/g34Lk2SPIoc
youtu.be/g34Lk2SPIoc

Время блокчейна!

📟 Прилетело из @code_vartcall
ПЕРВЫЙ СКРИПТ для БЛОКЧЕЙНА: проще, чем ты думаешь

youtu.be/c4tsb_tubHs
youtu.be/c4tsb_tubHs
youtu.be/c4tsb_tubHs

Применяем!

📟 Прилетело из @code_vartcall
Как начать свой путь в блокчейн разработке

Пошаговый план из моих последних видео:

1. Зачем нам web3 разработка

2. Языки программирования для web3

3. Получение своего первого ключа доступа к блокчейну

4. Написание первого скрипта

Сделаем контент лучше:

На 1 час выключаю платные сообщения, поэтому:

Напишите в комментариях, что улучшить в видео, чего вам не хватило в последних материалах

📟 Прилетело из @code_vartcall
Как начать свой путь в блокчейн разработке

Пошаговый план из моих последних видео:

1. Зачем нам web3 разработка

2. Языки программирования для web3

3. Получение своего первого ключа доступа к блокчейну

4. Написание первого скрипта

Сделаем контент лучше:

На 1 час выключаю платные сообщения, поэтому:

Напишите в комментариях, что улучшить в видео, чего вам не хватило в последних материалах

📟 Прилетело из @code_vartcall
#новости этой недели: пишу статью с вопросами ко мне, другое и опрос.

1. Как написал в заголовке поста, пишу статью с вопросами ко мне, как к незрячему программисту в крипте.
Если у вас есть что спросить, пишите в комментариях. Уникальные вопросы доавлю в статью.

2. Прошу ответить на опрос ниже. Задумался, что может стоит переименовать канал? Например, назвать "Незрячий программист в крипте".

3. Опубликовал во вторник анонс ноябрьского события The trends, но оказалось, что они не смогут меня сопроводить туда и обратно.
Поэтому удалил.

4. Отдыхаю. Из-за этого нет крупных статей с обзорами.

Всё.
Хорошего дня!

😎 Незрячий web3 программист (подписаться)
Чат | бот

📟 Прилетело из @blind_dev
Атака майнеров. Часть 3

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

Описание: Свойства блока (временная метка, сложность) и другие предсказуемые значения не должны использоваться для генерации случайных чисел, поскольку на них могут влиять или предсказывать майнеры.

Исправление: Вместо этого используйте безопасный источник случайных чисел, такой как Chainlink VRF, схемы commit-reveal или механизм рандомизации с доказанной справедливостью.

Настоящая случайность (randomness) в блокчейне – это сложно. block.timestamp и block.difficulty на первый взгляд могут казаться случайными, но майнеры могут влиять на них, делая результат предсказуемым.

Майнеры могут манипулировать block.timestamp в рамках правил консенсуса, и хотя они имеют очень ограниченный краткосрочный контроль над block.difficulty, полагаться на них в критически важных для безопасности логических операциях – в целом плохая идея.

Представьте себе лотерею, в которой майнер заранее знает выигрышный номер. Не совсем честная игра. Опять же, это относится к манипуляциям майнеров, когда они используют свое влияние для получения преимущества.

Давайте посмотрим на несовершенный лотерейный контракт:

pragma solidity ^0.8.0;


// SPDX-License-Identifier: UNLICENSED


contract Lottery {
address public winner;


function pickWinner() public {
// Vulnerable randomness generation using block.timestamp
uint256 randomNumber = uint256(block.timestamp) % 100;
if (randomNumber == 7) {
winner = msg.sender;
} else {
winner = address(0);
}
}


function getBlockTimestamp() public view returns (uint256) {
return block.timestamp;
}
}


Здесь pickWinner использует block.timestamp для генерации «случайного» числа. Злоумышленник может изменить временную метку блока, содержащего транзакцию pickWinner, повлияв на результат и сфальсифицировав лотерею.

Вместо того, чтобы полагаться на легко манипулируемые свойства блока, используйте безопасный источник случайности, такой как Chainlink VRF, который предоставляет проверяемое и непредсказуемое случайное число, обеспечивая справедливость и предотвращая манипуляции. Свойства блока, такие как block.prevrandao, также лучше, чем block.timestamp, но все же не следует полагаться на них из-за возможности их устаревания.

📟 Прилетело из @solidityset
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;


import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol";
import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol";


/**
* @noscript SecureLottery
* @notice A lottery contract using Chainlink VRF V2.5 for verifiable randomness
* @dev This is an example contract and should not be used in production without proper auditing
*/
contract SecureLottery is VRFConsumerBaseV2Plus {
// Chainlink VRF configuration
uint256 public s_subnoscriptionId;
bytes32 public keyHash = 0x787d74caea10b2b357790d5b5247c2f63d1d91572a9846f780606e4d953677ae; // Sepolia gas lane
uint32 public callbackGasLimit = 100000;
uint16 public requestConfirmations = 3;
uint32 public numWords = 1;


// Lottery state variables
uint256 public randomNumber;
address public winner;
mapping(uint256 => bool) public requestIds;
uint256 public lastRequestId;


// Events
event RandomnessRequested(uint256 requestId);
event WinnerSelected(address winner, uint256 randomNumber);


/**
* @param subnoscriptionId Chainlink VRF subnoscription ID
* @param vrfCoordinator Address of the VRF Coordinator contract
*/
constructor(
uint256 subnoscriptionId,
address vrfCoordinator
) VRFConsumerBaseV2Plus(vrfCoordinator) {
s_subnoscriptionId = subnoscriptionId;
}


/**
* @notice Request random number from Chainlink VRF
* @param useNativePayment Whether to pay in native tokens (true) or LINK (false)
* @return requestId The ID of the randomness request
*/
function requestRandomWinner(bool useNativePayment) external returns (uint256 requestId) {
// Request randomness from Chainlink VRF
requestId = s_vrfCoordinator.requestRandomWords(
VRFV2PlusClient.RandomWordsRequest({
keyHash: keyHash,
subId: s_subnoscriptionId,
requestConfirmations: requestConfirmations,
callbackGasLimit: callbackGasLimit,
numWords: numWords,
extraArgs: VRFV2PlusClient._argsToBytes(
VRFV2PlusClient.ExtraArgsV1({
nativePayment: useNativePayment
})
)
})
);


requestIds[requestId] = true;
lastRequestId = requestId;
emit RandomnessRequested(requestId);
return requestId;
}


/**
* @notice Callback function called by VRF Coordinator when randomness is fulfilled
* @param requestId The ID of the randomness request
* @param randomWords The random words generated by Chainlink VRF
*/
function fulfillRandomWords(
uint256 requestId,
uint256[] calldata randomWords
) internal override {
require(requestIds[requestId], "Request not found");
require(randomWords.length > 0, "Random words array is empty");


// Process the random value
randomNumber = randomWords[0] % 100; // Example: limit to 0-99 range


// Lottery winner selection logic would go here
// For example, if you have participants in an array:
// winner = participants[randomNumber % participants.length];


emit WinnerSelected(winner, randomNumber);
}


/**
* @notice Get the status of a VRF request
* @param requestId The ID of the randomness request
* @return exists Whether the request exists
*/
function getRequestStatus(uint256 requestId) external view returns (bool exists) {
return requestIds[requestId];
}
}


📟 Прилетело из @solidityset