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
相关产品推荐
相关产品推荐

