configurable gas buffer
This commit is contained in:
parent
ad169eda0e
commit
2f8920085b
1
TODO.md
1
TODO.md
|
@ -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] 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] major refactor to only use backup servers when absolutely necessary
|
||||||
- [x] remove allowed lag
|
- [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 benchmarking all backends
|
||||||
- [-] proxy mode for sending to multiple 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
|
- [-] 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 entities::user;
|
||||||
use ethers::core::utils::keccak256;
|
use ethers::core::utils::keccak256;
|
||||||
use ethers::prelude::{Address, Block, Bytes, Transaction, TxHash, H256, U64};
|
use ethers::prelude::{Address, Block, Bytes, Transaction, TxHash, H256, U64};
|
||||||
|
use ethers::types::U256;
|
||||||
use ethers::utils::rlp::{Decodable, Rlp};
|
use ethers::utils::rlp::{Decodable, Rlp};
|
||||||
use futures::future::join_all;
|
use futures::future::join_all;
|
||||||
use futures::stream::{FuturesUnordered, StreamExt};
|
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)
|
// TODO: eth_sendPrivateTransaction (https://docs.flashbots.net/flashbots-auction/searchers/advanced/rpc-endpoint#eth_sendprivatetransaction)
|
||||||
"eth_coinbase" => {
|
"eth_coinbase" => {
|
||||||
// no need for serving 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
|
// no stats on this. its cheap
|
||||||
json!(Address::zero())
|
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" => {
|
"eth_estimateGas" => {
|
||||||
// TODO: eth_estimateGas using anvil?
|
|
||||||
// TODO: modify the block requested?
|
|
||||||
let mut response = self
|
let mut response = self
|
||||||
.balanced_rpcs
|
.balanced_rpcs
|
||||||
.try_send_best_upstream_server(
|
.try_proxy_connection(
|
||||||
|
proxy_mode,
|
||||||
authorization,
|
authorization,
|
||||||
request,
|
request,
|
||||||
Some(&request_metadata),
|
Some(&request_metadata),
|
||||||
|
@ -1139,11 +1135,9 @@ impl Web3ProxyApp {
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let parsed_gas_estimate = if let Some(gas_estimate) = response.result.take() {
|
let mut gas_estimate: U256 = if let Some(gas_estimate) = response.result.take() {
|
||||||
let parsed_gas_estimate: U256 = serde_json::from_str(gas_estimate.get())
|
serde_json::from_str(gas_estimate.get())
|
||||||
.context("gas estimate result is not an U256")?;
|
.context("gas estimate result is not an U256")?
|
||||||
|
|
||||||
parsed_gas_estimate
|
|
||||||
} else {
|
} else {
|
||||||
// i think this is always an error response
|
// i think this is always an error response
|
||||||
let rpcs = request_metadata.backend_requests.lock().clone();
|
let rpcs = request_metadata.backend_requests.lock().clone();
|
||||||
|
@ -1151,13 +1145,21 @@ impl Web3ProxyApp {
|
||||||
return Ok((response, rpcs));
|
return Ok((response, rpcs));
|
||||||
};
|
};
|
||||||
|
|
||||||
// increase by 1.01%
|
let gas_increase =
|
||||||
let parsed_gas_estimate =
|
if let Some(gas_increase_percent) = self.config.gas_increase_percent {
|
||||||
parsed_gas_estimate * U256::from(101_010) / U256::from(100_000);
|
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
|
// TODO: eth_gasPrice that does awesome magic to predict the future
|
||||||
"eth_hashrate" => {
|
"eth_hashrate" => {
|
||||||
// no stats on this. its cheap
|
// no stats on this. its cheap
|
||||||
|
|
|
@ -16,6 +16,7 @@ mod user_import;
|
||||||
|
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use argh::FromArgs;
|
use argh::FromArgs;
|
||||||
|
use ethers::types::U256;
|
||||||
use log::{info, warn};
|
use log::{info, warn};
|
||||||
use std::{
|
use std::{
|
||||||
fs,
|
fs,
|
||||||
|
@ -127,7 +128,10 @@ fn main() -> anyhow::Result<()> {
|
||||||
.context(format!("checking for config at {}", top_config_path))?;
|
.context(format!("checking for config at {}", top_config_path))?;
|
||||||
|
|
||||||
let top_config: String = fs::read_to_string(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() {
|
if cli_config.db_url.is_none() {
|
||||||
cli_config.db_url = top_config.app.db_url.clone();
|
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);
|
cli_config.sentry_url = Some(sentry_url);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: this doesn't seem to do anything
|
if top_config.app.chain_id == 137 {
|
||||||
proctitle::set_title(format!("web3_proxy-{}", top_config.app.chain_id));
|
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)
|
Some(top_config)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -4,6 +4,7 @@ use crate::rpcs::request::OpenRequestHandleMetrics;
|
||||||
use crate::{app::AnyhowJoinHandle, rpcs::blockchain::ArcBlock};
|
use crate::{app::AnyhowJoinHandle, rpcs::blockchain::ArcBlock};
|
||||||
use argh::FromArgs;
|
use argh::FromArgs;
|
||||||
use ethers::prelude::TxHash;
|
use ethers::prelude::TxHash;
|
||||||
|
use ethers::types::U256;
|
||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
use log::warn;
|
use log::warn;
|
||||||
use migration::sea_orm::DatabaseConnection;
|
use migration::sea_orm::DatabaseConnection;
|
||||||
|
@ -90,6 +91,12 @@ pub struct AppConfig {
|
||||||
/// None = allow all requests
|
/// None = allow all requests
|
||||||
pub default_user_max_requests_per_period: Option<u64>,
|
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.
|
/// Restrict user registration.
|
||||||
/// None = no code needed
|
/// None = no code needed
|
||||||
pub invite_code: Option<String>,
|
pub invite_code: Option<String>,
|
||||||
|
|
Loading…
Reference in New Issue