Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sender fixes #734

Merged
merged 4 commits into from
Jun 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 87 additions & 18 deletions bin/rundler/src/cli/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@

use std::{net::SocketAddr, time::Duration};

use anyhow::Context;
use anyhow::{bail, Context};
use clap::Args;
use rundler_builder::{
self, BloxrouteSenderArgs, BuilderEvent, BuilderEventKind, BuilderTask, BuilderTaskArgs,
EntryPointBuilderSettings, FlashbotsSenderArgs, LocalBuilderBuilder, TransactionSenderArgs,
TransactionSenderKind,
EntryPointBuilderSettings, FlashbotsSenderArgs, LocalBuilderBuilder, RawSenderArgs,
TransactionSenderArgs, TransactionSenderKind,
};
use rundler_pool::RemotePoolClient;
use rundler_sim::{MempoolConfigs, PriorityFeeMode};
Expand Down Expand Up @@ -57,13 +57,28 @@ pub struct BuilderArgs {
host: String,

/// Private key to use for signing transactions
/// DEPRECATED: Use `builder.private_keys` instead
///
/// If both `builder.private_key` and `builder.private_keys` are set, `builder.private_key` is appended
/// to `builder.private_keys`. Keys must be unique.
#[arg(
long = "builder.private_key",
name = "builder.private_key",
env = "BUILDER_PRIVATE_KEY"
)]
private_key: Option<String>,

/// Private keys to use for signing transactions
///
/// Cannot use both `builder.private_key` and `builder.aws_kms_key_ids` at the same time.
#[arg(
long = "builder.private_keys",
name = "builder.private_keys",
env = "BUILDER_PRIVATE_KEYS",
value_delimiter = ','
)]
private_keys: Vec<String>,

/// AWS KMS key IDs to use for signing transactions
#[arg(
long = "builder.aws_kms_key_ids",
Expand Down Expand Up @@ -115,14 +130,48 @@ pub struct BuilderArgs {
/// If present, the url of the ETH provider that will be used to send
/// transactions. Defaults to the value of `node_http`.
///
/// Only used when BUILDER_SENDER is "raw" or "conditional"
/// Only used when BUILDER_SENDER is "raw"
#[arg(
long = "builder.submit_url",
name = "builder.submit_url",
env = "BUILDER_SUBMIT_URL"
)]
pub submit_url: Option<String>,

/// If present, the url of the ETH provider that will be used to check
/// transaction status. Else will use the node http for status.
///
/// Only used when BUILDER_SENDER is "raw"
#[arg(
long = "builder.use_submit_for_status",
name = "builder.use_submit_for_status",
env = "BUILDER_USE_SUBMIT_FOR_STATUS",
default_value = "false"
)]
pub use_submit_for_status: bool,

/// Use the conditional RPC endpoint for transaction submission.
///
/// Only used when BUILDER_SENDER is "raw"
#[arg(
long = "builder.use_conditional_rpc",
name = "builder.use_conditional_rpc",
env = "BUILDER_USE_CONDITIONAL_RPC",
default_value = "false"
)]
pub use_conditional_rpc: bool,

/// If the "dropped" status is unsupported by the status provider.
///
/// Only used when BUILDER_SENDER is "raw"
#[arg(
long = "builder.dropped_status_unsupported",
name = "builder.dropped_status_unsupported",
env = "BUILDER_DROPPED_STATUS_UNSUPPORTED",
default_value = "false"
)]
pub dropped_status_unsupported: bool,

/// A list of builders to pass into the Flashbots Relay RPC.
///
/// Only used when BUILDER_SENDER is "flashbots"
Expand Down Expand Up @@ -216,7 +265,6 @@ impl BuilderArgs {
.node_http
.clone()
.context("should have a node HTTP URL")?;
let submit_url = self.submit_url.clone().unwrap_or_else(|| rpc_url.clone());

let mempool_configs = match &common.mempool_config_path {
Some(path) => get_json_config::<MempoolConfigs>(path, &common.aws_region)
Expand Down Expand Up @@ -251,27 +299,41 @@ impl BuilderArgs {
num_builders += common.num_builders_v0_7;
}

if self.private_key.is_some() {
if num_builders > 1 {
return Err(anyhow::anyhow!(
"Cannot use a private key with multiple builders. You may need to disable one of the entry points."
));
if (self.private_key.is_some() || !self.private_keys.is_empty())
&& !self.aws_kms_key_ids.is_empty()
{
bail!(
"Cannot use both builder.private_key(s) and builder.aws_kms_key_ids at the same time."
);
}

let mut private_keys = self.private_keys.clone();
if self.private_key.is_some() || !self.private_keys.is_empty() {
if let Some(pk) = &self.private_key {
private_keys.push(pk.clone());
}

if num_builders > private_keys.len() as u64 {
bail!(
"Found {} private keys, but need {} keys for the number of builders. You may need to disable one of the entry points.",
private_keys.len(), num_builders
);
}
} else if self.aws_kms_key_ids.len() < num_builders as usize {
return Err(anyhow::anyhow!(
bail!(
"Not enough AWS KMS key IDs for the number of builders. Need {} keys, found {}. You may need to disable one of the entry points.",
num_builders, self.aws_kms_key_ids.len()
));
);
}

let sender_args = self.sender_args(&chain_spec)?;
let sender_args = self.sender_args(&chain_spec, &rpc_url)?;

Ok(BuilderTaskArgs {
entry_points,
chain_spec,
unsafe_mode: common.unsafe_mode,
rpc_url,
private_key: self.private_key.clone(),
private_keys,
aws_kms_key_ids: self.aws_kms_key_ids.clone(),
aws_kms_region: common
.aws_region
Expand All @@ -281,7 +343,6 @@ impl BuilderArgs {
redis_lock_ttl_millis: self.redis_lock_ttl_millis,
max_bundle_size: self.max_bundle_size,
max_bundle_gas: common.max_bundle_gas,
submit_url,
bundle_priority_fee_overhead_percent: common.bundle_priority_fee_overhead_percent,
priority_fee_mode,
sender_args,
Expand All @@ -294,10 +355,18 @@ impl BuilderArgs {
})
}

fn sender_args(&self, chain_spec: &ChainSpec) -> anyhow::Result<TransactionSenderArgs> {
fn sender_args(
&self,
chain_spec: &ChainSpec,
rpc_url: &str,
) -> anyhow::Result<TransactionSenderArgs> {
match self.sender_type {
TransactionSenderKind::Raw => Ok(TransactionSenderArgs::Raw),
TransactionSenderKind::Conditional => Ok(TransactionSenderArgs::Conditional),
TransactionSenderKind::Raw => Ok(TransactionSenderArgs::Raw(RawSenderArgs {
submit_url: self.submit_url.clone().unwrap_or_else(|| rpc_url.into()),
use_submit_for_status: self.use_submit_for_status,
dropped_status_supported: !self.dropped_status_unsupported,
use_conditional_rpc: self.use_conditional_rpc,
})),
TransactionSenderKind::Flashbots => {
if !chain_spec.flashbots_enabled {
return Err(anyhow::anyhow!("Flashbots sender is not enabled for chain"));
Expand Down
Loading
Loading