如何通过幻影钱包集成使用香草JS和JSON-RPC获得Solana帐户信息和/或SOL余额?



下面的香草JS示例通过Phantom钱包连接和断开Solana区块链。

连接成功并获得公共地址。

尝试使用JSON-RPC请求获取钱包余额和帐户信息时失败。

如果有人能帮我们解决这个问题,我们将有一些基本的例子,为我们这些谁更喜欢保持香草,如果可能的话。

连接功能:

// Connect Phantom
function phantom_connect() {
// Check for Solana & Phantom
var provider = () => {
if ("solana" in window) {
var provider = window.solana;
if (provider.isPhantom) {
return provider;
} else {
return false;
}
}
window.open("https://phantom.app", "_blank");
};
var phantom = provider();
if (phantom !== false) {
console.log("Phantom Wallet Found, Connecting..");
try {
// Connect to Solana
var connect_wallet = phantom.connect();
// After Connecting
phantom.on("connect", () => {
// Check Connection
console.log("Phantom Connected: " + phantom.isConnected);
// Get Wallet Address
var wallet_address = phantom.publicKey.toString();
console.log("Solana Wallet Address: " + wallet_address);

// ********** THIS FAILS **********
// Get Account Info
var account = phantom.request({
"jsonrpc": "2.0",
"id": 1,
"method": "getAccountInfo",
"params": [wallet_address, {
"encoding": "jsonParsed"
}]
});
console.log("Solana Account Info:");
console.log(account);
// ********************************

// ********** THIS FAILS **********
// Get Wallet Balance
var balance = phantom.request({
"jsonrpc": "2.0",
"id": 1,
"method": "getBalance",
"params": [wallet_address]
});
console.log("Solana Wallet Balance:");
console.log(balance);
// ********************************

});
//
} catch (err) {
console.log("Connection Cancelled!");
}
}
}

断开功能:

// Disconnect Phantom
function phantom_disconnect() {
window.solana.request({
method: "disconnect"
});
window.solana.on('disconnect', () => {
console.log("Phantom Disconnected!");
});
}

控制台在getBalance和getAccountInfo上显示-32603错误。

RPC错误:JsonRpcEngine: Response has no Error or result for request:

它不使用JSON-RPC API,但我把下面我的代码获得索拉纳(幻影)钱包余额在Devnet

provider = window.solana;
connection = new solanaWeb3.Connection(solanaWeb3.clusterApiUrl('devnet'), 'confirmed');
// After Connecting
connection.getBalance(provider.publicKey).then(function(value) { console.log(value); })

我使用connection.getAccountInfo使用这个方法并保存在状态

const [userSOLBalance, setSOLBalance] = useState<number>()
if (wallet.publicKey) {
const SOL = connection.getAccountInfo(wallet.publicKey)
SOL.then((res) => setSOLBalance(res.lamports / LAMPORTS_PER_SOL))
}

最新更新