mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-01-10 21:04:53 +00:00
Add Initial Transaction priorities for eth
Add estimated gas price
This commit is contained in:
parent
00673005b9
commit
a96f91fbee
8 changed files with 136 additions and 13 deletions
|
@ -1,4 +1,5 @@
|
||||||
import 'package:cw_core/node.dart';
|
import 'package:cw_core/node.dart';
|
||||||
|
import 'package:cw_ethereum/ethereum_transaction_priority.dart';
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
import 'package:web3dart/web3dart.dart';
|
import 'package:web3dart/web3dart.dart';
|
||||||
|
|
||||||
|
@ -21,5 +22,16 @@ class EthereumClient {
|
||||||
return _client.getBalance(private.address);
|
return _client.getBalance(private.address);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<EtherAmount> getGasPrice() async => _client.getGasPrice();
|
Future<int> getGasUnitPrice() async {
|
||||||
}
|
final gasPrice = await _client.getGasPrice();
|
||||||
|
return gasPrice.getInWei.toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<int>> getEstimatedGasForPriorities() async {
|
||||||
|
final result = await Future.wait(EthereumTransactionPriority.all.map((priority) =>
|
||||||
|
_client.estimateGas(
|
||||||
|
maxPriorityFeePerGas: EtherAmount.fromUnitAndValue(EtherUnit.gwei, priority.value))));
|
||||||
|
|
||||||
|
return result.map((e) => e.toInt()).toList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
52
cw_ethereum/lib/ethereum_transaction_priority.dart
Normal file
52
cw_ethereum/lib/ethereum_transaction_priority.dart
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
import 'package:cw_core/transaction_priority.dart';
|
||||||
|
|
||||||
|
class EthereumTransactionPriority extends TransactionPriority {
|
||||||
|
final int value;
|
||||||
|
|
||||||
|
const EthereumTransactionPriority({required String title, required int raw, required this.value})
|
||||||
|
: super(title: title, raw: raw);
|
||||||
|
|
||||||
|
static const List<EthereumTransactionPriority> all = [fast, medium, slow];
|
||||||
|
static const EthereumTransactionPriority slow =
|
||||||
|
EthereumTransactionPriority(title: 'Slow', raw: 0, value: 2);
|
||||||
|
static const EthereumTransactionPriority medium =
|
||||||
|
EthereumTransactionPriority(title: 'Medium', raw: 1, value: 5);
|
||||||
|
static const EthereumTransactionPriority fast =
|
||||||
|
EthereumTransactionPriority(title: 'Fast', raw: 2, value: 10);
|
||||||
|
|
||||||
|
static EthereumTransactionPriority deserialize({required int raw}) {
|
||||||
|
switch (raw) {
|
||||||
|
case 0:
|
||||||
|
return slow;
|
||||||
|
case 1:
|
||||||
|
return medium;
|
||||||
|
case 2:
|
||||||
|
return fast;
|
||||||
|
default:
|
||||||
|
throw Exception('Unexpected token: $raw for EthereumTransactionPriority deserialize');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String get units => 'gas';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
var label = '';
|
||||||
|
|
||||||
|
switch (this) {
|
||||||
|
case EthereumTransactionPriority.slow:
|
||||||
|
label = 'slow';
|
||||||
|
break;
|
||||||
|
case EthereumTransactionPriority.medium:
|
||||||
|
label = 'Medium';
|
||||||
|
break;
|
||||||
|
case EthereumTransactionPriority.fast:
|
||||||
|
label = 'Fast';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
}
|
|
@ -14,6 +14,7 @@ import 'package:cw_ethereum/ethereum_balance.dart';
|
||||||
import 'package:cw_ethereum/ethereum_client.dart';
|
import 'package:cw_ethereum/ethereum_client.dart';
|
||||||
import 'package:cw_ethereum/ethereum_transaction_history.dart';
|
import 'package:cw_ethereum/ethereum_transaction_history.dart';
|
||||||
import 'package:cw_ethereum/ethereum_transaction_info.dart';
|
import 'package:cw_ethereum/ethereum_transaction_info.dart';
|
||||||
|
import 'package:cw_ethereum/ethereum_transaction_priority.dart';
|
||||||
import 'package:cw_ethereum/ethereum_wallet_addresses.dart';
|
import 'package:cw_ethereum/ethereum_wallet_addresses.dart';
|
||||||
import 'package:cw_ethereum/file.dart';
|
import 'package:cw_ethereum/file.dart';
|
||||||
import 'package:mobx/mobx.dart';
|
import 'package:mobx/mobx.dart';
|
||||||
|
@ -37,6 +38,7 @@ abstract class EthereumWalletBase
|
||||||
}) : syncStatus = NotConnectedSyncStatus(),
|
}) : syncStatus = NotConnectedSyncStatus(),
|
||||||
_password = password,
|
_password = password,
|
||||||
_mnemonic = mnemonic,
|
_mnemonic = mnemonic,
|
||||||
|
_feeRates = [],
|
||||||
walletAddresses = EthereumWalletAddresses(walletInfo),
|
walletAddresses = EthereumWalletAddresses(walletInfo),
|
||||||
balance = ObservableMap<CryptoCurrency, EthereumBalance>.of(
|
balance = ObservableMap<CryptoCurrency, EthereumBalance>.of(
|
||||||
{CryptoCurrency.eth: initialBalance ?? EthereumBalance(available: 0, additional: 0)}),
|
{CryptoCurrency.eth: initialBalance ?? EthereumBalance(available: 0, additional: 0)}),
|
||||||
|
@ -51,7 +53,8 @@ abstract class EthereumWalletBase
|
||||||
|
|
||||||
late EthereumClient _client;
|
late EthereumClient _client;
|
||||||
|
|
||||||
EtherAmount? _gasPrice;
|
List<int> _feeRates;
|
||||||
|
int? _gasPrice;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
WalletAddresses walletAddresses;
|
WalletAddresses walletAddresses;
|
||||||
|
@ -134,10 +137,13 @@ abstract class EthereumWalletBase
|
||||||
try {
|
try {
|
||||||
syncStatus = AttemptingSyncStatus();
|
syncStatus = AttemptingSyncStatus();
|
||||||
await _updateBalance();
|
await _updateBalance();
|
||||||
_gasPrice = await _client.getGasPrice();
|
_gasPrice = await _client.getGasUnitPrice();
|
||||||
|
_feeRates = await _client.getEstimatedGasForPriorities();
|
||||||
|
|
||||||
Timer.periodic(
|
Timer.periodic(
|
||||||
const Duration(minutes: 1), (timer) async => _gasPrice = await _client.getGasPrice());
|
const Duration(minutes: 1), (timer) async => _gasPrice = await _client.getGasUnitPrice());
|
||||||
|
Timer.periodic(const Duration(minutes: 1),
|
||||||
|
(timer) async => _feeRates = await _client.getEstimatedGasForPriorities());
|
||||||
|
|
||||||
syncStatus = SyncedSyncStatus();
|
syncStatus = SyncedSyncStatus();
|
||||||
} catch (e, stacktrace) {
|
} catch (e, stacktrace) {
|
||||||
|
@ -147,12 +153,16 @@ abstract class EthereumWalletBase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int feeRate() {
|
int feeRate(TransactionPriority priority) {
|
||||||
if (_gasPrice != null) {
|
try {
|
||||||
return _gasPrice!.getInEther.toInt();
|
if (priority is EthereumTransactionPriority) {
|
||||||
}
|
return _feeRates[priority.raw] * _gasPrice!;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
} catch (e) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> makePath() async => pathForWallet(name: walletInfo.name, type: walletInfo.type);
|
Future<String> makePath() async => pathForWallet(name: walletInfo.name, type: walletInfo.type);
|
||||||
|
@ -199,8 +209,10 @@ abstract class EthereumWalletBase
|
||||||
|
|
||||||
Future<String> getPrivateKey(String mnemonic, String password) async {
|
Future<String> getPrivateKey(String mnemonic, String password) async {
|
||||||
final seed = bip39.mnemonicToSeedHex(mnemonic);
|
final seed = bip39.mnemonicToSeedHex(mnemonic);
|
||||||
final master = await ED25519_HD_KEY.getMasterKeyFromSeed(HEX.decode(seed),
|
final master = await ED25519_HD_KEY.getMasterKeyFromSeed(
|
||||||
masterSecret: password);
|
HEX.decode(seed),
|
||||||
|
masterSecret: password,
|
||||||
|
);
|
||||||
final privateKey = HEX.encode(master.key);
|
final privateKey = HEX.encode(master.key);
|
||||||
return privateKey;
|
return privateKey;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ class PreferencesKey {
|
||||||
static const bitcoinTransactionPriority = 'current_fee_priority_bitcoin';
|
static const bitcoinTransactionPriority = 'current_fee_priority_bitcoin';
|
||||||
static const havenTransactionPriority = 'current_fee_priority_haven';
|
static const havenTransactionPriority = 'current_fee_priority_haven';
|
||||||
static const litecoinTransactionPriority = 'current_fee_priority_litecoin';
|
static const litecoinTransactionPriority = 'current_fee_priority_litecoin';
|
||||||
|
static const ethereumTransactionPriority = 'current_fee_priority_ethereum';
|
||||||
static const shouldShowReceiveWarning = 'should_show_receive_warning';
|
static const shouldShowReceiveWarning = 'should_show_receive_warning';
|
||||||
static const shouldShowYatPopup = 'should_show_yat_popup';
|
static const shouldShowYatPopup = 'should_show_yat_popup';
|
||||||
static const moneroWalletPasswordUpdateV1Base = 'monero_wallet_update_v1';
|
static const moneroWalletPasswordUpdateV1Base = 'monero_wallet_update_v1';
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
||||||
|
import 'package:cake_wallet/ethereum/ethereum.dart';
|
||||||
import 'package:cake_wallet/haven/haven.dart';
|
import 'package:cake_wallet/haven/haven.dart';
|
||||||
import 'package:cake_wallet/monero/monero.dart';
|
import 'package:cake_wallet/monero/monero.dart';
|
||||||
import 'package:cw_core/transaction_priority.dart';
|
import 'package:cw_core/transaction_priority.dart';
|
||||||
|
@ -14,6 +15,8 @@ List<TransactionPriority> priorityForWalletType(WalletType type) {
|
||||||
return bitcoin!.getLitecoinTransactionPriorities();
|
return bitcoin!.getLitecoinTransactionPriorities();
|
||||||
case WalletType.haven:
|
case WalletType.haven:
|
||||||
return haven!.getTransactionPriorities();
|
return haven!.getTransactionPriorities();
|
||||||
|
case WalletType.ethereum:
|
||||||
|
return ethereum!.getTransactionPriorities();
|
||||||
default:
|
default:
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,4 +24,20 @@ class CWEthereum extends Ethereum {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String getAddress(WalletBase wallet) => (wallet as EthereumWallet).walletAddresses.address;
|
String getAddress(WalletBase wallet) => (wallet as EthereumWallet).walletAddresses.address;
|
||||||
|
|
||||||
|
@override
|
||||||
|
TransactionPriority getDefaultTransactionPriority() => EthereumTransactionPriority.medium;
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<TransactionPriority> getTransactionPriorities() => EthereumTransactionPriority.all;
|
||||||
|
|
||||||
|
@override
|
||||||
|
TransactionPriority deserializeEthereumTransactionPriority(int raw) =>
|
||||||
|
EthereumTransactionPriority.deserialize(raw: raw);
|
||||||
|
|
||||||
|
@override
|
||||||
|
int getEstimatedFee(Object wallet, TransactionPriority priority) {
|
||||||
|
final ethereumWallet = wallet as EthereumWallet;
|
||||||
|
return ethereumWallet.feeRate(priority);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
import 'package:cake_wallet/bitcoin/bitcoin.dart';
|
||||||
import 'package:cake_wallet/entities/pin_code_required_duration.dart';
|
import 'package:cake_wallet/entities/pin_code_required_duration.dart';
|
||||||
import 'package:cake_wallet/entities/preferences_key.dart';
|
import 'package:cake_wallet/entities/preferences_key.dart';
|
||||||
|
import 'package:cake_wallet/ethereum/ethereum.dart';
|
||||||
import 'package:cw_core/transaction_priority.dart';
|
import 'package:cw_core/transaction_priority.dart';
|
||||||
import 'package:cake_wallet/themes/theme_base.dart';
|
import 'package:cake_wallet/themes/theme_base.dart';
|
||||||
import 'package:cake_wallet/themes/theme_list.dart';
|
import 'package:cake_wallet/themes/theme_list.dart';
|
||||||
|
@ -45,7 +46,8 @@ abstract class SettingsStoreBase with Store {
|
||||||
TransactionPriority? initialBitcoinTransactionPriority,
|
TransactionPriority? initialBitcoinTransactionPriority,
|
||||||
TransactionPriority? initialMoneroTransactionPriority,
|
TransactionPriority? initialMoneroTransactionPriority,
|
||||||
TransactionPriority? initialHavenTransactionPriority,
|
TransactionPriority? initialHavenTransactionPriority,
|
||||||
TransactionPriority? initialLitecoinTransactionPriority})
|
TransactionPriority? initialLitecoinTransactionPriority,
|
||||||
|
TransactionPriority? initialEthereumTransactionPriority})
|
||||||
: nodes = ObservableMap<WalletType, Node>.of(nodes),
|
: nodes = ObservableMap<WalletType, Node>.of(nodes),
|
||||||
_sharedPreferences = sharedPreferences,
|
_sharedPreferences = sharedPreferences,
|
||||||
fiatCurrency = initialFiatCurrency,
|
fiatCurrency = initialFiatCurrency,
|
||||||
|
@ -76,6 +78,10 @@ abstract class SettingsStoreBase with Store {
|
||||||
priority[WalletType.litecoin] = initialLitecoinTransactionPriority;
|
priority[WalletType.litecoin] = initialLitecoinTransactionPriority;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (initialEthereumTransactionPriority != null) {
|
||||||
|
priority[WalletType.ethereum] = initialEthereumTransactionPriority;
|
||||||
|
}
|
||||||
|
|
||||||
reaction(
|
reaction(
|
||||||
(_) => fiatCurrency,
|
(_) => fiatCurrency,
|
||||||
(FiatCurrency fiatCurrency) => sharedPreferences.setString(
|
(FiatCurrency fiatCurrency) => sharedPreferences.setString(
|
||||||
|
@ -101,6 +107,9 @@ abstract class SettingsStoreBase with Store {
|
||||||
case WalletType.haven:
|
case WalletType.haven:
|
||||||
key = PreferencesKey.havenTransactionPriority;
|
key = PreferencesKey.havenTransactionPriority;
|
||||||
break;
|
break;
|
||||||
|
case WalletType.ethereum:
|
||||||
|
key = PreferencesKey.ethereumTransactionPriority;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
key = null;
|
key = null;
|
||||||
}
|
}
|
||||||
|
@ -257,6 +266,7 @@ abstract class SettingsStoreBase with Store {
|
||||||
|
|
||||||
TransactionPriority? havenTransactionPriority;
|
TransactionPriority? havenTransactionPriority;
|
||||||
TransactionPriority? litecoinTransactionPriority;
|
TransactionPriority? litecoinTransactionPriority;
|
||||||
|
TransactionPriority? ethereumTransactionPriority;
|
||||||
|
|
||||||
if (sharedPreferences.getInt(PreferencesKey.havenTransactionPriority) != null) {
|
if (sharedPreferences.getInt(PreferencesKey.havenTransactionPriority) != null) {
|
||||||
havenTransactionPriority = monero?.deserializeMoneroTransactionPriority(
|
havenTransactionPriority = monero?.deserializeMoneroTransactionPriority(
|
||||||
|
@ -266,11 +276,16 @@ abstract class SettingsStoreBase with Store {
|
||||||
litecoinTransactionPriority = bitcoin?.deserializeLitecoinTransactionPriority(
|
litecoinTransactionPriority = bitcoin?.deserializeLitecoinTransactionPriority(
|
||||||
sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority)!);
|
sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority)!);
|
||||||
}
|
}
|
||||||
|
if (sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority) != null) {
|
||||||
|
ethereumTransactionPriority = bitcoin?.deserializeLitecoinTransactionPriority(
|
||||||
|
sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority)!);
|
||||||
|
}
|
||||||
|
|
||||||
moneroTransactionPriority ??= monero?.getDefaultTransactionPriority();
|
moneroTransactionPriority ??= monero?.getDefaultTransactionPriority();
|
||||||
bitcoinTransactionPriority ??= bitcoin?.getMediumTransactionPriority();
|
bitcoinTransactionPriority ??= bitcoin?.getMediumTransactionPriority();
|
||||||
havenTransactionPriority ??= monero?.getDefaultTransactionPriority();
|
havenTransactionPriority ??= monero?.getDefaultTransactionPriority();
|
||||||
litecoinTransactionPriority ??= bitcoin?.getLitecoinTransactionPriorityMedium();
|
litecoinTransactionPriority ??= bitcoin?.getLitecoinTransactionPriorityMedium();
|
||||||
|
ethereumTransactionPriority ??= ethereum?.getDefaultTransactionPriority();
|
||||||
|
|
||||||
final currentBalanceDisplayMode = BalanceDisplayMode.deserialize(
|
final currentBalanceDisplayMode = BalanceDisplayMode.deserialize(
|
||||||
raw: sharedPreferences
|
raw: sharedPreferences
|
||||||
|
@ -371,6 +386,7 @@ abstract class SettingsStoreBase with Store {
|
||||||
initialBitcoinTransactionPriority: bitcoinTransactionPriority,
|
initialBitcoinTransactionPriority: bitcoinTransactionPriority,
|
||||||
initialHavenTransactionPriority: havenTransactionPriority,
|
initialHavenTransactionPriority: havenTransactionPriority,
|
||||||
initialLitecoinTransactionPriority: litecoinTransactionPriority,
|
initialLitecoinTransactionPriority: litecoinTransactionPriority,
|
||||||
|
initialEthereumTransactionPriority: ethereumTransactionPriority,
|
||||||
shouldShowYatPopup: shouldShowYatPopup);
|
shouldShowYatPopup: shouldShowYatPopup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,6 +414,11 @@ abstract class SettingsStoreBase with Store {
|
||||||
sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority)!) ??
|
sharedPreferences.getInt(PreferencesKey.litecoinTransactionPriority)!) ??
|
||||||
priority[WalletType.litecoin]!;
|
priority[WalletType.litecoin]!;
|
||||||
}
|
}
|
||||||
|
if (sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority) != null) {
|
||||||
|
priority[WalletType.ethereum] = ethereum?.deserializeEthereumTransactionPriority(
|
||||||
|
sharedPreferences.getInt(PreferencesKey.ethereumTransactionPriority)!) ??
|
||||||
|
priority[WalletType.ethereum]!;
|
||||||
|
}
|
||||||
|
|
||||||
balanceDisplayMode = BalanceDisplayMode.deserialize(
|
balanceDisplayMode = BalanceDisplayMode.deserialize(
|
||||||
raw: sharedPreferences
|
raw: sharedPreferences
|
||||||
|
|
|
@ -477,6 +477,7 @@ Future<void> generateEthereum(bool hasImplementation) async {
|
||||||
const ethereumCommonHeaders = """
|
const ethereumCommonHeaders = """
|
||||||
""";
|
""";
|
||||||
const ethereumCWHeaders = """
|
const ethereumCWHeaders = """
|
||||||
|
import 'package:cw_core/transaction_priority.dart';
|
||||||
import 'package:cw_core/wallet_base.dart';
|
import 'package:cw_core/wallet_base.dart';
|
||||||
import 'package:cw_core/wallet_credentials.dart';
|
import 'package:cw_core/wallet_credentials.dart';
|
||||||
import 'package:cw_core/wallet_info.dart';
|
import 'package:cw_core/wallet_info.dart';
|
||||||
|
@ -485,6 +486,7 @@ import 'package:cw_ethereum/ethereum_mnemonics.dart';
|
||||||
import 'package:cw_ethereum/ethereum_wallet.dart';
|
import 'package:cw_ethereum/ethereum_wallet.dart';
|
||||||
import 'package:cw_ethereum/ethereum_wallet_creation_credentials.dart';
|
import 'package:cw_ethereum/ethereum_wallet_creation_credentials.dart';
|
||||||
import 'package:cw_ethereum/ethereum_wallet_service.dart';
|
import 'package:cw_ethereum/ethereum_wallet_service.dart';
|
||||||
|
import 'package:cw_ethereum/ethereum_transaction_priority.dart';
|
||||||
import 'package:hive/hive.dart';
|
import 'package:hive/hive.dart';
|
||||||
""";
|
""";
|
||||||
const ethereumCwPart = "part 'cw_ethereum.dart';";
|
const ethereumCwPart = "part 'cw_ethereum.dart';";
|
||||||
|
@ -495,6 +497,10 @@ abstract class Ethereum {
|
||||||
WalletCredentials createEthereumNewWalletCredentials({required String name, WalletInfo? walletInfo});
|
WalletCredentials createEthereumNewWalletCredentials({required String name, WalletInfo? walletInfo});
|
||||||
WalletCredentials createEthereumRestoreWalletFromSeedCredentials({required String name, required String mnemonic, required String password});
|
WalletCredentials createEthereumRestoreWalletFromSeedCredentials({required String name, required String mnemonic, required String password});
|
||||||
String getAddress(WalletBase wallet);
|
String getAddress(WalletBase wallet);
|
||||||
|
TransactionPriority getDefaultTransactionPriority();
|
||||||
|
List<TransactionPriority> getTransactionPriorities();
|
||||||
|
TransactionPriority deserializeEthereumTransactionPriority(int raw);
|
||||||
|
int getEstimatedFee(Object wallet, TransactionPriority priority);
|
||||||
}
|
}
|
||||||
""";
|
""";
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue