Merge branch 'revocation-mechanisme' into 'master'

Revocation mechanisme

See merge request clients/gecko!29
This commit is contained in:
pokapow 2022-09-10 06:35:22 +02:00
commit 164fc16ed8
29 changed files with 276 additions and 138 deletions

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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"
}

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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());
}

View File

@ -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);
}

View File

@ -0,0 +1,53 @@
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();
// 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());
}

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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<WalletData> _addImportAccount(
@ -273,7 +280,7 @@ Future bkDeleteAllWallets() async {
await configBox.delete('defaultWallet');
await sub.deleteAllAccounts();
myWalletProvider.pinCode = '';
myWalletProvider.rebuildWidget();
myWalletProvider.reload();
}
}

View File

@ -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();
}

View File

@ -219,7 +219,7 @@ class HomeProvider with ChangeNotifier {
);
}
void rebuildWidget() {
void reload() {
notifyListeners();
}
}

View File

@ -219,7 +219,7 @@ class MyWalletsProvider with ChangeNotifier {
if (actualLock == lockPin) pinCode = '';
}
void rebuildWidget() {
void reload() {
notifyListeners();
}
}

View File

@ -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();
}

View File

@ -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,13 +48,19 @@ class SubstrateSdk with ChangeNotifier {
Future<String> _executeCall(TxInfoData txInfo, txOptions, String password,
[String? rawParams]) async {
final walletOptions =
Provider.of<WalletOptionsProvider>(homeContext, listen: false);
final walletProfiles =
Provider.of<WalletsProfilesProvider>(homeContext, listen: false);
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: 18),
onTimeout: () => {},
);
log.d(hash);
if (hash.isEmpty) {
transactionStatus = 'timeout';
@ -60,8 +68,11 @@ class SubstrateSdk with ChangeNotifier {
return 'timeout';
} else {
// Success !
transactionStatus = hash.toString();
notifyListeners();
walletOptions.reload();
walletProfiles.reload();
return hash.toString();
}
} catch (e) {
@ -231,6 +242,19 @@ class SubstrateSdk with ChangeNotifier {
return await idtyStatus(address) == 'Validated';
}
Future<bool> 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<Map<String, int>> certState(String from, String to) async {
Map<String, int> result = {};
final toStatus = await idtyStatus(to);
@ -270,6 +294,9 @@ class SubstrateSdk with ChangeNotifier {
}
Future<String> idtyStatus(String address) async {
// WalletOptionsProvider walletOptions =
// Provider.of<WalletOptionsProvider>(homeContext, listen: false);
var idtyIndex = await _getIdentityIndexOf(address);
if (idtyIndex == 0) {
@ -281,6 +308,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';
@ -662,13 +693,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 +788,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<String> 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 +810,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 = [];
@ -870,22 +873,31 @@ newKeySig: $newKeySig""");
Future revokeIdentity(String address, String password) async {
final idtyIndex = await _getIdentityIndexOf(address);
final sender = await _setSender(address);
final sender = TxSenderData(
keyring.current.address,
keyring.current.pubKey,
);
final prefix = 'revo'.codeUnits;
final genesisHashString = await getGenesisHash();
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 + genesisHash + idtyIndexBytes);
final revocationSig =
(await _signMessage(messageToSign, address, password)).substring(2);
final revocationSigTyped = '0x01$revocationSig';
TxInfoData txInfo;
txInfo = TxInfoData(
'membership',
'revokeMembership',
final txInfo = TxInfoData(
'identity',
'revokeIdentity',
sender,
);
final txOptions = [idtyIndex];
log.d('''DEBUGG: messageToSign: $messageToSign
revocationSig: $revocationSig
revocationSigTyped: $revocationSigTyped''');
final txOptions = [idtyIndex, address, revocationSigTyped];
return await _executeCall(txInfo, txOptions, password);
}

View File

@ -427,7 +427,7 @@ class WalletOptionsProvider with ChangeNotifier {
return canValidateNameBool;
}
void reloadBuild() {
void reload() {
notifyListeners();
}

View File

@ -119,7 +119,7 @@ class HomeScreen extends StatelessWidget {
await chestBox.clear();
await configBox.delete('defaultWallet');
await sub.deleteAllAccounts();
myWalletProvider.rebuildWidget();
myWalletProvider.reload();
}
// var connectivityResult =

View File

@ -119,7 +119,7 @@ class _ChooseChestState extends State<ChooseChest> {
myWalletProvider.pinCode = '';
WalletData? defaultWallet =
myWalletProvider.getDefaultWallet();
myWalletProvider.rebuildWidget();
myWalletProvider.reload();
await Navigator.push(
context,

View File

@ -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();
},
)
]),

View File

@ -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';
@ -19,7 +28,7 @@ class ManageMembership extends StatelessWidget {
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
// HomeProvider _homeProvider = Provider.of<HomeProvider>(context);
final sub = Provider.of<SubstrateSdk>(context);
return Scaffold(
backgroundColor: backgroundColor,
@ -34,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<bool> isSmith) {
if (isSmith.data ?? false) {
return SizedBox(
height: 70,
child: Row(
children: <Widget>[
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),
]),
));
@ -68,43 +111,46 @@ 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<MyWalletsProvider>(context, listen: false);
// SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
if (answer) {
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
SubstrateSdk sub = Provider.of<SubstrateSdk>(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 TransactionInProgress(
transType: 'revokeIdty',
fromAddress: getShortPubkey(address),
toAddress: getShortPubkey(address));
}),
);
}
},
child: SizedBox(
height: 60,

View File

@ -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];

View File

@ -54,7 +54,7 @@ class WalletOptions extends StatelessWidget {
onWillPop: () {
walletOptions.isEditing = false;
walletOptions.isBalanceBlur = false;
myWalletProvider.rebuildWidget();
myWalletProvider.reload();
Navigator.pop(context);
return Future<bool>.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,

View File

@ -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) {

View File

@ -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,

View File

@ -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),