diff --git a/android/app/build.gradle b/android/app/build.gradle index 48add20..5c4aba8 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,3 +1,9 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' + id "dev.flutter.flutter-gradle-plugin" +} + def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { @@ -6,11 +12,6 @@ if (localPropertiesFile.exists()) { } } -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new RuntimeException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' @@ -21,10 +22,6 @@ if (flutterVersionName == null) { flutterVersionName = '1.0' } -apply plugin: 'com.android.application' -apply plugin: 'kotlin-android' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { @@ -32,21 +29,30 @@ if (keystorePropertiesFile.exists()) { } android { - compileSdkVersion 33 + namespace "gecko.axiomteam.fr" + compileSdk flutter.compileSdkVersion + ndkVersion flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = '1.8' + } sourceSets { main.java.srcDirs += 'src/main/kotlin' } - lintOptions { - disable 'InvalidPackage' - } - defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "gecko.axiomteam.fr" - minSdkVersion 19 - targetSdkVersion 33 + // You can update the following values to match your application needs. + // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. + minSdkVersion flutter.minSdkVersion + targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName multiDexEnabled true @@ -65,7 +71,7 @@ android { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.release //poka: comment this to build unsigned release, or set to signingConfigs.debug to sign with debug keys + signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } @@ -76,11 +82,9 @@ android { } } + flutter { source '../..' } -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.work:work-runtime-ktx:2.7.0' -} +dependencies {} diff --git a/android/build.gradle b/android/build.gradle index e0e4f0a..bc157bd 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,20 +1,7 @@ -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:7.3.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - allprojects { repositories { google() - jcenter() + mavenCentral() } } diff --git a/android/settings.gradle b/android/settings.gradle index 44e62bc..1d6d19b 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,11 +1,26 @@ -include ':app' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() -def localPropertiesFile = new File(rootProject.projectDir, "local.properties") -def properties = new Properties() + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") -assert localPropertiesFile.exists() -localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} -def flutterSdkPath = properties.getProperty("flutter.sdk") -assert flutterSdkPath != null, "flutter.sdk not set in local.properties" -apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false + id "org.jetbrains.kotlin.android" version "1.7.10" apply false +} + +include ":app" diff --git a/integration_test/duniter/data/gecko_config.json b/integration_test/duniter/data/gecko_config.json index 769fdf7..0ae76b2 100644 --- a/integration_test/duniter/data/gecko_config.json +++ b/integration_test/duniter/data/gecko_config.json @@ -1,7 +1,15 @@ { "ud": 1000, - "first_ud": 6000, - "first_ud_reeval": 600000, + "first_ud": null, + "first_ud_reeval": null, + "genesis_parameters": { + "genesis_certs_expire_on": 1000, + "genesis_certs_min_received": 2, + "genesis_memberships_expire_on": 1000, + "genesis_smith_certs_expire_on": 1000, + "genesis_smith_certs_min_received": 2, + "genesis_smith_memberships_expire_on": 100000 + }, "parameters": { "babe_epoch_duration": 30, "cert_period": 15, @@ -11,6 +19,7 @@ "idty_confirm_period": 40, "idty_creation_period": 50, "membership_period": 1000, + "membership_renewal_period": 1000, "pending_membership_period": 500, "ud_creation_period": 10, "ud_reeval_period": 50, @@ -19,6 +28,7 @@ "smith_cert_min_received_cert_to_issue_cert": 2, "smith_cert_validity_period": 1000, "smith_membership_period": 1000, + "smith_inactivity_max_duration": 1000, "smith_pending_membership_period": 500, "smith_wot_first_cert_issuable_on": 4, "smith_wot_min_cert_for_membership": 3, @@ -30,7 +40,8 @@ { "name": "test1" }, { "name": "test2" }, { "name": "test3" }, - { "name": "test4" } + { "name": "test4" }, + { "name": "Alice" } ], "sudo_key": "5FeggKqw2AbnGZF9Y9WPM2QTgzENS3Hit94Ewgmzdg5a3LNa", "treasury_funder_address": "5FeggKqw2AbnGZF9Y9WPM2QTgzENS3Hit94Ewgmzdg5a3LNa", diff --git a/integration_test/duniter/data/gecko_data.json b/integration_test/duniter/data/gecko_data.json index 088753c..ad8841c 100644 --- a/integration_test/duniter/data/gecko_data.json +++ b/integration_test/duniter/data/gecko_data.json @@ -1,77 +1,126 @@ { - "initial_monetary_mass": 60100, + "initial_monetary_mass": 90100, + "current_block": { + "number": 0, + "medianTime": 1700000000 + }, "identities": { "test1": { - "index": 0, + "index": 7, "balance": 10000, - "membership_expire_on": 1705509948, - "next_cert_issuable_on": 1668347505, + "revoked": false, + "membership_expire_on": 2700000000, + "membership_revokes_on": 2700000001, + "next_cert_issuable_on": 0, "certs_received": { - "test2": 1727758466, - "test3": 1727758466, - "test4": 1727758466 + "test2": 2700000000, + "test3": 2700000000, + "test4": 2700000000 }, "owner_pubkey": "BgC76sdA6zxPSAMW6sZ1e3NEntLrkLT8DY3z2MEmJJgK" }, "test2": { "index": 1, "balance": 10000, - "membership_expire_on": 1705509948, - "next_cert_issuable_on": 1668347505, + "revoked": false, + "membership_expire_on": 2700000000, + "membership_revokes_on": 2700000001, + "next_cert_issuable_on": 0, "certs_received": { - "test1": 1727758466, - "test3": 1727758466, - "test4": 1727758466 + "test1": 2700000000, + "test3": 2700000000, + "test4": 2700000000 }, "owner_pubkey": "6xNFhRFHKyx9iZ3ucc3AFf5cjsWw5jH3p6EnFXw3D8T6" }, "test3": { "index": 2, "balance": 10000, - "membership_expire_on": 1705509948, - "next_cert_issuable_on": 1668347505, + "revoked": false, + "membership_expire_on": 2700000000, + "membership_revokes_on": 2700000001, + "next_cert_issuable_on": 0, "certs_received": { - "test1": 1727758466, - "test2": 1727758466, - "test4": 1727758466 + "test1": 2700000000, + "test2": 2700000000, + "test4": 2700000000 }, "owner_pubkey": "BpSSPEVE1yze9wrfjkU4wfnFa7WgKNysHxe3H9iT9fvx" }, "test4": { "index": 3, "balance": 10000, - "membership_expire_on": 1705509948, - "next_cert_issuable_on": 1668347505, + "revoked": false, + "membership_expire_on": 2700000000, + "membership_revokes_on": 2700000001, + "next_cert_issuable_on": 0, "certs_received": { - "test1": 1727758466, - "test2": 1727758466, - "test3": 1727758466 + "test1": 2700000000, + "test2": 2700000000, + "test3": 2700000000 }, "owner_pubkey": "5LqbvutJtRTHvnforyndwPbkC4Kf5cJtdRQaDcHoMi8S" }, "test5": { "index": 4, "balance": 10000, - "membership_expire_on": 1705509948, - "next_cert_issuable_on": 1668347505, + "revoked": false, + "membership_expire_on": 2700000000, + "membership_revokes_on": 2700000001, + "next_cert_issuable_on": 0, "certs_received": { - "test1": 1727758466, - "test2": 1727758466, - "test3": 1727758466 + "test1": 2700000000, + "test2": 2700000000, + "test3": 2700000000 }, "owner_pubkey": "6FgzG8NwatTWHo7rM7sPP6P4Q95R2ZQNqYiHCs38RT21" }, - "testCesium1": { + "test6": { "index": 5, "balance": 10000, - "membership_expire_on": 1705509948, - "next_cert_issuable_on": 1668347505, + "revoked": false, + "membership_expire_on": 2700000000, + "membership_revokes_on": 2700000001, + "next_cert_issuable_on": 0, "certs_received": { - "test1": 1727758466, - "test2": 1727758466, - "test3": 1727758466 + "test1": 2700000000 + }, + "owner_pubkey": "FZ8URw5rPqpWegWnufpcBDkg6tMpc2JmNZVCuPA9g3nq" + }, + "testCesium1": { + "index": 6, + "balance": 10000, + "revoked": false, + "membership_expire_on": 2700000000, + "membership_revokes_on": 2700000001, + "next_cert_issuable_on": 0, + "certs_received": { + "test1": 2700000000, + "test2": 2700000000, + "test3": 2700000000 }, "owner_pubkey": "DCovzCEnQm9GUWe6mr8u42JR1JAuoj3HbQUGdCkfTzSr" + }, + "Alice": { + "index": 8, + "balance": 10000, + "revoked": false, + "membership_expire_on": 2700000000, + "membership_revokes_on": 2700000001, + "certs_received": { + "test1": 2700000000, + "test2": 2700000000, + "test3": 2700000000, + "test4": 2700000000, + "test5": 2700000000, + "test6": 2700000000, + "testCesium1": 2700000000 + }, + "owner_address": "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "next_cert_issuable_on": 0 } + }, + "wallets": { + "BPKBoTrrLD1XWmpZdRsfDnDT1M6PBBvgzPxAKNdutVV2": 10000 } } diff --git a/lib/globals.dart b/lib/globals.dart index 3ca2db8..3cb7d5f 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -30,7 +30,7 @@ const cesiumPod = "https://g1.data.le-sou.org"; // String cesiumPod = "https://g1.data.e-is.pro"; const datapodEndpoint = 'gdev-datapod.p2p.legal'; -// const v2sDatapod = 'http://10.0.2.2:8080'; +// const datapodEndpoint = '10.0.2.2:8080'; // Contexts late BuildContext homeContext; diff --git a/lib/models/queries_datapod.dart b/lib/models/queries_datapod.dart index 8832f0c..d86ca57 100644 --- a/lib/models/queries_datapod.dart +++ b/lib/models/queries_datapod.dart @@ -1,6 +1,6 @@ const String updateProfileQ = r''' -mutation ($address: String!, $hash: String!, $signature: String!, $title: String, $description: String, $avatar: String, $geoloc: GeolocInput, $city: String, $socials: [SocialInput!]) { - updateProfile(address: $address, hash: $hash, signature: $signature, title: $title, description: $description, avatarBase64: $avatar, geoloc: $geoloc, city: $city, socials: $socials) { +mutation ($address: String!, $hash: String!, $signature: String!, $title: String, $description: String, $avatarBase64: String, $geoloc: GeolocInput, $city: String, $socials: [SocialInput!]) { + updateProfile(address: $address, hash: $hash, signature: $signature, title: $title, description: $description, avatarBase64: $avatarBase64, geoloc: $geoloc, city: $city, socials: $socials) { message success } @@ -25,6 +25,15 @@ mutation ($addressOld: String!, $addressNew: String!, $hash: String!, $signature } '''; +const String addTransactionCommentQ = r''' +mutation ($id: String!, $address: String!, $hash: String!, $signature: String!, $comment: String!) { + addTransaction(id: $id, address: $address, hash: $hash, signature: $signature, comment: $comment) { + message + success + } +} +'''; + const String getAvatarQ = r''' query ($address: String!) { profiles_by_pk(address: $address) { diff --git a/lib/providers/duniter_indexer.dart b/lib/providers/duniter_indexer.dart index 8fff32f..a6ac5d1 100644 --- a/lib/providers/duniter_indexer.dart +++ b/lib/providers/duniter_indexer.dart @@ -203,7 +203,7 @@ class DuniterIndexer with ChangeNotifier { 'name': name, }; final result = await _execQuery(isIdtyExistQ, variables); - return result.data!['identity']?.isNotEmpty ?? false; + return result.data?['identity']?.isNotEmpty ?? false; } Future getBlockStart() async { diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index 367f80f..98a9381 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'package:gecko/globals.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/substrate_sdk.dart'; +import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/widgets/commons/common_elements.dart'; import 'package:path_provider/path_provider.dart'; import 'package:provider/provider.dart'; @@ -76,6 +77,20 @@ class MyWalletsProvider with ChangeNotifier { return targetedWallet; } + Future askPinCode() async { + final defaultWallet = getDefaultWallet(); + + if (pinCode.isEmpty) { + await Navigator.push( + homeContext, + MaterialPageRoute( + builder: (homeContext) => UnlockingWallet(wallet: defaultWallet), + ), + ); + } + return pinCode.isNotEmpty; + } + WalletData? getWalletDataByAddress(String address) { WalletData? targetedWallet; diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 03e72fe..520c54e 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -183,12 +183,12 @@ class SubstrateSdk with ChangeNotifier { } Future signDatapod(String document, String address) async { - final myWallets = + final myWalletProvider = Provider.of(homeContext, listen: false); final messageToSign = Uint8List.fromList(document.codeUnits); final signatureString = - await _signMessage(messageToSign, address, myWallets.pinCode); + await _signMessage(messageToSign, address, myWalletProvider.pinCode); final signatureInt = HEX.decode(signatureString.substring(2)); final signature64 = base64Encode(signatureInt); @@ -209,26 +209,27 @@ class SubstrateSdk with ChangeNotifier { await _getStorage('identity.identityIndexOf.multi($jsonString)')); } - Future?> getCertsCounter(String address) async { + Future> getCertsCounter(String address) async { final idtyIndex = await _getIdentityIndexOf(address); if (idtyIndex == null) { - return null; + return []; } final certsReceiver = await _getStorage('cert.storageIdtyCertMeta($idtyIndex)') ?? []; - if (certsCounterCache[address] == null) { - certsCounterCache.putIfAbsent(address, () => []); - } try { certsCounterCache.update( address, (value) => [ certsReceiver['receivedCount'] as int, certsReceiver['issuedCount'] as int + ], + ifAbsent: () => [ + certsReceiver['receivedCount'] as int, + certsReceiver['issuedCount'] as int ]); } catch (e) { - // catching String to int error .. network error? + log.e(e); } return certsCounterCache[address]!; } @@ -1059,7 +1060,7 @@ class SubstrateSdk with ChangeNotifier { final toCerts = await getCertsCounter(destAddress); log.d( - "debug toCert: ${toCerts?[0]} --- ${currencyParameters['minCertForMembership']!} --- $toIdtyStatus"); + "debug toCert: ${toCerts[0]} --- ${currencyParameters['minCertForMembership']!} --- $toIdtyStatus"); if (toIdtyStatus == IdtyStatus.none) { txInfo = TxInfoData( @@ -1070,7 +1071,7 @@ class SubstrateSdk with ChangeNotifier { txOptions = [destAddress]; } else if (toIdtyStatus == IdtyStatus.validated || toIdtyStatus == IdtyStatus.confirmed) { - if (toCerts![0] >= currencyParameters['minCertForMembership']! - 1 && + if (toCerts[0] >= currencyParameters['minCertForMembership']! - 1 && toIdtyStatus != IdtyStatus.validated) { log.d('Batch cert and membership validation'); txInfo = TxInfoData( diff --git a/lib/providers/v2s_datapod.dart b/lib/providers/v2s_datapod.dart index 5b1d906..21a8443 100644 --- a/lib/providers/v2s_datapod.dart +++ b/lib/providers/v2s_datapod.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/queries_datapod.dart'; import 'package:gecko/models/scale_functions.dart'; +import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:provider/provider.dart'; @@ -13,6 +14,24 @@ import 'package:uuid/uuid.dart'; class V2sDatapodProvider with ChangeNotifier { late GraphQLClient datapodClient; + Future> _setSignedVariables( + String address, Map messageToSign) async { + final myWalletProvider = + Provider.of(homeContext, listen: false); + + final sub = Provider.of(homeContext, listen: false); + final hashDocBytes = utf8.encode(jsonEncode(messageToSign)); + final hashDoc = sha256.convert(hashDocBytes).toString().toUpperCase(); + if (!await myWalletProvider.askPinCode()) return {}; + final signature = await sub.signDatapod(hashDoc, address); + + return { + ...messageToSign, + 'hash': hashDoc, + 'signature': signature + }; + } + Future _execQuery( String query, Map variables) async { final QueryOptions options = @@ -29,9 +48,7 @@ class V2sDatapodProvider with ChangeNotifier { String? city, List>? socials, Map? geoloc}) async { - final sub = Provider.of(homeContext, listen: false); - - final messageToSign = jsonEncode({ + final messageToSign = { 'address': address, 'description': description, 'avatarBase64': avatar, @@ -39,22 +56,10 @@ class V2sDatapodProvider with ChangeNotifier { 'title': title, 'city': city, 'socials': socials - }); - final hashDocBytes = utf8.encode(messageToSign); - final hashDoc = sha256.convert(hashDocBytes).toString().toUpperCase(); - final signature = await sub.signDatapod(hashDoc, address); - - final variables = { - 'address': address, - 'hash': hashDoc, - 'signature': signature, - 'title': title, - 'description': description, - 'avatar': avatar, - 'city': city, - 'socials': socials, - 'geoloc': geoloc, }; + final variables = await _setSignedVariables(address, messageToSign); + if (variables.isEmpty) return false; + final result = await _execQuery(updateProfileQ, variables); if (result.hasException) { log.e(result.exception.toString()); @@ -65,18 +70,10 @@ class V2sDatapodProvider with ChangeNotifier { } Future deleteProfile({required String address}) async { - final sub = Provider.of(homeContext, listen: false); + final messageToSign = {'address': address}; + final variables = await _setSignedVariables(address, messageToSign); + if (variables.isEmpty) return false; - final messageToSign = jsonEncode({'address': address}); - final hashDocBytes = utf8.encode(messageToSign); - final hashDoc = sha256.convert(hashDocBytes).toString().toUpperCase(); - final signature = await sub.signDatapod(hashDoc, address); - - final variables = { - 'address': address, - 'hash': hashDoc, - 'signature': signature - }; final result = await _execQuery(deleteProfileQ, variables); if (result.hasException) { log.e(result.exception.toString()); @@ -88,20 +85,10 @@ class V2sDatapodProvider with ChangeNotifier { Future migrateProfile( {required String addressOld, required String addressNew}) async { - final sub = Provider.of(homeContext, listen: false); + final messageToSign = {'addressOld': addressOld, 'addressNew': addressNew}; + final variables = await _setSignedVariables(addressOld, messageToSign); + if (variables.isEmpty) return false; - final messageToSign = - jsonEncode({'addressOld': addressOld, 'addressNew': addressNew}); - final hashDocBytes = utf8.encode(messageToSign); - final hashDoc = sha256.convert(hashDocBytes).toString().toUpperCase(); - final signature = await sub.signDatapod(hashDoc, addressOld); - - final variables = { - 'addressOld': addressOld, - 'addressNew': addressNew, - 'hash': hashDoc, - 'signature': signature - }; final result = await _execQuery(migrateProfileQ, variables); if (result.hasException) { log.e(result.exception.toString()); @@ -111,6 +98,28 @@ class V2sDatapodProvider with ChangeNotifier { return true; } + Future addTransactionComment({ + required String id, + required String issuer, + required String comment, + }) async { + final messageToSign = { + 'id': id, + 'address': issuer, + 'comment': comment, + }; + final variables = await _setSignedVariables(issuer, messageToSign); + if (variables.isEmpty) return false; + + final result = await _execQuery(addTransactionCommentQ, variables); + if (result.hasException) { + log.e(result.exception.toString()); + return false; + } + log.d(result.data!['addTransaction']['message']); + return true; + } + Future setAvatar(String address, String avatarPath) async { final avatarBytes = await File(avatarPath).readAsBytes(); final avatarString = base64Encode(avatarBytes); diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index de84886..adf8b11 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -13,7 +13,6 @@ import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/v2s_datapod.dart'; import 'package:gecko/widgets/commons/common_elements.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:image_picker/image_picker.dart'; import 'package:provider/provider.dart'; @@ -67,11 +66,14 @@ class WalletOptionsProvider with ChangeNotifier { password: myWalletProvider.pinCode); } - await walletBox.delete(wallet.key); + await walletBox.delete(wallet.address); if (wallet.imageCustomPath != null) { final avatarFile = File(wallet.imageCustomPath!); - await avatarFile.delete(); + if (await avatarFile.exists()) { + await avatarFile.delete(); + } } + datapod.deleteProfile(address: wallet.address); await sub.deleteAccounts([wallet.address]); @@ -221,21 +223,7 @@ class WalletOptionsProvider with ChangeNotifier { return; } - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet( - wallet: defaultWallet); - }, - ), - ); - } - if (myWalletProvider.pinCode == '') return; + if (!await myWalletProvider.askPinCode()) return; final wallet = myWalletProvider .getWalletDataByAddress(address.text); diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 318be44..9cbac10 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -82,8 +82,10 @@ class _HomeScreenState extends State { 'wss://$validIndexerEndpoint/v1/graphql', ); + const headerWebsocket = + datapodEndpoint == '10.0.2.2:8080' ? 'ws' : 'wss'; final wsLinkDatapod = WebSocketLink( - 'wss://$datapodEndpoint/v1/graphql', + '$headerWebsocket://$datapodEndpoint/v1/graphql', ); duniterIndexer.indexerClient = GraphQLClient( diff --git a/lib/screens/myWallets/change_pin.dart b/lib/screens/myWallets/change_pin.dart index 349f5a5..f44d243 100644 --- a/lib/screens/myWallets/change_pin.dart +++ b/lib/screens/myWallets/change_pin.dart @@ -4,10 +4,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:durt/durt.dart'; import 'package:gecko/globals.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/widgets/commons/top_appbar.dart'; import 'package:provider/provider.dart'; @@ -92,20 +90,9 @@ class _ChangePinScreenState extends State { backgroundColor: Colors.green[400], ), onPressed: () async { - WalletData defaultWallet = - myWalletProvider.getDefaultWallet(); + final defaultWallet = myWalletProvider.getDefaultWallet(); - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - if (myWalletProvider.pinCode == '') return; + if (!await myWalletProvider.askPinCode()) return; await sub.changePassword(context, defaultWallet.address, widget.walletProvider.pinCode, newPin.text); diff --git a/lib/screens/myWallets/chest_options.dart b/lib/screens/myWallets/chest_options.dart index 4a8f581..7305553 100644 --- a/lib/screens/myWallets/chest_options.dart +++ b/lib/screens/myWallets/chest_options.dart @@ -5,14 +5,12 @@ import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/chest_provider.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/screens/myWallets/custom_derivations.dart'; import 'package:gecko/screens/myWallets/show_seed.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/widgets/bottom_app_bar.dart'; import 'package:gecko/widgets/commons/offline_info.dart'; import 'package:gecko/widgets/commons/top_appbar.dart'; @@ -44,18 +42,8 @@ class ChestOptions extends StatelessWidget { onTap: () async { final myWalletProvider = Provider.of(context, listen: false); - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - final String? pin = await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); + if (!await myWalletProvider.askPinCode()) return; - if (pin == null) return; Navigator.push( context, MaterialPageRoute(builder: (context) { diff --git a/lib/screens/myWallets/choose_chest.dart b/lib/screens/myWallets/choose_chest.dart index 0285e12..264817b 100644 --- a/lib/screens/myWallets/choose_chest.dart +++ b/lib/screens/myWallets/choose_chest.dart @@ -5,10 +5,8 @@ import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/my_wallets.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:flutter/material.dart'; import 'package:gecko/screens/myWallets/restore_chest.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:carousel_slider/carousel_slider.dart'; import 'package:gecko/screens/onBoarding/5.dart'; import 'package:provider/provider.dart'; @@ -110,25 +108,13 @@ class _ChooseChestState extends State { onPressed: () async { await configBox.put('currentChest', currentChest); myWalletProvider.pinCode = ''; - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - myWalletProvider.reload(); + if (!await myWalletProvider.askPinCode()) return; - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); Navigator.popUntil( context, ModalRoute.withName('/'), ); - if (myWalletProvider.pinCode != '') { - Navigator.pushNamed(context, '/mywallets'); - } + Navigator.pushNamed(context, '/mywallets'); }, child: Text( 'openThisChest'.tr(), diff --git a/lib/screens/myWallets/custom_derivations.dart b/lib/screens/myWallets/custom_derivations.dart index a2e9ef9..a6ec14f 100644 --- a/lib/screens/myWallets/custom_derivations.dart +++ b/lib/screens/myWallets/custom_derivations.dart @@ -6,7 +6,6 @@ import 'package:flutter/material.dart'; import 'package:gecko/models/scale_functions.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/my_wallets.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/widgets/commons/top_appbar.dart'; import 'package:provider/provider.dart'; @@ -109,20 +108,7 @@ class _CustomDerivationState extends State { backgroundColor: orangeC, ), onPressed: () async { - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - - if (myWalletProvider.pinCode != '') return; + if (!await myWalletProvider.askPinCode()) return; String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}'; if (dropdownValue == 'root') { diff --git a/lib/screens/myWallets/manage_membership.dart b/lib/screens/myWallets/manage_membership.dart index 03f3c36..33e85c1 100644 --- a/lib/screens/myWallets/manage_membership.dart +++ b/lib/screens/myWallets/manage_membership.dart @@ -4,13 +4,11 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/scale_functions.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/widgets/commons/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:gecko/widgets/commons/top_appbar.dart'; import 'package:provider/provider.dart'; @@ -113,20 +111,7 @@ class ManageMembership extends StatelessWidget { Provider.of(context, listen: false); final sub = Provider.of(context, listen: false); - 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 == '') return; + if (!await myWalletProvider.askPinCode()) return; final transactionId = await sub.revokeIdentity(address, myWalletProvider.pinCode); diff --git a/lib/screens/myWallets/migrate_identity.dart b/lib/screens/myWallets/migrate_identity.dart index dc44cc3..8e77832 100644 --- a/lib/screens/myWallets/migrate_identity.dart +++ b/lib/screens/myWallets/migrate_identity.dart @@ -6,7 +6,6 @@ import 'package:gecko/globals.dart'; import 'package:flutter/material.dart'; import 'package:gecko/models/migrate_wallet_checks.dart'; import 'package:gecko/models/scale_functions.dart'; -import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/generate_wallets.dart'; @@ -14,7 +13,6 @@ import 'package:gecko/providers/my_wallets.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/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:gecko/widgets/commons/top_appbar.dart'; import 'package:polkawallet_sdk/api/apiKeyring.dart'; @@ -189,21 +187,7 @@ class MigrateIdentityScreen extends StatelessWidget { ), onPressed: statusData.canValidate && mnemonicIsValid ? () async { - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - - String? pin; - if (myWalletProvider.pinCode == '') { - pin = await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - if (myWalletProvider.pinCode == '') return; + if (!await myWalletProvider.askPinCode()) return; await sub.importAccount( mnemonic: newMnemonicSentence.text, @@ -215,7 +199,7 @@ class MigrateIdentityScreen extends StatelessWidget { final transactionId = await sub.migrateIdentity( fromAddress: fromAddress, destAddress: newWalletAddress.text, - fromPassword: pin ?? myWalletProvider.pinCode, + fromPassword: myWalletProvider.pinCode, destPassword: 'password', withBalance: true, fromBalance: statusData.balance); diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 08ac398..368b741 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -327,6 +327,9 @@ class WalletOptions extends StatelessWidget { initialData: const [IdtyStatus.unknown], builder: (BuildContext context, AsyncSnapshot> snapshot) { + if (!snapshot.hasData || snapshot.hasError) { + return const SizedBox.shrink(); + } if (snapshot.data!.first == IdtyStatus.created) { return Column(children: [ ScaledSizedBox( @@ -526,7 +529,8 @@ class WalletOptions extends StatelessWidget { future: sub.hasAccountConsumers(wallet.address), builder: (BuildContext context, AsyncSnapshot hasConsumers) { if (hasConsumers.connectionState != ConnectionState.done || - hasConsumers.hasError) { + hasConsumers.hasError || + !hasConsumers.hasData) { return const Text(''); } final double balance = diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index bb1bc04..ae50697 100644 --- a/lib/screens/onBoarding/5.dart +++ b/lib/screens/onBoarding/5.dart @@ -18,8 +18,6 @@ import 'package:gecko/widgets/commons/offline_info.dart'; import 'package:gecko/widgets/commons/top_appbar.dart'; import 'package:provider/provider.dart'; -AsyncSnapshot? mnemoList; - class OnboardingStepFive extends StatefulWidget { const OnboardingStepFive({Key? key, this.skipIntro = false}) : super(key: key); @@ -155,35 +153,35 @@ Widget sentanceArray(BuildContext context) { padding: EdgeInsets.all(scaleSize(11)), child: FutureBuilder( future: generateWalletProvider.generateWordList(context), - builder: (BuildContext context, AsyncSnapshot data) { - if (!data.hasData) { + builder: (BuildContext context, AsyncSnapshot mnemoListData) { + if (!mnemoListData.hasData) { return const Text(''); } else { - mnemoList = data; + final mnemoList = mnemoListData.data!; return Column( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, children: [ Row(children: [ - arrayCell(data.data![0]), - arrayCell(data.data![1]), - arrayCell(data.data![2]), - arrayCell(data.data![3]), + arrayCell(mnemoList[0]), + arrayCell(mnemoList[1]), + arrayCell(mnemoList[2]), + arrayCell(mnemoList[3]), ]), ScaledSizedBox(height: 12), Row(children: [ - arrayCell(data.data![4]), - arrayCell(data.data![5]), - arrayCell(data.data![6]), - arrayCell(data.data![7]), + arrayCell(mnemoList[4]), + arrayCell(mnemoList[5]), + arrayCell(mnemoList[6]), + arrayCell(mnemoList[7]), ]), ScaledSizedBox(height: 12), Row(children: [ - arrayCell(data.data![8]), - arrayCell(data.data![9]), - arrayCell(data.data![10]), - arrayCell(data.data![11]), + arrayCell(mnemoList[8]), + arrayCell(mnemoList[9]), + arrayCell(mnemoList[10]), + arrayCell(mnemoList[11]), ]), ]); } diff --git a/lib/screens/search.dart b/lib/screens/search.dart index 4c9e7ee..f2b92ac 100644 --- a/lib/screens/search.dart +++ b/lib/screens/search.dart @@ -34,7 +34,7 @@ class _SearchScreenState extends State { // Function to check clipboard and update if necessary Future checkAndUpdateClipboard() async { - var clipboardData = await Clipboard.getData(Clipboard.kTextPlain); + final clipboardData = await Clipboard.getData(Clipboard.kTextPlain); if (clipboardData?.text != null && clipboardData!.text != pastedAddress) { pastedAddress = clipboardData.text ?? ''; canPasteAddress = await isAddress(pastedAddress); diff --git a/lib/screens/transaction_in_progress.dart b/lib/screens/transaction_in_progress.dart index 4a4ce88..a059337 100644 --- a/lib/screens/transaction_in_progress.dart +++ b/lib/screens/transaction_in_progress.dart @@ -6,6 +6,7 @@ import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/wallets_profiles.dart'; +import 'package:gecko/widgets/commons/loading.dart'; import 'package:gecko/widgets/transaction_status.dart'; import 'package:gecko/widgets/transaction_status_icon.dart'; import 'package:provider/provider.dart'; @@ -36,7 +37,7 @@ class _TransactionInProgressState extends State { late String toUsernameFormat; late String amount; late bool isUdUnit; - late TransactionContent txContent; + TransactionContent? txContent; @override void initState() { @@ -59,33 +60,49 @@ class _TransactionInProgressState extends State { amount = walletProfiles.payAmount.text; isUdUnit = configBox.get('isUdUnit') ?? false; + waitForTransactionStatus(); super.initState(); } + void waitForTransactionStatus() async { + final sub = Provider.of(context, listen: false); + while (!sub.transactionStatus.containsKey(widget.transactionId)) { + await Future.delayed(const Duration(seconds: 2)); + } + + setState(() { + txContent = sub.transactionStatus[widget.transactionId]!; + }); + } + @override Widget build(BuildContext context) { final sub = Provider.of(context, listen: true); + if (txContent == null) { + return const Center(child: Loading()); + } + if (sub.transactionStatus.containsKey(widget.transactionId)) { txContent = sub.transactionStatus[widget.transactionId]!; } - if (txContent.status == TransactionStatus.success) { + if (txContent!.status == TransactionStatus.success) { resultText = 'extrinsicValidated' .tr(args: [actionMap[widget.transType] ?? 'strangeTransaction'.tr()]); - } else if (txContent.status == TransactionStatus.failed) { - resultText = errorTransactionMap[txContent.error] ?? txContent.error!; + } else if (txContent!.status == TransactionStatus.failed) { + resultText = errorTransactionMap[txContent!.error] ?? txContent!.error!; } else { - resultText = statusStatusMap[txContent.status] ?? - 'Unknown status: ${txContent.status}'; + resultText = statusStatusMap[txContent!.status] ?? + 'Unknown status: ${txContent!.status}'; } Widget buildTransactionStatus() { return Column( children: [ - TransactionStatusIcon(txContent.status), + TransactionStatusIcon(txContent!.status), ScaledSizedBox(height: 7), - if (txContent.status != TransactionStatus.none) + if (txContent!.status != TransactionStatus.none) Text( resultText, textAlign: TextAlign.center, diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 6c5d205..661e3ad 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -152,13 +152,14 @@ class WalletViewScreen extends StatelessWidget { future: sub.certState(defaultWallet.address, address), builder: (context, AsyncSnapshot> snapshot) { if (snapshot.data == null) return const SizedBox.shrink(); + final certStateData = snapshot.data!; String duration = ''; - if (snapshot.data!['certDelay'] != null || - snapshot.data!['certRenewable'] != null) { + if (certStateData['certDelay'] != null || + certStateData['certRenewable'] != null) { final Duration durationSeconds = Duration( - seconds: snapshot.data!['certDelay'] ?? - snapshot.data!['certRenewable']!); + seconds: certStateData['certDelay'] ?? + certStateData['certRenewable']!); final seconds = durationSeconds.inSeconds; final minutes = durationSeconds.inMinutes; @@ -186,12 +187,12 @@ class WalletViewScreen extends StatelessWidget { } } - final toStatus = snapshot.data!['toStatus']; + final toStatus = certStateData['toStatus']; return Visibility( visible: (snapshot.data != {}), child: Column(children: [ - if (snapshot.data!['canCert'] != null || + if (certStateData['canCert'] != null || duration == 'seconds'.tr(args: ['0'])) Column(children: [ ScaledSizedBox( @@ -273,10 +274,10 @@ class WalletViewScreen extends StatelessWidget { ]) else if (toStatus == 1) waitToCert('mustConfirmHisIdentity', duration) - else if (snapshot.data!['certRenewable'] != null && + else if (certStateData['certRenewable'] != null && duration != 'seconds'.tr(args: ['0'])) waitToCert('canRenewCertInX', duration) - else if (snapshot.data!['certDelay'] != null) + else if (certStateData['certDelay'] != null) waitToCert('mustWaitXBeforeCertify', duration) ]), ); diff --git a/lib/widgets/balance.dart b/lib/widgets/balance.dart index 4306d0d..c63c703 100644 --- a/lib/widgets/balance.dart +++ b/lib/widgets/balance.dart @@ -10,62 +10,57 @@ class Balance extends StatelessWidget { {Key? key, required this.address, required this.size, - this.color = Colors.black, - this.loadingColor = const Color(0xffd07316)}) + this.color = Colors.black}) : super(key: key); final String address; final double size; final Color color; - final Color loadingColor; @override Widget build(BuildContext context) { final walletOptions = Provider.of(context, listen: false); return Consumer(builder: (context, sdk, _) { - return FutureBuilder( - future: sdk.getBalance(address), - builder: (BuildContext context, - AsyncSnapshot> globalBalance) { - if (globalBalance.connectionState != ConnectionState.done || - globalBalance.hasError) { - if (walletOptions.balanceCache[address] != null && - walletOptions.balanceCache[address] != -1) { + return ScaledSizedBox( + height: size * 1.4, + child: FutureBuilder( + future: sdk.getBalance(address), + builder: (BuildContext context, + AsyncSnapshot> globalBalance) { + if (globalBalance.connectionState != ConnectionState.done || + globalBalance.hasError || + !globalBalance.hasData) { + if (walletOptions.balanceCache[address] != null && + walletOptions.balanceCache[address] != -1) { + return Row(children: [ + Text(walletOptions.balanceCache[address]!.toString(), + style: scaledTextStyle(fontSize: size, color: color)), + ScaledSizedBox(width: 5), + UdUnitDisplay(size: scaleSize(size), color: color), + ]); + } else { + return const SizedBox.shrink(); + } + } + walletOptions.balanceCache[address] = + globalBalance.data!['transferableBalance']!; + if (walletOptions.balanceCache[address] != -1) { return Row(children: [ - Text(walletOptions.balanceCache[address]!.toString(), - style: scaledTextStyle(fontSize: size, color: color)), + Text( + walletOptions.balanceCache[address]!.toString(), + style: scaledTextStyle( + fontSize: size, + color: color, + ), + ), ScaledSizedBox(width: 5), UdUnitDisplay(size: scaleSize(size), color: color), ]); } else { - return ScaledSizedBox( - height: 15, - width: 15, - child: CircularProgressIndicator( - color: loadingColor, - strokeWidth: 2, - ), - ); + return const Text(''); } - } - walletOptions.balanceCache[address] = - globalBalance.data!['transferableBalance']!; - if (walletOptions.balanceCache[address] != -1) { - return Row(children: [ - Text( - walletOptions.balanceCache[address]!.toString(), - style: scaledTextStyle( - fontSize: size, - color: color, - ), - ), - ScaledSizedBox(width: 5), - UdUnitDisplay(size: scaleSize(size), color: color), - ]); - } else { - return const Text(''); - } - }); + }), + ); }); } } diff --git a/lib/widgets/bottom_app_bar.dart b/lib/widgets/bottom_app_bar.dart index 7f8af23..c7bc459 100644 --- a/lib/widgets/bottom_app_bar.dart +++ b/lib/widgets/bottom_app_bar.dart @@ -4,12 +4,10 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.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/search.dart'; import 'package:gecko/providers/wallets_profiles.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:provider/provider.dart'; class GeckoBottomAppBar extends StatelessWidget { @@ -93,20 +91,8 @@ class GeckoBottomAppBar extends StatelessWidget { onPressed: lockAction ? null : () async { - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } + if (!await myWalletProvider.askPinCode()) return; - if (myWalletProvider.pinCode == '') return; Navigator.popUntil(context, ModalRoute.withName('/')); //FIXME: Should not have to wait 300 milliseconds when /mywallets exist in navigator... sleep(const Duration(milliseconds: 300)); diff --git a/lib/widgets/buttons/add_new_derivation_button.dart b/lib/widgets/buttons/add_new_derivation_button.dart index b2c5f3e..7ddb374 100644 --- a/lib/widgets/buttons/add_new_derivation_button.dart +++ b/lib/widgets/buttons/add_new_derivation_button.dart @@ -4,10 +4,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/scale_functions.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/screens/myWallets/unlocking_wallet.dart'; import 'package:provider/provider.dart'; class AddNewDerivationButton extends StatelessWidget { @@ -31,19 +29,8 @@ class AddNewDerivationButton extends StatelessWidget { key: keyAddDerivation, onTap: () async { if (!myWalletProvider.isNewDerivationLoading) { - WalletData? defaultWallet = - myWalletProvider.getDefaultWallet(); - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - if (myWalletProvider.pinCode == '') return; + if (!await myWalletProvider.askPinCode()) return; + await myWalletProvider.generateNewDerivation( context, newDerivationName); } diff --git a/lib/widgets/certifications.dart b/lib/widgets/certifications.dart index 18efd13..6075e05 100644 --- a/lib/widgets/certifications.dart +++ b/lib/widgets/certifications.dart @@ -16,31 +16,35 @@ class Certifications extends StatelessWidget { @override Widget build(BuildContext context) { + final sub = Provider.of(context); + return Column(children: [ - Consumer(builder: (context, sdk, _) { - return FutureBuilder( - future: sdk.getCertsCounter(address), - builder: (BuildContext context, AsyncSnapshot?> certs) { - return certs.data != null - ? Row( - children: [ - Image.asset('assets/medal.png', - color: color, height: scaleSize(18)), - ScaledSizedBox(width: 1), - Text(certs.data?[0].toString() ?? '0', - style: - scaledTextStyle(fontSize: size, color: color)), - ScaledSizedBox(width: 5), - Text( - "(${certs.data?[1].toString() ?? '0'})", - style: scaledTextStyle( - fontSize: size * 0.7, color: color), - ) - ], - ) - : const SizedBox(); - }); - }), + FutureBuilder( + future: sub.getCertsCounter(address), + builder: (BuildContext context, AsyncSnapshot?> certs) { + if ((certs.data != null && certs.data!.isEmpty) || + sub.certsCounterCache[address] == null) { + return const SizedBox.shrink(); + } + + final receivedCount = sub.certsCounterCache[address]![0]; + final sentCount = sub.certsCounterCache[address]![1]; + + return Row( + children: [ + Image.asset('assets/medal.png', + color: color, height: scaleSize(18)), + ScaledSizedBox(width: 1), + Text(receivedCount.toString(), + style: scaledTextStyle(fontSize: size, color: color)), + ScaledSizedBox(width: 5), + Text( + "($sentCount)", + style: scaledTextStyle(fontSize: size * 0.7, color: color), + ) + ], + ); + }), ]); } } diff --git a/lib/widgets/drag_tule_action.dart b/lib/widgets/drag_tule_action.dart index 9e09378..863f984 100644 --- a/lib/widgets/drag_tule_action.dart +++ b/lib/widgets/drag_tule_action.dart @@ -44,9 +44,9 @@ class DragTuleAction extends StatelessWidget { ), ), child: DragTarget( - onAccept: (senderAddress) async { + onAcceptWithDetails: (senderAddress) async { final walletData = - myWalletProvider.getWalletDataByAddress(senderAddress); + myWalletProvider.getWalletDataByAddress(senderAddress.data); await sub.setCurrentWallet(walletData!); sub.reload(); paymentPopup(context, wallet.address, @@ -58,7 +58,8 @@ class DragTuleAction extends StatelessWidget { myWalletProvider.reload(); } }, - onWillAccept: (senderAddress) => senderAddress != wallet.address, + onWillAcceptWithDetails: (senderAddress) => + senderAddress.data != wallet.address, builder: ( BuildContext context, List accepted, diff --git a/lib/widgets/history_query.dart b/lib/widgets/history_query.dart index 2b0812c..b300687 100644 --- a/lib/widgets/history_query.dart +++ b/lib/widgets/history_query.dart @@ -63,22 +63,45 @@ class HistoryQuery extends StatelessWidget { } final List transactions = result.data?["transaction"]; + // Get transaction in progress if exist + String? transactionId; + for (final entry in sub.transactionStatus.entries) { + if (entry.value.from == address) { + transactionId = entry.key; + break; + } + } + if (result.hasException) { log.e('Error Indexer: ${result.exception}'); return Column(children: [ - ScaledSizedBox(height: 50), - Text( - "noNetworkNoHistory".tr(), - textAlign: TextAlign.center, - style: scaledTextStyle(fontSize: 18), + Column( + children: [ + if (transactionId != null) + TransactionInProgressTule( + address: address, transactionId: transactionId), + ScaledSizedBox(height: 50), + Text( + "noNetworkNoHistory".tr(), + textAlign: TextAlign.center, + style: scaledTextStyle(fontSize: 18), + ), + ], ) ]); } else if (transactions.isEmpty) { return Column(children: [ - ScaledSizedBox(height: 50), - Text( - "noDataToDisplay".tr(), - style: scaledTextStyle(fontSize: 18), + Column( + children: [ + if (transactionId != null) + TransactionInProgressTule( + address: address, transactionId: transactionId), + ScaledSizedBox(height: 50), + Text( + "noDataToDisplay".tr(), + style: scaledTextStyle(fontSize: 18), + ), + ], ) ]); } @@ -96,15 +119,6 @@ class HistoryQuery extends StatelessWidget { offset: transactions.length, ); - // Get transaction in progress if exist - String? transactionId; - for (final entry in sub.transactionStatus.entries) { - if (entry.value.from == address) { - transactionId = entry.key; - break; - } - } - // Build history list return NotificationListener( child: Builder( diff --git a/lib/widgets/idty_status.dart b/lib/widgets/idty_status.dart index 00c02fe..9eca2ac 100644 --- a/lib/widgets/idty_status.dart +++ b/lib/widgets/idty_status.dart @@ -28,26 +28,25 @@ class IdentityStatus extends StatelessWidget { future: sub.idtyStatus([address]), initialData: [walletData.identityStatus], builder: (context, AsyncSnapshot> snapshot) { - if (snapshot.hasError || snapshot.data == null) { - log.e(snapshot.error); - return const Icon(Icons.close, color: Colors.red); + if (snapshot.data != null && !snapshot.hasError) { + final resStatus = snapshot.data!.first; + walletData.identityStatus = resStatus; + walletBox.put(address, walletData); } - final resStatus = snapshot.data!.first; - walletData.identityStatus = resStatus; - walletBox.put(address, walletData); + final resStatus = walletData.identityStatus; if (!isOwner) { if (resStatus == IdtyStatus.confirmed) { return NameByAddress( - wallet: WalletData(address: address), + wallet: walletData, size: 18, color: Colors.grey[700]!, fontWeight: FontWeight.w500, fontStyle: FontStyle.italic); } else if (resStatus == IdtyStatus.validated) { return NameByAddress( - wallet: WalletData(address: address), + wallet: walletData, size: 20, color: Colors.black, fontWeight: FontWeight.w600, diff --git a/lib/widgets/payment_popup.dart b/lib/widgets/payment_popup.dart index 268d8a9..2037b24 100644 --- a/lib/widgets/payment_popup.dart +++ b/lib/widgets/payment_popup.dart @@ -12,7 +12,6 @@ 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/activity.dart'; -import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:gecko/widgets/balance.dart'; import 'package:gecko/widgets/name_by_address.dart'; @@ -34,17 +33,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) { walletViewProvider.payAmount.text = ''; Future executeTransfert() async { - if (myWalletProvider.pinCode == '') { - await Navigator.push( - context, - MaterialPageRoute( - builder: (homeContext) { - return UnlockingWallet(wallet: defaultWallet); - }, - ), - ); - } - if (myWalletProvider.pinCode == '') return; + if (!await myWalletProvider.askPinCode()) return; + // Payment workflow ! final sub = Provider.of(context, listen: false); final acc = sub.getCurrentWallet(); diff --git a/lib/widgets/search_result_list.dart b/lib/widgets/search_result_list.dart index 0726605..2f82e8d 100644 --- a/lib/widgets/search_result_list.dart +++ b/lib/widgets/search_result_list.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:gecko/globals.dart'; import 'package:gecko/models/g1_wallets_list.dart'; import 'package:gecko/models/scale_functions.dart'; import 'package:gecko/models/wallet_data.dart'; @@ -10,6 +9,7 @@ import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/screens/wallet_view.dart'; import 'package:gecko/widgets/balance.dart'; +import 'package:gecko/widgets/commons/loading.dart'; import 'package:gecko/widgets/datapod_avatar.dart'; import 'package:gecko/widgets/name_by_address.dart'; import 'package:gecko/widgets/search_identity_query.dart'; @@ -47,11 +47,9 @@ class SearchResult extends StatelessWidget { } } return const Center( - heightFactor: 5, - child: CircularProgressIndicator( - strokeWidth: 3, - backgroundColor: yellowC, - color: orangeC, + child: Loading( + stroke: 3, + size: 30, ), ); }, diff --git a/lib/widgets/transaction_in_progress_tile.dart b/lib/widgets/transaction_in_progress_tile.dart index 4331f84..ae48724 100644 --- a/lib/widgets/transaction_in_progress_tile.dart +++ b/lib/widgets/transaction_in_progress_tile.dart @@ -40,6 +40,7 @@ class _TransactionInProgressTuleState extends State { txContent = sub.transactionStatus[widget.transactionId]!; subscription = stream.listen((result) { + if (result.data?['account_by_pk'] == null) return; if (result.hasException) { log.e(result.exception); isVisible = true; @@ -128,7 +129,7 @@ class _TransactionInProgressTuleState extends State { statusIcon, ScaledSizedBox(width: 10), ScaledSizedBox( - width: 160, + width: 170, child: Text( humanStatus, style: scaledTextStyle( diff --git a/lib/widgets/wallet_tile.dart b/lib/widgets/wallet_tile.dart index be56ef8..6338a02 100644 --- a/lib/widgets/wallet_tile.dart +++ b/lib/widgets/wallet_tile.dart @@ -151,7 +151,7 @@ class BalanceBuilder extends StatelessWidget { address: address, size: 14, color: isDefault ? Colors.white : Colors.black, - loadingColor: isDefault ? yellowC : orangeC), + ), ) ], )), diff --git a/lib/widgets/wallet_tile_membre.dart b/lib/widgets/wallet_tile_membre.dart index 463aab3..8cb6664 100644 --- a/lib/widgets/wallet_tile_membre.dart +++ b/lib/widgets/wallet_tile_membre.dart @@ -171,10 +171,10 @@ class BalanceBuilder extends StatelessWidget { Opacity( opacity: 0.7, child: Balance( - address: address, - size: 15, - color: isDefault ? Colors.white : Colors.black, - loadingColor: isDefault ? yellowC : orangeC), + address: address, + size: 15, + color: isDefault ? Colors.white : Colors.black, + ), ) ], )), diff --git a/pubspec.lock b/pubspec.lock index 1282d95..42b1dcf 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" url: "https://pub.dev" source: hosted - version: "61.0.0" + version: "67.0.0" accordion: dependency: "direct main" description: @@ -21,26 +21,10 @@ packages: dependency: transitive description: name: analyzer - sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562 + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" url: "https://pub.dev" source: hosted - version: "5.13.0" - analyzer_plugin: - dependency: transitive - description: - name: analyzer_plugin - sha256: c1d5f167683de03d5ab6c3b53fc9aeefc5d59476e7810ba7bbddff50c6f4392d - url: "https://pub.dev" - source: hosted - version: "0.11.2" - ansicolor: - dependency: transitive - description: - name: ansicolor - sha256: "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880" - url: "https://pub.dev" - source: hosted - version: "2.0.2" + version: "6.4.1" archive: dependency: transitive description: @@ -69,10 +53,10 @@ packages: dependency: transitive description: name: barcode - sha256: "2a8b2ee065f419c2aeda141436cc556d91ae772d220fd80679f4d431d6c2ab43" + sha256: "91b143666f7bb13636f716b6d4e412e372ab15ff7969799af8c9e30a382e9385" url: "https://pub.dev" source: hosted - version: "2.2.5" + version: "2.2.6" barcode_scan2: dependency: "direct main" description: @@ -101,10 +85,10 @@ packages: dependency: transitive description: name: bip32_ed25519 - sha256: "8c739df5d7a05ac2d08dd355062313d84f41244d05cf6cc953c9f0bca66b1fdf" + sha256: "292ef300ce24a140ce2814e593af6fc2fe20185ffded9a9bd99ce7c22abd7657" url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.5.0" bip39: dependency: transitive description: @@ -181,18 +165,18 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "67d591d602906ef9201caf93452495ad1812bea2074f04e25dbd7c133785821b" + sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21" url: "https://pub.dev" source: hosted - version: "2.4.7" + version: "2.4.8" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 + sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" url: "https://pub.dev" source: hosted - version: "7.2.11" + version: "7.3.0" built_collection: dependency: transitive description: @@ -205,10 +189,10 @@ packages: dependency: transitive description: name: built_value - sha256: c9aabae0718ec394e5bc3c7272e6bb0dc0b32201a08fe185ec1d8401d3e39309 + sha256: fedde275e0a6b798c3296963c5cd224e3e1b55d0e478d5b7e65e6b540f363a0e url: "https://pub.dev" source: hosted - version: "8.8.1" + version: "8.9.1" carousel_slider: dependency: "direct main" description: @@ -245,10 +229,10 @@ packages: dependency: transitive description: name: code_builder - sha256: feee43a5c05e7b3199bb375a86430b8ada1b04104f2923d0e03cc01ca87b6d84 + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 url: "https://pub.dev" source: hosted - version: "4.9.0" + version: "4.10.0" collection: dependency: transitive description: @@ -305,38 +289,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.3" - csslib: - dependency: transitive - description: - name: csslib - sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - dart_code_metrics: - dependency: "direct dev" - description: - name: dart_code_metrics - sha256: "3dede3f7abc077a4181ec7445448a289a9ce08e2981e6a4d49a3fb5099d47e1f" - url: "https://pub.dev" - source: hosted - version: "5.7.6" - dart_code_metrics_presets: - dependency: transitive - description: - name: dart_code_metrics_presets - sha256: b71eadf02a3787ebd5c887623f83f6fdc204d45c75a081bd636c4104b3fd8b73 - url: "https://pub.dev" - source: hosted - version: "1.8.0" dart_style: dependency: transitive description: name: dart_style - sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55" + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.3.6" dbus: dependency: transitive description: @@ -357,10 +317,10 @@ packages: dependency: "direct main" description: name: dio - sha256: "797e1e341c3dd2f69f2dad42564a6feff3bfb87187d05abb93b9609e6f1645c3" + sha256: "49af28382aefc53562459104f64d16b9dfd1e8ef68c862d5af436cc8356ce5a8" url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "5.4.1" dots_indicator: dependency: "direct main" description: @@ -373,18 +333,18 @@ packages: dependency: "direct main" description: name: durt - sha256: "97007458aa5ba95c78465af8489e1330d0f7d48c74e10699f6283ce4cf8a5410" + sha256: "29e4a1adaea1dfedff4d9237580b414ca5fe621a7a131b5fa129b9824365c938" url: "https://pub.dev" source: hosted - version: "0.1.7" + version: "0.1.8" easy_localization: dependency: "direct main" description: name: easy_localization - sha256: de63e3b422adfc97f256cbb3f8cf12739b6a4993d390f3cadb3f51837afaefe5 + sha256: c145aeb6584aedc7c862ab8c737c3277788f47488bfdf9bae0fe112bd0a4789c url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" easy_logger: dependency: transitive description: @@ -445,18 +405,18 @@ packages: dependency: transitive description: name: ffi - sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.0" file_selector_linux: dependency: transitive description: @@ -477,10 +437,10 @@ packages: dependency: transitive description: name: file_selector_platform_interface - sha256: "0aa47a725c346825a2bd396343ce63ac00bda6eff2fbc43eabe99737dede8262" + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.6.2" file_selector_windows: dependency: transitive description: @@ -548,10 +508,10 @@ packages: dependency: "direct main" description: name: flutter_markdown - sha256: "35108526a233cc0755664d445f8a6b4b61e6f8fe993b3658b80b4a26827fc196" + sha256: cb44f7831b23a6bdd0f501718b0d2e8045cbc625a15f668af37ddb80314821db url: "https://pub.dev" source: hosted - version: "0.6.18+2" + version: "0.6.21" flutter_plugin_android_lifecycle: dependency: transitive description: @@ -727,14 +687,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.1" - html: - dependency: transitive - description: - name: html - sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" - url: "https://pub.dev" - source: hosted - version: "0.15.4" http: dependency: transitive description: @@ -763,18 +715,18 @@ packages: dependency: "direct dev" description: name: icons_launcher - sha256: "3ed4560181f238e69ca5d55589d6946ef31e6a321c934251a26ce1d9e9867305" + sha256: "9b514ffed6ed69b232fd2bf34c44878c8526be71fc74129a658f35c04c9d4a9d" url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "2.1.7" image: dependency: transitive description: name: image - sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" + sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" url: "https://pub.dev" source: hosted - version: "4.1.3" + version: "4.1.7" image_cropper: dependency: "direct main" description: @@ -803,34 +755,34 @@ packages: dependency: "direct main" description: name: image_picker - sha256: fc712337719239b0b6e41316aa133350b078fa39b6cbd706b61f3fd421b03c77 + sha256: "26222b01a0c9a2c8fe02fc90b8208bd3325da5ed1f4a2acabf75939031ac0bdd" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.7" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: ecdc963d2aa67af5195e723a40580f802d4392e31457a12a562b3e2bd6a396fe + sha256: "39f2bfe497e495450c81abcd44b62f56c2a36a37a175da7d137b4454977b51b1" url: "https://pub.dev" source: hosted - version: "0.8.9+1" + version: "0.8.9+3" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "50bc9ae6a77eea3a8b11af5eb6c661eeb858fdd2f734c2a4fd17086922347ef7" + sha256: e2423c53a68b579a7c37a1eda967b8ae536c3d98518e5db95ca1fe5719a730a3 url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: eac0a62104fa12feed213596df0321f57ce5a572562f72a68c4ff81e9e4caacf + sha256: fadafce49e8569257a0cad56d24438a6fa1f0cbd7ee0af9b631f7492818a4ca3 url: "https://pub.dev" source: hosted - version: "0.8.9" + version: "0.8.9+1" image_picker_linux: dependency: transitive description: @@ -851,10 +803,10 @@ packages: dependency: transitive description: name: image_picker_platform_interface - sha256: ed9b00e63977c93b0d2d2b343685bed9c324534ba5abafbb3dfbd6a780b1b514 + sha256: "3d2c323daea9d60608f1caf30be32a938916f4975434b8352e6f73dae496da38" url: "https://pub.dev" source: hosted - version: "2.9.1" + version: "2.9.4" image_picker_windows: dependency: transitive description: @@ -916,6 +868,30 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.dev" + source: hosted + version: "2.0.1" lints: dependency: transitive description: @@ -928,10 +904,10 @@ packages: dependency: "direct main" description: name: logger - sha256: "6bbb9d6f7056729537a4309bda2e74e18e5d9f14302489cc1e93f33b3fe32cac" + sha256: b3ff55aeb08d9d8901b767650285872cb1bb8f508373b3e348d60268b0c7f770 url: "https://pub.dev" source: hosted - version: "2.0.2+1" + version: "2.1.0" logging: dependency: transitive description: @@ -944,50 +920,50 @@ packages: dependency: transitive description: name: markdown - sha256: acf35edccc0463a9d7384e437c015a3535772e09714cf60e07eeef3a15870dcd + sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 url: "https://pub.dev" source: hosted - version: "7.1.1" + version: "7.2.2" matcher: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" mobx: dependency: transitive description: name: mobx - sha256: "6b467f91bfc534922ea670db69a1972d28bd9754085892decb5bce19f2c8d0d5" + sha256: "74ee54012dc7c1b3276eaa960a600a7418ef5f9997565deb8fca1fd88fb36b78" url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.0+1" nested: dependency: transitive description: @@ -1040,10 +1016,10 @@ packages: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_parsing: dependency: transitive description: @@ -1056,10 +1032,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_android: dependency: transitive description: @@ -1072,10 +1048,10 @@ packages: dependency: transitive description: name: path_provider_foundation - sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" path_provider_linux: dependency: transitive description: @@ -1088,10 +1064,10 @@ packages: dependency: transitive description: name: path_provider_platform_interface - sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_windows: dependency: transitive description: @@ -1104,58 +1080,66 @@ packages: dependency: "direct main" description: name: pdf - sha256: "93cbb2c06de9bab91844550f19896b2373e7a5ce25173995e7e5ec5e1741429d" + sha256: "243f05342fc0bdf140eba5b069398985cdbdd3dbb1d776cf43d5ea29cc570ba6" url: "https://pub.dev" source: hosted - version: "3.10.7" + version: "3.10.8" + pdf_widget_wrapper: + dependency: transitive + description: + name: pdf_widget_wrapper + sha256: "9c3ca36e5000c9682d52bbdc486867ba7c5ee4403d1a5d6d03ed72157753377b" + url: "https://pub.dev" + source: hosted + version: "1.0.3" permission_handler: dependency: "direct main" description: name: permission_handler - sha256: "860c6b871c94c78e202dc69546d4d8fd84bd59faeb36f8fb9888668a53ff4f78" + sha256: "74e962b7fad7ff75959161bb2c0ad8fe7f2568ee82621c9c2660b751146bfe44" url: "https://pub.dev" source: hosted - version: "11.1.0" + version: "11.3.0" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: "2f1bec180ee2f5665c22faada971a8f024761f632e93ddc23310487df52dcfa6" + sha256: "1acac6bae58144b442f11e66621c062aead9c99841093c38f5bcdcc24c1c3474" url: "https://pub.dev" source: hosted - version: "12.0.1" + version: "12.0.5" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: "1a816084338ada8d574b1cb48390e6e8b19305d5120fe3a37c98825bacc78306" + sha256: bdafc6db74253abb63907f4e357302e6bb786ab41465e8635f362ee71fd8707b url: "https://pub.dev" source: hosted - version: "9.2.0" + version: "9.4.0" permission_handler_html: dependency: transitive description: name: permission_handler_html - sha256: "11b762a8c123dced6461933a88ea1edbbe036078c3f9f41b08886e678e7864df" + sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d" url: "https://pub.dev" source: hosted - version: "0.1.0+2" + version: "0.1.1" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: d87349312f7eaf6ce0adaf668daf700ac5b06af84338bd8b8574dfbd93ffe1a1 + sha256: "23dfba8447c076ab5be3dee9ceb66aad345c4a648f0cac292c77b1eb0e800b78" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.2.0" permission_handler_windows: dependency: transitive description: name: permission_handler_windows - sha256: "1e8640c1e39121128da6b816d236e714d2cf17fac5a105dd6acdd3403a628004" + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.2.1" petitparser: dependency: transitive description: @@ -1176,34 +1160,34 @@ packages: dependency: "direct main" description: name: pinenacl - sha256: e5fb0bce1717b7f136f35ee98b5c02b3e6383211f8a77ca882fa7812232a07b9 + sha256: "3a5503637587d635647c93ea9a8fecf48a420cc7deebe6f1fc85c2a5637ab327" url: "https://pub.dev" source: hosted - version: "0.3.4" + version: "0.5.1" platform: dependency: transitive description: name: platform - sha256: ae68c7bfcd7383af3629daafb32fb4e8681c7154428da4febcff06200585f102 + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.4" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8 + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.dev" source: hosted - version: "2.1.7" + version: "2.1.8" pointycastle: dependency: "direct main" description: name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" url: "https://pub.dev" source: hosted - version: "3.7.3" + version: "3.7.4" polkawallet_sdk: dependency: "direct main" description: @@ -1225,18 +1209,18 @@ packages: dependency: "direct main" description: name: printing - sha256: ad39a42a5f83125952457dfd94f395c8cf0eb1f7759583dadb769be5c7f99d24 + sha256: "1c99cab90ebcc1fff65831d264627d5b529359d563e53f33ab9b8117f2d280bc" url: "https://pub.dev" source: hosted - version: "5.11.1" + version: "5.12.0" process: dependency: transitive description: name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32" url: "https://pub.dev" source: hosted - version: "4.2.4" + version: "5.0.2" protobuf: dependency: transitive description: @@ -1249,10 +1233,10 @@ packages: dependency: "direct main" description: name: provider - sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.1.2" pub_semver: dependency: transitive description: @@ -1261,14 +1245,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - pub_updater: - dependency: transitive - description: - name: pub_updater - sha256: "05ae70703e06f7fdeb05f7f02dd680b8aad810e87c756a618f33e1794635115c" - url: "https://pub.dev" - source: hosted - version: "0.3.0" pubspec_parse: dependency: transitive description: @@ -1305,10 +1281,10 @@ packages: dependency: "direct main" description: name: responsive_framework - sha256: "23aa7be5d5136922df708f6ddccb5ec4e0eb8bc576c3f105f5093f31d6b68e50" + sha256: "52367ab0c3479b3a5342dec3b74a3d47c4cc1b45bb5d38f720c2e002ebccd4ee" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.4.0" rxdart: dependency: transitive description: @@ -1321,50 +1297,50 @@ packages: dependency: "direct main" description: name: screen_brightness - sha256: ed8da4a4511e79422fc1aa88138e920e4008cd312b72cdaa15ccb426c0faaedd + sha256: a1273cbc854c39c940c17ac400c040afd973166b8808f2efe2072763b23e4d30 url: "https://pub.dev" source: hosted - version: "0.2.2+1" + version: "1.0.0" screen_brightness_android: dependency: transitive description: name: screen_brightness_android - sha256: "3df10961e3a9e968a5e076fe27e7f4741fa8a1d3950bdeb48cf121ed529d0caf" + sha256: "69d903bb42071aa2ad8853bf24e206ff6c39894930278e6239751447aacb9fe4" url: "https://pub.dev" source: hosted - version: "0.1.0+2" + version: "1.0.0" screen_brightness_ios: dependency: transitive description: name: screen_brightness_ios - sha256: "99adc3ca5490b8294284aad5fcc87f061ad685050e03cf45d3d018fe398fd9a2" + sha256: "265790af69e26c4840e515b9b34e31505f95c0ca8866fac47b80db3552196214" url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "1.0.0" screen_brightness_macos: dependency: transitive description: name: screen_brightness_macos - sha256: "64b34e7e3f4900d7687c8e8fb514246845a73ecec05ab53483ed025bd4a899fd" + sha256: b83e7a8b7c0f1a3161b586620781517b585deb4082dfff3745a5b2779ea94996 url: "https://pub.dev" source: hosted - version: "0.1.0+1" + version: "1.0.0" screen_brightness_platform_interface: dependency: transitive description: name: screen_brightness_platform_interface - sha256: b211d07f0c96637a15fb06f6168617e18030d5d74ad03795dd8547a52717c171 + sha256: e160b78f37bc093a6a66bfa118bb9266c36bfa3163bf976f94e0e5aa79977ff9 url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "1.0.0" screen_brightness_windows: dependency: transitive description: name: screen_brightness_windows - sha256: "9261bf33d0fc2707d8cf16339ce25768100a65e70af0fcabaf032fc12408ba86" + sha256: "1f1f14436ec3d8fdda4dca60a8c6aa70f9ae1c04a55bd2cf40e3a4453a4bf78e" url: "https://pub.dev" source: hosted - version: "0.1.3" + version: "1.0.0" scroll_to_index: dependency: transitive description: @@ -1385,18 +1361,18 @@ packages: dependency: transitive description: name: sentry - sha256: "89e426587b0879e53c46a0aae0eb312696d9d2d803ba14b252a65cc24b1416a2" + sha256: a524a87d096799b775530176c8c082afe7aa1f10cc31ba078fecdd74e9afc923 url: "https://pub.dev" source: hosted - version: "7.14.0" + version: "7.17.0" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: fd089ee4e75a927be037c56815a0a54af5a519f52b803a5ffecb589bb36e2401 + sha256: e0f8367f8f7c74dba9f7521f71700bce6c6ee065cf342f065d4fce411b84fc7b url: "https://pub.dev" source: hosted - version: "7.14.0" + version: "7.17.0" shared_preferences: dependency: transitive description: @@ -1417,10 +1393,10 @@ packages: dependency: transitive description: name: shared_preferences_foundation - sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" + sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" url: "https://pub.dev" source: hosted - version: "2.3.4" + version: "2.3.5" shared_preferences_linux: dependency: transitive description: @@ -1433,10 +1409,10 @@ packages: dependency: transitive description: name: shared_preferences_platform_interface - sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" shared_preferences_web: dependency: transitive description: @@ -1606,26 +1582,26 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: e9aa5ea75c84cf46b3db4eea212523591211c3cf2e13099ee4ec147f54201c86 + sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.2.5" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.3.0" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: bba3373219b7abb6b5e0d071b0fe66dfbe005d07517a68e38d4fc3638f35c6d3 + sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" url: "https://pub.dev" source: hosted - version: "6.2.1" + version: "6.2.5" url_launcher_linux: dependency: transitive description: @@ -1646,18 +1622,18 @@ packages: dependency: transitive description: name: url_launcher_platform_interface - sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "7286aec002c8feecc338cc33269e96b73955ab227456e9fb2a91f7fab8a358e9" + sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" url_launcher_windows: dependency: transitive description: @@ -1678,26 +1654,26 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "0f0c746dd2d6254a0057218ff980fc7f5670fd0fcf5e4db38a490d31eed4ad43" + sha256: "4ac59808bbfca6da38c99f415ff2d3a5d7ca0a6b4809c71d9cf30fba5daf9752" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.10+1" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "0edf6d630d1bfd5589114138ed8fada3234deacc37966bec033d3047c29248b7" + sha256: f3247e7ab0ec77dc759263e68394990edc608fb2b480b80db8aa86ed09279e33 url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.10+1" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: d24333727332d9bd20990f1483af4e09abdb9b1fc7c3db940b56ab5c42790c26 + sha256: "18489bdd8850de3dd7ca8a34e0c446f719ec63e2bab2e7a8cc66a9028dd76c5a" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.10+1" vector_math: dependency: transitive description: @@ -1710,10 +1686,10 @@ packages: dependency: transitive description: name: vm_service - sha256: c538be99af830f478718b51630ec1b6bee5e74e52c8a802d328d9e71d35d2583 + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 url: "https://pub.dev" source: hosted - version: "11.10.0" + version: "13.0.0" wallet: dependency: transitive description: @@ -1734,10 +1710,10 @@ packages: dependency: transitive description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: "4188706108906f002b3a293509234588823c8c979dc83304e229ff400c996b05" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.4.2" web3dart: dependency: transitive description: @@ -1758,58 +1734,58 @@ packages: dependency: transitive description: name: webdriver - sha256: "3c923e918918feeb90c4c9fdf1fe39220fa4c0e8e2c0fffaded174498ef86c49" + sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.0.3" webview_flutter: dependency: transitive description: name: webview_flutter - sha256: "42393b4492e629aa3a88618530a4a00de8bb46e50e7b3993fedbfdc5352f0dbf" + sha256: "25e1b6e839e8cbfbd708abc6f85ed09d1727e24e08e08c6b8590d7c65c9a8932" url: "https://pub.dev" source: hosted - version: "4.4.2" + version: "4.7.0" webview_flutter_android: dependency: transitive description: name: webview_flutter_android - sha256: b54c89fe14a6d26a2a46e24880da0441cdd2bf1f6d01a5b3e1d39558feb1de0b + sha256: "3e5f4e9d818086b0d01a66fb1ff9cc72ab0cc58c71980e3d3661c5685ea0efb0" url: "https://pub.dev" source: hosted - version: "3.13.1" + version: "3.15.0" webview_flutter_platform_interface: dependency: transitive description: name: webview_flutter_platform_interface - sha256: dbe745ee459a16b6fec296f7565a8ef430d0d681001d8ae521898b9361854943 + sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d url: "https://pub.dev" source: hosted - version: "2.9.0" + version: "2.10.0" webview_flutter_wkwebview: dependency: transitive description: name: webview_flutter_wkwebview - sha256: eebfabfa8a115b535b52031b8b26f7a4b58ceceab378bc9db8762b0fb46f7b5d + sha256: "9bf168bccdf179ce90450b5f37e36fe263f591c9338828d6bf09b6f8d0f57f86" url: "https://pub.dev" source: hosted - version: "3.10.0" + version: "3.12.0" win32: dependency: transitive description: name: win32 - sha256: b0f37db61ba2f2e9b7a78a1caece0052564d1bc70668156cf3a29d676fe4e574 + sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "5.2.0" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" xml: dependency: transitive description: @@ -1827,5 +1803,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0 <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml index a699f82..77b6d32 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.1.4+68 +version: 0.1.5+72 environment: sdk: ">=2.12.0 <3.0.0" @@ -51,13 +51,13 @@ dependencies: hex: ^0.2.0 accordion: ^2.6.0 flutter_svg: ^2.0.9 - pinenacl: ^0.3.4 + pinenacl: ^0.5.1 fast_base58: ^0.2.1 tutorial_coach_mark: ^1.2.11 confetti: ^0.7.0 url_launcher: ^6.2.2 crypto: ^3.0.3 - screen_brightness: ^0.2.2+1 + screen_brightness: ^1.0.0 uuid: ^3.0.7 fade_and_translate: ^0.1.3 @@ -72,7 +72,6 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter - dart_code_metrics: ^5.7.6 icons_launcher: image_path: "assets/icon/gecko_flat.png"