Роботи / Крипторобота на відкритий бриф

Gift a Share: частка акції в подарунок за посиланням, у мережі Base

Що було

Coinbase випустила справжні американські акції токенами в мережі Base. Подарувати акцію людині досі незручно: потрібні брокерські рахунки в обох, переказ між ними, а з дитиною чи другом з іншої країни це майже неможливо. Токенізована акція живе в гаманці, і її можна передати як завгодно. Бракувало простої упаковки: ось посилання, там твоя частка Apple, відкриється на день народження.

Що зробили

Написали контракт-ескроу на Solidity без власника і адмін-ключів, покрили його 9 тестами і розгорнули в основній мережі Base. Зібрали сайт на Next.js: вітрина з 13 компаній, покупка від $5 через агрегатор обмінів, сторінка подарунка і сторінка отримання. Усі сценарії прогнали на справжні гроші, а мітку Builder Code перевіряли по ланках у блокчейні, а не на око.

Що отримав клієнт

Живий сайт, контракт у мережі, який будь-хто може відкрити на Basescan, і відео на 1 хв 28 с. Від порожньої папки до всього цього минуло близько півтори доби. Сайт сам перевіряє, чи дійшла мітка до блокчейну, і пише правду зеленим або червоним.

ЗамовникBase (мережа від Coinbase). Відкритий бриф Builder Quest
Моя рольІдея, смарт-контракт і тести, сайт, перевірка мітки в блокчейні, монтаж відео
СтатусПодано. Підсумки Base надсилає листом, відповіді поки немає
Результат1,5 доби від порожньої папки до живого сайту, контракту в основній мережі та відео · Відкрити
Відхилено: для акцій без ринку агрегатор віддає ціну-заглушку 0,0000000001, і сайт показував її як «$0.00 за акцію». Реконструкція, не скриншот
Відхилено: для акцій без ринку агрегатор віддає ціну-заглушку 0,0000000001, і сайт показував її як «$0.00 за акцію». Реконструкція, не скриншот
Прийнято: ціну нижче за 1 цент сайт не виводить. 4 компанії з живим ринком активні, 9 сірі з підписом «no market yet»
Прийнято: ціну нижче за 1 цент сайт не виводить. 4 компанії з живим ринком активні, 9 сірі з підписом «no market yet»

Завдання

Base, мережа від Coinbase, оголосила відкритий бриф: зібрати застосунок поверх їхніх токенізованих акцій і підключити Builder Code, мітку, за якою Base бачить, які транзакції прийшли з твого застосунку. Умова з правил: користувачам зі США торгівлю не показувати, бо акції Coinbase їм недоступні.

Для нас це була ще й перевірка, чи вміємо ми ончейн-продукт цілком: свій смарт-контракт, деплой в основну мережу, справжні гроші, гаманці людей. Тут помилка коштує грошей, а не просто бага на екрані. І робота в портфоліо, яку можна відкрити і перевірити в блокчейні, а не макет.

Навіщо і яка ідея

Подарувати акцію зараз незручно. Потрібен брокерський рахунок у дарувальника, рахунок в отримувача, переказ між ними, а з дитиною чи другом з іншої країни це майже неможливо. Подарункова картка магазину простіша, але це просто гроші в одному магазині.

Токенізована акція живе в гаманці, тож її можна передати як завгодно. Ідея: посилання і є подарунок. Дарувальник кладе частку акції в контракт під хеш секрету, секрет лежить у посиланні після знака #, а цю частину браузер ніколи не надсилає на сервер. Ми її не зберігаємо і переслати повторно не можемо, про що сайт чесно пише. Хто відкрив посилання зі своїм гаманцем, той і забрав. Можна поставити дату, раніше за яку подарунок не відкриє ніхто, навіть сам дарувальник.

Контракт зроблено без власника, паузи, адміна і способу його оновити. Це навмисно: нікому не треба нам довіряти, акції тримає код.

Хід роботи

Коли Що відбувалося
Вечір дня 1 Каркас на Next.js, контракт і тести, деплой в основну мережу Base. Перевірка всіх 13 тікерів на живий ринок: працюють 4. Замір спреду на сумах до $20 000
Ранок дня 2 Подарунок і отримання працюють в основній мережі. Пів дня на розслідування, чому Builder Code не доїжджає до блокчейну на покупках
День 2 Відео: чотири записи екрана, склейка скриптом на ffmpeg, три версії. У третій епізод «відкриється у 2027» перенесено в кінець
Через 5 днів Твіт з відео і тегом @buildonbase, форма подачі заповнена із запасом до дедлайну

Головна розвилка була наприкінці дня 2. Мітка Builder Code на покупках губилася, і полагодити це можна було тільки своїм контрактом-перехідником для обмінів. Порахували: пів дня роботи, новий контракт, через який підуть чужі гроші, за п’ять днів до дедлайну, заради поля, якого бриф не вимагає. Зупинилися і натомість чесно показуємо користувачеві на екрані, доїхала мітка чи ні.

Чим робили

Контракт StockGift.sol на Solidity 0.8.28, близько 140 рядків. Дарувальник кладе акції під хеш секрету, забрати їх може той, хто знає секрет, і тільки після дати відкриття. Захист від повторного входу, перевірка того, скільки токенів реально прийшло. Якщо подарунок ніхто не забрав, дарувальник може повернути його собі, але не раніше ніж через 30 днів після дати відкриття, щоб не можна було висмикнути подарунок з-під отримувача. 9 тестів на Hardhat: не можна забрати раніше строку, не можна двічі, чужий не поверне собі подарунок, неправильний секрет відхиляється.

Покупка: свій API на Next.js бере маршрут обміну ETH в акцію в агрегатора LI.FI, який сам обирає 1inch, Kyberswap, Aerodrome чи інших. Ми тільки будуємо транзакцію, підписує гаманець людини, наш сервер гроші не тримає. Стеля суми $25 000: це найбільший обсяг, який реально перевірили ($20 000 в Apple пройшли зі спредом 0,31 %).

Builder Code за стандартом ERC-8021 дописується в кінець даних транзакції на сервері, в одному місці, яке можна перевірити звичайним curl. Для розумних гаманців, які загортають виклик у свою операцію, мітка йде окремим полем за EIP-5792. Після покупки сайт сам перечитує транзакцію з блокчейну і пише зеленим «Builder code confirmed in the mined transaction» або червоним, що гаманець пересклав транзакцію і мітку втратив.

Сайт: Next.js 16, React 19, wagmi + viem, хостинг Vercel. Країну визначаємо за заголовком хостингу, відвідувачам зі США показуємо сторінку «Not available where you are». Весь код близько 1 300 рядків разом із контрактом і тестами. Контракт в основній мережі Base: 0x0535…5a88 на Basescan.

Результат

Живий сайт stockgift-pi.vercel.app. Вітрина: 13 компаній, які Coinbase випустила на Base, купити можна 4 (Apple, Nvidia, Alphabet, Meta), решта 9 сірі з підписом «no market yet». Це не здогадка: для кожного тікера запросили справжній маршрут обміну на $5 і $15 з прослизанням 1 % і 3 %, і в дев’яти ринку не виявилося. Коли ринок з’явиться, вони увімкнуться без переробки, список уже в коді.

Усі сценарії прогнано в основній мережі на справжні гроші: покупка $5 Nvidia через Kyberswap зі спредом 0,06 %, подарунок 0,01 акції Nvidia, отримання з іншого браузера та іншого гаманця, другий подарунок з датою відкриття у 2027 році. Усе видно у відео на 1 хв 28 с і на Basescan.

Мітку Builder Code перевіряли по ланках, а не на око:

Ланка Як перевірено Підсумок
Сервер віддає дані транзакції з міткою curl живого API є
Сторінка отримала їх з міткою зелений напис на екрані є
Роутер і мережа мітку зберігають своя тестова транзакція є
Покупка через гаманець 5 покупок у блокчейні мітки немає
Подарунок, виклик нашого контракту 2 рази в блокчейні є

Слабке місце, яке ми залишили: на покупках через деякі гаманці мітка губиться. Сайт це не ховає, а пише червоним. Друге слабке місце контракт сам називає в коментарі: при отриманні секрет на мить видно в черзі транзакцій, теоретично його можна перехопити. Збиток обмежений одним подарунком, баланс дарувальника не під загрозою.

Інфраструктура безкоштовна: Vercel і LI.FI API без ключа. Експеримент з Builder Code коштував $0,15 з гаманця-деплоєра, газ на покупку у відео близько $0,01. Чого ми поки не знаємо: підсумків брифу. Base надсилає їх переможцям листом, публічного оголошення не обіцяли.

Помилки і що винесли

Гаманець сам перескладає транзакцію.Пів дня пішло на те, що мітка не доходила до блокчейну при покупці, хоча при подарунку доходила. Виявилося: гаманець упізнає відомий роутер обмінів (LI.FI, Kyberswap), розбирає дані за його описом і збирає наново, а наш хвіст з міткою відвалюється. Наш контракт ніде не опублікований, гаманець розібрати його не може і шле як є, тому подарунки мітку несуть. Довели власною транзакцією, а не міркуванням. Висновок: перевіряти треба те, що лягло в блокчейн, а не те, що пішло зі сторінки.
Налаштування, яке нічого не робило.Параметр `dataSuffix` стояв у конфігу wagmi і створював відчуття, що мітка підключена. Слова `dataSuffix` у бібліотеці `@wagmi/core` немає жодного разу, це вміє тільки `viem`. Прибрали і залишили в коді коментар, чому.
Розумний гаманець теж губить мітку.На одному справжньому отриманні подарунка відправником у блокчейні виявився посередник розумного гаманця, і мітка зникла. Для таких гаманців мітка тепер передається окремим полем за EIP-5792.
Хибна гіпотеза про кеш.Покупки йшли зі старої вкладки виду `stockgift-<хеш>.vercel.app`, де жила стара версія сайту і старий API. Звідси народилася гіпотеза про кеш. Правило: перевіряти тільки за основною адресою, набраною руками.
Монтаж обманював глядача.У ранніх версіях відео епізод «подарунок відкриється у 2027» ішов перед епізодом, де подарунок забирають одразу. Глядач читає це як один і той самий подарунок і вирішує, що застосунок бреше. У третій версії подарунок з датою перенесено в кінець і підписано як другий.
Проект дві доби жив поза пам'яттю.Жодного README в папці, жодного рядка в нотатках, а при цьому зовнішній дедлайн і сайт під моїм іменем в інтернеті. Знайшли на вечірній звірці і завели картку проекту. Правило: проект з дедлайном записується в перший же день.
Ціна «$0.00».В акцій без ринку агрегатор віддає ціну-заглушку 0,0000000001. Показати її як «$0.00» гірше, ніж нічого, тому ціну нижче за 1 цент сайт не виводить.

Інструменти

Solidity 0.8.28HardhatNext.js 16React 19wagmi + viemLI.FI APIBase mainnetVercelffmpegClaude Code