Merge branch 'dev'

This commit is contained in:
poka 2024-03-09 10:27:35 +01:00
commit 694c682aba
38 changed files with 619 additions and 643 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<DateTime> getBlockStart() async {

View File

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

View File

@ -183,12 +183,12 @@ class SubstrateSdk with ChangeNotifier {
}
Future<String> signDatapod(String document, String address) async {
final myWallets =
final myWalletProvider =
Provider.of<MyWalletsProvider>(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<List<int>?> getCertsCounter(String address) async {
Future<List<int>> 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(

View File

@ -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<Map<String, dynamic>> _setSignedVariables(
String address, Map<String, dynamic> messageToSign) async {
final myWalletProvider =
Provider.of<MyWalletsProvider>(homeContext, listen: false);
final sub = Provider.of<SubstrateSdk>(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 <String, dynamic>{
...messageToSign,
'hash': hashDoc,
'signature': signature
};
}
Future<QueryResult> _execQuery(
String query, Map<String, dynamic> variables) async {
final QueryOptions options =
@ -29,9 +48,7 @@ class V2sDatapodProvider with ChangeNotifier {
String? city,
List<Map<String, String>>? socials,
Map<String, double>? geoloc}) async {
final sub = Provider.of<SubstrateSdk>(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 = <String, dynamic>{
'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<bool> deleteProfile({required String address}) async {
final sub = Provider.of<SubstrateSdk>(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 = <String, dynamic>{
'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<bool> migrateProfile(
{required String addressOld, required String addressNew}) async {
final sub = Provider.of<SubstrateSdk>(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 = <String, dynamic>{
'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<bool> 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<bool> setAvatar(String address, String avatarPath) async {
final avatarBytes = await File(avatarPath).readAsBytes();
final avatarString = base64Encode(avatarBytes);

View File

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

View File

@ -82,8 +82,10 @@ class _HomeScreenState extends State<HomeScreen> {
'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(

View File

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

View File

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

View File

@ -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<ChooseChest> {
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(),

View File

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

View File

@ -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<MyWalletsProvider>(context, listen: false);
final sub = Provider.of<SubstrateSdk>(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);

View File

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

View File

@ -327,6 +327,9 @@ class WalletOptions extends StatelessWidget {
initialData: const [IdtyStatus.unknown],
builder:
(BuildContext context, AsyncSnapshot<List<IdtyStatus>> 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<bool> hasConsumers) {
if (hasConsumers.connectionState != ConnectionState.done ||
hasConsumers.hasError) {
hasConsumers.hasError ||
!hasConsumers.hasData) {
return const Text('');
}
final double balance =

View File

@ -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<List>? 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<List> data) {
if (!data.hasData) {
builder: (BuildContext context, AsyncSnapshot<List> 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: <Widget>[
Row(children: <Widget>[
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: <Widget>[
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: <Widget>[
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]),
]),
]);
}

View File

@ -34,7 +34,7 @@ class _SearchScreenState extends State<SearchScreen> {
// Function to check clipboard and update if necessary
Future<void> 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);

View File

@ -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<TransactionInProgress> {
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<TransactionInProgress> {
amount = walletProfiles.payAmount.text;
isUdUnit = configBox.get('isUdUnit') ?? false;
waitForTransactionStatus();
super.initState();
}
void waitForTransactionStatus() async {
final sub = Provider.of<SubstrateSdk>(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<SubstrateSdk>(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,

View File

@ -152,13 +152,14 @@ class WalletViewScreen extends StatelessWidget {
future: sub.certState(defaultWallet.address, address),
builder: (context, AsyncSnapshot<Map<String, int>> 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: <Widget>[
if (snapshot.data!['canCert'] != null ||
if (certStateData['canCert'] != null ||
duration == 'seconds'.tr(args: ['0']))
Column(children: <Widget>[
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)
]),
);

View File

@ -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<WalletOptionsProvider>(context, listen: false);
return Consumer<SubstrateSdk>(builder: (context, sdk, _) {
return FutureBuilder(
future: sdk.getBalance(address),
builder: (BuildContext context,
AsyncSnapshot<Map<String, double>> 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<Map<String, double>> 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('');
}
});
}),
);
});
}
}

View File

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

View File

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

View File

@ -16,31 +16,35 @@ class Certifications extends StatelessWidget {
@override
Widget build(BuildContext context) {
final sub = Provider.of<SubstrateSdk>(context);
return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
return FutureBuilder(
future: sdk.getCertsCounter(address),
builder: (BuildContext context, AsyncSnapshot<List<int>?> 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<List<int>?> 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),
)
],
);
}),
]);
}
}

View File

@ -44,9 +44,9 @@ class DragTuleAction extends StatelessWidget {
),
),
child: DragTarget<String>(
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<dynamic> accepted,

View File

@ -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: <Widget>[
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: <Widget>[
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(

View File

@ -28,26 +28,25 @@ class IdentityStatus extends StatelessWidget {
future: sub.idtyStatus([address]),
initialData: [walletData.identityStatus],
builder: (context, AsyncSnapshot<List<IdtyStatus>> 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,

View File

@ -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<SubstrateSdk>(context, listen: false);
final acc = sub.getCurrentWallet();

View File

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

View File

@ -40,6 +40,7 @@ class _TransactionInProgressTuleState extends State<TransactionInProgressTule> {
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<TransactionInProgressTule> {
statusIcon,
ScaledSizedBox(width: 10),
ScaledSizedBox(
width: 160,
width: 170,
child: Text(
humanStatus,
style: scaledTextStyle(

View File

@ -151,7 +151,7 @@ class BalanceBuilder extends StatelessWidget {
address: address,
size: 14,
color: isDefault ? Colors.white : Colors.black,
loadingColor: isDefault ? yellowC : orangeC),
),
)
],
)),

View File

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

View File

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

View File

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