mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-11-16 17:27:37 +00:00
CAKE-345 | changed bitcoin transaction credentials; reworked createTransaction() method in the electrum_wallet.dart for batch sending; fixed exchange_trade_page.dart and send_page.dart; reworked confirm_sending_alert.dart; fixed _credenials() and commitTransaction() methods in the send_view_model.dart
This commit is contained in:
parent
e6cfa2b636
commit
7b2d89f96f
20 changed files with 378 additions and 235 deletions
|
@ -1,9 +1,9 @@
|
|||
import 'package:cake_wallet/bitcoin/bitcoin_transaction_priority.dart';
|
||||
import 'package:cake_wallet/view_model/send/send_item.dart';
|
||||
|
||||
class BitcoinTransactionCredentials {
|
||||
BitcoinTransactionCredentials(this.address, this.amount, this.priority);
|
||||
BitcoinTransactionCredentials(this.sendItemList, this.priority);
|
||||
|
||||
final String address;
|
||||
final String amount;
|
||||
final List<SendItem> sendItemList;
|
||||
BitcoinTransactionPriority priority;
|
||||
}
|
||||
|
|
|
@ -218,20 +218,71 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
|
|||
const minAmount = 546;
|
||||
final transactionCredentials = credentials as BitcoinTransactionCredentials;
|
||||
final inputs = <BitcoinUnspent>[];
|
||||
final sendItemList = transactionCredentials.sendItemList;
|
||||
final allAmountFee =
|
||||
calculateEstimatedFee(transactionCredentials.priority, null);
|
||||
final allAmount = balance.confirmed - allAmountFee;
|
||||
var credentialsAmount = 0;
|
||||
var amount = 0;
|
||||
var fee = 0;
|
||||
final credentialsAmount = transactionCredentials.amount != null
|
||||
? stringDoubleToBitcoinAmount(transactionCredentials.amount)
|
||||
: 0;
|
||||
final amount = transactionCredentials.amount == null ||
|
||||
allAmount - credentialsAmount < minAmount
|
||||
? allAmount
|
||||
: credentialsAmount;
|
||||
|
||||
if (sendItemList.length > 1) {
|
||||
final sendAllItems = sendItemList.where((item) => item.sendAll).toList();
|
||||
|
||||
if (sendAllItems?.isNotEmpty ?? false) {
|
||||
throw BitcoinTransactionWrongBalanceException();
|
||||
}
|
||||
|
||||
final nullAmountItems = sendItemList.where((item) =>
|
||||
stringDoubleToBitcoinAmount(item.cryptoAmount.replaceAll(',', '.')) <= 0)
|
||||
.toList();
|
||||
|
||||
if (nullAmountItems?.isNotEmpty ?? false) {
|
||||
throw BitcoinTransactionWrongBalanceException();
|
||||
}
|
||||
|
||||
credentialsAmount = sendItemList.fold(0, (previousValue, element) =>
|
||||
previousValue + stringDoubleToBitcoinAmount(
|
||||
element.cryptoAmount.replaceAll(',', '.')));
|
||||
|
||||
amount = allAmount - credentialsAmount < minAmount
|
||||
? allAmount
|
||||
: credentialsAmount;
|
||||
|
||||
fee = amount == allAmount
|
||||
? allAmountFee
|
||||
: calculateEstimatedFee(transactionCredentials.priority, amount,
|
||||
outputsCount: sendItemList.length + 1);
|
||||
} else {
|
||||
final sendItem = sendItemList.first;
|
||||
|
||||
credentialsAmount = !sendItem.sendAll
|
||||
? stringDoubleToBitcoinAmount(
|
||||
sendItem.cryptoAmount.replaceAll(',', '.'))
|
||||
: 0;
|
||||
|
||||
amount = sendItem.sendAll || allAmount - credentialsAmount < minAmount
|
||||
? allAmount
|
||||
: credentialsAmount;
|
||||
|
||||
fee = sendItem.sendAll || amount == allAmount
|
||||
? allAmountFee
|
||||
: calculateEstimatedFee(transactionCredentials.priority, amount);
|
||||
}
|
||||
|
||||
if (fee == 0) {
|
||||
throw BitcoinTransactionWrongBalanceException();
|
||||
}
|
||||
|
||||
final totalAmount = amount + fee;
|
||||
|
||||
if (totalAmount > balance.confirmed) {
|
||||
throw BitcoinTransactionWrongBalanceException();
|
||||
}
|
||||
|
||||
final txb = bitcoin.TransactionBuilder(network: networkType);
|
||||
final changeAddress = address;
|
||||
var leftAmount = amount;
|
||||
var leftAmount = totalAmount;
|
||||
var totalInputAmount = 0;
|
||||
|
||||
if (_unspent.isEmpty) {
|
||||
|
@ -252,16 +303,6 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
|
|||
throw BitcoinTransactionNoInputsException();
|
||||
}
|
||||
|
||||
final totalAmount = amount + fee;
|
||||
fee = transactionCredentials.amount != null
|
||||
? feeAmountForPriority(transactionCredentials.priority, inputs.length,
|
||||
amount == allAmount ? 1 : 2)
|
||||
: allAmountFee;
|
||||
|
||||
if (totalAmount > balance.confirmed) {
|
||||
throw BitcoinTransactionWrongBalanceException();
|
||||
}
|
||||
|
||||
if (amount <= 0 || totalInputAmount < amount) {
|
||||
throw BitcoinTransactionWrongBalanceException();
|
||||
}
|
||||
|
@ -282,11 +323,18 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
|
|||
}
|
||||
});
|
||||
|
||||
txb.addOutput(
|
||||
addressToOutputScript(transactionCredentials.address, networkType),
|
||||
amount);
|
||||
sendItemList.forEach((item) {
|
||||
final _amount = item.sendAll
|
||||
? amount
|
||||
: stringDoubleToBitcoinAmount(item.cryptoAmount.replaceAll(',', '.'));
|
||||
|
||||
final estimatedSize = estimatedTransactionSize(inputs.length, 2);
|
||||
txb.addOutput(
|
||||
addressToOutputScript(item.address, networkType),
|
||||
_amount);
|
||||
});
|
||||
|
||||
final estimatedSize =
|
||||
estimatedTransactionSize(inputs.length, sendItemList.length + 1);
|
||||
final feeAmount = feeRate(transactionCredentials.priority) * estimatedSize;
|
||||
final changeValue = totalInputAmount - amount - feeAmount;
|
||||
|
||||
|
@ -331,7 +379,8 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
|
|||
feeRate(priority) * estimatedTransactionSize(inputsCount, outputsCount);
|
||||
|
||||
@override
|
||||
int calculateEstimatedFee(TransactionPriority priority, int amount) {
|
||||
int calculateEstimatedFee(TransactionPriority priority, int amount,
|
||||
{int outputsCount}) {
|
||||
if (priority is BitcoinTransactionPriority) {
|
||||
int inputsCount = 0;
|
||||
|
||||
|
@ -350,8 +399,10 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
|
|||
inputsCount = _unspent.length;
|
||||
}
|
||||
// If send all, then we have no change value
|
||||
final _outputsCount = outputsCount ?? (amount != null ? 2 : 1);
|
||||
|
||||
return feeAmountForPriority(
|
||||
priority, inputsCount, amount != null ? 2 : 1);
|
||||
priority, inputsCount, _outputsCount);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -262,9 +262,6 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
|
|||
|
||||
if (state is ExecutedSuccessfullyState) {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
final item = widget.exchangeTradeViewModel.sendViewModel
|
||||
.sendItemList.first;
|
||||
|
||||
showPopUp<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
|
@ -388,8 +385,8 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
|
|||
.pendingTransactionFiatAmount +
|
||||
' ' +
|
||||
widget.exchangeTradeViewModel.sendViewModel.fiat.title,
|
||||
recipientTitle: S.of(context).recipient_address,
|
||||
recipientAddress: item.address);
|
||||
sendItemList: widget.exchangeTradeViewModel.sendViewModel
|
||||
.sendItemList);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -266,56 +266,49 @@ class SendPage extends BasePage {
|
|||
EdgeInsets.only(left: 24, right: 24, bottom: 24),
|
||||
bottomSection: Column(
|
||||
children: [
|
||||
PrimaryButton(
|
||||
onPressed: () {
|
||||
sendViewModel.addSendItem();
|
||||
},
|
||||
text: 'Add receiver',
|
||||
color: Colors.green,
|
||||
textColor: Colors.white,
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 12),
|
||||
child: Observer(builder: (_) {
|
||||
return LoadingPrimaryButton(
|
||||
onPressed: () async {
|
||||
if (_formKey.currentState.validate()) {
|
||||
//await sendViewModel.createTransaction();
|
||||
// FIXME: for test only
|
||||
sendViewModel.clearSendItemList();
|
||||
await showPopUp<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertWithOneAction(
|
||||
alertTitle: S.of(context).send,
|
||||
alertContent: S.of(context).send_success(
|
||||
sendViewModel.currency
|
||||
.toString()),
|
||||
buttonText: S.of(context).ok,
|
||||
buttonAction: () => Navigator.of(context).pop());
|
||||
});
|
||||
} else {
|
||||
await showPopUp<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertWithOneAction(
|
||||
alertTitle: S.of(context).error,
|
||||
alertContent: 'Please, check your receivers forms',
|
||||
buttonText: S.of(context).ok,
|
||||
buttonAction: () =>
|
||||
Navigator.of(context).pop());
|
||||
});
|
||||
}
|
||||
},
|
||||
text: S.of(context).send,
|
||||
color: Theme.of(context).accentTextTheme.body2.color,
|
||||
textColor: Colors.white,
|
||||
isLoading: sendViewModel.state is IsExecutingState ||
|
||||
sendViewModel.state is TransactionCommitting,
|
||||
isDisabled: !sendViewModel.isReadyForSend,
|
||||
);
|
||||
if (sendViewModel.isAddReceiverButtonEnabled) Padding(
|
||||
padding: EdgeInsets.only(bottom: 12),
|
||||
child: PrimaryButton(
|
||||
onPressed: () {
|
||||
sendViewModel.addSendItem();
|
||||
},
|
||||
))
|
||||
text: S.of(context).add_receiver,
|
||||
color: Colors.green,
|
||||
textColor: Colors.white,
|
||||
)
|
||||
),
|
||||
Observer(builder: (_) {
|
||||
return LoadingPrimaryButton(
|
||||
onPressed: () async {
|
||||
if (!_formKey.currentState.validate()) {
|
||||
if (sendViewModel.sendItemList.length > 1) {
|
||||
showErrorValidationAlert(context);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
final notValidItems = sendViewModel.sendItemList
|
||||
.where((item) =>
|
||||
item.address.isEmpty || item.cryptoAmount.isEmpty)
|
||||
.toList();
|
||||
|
||||
if (notValidItems?.isNotEmpty ?? false) {
|
||||
showErrorValidationAlert(context);
|
||||
return;
|
||||
}
|
||||
|
||||
await sendViewModel.createTransaction();
|
||||
},
|
||||
text: S.of(context).send,
|
||||
color: Theme.of(context).accentTextTheme.body2.color,
|
||||
textColor: Colors.white,
|
||||
isLoading: sendViewModel.state is IsExecutingState ||
|
||||
sendViewModel.state is TransactionCommitting,
|
||||
isDisabled: !sendViewModel.isReadyForSend,
|
||||
);
|
||||
},
|
||||
)
|
||||
],
|
||||
)),
|
||||
);
|
||||
|
@ -357,8 +350,7 @@ class SendPage extends BasePage {
|
|||
feeValue: sendViewModel.pendingTransaction.feeFormatted,
|
||||
feeFiatAmount: sendViewModel.pendingTransactionFeeFiatAmount
|
||||
+ ' ' + sendViewModel.fiat.title,
|
||||
recipientTitle: S.of(context).recipient_address,
|
||||
recipientAddress: '', // FIXME: sendViewModel.address,
|
||||
sendItemList: sendViewModel.sendItemList,
|
||||
rightButtonText: S.of(context).ok,
|
||||
leftButtonText: S.of(context).cancel,
|
||||
actionRightButton: () {
|
||||
|
@ -408,4 +400,17 @@ class SendPage extends BasePage {
|
|||
final itemCount = controller.page.round();
|
||||
return sendViewModel.sendItemList[itemCount];
|
||||
}
|
||||
|
||||
void showErrorValidationAlert(BuildContext context) async {
|
||||
await showPopUp<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertWithOneAction(
|
||||
alertTitle: S.of(context).error,
|
||||
alertContent: 'Please, check receiver forms',
|
||||
buttonText: S.of(context).ok,
|
||||
buttonAction: () =>
|
||||
Navigator.of(context).pop());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
import 'package:cake_wallet/palette.dart';
|
||||
import 'package:cake_wallet/view_model/send/send_item.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/src/widgets/base_alert_dialog.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
|
||||
class ConfirmSendingAlert extends BaseAlertDialog {
|
||||
ConfirmSendingAlert({
|
||||
|
@ -11,14 +13,18 @@ class ConfirmSendingAlert extends BaseAlertDialog {
|
|||
@required this.fee,
|
||||
@required this.feeValue,
|
||||
@required this.feeFiatAmount,
|
||||
@required this.recipientTitle,
|
||||
@required this.recipientAddress,
|
||||
@required this.sendItemList,
|
||||
@required this.leftButtonText,
|
||||
@required this.rightButtonText,
|
||||
@required this.actionLeftButton,
|
||||
@required this.actionRightButton,
|
||||
this.alertBarrierDismissible = true
|
||||
});
|
||||
}) {
|
||||
itemCount = sendItemList.length;
|
||||
recipientTitle = itemCount > 1
|
||||
? S.current.transaction_details_recipient_address
|
||||
: S.current.recipient_address;
|
||||
}
|
||||
|
||||
final String alertTitle;
|
||||
final String amount;
|
||||
|
@ -27,14 +33,16 @@ class ConfirmSendingAlert extends BaseAlertDialog {
|
|||
final String fee;
|
||||
final String feeValue;
|
||||
final String feeFiatAmount;
|
||||
final String recipientTitle;
|
||||
final String recipientAddress;
|
||||
final List<SendItem> sendItemList;
|
||||
final String leftButtonText;
|
||||
final String rightButtonText;
|
||||
final VoidCallback actionLeftButton;
|
||||
final VoidCallback actionRightButton;
|
||||
final bool alertBarrierDismissible;
|
||||
|
||||
String recipientTitle;
|
||||
int itemCount;
|
||||
|
||||
@override
|
||||
String get titleText => alertTitle;
|
||||
|
||||
|
@ -58,127 +66,181 @@ class ConfirmSendingAlert extends BaseAlertDialog {
|
|||
|
||||
@override
|
||||
Widget content(BuildContext context) {
|
||||
return Column(
|
||||
children: <Widget>[
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
return Container(
|
||||
height: 200,
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Text(
|
||||
amount,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.normal,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
amountValue,
|
||||
amount,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.normal,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
fiatAmountValue,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: PaletteDark.pigeonBlue,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
amountValue,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
fiatAmountValue,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: PaletteDark.pigeonBlue,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 16),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
fee,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.normal,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 16),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
fee,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.normal,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
feeValue,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
feeFiatAmount,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: PaletteDark.pigeonBlue,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
)
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 16),
|
||||
child: Column(
|
||||
children: [
|
||||
Text(
|
||||
feeValue,
|
||||
'$recipientTitle:',
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.normal,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
feeFiatAmount,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: PaletteDark.pigeonBlue,
|
||||
decoration: TextDecoration.none,
|
||||
itemCount > 1
|
||||
? ListView.builder(
|
||||
padding: EdgeInsets.only(top: 0),
|
||||
shrinkWrap: true,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
itemCount: itemCount,
|
||||
itemBuilder: (context, index) {
|
||||
final item = sendItemList[index];
|
||||
final _address = item.address;
|
||||
final _amount =
|
||||
item.cryptoAmount.replaceAll(',', '.');
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 8),
|
||||
child: Text(
|
||||
_address,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: PaletteDark.pigeonBlue,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
)
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 8),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
_amount,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: PaletteDark.pigeonBlue,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
)
|
||||
: Padding(
|
||||
padding: EdgeInsets.only(top: 8),
|
||||
child: Text(
|
||||
sendItemList.first.address,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: PaletteDark.pigeonBlue,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
)
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.fromLTRB(0, 16, 0, 0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
'$recipientTitle:',
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.normal,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 8),
|
||||
child: Text(
|
||||
recipientAddress,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: PaletteDark.pigeonBlue,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
)
|
||||
)
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,30 +1,20 @@
|
|||
import 'package:cake_wallet/bitcoin/bitcoin_amount_format.dart';
|
||||
import 'package:cake_wallet/bitcoin/bitcoin_transaction_priority.dart';
|
||||
import 'package:cake_wallet/bitcoin/electrum_wallet.dart';
|
||||
import 'package:cake_wallet/entities/balance_display_mode.dart';
|
||||
import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart';
|
||||
import 'package:cake_wallet/entities/transaction_description.dart';
|
||||
import 'package:cake_wallet/entities/transaction_priority.dart';
|
||||
import 'package:cake_wallet/monero/monero_amount_format.dart';
|
||||
import 'package:cake_wallet/view_model/send/send_item.dart';
|
||||
import 'package:cake_wallet/view_model/send/send_template_view_model.dart';
|
||||
import 'package:cake_wallet/view_model/settings/settings_view_model.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
import 'package:cake_wallet/entities/openalias_record.dart';
|
||||
import 'package:cake_wallet/entities/template.dart';
|
||||
import 'package:cake_wallet/store/templates/send_template_store.dart';
|
||||
import 'package:cake_wallet/core/template_validator.dart';
|
||||
import 'package:cake_wallet/core/address_validator.dart';
|
||||
import 'package:cake_wallet/core/amount_validator.dart';
|
||||
import 'package:cake_wallet/core/pending_transaction.dart';
|
||||
import 'package:cake_wallet/core/validator.dart';
|
||||
import 'package:cake_wallet/core/wallet_base.dart';
|
||||
import 'package:cake_wallet/core/execution_state.dart';
|
||||
import 'package:cake_wallet/bitcoin/bitcoin_wallet.dart';
|
||||
import 'package:cake_wallet/bitcoin/bitcoin_transaction_credentials.dart';
|
||||
import 'package:cake_wallet/monero/monero_wallet.dart';
|
||||
import 'package:cake_wallet/monero/monero_transaction_creation_credentials.dart';
|
||||
import 'package:cake_wallet/entities/sync_status.dart';
|
||||
import 'package:cake_wallet/entities/crypto_currency.dart';
|
||||
|
@ -35,7 +25,6 @@ import 'package:cake_wallet/entities/wallet_type.dart';
|
|||
import 'package:cake_wallet/store/dashboard/fiat_conversion_store.dart';
|
||||
import 'package:cake_wallet/store/settings_store.dart';
|
||||
import 'package:cake_wallet/view_model/send/send_view_model_state.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
|
||||
part 'send_view_model.g.dart';
|
||||
|
||||
|
@ -138,6 +127,9 @@ abstract class SendViewModelBase with Store {
|
|||
@computed
|
||||
ObservableList<Template> get templates => sendTemplateViewModel.templates;
|
||||
|
||||
@computed
|
||||
bool get isAddReceiverButtonEnabled => _wallet is ElectrumWallet;
|
||||
|
||||
WalletType get walletType => _wallet.type;
|
||||
final WalletBase _wallet;
|
||||
final SettingsStore _settingsStore;
|
||||
|
@ -158,8 +150,18 @@ abstract class SendViewModelBase with Store {
|
|||
|
||||
@action
|
||||
Future<void> commitTransaction() async {
|
||||
final address = ''; // FIXME: get it from item
|
||||
final note = ''; // FIXME: get it from item
|
||||
String address = sendItemList.fold('', (previousValue, item) {
|
||||
return previousValue + item.address + '\n';
|
||||
});
|
||||
|
||||
address = address.trim();
|
||||
|
||||
String note = sendItemList.fold('', (previousValue, item) {
|
||||
return previousValue + item.note + '\n';
|
||||
});
|
||||
|
||||
note = note.trim();
|
||||
|
||||
try {
|
||||
state = TransactionCommitting();
|
||||
await pendingTransaction.commit();
|
||||
|
@ -185,25 +187,23 @@ abstract class SendViewModelBase with Store {
|
|||
_settingsStore.priority[_wallet.type] = priority;
|
||||
|
||||
Object _credentials() {
|
||||
// FIXME: get it from item
|
||||
return null;
|
||||
/*final _amount = cryptoAmount.replaceAll(',', '.');
|
||||
|
||||
switch (_wallet.type) {
|
||||
case WalletType.bitcoin:
|
||||
final amount = !sendAll ? _amount : null;
|
||||
final priority = _settingsStore.priority[_wallet.type];
|
||||
|
||||
return BitcoinTransactionCredentials(
|
||||
address, amount, priority as BitcoinTransactionPriority);
|
||||
sendItemList, priority as BitcoinTransactionPriority);
|
||||
case WalletType.litecoin:
|
||||
final amount = !sendAll ? _amount : null;
|
||||
final priority = _settingsStore.priority[_wallet.type];
|
||||
|
||||
return BitcoinTransactionCredentials(
|
||||
address, amount, priority as BitcoinTransactionPriority);
|
||||
sendItemList, priority as BitcoinTransactionPriority);
|
||||
case WalletType.monero:
|
||||
final amount = !sendAll ? _amount : null;
|
||||
final _item = sendItemList.first;
|
||||
final address = _item.address;
|
||||
final amount = _item.sendAll
|
||||
? null
|
||||
: _item.cryptoAmount.replaceAll(',', '.');
|
||||
final priority = _settingsStore.priority[_wallet.type];
|
||||
|
||||
return MoneroTransactionCreationCredentials(
|
||||
|
@ -213,7 +213,7 @@ abstract class SendViewModelBase with Store {
|
|||
amount: amount);
|
||||
default:
|
||||
return null;
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
String displayFeeRate(dynamic priority) {
|
||||
|
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "Betrag",
|
||||
"transaction_details_fee" : "Gebühr",
|
||||
"transaction_details_copied" : "${title} in die Zwischenablage kopiert",
|
||||
"transaction_details_recipient_address" : "Empfängeradresse",
|
||||
"transaction_details_recipient_address" : "Empfängeradressen",
|
||||
|
||||
|
||||
"wallet_list_title" : "Monero-Wallet",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "Der Wert des Betrags muss größer oder gleich ${minAmount} ${fiatCurrency} sein",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "Wenn diese Brieftasche einen 12-Wort-Seed hat und in Cake erstellt wurde, zahlen Sie KEINE Bitcoins in diese Brieftasche ein. Alle auf diese Wallet übertragenen BTC können verloren gehen. Erstellen Sie eine neue 24-Wort-Wallet (tippen Sie auf das Menü oben rechts, wählen Sie Wallets, wählen Sie Neue Wallet erstellen und dann Bitcoin) und verschieben Sie Ihre BTC SOFORT dorthin. Neue (24-Wort-)BTC-Wallets von Cake sind sicher",
|
||||
"do_not_show_me": "Zeig mir das nicht noch einmal"
|
||||
"do_not_show_me": "Zeig mir das nicht noch einmal",
|
||||
|
||||
"add_receiver" : "Empfänger hinzufügen"
|
||||
}
|
||||
|
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "Amount",
|
||||
"transaction_details_fee" : "Fee",
|
||||
"transaction_details_copied" : "${title} copied to Clipboard",
|
||||
"transaction_details_recipient_address" : "Recipient address",
|
||||
"transaction_details_recipient_address" : "Recipient addresses",
|
||||
|
||||
|
||||
"wallet_list_title" : "Monero Wallet",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "Value of the amount must be more or equal to ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "If this wallet has a 12-word seed and was created in Cake, DO NOT deposit Bitcoin into this wallet. Any BTC transferred to this wallet may be lost. Create a new 24-word wallet (tap the menu at the top right, select Wallets, choose Create New Wallet, then select Bitcoin) and IMMEDIATELY move your BTC there. New (24-word) BTC wallets from Cake are secure",
|
||||
"do_not_show_me": "Do not show me this again"
|
||||
"do_not_show_me": "Do not show me this again",
|
||||
|
||||
"add_receiver" : "Add receiver"
|
||||
}
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "Cantidad",
|
||||
"transaction_details_fee" : "Cuota",
|
||||
"transaction_details_copied" : "${title} Copiado al portapapeles",
|
||||
"transaction_details_recipient_address" : "Dirección del receptor",
|
||||
"transaction_details_recipient_address" : "Direcciones de destinatarios",
|
||||
|
||||
|
||||
"wallet_list_title" : "Monedero Monero",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "El valor de la cantidad debe ser mayor o igual a ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "Si esta billetera tiene una semilla de 12 palabras y se creó en Cake, NO deposite Bitcoin en esta billetera. Cualquier BTC transferido a esta billetera se puede perder. Cree una nueva billetera de 24 palabras (toque el menú en la parte superior derecha, seleccione Monederos, elija Crear nueva billetera, luego seleccione Bitcoin) e INMEDIATAMENTE mueva su BTC allí. Las nuevas carteras BTC (24 palabras) de Cake son seguras",
|
||||
"do_not_show_me": "no me muestres esto otra vez"
|
||||
"do_not_show_me": "no me muestres esto otra vez",
|
||||
|
||||
"add_receiver" : "Agregar receptor"
|
||||
}
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "रकम",
|
||||
"transaction_details_fee" : "शुल्क",
|
||||
"transaction_details_copied" : "${title} क्लिपबोर्ड पर नकल",
|
||||
"transaction_details_recipient_address" : "प्राप्तकर्ता का पता",
|
||||
"transaction_details_recipient_address" : "प्राप्तकर्ता के पते",
|
||||
|
||||
|
||||
"wallet_list_title" : "Monero बटुआ",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "राशि का मूल्य अधिक है या करने के लिए बराबर होना चाहिए ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "अगर इस वॉलेट में 12 शब्दों का बीज है और इसे केक में बनाया गया है, तो इस वॉलेट में बिटकॉइन जमा न करें। इस वॉलेट में स्थानांतरित किया गया कोई भी बीटीसी खो सकता है। एक नया 24-शब्द वॉलेट बनाएं (ऊपर दाईं ओर स्थित मेनू पर टैप करें, वॉलेट चुनें, नया वॉलेट बनाएं चुनें, फिर बिटकॉइन चुनें) और तुरंत अपना बीटीसी वहां ले जाएं। केक से नए (24-शब्द) बीटीसी वॉलेट सुरक्षित हैं",
|
||||
"do_not_show_me": "मुझे यह फिर न दिखाएं"
|
||||
"do_not_show_me": "मुझे यह फिर न दिखाएं",
|
||||
|
||||
"add_receiver" : "रिसीवर जोड़ें"
|
||||
}
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "Iznos",
|
||||
"transaction_details_fee" : "Naknada",
|
||||
"transaction_details_copied" : "${title} kopiran u međuspremnik",
|
||||
"transaction_details_recipient_address" : "Primateljeva adresa",
|
||||
"transaction_details_recipient_address" : "Adrese primatelja",
|
||||
|
||||
|
||||
"wallet_list_title" : "Monero novčanik",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "Vrijednost iznosa mora biti veća ili jednaka ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "Ako ovaj novčanik sadrži sjeme od 12 riječi i stvoren je u Torti, NEMOJTE polagati Bitcoin u ovaj novčanik. Bilo koji BTC prebačen u ovaj novčanik može se izgubiti. Stvorite novi novčanik od 24 riječi (taknite izbornik u gornjem desnom dijelu, odaberite Novčanici, odaberite Stvori novi novčanik, a zatim odaberite Bitcoin) i ODMAH premjestite svoj BTC tamo. Novi BTC novčanici (s 24 riječi) tvrtke Cake sigurni su",
|
||||
"do_not_show_me": "Ne pokazuj mi ovo više"
|
||||
"do_not_show_me": "Ne pokazuj mi ovo više",
|
||||
|
||||
"add_receiver" : "Dodajte prijamnik"
|
||||
}
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "Ammontare",
|
||||
"transaction_details_fee" : "Commissione",
|
||||
"transaction_details_copied" : "${title} copiati negli Appunti",
|
||||
"transaction_details_recipient_address" : "Indirizzo destinatario",
|
||||
"transaction_details_recipient_address" : "Indirizzi dei destinatari",
|
||||
|
||||
|
||||
"wallet_list_title" : "Portafoglio Monero",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "Il valore dell'importo deve essere maggiore o uguale a ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "Se questo portafoglio ha un seme di 12 parole ed è stato creato in Cake, NON depositare Bitcoin in questo portafoglio. Qualsiasi BTC trasferito su questo portafoglio potrebbe andare perso. Crea un nuovo portafoglio di 24 parole (tocca il menu in alto a destra, seleziona Portafogli, scegli Crea nuovo portafoglio, quindi seleziona Bitcoin) e sposta IMMEDIATAMENTE lì il tuo BTC. I nuovi portafogli BTC (24 parole) di Cake sono sicuri",
|
||||
"do_not_show_me": "Non mostrarmelo di nuovo"
|
||||
"do_not_show_me": "Non mostrarmelo di nuovo",
|
||||
|
||||
"add_receiver" : "Aggiungi ricevitore"
|
||||
}
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "量",
|
||||
"transaction_details_fee" : "費用",
|
||||
"transaction_details_copied" : "${title} クリップボードにコピーしました",
|
||||
"transaction_details_recipient_address" : "受取人の住所",
|
||||
"transaction_details_recipient_address" : "受信者のアドレス",
|
||||
|
||||
|
||||
"wallet_list_title" : "Monero 財布",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "金額の値は以上でなければなりません ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "このウォレットに 12 ワードのシードがあり、Cake で作成された場合、このウォレットにビットコインを入金しないでください。 このウォレットに転送された BTC は失われる可能性があります。 新しい 24 ワードのウォレットを作成し (右上のメニューをタップし、[ウォレット]、[新しいウォレットの作成]、[ビットコイン] の順に選択)、すぐに BTC をそこに移動します。 Cake の新しい (24 ワード) BTC ウォレットは安全です",
|
||||
"do_not_show_me": "また僕にこれを見せないでください"
|
||||
"do_not_show_me": "また僕にこれを見せないでください",
|
||||
|
||||
"add_receiver" : "レシーバーを追加"
|
||||
}
|
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "금액은 다음보다 크거나 같아야합니다 ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "이 지갑에 12 단어 시드가 있고 Cake에서 생성 된 경우이 지갑에 비트 코인을 입금하지 마십시오. 이 지갑으로 전송 된 모든 BTC는 손실 될 수 있습니다. 새로운 24 단어 지갑을 생성하고 (오른쪽 상단의 메뉴를 탭하고 지갑을 선택한 다음 새 지갑 생성을 선택한 다음 비트 코인을 선택하십시오) 즉시 BTC를 그곳으로 이동하십시오. Cake의 새로운 (24 단어) BTC 지갑은 안전합니다",
|
||||
"do_not_show_me": "나를 다시 표시하지 않음"
|
||||
"do_not_show_me": "나를 다시 표시하지 않음",
|
||||
|
||||
"add_receiver" : "수신기 추가"
|
||||
}
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "Bedrag",
|
||||
"transaction_details_fee" : "Vergoeding",
|
||||
"transaction_details_copied" : "${title} gekopieerd naar het klembord",
|
||||
"transaction_details_recipient_address" : "Adres van de ontvanger",
|
||||
"transaction_details_recipient_address" : "Adressen van ontvangers",
|
||||
|
||||
|
||||
"wallet_list_title" : "Monero portemonnee",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "Waarde van het bedrag moet meer of gelijk zijn aan ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "Als deze portemonnee een seed van 12 woorden heeft en is gemaakt in Cake, stort dan GEEN Bitcoin in deze portemonnee. Elke BTC die naar deze portemonnee is overgebracht, kan verloren gaan. Maak een nieuwe portemonnee van 24 woorden (tik op het menu rechtsboven, selecteer Portefeuilles, kies Nieuwe portemonnee maken en selecteer vervolgens Bitcoin) en verplaats je BTC ONMIDDELLIJK daar. Nieuwe (24-woorden) BTC-portefeuilles van Cake zijn veilig",
|
||||
"do_not_show_me": "laat me dit niet opnieuw zien"
|
||||
"do_not_show_me": "laat me dit niet opnieuw zien",
|
||||
|
||||
"add_receiver" : "Ontvanger toevoegen"
|
||||
}
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "Ilość",
|
||||
"transaction_details_fee" : "Opłata",
|
||||
"transaction_details_copied" : "${title} skopiowane do schowka",
|
||||
"transaction_details_recipient_address" : "Adres odbiorcy",
|
||||
"transaction_details_recipient_address" : "Adresy odbiorców",
|
||||
|
||||
|
||||
"wallet_list_title" : "Portfel Monero",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "Wartość kwoty musi być większa lub równa ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "Jeśli ten portfel ma 12-wyrazowy seed i został utworzony w Cake, NIE Wpłacaj Bitcoina do tego portfela. Wszelkie BTC przeniesione do tego portfela mogą zostać utracone. Utwórz nowy portfel z 24 słowami (dotknij menu w prawym górnym rogu, wybierz Portfele, wybierz Utwórz nowy portfel, a następnie Bitcoin) i NATYCHMIAST przenieś tam swoje BTC. Nowe (24 słowa) portfele BTC firmy Cake są bezpieczne",
|
||||
"do_not_show_me": "Nie pokazuj mi tego ponownie"
|
||||
"do_not_show_me": "Nie pokazuj mi tego ponownie",
|
||||
|
||||
"add_receiver" : "Dodaj odbiorcę"
|
||||
}
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "Quantia",
|
||||
"transaction_details_fee" : "Taxa",
|
||||
"transaction_details_copied" : "${title} copiados para a área de transferência",
|
||||
"transaction_details_recipient_address" : "Endereço do destinatário",
|
||||
"transaction_details_recipient_address" : "Endereços de destinatários",
|
||||
|
||||
|
||||
"wallet_list_title" : "Carteira Monero",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "O valor do montante deve ser maior ou igual a ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "Se esta carteira tiver uma semente de 12 palavras e foi criada no Cake, NÃO deposite Bitcoin nesta carteira. Qualquer BTC transferido para esta carteira pode ser perdido. Crie uma nova carteira de 24 palavras (toque no menu no canto superior direito, selecione Carteiras, escolha Criar Nova Carteira e selecione Bitcoin) e mova IMEDIATAMENTE seu BTC para lá. As novas carteiras BTC (24 palavras) da Cake são seguras",
|
||||
"do_not_show_me": "não me mostre isso novamente"
|
||||
"do_not_show_me": "não me mostre isso novamente",
|
||||
|
||||
"add_receiver" : "Adicionar receptor"
|
||||
}
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "Сумма",
|
||||
"transaction_details_fee" : "Комиссия",
|
||||
"transaction_details_copied" : "${title} скопировано в буфер обмена",
|
||||
"transaction_details_recipient_address" : "Адрес получателя",
|
||||
"transaction_details_recipient_address" : "Адреса получателей",
|
||||
|
||||
|
||||
"wallet_list_title" : "Monero Кошелёк",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "Сумма должна быть больше или равна ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "Если этот кошелек имеет мнемоническую фразу из 12 слов и был создан в Cake, НЕ переводите биткойны на этот кошелек. Любые BTC, переведенные на этот кошелек, могут быть потеряны. Создайте новый кошелек с мнемоническои фразы из 24 слов (коснитесь меню в правом верхнем углу, выберите «Кошельки», выберите «Создать новый кошелек», затем выберите «Bitcoin») и НЕМЕДЛЕННО переведите туда свои BTC. Новые (24 слова) кошельки BTC от Cake безопасны",
|
||||
"do_not_show_me": "Не показывай мне это больше"
|
||||
"do_not_show_me": "Не показывай мне это больше",
|
||||
|
||||
"add_receiver" : "Добавить получателя"
|
||||
}
|
|
@ -284,7 +284,7 @@
|
|||
"transaction_details_amount" : "Сума",
|
||||
"transaction_details_fee" : "Комісія",
|
||||
"transaction_details_copied" : "${title} скопійовано в буфер обміну",
|
||||
"transaction_details_recipient_address" : "Адреса отримувача",
|
||||
"transaction_details_recipient_address" : "Адреси одержувачів",
|
||||
|
||||
|
||||
"wallet_list_title" : "Monero Гаманець",
|
||||
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "Значення суми має бути більшим або дорівнювати ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "Якщо цей гаманець має мнемонічну фразу з 12 слів і був створений у Cake, НЕ переводьте біткойни на цей гаманець. Будь-які BTC, переведений на цей гаманець, можуть бути втраченими. Створіть новий гаманець з мнемонічною фразою з 24 слів (торкніться меню у верхньому правому куті, виберіть Гаманці, виберіть Створити новий гаманець, потім виберіть Bitcoin) і НЕГАЙНО переведіть туди свії BTC. Нові (з мнемонічною фразою з 24 слів) гаманці BTC від Cake надійно захищені",
|
||||
"do_not_show_me": "Не показуй мені це знову"
|
||||
"do_not_show_me": "Не показуй мені це знову",
|
||||
|
||||
"add_receiver" : "Додати одержувача"
|
||||
}
|
|
@ -483,5 +483,7 @@
|
|||
"moonpay_alert_text" : "金额的价值必须大于或等于 ${minAmount} ${fiatCurrency}",
|
||||
|
||||
"outdated_electrum_wallet_receive_warning": "如果这个钱包有一个 12 字的种子并且是在 Cake 中创建的,不要将比特币存入这个钱包。 任何转移到此钱包的 BTC 都可能丢失。 创建一个新的 24 字钱包(点击右上角的菜单,选择钱包,选择创建新钱包,然后选择比特币)并立即将您的 BTC 移到那里。 Cake 的新(24 字)BTC 钱包是安全的",
|
||||
"do_not_show_me": "不再提示"
|
||||
"do_not_show_me": "不再提示",
|
||||
|
||||
"add_receiver" : "添加接收器"
|
||||
}
|
Loading…
Reference in a new issue