Skip to content

Commit

Permalink
Add ew_keyring package: (doesn't support sr25519 yet), but implements…
Browse files Browse the repository at this point in the history
… Address SS58 codec (#1565)

* add ew_keyring package

* [ew_keyring] add tests for `keyring_data`

* [ew_keyring] fix adding dev seeds to the keyring

* [ew_keyring] fmt

* [ew_keyring] add test adding well known accounts, but they currently fail.

* [ew_keyring] add minimal reproducible example for tests

* [ew_keyring] remove_warnings

* [ew_keyring] add comment about missing sr25519 support

* [ew_keyring] add address_utils.dart

* add keyring as app dependency

* [import_account_view] use `ValidateKeys` from ew_keyring

* [ew_keyring] add pubKeyHexToAddress

* [ew_keyring] add tests for kusama address prefix

* use `ew_keyring`'s `AddressUtil` for addres codec and remove homegrown codec

* fix weird import

* fmt

* [ew_keyring] fix library name

* [ew_keyring] skip failing keyring tests
  • Loading branch information
clangenb authored Nov 21, 2023
1 parent db0d6b3 commit 08942bb
Show file tree
Hide file tree
Showing 42 changed files with 1,136 additions and 330 deletions.
3 changes: 2 additions & 1 deletion app/lib/common/components/account_select_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:encointer_wallet/common/components/address_icon.dart';
import 'package:encointer_wallet/store/account/types/account_data.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:ew_keyring/ew_keyring.dart';
import 'package:flutter/material.dart';

class AccountSelectList extends StatelessWidget {
Expand All @@ -14,7 +15,7 @@ class AccountSelectList extends StatelessWidget {
Widget build(BuildContext context) {
return ListView(
children: accounts.map((account) {
final address = Fmt.ss58Encode(account.pubKey, prefix: store.settings.endpoint.ss58!);
final address = AddressUtils.pubKeyHexToAddress(account.pubKey, prefix: store.settings.endpoint.ss58!);

return ListTile(
leading: AddressIcon(address, account.pubKey),
Expand Down
11 changes: 6 additions & 5 deletions app/lib/common/components/address_input_field.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:dropdown_search/dropdown_search.dart';
import 'package:ew_test_keys/ew_test_keys.dart';
import 'package:flutter/material.dart';

import 'package:encointer_wallet/common/components/address_icon.dart';
Expand All @@ -8,6 +7,8 @@ import 'package:encointer_wallet/store/account/types/account_data.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/l10n/l10.dart';
import 'package:ew_keyring/ew_keyring.dart';
import 'package:ew_test_keys/ew_test_keys.dart';

class AddressInputField extends StatefulWidget {
const AddressInputField(
Expand Down Expand Up @@ -35,15 +36,15 @@ class _AddressInputFieldState extends State<AddressInputField> {
final ss58 = widget.store.settings.endpoint.ss58!;
// we can't just use account.address unfortunately, see #1019.
return account.name.startsWith(nameOrAddress.trim()) ||
Fmt.ss58Encode(account.pubKey, prefix: ss58).startsWith(nameOrAddress.trim());
AddressUtils.pubKeyHexToAddress(account.pubKey, prefix: ss58).startsWith(nameOrAddress.trim());
}

Widget _selectedItemBuilder(BuildContext context, AccountData? account) {
if (account == null) {
return Container();
}

final address = Fmt.ss58Encode(account.pubKey, prefix: widget.store.settings.endpoint.ss58!);
final address = AddressUtils.pubKeyHexToAddress(account.pubKey, prefix: widget.store.settings.endpoint.ss58!);

return Container(
padding: const EdgeInsets.only(top: 8),
Expand All @@ -70,7 +71,7 @@ class _AddressInputFieldState extends State<AddressInputField> {
}

Widget _listItemBuilder(BuildContext context, AccountData account, bool isSelected) {
final address = Fmt.ss58Encode(account.pubKey, prefix: widget.store.settings.endpoint.ss58!);
final address = AddressUtils.pubKeyHexToAddress(account.pubKey, prefix: widget.store.settings.endpoint.ss58!);

return Container(
margin: const EdgeInsets.symmetric(horizontal: 8),
Expand Down Expand Up @@ -115,7 +116,7 @@ class _AddressInputFieldState extends State<AddressInputField> {
emptyBuilder: (context, searchEntry) {
if (Fmt.isAddress(searchEntry)) {
final address = searchEntry.replaceAll(' ', '');
final pubKey = Fmt.ss58Decode(address).pubKey;
final pubKey = AddressUtils.addressToPubKeyHex(address);
final newAccount = AccountData()
..address = address
..pubKey = pubKey
Expand Down
8 changes: 4 additions & 4 deletions app/lib/models/transfer/transfer_history.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import 'package:encointer_wallet/service/log/log_service.dart';
import 'package:flutter/material.dart';
import 'package:json_annotation/json_annotation.dart';

import 'package:encointer_wallet/l10n/l10.dart';
import 'package:encointer_wallet/utils/extensions/double/double_extension.dart';
import 'package:encointer_wallet/store/account/types/account_data.dart';
import 'package:encointer_wallet/l10n/l10.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/service/log/log_service.dart';
import 'package:ew_keyring/ew_keyring.dart';

part 'transfer_history.g.dart';

Expand Down Expand Up @@ -51,7 +51,7 @@ class Transaction {
try {
// Contact address might be with default prefix 42, or with Kusama prefix 2.
// So better to work with the universal pubKey.
if (contact.pubKey == Fmt.ss58Decode(counterParty).pubKey) {
if (contact.pubKey == AddressUtils.addressToPubKeyHex(counterParty)) {
return contact.name;
}
} catch (e) {
Expand Down
8 changes: 5 additions & 3 deletions app/lib/modules/account/logic/new_account_store.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:encointer_wallet/modules/modules.dart';
import 'package:encointer_wallet/service/log/log_service.dart';
import 'package:encointer_wallet/service/substrate_api/api.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:ew_keyring/ew_keyring.dart';
import 'package:provider/provider.dart';

part 'new_account_store.g.dart';
Expand Down Expand Up @@ -68,7 +68,8 @@ abstract class _NewAccountStoreBase with Store {

await context.read<LoginStore>().setPin(pin);
final appStore = context.read<AppStore>();
acc['address'] = Fmt.ss58Encode(acc['pubKey'] as String, prefix: appStore.settings.endpoint.ss58!);
acc['address'] =
AddressUtils.pubKeyHexToAddress(acc['pubKey'] as String, prefix: appStore.settings.endpoint.ss58!);
return saveAccount(webApi, appStore, acc, pin);
} catch (e, s) {
_loading = false;
Expand All @@ -93,7 +94,8 @@ abstract class _NewAccountStoreBase with Store {
} else {
await context.read<LoginStore>().setPin(pin);
final appStore = context.read<AppStore>();
acc['address'] = Fmt.ss58Encode(acc['pubKey'] as String, prefix: appStore.settings.endpoint.ss58!);
acc['address'] =
AddressUtils.pubKeyHexToAddress(acc['pubKey'] as String, prefix: appStore.settings.endpoint.ss58!);
final index = appStore.account.accountList.indexWhere((i) => i.pubKey == acc['pubKey']);
if (index > -1) {
_loading = false;
Expand Down
2 changes: 1 addition & 1 deletion app/lib/modules/account/view/import_account_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import 'package:provider/provider.dart';

import 'package:encointer_wallet/common/components/encointer_text_form_field.dart';
import 'package:encointer_wallet/theme/theme.dart';
import 'package:encointer_wallet/utils/validate_keys.dart';
import 'package:encointer_wallet/common/components/form/scrollable_form.dart';
import 'package:encointer_wallet/common/components/gradient_elements.dart';
import 'package:encointer_wallet/common/components/loading/centered_activity_indicator.dart';
Expand All @@ -17,6 +16,7 @@ import 'package:encointer_wallet/utils/alerts/app_alert.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/utils/input_validation.dart';
import 'package:encointer_wallet/l10n/l10.dart';
import 'package:ew_keyring/ew_keyring.dart' show ValidateKeys;

class ImportAccountView extends StatelessWidget {
const ImportAccountView({super.key});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
// ignore_for_file: library_private_types_in_public_api
import 'package:encointer_wallet/service/log/log_service.dart';
import 'package:ew_http/ew_http.dart';
import 'package:mobx/mobx.dart';

import 'package:encointer_wallet/models/index.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/config/consts.dart';
import 'package:encointer_wallet/utils/fetch_status.dart';
import 'package:encointer_wallet/service/log/log_service.dart';
import 'package:ew_http/ew_http.dart';
import 'package:ew_keyring/ew_keyring.dart';

part 'transfer_history_view_store.g.dart';

Expand Down Expand Up @@ -43,7 +43,7 @@ abstract class _TransferHistoryViewStoreBase with Store {
}

try {
final address = Fmt.ss58Encode(
final address = AddressUtils.pubKeyHexToAddress(
pubKey,
prefix: appStore.settings.endpoint.ss58 ?? 42,
);
Expand Down
3 changes: 2 additions & 1 deletion app/lib/modules/transfer/widgets/transaction_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'package:encointer_wallet/models/index.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/ui.dart';
import 'package:ew_keyring/ew_keyring.dart';

class TransactionCard extends StatelessWidget {
const TransactionCard(
Expand Down Expand Up @@ -137,7 +138,7 @@ String tryGetPubKey(Transaction transaction) {
String counterPartyPubKey;

try {
counterPartyPubKey = Fmt.ss58Decode(transaction.counterParty).pubKey;
counterPartyPubKey = AddressUtils.addressToPubKeyHex(transaction.counterParty);
} catch (e) {
Log.e('Could not decode address. Error: $e');

Expand Down
4 changes: 2 additions & 2 deletions app/lib/page-encointer/meetup/ceremony_step2_scan2.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import 'package:provider/provider.dart';

import 'package:encointer_wallet/service/substrate_api/api.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/modules/modules.dart';
import 'package:encointer_wallet/utils/snack_bar.dart';
import 'package:encointer_wallet/l10n/l10.dart';
Expand All @@ -19,6 +18,7 @@ import 'package:encointer_wallet/common/components/logo/participant_avatar.dart'
import 'package:encointer_wallet/page-encointer/meetup/ceremony_progress_bar.dart';
import 'package:encointer_wallet/page-encointer/meetup/ceremony_step3_finish.dart';
import 'package:encointer_wallet/page-encointer/meetup/scan_claim_qr_code.dart';
import 'package:ew_keyring/ew_keyring.dart';

class CeremonyStep2Scan extends StatelessWidget {
const CeremonyStep2Scan(
Expand Down Expand Up @@ -136,7 +136,7 @@ class CeremonyStep2Scan extends StatelessWidget {

int meetupIndexOfAccount(String accountPubKey) {
final participants = store.encointer.communityAccount!.meetup!.registry;
final address = Fmt.ss58Encode(accountPubKey);
final address = AddressUtils.pubKeyHexToAddress(accountPubKey);

// the addresses of the meetup are encoded with the default prefix: 42.
return participants.indexOf(address);
Expand Down
8 changes: 4 additions & 4 deletions app/lib/page-encointer/meetup/scan_claim_qr_code.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:ew_test_keys/ew_test_keys.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:mobile_scanner/mobile_scanner.dart';
import 'package:mobile_scanner/mobile_scanner.dart' show MobileScanner, MobileScannerController;
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';

Expand All @@ -13,6 +13,7 @@ import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/utils/snack_bar.dart';
import 'package:encointer_wallet/l10n/l10.dart';
import 'package:ew_keyring/ew_keyring.dart' show AddressUtils, Address;

class ScanClaimQrCode extends StatefulWidget {
const ScanClaimQrCode(this.confirmedParticipantsCount, {super.key});
Expand All @@ -30,15 +31,14 @@ class _ScanClaimQrCodeState extends State<ScanClaimQrCode> {
@override
void initState() {
final store = context.read<AppStore>();
currentAddressPrefix42 = Fmt.ss58Encode(store.account.currentAccountPubKey!);
currentAddressPrefix42 = AddressUtils.pubKeyHexToAddress(store.account.currentAccountPubKey!);
allParticipantsPrefix42 = store.encointer.communityAccount?.meetup?.registry ?? [];
super.initState();
}

/// Checks that the `attendeeAddress` is not equal to self and part of the meetup registry.
void validateAndStoreParticipant(AppStore store, String attendeeAddress, AppLocalizations l10n) {
final attendeePubKey = Fmt.ss58Decode(attendeeAddress).pubKey;
final attendeeAddressPrefix42 = Fmt.ss58Encode(attendeePubKey);
final attendeeAddressPrefix42 = Address.decode(attendeeAddress).encode(prefix: 42);

if (attendeeAddressPrefix42 == currentAddressPrefix42) {
RootSnackBar.showMsg(l10n.meetupClaimantEqualToSelf);
Expand Down
7 changes: 4 additions & 3 deletions app/lib/page/assets/receive/receive_page.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import 'package:ew_test_keys/ew_test_keys.dart';
import 'package:flutter/material.dart';
import 'package:focus_detector/focus_detector.dart';
import 'package:pausable_timer/pausable_timer.dart';
Expand All @@ -10,7 +9,6 @@ import 'package:encointer_wallet/page/assets/qr_code_printing/pages/qr_code_shar
import 'package:encointer_wallet/common/components/wake_lock_and_brightness_enhancer.dart';
import 'package:encointer_wallet/theme/theme.dart';
import 'package:encointer_wallet/config/consts.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/page/qr_scan/qr_codes/index.dart';
import 'package:encointer_wallet/service/log/log_service.dart';
import 'package:encointer_wallet/service/notification/lib/notification.dart';
Expand All @@ -19,6 +17,8 @@ import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/snack_bar.dart';
import 'package:encointer_wallet/l10n/l10.dart';
import 'package:encointer_wallet/utils/ui.dart';
import 'package:ew_keyring/ew_keyring.dart';
import 'package:ew_test_keys/ew_test_keys.dart';

class ReceivePage extends StatefulWidget {
const ReceivePage({super.key});
Expand All @@ -44,7 +44,8 @@ class _ReceivePageState extends State<ReceivePage> {
void initState() {
super.initState();
_appStore = context.read<AppStore>();
final address = Fmt.ss58Encode(_appStore.account.currentAccountPubKey!, prefix: _appStore.settings.endpoint.ss58!);
final address = AddressUtils.pubKeyHexToAddress(_appStore.account.currentAccountPubKey!,
prefix: _appStore.settings.endpoint.ss58!);
invoice = InvoiceQrCode(
account: address,
cid: _appStore.encointer.chosenCid,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import 'package:encointer_wallet/store/account/types/account_data.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/theme/theme.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:ew_keyring/ew_keyring.dart';

class PaymentOverview extends StatelessWidget {
const PaymentOverview(this.store, this.communitySymbol, this.recipientAccount, this.amount, {super.key});
Expand All @@ -20,7 +21,7 @@ class PaymentOverview extends StatelessWidget {
Widget build(BuildContext context) {
final recipientLabel = recipientAccount!.name;
final recipientAddress =
Fmt.address(Fmt.ss58Encode(recipientAccount!.pubKey, prefix: store.settings.endpoint.ss58!))!;
Fmt.address(AddressUtils.pubKeyHexToAddress(recipientAccount!.pubKey, prefix: store.settings.endpoint.ss58!))!;

return IntrinsicHeight(
child: Row(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import 'dart:async';

import 'package:encointer_wallet/service/tx/lib/src/send_tx_dart.dart';
import 'package:ew_polkadart/generated/encointer_kusama/types/sp_runtime/dispatch_error.dart';
import 'package:ew_test_keys/ew_test_keys.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:iconsax/iconsax.dart';
Expand All @@ -21,10 +18,14 @@ import 'package:encointer_wallet/page/assets/transfer/payment_confirmation_page/
import 'package:encointer_wallet/service/log/log_service.dart';
import 'package:encointer_wallet/service/substrate_api/api.dart';
import 'package:encointer_wallet/service/tx/lib/tx.dart';
import 'package:encointer_wallet/service/tx/lib/src/send_tx_dart.dart';
import 'package:encointer_wallet/store/account/types/account_data.dart';
import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/l10n/l10.dart';
import 'package:ew_keyring/ew_keyring.dart';
import 'package:ew_polkadart/generated/encointer_kusama/types/sp_runtime/dispatch_error.dart';
import 'package:ew_test_keys/ew_test_keys.dart';

class PaymentConfirmationParams {
const PaymentConfirmationParams({
Expand Down Expand Up @@ -63,7 +64,8 @@ class _PaymentConfirmationPageState extends State<PaymentConfirmationPage> {
final cid = params.cid;
final recipientAccount = params.recipientAccount;
final amount = params.amount;
final recipientAddress = Fmt.ss58Encode(recipientAccount.pubKey, prefix: store.settings.endpoint.ss58!);
final recipientAddress =
AddressUtils.pubKeyHexToAddress(recipientAccount.pubKey, prefix: store.settings.endpoint.ss58!);

return Scaffold(
appBar: AppBar(title: Text(l10n.payment)),
Expand Down
5 changes: 3 additions & 2 deletions app/lib/page/assets/transfer/transfer_page.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import 'package:ew_test_keys/ew_test_keys.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
Expand All @@ -24,6 +23,8 @@ import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/l10n/l10.dart';
import 'package:encointer_wallet/utils/ui.dart';
import 'package:ew_keyring/ew_keyring.dart';
import 'package:ew_test_keys/ew_test_keys.dart';

class TransferPageParams {
const TransferPageParams({
Expand Down Expand Up @@ -104,7 +105,7 @@ class _TransferPageState extends State<TransferPage> {
_communitySymbol = params.communitySymbol ?? store.encointer.community?.symbol;
_cid = params.cid ?? store.encointer.chosenCid;

final pubKey = Fmt.ss58Decode(params.recipientAddress).pubKey;
final pubKey = AddressUtils.addressToPubKeyHex(params.recipientAddress);

_accountTo = AccountData()
..pubKey = pubKey
Expand Down
4 changes: 3 additions & 1 deletion app/lib/page/network_select_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import 'package:encointer_wallet/store/app.dart';
import 'package:encointer_wallet/store/settings.dart';
import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/l10n/l10.dart';
import 'package:ew_keyring/ew_keyring.dart';

class NetworkSelectPage extends StatefulWidget {
const NetworkSelectPage({super.key});
Expand Down Expand Up @@ -100,7 +101,8 @@ class _NetworkSelectPageState extends State<NetworkSelectPage> {
final accounts = <AccountData>[appStore.account.currentAccount, ...appStore.account.optionalAccounts];

res.addAll(accounts.map((accountData) {
final address = Fmt.ss58Encode(accountData.pubKey, prefix: appStore.settings.endpoint.ss58 ?? 42);
final address =
AddressUtils.pubKeyHexToAddress(accountData.pubKey, prefix: appStore.settings.endpoint.ss58 ?? 42);

return Card(
shape: RoundedRectangleBorder(
Expand Down
4 changes: 3 additions & 1 deletion app/lib/page/profile/account/account_manage_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import 'package:encointer_wallet/utils/format.dart';
import 'package:encointer_wallet/utils/input_validation.dart';
import 'package:encointer_wallet/l10n/l10.dart';
import 'package:encointer_wallet/utils/ui.dart';
import 'package:ew_keyring/ew_keyring.dart';
import 'package:ew_test_keys/ew_test_keys.dart';

class AccountManagePage extends StatefulWidget {
Expand Down Expand Up @@ -150,7 +151,8 @@ class _AccountManagePageState extends State<AccountManagePage> {

final accountToBeEditedPubKey = ModalRoute.of(context)!.settings.arguments as String?;
final accountToBeEdited = store.account.getAccountData(accountToBeEditedPubKey);
final addressSS58 = Fmt.ss58Encode(accountToBeEditedPubKey!, prefix: store.settings.endpoint.ss58!);
final addressSS58 =
AddressUtils.pubKeyHexToAddress(accountToBeEditedPubKey!, prefix: store.settings.endpoint.ss58!);

_nameCtrl = TextEditingController(text: accountToBeEdited.name);
_nameCtrl!.selection = TextSelection.fromPosition(TextPosition(offset: _nameCtrl!.text.length));
Expand Down
Loading

0 comments on commit 08942bb

Please sign in to comment.