使用javascript异步函数获得json-rpc请求的幻影钱包余额的问题?



我已连接到Phantom钱包。

我期望phantom_balance()返回一个余额或包含余额的数据。

我有一个错误在json-rpc格式?

我在catch()上得到以下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);
});

}
}

我也尝试了以下并得到一个错误说phantom.getBalance()不是一个函数。

const balance = await phantom.getBalance(wallet_address)
.then(function(data) {
console.log(data);
}).catch(function(e) {
console.log(e);
});

我目前没有在文档的头部包含任何<script>。根据Phantom文档,他们将window.solana注入到文档中(这也暴露了RPC接口)。也许我仍然需要web3在头部,以访问window.solana.getBalance(wallet_address)和/或RPC方法window.solana.request(method: "getBalance")??

下面是我的工作示例。

  1. 确保您已经安装了Phantom钱包扩展。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;
});
}
}
  • 使用
  • var balance = phantom_balance();
    

    返回Lamports整数

    992953240
    

    如果您想获得一个非Lamports的数字,则此代码let _balance = await connection.getBalance(wallet).then(function(data) { console.log("Wallet Balance: " + data / lamports_per_sol); return data; })