mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2024-11-17 17:57:40 +00:00
WIP: ADD ETH
This commit is contained in:
parent
c6d5ad598c
commit
b2c40c014a
1 changed files with 106 additions and 23 deletions
|
@ -12,15 +12,18 @@ import 'package:stackwallet/utilities/prefs.dart';
|
||||||
import 'package:string_to_hex/string_to_hex.dart';
|
import 'package:string_to_hex/string_to_hex.dart';
|
||||||
import 'package:web3dart/web3dart.dart';
|
import 'package:web3dart/web3dart.dart';
|
||||||
import 'package:web3dart/web3dart.dart' as Transaction;
|
import 'package:web3dart/web3dart.dart' as Transaction;
|
||||||
// import 'package:string_to_hex/string_to_hex.dart';
|
|
||||||
// import 'package:web3dart/credentials.dart';
|
|
||||||
// import 'package:web3dart/web3dart.dart';
|
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart';
|
||||||
|
|
||||||
import 'package:stackwallet/hive/db.dart';
|
import 'package:stackwallet/hive/db.dart';
|
||||||
import 'package:stackwallet/utilities/logger.dart';
|
import 'package:stackwallet/utilities/logger.dart';
|
||||||
import 'package:stackwallet/services/coins/coin_service.dart';
|
import 'package:stackwallet/services/coins/coin_service.dart';
|
||||||
|
|
||||||
|
import 'package:stackwallet/services/event_bus/events/global/node_connection_status_changed_event.dart';
|
||||||
|
import 'package:stackwallet/services/event_bus/events/global/refresh_percent_changed_event.dart';
|
||||||
|
import 'package:stackwallet/services/event_bus/events/global/wallet_sync_status_changed_event.dart';
|
||||||
|
import 'package:stackwallet/services/event_bus/global_event_bus.dart';
|
||||||
|
|
||||||
const int MINIMUM_CONFIRMATIONS = 1;
|
const int MINIMUM_CONFIRMATIONS = 1;
|
||||||
const int DUST_LIMIT = 294;
|
const int DUST_LIMIT = 294;
|
||||||
|
|
||||||
|
@ -55,8 +58,7 @@ class EthereumWallet extends CoinServiceAPI {
|
||||||
late PriceAPI _priceAPI;
|
late PriceAPI _priceAPI;
|
||||||
final _prefs = Prefs.instance;
|
final _prefs = Prefs.instance;
|
||||||
final _client = Web3Client(
|
final _client = Web3Client(
|
||||||
"https://mainnet.infura.io/v3/22677300bf774e49a458b73313ee56ba",
|
"https://goerli.infura.io/v3/22677300bf774e49a458b73313ee56ba", Client());
|
||||||
Client());
|
|
||||||
|
|
||||||
late EthPrivateKey _credentials;
|
late EthPrivateKey _credentials;
|
||||||
|
|
||||||
|
@ -108,15 +110,19 @@ class EthereumWallet extends CoinServiceAPI {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<String> confirmSend({required Map<String, dynamic> txData}) async {
|
Future<String> confirmSend({required Map<String, dynamic> txData}) async {
|
||||||
|
print("CALLING CONFIRM SEND WITH $txData");
|
||||||
|
final gasPrice = await _client.getGasPrice();
|
||||||
|
print("GAS PRICE IS $gasPrice");
|
||||||
|
|
||||||
|
// final fee = "21,000" * (gasPrice! + 2 );
|
||||||
|
final tx = Transaction.Transaction(
|
||||||
|
to: EthereumAddress.fromHex(txData['addresss'] as String),
|
||||||
|
gasPrice: gasPrice,
|
||||||
|
maxGas: 21000,
|
||||||
|
value: EtherAmount.fromUnitAndValue(EtherUnit.ether, 1));
|
||||||
final transaction = await _client.sendTransaction(
|
final transaction = await _client.sendTransaction(
|
||||||
_credentials,
|
_credentials,
|
||||||
Transaction(
|
tx,
|
||||||
to: EthereumAddress.fromHex(
|
|
||||||
'0xC914Bb2ba888e3367bcecEb5C2d99DF7C7423706'),
|
|
||||||
gasPrice: EtherAmount.inWei(BigInt.one),
|
|
||||||
maxGas: 100000,
|
|
||||||
value: EtherAmount.fromUnitAndValue(EtherUnit.ether, 1),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return transaction;
|
return transaction;
|
||||||
|
@ -129,9 +135,11 @@ class EthereumWallet extends CoinServiceAPI {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<int> estimateFeeFor(int satoshiAmount, int feeRate) {
|
Future<int> estimateFeeFor(int satoshiAmount, int feeRate) async {
|
||||||
|
print("CALLING ESTIMATE FEE");
|
||||||
// TODO: implement estimateFeeFor
|
// TODO: implement estimateFeeFor
|
||||||
throw UnimplementedError();
|
// throw UnimplementedError();
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -145,7 +153,6 @@ class EthereumWallet extends CoinServiceAPI {
|
||||||
Future<FeeObject>? _feeObject;
|
Future<FeeObject>? _feeObject;
|
||||||
|
|
||||||
Future<FeeObject> _getFees() async {
|
Future<FeeObject> _getFees() async {
|
||||||
// TODO: implement _getFees
|
|
||||||
return FeeObject(
|
return FeeObject(
|
||||||
numberOfBlocksFast: 10,
|
numberOfBlocksFast: 10,
|
||||||
numberOfBlocksAverage: 10,
|
numberOfBlocksAverage: 10,
|
||||||
|
@ -168,9 +175,10 @@ class EthereumWallet extends CoinServiceAPI {
|
||||||
throw UnimplementedError();
|
throw UnimplementedError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool _hasCalledExit = false;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
// TODO: implement hasCalledExit
|
bool get hasCalledExit => _hasCalledExit;
|
||||||
bool get hasCalledExit => throw UnimplementedError();
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> initializeExisting() async {
|
Future<void> initializeExisting() async {
|
||||||
|
@ -241,6 +249,29 @@ class EthereumWallet extends CoinServiceAPI {
|
||||||
@override
|
@override
|
||||||
Future<List<String>> get mnemonic => _getMnemonicList();
|
Future<List<String>> get mnemonic => _getMnemonicList();
|
||||||
|
|
||||||
|
// Future<int> get chainHeight async {
|
||||||
|
// try {
|
||||||
|
// final result = await _client.getSyncStatus();
|
||||||
|
// print("HEIGHT IS $result");
|
||||||
|
// return 1 as int;
|
||||||
|
// } catch (e, s) {
|
||||||
|
// Logging.instance.log("Exception caught in chainHeight: $e\n$s",
|
||||||
|
// level: LogLevel.Error);
|
||||||
|
// return -1;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// int get storedChainHeight {
|
||||||
|
// final storedHeight = DB.instance
|
||||||
|
// .get<dynamic>(boxName: walletId, key: "storedChainHeight") as int?;
|
||||||
|
// return storedHeight ?? 0;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Future<void> updateStoredChainHeight({required int newHeight}) async {
|
||||||
|
// await DB.instance.put<dynamic>(
|
||||||
|
// boxName: walletId, key: "storedChainHeight", value: newHeight);
|
||||||
|
// }
|
||||||
|
|
||||||
Future<List<String>> _getMnemonicList() async {
|
Future<List<String>> _getMnemonicList() async {
|
||||||
final mnemonicString =
|
final mnemonicString =
|
||||||
await _secureStore.read(key: '${_walletId}_mnemonic');
|
await _secureStore.read(key: '${_walletId}_mnemonic');
|
||||||
|
@ -255,13 +286,22 @@ class EthereumWallet extends CoinServiceAPI {
|
||||||
// TODO: implement pendingBalance
|
// TODO: implement pendingBalance
|
||||||
Future<Decimal> get pendingBalance => throw UnimplementedError();
|
Future<Decimal> get pendingBalance => throw UnimplementedError();
|
||||||
|
|
||||||
|
// Future<Decimal> transactionFee(int satoshiAmount) {}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Map<String, dynamic>> prepareSend(
|
Future<Map<String, dynamic>> prepareSend(
|
||||||
{required String address,
|
{required String address,
|
||||||
required int satoshiAmount,
|
required int satoshiAmount,
|
||||||
Map<String, dynamic>? args}) {
|
Map<String, dynamic>? args}) async {
|
||||||
// TODO: implement prepareSend
|
print("CALLING PREPARE SEND ${Decimal.fromInt(satoshiAmount)}");
|
||||||
throw UnimplementedError();
|
|
||||||
|
Map<String, dynamic> txData = {
|
||||||
|
"fee": 0,
|
||||||
|
"addresss": address,
|
||||||
|
"recipientAmt": satoshiAmount,
|
||||||
|
};
|
||||||
|
|
||||||
|
return txData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -303,9 +343,50 @@ class EthereumWallet extends CoinServiceAPI {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> refresh() {
|
Future<void> refresh() async {
|
||||||
// TODO: implement refresh
|
if (refreshMutex) {
|
||||||
throw UnimplementedError();
|
Logging.instance.log("$walletId $walletName refreshMutex denied",
|
||||||
|
level: LogLevel.Info);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
refreshMutex = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
GlobalEventBus.instance.fire(
|
||||||
|
WalletSyncStatusChangedEvent(
|
||||||
|
WalletSyncStatus.syncing,
|
||||||
|
walletId,
|
||||||
|
coin,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.0, walletId));
|
||||||
|
GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.1, walletId));
|
||||||
|
|
||||||
|
// final currentHeight = await chainHeight;
|
||||||
|
const storedHeight = 1; //await storedChainHeight;
|
||||||
|
|
||||||
|
} catch (error, strace) {
|
||||||
|
refreshMutex = false;
|
||||||
|
GlobalEventBus.instance.fire(
|
||||||
|
NodeConnectionStatusChangedEvent(
|
||||||
|
NodeConnectionStatus.disconnected,
|
||||||
|
walletId,
|
||||||
|
coin,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
GlobalEventBus.instance.fire(
|
||||||
|
WalletSyncStatusChangedEvent(
|
||||||
|
WalletSyncStatus.unableToSync,
|
||||||
|
walletId,
|
||||||
|
coin,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
Logging.instance.log(
|
||||||
|
"Caught exception in refreshWalletData(): $error\n$strace",
|
||||||
|
level: LogLevel.Warning);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -327,6 +408,8 @@ class EthereumWallet extends CoinServiceAPI {
|
||||||
// TODO: Check difference between total and available balance for eth
|
// TODO: Check difference between total and available balance for eth
|
||||||
Future<Decimal> get totalBalance async {
|
Future<Decimal> get totalBalance async {
|
||||||
EtherAmount ethBalance = await _client.getBalance(_credentials.address);
|
EtherAmount ethBalance = await _client.getBalance(_credentials.address);
|
||||||
|
print(
|
||||||
|
"BALANCE NOW IS ${ethBalance.getValueInUnit(EtherUnit.ether).toString()}");
|
||||||
return Decimal.parse(ethBalance.getValueInUnit(EtherUnit.ether).toString());
|
return Decimal.parse(ethBalance.getValueInUnit(EtherUnit.ether).toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue