如何通过 Phantom 钱包集成使用 Vanilla JS 和 JSON-RPC 获取 Solana 帐户信息和/或 SOL 余额?
How to get Solana Account Info and-or SOL Balance using Vanilla JS and JSON-RPC via Phantom wallet integration?
以下 Vanilla JS 示例通过 Phantom 钱包连接到 Solana 区块链并断开连接。
成功连接并获取public地址。
尝试使用 JSON-RPC 请求获取钱包余额和帐户信息时失败。
如果有人可以帮助解决这个问题,我们将为我们这些喜欢尽可能保留 Vanilla 的人提供一些基本示例。
连接函数:
// 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 Error: JsonRpcEngine: Response has no error or result for request:
它不使用 JSON-RPC API,但我在代码下方放置了在 Devnet
上获取 Solana(Phantom)钱包余额的代码。
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))
}
以下 Vanilla JS 示例通过 Phantom 钱包连接到 Solana 区块链并断开连接。
成功连接并获取public地址。
尝试使用 JSON-RPC 请求获取钱包余额和帐户信息时失败。
如果有人可以帮助解决这个问题,我们将为我们这些喜欢尽可能保留 Vanilla 的人提供一些基本示例。
连接函数:
// 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 Error: JsonRpcEngine: Response has no error or result for request:
它不使用 JSON-RPC API,但我在代码下方放置了在 Devnet
上获取 Solana(Phantom)钱包余额的代码。
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))
}