Проблема с получением баланса кошелька Phantom с запросом json-rpc с использованием функции javascript async?

У меня есть подключение к кошельку Phantom.

Я ожидаю phantom_balance() для возврата баланса или данных, содержащих баланс.

Есть ли у меня ошибка в json-rpc форматирование?

Я получаю следующее JsonRpcEngine сбой на захвате ().

      Phantom - RPC Error: JsonRpcEngine: Response has no error or result for request:
{
  "jsonrpc": "2.0",
  "id": 1161935556,
  "method": "getBalance",
  "params": [
    "iQKBP3tSX6g3j6pS6g3LuzhoqTQKBP3tSX6g33tSX6g3j6pS6g"
  ]
}

Вот js

      // get wallet provider, phantom
const get_provider = () => {
  if ("solana" in window) {
    const provider = window.solana;
    if (provider.isPhantom) {
      return provider;
    }
  }
  window.open("https://phantom.app/", "_blank");
};

// async get wallet balance
async function phantom_balance() {
  // alt window.solana
  const phantom = get_provider();
  console.log("Still Connected: " + phantom.isConnected);
  if (phantom.isConnected !== false) {
    const wallet_address = phantom.publicKey.toString();
    console.log("Getting Balance For: " + wallet_address);
 
    // json-rpc request (ERROR!)
      const balance = await phantom.request({
        method: "getBalance",
        params: [wallet_address]
        })
        .then(function(data) {
          console.log(data);
        }).catch(function(e) {
          console.log(e);
        });
    
  }
}

2 ответа

Решение

Вот мой рабочий пример.

  1. Убедитесь, что у вас установлено расширение Phantom wallet. phantom.app

  2. Включите solana-web3 в заголовок документа.

      <script src="https://unpkg.com/@solana/web3.js@latest/lib/index.iife.min.js"></script>
  1. Убедитесь, что в вашем js-скрипте есть type="module" определенный.
      <script type="module" src="/path/to/your/main.js"></script>
  1. Это выполняется в вашем основном файле js.
      // get wallet provider, phantom
const get_provider = () => {
  if ("solana" in window) {
    const provider = window.solana;
    if (provider.isPhantom) {
      return provider;
    }
  }
  window.open("https://phantom.app/", "_blank");
};

// get balance from connected Phantom wallet
async function phantom_balance() {
  // alt window.solana
  const phantom = get_provider();
  console.log("Wallet Connected: " + phantom.isConnected);
  if (phantom.isConnected !== false) {

    const wallet = phantom.publicKey;
    const wallet_b58 = phantom.publicKey.toString();

    // connect to the cluster
    console.log("Connecting Cluster");
    var connection = new solanaWeb3.Connection(
      solanaWeb3.clusterApiUrl('devnet'),
      'confirmed',
    );

    // remember, do not use base 58 encoded key with getBalance();
    console.log("Getting Balance: " + wallet_b58);
    let _balance = await connection.getBalance(wallet)
      .then(function(data) {
        console.log("Wallet Balance: " + data);
        return data;
      })
      .catch(function(error) {
        console.log(error);
        return error;
      });

  }
}
  1. использование
      var balance = phantom_balance();

Возвращает целое число Лампорта

      992953240

Этот код, если вы хотите получить номер не в Лампортсе let _balance = await connection.getBalance(wallet).then(function(data) { console.log("Wallet Balance: " + data / lamports_per_sol); return data; })

Другие вопросы по тегам