使用 javascript 异步函数通过 json-rpc 请求获取 Phantom 钱包余额的问题?
Posted
技术标签:
【中文标题】使用 javascript 异步函数通过 json-rpc 请求获取 Phantom 钱包余额的问题?【英文标题】:Problem getting the balance of Phantom wallet with json-rpc request using javascript async function? 【发布时间】:2021-10-19 23:05:27 【问题描述】:我与 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")
??
【问题讨论】:
您是否尝试读取给定公钥的 SOL 令牌?如果是这样,您可以使用connection.getBalance()
阅读它。文档here
我已更新问题以包含您的建议。
【参考方案1】:
这是我的工作示例。
确保您已安装 Phantom 钱包扩展。 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();
返回 Lampport 整数
992953240
【讨论】:
以上是关于使用 javascript 异步函数通过 json-rpc 请求获取 Phantom 钱包余额的问题?的主要内容,如果未能解决你的问题,请参考以下文章