From f46acb23e44de8ec01bdc845a9fa72f848e9b57e Mon Sep 17 00:00:00 2001 From: poka Date: Tue, 6 Sep 2022 09:29:29 +0200 Subject: [PATCH 01/11] setSender methode --- lib/providers/substrate_sdk.dart | 43 ++--------- lib/screens/myWallets/manage_membership.dart | 75 +++++++++++--------- 2 files changed, 48 insertions(+), 70 deletions(-) diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 3955cf4..f07df46 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -662,13 +662,9 @@ class SubstrateSdk with ChangeNotifier { required double amount, required String password}) async { transactionStatus = ''; - final fromPubkey = await sdk.api.account.decodeAddress([fromAddress]); final int amountUnit = (amount * 100).toInt(); - final sender = TxSenderData( - fromAddress, - fromPubkey!.keys.first, - ); + final sender = await _setSender(fromAddress); final globalBalance = await getBalance(fromAddress); TxInfoData txInfo; @@ -761,29 +757,9 @@ class SubstrateSdk with ChangeNotifier { return await _executeCall(txInfo, txOptions, password, rawParams); } - // Future claimUDs(String password) async { - // final sender = TxSenderData( - // keyring.current.address, - // keyring.current.pubKey, - // ); - - // final txInfo = TxInfoData( - // 'universalDividend', - // 'claimUds', - // sender, - // ); - - // return await executeCall(txInfo, [], password); - // } - Future confirmIdentity( String fromAddress, String name, String password) async { - final fromPubkey = await sdk.api.account.decodeAddress([fromAddress]); - - final sender = TxSenderData( - fromAddress, - fromPubkey!.keys.first, - ); + final sender = await _setSender(fromAddress); final txInfo = TxInfoData( 'identity', @@ -803,11 +779,7 @@ class SubstrateSdk with ChangeNotifier { required Map fromBalance, bool withBalance = false}) async { transactionStatus = ''; - final fromPubkey = await sdk.api.account.decodeAddress([fromAddress]); - final sender = TxSenderData( - fromAddress, - fromPubkey!.keys.first, - ); + final sender = await _setSender(fromAddress); TxInfoData txInfo; List txOptions = []; @@ -871,16 +843,13 @@ newKeySig: $newKeySig"""); Future revokeIdentity(String address, String password) async { final idtyIndex = await _getIdentityIndexOf(address); - final sender = TxSenderData( - keyring.current.address, - keyring.current.pubKey, - ); + final sender = await _setSender(address); TxInfoData txInfo; txInfo = TxInfoData( - 'membership', - 'revokeMembership', + 'identity', + 'revokeIdentity', sender, ); diff --git a/lib/screens/myWallets/manage_membership.dart b/lib/screens/myWallets/manage_membership.dart index 99feb0b..a9a9b90 100644 --- a/lib/screens/myWallets/manage_membership.dart +++ b/lib/screens/myWallets/manage_membership.dart @@ -1,9 +1,18 @@ +// ignore_for_file: use_build_context_synchronously + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; +import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; +import 'package:gecko/providers/my_wallets.dart'; +import 'package:gecko/providers/substrate_sdk.dart'; +import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/myWallets/migrate_identity.dart'; +import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; +import 'package:gecko/screens/transaction_in_progress.dart'; +import 'package:provider/provider.dart'; // import 'package:gecko/models/wallet_data.dart'; // import 'package:gecko/providers/my_wallets.dart'; // import 'package:gecko/providers/substrate_sdk.dart'; @@ -68,43 +77,43 @@ class ManageMembership extends StatelessWidget { key: keyRevokeIdty, onTap: () async { // TODOO: Generate revoke document, and understand extrinsic identity.revokeIdentity options - // final _answer = await confirmPopup(context, - // 'Êtes-vous certains de vouloir révoquer définitivement cette identité ?') ?? - // false; + final answer = await confirmPopup(context, + 'Êtes-vous certains de vouloir révoquer définitivement cette identité ?') ?? + false; - // if (_answer) { - // MyWalletsProvider _myWalletProvider = - // Provider.of(context, listen: false); - // SubstrateSdk _sub = Provider.of(context, listen: false); + if (answer) { + MyWalletsProvider myWalletProvider = + Provider.of(context, listen: false); + SubstrateSdk sub = Provider.of(context, listen: false); - // MyWalletsProvider _mw = MyWalletsProvider(); - // final _wallet = _mw.getWalletDataByAddress(address); - // await _sub.setCurrentWallet(_wallet!); + MyWalletsProvider mw = MyWalletsProvider(); + final wallet = mw.getWalletDataByAddress(address); + await sub.setCurrentWallet(wallet!); - // WalletData? defaultWallet = _myWalletProvider.getDefaultWallet(); - // String? _pin; - // if (_myWalletProvider.pinCode == '') { - // _pin = await Navigator.push( - // context, - // MaterialPageRoute( - // builder: (homeContext) { - // return UnlockingWallet(wallet: defaultWallet); - // }, - // ), - // ); - // } - // if (_pin != null || _myWalletProvider.pinCode != '') { - // _sub.revokeIdentity(address, _myWalletProvider.pinCode); - // } - // Navigator.pop(context); + WalletData? defaultWallet = myWalletProvider.getDefaultWallet(); + String? pin; + if (myWalletProvider.pinCode == '') { + pin = await Navigator.push( + context, + MaterialPageRoute( + builder: (homeContext) { + return UnlockingWallet(wallet: defaultWallet); + }, + ), + ); + } + if (pin != null || myWalletProvider.pinCode != '') { + sub.revokeIdentity(address, myWalletProvider.pinCode); + } + Navigator.pop(context); - // Navigator.push( - // context, - // MaterialPageRoute(builder: (context) { - // return const TransactionInProgress(transType: 'revokeIdty'); - // }), - // ); - // } + Navigator.push( + context, + MaterialPageRoute(builder: (context) { + return const TransactionInProgress(transType: 'revokeIdty'); + }), + ); + } }, child: SizedBox( height: 60, From 8663186a4abc0a27bb7765e056f8b9fa119aaf01 Mon Sep 17 00:00:00 2001 From: poka Date: Tue, 6 Sep 2022 12:14:50 +0200 Subject: [PATCH 02/11] wip: prepare extrinsic revocation --- lib/providers/substrate_sdk.dart | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index f07df46..beb464d 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -842,19 +842,24 @@ newKeySig: $newKeySig"""); Future revokeIdentity(String address, String password) async { final idtyIndex = await _getIdentityIndexOf(address); - final sender = await _setSender(address); - TxInfoData txInfo; + final prefix = '?'.codeUnits; + final genesisHashString = await getGenesisHash(); + final genesisHash = HEX.decode(genesisHashString.substring(2)) as Uint8List; + final idtyIndexBytes = _int32bytes(idtyIndex); + final oldPubkey = await addressToPubkey(address); + final messageToSign = + Uint8List.fromList(prefix + genesisHash + idtyIndexBytes + oldPubkey); + final revocationSig = await _signMessage(messageToSign, address, password); - txInfo = TxInfoData( + final txInfo = TxInfoData( 'identity', 'revokeIdentity', sender, ); - final txOptions = [idtyIndex]; - + final txOptions = [idtyIndex, address, revocationSig]; return await _executeCall(txInfo, txOptions, password); } From 23b6858a60b1f47d7c4aad10489b6b56ba5e06fb Mon Sep 17 00:00:00 2001 From: poka Date: Thu, 8 Sep 2022 14:37:00 +0200 Subject: [PATCH 03/11] add test: identity revocation --- integration_test/identity_revocation.dart | 32 ++++++++++++++++++++ lib/providers/substrate_sdk.dart | 6 ++-- lib/screens/myWallets/manage_membership.dart | 11 ++++--- 3 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 integration_test/identity_revocation.dart diff --git a/integration_test/identity_revocation.dart b/integration_test/identity_revocation.dart new file mode 100644 index 0000000..a9fd912 --- /dev/null +++ b/integration_test/identity_revocation.dart @@ -0,0 +1,32 @@ +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:gecko/globals.dart'; +import 'package:gecko/models/widgets_keys.dart'; +import 'package:integration_test/integration_test.dart'; +import 'general_actions.dart'; +import 'tests_utility.dart'; + +void main() async { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + await dotenv.load(); + + testWidgets('Certifications state', (testerLoc) async { + tester = testerLoc; + // Connect local node and import test chest in background + await bkFastStart(); + + // Open chest + await firstOpenChest(); + + // Revoke test3 + await spawnBlock(number: 5); + await tapKey(keyOpenWallet(test3.address)); + await tapKey(keyManageMembership); + await tapKey(keyRevokeIdty); + await tapKey(keyConfirm); + spawnBlock(duration: 2000); + await waitFor('validé !', timeout: const Duration(seconds: 1)); + await tapKey(keyCloseTransactionScreen, duration: 0); + await waitFor('Membre validé !', reverse: true); + }, timeout: testTimeout()); +} diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index beb464d..643939a 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -844,13 +844,13 @@ newKeySig: $newKeySig"""); final idtyIndex = await _getIdentityIndexOf(address); final sender = await _setSender(address); - final prefix = '?'.codeUnits; + final prefix = 'revo'.codeUnits; final genesisHashString = await getGenesisHash(); final genesisHash = HEX.decode(genesisHashString.substring(2)) as Uint8List; final idtyIndexBytes = _int32bytes(idtyIndex); - final oldPubkey = await addressToPubkey(address); + // final pubkey = await addressToPubkey(address); final messageToSign = - Uint8List.fromList(prefix + genesisHash + idtyIndexBytes + oldPubkey); + Uint8List.fromList(prefix + idtyIndexBytes + genesisHash); final revocationSig = await _signMessage(messageToSign, address, password); final txInfo = TxInfoData( diff --git a/lib/screens/myWallets/manage_membership.dart b/lib/screens/myWallets/manage_membership.dart index a9a9b90..4718fae 100644 --- a/lib/screens/myWallets/manage_membership.dart +++ b/lib/screens/myWallets/manage_membership.dart @@ -86,9 +86,9 @@ class ManageMembership extends StatelessWidget { Provider.of(context, listen: false); SubstrateSdk sub = Provider.of(context, listen: false); - MyWalletsProvider mw = MyWalletsProvider(); - final wallet = mw.getWalletDataByAddress(address); - await sub.setCurrentWallet(wallet!); + // MyWalletsProvider mw = MyWalletsProvider(); + // final wallet = mw.getWalletDataByAddress(address); + // await sub.setCurrentWallet(wallet!); WalletData? defaultWallet = myWalletProvider.getDefaultWallet(); String? pin; @@ -110,7 +110,10 @@ class ManageMembership extends StatelessWidget { Navigator.push( context, MaterialPageRoute(builder: (context) { - return const TransactionInProgress(transType: 'revokeIdty'); + return TransactionInProgress( + transType: 'revokeIdty', + fromAddress: getShortPubkey(address), + toAddress: getShortPubkey(address)); }), ); } From e752de474d3f66d7c2648e730a57144b04f4c5d7 Mon Sep 17 00:00:00 2001 From: poka Date: Thu, 8 Sep 2022 20:14:45 +0200 Subject: [PATCH 04/11] fix some tx bad status --- lib/providers/substrate_sdk.dart | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 643939a..9a6f7e5 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -47,12 +47,14 @@ class SubstrateSdk with ChangeNotifier { Future _executeCall(TxInfoData txInfo, txOptions, String password, [String? rawParams]) async { try { - final hash = await sdk.api.tx - .signAndSend(txInfo, txOptions, password, rawParam: rawParams) - .timeout( - const Duration(seconds: 12), - onTimeout: () => {}, - ); + final hash = await sdk.api.tx.signAndSend(txInfo, txOptions, password, + rawParam: rawParams, onStatusChange: (p0) { + transactionStatus = p0; + notifyListeners(); + }).timeout( + const Duration(seconds: 12), + onTimeout: () => {}, + ); log.d(hash); if (hash.isEmpty) { transactionStatus = 'timeout'; From 3825bf0488238d120dc85b08bc11a14f4923a66a Mon Sep 17 00:00:00 2001 From: poka Date: Thu, 8 Sep 2022 20:15:19 +0200 Subject: [PATCH 05/11] fix revocation payload --- integration_test/identity_revocation.dart | 7 +++---- lib/providers/substrate_sdk.dart | 6 +++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/integration_test/identity_revocation.dart b/integration_test/identity_revocation.dart index a9fd912..d66a408 100644 --- a/integration_test/identity_revocation.dart +++ b/integration_test/identity_revocation.dart @@ -1,6 +1,5 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:gecko/globals.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:integration_test/integration_test.dart'; import 'general_actions.dart'; @@ -10,7 +9,7 @@ void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); await dotenv.load(); - testWidgets('Certifications state', (testerLoc) async { + testWidgets('Identity revocation', (testerLoc) async { tester = testerLoc; // Connect local node and import test chest in background await bkFastStart(); @@ -19,13 +18,13 @@ void main() async { await firstOpenChest(); // Revoke test3 - await spawnBlock(number: 5); + await spawnBlock(); await tapKey(keyOpenWallet(test3.address)); await tapKey(keyManageMembership); await tapKey(keyRevokeIdty); await tapKey(keyConfirm); spawnBlock(duration: 2000); - await waitFor('validé !', timeout: const Duration(seconds: 1)); + await waitFor('validé !', timeout: const Duration(seconds: 4)); await tapKey(keyCloseTransactionScreen, duration: 0); await waitFor('Membre validé !', reverse: true); }, timeout: testTimeout()); diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 9a6f7e5..9aa2006 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -851,8 +851,9 @@ newKeySig: $newKeySig"""); final genesisHash = HEX.decode(genesisHashString.substring(2)) as Uint8List; final idtyIndexBytes = _int32bytes(idtyIndex); // final pubkey = await addressToPubkey(address); + // final pubkeyHexa = '0x${HEX.encode(pubkey)}'; final messageToSign = - Uint8List.fromList(prefix + idtyIndexBytes + genesisHash); + Uint8List.fromList(prefix + genesisHash + idtyIndexBytes); final revocationSig = await _signMessage(messageToSign, address, password); final txInfo = TxInfoData( @@ -861,6 +862,9 @@ newKeySig: $newKeySig"""); sender, ); + log.d('''DEBUGG: messageToSign: $messageToSign +revocationSig: $revocationSig'''); + final txOptions = [idtyIndex, address, revocationSig]; return await _executeCall(txInfo, txOptions, password); } From e2ed9c5c98a14732259d72e1276423019bde205e Mon Sep 17 00:00:00 2001 From: poka Date: Thu, 8 Sep 2022 20:52:43 +0200 Subject: [PATCH 06/11] fix identity revocation call --- lib/providers/substrate_sdk.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 9aa2006..13e3b01 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -854,7 +854,9 @@ newKeySig: $newKeySig"""); // final pubkeyHexa = '0x${HEX.encode(pubkey)}'; final messageToSign = Uint8List.fromList(prefix + genesisHash + idtyIndexBytes); - final revocationSig = await _signMessage(messageToSign, address, password); + final revocationSig = + (await _signMessage(messageToSign, address, password)).substring(2); + final revocationSigTyped = '0x01$revocationSig'; final txInfo = TxInfoData( 'identity', @@ -863,9 +865,10 @@ newKeySig: $newKeySig"""); ); log.d('''DEBUGG: messageToSign: $messageToSign -revocationSig: $revocationSig'''); +revocationSig: $revocationSig +revocationSigTyped: $revocationSigTyped'''); - final txOptions = [idtyIndex, address, revocationSig]; + final txOptions = [idtyIndex, address, revocationSigTyped]; return await _executeCall(txInfo, txOptions, password); } From f7e3066352b0b0f881af4176e0676dd8cea355c8 Mon Sep 17 00:00:00 2001 From: poka Date: Fri, 9 Sep 2022 01:12:17 +0200 Subject: [PATCH 07/11] fix test revocation --- .../duniter/data/gecko_tests.json | 4 +- integration_test/identity_revocation.dart | 31 ------------ integration_test/launch_test.sh | 2 +- .../{ => scenarios}/cert_state.dart | 33 ++++++++----- .../{ => scenarios}/gecko_complete.dart | 13 ++--- .../scenarios/identity_revocation.dart | 47 +++++++++++++++++++ .../migrate_cesium_identity.dart | 4 +- .../{ => scenarios}/multi_chests.dart | 4 +- .../{ => scenarios}/ud_creation_state.dart | 4 +- .../{ => utility}/general_actions.dart | 0 .../{ => utility}/tests_utility.dart | 15 ++++-- lib/providers/chest_provider.dart | 2 +- lib/providers/home.dart | 2 +- lib/providers/my_wallets.dart | 2 +- lib/providers/search.dart | 2 +- lib/providers/substrate_sdk.dart | 16 +++++++ lib/providers/wallet_options.dart | 2 +- lib/screens/home.dart | 2 +- lib/screens/myWallets/choose_chest.dart | 2 +- lib/screens/myWallets/choose_wallet.dart | 4 +- lib/screens/myWallets/unlocking_wallet.dart | 2 +- lib/screens/myWallets/wallet_options.dart | 14 +++--- lib/screens/onBoarding/10.dart | 4 +- lib/screens/search.dart | 2 +- lib/screens/wallet_view.dart | 2 +- 25 files changed, 131 insertions(+), 84 deletions(-) delete mode 100644 integration_test/identity_revocation.dart rename integration_test/{ => scenarios}/cert_state.dart (69%) rename integration_test/{ => scenarios}/gecko_complete.dart (95%) create mode 100644 integration_test/scenarios/identity_revocation.dart rename integration_test/{ => scenarios}/migrate_cesium_identity.dart (96%) rename integration_test/{ => scenarios}/multi_chests.dart (84%) rename integration_test/{ => scenarios}/ud_creation_state.dart (91%) rename integration_test/{ => utility}/general_actions.dart (100%) rename integration_test/{ => utility}/tests_utility.dart (97%) diff --git a/integration_test/duniter/data/gecko_tests.json b/integration_test/duniter/data/gecko_tests.json index 804b3de..252b7f1 100755 --- a/integration_test/duniter/data/gecko_tests.json +++ b/integration_test/duniter/data/gecko_tests.json @@ -2,7 +2,7 @@ "first_ud": 10000, "first_ud_reeval": 50, "genesis_parameters": { - "genesis_certs_expire_on": 500, + "genesis_certs_expire_on": 10, "genesis_certs_min_received": 3, "genesis_memberships_expire_on": 1051200, "genesis_smith_certs_expire_on": 2102400, @@ -54,7 +54,7 @@ "smith_cert_validity_period": 1000, "smith_membership_period": 1000, "smith_pending_membership_period": 500, - "smiths_wot_first_cert_issuable_on": 20, + "smiths_wot_first_cert_issuable_on": 4, "smiths_wot_min_cert_for_membership": 3, "wot_first_cert_issuable_on": 0, "wot_min_cert_for_create_idty_right": 3, diff --git a/integration_test/identity_revocation.dart b/integration_test/identity_revocation.dart deleted file mode 100644 index d66a408..0000000 --- a/integration_test/identity_revocation.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:gecko/models/widgets_keys.dart'; -import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; - -void main() async { - IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - await dotenv.load(); - - testWidgets('Identity revocation', (testerLoc) async { - tester = testerLoc; - // Connect local node and import test chest in background - await bkFastStart(); - - // Open chest - await firstOpenChest(); - - // Revoke test3 - await spawnBlock(); - await tapKey(keyOpenWallet(test3.address)); - await tapKey(keyManageMembership); - await tapKey(keyRevokeIdty); - await tapKey(keyConfirm); - spawnBlock(duration: 2000); - await waitFor('validé !', timeout: const Duration(seconds: 4)); - await tapKey(keyCloseTransactionScreen, duration: 0); - await waitFor('Membre validé !', reverse: true); - }, timeout: testTimeout()); -} diff --git a/integration_test/launch_test.sh b/integration_test/launch_test.sh index 7f130c0..27be648 100755 --- a/integration_test/launch_test.sh +++ b/integration_test/launch_test.sh @@ -17,7 +17,7 @@ docker compose up -d cd ../.. # Start integration test -flutter test integration_test/$testName.dart && echo '0' > /tmp/geckoTestResult || echo '1' > /tmp/geckoTestResult +flutter test integration_test/scenarios/$testName.dart && echo '0' > /tmp/geckoTestResult || echo '1' > /tmp/geckoTestResult # Reset .env echo "ip_address=127.0.0.1" > .env diff --git a/integration_test/cert_state.dart b/integration_test/scenarios/cert_state.dart similarity index 69% rename from integration_test/cert_state.dart rename to integration_test/scenarios/cert_state.dart index f36dc5c..67ea322 100644 --- a/integration_test/cert_state.dart +++ b/integration_test/scenarios/cert_state.dart @@ -3,8 +3,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); @@ -17,6 +17,7 @@ void main() async { // Open chest await firstOpenChest(); + spawnBlock(until: 15); await goBack(); // Go wallet 5 view @@ -35,21 +36,27 @@ void main() async { await waitFor('25.0 $currencyName'); await spawnBlock(); await waitFor('22.0 $currencyName'); - await bkCertify(fromAddress: test1.address, destAddress: test5.address); - await waitFor('1', exactMatch: true); + await bkCertify( + fromAddress: test1.address, + destAddress: test5.address, + spawnBloc: false); await bkConfirmIdentity(fromAddress: test5.address, name: test5.name); - await bkCertify(fromAddress: test2.address, destAddress: test5.address); - await waitFor('2', exactMatch: true); + await waitFor('1', exactMatch: true); + await bkCertify( + fromAddress: test2.address, + destAddress: test5.address, + spawnBloc: false); + // await waitFor('2', exactMatch: true); await bkCertify(fromAddress: test3.address, destAddress: test5.address); await waitFor('3', exactMatch: true); await bkCertify(fromAddress: test4.address, destAddress: test5.address); await waitFor('4', exactMatch: true); - await bkPay( - fromAddress: test2.address, destAddress: test5.address, amount: 40); - await waitFor('61.99 $currencyName'); - await spawnBlock(until: 10); - await waitFor('161.99 $currencyName'); - await spawnBlock(until: 20); - await waitFor('261.99 $currencyName'); + // await bkPay( + // fromAddress: test2.address, destAddress: test5.address, amount: 40); + await waitFor('21.99 $currencyName'); + await spawnBlock(until: 30); + await waitFor('121.99 $currencyName'); + await spawnBlock(until: 40); + await waitFor('221.99 $currencyName'); }, timeout: testTimeout()); } diff --git a/integration_test/gecko_complete.dart b/integration_test/scenarios/gecko_complete.dart similarity index 95% rename from integration_test/gecko_complete.dart rename to integration_test/scenarios/gecko_complete.dart index bcf1c23..07e5961 100644 --- a/integration_test/gecko_complete.dart +++ b/integration_test/scenarios/gecko_complete.dart @@ -2,8 +2,8 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); @@ -34,6 +34,7 @@ void main() async { } Future payTest2() async { + spawnBlock(until: 13); await waitFor('Rechercher'); await tapKey(keyOpenSearch); final addressToSearch = await clipPaste(); @@ -127,13 +128,13 @@ Future certifyTest5() async { await waitFor('Membre validé !'); // spawn 20 blocs and check if ud is creating - await spawnBlock(until: 10); - await waitFor('109.13'); await spawnBlock(until: 20); + await waitFor('109.13'); + await spawnBlock(until: 30); await waitFor('209.13'); // Check UD reval - await spawnBlock(until: 50); - await waitFor('509.36'); + await spawnBlock(until: 60); + await waitFor('509.57'); humanRead(5); } diff --git a/integration_test/scenarios/identity_revocation.dart b/integration_test/scenarios/identity_revocation.dart new file mode 100644 index 0000000..7925c06 --- /dev/null +++ b/integration_test/scenarios/identity_revocation.dart @@ -0,0 +1,47 @@ +import 'package:flutter_dotenv/flutter_dotenv.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:gecko/models/widgets_keys.dart'; +import 'package:integration_test/integration_test.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; + +void main() async { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + await dotenv.load(); + + testWidgets('Identity revocation', (testerLoc) async { + tester = testerLoc; + // Connect local node and import test chest in background + await bkFastStart(); + + // Open chest + await firstOpenChest(); + await spawnBlock(until: 13); + await sleep(); + + // Create test5 identity + await bkPay( + fromAddress: test1.address, destAddress: test5.address, amount: 30); + sub.reload(); + await bkCertify(fromAddress: test1.address, destAddress: test5.address); + sub.reload(); + await sleep(); + + // Certify test5 to become member + await tapKey(keyOpenWallet(test5.address)); + await bkConfirmIdentity(fromAddress: test5.address, name: test5.name); + await bkCertify(fromAddress: test2.address, destAddress: test5.address); + await bkCertify(fromAddress: test3.address, destAddress: test5.address); + await waitFor('Membre validé !', exactMatch: true); + + // Revoke test5 + await tapKey(keyManageMembership, duration: 1000); + await tapKey(keyRevokeIdty); + await tapKey(keyConfirm); + spawnBlock(duration: 2000); + await waitFor('validé !', timeout: const Duration(seconds: 4)); + await tapKey(keyCloseTransactionScreen, duration: 0); + await waitFor('Aucune identité', exactMatch: true); + await sleep(); + }, timeout: testTimeout()); +} diff --git a/integration_test/migrate_cesium_identity.dart b/integration_test/scenarios/migrate_cesium_identity.dart similarity index 96% rename from integration_test/migrate_cesium_identity.dart rename to integration_test/scenarios/migrate_cesium_identity.dart index e57720f..554c539 100644 --- a/integration_test/migrate_cesium_identity.dart +++ b/integration_test/scenarios/migrate_cesium_identity.dart @@ -4,8 +4,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); diff --git a/integration_test/multi_chests.dart b/integration_test/scenarios/multi_chests.dart similarity index 84% rename from integration_test/multi_chests.dart rename to integration_test/scenarios/multi_chests.dart index a81742e..ff0e77d 100644 --- a/integration_test/multi_chests.dart +++ b/integration_test/scenarios/multi_chests.dart @@ -1,8 +1,8 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); diff --git a/integration_test/ud_creation_state.dart b/integration_test/scenarios/ud_creation_state.dart similarity index 91% rename from integration_test/ud_creation_state.dart rename to integration_test/scenarios/ud_creation_state.dart index 88e9abd..9859feb 100644 --- a/integration_test/ud_creation_state.dart +++ b/integration_test/scenarios/ud_creation_state.dart @@ -3,8 +3,8 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:integration_test/integration_test.dart'; -import 'general_actions.dart'; -import 'tests_utility.dart'; +import '../utility/general_actions.dart'; +import '../utility/tests_utility.dart'; void main() async { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); diff --git a/integration_test/general_actions.dart b/integration_test/utility/general_actions.dart similarity index 100% rename from integration_test/general_actions.dart rename to integration_test/utility/general_actions.dart diff --git a/integration_test/tests_utility.dart b/integration_test/utility/tests_utility.dart similarity index 97% rename from integration_test/tests_utility.dart rename to integration_test/utility/tests_utility.dart index e8c60b7..5aecdae 100644 --- a/integration_test/tests_utility.dart +++ b/integration_test/utility/tests_utility.dart @@ -190,15 +190,21 @@ Future bkPay( destAddress: destAddress, amount: amount, password: 'AAAAA'); + await sleep(500); await spawnBlock(); await sleep(500); } // Certify in background Future bkCertify( - {required String fromAddress, required String destAddress}) async { + {required String fromAddress, + required String destAddress, + bool spawnBloc = true}) async { sub.certify(fromAddress, destAddress, 'AAAAA'); - await spawnBlock(); + if (spawnBloc) { + await sleep(500); + await spawnBlock(); + } await sleep(500); } @@ -206,6 +212,7 @@ Future bkCertify( Future bkConfirmIdentity( {required String fromAddress, required String name}) async { sub.confirmIdentity(fromAddress, name, 'AAAAA'); + await sleep(500); await spawnBlock(); await sleep(500); } @@ -237,7 +244,7 @@ Future bkRestoreChest([String mnemonic = testMnemonic]) async { name: 'test${number + 1}', derivation: (number + 1) * 2); } - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); } Future _addImportAccount( @@ -273,7 +280,7 @@ Future bkDeleteAllWallets() async { await configBox.delete('defaultWallet'); await sub.deleteAllAccounts(); myWalletProvider.pinCode = ''; - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); } } diff --git a/lib/providers/chest_provider.dart b/lib/providers/chest_provider.dart index ce788b9..729ab54 100644 --- a/lib/providers/chest_provider.dart +++ b/lib/providers/chest_provider.dart @@ -10,7 +10,7 @@ import 'package:gecko/providers/substrate_sdk.dart'; import 'package:provider/provider.dart'; class ChestProvider with ChangeNotifier { - void rebuildWidget() { + void reload() { notifyListeners(); } diff --git a/lib/providers/home.dart b/lib/providers/home.dart index fe5102f..9ff8cff 100644 --- a/lib/providers/home.dart +++ b/lib/providers/home.dart @@ -219,7 +219,7 @@ class HomeProvider with ChangeNotifier { ); } - void rebuildWidget() { + void reload() { notifyListeners(); } } diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index fd25eff..b38c122 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -219,7 +219,7 @@ class MyWalletsProvider with ChangeNotifier { if (actualLock == lockPin) pinCode = ''; } - void rebuildWidget() { + void reload() { notifyListeners(); } } diff --git a/lib/providers/search.dart b/lib/providers/search.dart index 5460e7a..a3f53ed 100644 --- a/lib/providers/search.dart +++ b/lib/providers/search.dart @@ -8,7 +8,7 @@ class SearchProvider with ChangeNotifier { final cacheDuring = 20 * 60 * 1000; //First number is minutes int cacheTime = 0; - void rebuildWidget() { + void reload() { notifyListeners(); } diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 13e3b01..b69f847 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -8,6 +8,8 @@ import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/home.dart'; import 'package:gecko/providers/my_wallets.dart'; +import 'package:gecko/providers/wallet_options.dart'; +import 'package:gecko/providers/wallets_profiles.dart'; import 'package:polkawallet_sdk/api/apiKeyring.dart'; import 'package:polkawallet_sdk/api/types/networkParams.dart'; import 'package:polkawallet_sdk/api/types/txInfoData.dart'; @@ -46,6 +48,10 @@ class SubstrateSdk with ChangeNotifier { Future _executeCall(TxInfoData txInfo, txOptions, String password, [String? rawParams]) async { + final walletOptions = + Provider.of(homeContext, listen: false); + final walletProfiles = + Provider.of(homeContext, listen: false); try { final hash = await sdk.api.tx.signAndSend(txInfo, txOptions, password, rawParam: rawParams, onStatusChange: (p0) { @@ -62,8 +68,11 @@ class SubstrateSdk with ChangeNotifier { return 'timeout'; } else { + // Success ! transactionStatus = hash.toString(); notifyListeners(); + walletOptions.reload(); + walletProfiles.reload(); return hash.toString(); } } catch (e) { @@ -272,6 +281,9 @@ class SubstrateSdk with ChangeNotifier { } Future idtyStatus(String address) async { + // WalletOptionsProvider walletOptions = + // Provider.of(homeContext, listen: false); + var idtyIndex = await _getIdentityIndexOf(address); if (idtyIndex == 0) { @@ -283,6 +295,10 @@ class SubstrateSdk with ChangeNotifier { if (idtyStatus != null) { final String status = idtyStatus['status']; + // if (address == walletOptions.address.text && status == 'Validated') { + // walletOptions.reloadBuild(); + // } + return (status); } else { return 'expired'; diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index 3438bec..817b370 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -427,7 +427,7 @@ class WalletOptionsProvider with ChangeNotifier { return canValidateNameBool; } - void reloadBuild() { + void reload() { notifyListeners(); } diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 221e19e..2803626 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -119,7 +119,7 @@ class HomeScreen extends StatelessWidget { await chestBox.clear(); await configBox.delete('defaultWallet'); await sub.deleteAllAccounts(); - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); } // var connectivityResult = diff --git a/lib/screens/myWallets/choose_chest.dart b/lib/screens/myWallets/choose_chest.dart index e91676d..1571362 100644 --- a/lib/screens/myWallets/choose_chest.dart +++ b/lib/screens/myWallets/choose_chest.dart @@ -119,7 +119,7 @@ class _ChooseChestState extends State { myWalletProvider.pinCode = ''; WalletData? defaultWallet = myWalletProvider.getDefaultWallet(); - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); await Navigator.push( context, diff --git a/lib/screens/myWallets/choose_wallet.dart b/lib/screens/myWallets/choose_wallet.dart index 50c4eab..bc489e6 100644 --- a/lib/screens/myWallets/choose_wallet.dart +++ b/lib/screens/myWallets/choose_wallet.dart @@ -125,7 +125,7 @@ class ChooseWalletScreen extends StatelessWidget { key: keySelectThisWallet(repository.address!), onTap: () { selectedWallet = repository; - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); }, child: ClipOvalShadow( shadow: const Shadow( @@ -202,7 +202,7 @@ class ChooseWalletScreen extends StatelessWidget { ), onTap: () async { selectedWallet = repository; - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); }, ) ]), diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index 04c23ab..bc8c006 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -244,7 +244,7 @@ class UnlockingWallet extends StatelessWidget { .shake); // Triggering error shake animation pinColor = Colors.red[600]; myWalletProvider.pinCode = myWalletProvider.mnemonic = ''; - walletOptions.reloadBuild(); + walletOptions.reload(); pinFocus.requestFocus(); } else { pinColor = Colors.green[400]; diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index bcbd873..087e523 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -54,7 +54,7 @@ class WalletOptions extends StatelessWidget { onWillPop: () { walletOptions.isEditing = false; walletOptions.isBalanceBlur = false; - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); Navigator.pop(context); return Future.value(true); }, @@ -69,7 +69,7 @@ class WalletOptions extends StatelessWidget { onPressed: () { walletOptions.isEditing = false; walletOptions.isBalanceBlur = false; - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); Navigator.pop(context); }), title: SizedBox( @@ -245,7 +245,7 @@ class WalletOptions extends StatelessWidget { wallet.imageCustomPath = newPath; walletBox.put(wallet.key, wallet); } - walletProvider.reloadBuild(); + walletProvider.reload(); }, child: wallet.imageCustomPath == null || wallet.imageCustomPath == '' ? Image.asset( @@ -273,7 +273,7 @@ class WalletOptions extends StatelessWidget { child: InkWell( onTap: () async { wallet.imageCustomPath = await (walletProvider.changeAvatar()); - walletProvider.reloadBuild(); + walletProvider.reload(); }, child: Image.asset( 'assets/walletOptions/camera.png', @@ -521,8 +521,8 @@ class WalletOptions extends StatelessWidget { // defaultWallet = wallet; await sub.setCurrentWallet(wallet); myWalletProvider.readAllWallets(currentChest); - myWalletProvider.rebuildWidget(); - walletOptions.reloadBuild(); + myWalletProvider.reload(); + walletOptions.reload(); } Widget deleteWallet(BuildContext context, @@ -556,7 +556,7 @@ class WalletOptions extends StatelessWidget { WidgetsBinding.instance.addPostFrameCallback((_) { myWalletProvider.listWallets = myWalletProvider.readAllWallets(currentChest); - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); }); } : null, diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart index 4b7b144..6abbf79 100644 --- a/lib/screens/onBoarding/10.dart +++ b/lib/screens/onBoarding/10.dart @@ -224,7 +224,7 @@ class OnboardingStepTen extends StatelessWidget { await walletBox.add(myWallet); } myWalletProvider.readAllWallets(currentChest); - myWalletProvider.rebuildWidget(); + myWalletProvider.reload(); generateWalletProvider.generatedMnemonic = ''; myWalletProvider.resetPinCode(); @@ -239,7 +239,7 @@ class OnboardingStepTen extends StatelessWidget { .shake); // Triggering error shake animation hasError = true; pinColor = Colors.red[600]; - walletOptions.reloadBuild(); + walletOptions.reload(); } }, onChanged: (value) { diff --git a/lib/screens/search.dart b/lib/screens/search.dart index ece009b..e8f2fd3 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -57,7 +57,7 @@ class SearchScreen extends StatelessWidget { autofocus: true, maxLines: 1, textAlign: TextAlign.left, - onChanged: (v) => searchProvider.rebuildWidget(), + onChanged: (v) => searchProvider.reload(), decoration: InputDecoration( filled: true, fillColor: Colors.white, diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 172bade..e116a12 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -594,7 +594,7 @@ class WalletViewScreen extends StatelessWidget { FilteringTextInputFormatter.allow( RegExp(r'(^\d+\.?\d{0,2})')), ], - // onChanged: (v) => _searchProvider.rebuildWidget(), + // onChanged: (v) => _searchProvider.reload(), decoration: InputDecoration( hintText: '0.00', suffix: Text(currencyName), From fd281ad822fd2101e260c11676a9d049c4a93572 Mon Sep 17 00:00:00 2001 From: poka Date: Fri, 9 Sep 2022 01:39:11 +0200 Subject: [PATCH 08/11] add script to launch all tests --- integration_test/launch_all_tests.sh | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100755 integration_test/launch_all_tests.sh diff --git a/integration_test/launch_all_tests.sh b/integration_test/launch_all_tests.sh new file mode 100755 index 0000000..09355b9 --- /dev/null +++ b/integration_test/launch_all_tests.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +for test_file in $(ls integration_test/scenarios/); do + testName=$(echo $test_file | awk -F '.' '{print $1}') + ./integration_test/launch_test.sh $testName || break +done \ No newline at end of file From 147557f545ca72f3219461bc226989ba67481d6f Mon Sep 17 00:00:00 2001 From: poka Date: Fri, 9 Sep 2022 10:41:53 +0200 Subject: [PATCH 09/11] increase transaction timeout to 18s --- lib/providers/substrate_sdk.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index b69f847..f295975 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -58,7 +58,7 @@ class SubstrateSdk with ChangeNotifier { transactionStatus = p0; notifyListeners(); }).timeout( - const Duration(seconds: 12), + const Duration(seconds: 18), onTimeout: () => {}, ); log.d(hash); From 0d54030c1a9fedca3b174df94e2ae41b2ed8fd40 Mon Sep 17 00:00:00 2001 From: poka Date: Sat, 10 Sep 2022 06:26:49 +0200 Subject: [PATCH 10/11] can't revoke if smith member and explain why --- assets/translations/en.json | 4 ++- assets/translations/es.json | 4 ++- assets/translations/fr.json | 4 ++- lib/providers/substrate_sdk.dart | 13 +++++++ lib/screens/myWallets/manage_membership.dart | 38 ++++++++++++++++++-- 5 files changed, 58 insertions(+), 5 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index 1a5dae3..d9f6bdb 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -189,5 +189,7 @@ "identityMigration": "Identity migration", "areYouSureMigrateIdentity": "Are you sure you want to permanently migrate identity **{}** with balance of **{}** ?", "someoneCreatedYourIdentity": "Someone created your {} identity !", - "confirmMyIdentity": "Confirm my identity" + "confirmMyIdentity": "Confirm my identity", + "revokeMyIdentity": "Revoke my identity", + "youCannotRevokeThisIdentity": "You cannot revoke this identity while\nit is member of the blacksmiths web" } \ No newline at end of file diff --git a/assets/translations/es.json b/assets/translations/es.json index 8468eb2..64fa82e 100644 --- a/assets/translations/es.json +++ b/assets/translations/es.json @@ -189,5 +189,7 @@ "identityMigration": "Identity migration", "areYouSureMigrateIdentity": "Are you sure you want to permanently migrate identity **{}** with balance of **{}** ?", "someoneCreatedYourIdentity": "Someone created your {} identity !", - "confirmMyIdentity": "Confirm my identity" + "confirmMyIdentity": "Confirm my identity", + "revokeMyIdentity": "Revoke my identity", + "youCannotRevokeThisIdentity": "You cannot revoke this identity while\nit is member of the blacksmiths web" } \ No newline at end of file diff --git a/assets/translations/fr.json b/assets/translations/fr.json index bfe26e6..1861a8f 100644 --- a/assets/translations/fr.json +++ b/assets/translations/fr.json @@ -190,5 +190,7 @@ "identityMigration": "Migration de l'identité", "areYouSureMigrateIdentity": "Êtes-vous certain de vouloir migrer définitivement l'identité **{}** et son solde de **{}** ?", "someoneCreatedYourIdentity": "Quelqu'un a créé votre identité {} !", - "confirmMyIdentity": "Confirmer mon identité" + "confirmMyIdentity": "Confirmer mon identité", + "revokeMyIdentity": "Révoquer mon identité", + "youCannotRevokeThisIdentity": "Vous ne pouvez pas révoquer cette identité tant\nqu'elle fait partie de la toile forgerons" } \ No newline at end of file diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index f295975..03ff57f 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -242,6 +242,19 @@ class SubstrateSdk with ChangeNotifier { return await idtyStatus(address) == 'Validated'; } + Future isSmithGet(String address) async { + var idtyIndex = await _getIdentityIndexOf(address); + + final Map smithExpireOn = + (await _getStorage('smithsMembership.membership($idtyIndex)')) ?? {}; + + if (smithExpireOn.isEmpty) { + return false; + } else { + return true; + } + } + Future> certState(String from, String to) async { Map result = {}; final toStatus = await idtyStatus(to); diff --git a/lib/screens/myWallets/manage_membership.dart b/lib/screens/myWallets/manage_membership.dart index 4718fae..d7e5cbf 100644 --- a/lib/screens/myWallets/manage_membership.dart +++ b/lib/screens/myWallets/manage_membership.dart @@ -28,7 +28,7 @@ class ManageMembership extends StatelessWidget { @override Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); - // HomeProvider _homeProvider = Provider.of(context); + final sub = Provider.of(context); return Scaffold( backgroundColor: backgroundColor, @@ -43,7 +43,41 @@ class ManageMembership extends StatelessWidget { const SizedBox(height: 20), migrateIdentity(context), const SizedBox(height: 10), - revokeMyIdentity(context) + FutureBuilder( + future: sub.isSmithGet(address), + builder: (BuildContext context, AsyncSnapshot isSmith) { + if (isSmith.data ?? false) { + return SizedBox( + height: 70, + child: Row( + children: [ + const SizedBox(width: 20), + Image.asset( + 'assets/skull_Icon.png', + color: Colors.grey[500], + height: 30, + ), + const SizedBox(width: 16), + Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('revokeMyIdentity'.tr(), + style: TextStyle( + fontSize: 20, + color: Colors.grey[500])), + const SizedBox(height: 5), + Text("youCannotRevokeThisIdentity".tr(), + style: TextStyle( + fontSize: 14, + color: Colors.grey[500])), + ]), + ], + )); + } else { + return revokeMyIdentity(context); + } + }) // const SizedBox(height: 20), ]), )); From 83189990c66c8f76fa41c4026606e5a7da4256e5 Mon Sep 17 00:00:00 2001 From: poka Date: Sat, 10 Sep 2022 06:27:27 +0200 Subject: [PATCH 11/11] test: verify you cannot revoke a smith member --- integration_test/scenarios/identity_revocation.dart | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/integration_test/scenarios/identity_revocation.dart b/integration_test/scenarios/identity_revocation.dart index 7925c06..189a56c 100644 --- a/integration_test/scenarios/identity_revocation.dart +++ b/integration_test/scenarios/identity_revocation.dart @@ -43,5 +43,11 @@ void main() async { await tapKey(keyCloseTransactionScreen, duration: 0); await waitFor('Aucune identité', exactMatch: true); await sleep(); + + // Check test1 cannot be revoked + await goBack(); + await tapKey(keyOpenWallet(test1.address)); + await tapKey(keyManageMembership, duration: 1000); + await waitFor('Vous ne pouvez pas révoquer cette identité'); }, timeout: testTimeout()); }