configurable gas buffer

This commit is contained in:
Bryan Stitt 2023-01-19 18:08:53 -08:00
parent ad169eda0e
commit 2f8920085b
4 changed files with 41 additions and 20 deletions

@ -308,6 +308,7 @@ These are not yet ordered. There might be duplicates. We might not actually need
- [x] retry another server if we get a jsonrpc response error about rate limits
- [x] major refactor to only use backup servers when absolutely necessary
- [x] remove allowed lag
- [x] configurable gas buffer. default to the larger of 25k or 25% on polygon to work around erigon bug
- [-] proxy mode for benchmarking all backends
- [-] proxy mode for sending to multiple backends
- [-] let users choose a % of reverts to log (or maybe x/second). someone like curve logging all reverts will be a BIG database very quickly

@ -25,6 +25,7 @@ use entities::sea_orm_active_enums::LogLevel;
use entities::user;
use ethers::core::utils::keccak256;
use ethers::prelude::{Address, Block, Bytes, Transaction, TxHash, H256, U64};
use ethers::types::U256;
use ethers::utils::rlp::{Decodable, Rlp};
use futures::future::join_all;
use futures::stream::{FuturesUnordered, StreamExt};
@ -1119,19 +1120,14 @@ impl Web3ProxyApp {
// TODO: eth_sendPrivateTransaction (https://docs.flashbots.net/flashbots-auction/searchers/advanced/rpc-endpoint#eth_sendprivatetransaction)
"eth_coinbase" => {
// no need for serving coinbase
// we could return a per-user payment address here, but then we might leak that to dapps
// no stats on this. its cheap
json!(Address::zero())
}
/*
// erigon was giving bad estimates. but now it doesn't need it
// TODO: got reports of some gas estimate issue on polygon with their erc20s. maybe we do want it
"eth_estimateGas" => {
// TODO: eth_estimateGas using anvil?
// TODO: modify the block requested?
let mut response = self
.balanced_rpcs
.try_send_best_upstream_server(
.try_proxy_connection(
proxy_mode,
authorization,
request,
Some(&request_metadata),
@ -1139,11 +1135,9 @@ impl Web3ProxyApp {
)
.await?;
let parsed_gas_estimate = if let Some(gas_estimate) = response.result.take() {
let parsed_gas_estimate: U256 = serde_json::from_str(gas_estimate.get())
.context("gas estimate result is not an U256")?;
parsed_gas_estimate
let mut gas_estimate: U256 = if let Some(gas_estimate) = response.result.take() {
serde_json::from_str(gas_estimate.get())
.context("gas estimate result is not an U256")?
} else {
// i think this is always an error response
let rpcs = request_metadata.backend_requests.lock().clone();
@ -1151,13 +1145,21 @@ impl Web3ProxyApp {
return Ok((response, rpcs));
};
// increase by 1.01%
let parsed_gas_estimate =
parsed_gas_estimate * U256::from(101_010) / U256::from(100_000);
let gas_increase =
if let Some(gas_increase_percent) = self.config.gas_increase_percent {
let gas_increase = gas_estimate * gas_increase_percent / U256::from(100);
json!(parsed_gas_estimate)
let min_gas_increase = self.config.gas_increase_min.unwrap_or_default();
gas_increase.max(min_gas_increase)
} else {
self.config.gas_increase_min.unwrap_or_default()
};
gas_estimate += gas_increase;
json!(gas_estimate)
}
*/
// TODO: eth_gasPrice that does awesome magic to predict the future
"eth_hashrate" => {
// no stats on this. its cheap

@ -16,6 +16,7 @@ mod user_import;
use anyhow::Context;
use argh::FromArgs;
use ethers::types::U256;
use log::{info, warn};
use std::{
fs,
@ -127,7 +128,10 @@ fn main() -> anyhow::Result<()> {
.context(format!("checking for config at {}", top_config_path))?;
let top_config: String = fs::read_to_string(top_config_path)?;
let top_config: TopConfig = toml::from_str(&top_config)?;
let mut top_config: TopConfig = toml::from_str(&top_config)?;
// TODO: this doesn't seem to do anything
proctitle::set_title(format!("web3_proxy-{}", top_config.app.chain_id));
if cli_config.db_url.is_none() {
cli_config.db_url = top_config.app.db_url.clone();
@ -137,8 +141,15 @@ fn main() -> anyhow::Result<()> {
cli_config.sentry_url = Some(sentry_url);
}
// TODO: this doesn't seem to do anything
proctitle::set_title(format!("web3_proxy-{}", top_config.app.chain_id));
if top_config.app.chain_id == 137 {
if top_config.app.gas_increase_min.is_none() {
top_config.app.gas_increase_min = Some(U256::from(25_000));
}
if top_config.app.gas_increase_percent.is_none() {
top_config.app.gas_increase_percent = Some(U256::from(25));
}
}
Some(top_config)
} else {

@ -4,6 +4,7 @@ use crate::rpcs::request::OpenRequestHandleMetrics;
use crate::{app::AnyhowJoinHandle, rpcs::blockchain::ArcBlock};
use argh::FromArgs;
use ethers::prelude::TxHash;
use ethers::types::U256;
use hashbrown::HashMap;
use log::warn;
use migration::sea_orm::DatabaseConnection;
@ -90,6 +91,12 @@ pub struct AppConfig {
/// None = allow all requests
pub default_user_max_requests_per_period: Option<u64>,
/// minimum amount to increase eth_estimateGas results
pub gas_increase_min: Option<U256>,
/// percentage to increase eth_estimateGas results. 100 == 100%
pub gas_increase_percent: Option<U256>,
/// Restrict user registration.
/// None = no code needed
pub invite_code: Option<String>,