Skip to content
Snippets Groups Projects
substrate_sdk.dart 3.09 KiB
Newer Older
poka's avatar
poka committed
import 'dart:convert';
import 'package:flutter/material.dart';
poka's avatar
poka committed
import 'package:flutter/services.dart';
poka's avatar
poka committed
import 'package:gecko/globals.dart';
import 'package:polkawallet_sdk/api/apiKeyring.dart';
import 'package:polkawallet_sdk/api/types/networkParams.dart';
import 'package:polkawallet_sdk/polkawallet_sdk.dart';
import 'package:polkawallet_sdk/storage/keyring.dart';

class SubstrateSdk with ChangeNotifier {
  final String subNode = '192.168.1.85:9944';
  final bool isSsl = false;

  final WalletSDK sdk = WalletSDK();
  final Keyring keyring = Keyring();
poka's avatar
poka committed
  String generatedMnemonic = '';
poka's avatar
poka committed
  bool sdkLoading = false;
poka's avatar
poka committed
  bool importIsLoading = false;
poka's avatar
poka committed
  TextEditingController jsonKeystore = TextEditingController();
  TextEditingController keystorePassword = TextEditingController();

poka's avatar
poka committed
    sdkLoading = true;
    await keyring.init([0, 2]);

    await sdk.init(keyring);
    sdkReady = true;
poka's avatar
poka committed
    sdkLoading = false;
    notifyListeners();
  }

  Future<void> connectNode() async {
    final String socketKind = isSsl ? 'wss' : 'ws';
    final node = NetworkParams();
    node.name = 'pokaniter';
    node.endpoint = '$socketKind://$subNode';
    node.ss58 = 42;
    final res = await sdk.api.connectNode(keyring, [node]).timeout(
      const Duration(seconds: 10),
      onTimeout: () => null,
    );
    if (res != null) {
      nodeConnected = true;
      notifyListeners();
    }

    // Subscribe bloc number
    sdk.api.setting.subscribeBestNumber((res) {
      blocNumber = int.parse(res.toString());
      notifyListeners();
    });
  }
poka's avatar
poka committed

  Future<void> importFromKeystore() async {
poka's avatar
poka committed
    importIsLoading = true;
    notifyListeners();
    final clipboardData = await Clipboard.getData(Clipboard.kTextPlain);
    if (clipboardData?.text != null) jsonKeystore.text = clipboardData!.text!;
    final json = await sdk.api.keyring
        .importAccount(
poka's avatar
poka committed
      keyring,
      keyType: KeyType.keystore,
poka's avatar
poka committed
      key: jsonKeystore.text.replaceAll("'", "\\'"),
poka's avatar
poka committed
      name: 'testKey',
      password: keystorePassword.text,
poka's avatar
poka committed
    )
        .catchError((e) {
      importIsLoading = false;
      notifyListeners();
    });
    final acc = await sdk.api.keyring
        .addAccount(
poka's avatar
poka committed
      keyring,
      keyType: KeyType.mnemonic,
      acc: json!,
      password: keystorePassword.text,
poka's avatar
poka committed
    )
        .catchError((e) {
      importIsLoading = false;
      notifyListeners();
    });
poka's avatar
poka committed

poka's avatar
poka committed
    // await keystoreBox.clear();
    await keystoreBox.add(acc.toJson());
    Clipboard.setData(ClipboardData(text: jsonEncode(acc.toJson())));
poka's avatar
poka committed
    importIsLoading = false;
poka's avatar
poka committed
    notifyListeners();
  }

  void reload() {
    notifyListeners();
  }
poka's avatar
poka committed

  List getKeyStoreAddress() {
    List result = [];

    for (var element in keystoreBox.values) {
      // Clipboard.setData(ClipboardData(text: jsonEncode(element)));
      result.add(element['address']);
    }

    return result;
  }

  Future<String> generateMnemonic() async {
    final gen = await sdk.api.keyring.generateMnemonic(42);
poka's avatar
poka committed
    generatedMnemonic = gen.mnemonic!;
    notifyListeners();
poka's avatar
poka committed
    return gen.mnemonic!;
  }