From d42e7154829971645e2561efc9d8107a9f70e6a6 Mon Sep 17 00:00:00 2001 From: poka Date: Fri, 19 Aug 2022 14:10:27 +0200 Subject: [PATCH] WIP: continue digging identity migration --- lib/providers/substrate_sdk.dart | 90 ++++++++++++++---------- lib/screens/home.dart | 3 +- lib/screens/myWallets/import_g1_v1.dart | 19 +++++ lib/screens/transaction_in_progress.dart | 3 +- 4 files changed, 75 insertions(+), 40 deletions(-) diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 8af5406..34571f3 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -2,6 +2,7 @@ import 'dart:typed_data'; import 'package:easy_localization/easy_localization.dart'; +import 'package:fast_base58/fast_base58.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/chest_data.dart'; @@ -14,6 +15,7 @@ import 'package:polkawallet_sdk/api/types/txInfoData.dart'; import 'package:polkawallet_sdk/polkawallet_sdk.dart'; import 'package:polkawallet_sdk/storage/keyring.dart'; import 'package:polkawallet_sdk/storage/types/keyPairData.dart'; +import 'package:polkawallet_sdk/webviewWithExtension/types/signExtrinsicParam.dart'; import 'package:provider/provider.dart'; import 'package:truncate/truncate.dart'; import 'package:pointycastle/pointycastle.dart' as pc; @@ -280,8 +282,14 @@ class SubstrateSdk with ChangeNotifier { return genesisHash; } - Future addressToPubkey(String address) async { - await sdk.api.account.decodeAddress([address]); + Future addressToPubkey(String address, + [bool toBase58 = false]) async { + final pubkey = await sdk.api.account.decodeAddress([address]); + final String pubkeyHex = pubkey!.keys.first; + final pubkeyByte = HEX.decode(pubkeyHex.substring(2)) as Uint8List; + final pubkey58 = Base58Encode(pubkeyByte); + + return toBase58 ? pubkey58 : pubkeyHex; } // Future pubkeyToAddress(String pubkey) async { @@ -610,25 +618,6 @@ class SubstrateSdk with ChangeNotifier { cryptoType: CryptoType.ed25519, rawSeed: rawSeedHex); - // final json = await sdk.api.keyring.importAccount(keyring, - // keyType: KeyType.rawSeed, - // key: rawSeedHex, - // name: 'test', - // password: 'password', - // derivePath: '', - // cryptoType: CryptoType.ed25519); - - // final keypair = await sdk.api.keyring.addAccount( - // keyring, - // keyType: KeyType.rawSeed, - // acc: json!, - // password: password, - // ); - // await sdk.api.keyring.deleteAccount(keyring, keypair); - - // final keypair2 = KeyPairData.fromJson(json as Map); - - // g1V1NewAddress = keypair.address!; g1V1NewAddress = newAddress.address!; notifyListeners(); } @@ -794,10 +783,26 @@ class SubstrateSdk with ChangeNotifier { return await executeCall(txInfo, txOptions, password); } + Future signMessage( + String message, String address, String password) async { + final params = SignAsExtensionParam(); + params.msgType = "pub(bytes.sign)"; + params.request = { + "address": address, + "data": message, + }; + + final res = await sdk.api.keyring.signAsExtension(password, params); + // log.d('signaturee: ${res?.signature}'); + + return res?.signature ?? ''; + } + Future migrateIdentity( {required String fromAddress, required String destAddress, - required String password}) async { + required String formPassword, + required String destPassword}) async { transactionStatus = ''; final fromPubkey = await sdk.api.account.decodeAddress([fromAddress]); final sender = TxSenderData( @@ -810,27 +815,35 @@ class SubstrateSdk with ChangeNotifier { List txOptions = []; String? rawParams; // final destKeyring = getKeypair(destAddress); + // await sdk.api.keyring.signatureVerify(message, signature, address) final genesisHash = await getGenesisHash(); - final idtyIndex = await getIdentityIndexOf(destAddress); - // final oldPubkey = await addressToPubkey(fromAddress); - final messageToSign = 'icok$genesisHash$idtyIndex$fromAddress'; - final newKeySig = messageToSign; + final idtyIndex = await getIdentityIndexOf(fromAddress); + final oldPubkey = await addressToPubkey(fromAddress, true); + final messageToSign = 'icok$genesisHash$idtyIndex$oldPubkey'; + final newKeySig = + await signMessage(messageToSign, destAddress, destPassword); txInfo = TxInfoData( - 'utility', - 'batchAll', + 'identity', + 'changeOwnerKey', sender, ); - const tx1 = 'api.tx.universalDividend.claimUds()'; - final tx2 = 'api.tx.identity.changeOwnerKey("$destAddress", "$newKeySig")'; - const tx3 = 'api.tx.balances.transferAll(false)'; - rawParams = '[[$tx1, $tx2, $tx3]]'; + txOptions = [destAddress, newKeySig]; - log.d( - 'g1migration args: ${txInfo.module}, ${txInfo.call}, $txOptions, $rawParams'); - return await executeCall(txInfo, txOptions, password, rawParams); + // const tx1 = 'api.tx.universalDividend.claimUds()'; + // final tx2 = 'api.tx.identity.changeOwnerKey("$destAddress", "$newKeySig")'; + // const tx3 = 'api.tx.balances.transferAll(false)'; + + // rawParams = '[[$tx1, $tx2, $tx3]]'; + + log.d("""g1migration args:${txInfo.module}, ${txInfo.call}, + txOptions: $txOptions + rawParams: $rawParams + messageToSign: $messageToSign + newKeySig: $newKeySig"""); + return await executeCall(txInfo, txOptions, formPassword, rawParams); } Future revokeIdentity(String address, String password) async { @@ -856,7 +869,9 @@ class SubstrateSdk with ChangeNotifier { } Future migrateCsToV2(String salt, String password, String destAddress, - {required double balance, String idtyStatus = 'noid'}) async { + {required destPassword, + required double balance, + String idtyStatus = 'noid'}) async { final scrypt = pc.KeyDerivator('scrypt'); scrypt.init( @@ -891,7 +906,8 @@ class SubstrateSdk with ChangeNotifier { await migrateIdentity( fromAddress: keypair.address!, destAddress: destAddress, - password: 'password'); + formPassword: 'password', + destPassword: destPassword); } else if (balance != 0) { await pay( fromAddress: keypair.address!, diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 297121b..f586685 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -39,8 +39,7 @@ class HomeScreen extends StatelessWidget { final bool isWalletsExists = myWalletProvider.checkIfWalletExist(); - // sub.csToV2('test', 'test'); - // sub.getSs58Prefix(); + // sub.addressToPubkey('5CQ8T4qpbYJq7uVsxGPQ5q2df7x3Wa4aRY6HUWMBYjfLZhnn'); isTall = false; ratio = 1; diff --git a/lib/screens/myWallets/import_g1_v1.dart b/lib/screens/myWallets/import_g1_v1.dart index 259ec6e..a9fbc21 100644 --- a/lib/screens/myWallets/import_g1_v1.dart +++ b/lib/screens/myWallets/import_g1_v1.dart @@ -1,3 +1,5 @@ +// ignore_for_file: use_build_context_synchronously + import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; @@ -8,6 +10,7 @@ import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/wallet_options.dart'; +import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:provider/provider.dart'; @@ -211,11 +214,27 @@ class ImportG1v1 extends StatelessWidget { onPressed: canValidate ? () async { log.d('GOOO'); + WalletData? defaultWallet = + myWalletProvider.getDefaultWallet(); + + String? pin; + if (myWalletProvider.pinCode == '') { + pin = await Navigator.push( + context, + MaterialPageRoute( + builder: (homeContext) { + return UnlockingWallet( + wallet: defaultWallet); + }, + ), + ); + } sub.migrateCsToV2( sub.csSalt.text, sub.csPassword.text, selectedWallet.address!, + destPassword: pin ?? myWalletProvider.pinCode, balance: balance, idtyStatus: idtyStatus); Navigator.push( diff --git a/lib/screens/transaction_in_progress.dart b/lib/screens/transaction_in_progress.dart index d63e166..6ab820b 100644 --- a/lib/screens/transaction_in_progress.dart +++ b/lib/screens/transaction_in_progress.dart @@ -88,7 +88,8 @@ class TransactionInProgress extends StatelessWidget { if (result.contains('blockHash: ')) { isValid = true; resultText = 'extrinsicValidated'.tr(args: [actionName]); - log.i('Bloc of last transaction: ${sub.blocNumber} --- $result'); + log.i( + 'g1migration Bloc of last transaction: ${sub.blocNumber} --- $result'); } else { isValid = false; resultText = "${"anErrorOccured".tr()}:\n";