From 05b425c3d2b6ae733d5d36ceac183813940c63e8 Mon Sep 17 00:00:00 2001 From: poka Date: Fri, 27 May 2022 08:54:29 +0200 Subject: [PATCH] Set gdev first bootstrap; Can create idty, can cert; --- assets/gecko_certify.png | Bin 0 -> 5665 bytes lib/providers/substrate_sdk.dart | 121 ++++++++++++++------ lib/providers/wallet_options.dart | 1 + lib/providers/wallets_profiles.dart | 1 + lib/screens/myWallets/unlocking_wallet.dart | 28 +++-- lib/screens/myWallets/wallet_options.dart | 6 +- lib/screens/transaction_in_progress.dart | 73 ++++++++---- lib/screens/wallet_view.dart | 56 +++++++++ pubspec.yaml | 2 +- 9 files changed, 217 insertions(+), 71 deletions(-) create mode 100644 assets/gecko_certify.png diff --git a/assets/gecko_certify.png b/assets/gecko_certify.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa5f33dd749c9e8eb5956c0b3b63afbfb0db816 GIT binary patch literal 5665 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 Hu0mjfLPfu= literal 0 HcmV?d00001 diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 1306584..8567c71 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -254,33 +254,6 @@ class SubstrateSdk with ChangeNotifier { return gen.mnemonic!; } - // Future pay(BuildContext context, String address, double amount, - // String password) async { - // final sender = TxSenderData( - // keyring.current.address, - // keyring.current.pubKey, - // ); - // final txInfo = TxInfoData('balances', 'transfer', sender); - // try { - // final hash = await sdk.api.tx.signAndSend( - // txInfo, - // [address, amount * 100], - // password, - // onStatusChange: (status) { - // print('status: ' + status); - // if (status == 'Ready') { - // snack(context, 'Transaction terminé'); - // } - // }, - // ); - // print(hash.toString()); - // return true; - // } catch (err) { - // print(err.toString()); - // return false; - // } - // } - String setCurrentWallet(String address) { try { final acc = getKeypair(address); @@ -300,7 +273,7 @@ class SubstrateSdk with ChangeNotifier { } } - Future pay(BuildContext context, + Future pay( {required String fromAddress, required String destAddress, required double amount, @@ -329,14 +302,89 @@ class SubstrateSdk with ChangeNotifier { if (status == 'Ready') { transactionStatus = 'sent'; notifyListeners(); - // snack(context, 'Transaction terminé'); } }, ).timeout( const Duration(seconds: 12), onTimeout: () => {}, ); - print(hash.toString()); + log.d(hash.toString()); + if (hash.isEmpty) { + transactionStatus = 'timeout'; + notifyListeners(); + + return 'timeout'; + } else { + transactionStatus = hash.toString(); + notifyListeners(); + return hash.toString(); + } + } catch (e) { + transactionStatus = e.toString(); + notifyListeners(); + return e.toString(); + } + } + + Future certify( + String fromAddress, String password, String toAddress) async { + transactionStatus = ''; + + setCurrentWallet(fromAddress); + log.d('me: ' + fromAddress); + log.d('to: ' + toAddress); + + final _myIdtyStatus = await idtyStatus(fromAddress); + final _toIdtyStatus = await idtyStatus(toAddress); + + log.d(_myIdtyStatus); + log.d(_toIdtyStatus); + + if (_myIdtyStatus != 'Validated') { + transactionStatus = 'notMember'; + notifyListeners(); + return 'notMember'; + } + + final sender = TxSenderData( + keyring.current.address, + keyring.current.pubKey, + ); + TxInfoData txInfo; + + if (_toIdtyStatus == 'noid') { + txInfo = TxInfoData( + 'identity', + 'createIdentity', + sender, + ); + } else if (_toIdtyStatus == 'Validated' || + _toIdtyStatus == 'ConfirmedByOwner') { + txInfo = TxInfoData( + 'cert', + 'addCert', + sender, + ); + } else { + transactionStatus = 'cantBeCert'; + notifyListeners(); + return 'cantBeCert'; + } + + log.d('Cert action: ' + txInfo.call!); + + try { + final hash = await sdk.api.tx + .signAndSend( + txInfo, + [toAddress], + password, + ) + .timeout( + const Duration(seconds: 12), + onTimeout: () => {}, + ); + log.d(hash); if (hash.isEmpty) { transactionStatus = 'timeout'; notifyListeners(); @@ -378,10 +426,10 @@ class SubstrateSdk with ChangeNotifier { } Future confirmIdentity( - String address, String name, String password) async { + String fromAddress, String name, String password) async { // Confirm identity - setCurrentWallet(address); - log.d('idty: ' + keyring.current.address!); + setCurrentWallet(fromAddress); + log.d('me: ' + keyring.current.address!); final sender = TxSenderData( keyring.current.address, @@ -404,13 +452,14 @@ class SubstrateSdk with ChangeNotifier { return 'confirmed'; } on Exception catch (e) { log.e(e); - // if (e.toString() == 'Exception: password check failed') { - // throw PasswordException('Bad password'); - // } return e.toString(); } } + Future isMember(String address) async { + return await idtyStatus(address) == 'Validated'; + } + Future derive( BuildContext context, String address, int number, String password) async { final keypair = getKeypair(address); diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index ee6acef..178c9a9 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -247,6 +247,7 @@ class WalletOptionsProvider with ChangeNotifier { child: Column(children: [ const Text('Nom:'), TextField( + autofocus: true, controller: idtyName, ) ]), diff --git a/lib/providers/wallets_profiles.dart b/lib/providers/wallets_profiles.dart index f32cb35..27ac874 100644 --- a/lib/providers/wallets_profiles.dart +++ b/lib/providers/wallets_profiles.dart @@ -106,6 +106,7 @@ class WalletsProfilesProvider with ChangeNotifier { } String getShortPubkey(String pubkey) { + // log.d(pubkey); List pubkeyByte = Base58Decode(pubkey); Digest pubkeyS256 = sha256.convert(sha256.convert(pubkeyByte).bytes); String pubkeyCheksum = Base58Encode(pubkeyS256.bytes); diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index 3962dc3..210d268 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -232,29 +232,41 @@ class UnlockingWallet extends StatelessWidget { ); break; case "pay": - // Navigator.pop(context); - // Navigator.pop(context); // Payment workflow ! WalletsProfilesProvider _walletViewProvider = Provider.of(context, listen: false); final acc = _sub.getCurrentWallet(); log.d( - "fromAddress: ${acc.address!},destAddress: ${_walletViewProvider.outputPubkey.text}, amount: ${double.parse(_walletViewProvider.payAmount.text)}, password: $_pin"); - _sub.pay(context, + "fromAddress: ${acc.address!},destAddress: ${_walletViewProvider.pubkey!}, amount: ${double.parse(_walletViewProvider.payAmount.text)}, password: $_pin"); + _sub.pay( fromAddress: acc.address!, - destAddress: _walletViewProvider.outputPubkey.text, + destAddress: _walletViewProvider.pubkey!, amount: double.parse(_walletViewProvider.payAmount.text), password: _pin.toUpperCase()); - // await paymentsResult(context, resultPay); Navigator.push( context, MaterialPageRoute(builder: (context) { - return TransactionInProgress( - chest: currentChestNumber, pin: _pin.toUpperCase()); + return const TransactionInProgress(); }), ); + break; + case "cert": + WalletsProfilesProvider _walletViewProvider = + Provider.of(context, + listen: false); + final acc = _sub.getCurrentWallet(); + _sub.certify(acc.address!, _pin.toUpperCase(), + _walletViewProvider.pubkey!); + + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const TransactionInProgress(transType: 'cert'); + }), + ); + break; } } diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 6eddab7..3614935 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -4,6 +4,7 @@ import 'package:gecko/globals.dart'; import 'package:gecko/models/chest_data.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/models/wallet_data.dart'; +import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/screens/history.dart'; @@ -114,7 +115,7 @@ class WalletOptions extends StatelessWidget { SizedBox(height: 10 * ratio), historyWidget(context, _historyProvider, walletProvider), SizedBox(height: 12 * ratio), - setDefaultWallet(walletProvider, _myWalletProvider, + setDefaultWallet(context, walletProvider, _myWalletProvider, _walletOptions, _currentChest), SizedBox(height: 17 * ratio), if (!walletProvider.isDefaultWallet) @@ -332,11 +333,13 @@ class WalletOptions extends StatelessWidget { } Widget setDefaultWallet( + BuildContext context, WalletOptionsProvider walletProvider, MyWalletsProvider _myWalletProvider, WalletOptionsProvider _walletOptions, int _currentChest) { WalletData defaultWallet = _myWalletProvider.getDefaultWallet()!; + SubstrateSdk _sub = Provider.of(context, listen: false); _walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id()[1]); @@ -348,6 +351,7 @@ class WalletOptions extends StatelessWidget { ChestData _newChestData = chestBox.get(_currentChest)!; _newChestData.defaultWallet = wallet.number; await chestBox.put(_currentChest, _newChestData); + _sub.setCurrentWallet(wallet.address!); _myWalletProvider.readAllWallets(_currentChest); _myWalletProvider.rebuildWidget(); } diff --git a/lib/screens/transaction_in_progress.dart b/lib/screens/transaction_in_progress.dart index 1adb453..9a275a3 100644 --- a/lib/screens/transaction_in_progress.dart +++ b/lib/screens/transaction_in_progress.dart @@ -10,11 +10,9 @@ import 'package:provider/provider.dart'; // ignore: must_be_immutable class TransactionInProgress extends StatelessWidget { - const TransactionInProgress( - {Key? key, required this.chest, required this.pin}) + const TransactionInProgress({Key? key, this.transType = 'pay'}) : super(key: key); - final int chest; - final String pin; + final String transType; @override Widget build(BuildContext context) { @@ -30,10 +28,29 @@ class TransactionInProgress extends StatelessWidget { // Map jsonResult; final _result = _sub.transactionStatus; + log.d(_walletViewProvider.pubkey!); + final from = _myWalletProvider.getDefaultWallet()!.name!; - final to = _walletViewProvider - .getShortPubkey(_walletViewProvider.outputPubkey.text); + final to = _walletViewProvider.getShortPubkey(_walletViewProvider.pubkey!); final amount = _walletViewProvider.payAmount.text; + String _actionName = ''; + + switch (transType) { + case 'pay': + { + _actionName = 'Transaction'; + } + break; + case 'cert': + { + _actionName = 'Certification'; + } + break; + default: + { + _actionName = 'Transaction étrange'; + } + } switch (_result) { case '': @@ -52,7 +69,7 @@ class TransactionInProgress extends StatelessWidget { // jsonResult = json.decode(_result); log.d(_result); if (_result.contains('blockHash: ')) { - _resultText = 'Transcation validé !'; + _resultText = '$_actionName validé !'; } else { _resultText = "Une erreur s'est produite:\n\n$_result"; } @@ -64,7 +81,9 @@ class TransactionInProgress extends StatelessWidget { _sub.transactionStatus = ''; Navigator.pop(context); Navigator.pop(context); - Navigator.pop(context); + if (_actionName == 'pay') { + Navigator.pop(context); + } return Future.value(true); }, child: Scaffold( @@ -76,7 +95,7 @@ class TransactionInProgress extends StatelessWidget { height: 22, child: Row( mainAxisAlignment: MainAxisAlignment.center, - children: const [Text('Transaction en cours')]), + children: [Text('$_actionName en cours')]), )), body: SafeArea( child: Align( @@ -95,13 +114,14 @@ class TransactionInProgress extends StatelessWidget { )), child: Column(children: [ const SizedBox(height: 10), - Text( - '$amount $currencyName', - textAlign: TextAlign.center, - style: const TextStyle( - fontSize: 18, fontWeight: FontWeight.w600), - ), - const SizedBox(height: 10), + if (transType == 'pay') + Text( + '$amount $currencyName', + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 18, fontWeight: FontWeight.w600), + ), + if (transType == 'pay') const SizedBox(height: 10), const Text( 'de', textAlign: TextAlign.center, @@ -130,23 +150,24 @@ class TransactionInProgress extends StatelessWidget { ), // const SizedBox(height: 20, width: double.infinity), const Spacer(), - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - Text( - _resultText, - textAlign: TextAlign.center, - style: TextStyle(fontSize: 19 * ratio), - ), + Column(children: [ Visibility( visible: isLoading, child: SizedBox( - height: 15, - width: 15, + height: 18, + width: 18, child: CircularProgressIndicator( color: orangeC, strokeWidth: 2, ), ), ), + const SizedBox(height: 10), + Text( + _resultText, + textAlign: TextAlign.center, + style: TextStyle(fontSize: 19 * ratio), + ), ]), const Spacer(), Expanded( @@ -164,7 +185,9 @@ class TransactionInProgress extends StatelessWidget { onPressed: () { Navigator.pop(context); Navigator.pop(context); - Navigator.pop(context); + if (_actionName == 'pay') { + Navigator.pop(context); + } }, child: Text( 'Fermer', diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index d66d62f..63b2d34 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -29,6 +29,12 @@ class WalletViewScreen extends StatelessWidget { CesiumPlusProvider _cesiumPlusProvider = Provider.of(context, listen: false); _walletViewProvider.pubkey = pubkey!; + SubstrateSdk _sub = Provider.of(context, listen: false); + + MyWalletsProvider _myWalletProvider = + Provider.of(context, listen: false); + WalletData? defaultWallet = _myWalletProvider.getDefaultWallet(); + _sub.setCurrentWallet(defaultWallet!.address!); return Scaffold( resizeToAvoidBottomInset: true, @@ -89,6 +95,56 @@ class WalletViewScreen extends StatelessWidget { fontSize: buttonFontSize, fontWeight: FontWeight.w500), ), ]), + Consumer(builder: (context, _sub, _) { + return FutureBuilder( + future: _sub.isMember(defaultWallet.address!), + builder: (context, AsyncSnapshot snapshot) { + return Visibility( + visible: (snapshot.data ?? false), + child: Column(children: [ + SizedBox( + height: buttonSize, + child: ClipOval( + child: Material( + color: const Color(0xffFFD58D), // button color + child: InkWell( + key: const Key('copyKey'), + splashColor: orangeC, // inkwell color + child: const Padding( + padding: EdgeInsets.only(bottom: 0), + child: Image( + image: AssetImage( + 'assets/gecko_certify.png')), + ), + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return UnlockingWallet( + wallet: defaultWallet, + action: "cert"); + }, + ), + ); + // _sub.certify(fromAddress, password, toAddress); + }), + ), + ), + ), + const SizedBox(height: 9), + Text( + "Certifier", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: buttonFontSize, + fontWeight: FontWeight.w500), + ), + ]), + ); + }, + ); + }), Column(children: [ SizedBox( height: buttonSize, diff --git a/pubspec.yaml b/pubspec.yaml index a1c2e93..855c706 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ description: Pay with G1. # pub.dev using `pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.6+4 +version: 0.0.6+5 environment: sdk: '>=2.12.0 <3.0.0'