You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:54:03