cake_wallet/cw_ethereum/lib/ethereum_client.dart

73 lines
2 KiB
Dart
Raw Normal View History

2023-04-05 16:01:20 +00:00
import 'dart:typed_data';
2023-01-04 14:51:23 +00:00
import 'package:cw_core/node.dart';
import 'package:cw_ethereum/ethereum_transaction_priority.dart';
2023-01-04 14:51:23 +00:00
import 'package:http/http.dart';
2023-03-31 18:41:56 +00:00
import 'package:web3dart/crypto.dart';
2023-01-04 14:51:23 +00:00
import 'package:web3dart/web3dart.dart';
class EthereumClient {
Web3Client? _client;
2023-01-04 14:51:23 +00:00
2023-01-13 17:10:38 +00:00
bool connect(Node node) {
2023-01-04 14:51:23 +00:00
try {
_client = Web3Client(node.uri.toString(), Client());
2023-01-04 14:51:23 +00:00
return true;
} catch (e) {
return false;
}
}
2023-04-05 16:01:20 +00:00
Future<EtherAmount> getBalance(EthereumAddress address) async {
return await _client!.getBalance(address);
2023-01-04 14:51:23 +00:00
}
Future<int> getGasUnitPrice() async {
final gasPrice = await _client!.getGasPrice();
return gasPrice.getInWei.toInt();
}
Future<List<int>> getEstimatedGasForPriorities() async {
2023-01-13 17:10:38 +00:00
final result = await Future.wait(EthereumTransactionPriority.all.map(
(priority) => _client!.estimateGas(
2023-03-31 18:41:56 +00:00
// maxPriorityFeePerGas: EtherAmount.fromUnitAndValue(EtherUnit.gwei, priority.tip),
// maxFeePerGas: EtherAmount.fromUnitAndValue(EtherUnit.gwei, 100),
),
2023-01-13 17:10:38 +00:00
));
return result.map((e) => e.toInt()).toList();
}
2023-03-16 17:24:21 +00:00
2023-04-05 16:01:20 +00:00
Future<String> signTransaction(
EthPrivateKey privateKey,
String toAddress,
String amount,
int fee,
) async {
2023-03-31 18:41:56 +00:00
final transaction = Transaction(
2023-04-05 16:01:20 +00:00
from: privateKey.address,
2023-03-31 18:41:56 +00:00
to: EthereumAddress.fromHex(toAddress),
2023-04-05 16:01:20 +00:00
value: EtherAmount.fromUnitAndValue(EtherUnit.ether, amount),
// maxPriorityFeePerGas: EtherAmount.inWei(BigInt.from(fee)),
2023-03-31 18:41:56 +00:00
);
2023-04-05 16:01:20 +00:00
final Uint8List signedTransaction = await _client!.signTransaction(privateKey, transaction);
2023-03-31 18:41:56 +00:00
2023-04-05 16:01:20 +00:00
return bytesToHex(signedTransaction);
2023-03-31 18:41:56 +00:00
}
2023-04-05 16:01:20 +00:00
Future<String> sendTransaction(EthPrivateKey privateKey, String toAddress, String amount) async {
2023-03-16 17:24:21 +00:00
final transaction = Transaction(
2023-04-05 16:01:20 +00:00
from: privateKey.address,
2023-03-16 17:24:21 +00:00
to: EthereumAddress.fromHex(toAddress),
value: EtherAmount.fromUnitAndValue(EtherUnit.ether, amount),
);
return await _client!.sendTransaction(
2023-04-05 16:01:20 +00:00
privateKey,
2023-03-16 17:24:21 +00:00
transaction,
);
}
}