stack_wallet/lib/utilities/eth_commons.dart

82 lines
2.6 KiB
Dart
Raw Normal View History

2023-01-25 16:08:27 +00:00
import 'package:bip32/bip32.dart' as bip32;
import 'package:bip39/bip39.dart' as bip39;
2023-03-30 20:50:58 +00:00
import 'package:decimal/decimal.dart';
2023-01-25 16:08:27 +00:00
import "package:hex/hex.dart";
2023-04-06 21:24:56 +00:00
import 'package:stackwallet/utilities/amount/amount.dart';
2023-03-30 20:50:58 +00:00
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
2023-01-20 17:24:19 +00:00
class GasTracker {
2023-03-30 20:50:58 +00:00
final Decimal average;
final Decimal fast;
final Decimal slow;
final int numberOfBlocksFast;
final int numberOfBlocksAverage;
final int numberOfBlocksSlow;
final String lastBlock;
const GasTracker({
2023-01-27 12:32:05 +00:00
required this.average,
required this.fast,
required this.slow,
2023-03-30 20:50:58 +00:00
required this.numberOfBlocksFast,
required this.numberOfBlocksAverage,
required this.numberOfBlocksSlow,
required this.lastBlock,
});
factory GasTracker.fromJson(Map<String, dynamic> json) {
2023-03-30 20:50:58 +00:00
final targetTime = Constants.targetBlockTimeInSeconds(Coin.ethereum);
return GasTracker(
fast: Decimal.parse(json["FastGasPrice"].toString()),
average: Decimal.parse(json["ProposeGasPrice"].toString()),
slow: Decimal.parse(json["SafeGasPrice"].toString()),
// TODO fix hardcoded
numberOfBlocksFast: 30 ~/ targetTime,
numberOfBlocksAverage: 180 ~/ targetTime,
numberOfBlocksSlow: 240 ~/ targetTime,
lastBlock: json["LastBlock"] as String,
);
}
}
const hdPathEthereum = "m/44'/60'/0'/0";
2023-01-25 16:08:27 +00:00
// equal to "0x${keccak256("Transfer(address,address,uint256)".toUint8ListFromUtf8).toHex}";
const kTransferEventSignature =
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef";
String getPrivateKey(String mnemonic, String mnemonicPassphrase) {
2023-01-25 16:08:27 +00:00
final isValidMnemonic = bip39.validateMnemonic(mnemonic);
if (!isValidMnemonic) {
throw 'Invalid mnemonic';
2023-01-20 17:24:19 +00:00
}
2023-01-25 16:08:27 +00:00
final seed = bip39.mnemonicToSeed(mnemonic, passphrase: mnemonicPassphrase);
2023-01-25 16:08:27 +00:00
final root = bip32.BIP32.fromSeed(seed);
const index = 0;
final addressAtIndex = root.derivePath("$hdPathEthereum/$index");
2023-01-25 16:08:27 +00:00
return HEX.encode(addressAtIndex.privateKey as List<int>);
2023-01-20 17:24:19 +00:00
}
2023-04-05 22:06:31 +00:00
Amount estimateFee(int feeRate, int gasLimit, int decimals) {
2023-04-06 23:49:13 +00:00
final gweiAmount = feeRate.toDecimal() / (Decimal.ten.pow(9).toDecimal());
final fee = gasLimit.toDecimal() *
gweiAmount.toDecimal(
scaleOnInfinitePrecision: Coin.ethereum.decimals,
);
//Convert gwei to ETH
2023-04-06 23:49:13 +00:00
final feeInWei = fee * Decimal.ten.pow(9).toDecimal();
final ethAmount = feeInWei / Decimal.ten.pow(decimals).toDecimal();
return Amount.fromDecimal(
ethAmount.toDecimal(
scaleOnInfinitePrecision: Coin.ethereum.decimals,
),
fractionDigits: decimals,
);
}