@paaaffka

Как исправить ошибку при отправке транзакции через кошелек Phantom?

Добырй день
Хочу сделать кнопку доната на сайт что бы пользователи могли закнить похвалу в SOL токене
Но получаю ошибку Uncaught (in promise) TypeError: y.pubkey.toBase58 is not a function
Подскажите кто знает в чем проблема
habr и stackoverflow перелопатил но не нашел того что может помочь
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>


<button onclick="connectWallet()"> connect wallet</button>  


 <script src="https://unpkg.com/@solana/web3.js@latest/lib/index.iife.js"></script>

    <script>
    async function connectWallet() {

            let provider = null

            if ("solana" in window) {
                provider = window.solana;
                if (provider.isPhantom) {
                    console.log('provider', provider)
                }
            } else {
                window.open("https://phantom.app/", "_blank");
            }

            publicKey = null

            if (provider != null) {
                try {
                    const resp = await window.solana.connect();
                    publicKey = resp.publicKey.toString();

                } catch (err) {
                    // { code: 4001, message: 'User rejected the request.' }
                    console.log(err)
                }
            }

            if (publicKey != null) {
                const message = `Sign below to authenticate`;
                const encodedMessage = new TextEncoder().encode(message);
                const signedMessage = await window.solana.request({
                    method: "signMessage",
                    params: {
                        message: encodedMessage,
                        display: "utf-8",
                    },
                });

              
                
                var recieverWallet = new solanaWeb3.PublicKey("4iSD5Q6AnyhRHu6Uz4u1KAzXh3TwNwwQshEGhZbEXUTw");
 

                const connection = new solanaWeb3.Connection(solanaWeb3.clusterApiUrl("mainnet-beta"));

                var transaction = new solanaWeb3.Transaction().add(
                    solanaWeb3.SystemProgram.transfer({
                      fromPubkey: publicKey,
                      toPubkey: recieverWallet,
                      lamports: solanaWeb3.LAMPORTS_PER_SOL
                    }),
                );              

                transaction.feePayer = publicKey;
                let blockhashObj = await connection.getRecentBlockhash();
                transaction.recentBlockhash = await blockhashObj.blockhash;

                if(transaction) {
                  console.log("Txn created successfully");
                }                


                let signed = await provider.signTransaction(transaction);
                let signature = await connection.sendRawTransaction(signed.serialize());
                await connection.confirmTransaction(signature);
            }
        }
    </script>

</body>
</html>
  • Вопрос задан
  • 978 просмотров
Пригласить эксперта
Ответы на вопрос 1
kellas
@kellas
веб-разработчик
publicKey = resp.publicKey.toString();
вот тут .toString() убери

или в других местах(fromPubkey, feePayer) используй new solanaWeb3.PublicKey(publicKey) вместо publicKey
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы