Fixes for Haven

This commit is contained in:
M 2022-03-10 13:59:07 +03:00
parent 4fed6fd145
commit 27bdf51101
19 changed files with 131 additions and 59 deletions

View file

@ -23,7 +23,8 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> {
CryptoCurrency.usdt, CryptoCurrency.usdt,
CryptoCurrency.usdterc20, CryptoCurrency.usdterc20,
CryptoCurrency.xlm, CryptoCurrency.xlm,
CryptoCurrency.xrp CryptoCurrency.xrp,
CryptoCurrency.xhv
]; ];
static const xmr = CryptoCurrency(title: 'XMR', raw: 0); static const xmr = CryptoCurrency(title: 'XMR', raw: 0);
static const ada = CryptoCurrency(title: 'ADA', raw: 1); static const ada = CryptoCurrency(title: 'ADA', raw: 1);

View file

@ -98,7 +98,7 @@ CryptoCurrency walletTypeToCryptoCurrency(WalletType type) {
case WalletType.litecoin: case WalletType.litecoin:
return CryptoCurrency.ltc; return CryptoCurrency.ltc;
case WalletType.haven: case WalletType.haven:
return CryptoCurrency.xmr; return CryptoCurrency.xhv;
default: default:
return null; return null;
} }

View file

@ -353,7 +353,7 @@ abstract class HavenWalletBase extends WalletBase<MoneroBalance,
walletAddresses.accountList.update(); walletAddresses.accountList.update();
} }
if (blocksLeft < 100) { if (blocksLeft < 1000) {
await _askForUpdateTransactionHistory(); await _askForUpdateTransactionHistory();
_askForUpdateBalance(); _askForUpdateBalance();
walletAddresses.accountList.update(); walletAddresses.accountList.update();

View file

@ -1,4 +1,5 @@
import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/haven/haven.dart';
import 'package:cake_wallet/core/validator.dart'; import 'package:cake_wallet/core/validator.dart';
import 'package:cake_wallet/entities/mnemonic_item.dart'; import 'package:cake_wallet/entities/mnemonic_item.dart';
import 'package:cw_core/wallet_type.dart'; import 'package:cw_core/wallet_type.dart';
@ -21,6 +22,8 @@ class SeedValidator extends Validator<MnemonicItem> {
return getBitcoinWordList(language); return getBitcoinWordList(language);
case WalletType.monero: case WalletType.monero:
return monero.getMoneroWordList(language); return monero.getMoneroWordList(language);
case WalletType.haven:
return haven.getMoneroWordList(language);
default: default:
return []; return [];
} }

View file

@ -10,6 +10,12 @@ Future<void> updateHavenRate(FiatConversionStore fiatConversionStore) async {
final cur = CryptoCurrency.fromString(row.getAssetType()); final cur = CryptoCurrency.fromString(row.getAssetType());
final baseRate = moneroAmountToDouble(amount: base.getRate()); final baseRate = moneroAmountToDouble(amount: base.getRate());
final rowRate = moneroAmountToDouble(amount: row.getRate()); final rowRate = moneroAmountToDouble(amount: row.getRate());
if (cur == CryptoCurrency.xusd) {
fiatConversionStore.prices[cur] = rowRate;
return;
}
fiatConversionStore.prices[cur] = baseRate * rowRate; fiatConversionStore.prices[cur] = baseRate * rowRate;
}); });
} }

View file

@ -53,7 +53,7 @@ void startCurrentWalletChangeReaction(AppStore appStore,
wallet) async { wallet) async {
try { try {
final node = settingsStore.getCurrentNode(wallet.type); final node = settingsStore.getCurrentNode(wallet.type);
startWalletSyncStatusChangeReaction(wallet); startWalletSyncStatusChangeReaction(wallet, fiatConversionStore);
startCheckConnectionReaction(wallet, settingsStore); startCheckConnectionReaction(wallet, settingsStore);
await getIt await getIt
.get<SharedPreferences>() .get<SharedPreferences>()

View file

@ -1,5 +1,8 @@
import 'package:cake_wallet/di.dart'; import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/entities/update_haven_rate.dart';
import 'package:cake_wallet/entities/wake_lock.dart'; import 'package:cake_wallet/entities/wake_lock.dart';
import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:cw_core/transaction_history.dart'; import 'package:cw_core/transaction_history.dart';
import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_base.dart';
@ -12,14 +15,18 @@ ReactionDisposer _onWalletSyncStatusChangeReaction;
void startWalletSyncStatusChangeReaction( void startWalletSyncStatusChangeReaction(
WalletBase<Balance, TransactionHistoryBase<TransactionInfo>, WalletBase<Balance, TransactionHistoryBase<TransactionInfo>,
TransactionInfo> TransactionInfo> wallet,
wallet) { FiatConversionStore fiatConversionStore) {
final _wakeLock = getIt.get<WakeLock>(); final _wakeLock = getIt.get<WakeLock>();
_onWalletSyncStatusChangeReaction?.reaction?.dispose(); _onWalletSyncStatusChangeReaction?.reaction?.dispose();
_onWalletSyncStatusChangeReaction = _onWalletSyncStatusChangeReaction =
reaction((_) => wallet.syncStatus, (SyncStatus status) async { reaction((_) => wallet.syncStatus, (SyncStatus status) async {
if (status is ConnectedSyncStatus) { if (status is ConnectedSyncStatus) {
await wallet.startSync(); await wallet.startSync();
if (wallet.type == WalletType.haven) {
await updateHavenRate(fiatConversionStore);
}
} }
if (status is SyncingSyncStatus) { if (status is SyncingSyncStatus) {
await _wakeLock.enableWake(); await _wakeLock.enableWake();

View file

@ -224,6 +224,9 @@ class ContactListPage extends BasePage {
case CryptoCurrency.xrp: case CryptoCurrency.xrp:
image = Image.asset('assets/images/xrp.png', height: 24, width: 24); image = Image.asset('assets/images/xrp.png', height: 24, width: 24);
break; break;
case CryptoCurrency.xhv:
image = Image.asset('assets/images/haven_logo.png', height: 24, width: 24);
break;
default: default:
image = null; image = null;
} }

View file

@ -146,13 +146,13 @@ class DashboardPage extends BasePage {
image: exchangeImage, image: exchangeImage,
title: S.of(context).exchange, title: S.of(context).exchange,
route: Routes.exchange), route: Routes.exchange),
if (!isMoneroOnly) if (!isMoneroOnly && !isHaven)
ActionButton( ActionButton(
image: buyImage, image: buyImage,
title: S.of(context).buy, title: S.of(context).buy,
onClick: () async => await _onClickBuyButton(context), onClick: () async => await _onClickBuyButton(context),
), ),
if (!isMoneroOnly) if (!isMoneroOnly && !isHaven)
ActionButton( ActionButton(
image: sellImage, image: sellImage,
title: S.of(context).sell, title: S.of(context).sell,

View file

@ -130,7 +130,8 @@ class WalletRestoreFromSeedFormState extends State<WalletRestoreFromSeedForm> {
BlockchainHeightWidget( BlockchainHeightWidget(
focusNode: widget.blockHeightFocusNode, focusNode: widget.blockHeightFocusNode,
key: blockchainHeightKey, key: blockchainHeightKey,
onHeightOrDateEntered: widget.onHeightOrDateEntered) onHeightOrDateEntered: widget.onHeightOrDateEntered,
hasDatePicker: widget.type == WalletType.monero)
])); ]));
} }

View file

@ -215,7 +215,7 @@ class WalletRestorePage extends BasePage {
.text .text
.split(' '); .split(' ');
if (walletRestoreViewModel.type == WalletType.monero && if ((walletRestoreViewModel.type == WalletType.monero || walletRestoreViewModel.type == WalletType.haven) &&
seedWords.length != WalletRestoreViewModelBase.moneroSeedMnemonicLength) { seedWords.length != WalletRestoreViewModelBase.moneroSeedMnemonicLength) {
return false; return false;
} }

View file

@ -255,7 +255,7 @@ class SendPage extends BasePage {
padding: EdgeInsets.only(bottom: 12), padding: EdgeInsets.only(bottom: 12),
child: PrimaryButton( child: PrimaryButton(
onPressed: () => presentCurrencyPicker(context), onPressed: () => presentCurrencyPicker(context),
text: 'Change currency (${sendViewModel.selectedCryptoCurrency})', text: 'Change your asset (${sendViewModel.selectedCryptoCurrency})',
color: Colors.transparent, color: Colors.transparent,
textColor: Theme.of(context) textColor: Theme.of(context)
.accentTextTheme .accentTextTheme

View file

@ -391,7 +391,7 @@ class SendCardState extends State<SendCard>
.toString() + .toString() +
' ' + ' ' +
sendViewModel sendViewModel
.currency.title, .selectedCryptoCurrency.toString(),
style: TextStyle( style: TextStyle(
fontSize: 12, fontSize: 12,
fontWeight: fontWeight:

View file

@ -7,12 +7,13 @@ import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
class BlockchainHeightWidget extends StatefulWidget { class BlockchainHeightWidget extends StatefulWidget {
BlockchainHeightWidget({GlobalKey key, this.onHeightChange, this.focusNode, BlockchainHeightWidget({GlobalKey key, this.onHeightChange, this.focusNode,
this.onHeightOrDateEntered}) this.onHeightOrDateEntered, this.hasDatePicker})
: super(key: key); : super(key: key);
final Function(int) onHeightChange; final Function(int) onHeightChange;
final Function(bool) onHeightOrDateEntered; final Function(bool) onHeightOrDateEntered;
final FocusNode focusNode; final FocusNode focusNode;
final bool hasDatePicker;
@override @override
State<StatefulWidget> createState() => BlockchainHeightState(); State<StatefulWidget> createState() => BlockchainHeightState();
@ -67,43 +68,45 @@ class BlockchainHeightState extends State<BlockchainHeightWidget> {
))) )))
], ],
), ),
Padding( if (widget.hasDatePicker) ...[
padding: EdgeInsets.only(top: 15, bottom: 15), Padding(
child: Text( padding: EdgeInsets.only(top: 15, bottom: 15),
S.of(context).widgets_or, child: Text(
style: TextStyle( S.of(context).widgets_or,
fontSize: 16.0, style: TextStyle(
fontWeight: FontWeight.w500, fontSize: 16.0,
color: Theme.of(context).primaryTextTheme.title.color), fontWeight: FontWeight.w500,
), color: Theme.of(context).primaryTextTheme.title.color),
),
Row(
children: <Widget>[
Flexible(
child: Container(
child: InkWell(
onTap: () => _selectDate(context),
child: IgnorePointer(
child: BaseTextFormField(
controller: dateController,
hintText: S.of(context).widgets_restore_from_date,
)),
),
))
],
),
Padding(
padding: EdgeInsets.only(left: 40, right: 40, top: 24),
child: Text(
S.of(context).restore_from_date_or_blockheight,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.normal,
color: Theme.of(context).hintColor
), ),
), ),
) Row(
children: <Widget>[
Flexible(
child: Container(
child: InkWell(
onTap: () => _selectDate(context),
child: IgnorePointer(
child: BaseTextFormField(
controller: dateController,
hintText: S.of(context).widgets_restore_from_date,
)),
),
))
],
),
Padding(
padding: EdgeInsets.only(left: 40, right: 40, top: 24),
child: Text(
S.of(context).restore_from_date_or_blockheight,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.normal,
color: Theme.of(context).hintColor
),
),
)
]
], ],
); );
} }

View file

@ -41,7 +41,8 @@ abstract class NodeCreateOrEditViewModelBase with Store {
bool get isReady => bool get isReady =>
(address?.isNotEmpty ?? false) && (port?.isNotEmpty ?? false); (address?.isNotEmpty ?? false) && (port?.isNotEmpty ?? false);
bool get hasAuthCredentials => _wallet.type == WalletType.monero; bool get hasAuthCredentials => _wallet.type == WalletType.monero ||
_wallet.type == WalletType.haven;
String get uri { String get uri {
var uri = address; var uri = address;

View file

@ -1,6 +1,7 @@
import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart'; import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart';
import 'package:cake_wallet/entities/parse_address_from_domain.dart'; import 'package:cake_wallet/entities/parse_address_from_domain.dart';
import 'package:cake_wallet/entities/parsed_address.dart'; import 'package:cake_wallet/entities/parsed_address.dart';
import 'package:cake_wallet/haven/haven.dart';
import 'package:cake_wallet/src/screens/send/widgets/extract_address_from_parsed.dart'; import 'package:cake_wallet/src/screens/send/widgets/extract_address_from_parsed.dart';
import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/crypto_currency.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -77,6 +78,9 @@ abstract class OutputBase with Store {
_amount = _amount =
bitcoin.formatterStringDoubleToBitcoinAmount(_cryptoAmount); bitcoin.formatterStringDoubleToBitcoinAmount(_cryptoAmount);
break; break;
case WalletType.haven:
_amount = haven.formatterMoneroParseAmount(amount: _cryptoAmount);
break;
default: default:
break; break;
} }
@ -106,6 +110,10 @@ abstract class OutputBase with Store {
if (_wallet.type == WalletType.monero) { if (_wallet.type == WalletType.monero) {
return monero.formatterMoneroAmountToDouble(amount: fee); return monero.formatterMoneroAmountToDouble(amount: fee);
} }
if (_wallet.type == WalletType.haven) {
return haven.formatterMoneroAmountToDouble(amount: fee);
}
} catch (e) { } catch (e) {
print(e.toString()); print(e.toString());
} }
@ -208,6 +216,9 @@ abstract class OutputBase with Store {
case WalletType.litecoin: case WalletType.litecoin:
maximumFractionDigits = 8; maximumFractionDigits = 8;
break; break;
case WalletType.haven:
maximumFractionDigits = 12;
break;
default: default:
break; break;
} }

View file

@ -24,6 +24,7 @@ import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/view_model/send/send_view_model_state.dart'; import 'package:cake_wallet/view_model/send/send_view_model_state.dart';
import 'package:cake_wallet/entities/parsed_address.dart'; import 'package:cake_wallet/entities/parsed_address.dart';
import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/haven/haven.dart';
part 'send_view_model.g.dart'; part 'send_view_model.g.dart';
@ -225,6 +226,11 @@ abstract class SendViewModelBase with Store {
return monero.createMoneroTransactionCreationCredentials( return monero.createMoneroTransactionCreationCredentials(
outputs: outputs, priority: priority); outputs: outputs, priority: priority);
case WalletType.haven:
final priority = _settingsStore.priority[_wallet.type];
return haven.createHavenTransactionCreationCredentials(
outputs: outputs, priority: priority);
default: default:
return null; return null;
} }

View file

@ -5,6 +5,7 @@ import 'package:cw_core/wallet_base.dart';
import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart'; import 'package:cake_wallet/src/screens/transaction_details/standart_list_item.dart';
import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/haven/haven.dart';
part 'wallet_keys_view_model.g.dart'; part 'wallet_keys_view_model.g.dart';
@ -29,6 +30,22 @@ abstract class WalletKeysViewModelBase with Store {
]); ]);
} }
if (wallet.type == WalletType.haven) {
final keys = haven.getKeys(wallet);
items.addAll([
StandartListItem(
title: S.current.spend_key_public, value: keys['publicSpendKey']),
StandartListItem(
title: S.current.spend_key_private, value: keys['privateSpendKey']),
StandartListItem(
title: S.current.view_key_public, value: keys['publicViewKey']),
StandartListItem(
title: S.current.view_key_private, value: keys['privateViewKey']),
StandartListItem(title: S.current.wallet_seed, value: wallet.seed),
]);
}
if (wallet.type == WalletType.bitcoin || wallet.type == WalletType.litecoin) { if (wallet.type == WalletType.bitcoin || wallet.type == WalletType.litecoin) {
final keys = bitcoin.getWalletKeys(wallet); final keys = bitcoin.getWalletKeys(wallet);

View file

@ -65,7 +65,7 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
case WalletType.monero: case WalletType.monero:
return monero.createMoneroRestoreWalletFromSeedCredentials( return monero.createMoneroRestoreWalletFromSeedCredentials(
name: name, name: name,
height: height, height: height ?? 0,
mnemonic: seed, mnemonic: seed,
password: password); password: password);
case WalletType.bitcoin: case WalletType.bitcoin:
@ -81,7 +81,7 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
case WalletType.haven: case WalletType.haven:
return haven.createHavenRestoreWalletFromSeedCredentials( return haven.createHavenRestoreWalletFromSeedCredentials(
name: name, name: name,
height: height, height: height ?? 0,
mnemonic: seed, mnemonic: seed,
password: password); password: password);
default: default:
@ -94,14 +94,27 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
final spendKey = options['spendKey'] as String; final spendKey = options['spendKey'] as String;
final address = options['address'] as String; final address = options['address'] as String;
return monero.createMoneroRestoreWalletFromKeysCredentials( if (type == WalletType.monero) {
name: name, return monero.createMoneroRestoreWalletFromKeysCredentials(
height: height, name: name,
spendKey: spendKey, height: height,
viewKey: viewKey, spendKey: spendKey,
address: address, viewKey: viewKey,
password: password, address: address,
language: 'English'); password: password,
language: 'English');
}
if (type == WalletType.haven) {
return haven.createHavenRestoreWalletFromKeysCredentials(
name: name,
height: height,
spendKey: spendKey,
viewKey: viewKey,
address: address,
password: password,
language: 'English');
}
} }
return null; return null;