Flutter中signTransaction签名交易时如何将默认货币从ETH改为其他加密货币
Flutter修改MetaMask交易默认支付币种方案
你当前的代码构造的是以太坊原生转账交易,Transaction对象的value字段固定对应以太坊原生代币ETH,所以唤起MetaMask时默认就是ETH支付。要支持其他加密资产支付,按不同场景处理即可:
场景1:支付以太坊生态内代币(如ERC20标准的USDT、WBTC等)
比特币本身不运行在以太坊网络,MetaMask作为以太坊系钱包无法直接发起原生BTC转账,你可以选择以太坊上的BTC映射代币(如WBTC)实现需求,步骤如下:
- 提前确认目标代币的合约地址、小数位数(decimals)参数
- 构造ERC20代币的
transfer方法调用数据,替换原生转账的value字段配置 - 交易的
value字段设为0,交易的gas费仍需用ETH支付
代码实现示例:
import 'package:web3dart/web3dart.dart'; import 'dart:math'; // 定义ERC20合约的最小ABI,仅包含transfer方法 const erc20Abi = ''' [ { "inputs": [ {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"} ], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function" } ] '''; // 构造代币转账交易参数 final tokenContract = DeployedContract( ContractAbi.fromJson(erc20Abi, 'ERC20'), EthereumAddress.fromHex('目标代币的合约地址'), // 替换为实际代币的合约地址,比如WBTC的主网合约地址 ); final transferCallData = tokenContract.function('transfer').encodeCall([ EthereumAddress.fromHex('0xC91...3706'), // 你的收款地址 BigInt.from(1 * pow(10, 8)), // 示例:转1枚WBTC,WBTC小数位为8,按实际代币小数位修改 ]); await client.sendTransaction( credentials, Transaction( to: EthereumAddress.fromHex('目标代币的合约地址'), // 这里填代币合约地址,不是收款地址 gasPrice: EtherAmount.inWei(BigInt.one), maxGas: 100000, value: EtherAmount.zero(), // 原生ETH转账金额设为0 data: transferCallData, // 传入构造好的代币转账调用数据 ), );
场景2:支付原生比特币
如果需要用户支付原生BTC,你不能使用以太坊的交易逻辑,需要切换到比特币网络对应的签名SDK,且MetaMask不支持原生BTC交易,需要接入支持比特币的钱包服务商的SDK实现。
注意事项
- 发起交易前要校验用户钱包内对应代币的余额是否充足,避免交易失败
- 交易发起前要向用户明确告知支付的代币种类、数量,避免产生交易纠纷
- 以太坊网络上所有交易的gas费都需要用ETH支付,和你转账的代币种类无关
内容的提问来源于stack exchange,提问作者Kashif662
相关产品推荐
相关产品推荐

