Btc address types (#1263)

* inital migration changes

* feat: rest of changes

* minor fix [skip ci]

* fix: P2wshAddress & wallet address index

* fix: address review comments

* fix: address type restore

* feat: add testnet

* Fix review comments
Remove bitcoin_base from cw_core

* Fix address not matching selected type on start

* remove un-necessary parameter [skip ci]

* Remove bitcoin specific code from main lib
Fix possible runtime exception from list wrong access

* Minor fix

* fix: fixes for Testnet

* fix: bitcoin receive option dependency breaks monerocom

* Fix issues when building Monero.com

* feat: Transaction Builder changes

* fix: discover addresses, testnet restoring, duplicate unspent coins, and taproot address vs schnorr sig tweak

* fix: remove print

* feat: improve error when failed broadcast response

* feat: create fish shell env script

* fix: unmodifiable maps

* fix: build

* fix: build

* fix: computed observable side effect bug

* feat: add nix script for android build_all

* fix: wrong keypairs used for signing

* fix: wrong addresses when using fromScriptPubKey scripts

* fix(actual commit): testnet tx expanded + wrong addresses when using fromScriptPubKey scripts (update bitcoin_base deps)

* fix: self-send [skip ci]

* fix: p2wsh

* fix: testnet fees

* New versions

* Update macos build number
Minor UI fix

* fix: use new bitcoin_base ref, fix tx list wrong hex value & refactor hidden vs hd use

- if always use sideHd for isHidden, it is easier to simplify the functions instead of passing both which can be error prone
- (ps: now this could probably be changed, for example from isHidden to isChange since with address list we now see "hidden" addresses)

* Fix if condition to handle litecoin case

* fix: self-send, change address was always making direction incoming

* refactor: improve estimation function, add more inputs if balance missing

* fix: new bitcoin_base update, fixes script issues

* Update evm chain wallet service arguments

* Fix translation [skip ci]

* Fix translation [skip ci]

* Update strings_fr.arb [skip ci]

* fix: async isChange function not being awaited, refactor to reduce looping into a single place

* fix: _address vs address, missing p2sh

* fix: minor mistake in storing p2sh page type [skip ci]

* refactor: use already matched addresses property

* feat: improved perfomance for fetching transaction histories

* feat: continue perfomance change, improve address discovery only to last address by type with history

* fix: make sure transaction list is sorted by date

* refactor: isTestnet only for bitcoin

* fix: walletInfo type null case

* fix: deprecated p2pk

* refactor: make condition more readable

* refactor: remove unnecessary Str variant

* refactor: make condition more readable

* fix: infinite loop possible

* Revert removing isTestnet from other wallets [skip ci]

* refactor: rename addresses when matched by receive type

* Make the beta build [skip ci]
Remove app_env.fish

---------

Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>
This commit is contained in:
Rafael
2024-02-23 18:13:30 +02:00
committed by GitHub
co-authored by OmarHatem
parent 109bba4301
commit a3a35f05e1
91 changed files with 1851 additions and 1333 deletions
@@ -5,7 +5,8 @@ import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/screens/monero_accounts/monero_account_list_page.dart';
import 'package:cake_wallet/anonpay/anonpay_donation_link_info.dart';
import 'package:cake_wallet/entities/preferences_key.dart';
import 'package:cake_wallet/entities/receive_page_option.dart';
import 'package:cw_core/receive_page_option.dart';
import 'package:cw_bitcoin/bitcoin_receive_page_option.dart';
import 'package:cake_wallet/src/screens/dashboard/widgets/present_receive_option_picker.dart';
import 'package:cake_wallet/src/widgets/gradient_background.dart';
import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
@@ -27,6 +28,7 @@ import 'package:keyboard_actions/keyboard_actions.dart';
import 'package:mobx/mobx.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
import 'package:bitcoin_base/bitcoin_base.dart';
class AddressPage extends BasePage {
AddressPage({
@@ -69,7 +71,7 @@ class AddressPage extends BasePage {
size: 16,
);
final _closeButton =
currentTheme.type == ThemeType.dark ? closeButtonImageDarkTheme : closeButtonImage;
currentTheme.type == ThemeType.dark ? closeButtonImageDarkTheme : closeButtonImage;
bool isMobileView = responsiveLayoutUtil.shouldRenderMobileUI;
@@ -163,11 +165,10 @@ class AddressPage extends BasePage {
return SelectButton(
text: addressListViewModel.buttonTitle,
onTap: () async => dashboardViewModel.isAutoGenerateSubaddressesEnabled &&
(WalletType.monero == addressListViewModel.wallet.type ||
WalletType.haven == addressListViewModel.wallet.type)
(WalletType.monero == addressListViewModel.wallet.type ||
WalletType.haven == addressListViewModel.wallet.type)
? await showPopUp<void>(
context: context,
builder: (_) => getIt.get<MoneroAccountListPage>())
context: context, builder: (_) => getIt.get<MoneroAccountListPage>())
: Navigator.of(context).pushNamed(Routes.receive),
textColor: Theme.of(context).extension<SyncIndicatorTheme>()!.textColor,
color: Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor,
@@ -229,6 +230,21 @@ class AddressPage extends BasePage {
);
}
break;
case BitcoinReceivePageOption.p2pkh:
addressListViewModel.setAddressType(P2pkhAddressType.p2pkh);
break;
case BitcoinReceivePageOption.p2sh:
addressListViewModel.setAddressType(P2shAddressType.p2wpkhInP2sh);
break;
case BitcoinReceivePageOption.p2wpkh:
addressListViewModel.setAddressType(SegwitAddresType.p2wpkh);
break;
case BitcoinReceivePageOption.p2tr:
addressListViewModel.setAddressType(SegwitAddresType.p2tr);
break;
case BitcoinReceivePageOption.p2wsh:
addressListViewModel.setAddressType(SegwitAddresType.p2wsh);
break;
default:
}
});
@@ -1,3 +1,4 @@
import 'package:cake_wallet/entities/default_settings_migration.dart';
import 'package:cake_wallet/entities/exchange_api_mode.dart';
import 'package:cake_wallet/entities/fiat_api_mode.dart';
import 'package:cake_wallet/entities/seed_phrase_length.dart';
@@ -11,6 +12,7 @@ import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.
import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart';
import 'package:cake_wallet/view_model/seed_type_view_model.dart';
import 'package:cake_wallet/view_model/settings/choices_list_item.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:flutter/material.dart';
import 'package:cake_wallet/generated/i18n.dart';
@@ -19,7 +21,7 @@ import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
class AdvancedPrivacySettingsPage extends BasePage {
AdvancedPrivacySettingsPage(
AdvancedPrivacySettingsPage(this.useTestnet, this.toggleUseTestnet,
this.advancedPrivacySettingsViewModel, this.nodeViewModel, this.seedTypeViewModel);
final AdvancedPrivacySettingsViewModel advancedPrivacySettingsViewModel;
@@ -29,13 +31,16 @@ class AdvancedPrivacySettingsPage extends BasePage {
@override
String get title => S.current.privacy_settings;
final bool useTestnet;
final Function(bool? val) toggleUseTestnet;
@override
Widget body(BuildContext context) => AdvancedPrivacySettingsBody(
Widget body(BuildContext context) => AdvancedPrivacySettingsBody(useTestnet, toggleUseTestnet,
advancedPrivacySettingsViewModel, nodeViewModel, seedTypeViewModel);
}
class AdvancedPrivacySettingsBody extends StatefulWidget {
const AdvancedPrivacySettingsBody(
const AdvancedPrivacySettingsBody(this.useTestnet, this.toggleUseTestnet,
this.privacySettingsViewModel, this.nodeViewModel, this.seedTypeViewModel,
{Key? key})
: super(key: key);
@@ -44,6 +49,9 @@ class AdvancedPrivacySettingsBody extends StatefulWidget {
final NodeCreateOrEditViewModel nodeViewModel;
final SeedTypeViewModel seedTypeViewModel;
final bool useTestnet;
final Function(bool? val) toggleUseTestnet;
@override
_AdvancedPrivacySettingsBodyState createState() => _AdvancedPrivacySettingsBodyState();
}
@@ -52,9 +60,14 @@ class _AdvancedPrivacySettingsBodyState extends State<AdvancedPrivacySettingsBod
_AdvancedPrivacySettingsBodyState();
final _formKey = GlobalKey<FormState>();
bool? testnetValue;
@override
Widget build(BuildContext context) {
if (testnetValue == null && widget.useTestnet != null) {
testnetValue = widget.useTestnet;
}
return Container(
padding: EdgeInsets.only(top: 24),
child: ScrollableWithBottomSection(
@@ -125,6 +138,19 @@ class _AdvancedPrivacySettingsBodyState extends State<AdvancedPrivacySettingsBod
),
);
}),
if (widget.privacySettingsViewModel.type == WalletType.bitcoin)
Builder(builder: (_) {
final val = testnetValue!;
return SettingsSwitcherCell(
title: S.current.use_testnet,
value: val,
onValueChange: (_, __) {
setState(() {
testnetValue = !val;
});
widget.toggleUseTestnet!.call(testnetValue);
});
}),
],
),
bottomSectionPadding: EdgeInsets.all(24),
@@ -137,6 +163,13 @@ class _AdvancedPrivacySettingsBodyState extends State<AdvancedPrivacySettingsBod
return;
}
widget.nodeViewModel.save();
} else if (testnetValue == true) {
// TODO: add type (mainnet/testnet) to Node class so when switching wallets the node can be switched to a matching type
// Currently this is so you can create a working testnet wallet but you need to keep switching back the node if you use multiple wallets at once
widget.nodeViewModel.address = publicBitcoinTestnetElectrumAddress;
widget.nodeViewModel.port = publicBitcoinTestnetElectrumPort;
widget.nodeViewModel.save();
}
@@ -40,7 +40,9 @@ class NewWalletPage extends BasePage {
@override
Widget body(BuildContext context) => WalletNameForm(
_walletNewVM, currentTheme.type == ThemeType.dark ? walletNameImage : walletNameLightImage, _seedTypeViewModel);
_walletNewVM,
currentTheme.type == ThemeType.dark ? walletNameImage : walletNameLightImage,
_seedTypeViewModel);
}
class WalletNameForm extends StatefulWidget {
@@ -187,7 +189,6 @@ class _WalletNameFormState extends State<WalletNameForm> {
),
),
),
if (_walletNewVM.hasLanguageSelector) ...[
if (_walletNewVM.hasSeedType) ...[
Observer(
@@ -222,7 +223,7 @@ class _WalletNameFormState extends State<WalletNameForm> {
),
),
)
]
],
],
),
),
@@ -245,8 +246,11 @@ class _WalletNameFormState extends State<WalletNameForm> {
const SizedBox(height: 25),
GestureDetector(
onTap: () {
Navigator.of(context)
.pushNamed(Routes.advancedPrivacySettings, arguments: _walletNewVM.type);
Navigator.of(context).pushNamed(Routes.advancedPrivacySettings, arguments: {
"type": _walletNewVM.type,
"useTestnet": _walletNewVM.useTestnet,
"toggleTestnet": _walletNewVM.toggleUseTestnet
});
},
child: Text(S.of(context).advanced_settings),
),
@@ -4,7 +4,7 @@ import 'package:cake_wallet/anonpay/anonpay_donation_link_info.dart';
import 'package:cake_wallet/core/execution_state.dart';
import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/entities/preferences_key.dart';
import 'package:cake_wallet/entities/receive_page_option.dart';
import 'package:cw_core/receive_page_option.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/dashboard/widgets/present_receive_option_picker.dart';
import 'package:cake_wallet/src/screens/receive/widgets/anonpay_input_form.dart';
@@ -1,7 +1,7 @@
import 'package:cake_wallet/anonpay/anonpay_info_base.dart';
import 'package:cake_wallet/anonpay/anonpay_invoice_info.dart';
import 'package:cake_wallet/entities/qr_view_data.dart';
import 'package:cake_wallet/entities/receive_page_option.dart';
import 'package:cw_core/receive_page_option.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
@@ -210,8 +210,12 @@ class WalletRestorePage extends BasePage {
const SizedBox(height: 25),
GestureDetector(
onTap: () {
Navigator.of(context).pushNamed(Routes.advancedPrivacySettings,
arguments: walletRestoreViewModel.type);
Navigator.of(context)
.pushNamed(Routes.advancedPrivacySettings, arguments: {
'type': walletRestoreViewModel.type,
'useTestnet': walletRestoreViewModel.useTestnet,
'toggleTestnet': walletRestoreViewModel.toggleUseTestnet
});
},
child: Text(S.of(context).advanced_settings),
),