WIP: continue digging identity migration

This commit is contained in:
poka 2022-08-19 14:10:27 +02:00
parent 237e581d0f
commit d42e715482
4 changed files with 75 additions and 40 deletions

View File

@ -2,6 +2,7 @@
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:fast_base58/fast_base58.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.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/polkawallet_sdk.dart';
import 'package:polkawallet_sdk/storage/keyring.dart'; import 'package:polkawallet_sdk/storage/keyring.dart';
import 'package:polkawallet_sdk/storage/types/keyPairData.dart'; import 'package:polkawallet_sdk/storage/types/keyPairData.dart';
import 'package:polkawallet_sdk/webviewWithExtension/types/signExtrinsicParam.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:truncate/truncate.dart'; import 'package:truncate/truncate.dart';
import 'package:pointycastle/pointycastle.dart' as pc; import 'package:pointycastle/pointycastle.dart' as pc;
@ -280,8 +282,14 @@ class SubstrateSdk with ChangeNotifier {
return genesisHash; return genesisHash;
} }
Future addressToPubkey(String address) async { Future<String> addressToPubkey(String address,
await sdk.api.account.decodeAddress([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 { // Future pubkeyToAddress(String pubkey) async {
@ -610,25 +618,6 @@ class SubstrateSdk with ChangeNotifier {
cryptoType: CryptoType.ed25519, cryptoType: CryptoType.ed25519,
rawSeed: rawSeedHex); 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<String, dynamic>);
// g1V1NewAddress = keypair.address!;
g1V1NewAddress = newAddress.address!; g1V1NewAddress = newAddress.address!;
notifyListeners(); notifyListeners();
} }
@ -794,10 +783,26 @@ class SubstrateSdk with ChangeNotifier {
return await executeCall(txInfo, txOptions, password); return await executeCall(txInfo, txOptions, password);
} }
Future<String> 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<String> migrateIdentity( Future<String> migrateIdentity(
{required String fromAddress, {required String fromAddress,
required String destAddress, required String destAddress,
required String password}) async { required String formPassword,
required String destPassword}) async {
transactionStatus = ''; transactionStatus = '';
final fromPubkey = await sdk.api.account.decodeAddress([fromAddress]); final fromPubkey = await sdk.api.account.decodeAddress([fromAddress]);
final sender = TxSenderData( final sender = TxSenderData(
@ -810,27 +815,35 @@ class SubstrateSdk with ChangeNotifier {
List txOptions = []; List txOptions = [];
String? rawParams; String? rawParams;
// final destKeyring = getKeypair(destAddress); // final destKeyring = getKeypair(destAddress);
// await sdk.api.keyring.signatureVerify(message, signature, address)
final genesisHash = await getGenesisHash(); final genesisHash = await getGenesisHash();
final idtyIndex = await getIdentityIndexOf(destAddress); final idtyIndex = await getIdentityIndexOf(fromAddress);
// final oldPubkey = await addressToPubkey(fromAddress); final oldPubkey = await addressToPubkey(fromAddress, true);
final messageToSign = 'icok$genesisHash$idtyIndex$fromAddress'; final messageToSign = 'icok$genesisHash$idtyIndex$oldPubkey';
final newKeySig = messageToSign; final newKeySig =
await signMessage(messageToSign, destAddress, destPassword);
txInfo = TxInfoData( txInfo = TxInfoData(
'utility', 'identity',
'batchAll', 'changeOwnerKey',
sender, 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( // const tx1 = 'api.tx.universalDividend.claimUds()';
'g1migration args: ${txInfo.module}, ${txInfo.call}, $txOptions, $rawParams'); // final tx2 = 'api.tx.identity.changeOwnerKey("$destAddress", "$newKeySig")';
return await executeCall(txInfo, txOptions, password, rawParams); // 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 { Future revokeIdentity(String address, String password) async {
@ -856,7 +869,9 @@ class SubstrateSdk with ChangeNotifier {
} }
Future migrateCsToV2(String salt, String password, String destAddress, 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'); final scrypt = pc.KeyDerivator('scrypt');
scrypt.init( scrypt.init(
@ -891,7 +906,8 @@ class SubstrateSdk with ChangeNotifier {
await migrateIdentity( await migrateIdentity(
fromAddress: keypair.address!, fromAddress: keypair.address!,
destAddress: destAddress, destAddress: destAddress,
password: 'password'); formPassword: 'password',
destPassword: destPassword);
} else if (balance != 0) { } else if (balance != 0) {
await pay( await pay(
fromAddress: keypair.address!, fromAddress: keypair.address!,

View File

@ -39,8 +39,7 @@ class HomeScreen extends StatelessWidget {
final bool isWalletsExists = myWalletProvider.checkIfWalletExist(); final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
// sub.csToV2('test', 'test'); // sub.addressToPubkey('5CQ8T4qpbYJq7uVsxGPQ5q2df7x3Wa4aRY6HUWMBYjfLZhnn');
// sub.getSs58Prefix();
isTall = false; isTall = false;
ratio = 1; ratio = 1;

View File

@ -1,3 +1,5 @@
// ignore_for_file: use_build_context_synchronously
import 'dart:async'; import 'dart:async';
import 'package:easy_localization/easy_localization.dart'; 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/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.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:gecko/screens/transaction_in_progress.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -211,11 +214,27 @@ class ImportG1v1 extends StatelessWidget {
onPressed: canValidate onPressed: canValidate
? () async { ? () async {
log.d('GOOO'); 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.migrateCsToV2(
sub.csSalt.text, sub.csSalt.text,
sub.csPassword.text, sub.csPassword.text,
selectedWallet.address!, selectedWallet.address!,
destPassword: pin ?? myWalletProvider.pinCode,
balance: balance, balance: balance,
idtyStatus: idtyStatus); idtyStatus: idtyStatus);
Navigator.push( Navigator.push(

View File

@ -88,7 +88,8 @@ class TransactionInProgress extends StatelessWidget {
if (result.contains('blockHash: ')) { if (result.contains('blockHash: ')) {
isValid = true; isValid = true;
resultText = 'extrinsicValidated'.tr(args: [actionName]); 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 { } else {
isValid = false; isValid = false;
resultText = "${"anErrorOccured".tr()}:\n"; resultText = "${"anErrorOccured".tr()}:\n";