Drop gas_estimation field from TxData1559 (#34515)

* Drop gas_estimation field from TxData1559

* fix ci

* fix ci

* fix ci

* fix ci

* fix ci

* fix ci

* Address review
This commit is contained in:
Anton Paymyshev
2026-03-12 22:13:34 +07:00
committed by GitHub
parent ce93bfbcfc
commit a95360aa75
25 changed files with 377 additions and 896 deletions
@@ -28,6 +28,7 @@ import org.chromium.brave_wallet.mojom.AssetPrice;
import org.chromium.brave_wallet.mojom.BlockchainToken;
import org.chromium.brave_wallet.mojom.CoinType;
import org.chromium.brave_wallet.mojom.EthTxManagerProxy;
import org.chromium.brave_wallet.mojom.GasEstimation1559;
import org.chromium.brave_wallet.mojom.NetworkInfo;
import org.chromium.brave_wallet.mojom.SolanaSendTransactionOptions;
import org.chromium.brave_wallet.mojom.SolanaTxData;
@@ -61,6 +62,7 @@ public class TxFragment extends Fragment {
private int mCheckedPriorityId;
private int mPreviousCheckedPriorityId;
private final long mSolanaEstimatedTxFee;
@Nullable private GasEstimation1559 mEstimation;
@Nullable private Dialog mEditGasDialog;
// mUpdateTxObjectManually is used to detect do we need to update dialog values
@@ -116,6 +118,7 @@ public class TxFragment extends Fragment {
mUpdateTxObjectManually = updateTxObjectManually;
mSolanaEstimatedTxFee = solanaEstimatedTxFee;
mIsSolanaInstruction = TransactionUtils.isSolanaTx(txInfo);
mEstimation = null;
}
@Override
@@ -153,300 +156,7 @@ public class TxFragment extends Fragment {
TextView editGasFee = view.findViewById(R.id.edit_gas_fee);
editGasFee.setVisibility(isEditTxEnabled(mTxNetwork) ? View.VISIBLE : View.INVISIBLE);
editGasFee.setOnClickListener(
v -> {
if (!canShowDialog()) return;
dismissEditGasDialog();
mEditGasDialog = new Dialog(requireContext());
final Dialog dialog = mEditGasDialog;
dialog.setOnDismissListener(
unused -> {
if (mEditGasDialog == dialog) {
mEditGasDialog = null;
}
mFilterEIP1559TextWatcher.clearDialog();
});
dialog.setContentView(R.layout.brave_wallet_edit_gas);
dialog.show();
mPreviousCheckedPriorityId = mCheckedPriorityId;
LinearLayout gasPriceLayout = dialog.findViewById(R.id.gas_price_layout);
LinearLayout gasLimitLayout = dialog.findViewById(R.id.gas_limit_layout);
if (!mParsedTx.getIsEIP1559Transaction()) {
EditText gasFeeEdit = dialog.findViewById(R.id.gas_fee_edit);
gasFeeEdit.setText(
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexWei(mParsedTx.getGasPrice(), 9)));
EditText gasLimitEdit = dialog.findViewById(R.id.gas_limit_edit);
gasLimitEdit.setText(
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexGWeiToGWEI(mParsedTx.getGasLimit())));
} else {
TextView dialogTitle = dialog.findViewById(R.id.edit_gas_dialog_title);
dialogTitle.setText(
getResources().getString(R.string.wallet_max_priority_fee_title));
gasPriceLayout.setVisibility(View.GONE);
gasLimitLayout.setVisibility(View.GONE);
dialog.findViewById(R.id.max_priority_fee_msg).setVisibility(View.VISIBLE);
dialog.findViewById(R.id.max_priority_radio_group)
.setVisibility(View.VISIBLE);
RadioGroup radioGroup = dialog.findViewById(R.id.max_priority_radio_group);
radioGroup.clearCheck();
radioGroup.setOnCheckedChangeListener(
(group, checkedId) -> {
EthTxManagerProxy ethTxManagerProxy = getEthTxManagerProxy();
assert ethTxManagerProxy != null;
ethTxManagerProxy.getGasEstimation1559(
mTxInfo.chainId,
estimation -> {
mTxInfo.txDataUnion.getEthTxData1559()
.gasEstimation =
estimation;
mCheckedPriorityId = checkedId;
String maxPriorityFeePerGas =
mParsedTx.getMaxPriorityFeePerGas();
String maxFeePerGas = mParsedTx.getMaxFeePerGas();
TextView currentBaseFeeMsg =
dialog.findViewById(
R.id.current_base_fee_msg);
currentBaseFeeMsg.setVisibility(View.GONE);
LinearLayout gasAmountLimitLayout =
dialog.findViewById(
R.id.gas_amount_limit_layout);
gasAmountLimitLayout.setVisibility(View.GONE);
LinearLayout perGasTipLimitLayout =
dialog.findViewById(
R.id.per_gas_tip_limit_layout);
perGasTipLimitLayout.setVisibility(View.GONE);
LinearLayout perGasPriceLimitLayout =
dialog.findViewById(
R.id.per_gas_price_limit_layout);
perGasPriceLimitLayout.setVisibility(View.GONE);
if (mCheckedPriorityId == R.id.radio_low) {
maxFeePerGas =
mTxInfo.txDataUnion.getEthTxData1559()
.gasEstimation
.slowMaxFeePerGas;
} else if (mCheckedPriorityId
== R.id.radio_optimal) {
maxFeePerGas =
mTxInfo.txDataUnion.getEthTxData1559()
.gasEstimation
.avgMaxFeePerGas;
} else if (mCheckedPriorityId == R.id.radio_high) {
maxFeePerGas =
mTxInfo.txDataUnion.getEthTxData1559()
.gasEstimation
.fastMaxFeePerGas;
} else if (mCheckedPriorityId
== R.id.radio_custom) {
currentBaseFeeMsg.setVisibility(View.VISIBLE);
currentBaseFeeMsg.setText(
String.format(
getResources()
.getString(
R.string
.wallet_current_base_fee),
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexWei(
mTxInfo
.txDataUnion
.getEthTxData1559()
.gasEstimation
.baseFeePerGas,
9))));
gasAmountLimitLayout.setVisibility(
View.VISIBLE);
EditText gasAmountLimitEdit =
dialog.findViewById(
R.id.gas_amount_limit_edit);
gasAmountLimitEdit.setText(
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexGWeiToGWEI(
mParsedTx
.getGasLimit())));
perGasTipLimitLayout.setVisibility(
View.VISIBLE);
EditText perGasTipLimitEdit =
dialog.findViewById(
R.id.per_gas_tip_limit_edit);
perGasTipLimitEdit.setText(
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexWei(
maxPriorityFeePerGas,
9)));
perGasPriceLimitLayout.setVisibility(
View.VISIBLE);
EditText perGasPriceLimitEdit =
dialog.findViewById(
R.id.per_gas_price_limit_edit);
perGasPriceLimitEdit.setText(
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexWei(
maxFeePerGas, 9)));
mFilterEIP1559TextWatcher.setDialog(
dialog,
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexWei(
mTxInfo.txDataUnion
.getEthTxData1559()
.gasEstimation
.baseFeePerGas,
9)));
gasAmountLimitEdit.addTextChangedListener(
mFilterEIP1559TextWatcher);
perGasTipLimitEdit.addTextChangedListener(
mFilterEIP1559TextWatcher);
perGasPriceLimitEdit.addTextChangedListener(
mFilterEIP1559TextWatcher);
}
fillMaxFee(
dialog.findViewById(R.id.maximum_fee_msg),
mParsedTx.getGasLimit(),
maxFeePerGas);
});
});
if (mCheckedPriorityId == -1) {
mCheckedPriorityId = R.id.radio_optimal;
}
radioGroup.check(mCheckedPriorityId);
dialog.findViewById(R.id.maximum_fee_msg).setVisibility(View.VISIBLE);
}
Button cancel = dialog.findViewById(R.id.cancel);
cancel.setOnClickListener(
v1 -> {
mCheckedPriorityId = mPreviousCheckedPriorityId;
dialog.dismiss();
});
Button ok = dialog.findViewById(R.id.ok);
ok.setOnClickListener(
v2 -> {
mPreviousCheckedPriorityId = mCheckedPriorityId;
EthTxManagerProxy ethTxManagerProxy = getEthTxManagerProxy();
assert ethTxManagerProxy != null;
if (!mParsedTx.getIsEIP1559Transaction()) {
EditText gasLimitEdit =
dialog.findViewById(R.id.gas_limit_edit);
mTxInfo.txDataUnion.getEthTxData1559().baseData.gasLimit =
Utils.toHexGWeiFromGWEI(
gasLimitEdit.getText().toString());
EditText gasFeeEdit = dialog.findViewById(R.id.gas_fee_edit);
mTxInfo.txDataUnion.getEthTxData1559().baseData.gasPrice =
Utils.toHexWei(gasFeeEdit.getText().toString(), 9);
ethTxManagerProxy.setGasPriceAndLimitForUnapprovedTransaction(
mTxInfo.chainId,
mTxInfo.id,
mTxInfo.txDataUnion.getEthTxData1559()
.baseData
.gasPrice,
mTxInfo.txDataUnion.getEthTxData1559()
.baseData
.gasLimit,
success -> {
if (!success) {
return;
}
if (mUpdateTxObjectManually) {
setupView(view);
}
dialog.dismiss();
});
} else {
String gasLimit = mParsedTx.getGasLimit();
String maxPriorityFeePerGas =
mParsedTx.getMaxPriorityFeePerGas();
String maxFeePerGas = mParsedTx.getMaxFeePerGas();
if (mCheckedPriorityId == R.id.radio_low
&& mTxInfo.txDataUnion.getEthTxData1559().gasEstimation
!= null) {
maxPriorityFeePerGas =
mTxInfo.txDataUnion.getEthTxData1559()
.gasEstimation
.slowMaxPriorityFeePerGas;
maxFeePerGas =
mTxInfo.txDataUnion.getEthTxData1559()
.gasEstimation
.slowMaxFeePerGas;
} else if (mCheckedPriorityId == R.id.radio_optimal
&& mTxInfo.txDataUnion.getEthTxData1559().gasEstimation
!= null) {
maxPriorityFeePerGas =
mTxInfo.txDataUnion.getEthTxData1559()
.gasEstimation
.avgMaxPriorityFeePerGas;
maxFeePerGas =
mTxInfo.txDataUnion.getEthTxData1559()
.gasEstimation
.avgMaxFeePerGas;
} else if (mCheckedPriorityId == R.id.radio_high
&& mTxInfo.txDataUnion.getEthTxData1559().gasEstimation
!= null) {
maxPriorityFeePerGas =
mTxInfo.txDataUnion.getEthTxData1559()
.gasEstimation
.fastMaxPriorityFeePerGas;
maxFeePerGas =
mTxInfo.txDataUnion.getEthTxData1559()
.gasEstimation
.fastMaxFeePerGas;
} else if (mCheckedPriorityId == R.id.radio_custom) {
EditText gasAmountLimitEdit =
dialog.findViewById(R.id.gas_amount_limit_edit);
EditText perGasTipLimitEdit =
dialog.findViewById(R.id.per_gas_tip_limit_edit);
EditText perGasPriceLimitEdit =
dialog.findViewById(R.id.per_gas_price_limit_edit);
gasLimit =
Utils.toHexGWeiFromGWEI(
gasAmountLimitEdit.getText().toString());
maxPriorityFeePerGas =
Utils.toHexWei(
perGasTipLimitEdit.getText().toString(), 9);
maxFeePerGas =
Utils.toHexWei(
perGasPriceLimitEdit.getText().toString(),
9);
}
mTxInfo.txDataUnion.getEthTxData1559().baseData.gasLimit =
gasLimit;
mTxInfo.txDataUnion.getEthTxData1559().maxPriorityFeePerGas =
maxPriorityFeePerGas;
mTxInfo.txDataUnion.getEthTxData1559().maxFeePerGas =
maxFeePerGas;
ethTxManagerProxy.setGasFeeAndLimitForUnapprovedTransaction(
mTxInfo.chainId,
mTxInfo.id,
maxPriorityFeePerGas,
maxFeePerGas,
gasLimit,
success -> {
if (!success) {
return;
}
if (mUpdateTxObjectManually) {
setupView(view);
}
dialog.dismiss();
});
}
});
});
editGasFee.setOnClickListener(v -> showEditGasDialog(view));
return view;
}
@@ -527,6 +237,217 @@ public class TxFragment extends Fragment {
}
;
private void showEditGasDialog(View view) {
if (!canShowDialog()) return;
dismissEditGasDialog();
mEditGasDialog = new Dialog(requireContext());
mEditGasDialog.setOnDismissListener(
unused -> {
mEditGasDialog = null;
mFilterEIP1559TextWatcher.clearDialog();
});
mEditGasDialog.setContentView(R.layout.brave_wallet_edit_gas);
mEditGasDialog.show();
mPreviousCheckedPriorityId = mCheckedPriorityId;
LinearLayout gasPriceLayout = mEditGasDialog.findViewById(R.id.gas_price_layout);
LinearLayout gasLimitLayout = mEditGasDialog.findViewById(R.id.gas_limit_layout);
if (!mParsedTx.getIsEIP1559Transaction()) {
EditText gasFeeEdit = mEditGasDialog.findViewById(R.id.gas_fee_edit);
gasFeeEdit.setText(
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexWei(mParsedTx.getGasPrice(), 9)));
EditText gasLimitEdit = mEditGasDialog.findViewById(R.id.gas_limit_edit);
gasLimitEdit.setText(
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexGWeiToGWEI(mParsedTx.getGasLimit())));
} else {
TextView dialogTitle = mEditGasDialog.findViewById(R.id.edit_gas_dialog_title);
dialogTitle.setText(getResources().getString(R.string.wallet_max_priority_fee_title));
gasPriceLayout.setVisibility(View.GONE);
gasLimitLayout.setVisibility(View.GONE);
mEditGasDialog.findViewById(R.id.max_priority_fee_msg).setVisibility(View.VISIBLE);
mEditGasDialog.findViewById(R.id.max_priority_radio_group).setVisibility(View.VISIBLE);
RadioGroup radioGroup = mEditGasDialog.findViewById(R.id.max_priority_radio_group);
radioGroup.clearCheck();
radioGroup.setOnCheckedChangeListener(
(group, checkedId) -> {
EthTxManagerProxy ethTxManagerProxy = getEthTxManagerProxy();
assert ethTxManagerProxy != null;
mCheckedPriorityId = checkedId;
ethTxManagerProxy.getGasEstimation1559(
mTxInfo.chainId,
estimation -> {
mEstimation = estimation;
applyEip1559GasEstimation();
});
});
if (mCheckedPriorityId == -1) {
mCheckedPriorityId = R.id.radio_optimal;
}
radioGroup.check(mCheckedPriorityId);
mEditGasDialog.findViewById(R.id.maximum_fee_msg).setVisibility(View.VISIBLE);
}
Button cancel = mEditGasDialog.findViewById(R.id.cancel);
cancel.setOnClickListener(
v1 -> {
mCheckedPriorityId = mPreviousCheckedPriorityId;
dismissEditGasDialog();
});
Button ok = mEditGasDialog.findViewById(R.id.ok);
ok.setOnClickListener(v2 -> onEditGasDialogOkClicked(view));
}
private void applyEip1559GasEstimation() {
if (mEditGasDialog == null) return;
if (mEstimation == null) return;
String maxPriorityFeePerGas = mParsedTx.getMaxPriorityFeePerGas();
String maxFeePerGas = mParsedTx.getMaxFeePerGas();
TextView currentBaseFeeMsg = mEditGasDialog.findViewById(R.id.current_base_fee_msg);
currentBaseFeeMsg.setVisibility(View.GONE);
LinearLayout gasAmountLimitLayout =
mEditGasDialog.findViewById(R.id.gas_amount_limit_layout);
gasAmountLimitLayout.setVisibility(View.GONE);
LinearLayout perGasTipLimitLayout =
mEditGasDialog.findViewById(R.id.per_gas_tip_limit_layout);
perGasTipLimitLayout.setVisibility(View.GONE);
LinearLayout perGasPriceLimitLayout =
mEditGasDialog.findViewById(R.id.per_gas_price_limit_layout);
perGasPriceLimitLayout.setVisibility(View.GONE);
if (mCheckedPriorityId == R.id.radio_low) {
maxFeePerGas = mEstimation.slowMaxFeePerGas;
} else if (mCheckedPriorityId == R.id.radio_optimal) {
maxFeePerGas = mEstimation.avgMaxFeePerGas;
} else if (mCheckedPriorityId == R.id.radio_high) {
maxFeePerGas = mEstimation.fastMaxFeePerGas;
} else if (mCheckedPriorityId == R.id.radio_custom) {
currentBaseFeeMsg.setVisibility(View.VISIBLE);
currentBaseFeeMsg.setText(
String.format(
getResources().getString(R.string.wallet_current_base_fee),
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexWei(mEstimation.baseFeePerGas, 9))));
gasAmountLimitLayout.setVisibility(View.VISIBLE);
EditText gasAmountLimitEdit = mEditGasDialog.findViewById(R.id.gas_amount_limit_edit);
gasAmountLimitEdit.setText(
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexGWeiToGWEI(mParsedTx.getGasLimit())));
perGasTipLimitLayout.setVisibility(View.VISIBLE);
EditText perGasTipLimitEdit = mEditGasDialog.findViewById(R.id.per_gas_tip_limit_edit);
perGasTipLimitEdit.setText(
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexWei(maxPriorityFeePerGas, 9)));
perGasPriceLimitLayout.setVisibility(View.VISIBLE);
EditText perGasPriceLimitEdit =
mEditGasDialog.findViewById(R.id.per_gas_price_limit_edit);
perGasPriceLimitEdit.setText(
String.format(Locale.getDefault(), "%.0f", Utils.fromHexWei(maxFeePerGas, 9)));
mFilterEIP1559TextWatcher.setDialog(
mEditGasDialog,
String.format(
Locale.getDefault(),
"%.0f",
Utils.fromHexWei(mEstimation.baseFeePerGas, 9)));
gasAmountLimitEdit.addTextChangedListener(mFilterEIP1559TextWatcher);
perGasTipLimitEdit.addTextChangedListener(mFilterEIP1559TextWatcher);
perGasPriceLimitEdit.addTextChangedListener(mFilterEIP1559TextWatcher);
}
fillMaxFee(
mEditGasDialog.findViewById(R.id.maximum_fee_msg),
mParsedTx.getGasLimit(),
maxFeePerGas);
}
private void onEditGasDialogOkClicked(View view) {
if (mEditGasDialog == null) return;
mPreviousCheckedPriorityId = mCheckedPriorityId;
EthTxManagerProxy ethTxManagerProxy = getEthTxManagerProxy();
assert ethTxManagerProxy != null;
if (!mParsedTx.getIsEIP1559Transaction()) {
EditText gasLimitEdit = mEditGasDialog.findViewById(R.id.gas_limit_edit);
mTxInfo.txDataUnion.getEthTxData1559().baseData.gasLimit =
Utils.toHexGWeiFromGWEI(gasLimitEdit.getText().toString());
EditText gasFeeEdit = mEditGasDialog.findViewById(R.id.gas_fee_edit);
mTxInfo.txDataUnion.getEthTxData1559().baseData.gasPrice =
Utils.toHexWei(gasFeeEdit.getText().toString(), 9);
ethTxManagerProxy.setGasPriceAndLimitForUnapprovedTransaction(
mTxInfo.chainId,
mTxInfo.id,
mTxInfo.txDataUnion.getEthTxData1559().baseData.gasPrice,
mTxInfo.txDataUnion.getEthTxData1559().baseData.gasLimit,
success -> {
if (!success) {
return;
}
if (mUpdateTxObjectManually) {
setupView(view);
}
if (mEditGasDialog != null) {
mEditGasDialog.dismiss();
}
});
} else {
if (mEstimation == null) {
return;
}
String gasLimit = mParsedTx.getGasLimit();
String maxPriorityFeePerGas = mParsedTx.getMaxPriorityFeePerGas();
String maxFeePerGas = mParsedTx.getMaxFeePerGas();
if (mCheckedPriorityId == R.id.radio_low) {
maxPriorityFeePerGas = mEstimation.slowMaxPriorityFeePerGas;
maxFeePerGas = mEstimation.slowMaxFeePerGas;
} else if (mCheckedPriorityId == R.id.radio_optimal) {
maxPriorityFeePerGas = mEstimation.avgMaxPriorityFeePerGas;
maxFeePerGas = mEstimation.avgMaxFeePerGas;
} else if (mCheckedPriorityId == R.id.radio_high) {
maxPriorityFeePerGas = mEstimation.fastMaxPriorityFeePerGas;
maxFeePerGas = mEstimation.fastMaxFeePerGas;
} else if (mCheckedPriorityId == R.id.radio_custom) {
EditText gasAmountLimitEdit =
mEditGasDialog.findViewById(R.id.gas_amount_limit_edit);
EditText perGasTipLimitEdit =
mEditGasDialog.findViewById(R.id.per_gas_tip_limit_edit);
EditText perGasPriceLimitEdit =
mEditGasDialog.findViewById(R.id.per_gas_price_limit_edit);
gasLimit = Utils.toHexGWeiFromGWEI(gasAmountLimitEdit.getText().toString());
maxPriorityFeePerGas = Utils.toHexWei(perGasTipLimitEdit.getText().toString(), 9);
maxFeePerGas = Utils.toHexWei(perGasPriceLimitEdit.getText().toString(), 9);
}
mTxInfo.txDataUnion.getEthTxData1559().baseData.gasLimit = gasLimit;
mTxInfo.txDataUnion.getEthTxData1559().maxPriorityFeePerGas = maxPriorityFeePerGas;
mTxInfo.txDataUnion.getEthTxData1559().maxFeePerGas = maxFeePerGas;
ethTxManagerProxy.setGasFeeAndLimitForUnapprovedTransaction(
mTxInfo.chainId,
mTxInfo.id,
maxPriorityFeePerGas,
maxFeePerGas,
gasLimit,
success -> {
if (mEditGasDialog == null) return;
if (!success) return;
if (mUpdateTxObjectManually) {
setupView(view);
}
mEditGasDialog.dismiss();
});
}
}
private void fillMaxFee(TextView textView, String gasLimit, String maxFeePerGas) {
final double[] gasFeeArr =
ParsedTransactionFees.calcGasFee(