Flutter钱包管理插件fuse_wallet_sdk的使用

Flutter钱包管理插件fuse_wallet_sdk的使用

介绍

Fuse Wallet SDK是一套工具,用于在客户端应用程序中创建、管理和与Fuse Wallet SDK进行交互。Fuse Wallet SDK允许用户创建基于ERC-4337的智能合约钱包,这些钱包与每个用户的外部拥有账户(EOA)相关联,相比传统的具有单一私钥的EOA提供了更高的安全性。通过Fuse Wallet SDK,用户可以存入资金,且只有他们自己才能控制和随时提取。

使用Fuse Wallet SDK的好处

使用Fuse Wallet SDK提供了多个好处,包括:

  • 增强的安全性:Fuse Wallet SDK是非托管账户,允许用户存入资金并随时提取。每个Fuse智能钱包是一个与用户EOA关联的智能合约,只能由该用户控制。
  • 增强的用户体验:Fuse Wallet SDK支持无Gas交易,改善了用户体验,使得与区块链的交互更加无缝。
  • 更好的开发者体验:Fuse Wallet SDK抽象了Web3开发中的复杂性,如加密学、钱包管理和智能合约交互,使开发者更容易构建基于区块链的应用程序。
SDK的目的

SDK旨在让开发者轻松地在其应用程序中创建、管理和与Fuse Wallet SDK进行交互。SDK提供了预构建的功能和工具,使开发者能够安全高效地与Fuse Wallet SDK进行交互。

初始化

import 'package:fuse_wallet_sdk/fuse_wallet_sdk.dart';

final apiKey = 'YOUR_PUBLIC_API_KEY';
final privateKey = EthPrivateKey.fromHex('YOUR_PRIVATE_KEY');
final fuseSDK = await FuseSDK.init(apiKey, privateKey);

示例

获取地址
print('Smart contract wallet address: ${fuseSDK.wallet.getSender()}');
发送交易
// 发送ERC20或NFT转账及与任意智能合约交互
final res = await fuseSDK.transferToken(
    EthereumAddress.fromHex('TOKEN_ADDRESS'), // 对于发送本地代币,使用'0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'
    EthereumAddress.fromHex('RECIPIENT_ADDRESS'),
    BigInt.parse('AMOUNT_IN_WEI'),
);
print('UserOpHash: ${res.userOpHash}');
print('Waiting for transaction...');
final ev = await res.wait();
发送批量交易
final res = await fuseSDK.executeBatch(
  [
    // 转移本地代币调用
    Call(
      to: EthereumAddress.fromHex('TARGET_ADDRESS'),
      value: BigInt.parse('AMOUNT_IN_WEI'),
      data: Uint8List(0),
    ),
    // 转移ERC-20代币调用
    Call(
      to: EthereumAddress.fromHex('TOKEN_ADDRESS'),
      value: BigInt.zero,
      data: ContractsUtils.encodeERC20TransferCall(
        EthereumAddress.fromHex('TOKEN_ADDRESS'),
        EthereumAddress.fromHex('RECIPIENT_ADDRESS'),
        BigInt.parse('AMOUNT_IN_WEI'),
      ),
    ),
  ],
);

print('UserOpHash: ${res.userOpHash}');

print('Waiting for transaction...');
final ev = await res.wait();
print('Transaction hash: ${ev?.transactionHash}');
赞助交易

要使用此功能,必须首先使用withPaymaster参数设置为true初始化SDK。

final fuseSDK = await FuseSDK.init(apiKey, privateKey, withPaymaster: true);
质押
final stakingOptions = await fuseSDK.stakingModule.getStakingOptions();

final res = await fuseSDK.stakeToken(
  StakeRequestBody(
    accountAddress: fuseSDK.wallet.getSender(),
    tokenAmount: '0.1',
    tokenAddress: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE',
  ),
);
交易
final nativeTokenAddress = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE';
final usdcTokenAddress = '0x28C3d1cD466Ba22f6cae51b1a4692a831696391A';

final res = await fuseSDK.swapTokens(
  TradeRequest(
    inputToken: nativeTokenAddress,
    outputToken: usdcTokenAddress,
    inputAmount: BigInt.parse('100000000000000000'),
    exactIn: true,
  ),
);

完整示例Demo

import 'dart:io';
import 'package:fuse_wallet_sdk/fuse_wallet_sdk.dart';

void main() async {
  final credentials = EthPrivateKey.fromHex('WALLET_PRIVATE_KEY');
  // 创建项目:https://console.fuse.io/build
  final publicApiKey = 'YOUR_PUBLIC_API_KEY';
  final fuseSDK = await FuseSDK.init(
    publicApiKey,
    credentials,
  );

  print('Smart contract wallet address: ${fuseSDK.wallet.getSender()}');

  // 发送交易示例
  final res = await fuseSDK.transferToken(
    EthereumAddress.fromHex('TOKEN_ADDRESS'), // 对于发送本地代币,使用'0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'
    EthereumAddress.fromHex('RECIPIENT_ADDRESS'),
    BigInt.parse('AMOUNT_IN_WEI'),
  );
  print('UserOpHash: ${res.userOpHash}');
  print('Waiting for transaction...');
  final ev = await res.wait();

  // 发送批量交易示例
  final batchRes = await fuseSDK.executeBatch([
    Call(
      to: EthereumAddress.fromHex('TARGET_ADDRESS'),
      value: BigInt.parse('AMOUNT_IN_WEI'),
      data: Uint8List(0),
    ),
    Call(
      to: EthereumAddress.fromHex('TOKEN_ADDRESS'),
      value: BigInt.zero,
      data: ContractsUtils.encodeERC20TransferCall(
        EthereumAddress.fromHex('TOKEN_ADDRESS'),
        EthereumAddress.fromHex('RECIPIENT_ADDRESS'),
        BigInt.parse('AMOUNT_IN_WEI'),
      ),
    ),
  ]);

  print('Batch UserOpHash: ${batchRes.userOpHash}');
  print('Waiting for batch transaction...');
  final batchEv = await batchRes.wait();
  print('Batch Transaction hash: ${batchEv?.transactionHash}');

  exit(1);
}

问题排查

如果收到“User op cannot be replaced: fee too low”错误,意味着设置的gas价格太低。可以通过设置TxOptions参数来增加gas价格。

final res = await fuseSDK.transferToken(
    EthereumAddress.fromHex('TOKEN_ADDRESS'),
    EthereumAddress.fromHex('RECIPIENT_ADDRESS'),
    BigInt.parse('AMOUNT_IN_WEI'),
    FuseSDK.defaultTxOptions.copyWith(
      withRetry: true,
      feeIncrementPercentage: 11,
    ),
);
print('UserOpHash: ${res.userOpHash}');
print('Waiting for transaction...');
final ev = await res.wait();

限制

Fuse Wallet SDK仅适用于Fuse和Fuse Sparknet网络,这是一种基于EVM的L1区块链。对其他区块链的支持计划在未来添加。

迁移到v0.2

引言

欢迎使用更新版本的fuse_wallet_sdk。我们的主要目标是使我们的服务与EVM链的发展趋势无缝对齐。我们很高兴引入新的标准EIP 4337,也称为“账户抽象”。此最新协议承诺在以太坊环境中提高安全性、提供更一致的开发者体验和改进用户交互。

前提条件

在开始迁移之前,唯一的前提是需要一个有效的API密钥。如果还没有创建或需要一个新的密钥,请访问开发者控制台获取。

详细迁移步骤
  1. 找到旧的SDK初始化代码。
  2. 移除钱包创建步骤,包括身份验证和事件监听代码。
  3. 更新SDK初始化代码:
    final fuseSDK = await FuseSDK.init(publicApiKey, credentials);
    
  4. 直接在初始化后获取智能合约钱包地址:
    print('Smart contract wallet address: ${fuseSDK.wallet.getSender()}');
    

更多关于Flutter钱包管理插件fuse_wallet_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter钱包管理插件fuse_wallet_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用fuse_wallet_sdk插件进行钱包管理的代码示例。请注意,由于我无法实时验证插件的最新API和功能,以下代码基于插件可能提供的一般功能进行假设。实际使用时,请参考插件的官方文档和最新版本。

首先,确保你的Flutter项目中已经添加了fuse_wallet_sdk依赖。在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  fuse_wallet_sdk: ^最新版本号  # 替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中导入fuse_wallet_sdk并开始使用它。以下是一个简单的示例,展示了如何初始化钱包、创建钱包、获取钱包地址等基本操作。

import 'package:flutter/material.dart';
import 'package:fuse_wallet_sdk/fuse_wallet_sdk.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late Wallet wallet;
  late String walletAddress;

  @override
  void initState() {
    super.initState();
    initWallet();
  }

  Future<void> initWallet() async {
    // 假设fuse_wallet_sdk提供了一个初始化方法,这里用假设的API调用
    // 注意:实际使用时,请参考fuse_wallet_sdk的官方文档
    try {
      // 初始化SDK(如果需要的话)
      await FuseWalletSdk.initialize();

      // 创建新钱包(这里假设返回一个Wallet对象)
      wallet = await FuseWalletSdk.createNewWallet();

      // 获取钱包地址
      walletAddress = wallet.address;

      setState(() {});
    } catch (e) {
      print('Error initializing wallet: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fuse Wallet SDK Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              if (walletAddress.isEmpty)
                CircularProgressIndicator(),
              Text(
                'Wallet Address: $walletAddress',
                style: TextStyle(fontSize: 20),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

注意事项:

  1. API假设:上面的代码假设fuse_wallet_sdk提供了一些基本的API,如initializecreateNewWallet等。实际使用时,请参考插件的官方文档了解具体的API和用法。

  2. 错误处理:在实际应用中,应该添加更完善的错误处理逻辑,以处理可能发生的各种异常情况。

  3. 安全性:钱包管理涉及到用户的资金安全,因此在使用任何钱包管理插件时,务必了解其安全机制,确保用户资金的安全。

  4. 依赖更新:由于Flutter和插件的生态系统不断更新,建议定期检查并更新你的依赖项,以确保项目的稳定性和安全性。

  5. 文档和示例:始终参考插件的官方文档和示例代码,以获得最准确和最新的使用指南。

回到顶部