mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-05-02 21:22:14 +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
lib
bitcoin
src/screens
view_model/send
res/values
|
@ -1,9 +1,9 @@
|
||||||
import 'package:cake_wallet/bitcoin/bitcoin_transaction_priority.dart';
|
import 'package:cake_wallet/bitcoin/bitcoin_transaction_priority.dart';
|
||||||
|
import 'package:cake_wallet/view_model/send/send_item.dart';
|
||||||
|
|
||||||
class BitcoinTransactionCredentials {
|
class BitcoinTransactionCredentials {
|
||||||
BitcoinTransactionCredentials(this.address, this.amount, this.priority);
|
BitcoinTransactionCredentials(this.sendItemList, this.priority);
|
||||||
|
|
||||||
final String address;
|
final List<SendItem> sendItemList;
|
||||||
final String amount;
|
|
||||||
BitcoinTransactionPriority priority;
|
BitcoinTransactionPriority priority;
|
||||||
}
|
}
|
||||||
|
|
|
@ -218,20 +218,71 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
|
||||||
const minAmount = 546;
|
const minAmount = 546;
|
||||||
final transactionCredentials = credentials as BitcoinTransactionCredentials;
|
final transactionCredentials = credentials as BitcoinTransactionCredentials;
|
||||||
final inputs = <BitcoinUnspent>[];
|
final inputs = <BitcoinUnspent>[];
|
||||||
|
final sendItemList = transactionCredentials.sendItemList;
|
||||||
final allAmountFee =
|
final allAmountFee =
|
||||||
calculateEstimatedFee(transactionCredentials.priority, null);
|
calculateEstimatedFee(transactionCredentials.priority, null);
|
||||||
final allAmount = balance.confirmed - allAmountFee;
|
final allAmount = balance.confirmed - allAmountFee;
|
||||||
|
var credentialsAmount = 0;
|
||||||
|
var amount = 0;
|
||||||
var fee = 0;
|
var fee = 0;
|
||||||
final credentialsAmount = transactionCredentials.amount != null
|
|
||||||
? stringDoubleToBitcoinAmount(transactionCredentials.amount)
|
if (sendItemList.length > 1) {
|
||||||
: 0;
|
final sendAllItems = sendItemList.where((item) => item.sendAll).toList();
|
||||||
final amount = transactionCredentials.amount == null ||
|
|
||||||
allAmount - credentialsAmount < minAmount
|
if (sendAllItems?.isNotEmpty ?? false) {
|
||||||
? allAmount
|
throw BitcoinTransactionWrongBalanceException();
|
||||||
: credentialsAmount;
|
}
|
||||||
|
|
||||||
|
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 txb = bitcoin.TransactionBuilder(network: networkType);
|
||||||
final changeAddress = address;
|
final changeAddress = address;
|
||||||
var leftAmount = amount;
|
var leftAmount = totalAmount;
|
||||||
var totalInputAmount = 0;
|
var totalInputAmount = 0;
|
||||||
|
|
||||||
if (_unspent.isEmpty) {
|
if (_unspent.isEmpty) {
|
||||||
|
@ -252,16 +303,6 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
|
||||||
throw BitcoinTransactionNoInputsException();
|
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) {
|
if (amount <= 0 || totalInputAmount < amount) {
|
||||||
throw BitcoinTransactionWrongBalanceException();
|
throw BitcoinTransactionWrongBalanceException();
|
||||||
}
|
}
|
||||||
|
@ -282,11 +323,18 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
txb.addOutput(
|
sendItemList.forEach((item) {
|
||||||
addressToOutputScript(transactionCredentials.address, networkType),
|
final _amount = item.sendAll
|
||||||
amount);
|
? 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 feeAmount = feeRate(transactionCredentials.priority) * estimatedSize;
|
||||||
final changeValue = totalInputAmount - amount - feeAmount;
|
final changeValue = totalInputAmount - amount - feeAmount;
|
||||||
|
|
||||||
|
@ -331,7 +379,8 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
|
||||||
feeRate(priority) * estimatedTransactionSize(inputsCount, outputsCount);
|
feeRate(priority) * estimatedTransactionSize(inputsCount, outputsCount);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int calculateEstimatedFee(TransactionPriority priority, int amount) {
|
int calculateEstimatedFee(TransactionPriority priority, int amount,
|
||||||
|
{int outputsCount}) {
|
||||||
if (priority is BitcoinTransactionPriority) {
|
if (priority is BitcoinTransactionPriority) {
|
||||||
int inputsCount = 0;
|
int inputsCount = 0;
|
||||||
|
|
||||||
|
@ -350,8 +399,10 @@ abstract class ElectrumWalletBase extends WalletBase<ElectrumBalance,
|
||||||
inputsCount = _unspent.length;
|
inputsCount = _unspent.length;
|
||||||
}
|
}
|
||||||
// If send all, then we have no change value
|
// If send all, then we have no change value
|
||||||
|
final _outputsCount = outputsCount ?? (amount != null ? 2 : 1);
|
||||||
|
|
||||||
return feeAmountForPriority(
|
return feeAmountForPriority(
|
||||||
priority, inputsCount, amount != null ? 2 : 1);
|
priority, inputsCount, _outputsCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -262,9 +262,6 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
|
||||||
|
|
||||||
if (state is ExecutedSuccessfullyState) {
|
if (state is ExecutedSuccessfullyState) {
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
final item = widget.exchangeTradeViewModel.sendViewModel
|
|
||||||
.sendItemList.first;
|
|
||||||
|
|
||||||
showPopUp<void>(
|
showPopUp<void>(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
|
@ -388,8 +385,8 @@ class ExchangeTradeState extends State<ExchangeTradeForm> {
|
||||||
.pendingTransactionFiatAmount +
|
.pendingTransactionFiatAmount +
|
||||||
' ' +
|
' ' +
|
||||||
widget.exchangeTradeViewModel.sendViewModel.fiat.title,
|
widget.exchangeTradeViewModel.sendViewModel.fiat.title,
|
||||||
recipientTitle: S.of(context).recipient_address,
|
sendItemList: widget.exchangeTradeViewModel.sendViewModel
|
||||||
recipientAddress: item.address);
|
.sendItemList);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -266,56 +266,49 @@ class SendPage extends BasePage {
|
||||||
EdgeInsets.only(left: 24, right: 24, bottom: 24),
|
EdgeInsets.only(left: 24, right: 24, bottom: 24),
|
||||||
bottomSection: Column(
|
bottomSection: Column(
|
||||||
children: [
|
children: [
|
||||||
PrimaryButton(
|
if (sendViewModel.isAddReceiverButtonEnabled) Padding(
|
||||||
onPressed: () {
|
padding: EdgeInsets.only(bottom: 12),
|
||||||
sendViewModel.addSendItem();
|
child: PrimaryButton(
|
||||||
},
|
onPressed: () {
|
||||||
text: 'Add receiver',
|
sendViewModel.addSendItem();
|
||||||
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,
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
))
|
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,
|
feeValue: sendViewModel.pendingTransaction.feeFormatted,
|
||||||
feeFiatAmount: sendViewModel.pendingTransactionFeeFiatAmount
|
feeFiatAmount: sendViewModel.pendingTransactionFeeFiatAmount
|
||||||
+ ' ' + sendViewModel.fiat.title,
|
+ ' ' + sendViewModel.fiat.title,
|
||||||
recipientTitle: S.of(context).recipient_address,
|
sendItemList: sendViewModel.sendItemList,
|
||||||
recipientAddress: '', // FIXME: sendViewModel.address,
|
|
||||||
rightButtonText: S.of(context).ok,
|
rightButtonText: S.of(context).ok,
|
||||||
leftButtonText: S.of(context).cancel,
|
leftButtonText: S.of(context).cancel,
|
||||||
actionRightButton: () {
|
actionRightButton: () {
|
||||||
|
@ -408,4 +400,17 @@ class SendPage extends BasePage {
|
||||||
final itemCount = controller.page.round();
|
final itemCount = controller.page.round();
|
||||||
return sendViewModel.sendItemList[itemCount];
|
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/palette.dart';
|
||||||
|
import 'package:cake_wallet/view_model/send/send_item.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:cake_wallet/src/widgets/base_alert_dialog.dart';
|
import 'package:cake_wallet/src/widgets/base_alert_dialog.dart';
|
||||||
|
import 'package:cake_wallet/generated/i18n.dart';
|
||||||
|
|
||||||
class ConfirmSendingAlert extends BaseAlertDialog {
|
class ConfirmSendingAlert extends BaseAlertDialog {
|
||||||
ConfirmSendingAlert({
|
ConfirmSendingAlert({
|
||||||
|
@ -11,14 +13,18 @@ class ConfirmSendingAlert extends BaseAlertDialog {
|
||||||
@required this.fee,
|
@required this.fee,
|
||||||
@required this.feeValue,
|
@required this.feeValue,
|
||||||
@required this.feeFiatAmount,
|
@required this.feeFiatAmount,
|
||||||
@required this.recipientTitle,
|
@required this.sendItemList,
|
||||||
@required this.recipientAddress,
|
|
||||||
@required this.leftButtonText,
|
@required this.leftButtonText,
|
||||||
@required this.rightButtonText,
|
@required this.rightButtonText,
|
||||||
@required this.actionLeftButton,
|
@required this.actionLeftButton,
|
||||||
@required this.actionRightButton,
|
@required this.actionRightButton,
|
||||||
this.alertBarrierDismissible = true
|
this.alertBarrierDismissible = true
|
||||||
});
|
}) {
|
||||||
|
itemCount = sendItemList.length;
|
||||||
|
recipientTitle = itemCount > 1
|
||||||
|
? S.current.transaction_details_recipient_address
|
||||||
|
: S.current.recipient_address;
|
||||||
|
}
|
||||||
|
|
||||||
final String alertTitle;
|
final String alertTitle;
|
||||||
final String amount;
|
final String amount;
|
||||||
|
@ -27,14 +33,16 @@ class ConfirmSendingAlert extends BaseAlertDialog {
|
||||||
final String fee;
|
final String fee;
|
||||||
final String feeValue;
|
final String feeValue;
|
||||||
final String feeFiatAmount;
|
final String feeFiatAmount;
|
||||||
final String recipientTitle;
|
final List<SendItem> sendItemList;
|
||||||
final String recipientAddress;
|
|
||||||
final String leftButtonText;
|
final String leftButtonText;
|
||||||
final String rightButtonText;
|
final String rightButtonText;
|
||||||
final VoidCallback actionLeftButton;
|
final VoidCallback actionLeftButton;
|
||||||
final VoidCallback actionRightButton;
|
final VoidCallback actionRightButton;
|
||||||
final bool alertBarrierDismissible;
|
final bool alertBarrierDismissible;
|
||||||
|
|
||||||
|
String recipientTitle;
|
||||||
|
int itemCount;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get titleText => alertTitle;
|
String get titleText => alertTitle;
|
||||||
|
|
||||||
|
@ -58,127 +66,181 @@ class ConfirmSendingAlert extends BaseAlertDialog {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget content(BuildContext context) {
|
Widget content(BuildContext context) {
|
||||||
return Column(
|
return Container(
|
||||||
children: <Widget>[
|
height: 200,
|
||||||
Row(
|
child: SingleChildScrollView(
|
||||||
mainAxisSize: MainAxisSize.max,
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Text(
|
Row(
|
||||||
amount,
|
mainAxisSize: MainAxisSize.max,
|
||||||
style: TextStyle(
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
fontSize: 16,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
fontWeight: FontWeight.normal,
|
children: <Widget>[
|
||||||
fontFamily: 'Lato',
|
|
||||||
color: Theme.of(context).primaryTextTheme.title.color,
|
|
||||||
decoration: TextDecoration.none,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.end,
|
|
||||||
children: [
|
|
||||||
Text(
|
Text(
|
||||||
amountValue,
|
amount,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 18,
|
fontSize: 16,
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.normal,
|
||||||
fontFamily: 'Lato',
|
fontFamily: 'Lato',
|
||||||
color: Theme.of(context).primaryTextTheme.title.color,
|
color: Theme.of(context).primaryTextTheme.title.color,
|
||||||
decoration: TextDecoration.none,
|
decoration: TextDecoration.none,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
Column(
|
||||||
fiatAmountValue,
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||||||
style: TextStyle(
|
children: [
|
||||||
fontSize: 12,
|
Text(
|
||||||
fontWeight: FontWeight.w600,
|
amountValue,
|
||||||
fontFamily: 'Lato',
|
style: TextStyle(
|
||||||
color: PaletteDark.pigeonBlue,
|
fontSize: 18,
|
||||||
decoration: TextDecoration.none,
|
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),
|
||||||
Padding(
|
child: Row(
|
||||||
padding: EdgeInsets.only(top: 16),
|
mainAxisSize: MainAxisSize.max,
|
||||||
child: Row(
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
mainAxisSize: MainAxisSize.max,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
children: <Widget>[
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
Text(
|
||||||
children: <Widget>[
|
fee,
|
||||||
Text(
|
style: TextStyle(
|
||||||
fee,
|
fontSize: 16,
|
||||||
style: TextStyle(
|
fontWeight: FontWeight.normal,
|
||||||
fontSize: 16,
|
fontFamily: 'Lato',
|
||||||
fontWeight: FontWeight.normal,
|
color: Theme.of(context).primaryTextTheme.title.color,
|
||||||
fontFamily: 'Lato',
|
decoration: TextDecoration.none,
|
||||||
color: Theme.of(context).primaryTextTheme.title.color,
|
),
|
||||||
decoration: TextDecoration.none,
|
),
|
||||||
),
|
Column(
|
||||||
),
|
crossAxisAlignment: CrossAxisAlignment.end,
|
||||||
Column(
|
children: [
|
||||||
crossAxisAlignment: CrossAxisAlignment.end,
|
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: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
feeValue,
|
'$recipientTitle:',
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 18,
|
fontSize: 16,
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.normal,
|
||||||
fontFamily: 'Lato',
|
fontFamily: 'Lato',
|
||||||
color: Theme.of(context).primaryTextTheme.title.color,
|
color: Theme.of(context).primaryTextTheme.title.color,
|
||||||
decoration: TextDecoration.none,
|
decoration: TextDecoration.none,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Text(
|
itemCount > 1
|
||||||
feeFiatAmount,
|
? ListView.builder(
|
||||||
style: TextStyle(
|
padding: EdgeInsets.only(top: 0),
|
||||||
fontSize: 12,
|
shrinkWrap: true,
|
||||||
fontWeight: FontWeight.w600,
|
physics: NeverScrollableScrollPhysics(),
|
||||||
fontFamily: 'Lato',
|
itemCount: itemCount,
|
||||||
color: PaletteDark.pigeonBlue,
|
itemBuilder: (context, index) {
|
||||||
decoration: TextDecoration.none,
|
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/bitcoin_transaction_priority.dart';
|
||||||
import 'package:cake_wallet/bitcoin/electrum_wallet.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_description.dart';
|
||||||
import 'package:cake_wallet/entities/transaction_priority.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_item.dart';
|
||||||
import 'package:cake_wallet/view_model/send/send_template_view_model.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:cake_wallet/view_model/settings/settings_view_model.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
import 'package:intl/intl.dart';
|
|
||||||
import 'package:mobx/mobx.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/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/address_validator.dart';
|
||||||
import 'package:cake_wallet/core/amount_validator.dart';
|
import 'package:cake_wallet/core/amount_validator.dart';
|
||||||
import 'package:cake_wallet/core/pending_transaction.dart';
|
import 'package:cake_wallet/core/pending_transaction.dart';
|
||||||
import 'package:cake_wallet/core/validator.dart';
|
import 'package:cake_wallet/core/validator.dart';
|
||||||
import 'package:cake_wallet/core/wallet_base.dart';
|
import 'package:cake_wallet/core/wallet_base.dart';
|
||||||
import 'package:cake_wallet/core/execution_state.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/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/monero/monero_transaction_creation_credentials.dart';
|
||||||
import 'package:cake_wallet/entities/sync_status.dart';
|
import 'package:cake_wallet/entities/sync_status.dart';
|
||||||
import 'package:cake_wallet/entities/crypto_currency.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/dashboard/fiat_conversion_store.dart';
|
||||||
import 'package:cake_wallet/store/settings_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/view_model/send/send_view_model_state.dart';
|
||||||
import 'package:cake_wallet/generated/i18n.dart';
|
|
||||||
|
|
||||||
part 'send_view_model.g.dart';
|
part 'send_view_model.g.dart';
|
||||||
|
|
||||||
|
@ -138,6 +127,9 @@ abstract class SendViewModelBase with Store {
|
||||||
@computed
|
@computed
|
||||||
ObservableList<Template> get templates => sendTemplateViewModel.templates;
|
ObservableList<Template> get templates => sendTemplateViewModel.templates;
|
||||||
|
|
||||||
|
@computed
|
||||||
|
bool get isAddReceiverButtonEnabled => _wallet is ElectrumWallet;
|
||||||
|
|
||||||
WalletType get walletType => _wallet.type;
|
WalletType get walletType => _wallet.type;
|
||||||
final WalletBase _wallet;
|
final WalletBase _wallet;
|
||||||
final SettingsStore _settingsStore;
|
final SettingsStore _settingsStore;
|
||||||
|
@ -158,8 +150,18 @@ abstract class SendViewModelBase with Store {
|
||||||
|
|
||||||
@action
|
@action
|
||||||
Future<void> commitTransaction() async {
|
Future<void> commitTransaction() async {
|
||||||
final address = ''; // FIXME: get it from item
|
String address = sendItemList.fold('', (previousValue, item) {
|
||||||
final note = ''; // FIXME: get it from item
|
return previousValue + item.address + '\n';
|
||||||
|
});
|
||||||
|
|
||||||
|
address = address.trim();
|
||||||
|
|
||||||
|
String note = sendItemList.fold('', (previousValue, item) {
|
||||||
|
return previousValue + item.note + '\n';
|
||||||
|
});
|
||||||
|
|
||||||
|
note = note.trim();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
state = TransactionCommitting();
|
state = TransactionCommitting();
|
||||||
await pendingTransaction.commit();
|
await pendingTransaction.commit();
|
||||||
|
@ -185,25 +187,23 @@ abstract class SendViewModelBase with Store {
|
||||||
_settingsStore.priority[_wallet.type] = priority;
|
_settingsStore.priority[_wallet.type] = priority;
|
||||||
|
|
||||||
Object _credentials() {
|
Object _credentials() {
|
||||||
// FIXME: get it from item
|
|
||||||
return null;
|
|
||||||
/*final _amount = cryptoAmount.replaceAll(',', '.');
|
|
||||||
|
|
||||||
switch (_wallet.type) {
|
switch (_wallet.type) {
|
||||||
case WalletType.bitcoin:
|
case WalletType.bitcoin:
|
||||||
final amount = !sendAll ? _amount : null;
|
|
||||||
final priority = _settingsStore.priority[_wallet.type];
|
final priority = _settingsStore.priority[_wallet.type];
|
||||||
|
|
||||||
return BitcoinTransactionCredentials(
|
return BitcoinTransactionCredentials(
|
||||||
address, amount, priority as BitcoinTransactionPriority);
|
sendItemList, priority as BitcoinTransactionPriority);
|
||||||
case WalletType.litecoin:
|
case WalletType.litecoin:
|
||||||
final amount = !sendAll ? _amount : null;
|
|
||||||
final priority = _settingsStore.priority[_wallet.type];
|
final priority = _settingsStore.priority[_wallet.type];
|
||||||
|
|
||||||
return BitcoinTransactionCredentials(
|
return BitcoinTransactionCredentials(
|
||||||
address, amount, priority as BitcoinTransactionPriority);
|
sendItemList, priority as BitcoinTransactionPriority);
|
||||||
case WalletType.monero:
|
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];
|
final priority = _settingsStore.priority[_wallet.type];
|
||||||
|
|
||||||
return MoneroTransactionCreationCredentials(
|
return MoneroTransactionCreationCredentials(
|
||||||
|
@ -213,7 +213,7 @@ abstract class SendViewModelBase with Store {
|
||||||
amount: amount);
|
amount: amount);
|
||||||
default:
|
default:
|
||||||
return null;
|
return null;
|
||||||
}*/
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String displayFeeRate(dynamic priority) {
|
String displayFeeRate(dynamic priority) {
|
||||||
|
|
|
@ -284,7 +284,7 @@
|
||||||
"transaction_details_amount" : "Betrag",
|
"transaction_details_amount" : "Betrag",
|
||||||
"transaction_details_fee" : "Gebühr",
|
"transaction_details_fee" : "Gebühr",
|
||||||
"transaction_details_copied" : "${title} in die Zwischenablage kopiert",
|
"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",
|
"wallet_list_title" : "Monero-Wallet",
|
||||||
|
@ -483,5 +483,7 @@
|
||||||
"moonpay_alert_text" : "Der Wert des Betrags muss größer oder gleich ${minAmount} ${fiatCurrency} sein",
|
"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",
|
"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_amount" : "Amount",
|
||||||
"transaction_details_fee" : "Fee",
|
"transaction_details_fee" : "Fee",
|
||||||
"transaction_details_copied" : "${title} copied to Clipboard",
|
"transaction_details_copied" : "${title} copied to Clipboard",
|
||||||
"transaction_details_recipient_address" : "Recipient address",
|
"transaction_details_recipient_address" : "Recipient addresses",
|
||||||
|
|
||||||
|
|
||||||
"wallet_list_title" : "Monero Wallet",
|
"wallet_list_title" : "Monero Wallet",
|
||||||
|
@ -483,5 +483,7 @@
|
||||||
"moonpay_alert_text" : "Value of the amount must be more or equal to ${minAmount} ${fiatCurrency}",
|
"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",
|
"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_amount" : "Cantidad",
|
||||||
"transaction_details_fee" : "Cuota",
|
"transaction_details_fee" : "Cuota",
|
||||||
"transaction_details_copied" : "${title} Copiado al portapapeles",
|
"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",
|
"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}",
|
"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",
|
"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_amount" : "रकम",
|
||||||
"transaction_details_fee" : "शुल्क",
|
"transaction_details_fee" : "शुल्क",
|
||||||
"transaction_details_copied" : "${title} क्लिपबोर्ड पर नकल",
|
"transaction_details_copied" : "${title} क्लिपबोर्ड पर नकल",
|
||||||
"transaction_details_recipient_address" : "प्राप्तकर्ता का पता",
|
"transaction_details_recipient_address" : "प्राप्तकर्ता के पते",
|
||||||
|
|
||||||
|
|
||||||
"wallet_list_title" : "Monero बटुआ",
|
"wallet_list_title" : "Monero बटुआ",
|
||||||
|
@ -483,5 +483,7 @@
|
||||||
"moonpay_alert_text" : "राशि का मूल्य अधिक है या करने के लिए बराबर होना चाहिए ${minAmount} ${fiatCurrency}",
|
"moonpay_alert_text" : "राशि का मूल्य अधिक है या करने के लिए बराबर होना चाहिए ${minAmount} ${fiatCurrency}",
|
||||||
|
|
||||||
"outdated_electrum_wallet_receive_warning": "अगर इस वॉलेट में 12 शब्दों का बीज है और इसे केक में बनाया गया है, तो इस वॉलेट में बिटकॉइन जमा न करें। इस वॉलेट में स्थानांतरित किया गया कोई भी बीटीसी खो सकता है। एक नया 24-शब्द वॉलेट बनाएं (ऊपर दाईं ओर स्थित मेनू पर टैप करें, वॉलेट चुनें, नया वॉलेट बनाएं चुनें, फिर बिटकॉइन चुनें) और तुरंत अपना बीटीसी वहां ले जाएं। केक से नए (24-शब्द) बीटीसी वॉलेट सुरक्षित हैं",
|
"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_amount" : "Iznos",
|
||||||
"transaction_details_fee" : "Naknada",
|
"transaction_details_fee" : "Naknada",
|
||||||
"transaction_details_copied" : "${title} kopiran u međuspremnik",
|
"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",
|
"wallet_list_title" : "Monero novčanik",
|
||||||
|
@ -483,5 +483,7 @@
|
||||||
"moonpay_alert_text" : "Vrijednost iznosa mora biti veća ili jednaka ${minAmount} ${fiatCurrency}",
|
"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",
|
"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_amount" : "Ammontare",
|
||||||
"transaction_details_fee" : "Commissione",
|
"transaction_details_fee" : "Commissione",
|
||||||
"transaction_details_copied" : "${title} copiati negli Appunti",
|
"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",
|
"wallet_list_title" : "Portafoglio Monero",
|
||||||
|
@ -483,5 +483,7 @@
|
||||||
"moonpay_alert_text" : "Il valore dell'importo deve essere maggiore o uguale a ${minAmount} ${fiatCurrency}",
|
"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",
|
"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_amount" : "量",
|
||||||
"transaction_details_fee" : "費用",
|
"transaction_details_fee" : "費用",
|
||||||
"transaction_details_copied" : "${title} クリップボードにコピーしました",
|
"transaction_details_copied" : "${title} クリップボードにコピーしました",
|
||||||
"transaction_details_recipient_address" : "受取人の住所",
|
"transaction_details_recipient_address" : "受信者のアドレス",
|
||||||
|
|
||||||
|
|
||||||
"wallet_list_title" : "Monero 財布",
|
"wallet_list_title" : "Monero 財布",
|
||||||
|
@ -483,5 +483,7 @@
|
||||||
"moonpay_alert_text" : "金額の値は以上でなければなりません ${minAmount} ${fiatCurrency}",
|
"moonpay_alert_text" : "金額の値は以上でなければなりません ${minAmount} ${fiatCurrency}",
|
||||||
|
|
||||||
"outdated_electrum_wallet_receive_warning": "このウォレットに 12 ワードのシードがあり、Cake で作成された場合、このウォレットにビットコインを入金しないでください。 このウォレットに転送された BTC は失われる可能性があります。 新しい 24 ワードのウォレットを作成し (右上のメニューをタップし、[ウォレット]、[新しいウォレットの作成]、[ビットコイン] の順に選択)、すぐに BTC をそこに移動します。 Cake の新しい (24 ワード) BTC ウォレットは安全です",
|
"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}",
|
"moonpay_alert_text" : "금액은 다음보다 크거나 같아야합니다 ${minAmount} ${fiatCurrency}",
|
||||||
|
|
||||||
"outdated_electrum_wallet_receive_warning": "이 지갑에 12 단어 시드가 있고 Cake에서 생성 된 경우이 지갑에 비트 코인을 입금하지 마십시오. 이 지갑으로 전송 된 모든 BTC는 손실 될 수 있습니다. 새로운 24 단어 지갑을 생성하고 (오른쪽 상단의 메뉴를 탭하고 지갑을 선택한 다음 새 지갑 생성을 선택한 다음 비트 코인을 선택하십시오) 즉시 BTC를 그곳으로 이동하십시오. Cake의 새로운 (24 단어) BTC 지갑은 안전합니다",
|
"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_amount" : "Bedrag",
|
||||||
"transaction_details_fee" : "Vergoeding",
|
"transaction_details_fee" : "Vergoeding",
|
||||||
"transaction_details_copied" : "${title} gekopieerd naar het klembord",
|
"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",
|
"wallet_list_title" : "Monero portemonnee",
|
||||||
|
@ -483,5 +483,7 @@
|
||||||
"moonpay_alert_text" : "Waarde van het bedrag moet meer of gelijk zijn aan ${minAmount} ${fiatCurrency}",
|
"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",
|
"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_amount" : "Ilość",
|
||||||
"transaction_details_fee" : "Opłata",
|
"transaction_details_fee" : "Opłata",
|
||||||
"transaction_details_copied" : "${title} skopiowane do schowka",
|
"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",
|
"wallet_list_title" : "Portfel Monero",
|
||||||
|
@ -483,5 +483,7 @@
|
||||||
"moonpay_alert_text" : "Wartość kwoty musi być większa lub równa ${minAmount} ${fiatCurrency}",
|
"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",
|
"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_amount" : "Quantia",
|
||||||
"transaction_details_fee" : "Taxa",
|
"transaction_details_fee" : "Taxa",
|
||||||
"transaction_details_copied" : "${title} copiados para a área de transferência",
|
"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",
|
"wallet_list_title" : "Carteira Monero",
|
||||||
|
@ -483,5 +483,7 @@
|
||||||
"moonpay_alert_text" : "O valor do montante deve ser maior ou igual a ${minAmount} ${fiatCurrency}",
|
"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",
|
"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_amount" : "Сумма",
|
||||||
"transaction_details_fee" : "Комиссия",
|
"transaction_details_fee" : "Комиссия",
|
||||||
"transaction_details_copied" : "${title} скопировано в буфер обмена",
|
"transaction_details_copied" : "${title} скопировано в буфер обмена",
|
||||||
"transaction_details_recipient_address" : "Адрес получателя",
|
"transaction_details_recipient_address" : "Адреса получателей",
|
||||||
|
|
||||||
|
|
||||||
"wallet_list_title" : "Monero Кошелёк",
|
"wallet_list_title" : "Monero Кошелёк",
|
||||||
|
@ -483,5 +483,7 @@
|
||||||
"moonpay_alert_text" : "Сумма должна быть больше или равна ${minAmount} ${fiatCurrency}",
|
"moonpay_alert_text" : "Сумма должна быть больше или равна ${minAmount} ${fiatCurrency}",
|
||||||
|
|
||||||
"outdated_electrum_wallet_receive_warning": "Если этот кошелек имеет мнемоническую фразу из 12 слов и был создан в Cake, НЕ переводите биткойны на этот кошелек. Любые BTC, переведенные на этот кошелек, могут быть потеряны. Создайте новый кошелек с мнемоническои фразы из 24 слов (коснитесь меню в правом верхнем углу, выберите «Кошельки», выберите «Создать новый кошелек», затем выберите «Bitcoin») и НЕМЕДЛЕННО переведите туда свои BTC. Новые (24 слова) кошельки BTC от Cake безопасны",
|
"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_amount" : "Сума",
|
||||||
"transaction_details_fee" : "Комісія",
|
"transaction_details_fee" : "Комісія",
|
||||||
"transaction_details_copied" : "${title} скопійовано в буфер обміну",
|
"transaction_details_copied" : "${title} скопійовано в буфер обміну",
|
||||||
"transaction_details_recipient_address" : "Адреса отримувача",
|
"transaction_details_recipient_address" : "Адреси одержувачів",
|
||||||
|
|
||||||
|
|
||||||
"wallet_list_title" : "Monero Гаманець",
|
"wallet_list_title" : "Monero Гаманець",
|
||||||
|
@ -483,5 +483,7 @@
|
||||||
"moonpay_alert_text" : "Значення суми має бути більшим або дорівнювати ${minAmount} ${fiatCurrency}",
|
"moonpay_alert_text" : "Значення суми має бути більшим або дорівнювати ${minAmount} ${fiatCurrency}",
|
||||||
|
|
||||||
"outdated_electrum_wallet_receive_warning": "Якщо цей гаманець має мнемонічну фразу з 12 слів і був створений у Cake, НЕ переводьте біткойни на цей гаманець. Будь-які BTC, переведений на цей гаманець, можуть бути втраченими. Створіть новий гаманець з мнемонічною фразою з 24 слів (торкніться меню у верхньому правому куті, виберіть Гаманці, виберіть Створити новий гаманець, потім виберіть Bitcoin) і НЕГАЙНО переведіть туди свії BTC. Нові (з мнемонічною фразою з 24 слів) гаманці BTC від Cake надійно захищені",
|
"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}",
|
"moonpay_alert_text" : "金额的价值必须大于或等于 ${minAmount} ${fiatCurrency}",
|
||||||
|
|
||||||
"outdated_electrum_wallet_receive_warning": "如果这个钱包有一个 12 字的种子并且是在 Cake 中创建的,不要将比特币存入这个钱包。 任何转移到此钱包的 BTC 都可能丢失。 创建一个新的 24 字钱包(点击右上角的菜单,选择钱包,选择创建新钱包,然后选择比特币)并立即将您的 BTC 移到那里。 Cake 的新(24 字)BTC 钱包是安全的",
|
"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