Настройка транзакций в Solana через Phantom Wallet

Я не разбираюсь в крипте от слова «совсем». И как-то через знакомых на меня вышли ребята-криптовалютчики, которые сделали свою монету на основе Solana и хотели на сайте настроить автоматическую покупку этих самых монет за SOL (надеюсь, правильно сформулировал). Сам сайт у них на конструкторе webflow и в целом код для создания и отправки транзакций у них был написан. Однако была проблема, что вылетали ошибки при попытке подписать и отправить транзакцию через Phantom Wallet (необходимо заранее поставить себе расширение для браузера, чтобы это работало).

119c8bea3605f1d6a41f26b753eb9cde.png

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

Начать стоит с того, что в коде использовался тестовый урл https://api.testnet.solana.com, по которому автор и пытался создавать транзакцию. Отсюда я выделил два направления, по которым двигался:

  1. С одной стороны, нужно было поменять тестовый урл на боевой, но это с наскока не получалось, потому что все боевые урлы реджектили запросы из браузера (либо CORS, либо просто 403 и предложение обратиться к разработчикам).

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

Я прошерстил документацию Solano, stackOverflow и всё, что нашёл, но всё выглядело так, что код правильный. Там были некоторые варианты, как можно сделать, я попробовал все и ничего не помогло.

Тогда я решил всё-таки сосредоточиться на том, чтобы использовать боевой урл https://api.mainnet-beta.solana.com или какой-то другой из доки (https://solana.com/docs/core/clusters), но ни один из них не работал из браузера и на stackOverflow я находил ответы, что это такая политика и что нужно посылать запросы только с сервера.

В общем, опуская детали, итог: я не нашёл рабочий вариант, как проводить транзакцию только из браузера (если вы знаете рабочий вариант, я готов услышать), поэтому мы в итоге подняли сервер, я настроил ручку, которая создаёт Connection с Solana, получает хэш последнего блока (по сути, это единственное, что нужно получить) и отдаёт её на фронт, и уже с фронта я, как и было, формирую транзакцию и отправляю на подпись в Phantom Wallet.

Серверная ручка

Также я запрашиваю минимальный баланс транзакции, но я так понял, это не обязательно (этот код уже был написан, поэтому я оставил).

Также я запрашиваю минимальный баланс транзакции, но я так понял, это не обязательно (этот код уже был написан, поэтому я оставил).

Формирование транзакции на фронте

publicKey получаем из расширения Phantom Wallet, предварительно устанавливая соединение, но это уже за скобками.

publicKey получаем из расширения Phantom Wallet, предварительно устанавливая соединение, но это уже за скобками.

Такие дела, надеюсь, кому-то пригодится.)

© Habrahabr.ru