使用 javascript 异步函数通过 json-rpc 请求获取 Phantom 钱包余额时出现问题?
Problem getting the balance of Phantom wallet with json-rpc request using javascript async function?
我连接到了 Phantom 钱包。
我希望 phantom_balance()
到 return 余额或包含余额的数据。
我的 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)
and/or RPC 方法 window.solana.request(method: "getBalance")
??
这是我的工作示例。
确保您安装了 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();
Returns Lamports 整数
992953240
这个代码如果你想得到一个不在 Lamports 的号码
let _balance = await connection.getBalance(wallet).then(function(data) { console.log("Wallet Balance: " + data / lamports_per_sol); return data; })
我连接到了 Phantom 钱包。
我希望 phantom_balance()
到 return 余额或包含余额的数据。
我的 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)
and/or RPC 方法 window.solana.request(method: "getBalance")
??
这是我的工作示例。
确保您安装了 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();
Returns Lamports 整数
992953240
这个代码如果你想得到一个不在 Lamports 的号码
let _balance = await connection.getBalance(wallet).then(function(data) { console.log("Wallet Balance: " + data / lamports_per_sol); return data; })