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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:24:05