Настройка транзакций в Solana через Phantom Wallet
Я не разбираюсь в крипте от слова «совсем». И как-то через знакомых на меня вышли ребята-криптовалютчики, которые сделали свою монету на основе Solana и хотели на сайте настроить автоматическую покупку этих самых монет за SOL (надеюсь, правильно сформулировал). Сам сайт у них на конструкторе webflow и в целом код для создания и отправки транзакций у них был написан. Однако была проблема, что вылетали ошибки при попытке подписать и отправить транзакцию через Phantom Wallet (необходимо заранее поставить себе расширение для браузера, чтобы это работало).
Первая ошибка вполне очевидна, а вот с остальными двумя мне и предстояло разобраться. Я потратил на это некоторое количество времени и сил, поэтому пишу эту короткую статейку, чтобы помочь, если кому-то ещё это будет нужно.
Начать стоит с того, что в коде использовался тестовый урл https://api.testnet.solana.com, по которому автор и пытался создавать транзакцию. Отсюда я выделил два направления, по которым двигался:
С одной стороны, нужно было поменять тестовый урл на боевой, но это с наскока не получалось, потому что все боевые урлы реджектили запросы из браузера (либо CORS, либо просто 403 и предложение обратиться к разработчикам).
Я считал, что на тестовом урле это всё равно должно было работать правильно, а значит есть какая-то ошибка в коде создания транзакций, которую я и пытался найти.
Я прошерстил документацию Solano, stackOverflow и всё, что нашёл, но всё выглядело так, что код правильный. Там были некоторые варианты, как можно сделать, я попробовал все и ничего не помогло.
Тогда я решил всё-таки сосредоточиться на том, чтобы использовать боевой урл https://api.mainnet-beta.solana.com или какой-то другой из доки (https://solana.com/docs/core/clusters), но ни один из них не работал из браузера и на stackOverflow я находил ответы, что это такая политика и что нужно посылать запросы только с сервера.
В общем, опуская детали, итог: я не нашёл рабочий вариант, как проводить транзакцию только из браузера (если вы знаете рабочий вариант, я готов услышать), поэтому мы в итоге подняли сервер, я настроил ручку, которая создаёт Connection с Solana, получает хэш последнего блока (по сути, это единственное, что нужно получить) и отдаёт её на фронт, и уже с фронта я, как и было, формирую транзакцию и отправляю на подпись в Phantom Wallet.
Серверная ручка
Также я запрашиваю минимальный баланс транзакции, но я так понял, это не обязательно (этот код уже был написан, поэтому я оставил).
Формирование транзакции на фронте
publicKey получаем из расширения Phantom Wallet, предварительно устанавливая соединение, но это уже за скобками.
Такие дела, надеюсь, кому-то пригодится.)