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密钥。如果还没有创建或需要一个新的密钥,请访问开发者控制台获取。
详细迁移步骤
- 找到旧的SDK初始化代码。
- 移除钱包创建步骤,包括身份验证和事件监听代码。
- 更新SDK初始化代码:
final fuseSDK = await FuseSDK.init(publicApiKey, credentials);
- 直接在初始化后获取智能合约钱包地址:
print('Smart contract wallet address: ${fuseSDK.wallet.getSender()}');
更多关于Flutter钱包管理插件fuse_wallet_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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),
),
],
),
),
),
);
}
}
注意事项:
-
API假设:上面的代码假设
fuse_wallet_sdk
提供了一些基本的API,如initialize
、createNewWallet
等。实际使用时,请参考插件的官方文档了解具体的API和用法。 -
错误处理:在实际应用中,应该添加更完善的错误处理逻辑,以处理可能发生的各种异常情况。
-
安全性:钱包管理涉及到用户的资金安全,因此在使用任何钱包管理插件时,务必了解其安全机制,确保用户资金的安全。
-
依赖更新:由于Flutter和插件的生态系统不断更新,建议定期检查并更新你的依赖项,以确保项目的稳定性和安全性。
-
文档和示例:始终参考插件的官方文档和示例代码,以获得最准确和最新的使用指南。