如何通过Phantom钱包使用web3.js完成Solana SOL转账及报错处理
报错根因
Phantom钱包默认不会向未授权的站点暴露用户公钥,你当前的代码仅检测了钱包是否安装,没有触发连接授权流程,此时provider.publicKey的默认值为null,调用toString()方法就会触发空指针异常。
修复步骤
- 调整
getProvider方法,新增连接授权逻辑
const getProvider = async () => { if ("solana" in window) { const provider = window.solana; if (provider.isPhantom) { console.log("Is Phantom installed? ", provider.isPhantom); // 触发钱包连接弹窗,用户授权后公钥会自动赋值到provider.publicKey await provider.connect(); return provider; } } else { window.open("https://www.phantom.app/", "_blank"); } };
- 增加空值校验逻辑,避免授权失败等极端场景下的报错:
async function transferSOL() { var provider = await getProvider(); // 新增公钥存在性校验 if (!provider || !provider.publicKey) { console.error("钱包授权失败,请重试"); return; } console.log("Public key of the emitter: ",provider.publicKey.toString()); // 后续原有逻辑保持不变 // ... }
额外注意事项
- 代码中请求空投的逻辑仅适用于Solana开发网测试,主网环境运行时需要删除该段代码
- 若多次触发连接弹窗后仍拿不到公钥,可检查Phantom钱包是否已经对当前站点拉黑,可在钱包设置的信任站点列表中调整权限
内容的提问来源于stack exchange,提问作者Nancy Moore
相关产品推荐
相关产品推荐

