Проблема с получением баланса кошелька 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 ответа
Решение
Вот мой рабочий пример.
Убедитесь, что у вас установлено расширение Phantom wallet. phantom.app
Включите solana-web3 в заголовок документа.
<script src="https://unpkg.com/@solana/web3.js@latest/lib/index.iife.min.js"></script>
- Убедитесь, что в вашем js-скрипте есть
type="module"
определенный.
<script type="module" src="/path/to/your/main.js"></script>
- Это выполняется в вашем основном файле 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();
Возвращает целое число Лампорта
992953240
Этот код, если вы хотите получить номер не в Лампортсе
let _balance = await connection.getBalance(wallet).then(function(data) { console.log("Wallet Balance: " + data / lamports_per_sol); return data; })