mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-19 05:58:50 +02:00
* chore: Create Base package template * chore: Update configuration scripts and dependencies to include 'base' coin support * chore: Update pubspec.yaml, adjust SDK constraints, and add new dependencies * feat: Add support for base wallet type and cryptocurrency in related configurations * feat: Implement BaseWallet and DefaultBaseTokens classes for managing base cryptocurrency transactions * feat: Add BaseTransactionHistory and BaseTransactionInfo classes for handling base cryptocurrency transaction data * feat: Implement BaseClient, BaseWalletService, and BaseMnemonicIsIncorrectException * feat: Setup base proxy for main package and adjust token class name * feat: Setup initial base node configuration * feat: Integrate support for base wallet type across various functions and services * feat: Add base support to exchange and outputs * feat: Add base wallet type integration to wallet creation and node management * feat: Add base support to transaction details and transaction list item * feat: Implement BaseURI class and add base support across wallet creation and keys view models * feat: Add support for BaseScan preference in settings store * feat: Integrate Base support into various workflows and documentation * feat: Addingbase config to windows and secret key support * feat: Add base support to settings and address handling * chore: Move walletTypeToCurrency to another file and adjust across codebase * feat: Add 'basescan_history' string localization * feat: Remove Cryptocurrency.base, it doesn't have a base currency * feat: Set eth as native currency * feat: Enhance Base support across various sending, exchange, transaction details, fees, dashboard and balance * feat: Integrate Base wallet support in advanced privacy settings and home settings view models * feat: Add Base wallet support with icon and integration across providers, default settings migration, preferences, wallet connect, settings and token utilities * feat: Update currency handling to use baseEth for Base wallet integration across various components * fix: Update default token symbol to ETH in Base wallet transaction model * refactor: Change default currency references from BASE to ETH across client, transaction info, and wallet components * feat: Introduce normalizedIconPath for CryptoCurrency to standardize icon retrieval across wallet components * fix: Include baseEth as a native token in EVMChainClient for currency handling * chore: Update base_icon.png * feat: Add more nodes to base_node_list.yml * refactor: Update wallet icon retrieval to use normalizedIconPath * chore: Remove unused cases and cleanup impl. * feat: Add base proxy generation to configure * refactor: Update base proxy and generation code in configure.dart * feat: Add missing wallet and mono images * fix: Wrong image path for pr and add missing base qr image * feat: Enhance EVMTransactionErrorFeesHandler to parse new insufficient funds error format and calculate transaction fees in ETH and USD * feat: Add gas price safety buffer for Base chain transactions to improve fee estimation accuracy, also fixes send all not calculating correctly * Update model_generator.sh [skip ci] * Update assets/base_node_list.yml [skip ci] * Update cw_base/lib/default_base_erc20_tokens.dart [skip ci] * Review fixes * fixes --------- Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>
132 lines
4.8 KiB
Dart
132 lines
4.8 KiB
Dart
import 'package:cake_wallet/src/screens/wallet_connect/utils/string_parsing.dart';
|
|
|
|
class EVMTransactionErrorFeesHandler {
|
|
EVMTransactionErrorFeesHandler({
|
|
this.balanceWei,
|
|
this.balanceEth,
|
|
this.balanceUsd,
|
|
this.txCostWei,
|
|
this.txCostEth,
|
|
this.txCostUsd,
|
|
this.overshotWei,
|
|
this.overshotEth,
|
|
this.overshotUsd,
|
|
this.error,
|
|
});
|
|
|
|
String? balanceWei;
|
|
String? balanceEth;
|
|
String? balanceUsd;
|
|
|
|
String? txCostWei;
|
|
String? txCostEth;
|
|
String? txCostUsd;
|
|
|
|
String? overshotWei;
|
|
String? overshotEth;
|
|
String? overshotUsd;
|
|
|
|
String? error;
|
|
|
|
factory EVMTransactionErrorFeesHandler.parseEthereumFeesErrorMessage(
|
|
String errorMessage,
|
|
double assetPriceUsd,
|
|
) {
|
|
// Pattern: "insufficient funds for gas * price + value: have 4728796358953246 want 4728796842182575"
|
|
RegExp insufficientFundsRegExp = RegExp(r'have (\d+) want (\d+)');
|
|
Match? insufficientFundsMatch = insufficientFundsRegExp.firstMatch(errorMessage);
|
|
|
|
if (insufficientFundsMatch != null) {
|
|
try {
|
|
// Extract the numerical strings from the new format
|
|
String balanceStr = insufficientFundsMatch.group(1)!;
|
|
String requiredStr = insufficientFundsMatch.group(2)!;
|
|
|
|
// Parse the numerical strings to BigInt
|
|
BigInt balanceWei = BigInt.parse(balanceStr);
|
|
BigInt requiredWei = BigInt.parse(requiredStr);
|
|
|
|
// Calculate overshot (how much more is needed)
|
|
BigInt overshotWei = requiredWei - balanceWei;
|
|
|
|
// The transaction cost is the required amount
|
|
BigInt txCostWei = requiredWei;
|
|
|
|
// Convert wei to ETH (1 ETH = 1e18 wei)
|
|
double balanceEth = balanceWei.toDouble() / 1e18;
|
|
double txCostEth = txCostWei.toDouble() / 1e18;
|
|
double overshotEth = overshotWei.toDouble() / 1e18;
|
|
|
|
// Calculate the USD values
|
|
double balanceUsd = balanceEth * assetPriceUsd;
|
|
double txCostUsd = txCostEth * assetPriceUsd;
|
|
double overshotUsd = overshotEth * assetPriceUsd;
|
|
|
|
return EVMTransactionErrorFeesHandler(
|
|
balanceWei: balanceWei.toString(),
|
|
balanceEth: balanceEth.toString().safeSubString(0, 12),
|
|
balanceUsd: balanceUsd.toString().safeSubString(0, 4),
|
|
txCostWei: txCostWei.toString(),
|
|
txCostEth: txCostEth.toString().safeSubString(0, 12),
|
|
txCostUsd: txCostUsd.toString().safeSubString(0, 4),
|
|
overshotWei: overshotWei.toString(),
|
|
overshotEth: overshotEth.toString().safeSubString(0, 12),
|
|
overshotUsd: overshotUsd.toString().safeSubString(0, 4),
|
|
);
|
|
} catch (e) {}
|
|
}
|
|
|
|
// Define Regular Expressions to extract the numerical values
|
|
RegExp balanceRegExp = RegExp(r'balance (\d+)');
|
|
RegExp txCostRegExp = RegExp(r'tx cost (\d+)');
|
|
RegExp overshotRegExp = RegExp(r'overshot (\d+)');
|
|
|
|
// Match the patterns in the error message
|
|
Match? balanceMatch = balanceRegExp.firstMatch(errorMessage);
|
|
Match? txCostMatch = txCostRegExp.firstMatch(errorMessage);
|
|
Match? overshotMatch = overshotRegExp.firstMatch(errorMessage);
|
|
|
|
// Check if all required values are found
|
|
if (balanceMatch != null && txCostMatch != null && overshotMatch != null) {
|
|
try {
|
|
// Extract the numerical strings
|
|
String balanceStr = balanceMatch.group(1)!;
|
|
String txCostStr = txCostMatch.group(1)!;
|
|
String overshotStr = overshotMatch.group(1)!;
|
|
|
|
// Parse the numerical strings to BigInt
|
|
BigInt balanceWei = BigInt.parse(balanceStr);
|
|
BigInt txCostWei = BigInt.parse(txCostStr);
|
|
BigInt overshotWei = BigInt.parse(overshotStr);
|
|
|
|
// Convert wei to ETH (1 ETH = 1e18 wei)
|
|
double balanceEth = balanceWei.toDouble() / 1e18;
|
|
double txCostEth = txCostWei.toDouble() / 1e18;
|
|
double overshotEth = overshotWei.toDouble() / 1e18;
|
|
|
|
// Calculate the USD values
|
|
double balanceUsd = balanceEth * assetPriceUsd;
|
|
double txCostUsd = txCostEth * assetPriceUsd;
|
|
double overshotUsd = overshotEth * assetPriceUsd;
|
|
|
|
return EVMTransactionErrorFeesHandler(
|
|
balanceWei: balanceWei.toString(),
|
|
balanceEth: balanceEth.toString().safeSubString(0, 12),
|
|
balanceUsd: balanceUsd.toString().safeSubString(0, 4),
|
|
txCostWei: txCostWei.toString(),
|
|
txCostEth: txCostEth.toString().safeSubString(0, 12),
|
|
txCostUsd: txCostUsd.toString().safeSubString(0, 4),
|
|
overshotWei: overshotWei.toString(),
|
|
overshotEth: overshotEth.toString().safeSubString(0, 12),
|
|
overshotUsd: overshotUsd.toString().safeSubString(0, 4),
|
|
);
|
|
} catch (e) {
|
|
// If parsing fails, continue to error case
|
|
}
|
|
}
|
|
|
|
// If both parsing attempts fail, return an error message
|
|
return EVMTransactionErrorFeesHandler(error: 'Could not parse the error message.');
|
|
}
|
|
}
|