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

Thirdweb转账报错需传入有效签名者,及ETH转账实现咨询

问题修复与ETH转账实现

问题描述

使用Thirdweb的ConnectWallet组件结合TrustWallet获取用户地址,尝试转USDC时出现错误:

"This action requires a connected wallet to sign the transaction. Please pass a valid signer to the SDK"

同时需要实现ETH向企业钱包(CORPORATE_WALLET)转账的功能。


一、修复USDC转账错误

错误核心是手动实例化的ThirdwebSDK未关联用户已连接的钱包签名器,需改用Thirdweb React包提供的useSDK钩子获取已绑定签名器的SDK实例,同时补充transferFrom必需的授权步骤。

修改后的完整代码:

import { ConnectWallet, useAddress, useSDK } from "@thirdweb-dev/react";

export default function DonationPage() {
    const address = useAddress();
    const sdk = useSDK(); // 获取已关联钱包的SDK实例

    async function sendCoins() {
        try {
            // 先检查钱包是否连接、SDK是否就绪
            if (!sdk || !address) {
                alert("请先连接钱包");
                return;
            }

            if (selectedCoin === 'eth') {
                // 后续实现ETH转账逻辑
            } else {
                const usdcContract = await sdk.getContract('ADDRESS_TO_USDC_CONTRACT');
                const donationAmountScaled = donationAmount * 10**6; // USDC是6位小数,转换为最小单位

                // 检查当前授权额度是否足够
                const currentAllowance = await usdcContract.erc20.allowance(address, CORPORATE_WALLET);
                if (currentAllowance < donationAmountScaled) {
                    // 授权合约可以花费用户的USDC
                    await usdcContract.erc20.approve(CORPORATE_WALLET, donationAmountScaled);
                }

                // 执行转账
                await usdcContract.erc20.transferFrom(address, CORPORATE_WALLET, donationAmountScaled);
                alert("转账成功");
            }
        } catch (error: any) {
            alert(`转账失败:${error.message}`);
        }
    }

    return (
        <>
            <ConnectWallet />
            {/* 这里补充你的代币选择、金额输入UI */}
            <button onClick={sendCoins}>确认转账</button>
        </>
    );
}

关键修复点:

  • 用useSDK替代手动new ThirdwebSDK,自动关联用户已连接的钱包签名器,解决签名缺失问题。
  • 增加钱包连接状态校验,避免空值报错。
  • 补充USDC授权逻辑:transferFrom要求用户先授权合约操作其代币,需先调用approve方法。
  • 转换金额为代币最小单位(USDC为6位小数),避免金额精度错误。

二、实现ETH转账功能

ETH转账无需调用合约,直接使用SDK的钱包转账方法即可,在selectedCoin === 'eth'分支中添加以下逻辑:

if (selectedCoin === 'eth') {
    // donationAmount为ETH单位(如1代表1 ETH)
    await sdk.wallet.transfer(CORPORATE_WALLET, donationAmount);
    alert("ETH转账成功");
}

说明:

  • sdk.wallet.transfer方法直接从已连接的钱包向目标地址发起ETH转账,参数为目标地址和转账金额(ETH单位)。
  • 同样依赖已连接的钱包(sdk和address非空),已在开头做校验。

内容的提问来源于stack exchange,提问作者Shihab Shahriyar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:40:27