Flutter插件aptos的使用_aptos插件可以进行账户生成、账户余额查询以及转账操作

Flutter插件aptos的使用_aptos插件可以进行账户生成、账户余额查询以及转账操作


Aptos Dart SDK

Pub


Flutter插件aptos的安装

pubspec.yaml文件中添加以下依赖:

dependencies:
  aptos: ^0.0.6

Flutter插件aptos的使用

以下是一个完整的示例代码,展示了如何使用aptos插件进行账户生成、账户余额查询以及转账操作。

import 'dart:convert';
import 'dart:math';
import 'dart:typed_data';

import 'package:aptos/aptos.dart';
import 'package:aptos/coin_client.dart';
import 'package:aptos/constants.dart';
import 'package:aptos/models/payload.dart';
import 'package:aptos/models/signature.dart';
import 'package:aptos/models/transaction.dart';
import 'package:flutter/material.dart';
import 'package:ed25519_edwards/ed25519_edwards.dart' as ed25519;

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Aptos',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Transfer Aptos'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final privateKeyTextEditingController = TextEditingController();
  final addressTextEditingController = TextEditingController();
  final amountTextEditingController = TextEditingController();
  var message = "";

  Future<dynamic> _transferWithEncodeSubmissionAPI(
      String privateKey,
      String receiverAddress,
      BigInt amount,
      BigInt gasPrice,
      BigInt maxGasAmount,
      BigInt expirationTimestamp) async {

    final aptos = AptosClient(Constants.testnetAPI, enableDebugLog: true);
    final account = AptosAccount(Uint8List.fromList(HEX.decode(privateKey)));
    final sender = account.address;
    final accountInfo = await aptos.getAccount(sender);
    final txSubmission = TransactionEncodeSubmissionRequest(
      sender: sender,
      sequenceNumber: accountInfo.sequenceNumber,
      maxGasAmount: maxGasAmount.toString(),
      gasUnitPrice: gasPrice.toString(),
      expirationTimestampSecs: expirationTimestamp.toString(),
      payload: Payload(
          type: "entry_function_payload",
          function: "0x1::coin::transfer",
          typeArguments: ["0x1::aptos_coin::AptosCoin"],
          arguments: [receiverAddress, amount.toString()]
      )
    );

    final encodeTx = await aptos.encodeSubmission(txSubmission);
    final hex = HEX.decode(encodeTx.substring(2));
    final hexBytes = Uint8List.fromList(hex);
    final privateKeyBytes = HexString(privateKey).toUint8Array();
    final signingKey = ed25519.PrivateKey(privateKeyBytes);
    final signEncode = ed25519.sign(signingKey, hexBytes).sublist(0, 64);

    final tx = TransactionRequest(
        sender: txSubmission.sender,
        sequenceNumber: txSubmission.sequenceNumber,
        maxGasAmount: txSubmission.maxGasAmount.toString(),
        gasUnitPrice: txSubmission.gasUnitPrice.toString(),
        expirationTimestampSecs: txSubmission.expirationTimestampSecs.toString(),
        payload: txSubmission.payload,
        signature: Signature(
          type: "ed25519_signature",
          publicKey: account.pubKey().hex(), 
          signature: "0x"+HEX.encode(signEncode)
        )
    );

    final result = await aptos.submitTransaction(tx);
    debugPrint(result.toString());
    return result;
  }

  Future<dynamic> _transfer(String privateKey,
      String receiverAddress,
      BigInt amount,
      BigInt gasPrice,
      BigInt maxGasAmount,
      BigInt expirationTimestamp) async {
    final aptos = AptosClient(Constants.testnetAPI, enableDebugLog: true);
    final account = AptosAccount(Uint8List.fromList(HEX.decode(privateKey)));
    final sender = account.address;

    final accountInfo = await aptos.getAccount(sender);
    final ledgerInfo = await aptos.getLedgerInfo();
    final sequenceNumber = int.parse(accountInfo.sequenceNumber);

    const typeArgs = "0x1::aptos_coin::AptosCoin";
    const moduleId = "0x1::coin";
    const moduleFunc = "transfer";
    final entryFunc = EntryFunction.natural(
      moduleId,
      moduleFunc,
      [TypeTagStruct(StructTag.fromString(typeArgs))],
      [bcsToBytes(AccountAddress.fromHex(receiverAddress)), bcsSerializeUint64(amount)],
    );
    final entryFunctionPayload = TransactionPayloadEntryFunction(entryFunc);

    final rawTx = RawTransaction(
        AccountAddress.fromHex(sender),
        BigInt.from(sequenceNumber),
        entryFunctionPayload,
        maxGasAmount,
        gasPrice,
        expirationTimestamp,
        ChainId(ledgerInfo["chain_id"]));

    final privateKeyBytes = HexString(privateKey).toUint8Array();
    final signingKey = ed25519.newKeyFromSeed(privateKeyBytes.sublist(0, 32));
    final publicKey = ed25519.public(signingKey);

    final txnBuilder = TransactionBuilderEd25519(
      Uint8List.fromList(publicKey.bytes),
          (signingMessage) => Ed25519Signature(ed25519.sign(signingKey, signingMessage).sublist(0, 64)),
    );

    final signedTx = txnBuilder.rawToSigned(rawTx);
    final txEdd25519 = signedTx.authenticator as TransactionAuthenticatorEd25519;
    final signature = txEdd25519.signature.value;

    final tx = TransactionRequest(
        sender: sender,
        sequenceNumber: sequenceNumber.toString(),
        maxGasAmount: maxGasAmount.toString(),
        gasUnitPrice: gasPrice.toString(),
        expirationTimestampSecs: expirationTimestamp.toString(),
        payload: Payload(
            type: "entry_function_payload",
            function: "$moduleId::$moduleFunc",
            typeArguments: ["0x1::aptos_coin::AptosCoin"],
            arguments: [receiverAddress, amount.toString()]),
        signature: Signature(
          type: "ed25519_signature",
          publicKey: account.pubKey().hex(), 
          signature: "0x"+HEX.encode(signature)
        )
    );

    final result = await aptos.submitTransaction(tx);
    debugPrint(result.toString());
    return result;
  }

  Future<dynamic> _transferAptos(
      AptosAccount account,
      String receiverAddress,
      BigInt amount,
      {BigInt? gasPrice,
      BigInt? maxGasAmount,
      BigInt? expirationTimestamp}) async {
    final aptos = AptosClient(Constants.testnetAPI, enableDebugLog: true);
    final coinClient = CoinClient(aptos);
    final txHash = await coinClient.transfer(
      account,
      receiverAddress,
      amount,
      maxGasAmount: maxGasAmount,
      gasUnitPrice: gasPrice,
      expireTimestamp: expirationTimestamp
    );
    debugPrint(txHash);
    return txHash;
  }

  void _send() async {
    final privateKey = privateKeyTextEditingController.text.trim();
    final address = addressTextEditingController.text.trim();
    final amountText = amountTextEditingController.text.trim();

    AptosAccount account;
    try {
      account = AptosAccount(HexString(privateKey).toUint8Array());
    } catch (e) {
      setState(() {
        message = "invalid private key length";
      });
      return;
    }

    final amount = double.tryParse(amountText);
    if (amount == null) {
      setState(() {
        message = "invalid aptos amount";
      });
      return;
    }

    final totalAptos = BigInt.from(amount * pow(10, 8));
    final result = await _transferAptos(account, address, totalAptos);
    setState(() {
      message = "txhash: ${result["hash"]}";
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Container(
        padding: const EdgeInsets.symmetric(horizontal: 20),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              TextField(
                controller: privateKeyTextEditingController,
                decoration: const InputDecoration(
                    border: OutlineInputBorder(),
                    labelText: "Private key"
                )
              ),
              const SizedBox(height: 40),
              TextField(
                controller: addressTextEditingController,
                decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: "Receiver address"
                )
              ),
              const SizedBox(height: 20),
              TextField(
                controller: amountTextEditingController,
                decoration: const InputDecoration(
                    border: OutlineInputBorder(),
                    labelText: "Aptos amount"
                )
              ),
              const SizedBox(height: 20),
              TextButton(
                onPressed: _send,
                child: const Text("Send", style: TextStyle(fontSize: 30))
              ),
              const SizedBox(height: 20),
              Text(message, style: const TextStyle(color: Colors.red))
            ],
          ),
        ),
      )
    );
  }
}

更多关于Flutter插件aptos的使用_aptos插件可以进行账户生成、账户余额查询以及转账操作的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件aptos的使用_aptos插件可以进行账户生成、账户余额查询以及转账操作的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,插件的使用通常是为了扩展应用的功能,接入第三方服务,或者实现一些平台特定的特性。虽然“aptos”这个插件的具体功能被定义为“未知”,但我可以给你一个基础的Flutter插件使用的示例代码框架,这样你可以根据“aptos”插件的实际文档和功能进行调整。

首先,你需要确保你的Flutter项目已经正确设置,并且你已经在pubspec.yaml文件中添加了“aptos”插件的依赖(假设它已经在pub.dev上存在)。如果“aptos”插件实际上并不存在于pub.dev,你可能需要手动添加本地依赖或者从其他源获取它。

以下是一个假设性的示例代码框架,用于展示如何在Flutter中使用一个名为“aptos”的插件:

  1. pubspec.yaml中添加依赖(如果插件存在于pub.dev):
dependencies:
  flutter:
    sdk: flutter
  aptos: ^x.y.z  # 替换为实际的版本号

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

  1. 导入插件并在代码中使用
import 'package:flutter/material.dart';
import 'package:aptos/aptos.dart';  // 假设这是插件的导入路径

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Aptos Plugin Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AptosDemoScreen(),
    );
  }
}

class AptosDemoScreen extends StatefulWidget {
  @override
  _AptosDemoScreenState createState() => _AptosDemoScreenState();
}

class _AptosDemoScreenState extends State<AptosDemoScreen> {
  // 假设Aptos插件有一个初始化方法
  AptosPlugin? aptosPlugin;

  @override
  void initState() {
    super.initState();
    // 初始化插件
    aptosPlugin = AptosPlugin();
    // 假设有一个初始化函数需要调用
    aptosPlugin!.initialize().then((value) {
      // 处理初始化结果
      print('Aptos Plugin Initialized: $value');
    }).catchError((error) {
      // 处理错误
      print('Failed to Initialize Aptos Plugin: $error');
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Aptos Plugin Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            if (aptosPlugin != null) {
              try {
                // 假设插件有一个执行未知功能的方法
                var result = await aptosPlugin!.performUnknownFunction();
                // 处理结果
                print('Result from Aptos Plugin: $result');
              } catch (error) {
                // 处理错误
                print('Error performing unknown function: $error');
              }
            }
          },
          child: Text('Perform Unknown Function'),
        ),
      ),
    );
  }
}

// 假设这是Aptos插件的类定义(实际上这应该由插件提供)
class AptosPlugin {
  Future<bool> initialize() async {
    // 插件初始化逻辑
    return Future.value(true);  // 假设初始化总是成功
  }

  Future<dynamic> performUnknownFunction() async {
    // 执行未知功能的逻辑
    // 这里应该根据插件的实际功能来实现
    return Future.value('Unknown Function Result');  // 示例返回值
  }
}

注意:上述代码中的AptosPlugin类及其方法initializeperformUnknownFunction是假设性的,实际上你应该参考“aptos”插件的官方文档来了解如何正确初始化和使用它。如果插件的文档不完整或者缺失,你可能需要联系插件的开发者或者查找其他资源来获取帮助。

由于“aptos”插件的具体功能和API未知,上述代码仅提供了一个通用的插件使用框架。在实际应用中,你需要根据插件的实际API和功能来调整代码。

回到顶部