Solana React集成钱包时报signTransaction is not a function错误如何解决
出现TypeError: this.wallet.signTransaction is not a function且signTransaction为null是Solana钱包适配集成的常见问题,按以下步骤排查解决:
- 先校验钱包连接状态
useWallet返回的wallet实例,只有在用户完成钱包连接授权后,signTransaction、publicKey等核心属性才会被赋值,未连接时默认是null。调用initialize方法前必须先做状态校验:
const wallet = useWallet(); const initialize = async () => { // 新增前置校验 if (!wallet.connected || !wallet.signTransaction) { alert("请先连接Solana钱包后再操作"); return; } // 原有逻辑 }
同时触发initialize的操作按钮建议在未连接钱包时置灰,避免用户误触发。
- 替换错误的Provider生成逻辑
自定义的getProvider大概率没有正确适配wallet-adapter的实例结构,应该直接用官方提供的AnchorProvider来生成Anchor程序实例,不需要自己实现getProvider:
首先导入对应依赖:
import { AnchorProvider, Program } from '@project-serum/anchor'; import { useConnection, useWallet } from '@solana/wallet-adapter-react';
修改后组件代码参考:
function Header(props) { const { connection } = useConnection(); const wallet = useWallet(); const initialize = async () => { if (!wallet.connected || !wallet.signTransaction) { alert("请先连接Solana钱包后再操作"); return; } // 直接用AnchorProvider构造实例,替换自定义getProvider const provider = new AnchorProvider( connection, wallet, { preflightCommitment: 'processed' } ); const program = new Program(contractJson, programID, provider); // 后续交互逻辑保持不变 try { await program.rpc.initialize({ accounts: { myOntology: wallet.publicKey, user: wallet.publicKey, systemProgram: SystemProgram.programId, rent: anchor.web3.SYSVAR_RENT_PUBKEY, clock: anchor.web3.SYSVAR_CLOCK_PUBKEY, }, }); } catch (err) { console.log("Transaction error: ", err); } } }
- 检查外层钱包适配器配置
确认React应用外层已经正确包裹了WalletProvider,并且传入了完整的钱包适配器列表,入口配置参考:
import { WalletProvider } from '@solana/wallet-adapter-react'; import { WalletModalProvider } from '@solana/wallet-adapter-react-ui'; import { PhantomWalletAdapter, SolflareWalletAdapter } from '@solana/wallet-adapter-wallets'; import { clusterApiUrl } from '@solana/web3.js'; import { useMemo } from 'react'; function App() { const network = clusterApiUrl('devnet'); const wallets = useMemo( () => [new PhantomWalletAdapter(), new SolflareWalletAdapter()], [network] ); return ( <WalletProvider wallets={wallets} autoConnect> <WalletModalProvider> {/* 你的其他业务组件,包括Header */} <Header /> </WalletModalProvider> </WalletProvider> ); }
未正确配置外层Provider时,useWallet返回的实例会缺失签名相关方法。
内容的提问来源于stack exchange,提问作者Backend and Frontend Developer
相关产品推荐
相关产品推荐

