diff --git a/lib/archethic_dapp_framework_flutter.dart b/lib/archethic_dapp_framework_flutter.dart index d90c871..5b9068a 100644 --- a/lib/archethic_dapp_framework_flutter.dart +++ b/lib/archethic_dapp_framework_flutter.dart @@ -11,10 +11,13 @@ export 'src/domain/models/ae_token.dart'; export 'src/domain/models/ae_token_pair.dart'; export 'src/domain/models/crypto_price.dart'; export 'src/domain/models/failures.dart'; +export 'src/domain/models/market_price_history.dart'; export 'src/domain/models/result.dart'; export 'src/domain/models/ucids_tokens.dart'; export 'src/domain/models/verified_tokens.dart'; +export 'src/domain/repositories/coin_price_history.repository.dart'; export 'src/infrastructure/coin_price.repository.dart'; +export 'src/infrastructure/coin_price_history.repository.dart'; export 'src/infrastructure/consent.respository.dart'; export 'src/infrastructure/def_tokens.repository.dart'; export 'src/infrastructure/ucids_tokens.repository.dart'; diff --git a/lib/src/application/oracle/provider.g.dart b/lib/src/application/oracle/provider.g.dart index be88289..970a6bd 100644 --- a/lib/src/application/oracle/provider.g.dart +++ b/lib/src/application/oracle/provider.g.dart @@ -7,7 +7,7 @@ part of 'provider.dart'; // ************************************************************************** String _$archethicOracleUCONotifierHash() => - r'379fa7582c4e0daaf39096b8d50afc24a5c05e6e'; + r'3e00e9755feb11604891177d31c5f8bcb4544589'; /// See also [_ArchethicOracleUCONotifier]. @ProviderFor(_ArchethicOracleUCONotifier) diff --git a/lib/src/domain/models/ae_token.dart b/lib/src/domain/models/ae_token.dart index e8b23ca..cd2ac3a 100644 --- a/lib/src/domain/models/ae_token.dart +++ b/lib/src/domain/models/ae_token.dart @@ -24,7 +24,6 @@ class AEToken with _$AEToken { @Default('') String name, String? address, String? icon, - String? coingeckoCoinId, @Default('') String symbol, @Default(0.0) double balance, @Default(0.0) double reserve, diff --git a/lib/src/domain/models/ae_token.freezed.dart b/lib/src/domain/models/ae_token.freezed.dart index 16a6486..7adc813 100644 --- a/lib/src/domain/models/ae_token.freezed.dart +++ b/lib/src/domain/models/ae_token.freezed.dart @@ -23,7 +23,6 @@ mixin _$AEToken { String get name => throw _privateConstructorUsedError; String? get address => throw _privateConstructorUsedError; String? get icon => throw _privateConstructorUsedError; - String? get coingeckoCoinId => throw _privateConstructorUsedError; String get symbol => throw _privateConstructorUsedError; double get balance => throw _privateConstructorUsedError; double get reserve => throw _privateConstructorUsedError; @@ -48,7 +47,6 @@ abstract class $AETokenCopyWith<$Res> { {String name, String? address, String? icon, - String? coingeckoCoinId, String symbol, double balance, double reserve, @@ -77,7 +75,6 @@ class _$AETokenCopyWithImpl<$Res, $Val extends AEToken> Object? name = null, Object? address = freezed, Object? icon = freezed, - Object? coingeckoCoinId = freezed, Object? symbol = null, Object? balance = null, Object? reserve = null, @@ -100,10 +97,6 @@ class _$AETokenCopyWithImpl<$Res, $Val extends AEToken> ? _value.icon : icon // ignore: cast_nullable_to_non_nullable as String?, - coingeckoCoinId: freezed == coingeckoCoinId - ? _value.coingeckoCoinId - : coingeckoCoinId // ignore: cast_nullable_to_non_nullable - as String?, symbol: null == symbol ? _value.symbol : symbol // ignore: cast_nullable_to_non_nullable @@ -163,7 +156,6 @@ abstract class _$$AETokenImplCopyWith<$Res> implements $AETokenCopyWith<$Res> { {String name, String? address, String? icon, - String? coingeckoCoinId, String symbol, double balance, double reserve, @@ -191,7 +183,6 @@ class __$$AETokenImplCopyWithImpl<$Res> Object? name = null, Object? address = freezed, Object? icon = freezed, - Object? coingeckoCoinId = freezed, Object? symbol = null, Object? balance = null, Object? reserve = null, @@ -214,10 +205,6 @@ class __$$AETokenImplCopyWithImpl<$Res> ? _value.icon : icon // ignore: cast_nullable_to_non_nullable as String?, - coingeckoCoinId: freezed == coingeckoCoinId - ? _value.coingeckoCoinId - : coingeckoCoinId // ignore: cast_nullable_to_non_nullable - as String?, symbol: null == symbol ? _value.symbol : symbol // ignore: cast_nullable_to_non_nullable @@ -261,7 +248,6 @@ class _$AETokenImpl extends _AEToken { {this.name = '', this.address, this.icon, - this.coingeckoCoinId, this.symbol = '', this.balance = 0.0, this.reserve = 0.0, @@ -283,8 +269,6 @@ class _$AETokenImpl extends _AEToken { @override final String? icon; @override - final String? coingeckoCoinId; - @override @JsonKey() final String symbol; @override @@ -310,7 +294,7 @@ class _$AETokenImpl extends _AEToken { @override String toString() { - return 'AEToken(name: $name, address: $address, icon: $icon, coingeckoCoinId: $coingeckoCoinId, symbol: $symbol, balance: $balance, reserve: $reserve, supply: $supply, isVerified: $isVerified, isLpToken: $isLpToken, lpTokenPair: $lpTokenPair, ucid: $ucid)'; + return 'AEToken(name: $name, address: $address, icon: $icon, symbol: $symbol, balance: $balance, reserve: $reserve, supply: $supply, isVerified: $isVerified, isLpToken: $isLpToken, lpTokenPair: $lpTokenPair, ucid: $ucid)'; } @override @@ -321,8 +305,6 @@ class _$AETokenImpl extends _AEToken { (identical(other.name, name) || other.name == name) && (identical(other.address, address) || other.address == address) && (identical(other.icon, icon) || other.icon == icon) && - (identical(other.coingeckoCoinId, coingeckoCoinId) || - other.coingeckoCoinId == coingeckoCoinId) && (identical(other.symbol, symbol) || other.symbol == symbol) && (identical(other.balance, balance) || other.balance == balance) && (identical(other.reserve, reserve) || other.reserve == reserve) && @@ -338,20 +320,8 @@ class _$AETokenImpl extends _AEToken { @JsonKey(ignore: true) @override - int get hashCode => Object.hash( - runtimeType, - name, - address, - icon, - coingeckoCoinId, - symbol, - balance, - reserve, - supply, - isVerified, - isLpToken, - lpTokenPair, - ucid); + int get hashCode => Object.hash(runtimeType, name, address, icon, symbol, + balance, reserve, supply, isVerified, isLpToken, lpTokenPair, ucid); @JsonKey(ignore: true) @override @@ -372,7 +342,6 @@ abstract class _AEToken extends AEToken { {final String name, final String? address, final String? icon, - final String? coingeckoCoinId, final String symbol, final double balance, final double reserve, @@ -392,8 +361,6 @@ abstract class _AEToken extends AEToken { @override String? get icon; @override - String? get coingeckoCoinId; - @override String get symbol; @override double get balance; diff --git a/lib/src/domain/models/ae_token.g.dart b/lib/src/domain/models/ae_token.g.dart index 1526f3f..77e719a 100644 --- a/lib/src/domain/models/ae_token.g.dart +++ b/lib/src/domain/models/ae_token.g.dart @@ -11,7 +11,6 @@ _$AETokenImpl _$$AETokenImplFromJson(Map json) => name: json['name'] as String? ?? '', address: json['address'] as String?, icon: json['icon'] as String?, - coingeckoCoinId: json['coingeckoCoinId'] as String?, symbol: json['symbol'] as String? ?? '', balance: (json['balance'] as num?)?.toDouble() ?? 0.0, reserve: (json['reserve'] as num?)?.toDouble() ?? 0.0, @@ -28,7 +27,6 @@ Map _$$AETokenImplToJson(_$AETokenImpl instance) => 'name': instance.name, 'address': instance.address, 'icon': instance.icon, - 'coingeckoCoinId': instance.coingeckoCoinId, 'symbol': instance.symbol, 'balance': instance.balance, 'reserve': instance.reserve, diff --git a/lib/src/domain/models/market_price_history.dart b/lib/src/domain/models/market_price_history.dart new file mode 100644 index 0000000..61c5819 --- /dev/null +++ b/lib/src/domain/models/market_price_history.dart @@ -0,0 +1,38 @@ +import 'package:freezed_annotation/freezed_annotation.dart'; + +part 'market_price_history.freezed.dart'; +part 'market_price_history.g.dart'; + +enum MarketPriceHistoryInterval { + hour, + day, + week, + twoWeeks, + month, + twoMonths, + year, +} + +class PriceHistoryValueConverter + implements JsonConverter> { + const PriceHistoryValueConverter(); + + @override + PriceHistoryValue fromJson(Map json) { + return PriceHistoryValue.fromJson(json); + } + + @override + Map toJson(PriceHistoryValue object) => object.toJson(); +} + +@freezed +class PriceHistoryValue with _$PriceHistoryValue { + const factory PriceHistoryValue({ + required num price, + required DateTime time, + }) = _PriceHistoryValue; + + factory PriceHistoryValue.fromJson(Map json) => + _$PriceHistoryValueFromJson(json); +} diff --git a/lib/src/domain/models/market_price_history.freezed.dart b/lib/src/domain/models/market_price_history.freezed.dart new file mode 100644 index 0000000..bba89f0 --- /dev/null +++ b/lib/src/domain/models/market_price_history.freezed.dart @@ -0,0 +1,170 @@ +// coverage:ignore-file +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint +// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark + +part of 'market_price_history.dart'; + +// ************************************************************************** +// FreezedGenerator +// ************************************************************************** + +T _$identity(T value) => value; + +final _privateConstructorUsedError = UnsupportedError( + 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); + +PriceHistoryValue _$PriceHistoryValueFromJson(Map json) { + return _PriceHistoryValue.fromJson(json); +} + +/// @nodoc +mixin _$PriceHistoryValue { + num get price => throw _privateConstructorUsedError; + DateTime get time => throw _privateConstructorUsedError; + + Map toJson() => throw _privateConstructorUsedError; + @JsonKey(ignore: true) + $PriceHistoryValueCopyWith get copyWith => + throw _privateConstructorUsedError; +} + +/// @nodoc +abstract class $PriceHistoryValueCopyWith<$Res> { + factory $PriceHistoryValueCopyWith( + PriceHistoryValue value, $Res Function(PriceHistoryValue) then) = + _$PriceHistoryValueCopyWithImpl<$Res, PriceHistoryValue>; + @useResult + $Res call({num price, DateTime time}); +} + +/// @nodoc +class _$PriceHistoryValueCopyWithImpl<$Res, $Val extends PriceHistoryValue> + implements $PriceHistoryValueCopyWith<$Res> { + _$PriceHistoryValueCopyWithImpl(this._value, this._then); + + // ignore: unused_field + final $Val _value; + // ignore: unused_field + final $Res Function($Val) _then; + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? price = null, + Object? time = null, + }) { + return _then(_value.copyWith( + price: null == price + ? _value.price + : price // ignore: cast_nullable_to_non_nullable + as num, + time: null == time + ? _value.time + : time // ignore: cast_nullable_to_non_nullable + as DateTime, + ) as $Val); + } +} + +/// @nodoc +abstract class _$$PriceHistoryValueImplCopyWith<$Res> + implements $PriceHistoryValueCopyWith<$Res> { + factory _$$PriceHistoryValueImplCopyWith(_$PriceHistoryValueImpl value, + $Res Function(_$PriceHistoryValueImpl) then) = + __$$PriceHistoryValueImplCopyWithImpl<$Res>; + @override + @useResult + $Res call({num price, DateTime time}); +} + +/// @nodoc +class __$$PriceHistoryValueImplCopyWithImpl<$Res> + extends _$PriceHistoryValueCopyWithImpl<$Res, _$PriceHistoryValueImpl> + implements _$$PriceHistoryValueImplCopyWith<$Res> { + __$$PriceHistoryValueImplCopyWithImpl(_$PriceHistoryValueImpl _value, + $Res Function(_$PriceHistoryValueImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? price = null, + Object? time = null, + }) { + return _then(_$PriceHistoryValueImpl( + price: null == price + ? _value.price + : price // ignore: cast_nullable_to_non_nullable + as num, + time: null == time + ? _value.time + : time // ignore: cast_nullable_to_non_nullable + as DateTime, + )); + } +} + +/// @nodoc +@JsonSerializable() +class _$PriceHistoryValueImpl implements _PriceHistoryValue { + const _$PriceHistoryValueImpl({required this.price, required this.time}); + + factory _$PriceHistoryValueImpl.fromJson(Map json) => + _$$PriceHistoryValueImplFromJson(json); + + @override + final num price; + @override + final DateTime time; + + @override + String toString() { + return 'PriceHistoryValue(price: $price, time: $time)'; + } + + @override + bool operator ==(Object other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$PriceHistoryValueImpl && + (identical(other.price, price) || other.price == price) && + (identical(other.time, time) || other.time == time)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, price, time); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$PriceHistoryValueImplCopyWith<_$PriceHistoryValueImpl> get copyWith => + __$$PriceHistoryValueImplCopyWithImpl<_$PriceHistoryValueImpl>( + this, _$identity); + + @override + Map toJson() { + return _$$PriceHistoryValueImplToJson( + this, + ); + } +} + +abstract class _PriceHistoryValue implements PriceHistoryValue { + const factory _PriceHistoryValue( + {required final num price, + required final DateTime time}) = _$PriceHistoryValueImpl; + + factory _PriceHistoryValue.fromJson(Map json) = + _$PriceHistoryValueImpl.fromJson; + + @override + num get price; + @override + DateTime get time; + @override + @JsonKey(ignore: true) + _$$PriceHistoryValueImplCopyWith<_$PriceHistoryValueImpl> get copyWith => + throw _privateConstructorUsedError; +} diff --git a/lib/src/domain/models/market_price_history.g.dart b/lib/src/domain/models/market_price_history.g.dart new file mode 100644 index 0000000..4b9020b --- /dev/null +++ b/lib/src/domain/models/market_price_history.g.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'market_price_history.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +_$PriceHistoryValueImpl _$$PriceHistoryValueImplFromJson( + Map json) => + _$PriceHistoryValueImpl( + price: json['price'] as num, + time: DateTime.parse(json['time'] as String), + ); + +Map _$$PriceHistoryValueImplToJson( + _$PriceHistoryValueImpl instance) => + { + 'price': instance.price, + 'time': instance.time.toIso8601String(), + }; diff --git a/lib/src/domain/repositories/coin_price_history.repository.dart b/lib/src/domain/repositories/coin_price_history.repository.dart new file mode 100644 index 0000000..0d0ea87 --- /dev/null +++ b/lib/src/domain/repositories/coin_price_history.repository.dart @@ -0,0 +1,10 @@ +import 'package:archethic_dapp_framework_flutter/src/domain/models/failures.dart'; +import 'package:archethic_dapp_framework_flutter/src/domain/models/market_price_history.dart'; +import 'package:archethic_dapp_framework_flutter/src/domain/models/result.dart'; + +abstract class CoinPriceHistoryRepositoryInterface { + Future, Failure>> getWithInterval({ + required MarketPriceHistoryInterval interval, + required int ucid, + }); +} diff --git a/lib/src/domain/repositories/tokens/def_tokens.json b/lib/src/domain/repositories/tokens/def_tokens.json index 60c7d96..357d030 100644 --- a/lib/src/domain/repositories/tokens/def_tokens.json +++ b/lib/src/domain/repositories/tokens/def_tokens.json @@ -6,14 +6,14 @@ "symbol": "UCO", "address": "UCO", "icon": "Archethic.svg", - "coingeckoCoinId": "archethic" + "ucid": 6887 }, { "name": "Wrapped Ether", "symbol": "aeETH", "address": "0000FA3D1170A5069BA06C558905C9619FB66F7F4CB48D7A4323C9DC40F4D07E9BC1", "icon": "Ethereum.svg", - "coingeckoCoinId": "ethereum" + "ucid": 1027 } ], "testnet": [ @@ -22,35 +22,35 @@ "symbol": "UCO", "address": "UCO", "icon": "Archethic.svg", - "coingeckoCoinId": "archethic" + "ucid": 6887 }, { "name": "Wrapped Ether", "symbol": "aeETH", "address": "00003DF600E329199BF3EE8FBE2B8223413D70BCDD97E15089E6A74D94DE3F1173B4", "icon": "Ethereum.svg", - "coingeckoCoinId": "ethereum" + "ucid": 1027 }, { "name": "Wrapped Polygon", "symbol": "aeMATIC", "address": "00001A4AB7AD0CE2B494C965C66FF2962692A5FE5ECB71B345ABB53BAD88A83A01F1", "icon": "Matic.svg", - "coingeckoCoinId": "matic-network" + "ucid": 3890 }, { "name": "Wrapped BNB", "symbol": "aeBNB", "address": "0000288BF6F0E12457B125DC54D2DFA4EB010BE3073CF02E10FB79B696180F55B827", "icon": "BNB.svg", - "coingeckoCoinId": "binancecoin" + "ucid": 1839 }, { "name": "Archethic aeEURe", "symbol": "aeEURe", "address": "00001ED63AC2850CEA282D3D0CA5047418BC2720CB49D15B611D2845611F605716A1", "icon": "EURe.svg", - "coingeckoCoinId": "monerium-eur-money" + "ucid": 20920 } ], "mainnet": [ @@ -59,21 +59,21 @@ "symbol": "UCO", "address": "UCO", "icon": "Archethic.svg", - "coingeckoCoinId": "archethic" + "ucid": 6887 }, { "name": "Wrapped Ether", "symbol": "aeETH", "address": "0000457eaca7fbaa96db4a8d506a0b69684f546166fbf3c55391b1461907efa58eaf", "icon": "Ethereum.svg", - "coingeckoCoinId": "ethereum" + "ucid": 1027 }, { "name": "Archethic aeEURe", "symbol": "aeEURe", "address": "00005751A05BA007E7E2518DEA171DBBD67B0527C637232F923830C39BFF9E8F159A", "icon": "EURe.svg", - "coingeckoCoinId": "monerium-eur-money" + "ucid": 20920 } ] } diff --git a/lib/src/infrastructure/coin_price_history.repository.dart b/lib/src/infrastructure/coin_price_history.repository.dart new file mode 100644 index 0000000..bcccba8 --- /dev/null +++ b/lib/src/infrastructure/coin_price_history.repository.dart @@ -0,0 +1,94 @@ +import 'dart:convert'; + +import 'package:archethic_dapp_framework_flutter/src/domain/models/failures.dart'; +import 'package:archethic_dapp_framework_flutter/src/domain/models/market_price_history.dart'; +import 'package:archethic_dapp_framework_flutter/src/domain/models/result.dart'; +import 'package:archethic_dapp_framework_flutter/src/domain/repositories/coin_price_history.repository.dart'; +import 'package:http/http.dart' as http; + +class CoinPriceHistoryRepository + implements CoinPriceHistoryRepositoryInterface { + @override + Future, Failure>> getWithInterval({ + required MarketPriceHistoryInterval interval, + required int ucid, + }) => + Result.guard( + () async { + //TODO + final url = + 'http://localhost:33333/api/v1/quotes/history?ucid=$ucid&interval=${_marketPriceHistoryIntervalToString(interval)}'; + final headers = { + 'Content-type': 'application/json', + 'Accept': 'application/json', + }; + + try { + final response = await http.get(Uri.parse(url), headers: headers); + if (response.statusCode == 200) { + return _parsePriceHistoryValues(response.body); + } + // ignore: unused_catch_stack, empty_catches + } catch (e, stacktrace) {} + + return []; + }, + ); + + List _parsePriceHistoryValues(String responseBody) { + final responseJson = jsonDecode(responseBody); + final priceHistory = []; + + if (responseJson['prices'] != null) { + for (final entry in responseJson['prices']) { + final time = DateTime.fromMillisecondsSinceEpoch(entry[0]); + final num price = entry[1]; + priceHistory.add(PriceHistoryValue(price: price, time: time)); + } + } + + return priceHistory; + } + + String _marketPriceHistoryIntervalToString( + MarketPriceHistoryInterval interval, + ) { + switch (interval) { + case MarketPriceHistoryInterval.hour: + return 'hourly'; + case MarketPriceHistoryInterval.day: + return 'daily'; + case MarketPriceHistoryInterval.week: + return 'weekly'; + case MarketPriceHistoryInterval.twoWeeks: + return 'biWeekly'; + case MarketPriceHistoryInterval.month: + return 'monthly'; + case MarketPriceHistoryInterval.twoMonths: + return 'bimonthly'; + case MarketPriceHistoryInterval.year: + return 'yearly'; + } + } +} + +extension CoinGeckoPriceHistoryConversion on MarketPriceHistoryInterval { + Duration get duration { + switch (this) { + case MarketPriceHistoryInterval.hour: + return const Duration(hours: 1); + case MarketPriceHistoryInterval.day: + return const Duration(days: 1); + case MarketPriceHistoryInterval.week: + return const Duration(days: 7); + case MarketPriceHistoryInterval.twoWeeks: + return const Duration(days: 14); + case MarketPriceHistoryInterval.month: + return const Duration(days: 30); + case MarketPriceHistoryInterval.twoMonths: + return const Duration(days: 60); + case MarketPriceHistoryInterval.year: + return const Duration(days: 365); + } + } +} diff --git a/lib/src/infrastructure/def_tokens.repository.dart b/lib/src/infrastructure/def_tokens.repository.dart index 5b9325d..a2e3262 100644 --- a/lib/src/infrastructure/def_tokens.repository.dart +++ b/lib/src/infrastructure/def_tokens.repository.dart @@ -26,7 +26,7 @@ class DefTokensRepositoryImpl implements DefTokensRepositoryInterface { address.toUpperCase()) { defToken = AEToken( name: token['name'], - coingeckoCoinId: token['coingeckoCoinId'], + ucid: token['ucid'], icon: token['icon'], address: token['address'].toString().toUpperCase(), symbol: token['symbol'], diff --git a/pubspec.lock b/pubspec.lock index 9845240..384d278 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -44,6 +44,7 @@ packages: archethic_wallet_client: dependency: "direct main" description: +<<<<<<< HEAD <<<<<<< HEAD name: archethic_wallet_client sha256: "83baa3bbdb5c2a5c772c9ad3272adcb2c70bc2ef70075a12c9316a13bd57921b" @@ -56,6 +57,13 @@ packages: source: path version: "2.0.4" >>>>>>> f872e4c (chore: :bug: Fix Oracle subscription) +======= + name: archethic_wallet_client + sha256: "42354078ff5838186939b7a263ae97724cdd388a497f7c7bf31e8029eef35bb2" + url: "https://pub.dev" + source: hosted + version: "2.0.5" +>>>>>>> da25654 (feat: :sparkles: Use fetch-api-service instead of coingecko) archive: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 8a99185..653fa28 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,7 +19,6 @@ dependencies: # path: ../libdart-2 # A client dart library to interact with Archethic Wallet RPC API. - #archethic_wallet_client: ^2.0.7 archethic_wallet_client: path: ../archethic-wallet-client-dart