From 8c5865f25bc8711c876989a89adbb3ab080eaef9 Mon Sep 17 00:00:00 2001 From: Ongart Pisansathienwong <54426055+colmazia@users.noreply.github.com> Date: Tue, 8 Nov 2022 13:04:53 +0700 Subject: [PATCH 1/6] Merge pull request #1 from bandprotocol/ignore-ack-support wasm contract support & Ignore ack support --- crates/relayer-cli/src/chain_registry.rs | 1 + crates/relayer-cli/src/commands/listen.rs | 1 + crates/relayer/src/chain/cosmos.rs | 1 + crates/relayer/src/config.rs | 3 ++- crates/relayer/src/event/monitor.rs | 25 +++++++++++++++--- crates/relayer/src/event/rpc.rs | 26 +++++++++++++++++-- tools/test-framework/src/types/single/node.rs | 1 + 7 files changed, 51 insertions(+), 7 deletions(-) diff --git a/crates/relayer-cli/src/chain_registry.rs b/crates/relayer-cli/src/chain_registry.rs index 77fc48ff20..2657d6d902 100644 --- a/crates/relayer-cli/src/chain_registry.rs +++ b/crates/relayer-cli/src/chain_registry.rs @@ -132,6 +132,7 @@ where address_type: AddressType::default(), sequential_batch_tx: false, extension_options: Vec::new(), + ignore_port_channel: Vec::new(), }) } diff --git a/crates/relayer-cli/src/commands/listen.rs b/crates/relayer-cli/src/commands/listen.rs index c5d2ef9ff0..358a5b83b2 100644 --- a/crates/relayer-cli/src/commands/listen.rs +++ b/crates/relayer-cli/src/commands/listen.rs @@ -153,6 +153,7 @@ fn subscribe( chain_config.id.clone(), chain_config.websocket_addr.clone(), rt, + chain_config.ignore_port_channel.clone(), ) .map_err(|e| eyre!("could not initialize event monitor: {}", e))?; diff --git a/crates/relayer/src/chain/cosmos.rs b/crates/relayer/src/chain/cosmos.rs index d7e90bc79a..56eb02e27d 100644 --- a/crates/relayer/src/chain/cosmos.rs +++ b/crates/relayer/src/chain/cosmos.rs @@ -655,6 +655,7 @@ impl ChainEndpoint for CosmosSdkChain { self.config.id.clone(), self.config.websocket_addr.clone(), rt, + self.config.ignore_port_channel.clone(), ) .map_err(Error::event_monitor)?; diff --git a/crates/relayer/src/config.rs b/crates/relayer/src/config.rs index b4dada1d16..15989dbcd1 100644 --- a/crates/relayer/src/config.rs +++ b/crates/relayer/src/config.rs @@ -18,7 +18,7 @@ use serde_derive::{Deserialize, Serialize}; use tendermint_light_client_verifier::types::TrustThreshold; use ibc_relayer_types::core::ics23_commitment::specs::ProofSpecs; -use ibc_relayer_types::core::ics24_host::identifier::{ChainId, ChannelId, PortId}; +use ibc_relayer_types::core::ics24_host::identifier::{ChainId, ChannelId, PortChannelId, PortId}; use ibc_relayer_types::timestamp::ZERO_DURATION; use crate::chain::ChainType; @@ -385,6 +385,7 @@ pub struct ChainConfig { pub store_prefix: String, pub default_gas: Option, pub max_gas: Option, + pub ignore_port_channel: Vec, // This field is deprecated, use `gas_multiplier` instead pub gas_adjustment: Option, diff --git a/crates/relayer/src/event/monitor.rs b/crates/relayer/src/event/monitor.rs index 6ce7e5f46d..68f0f2d3c8 100644 --- a/crates/relayer/src/event/monitor.rs +++ b/crates/relayer/src/event/monitor.rs @@ -17,7 +17,9 @@ use tendermint_rpc::{ }; use ibc_relayer_types::{ - core::ics02_client::height::Height, core::ics24_host::identifier::ChainId, events::IbcEvent, + core::ics02_client::height::Height, + core::ics24_host::identifier::{ChainId, PortChannelId}, + events::IbcEvent, }; use crate::{ @@ -101,6 +103,7 @@ pub struct EventMonitor { subscriptions: Box, /// Tokio runtime rt: Arc, + ignore_port_channel: Vec, } // TODO: These are SDK specific, should be eventually moved. @@ -114,6 +117,7 @@ pub mod queries { ibc_client(), ibc_connection(), ibc_channel(), + ibc_wasm(), // This will be needed when we send misbehavior evidence to full node // Query::eq("message.module", "evidence"), ] @@ -134,6 +138,10 @@ pub mod queries { pub fn ibc_channel() -> Query { Query::eq("message.module", "ibc_channel") } + + pub fn ibc_wasm() -> Query { + Query::eq("message.module", "wasm") + } } impl EventMonitor { @@ -148,6 +156,7 @@ impl EventMonitor { chain_id: ChainId, node_addr: Url, rt: Arc, + ignore_port_channel: Vec, ) -> Result<(Self, EventReceiver, TxMonitorCmd)> { let (tx_batch, rx_batch) = channel::unbounded(); let (tx_cmd, rx_cmd) = channel::unbounded(); @@ -175,6 +184,7 @@ impl EventMonitor { rx_cmd, node_addr, subscriptions: Box::new(futures::stream::empty()), + ignore_port_channel, }; Ok((monitor, rx_batch, tx_cmd)) @@ -339,7 +349,11 @@ impl EventMonitor { core::mem::replace(&mut self.subscriptions, Box::new(futures::stream::empty())); // Convert the stream of RPC events into a stream of event batches. - let batches = stream_batches(subscriptions, self.chain_id.clone()); + let batches = stream_batches( + subscriptions, + self.chain_id.clone(), + self.ignore_port_channel.clone(), + ); // Needed to be able to poll the stream pin_mut!(batches); @@ -437,8 +451,10 @@ impl EventMonitor { fn collect_events( chain_id: &ChainId, event: RpcEvent, + ignore_port_channel: &Vec, ) -> impl Stream> { - let events = crate::event::rpc::get_all_events(chain_id, event).unwrap_or_default(); + let events = + crate::event::rpc::get_all_events(chain_id, event, ignore_port_channel).unwrap_or_default(); stream::iter(events).map(Ok) } @@ -446,12 +462,13 @@ fn collect_events( fn stream_batches( subscriptions: Box, chain_id: ChainId, + ignore_port_channel: Vec, ) -> impl Stream> { let id = chain_id.clone(); // Collect IBC events from each RPC event let events = subscriptions - .map_ok(move |rpc_event| collect_events(&id, rpc_event)) + .map_ok(move |rpc_event| collect_events(&id, rpc_event, &ignore_port_channel)) .map_err(Error::canceled_or_generic) .try_flatten(); diff --git a/crates/relayer/src/event/rpc.rs b/crates/relayer/src/event/rpc.rs index b0b5e5fdf1..34e5073589 100644 --- a/crates/relayer/src/event/rpc.rs +++ b/crates/relayer/src/event/rpc.rs @@ -5,7 +5,7 @@ use tendermint_rpc::{event::Event as RpcEvent, event::EventData as RpcEventData} use ibc_relayer_types::core::ics02_client::{events as ClientEvents, height::Height}; use ibc_relayer_types::core::ics04_channel::events as ChannelEvents; -use ibc_relayer_types::core::ics24_host::identifier::ChainId; +use ibc_relayer_types::core::ics24_host::identifier::{ChainId, PortChannelId}; use ibc_relayer_types::events::IbcEvent; use crate::chain::cosmos::types::events::channel::RawObject; @@ -116,6 +116,7 @@ use super::{ibc_event_try_from_abci_event, IbcEventWithHeight}; pub fn get_all_events( chain_id: &ChainId, result: RpcEvent, + ignore_port_channel: &Vec, ) -> Result, String> { let mut events_with_height: Vec = vec![]; let RpcEvent { @@ -158,11 +159,31 @@ pub fn get_all_events( { tracing::trace!("extracted ibc_connection event {}", ibc_event); events_with_height.push(IbcEventWithHeight::new(ibc_event, height)); - } else if query == queries::ibc_channel().to_string() + } else if (query == queries::ibc_channel().to_string() + || query == queries::ibc_wasm().to_string()) && event_is_type_channel(&ibc_event) { let _span = tracing::trace_span!("ibc_channel event").entered(); tracing::trace!("extracted {}", ibc_event); + if matches!(ibc_event, IbcEvent::AcknowledgePacket(_)) { + tracing::trace!( + "AcknowledgePacket from chain_id: {} packet: {} ***", + chain_id.to_string().as_str(), + ibc_event.to_string() + ); + if ignore_port_channel.iter().any(|pcid| { + pcid.channel_id.as_str() + == ibc_event.packet().unwrap().destination_channel.as_str() + && pcid.port_id.as_str() + == ibc_event.packet().unwrap().destination_port.as_str() + }) { + tracing::trace!( + "**** skipping event {} ***", + ibc_event.to_string() + ); + continue; + } + } if matches!(ibc_event, IbcEvent::SendPacket(_)) { // Should be the same as the hash of tx_result.tx? if let Some(hash) = @@ -172,6 +193,7 @@ pub fn get_all_events( } } + tracing::trace!("pushing event {} ***", ibc_event.to_string()); events_with_height.push(IbcEventWithHeight::new(ibc_event, height)); } } diff --git a/tools/test-framework/src/types/single/node.rs b/tools/test-framework/src/types/single/node.rs index 24d87e53c9..5171cb844d 100644 --- a/tools/test-framework/src/types/single/node.rs +++ b/tools/test-framework/src/types/single/node.rs @@ -157,6 +157,7 @@ impl FullNode { proof_specs: Default::default(), extension_options: Default::default(), sequential_batch_tx: false, + ignore_port_channel: Vec::new(), }) } From 2e42e1a642ea26ab233b4e2b29e65e397070ea1c Mon Sep 17 00:00:00 2001 From: Ongart Pisansathienwong <54426055+colmazia@users.noreply.github.com> Date: Tue, 8 Nov 2022 15:55:30 +0700 Subject: [PATCH 2/6] Merge pull request #2 from bandprotocol/ignore-ack-support Ignore ack support --- README.md | 25 +++++--- config_example.toml | 144 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 8 deletions(-) create mode 100644 config_example.toml diff --git a/README.md b/README.md index 5656e2241a..62bf581754 100644 --- a/README.md +++ b/README.md @@ -32,16 +32,25 @@ See the table below for more details. The repository also includes [TLA+ specifications](docs/spec). +## Band Implementation + +- **Support Wasm Contract** +- **Add more chain config to ignore certain acknowledge packet** + + add a config named 'ignore_port_channel' in chain config that recieve a list of destination port and channel id to ignore + + e.g. ignore_port_channel = [{ channel_id = 'channel-64', port_id = 'oracle'}] + ## Status -| Crate name | Type | Version | Docs | -|:-------------:|:------:|:-------------:|:-----:| -| [ibc-relayer-cli](crates/relayer-cli) | bin: [hermes](crates/relayer-cli/) | [![IBC Relayer CLI Crate][relayer-cli-crate-image]][relayer-cli-crate-link] | [![IBC Relayer CLI Docs][relayer-cli-docs-image]][relayer-cli-docs-link] | -| [ibc-relayer](crates/relayer) | lib | [![IBC Relayer Crate][relayer-crate-image]][relayer-crate-link] | [![IBC Relayer Docs][relayer-docs-image]][relayer-docs-link] | -| [ibc-chain-registry](crates/ibc-chain-registry) | lib | [![Chain Registry Crate][ibc-chain-registry-crate-image]][ibc-chain-registry-crate-link] | [![Chain Registry Docs][ibc-chain-registry-docs-image]][ibc-chain-registry-docs-link] | -| [ibc-relayer-rest](crates/relayer-rest) | lib | [![IBC Relayer REST Crate][relayer-rest-crate-image]][relayer-rest-crate-link] | [![IBC Relayer REST Docs][relayer-rest-docs-image]][relayer-rest-docs-link] | -| [ibc-telemetry](crates/telemetry) | lib | [![IBC Telemetry Crate][ibc-telemetry-crate-image]][ibc-telemetry-crate-link] | [![IBC Telemetry Docs][ibc-telemetry-docs-image]][ibc-telemetry-docs-link] | -| [ibc-test-framework](./tools/test-framework) | lib | [![IBC Test Framework Crate][ibc-test-framework-crate-image]][ibc-test-framework-crate-link] | [![IBC Test Framework Docs][ibc-test-framework-docs-image]][ibc-test-framework-docs-link] | +| Crate name | Type | Version | Docs | +| :---------------------------------------------: | :--------------------------------: | :------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------: | +| [ibc-relayer-cli](crates/relayer-cli) | bin: [hermes](crates/relayer-cli/) | [![IBC Relayer CLI Crate][relayer-cli-crate-image]][relayer-cli-crate-link] | [![IBC Relayer CLI Docs][relayer-cli-docs-image]][relayer-cli-docs-link] | +| [ibc-relayer](crates/relayer) | lib | [![IBC Relayer Crate][relayer-crate-image]][relayer-crate-link] | [![IBC Relayer Docs][relayer-docs-image]][relayer-docs-link] | +| [ibc-chain-registry](crates/ibc-chain-registry) | lib | [![Chain Registry Crate][ibc-chain-registry-crate-image]][ibc-chain-registry-crate-link] | [![Chain Registry Docs][ibc-chain-registry-docs-image]][ibc-chain-registry-docs-link] | +| [ibc-relayer-rest](crates/relayer-rest) | lib | [![IBC Relayer REST Crate][relayer-rest-crate-image]][relayer-rest-crate-link] | [![IBC Relayer REST Docs][relayer-rest-docs-image]][relayer-rest-docs-link] | +| [ibc-telemetry](crates/telemetry) | lib | [![IBC Telemetry Crate][ibc-telemetry-crate-image]][ibc-telemetry-crate-link] | [![IBC Telemetry Docs][ibc-telemetry-docs-image]][ibc-telemetry-docs-link] | +| [ibc-test-framework](./tools/test-framework) | lib | [![IBC Test Framework Crate][ibc-test-framework-crate-image]][ibc-test-framework-crate-link] | [![IBC Test Framework Docs][ibc-test-framework-docs-image]][ibc-test-framework-docs-link] | ## Requirements diff --git a/config_example.toml b/config_example.toml new file mode 100644 index 0000000000..19010f0ce4 --- /dev/null +++ b/config_example.toml @@ -0,0 +1,144 @@ +# The global section has parameters that apply globally to the relayer operation. +[global] + +# Specify the verbosity for the relayer logging output. Default: 'info' +# Valid options are 'error', 'warn', 'info', 'debug', 'trace'. +log_level = 'trace' + + +# Specify the mode to be used by the relayer. [Required] +[mode] + +# Specify the client mode. +[mode.clients] + +# Whether or not to enable the client workers. [Required] +enabled = true + +# Whether or not to enable periodic refresh of clients. [Default: true] +# Note: Even if this is disabled, clients will be refreshed automatically if +# there is activity on a connection or channel they are involved with. +refresh = true + +# Whether or not to enable misbehaviour detection for clients. [Default: false] +misbehaviour = true + +# Specify the connections mode. +[mode.connections] + +# Whether or not to enable the connection workers for handshake completion. [Required] +enabled = true + +# Specify the channels mode. +[mode.channels] + +# Whether or not to enable the channel workers for handshake completion. [Required] +enabled = true + +# Specify the packets mode. +[mode.packets] + +# Whether or not to enable the packet workers. [Required] +enabled = true + +# Parametrize the periodic packet clearing feature. +# Interval (in number of blocks) at which pending packets +# should be eagerly cleared. A value of '0' will disable +# periodic packet clearing. [Default: 100] +clear_interval = 100 + +# Whether or not to clear packets on start. [Default: false] +clear_on_start = true + +# Toggle the transaction confirmation mechanism. +# The tx confirmation mechanism periodically queries the `/tx_search` RPC +# endpoint to check that previously-submitted transactions +# (to any chain in this config file) have delivered successfully. +# Experimental feature. Affects telemetry if set to false. +# [Default: true] +tx_confirmation = true + +# The REST section defines parameters for Hermes' built-in RESTful API. +# https://hermes.informal.systems/rest.html +[rest] + +# Whether or not to enable the REST service. Default: false +enabled = true + +# Specify the IPv4/6 host over which the built-in HTTP server will serve the RESTful +# API requests. Default: 127.0.0.1 +host = '127.0.0.1' + +# Specify the port over which the built-in HTTP server will serve the restful API +# requests. Default: 3000 +port = 3000 + + +# The telemetry section defines parameters for Hermes' built-in telemetry capabilities. +# https://hermes.informal.systems/telemetry.html +[telemetry] + +# Whether or not to enable the telemetry service. Default: false +enabled = true + +# Specify the IPv4/6 host over which the built-in HTTP server will serve the metrics +# gathered by the telemetry service. Default: 127.0.0.1 +host = '127.0.0.1' + +# Specify the port over which the built-in HTTP server will serve the metrics gathered +# by the telemetry service. Default: 3001 +port = 3001 + +[[chains]] +id = 'wasmchain' +rpc_addr = 'http://127.0.0.1:26657' +grpc_addr = 'http://127.0.0.1:9090' +websocket_addr = 'ws://127.0.0.1:26657/websocket' +rpc_timeout = '10s' +account_prefix = 'wasm' +key_name = 'requester' +store_prefix = 'ibc' +default_gas = 5000000 +max_gas = 15000000 +gas_price = { price = 0, denom = 'stake' } +gas_multiplier = 1.1 +max_msg_num = 20 +max_tx_size = 209715 +clock_drift = '20s' +max_block_time = '10s' +trusting_period = '10days' +trust_threshold = { numerator = '1', denominator = '3' } +address_type = { derivation = 'cosmos' } +ignore_port_channel = [] +# [chains.packet_filter] +# policy = 'allow' +# list = [ +# ['wasm.*', '*'], +# ] + +[[chains]] +id = 'band-laozi-testnet6' +rpc_addr = 'https://rpc.laozi-testnet6.bandchain.org:443' +grpc_addr = 'https://laozi-testnet6.bandchain.org:443' +websocket_addr = 'wss://rpc.laozi-testnet6.bandchain.org:443/websocket' +rpc_timeout = '10s' +account_prefix = 'band' +key_name = 'testkey' +store_prefix = 'ibc' +default_gas = 100000 +max_gas = 5000000 +gas_price = { price = 0.0025, denom = 'uband' } +gas_multiplier = 1.1 +max_msg_num = 30 +max_tx_size = 2097152 +clock_drift = '5s' +max_block_time = '10s' +trusting_period = '14days' +trust_threshold = { numerator = '1', denominator = '3' } +address_type = { derivation = 'cosmos' } +ignore_port_channel = [] +# [chains.packet_filter] +# policy = 'allow' +# list = [ +# ['oracle', '*'], +# ] From 9690295ed928c928f3482147bbfe816ea75844fa Mon Sep 17 00:00:00 2001 From: Ongart Pisansathienwong <54426055+colmazia@users.noreply.github.com> Date: Thu, 17 Nov 2022 11:38:03 +0700 Subject: [PATCH 3/6] Merge pull request #3 from bandprotocol/test-build test build --- .github/workflows/release.yml | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 74d0a29ab3..571e9d3b5c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -55,26 +55,3 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # (optional) CARGO_PROFILE_RELEASE_LTO: true - docker-release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up Docker Buildx - id: buildx - uses: docker/setup-buildx-action@v1 - - name: Login to Docker Hub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKER_HUB_USERNAME }} - password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }} - - name: Get release version - run: echo "TAG=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV - - name: Build and push - id: docker_build - uses: docker/build-push-action@v2 - with: - context: ./ci/release/ - file: ./ci/release/hermes.Dockerfile - push: true - build-args: TAG=v${{env.TAG}} - tags: informalsystems/hermes:${{env.TAG}} From 178d2cef89fd4d46fba1603b67a146eeca9d7e40 Mon Sep 17 00:00:00 2001 From: Kitipong Sirirueangsakul Date: Fri, 27 Jan 2023 16:56:50 +0700 Subject: [PATCH 4/6] Merge pull request #4 from bandprotocol/delay-config [feat]: Allow config to delay sending transaction to relay packet --- README.md | 5 +++++ crates/relayer/src/config.rs | 6 ++++++ crates/relayer/src/supervisor.rs | 11 +++++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 62bf581754..d3d16aeea2 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,11 @@ The repository also includes [TLA+ specifications](docs/spec). add a config named 'ignore_port_channel' in chain config that recieve a list of destination port and channel id to ignore e.g. ignore_port_channel = [{ channel_id = 'channel-64', port_id = 'oracle'}] +- **Add a global config that delay the packet sending used for backup hermes** + + add a config named 'packet_delay' in global config that received the duration. + + e.g. packet_delay = '10s' ## Status diff --git a/crates/relayer/src/config.rs b/crates/relayer/src/config.rs index 15989dbcd1..0a33adfb5b 100644 --- a/crates/relayer/src/config.rs +++ b/crates/relayer/src/config.rs @@ -106,6 +106,10 @@ pub mod default { 100 } + pub fn packet_delay() -> Duration { + Duration::ZERO + } + pub fn rpc_timeout() -> Duration { Duration::from_secs(10) } @@ -295,6 +299,8 @@ impl Display for LogLevel { #[serde(default, deny_unknown_fields)] pub struct GlobalConfig { pub log_level: LogLevel, + #[serde(default = "default::packet_delay", with = "humantime_serde")] + pub packet_delay: Duration, } #[derive(Clone, Debug, Deserialize, Serialize)] diff --git a/crates/relayer/src/supervisor.rs b/crates/relayer/src/supervisor.rs index 0613a3c70a..dc9fe744de 100644 --- a/crates/relayer/src/supervisor.rs +++ b/crates/relayer/src/supervisor.rs @@ -4,6 +4,7 @@ use core::convert::Infallible; use core::ops::Deref; use core::time::Duration; use std::sync::RwLock; +use std::thread; use crossbeam_channel::{unbounded, Receiver, Sender}; use itertools::Itertools; @@ -193,7 +194,14 @@ fn spawn_batch_workers( error_span!("worker.batch", chain = %chain.id()), Some(Duration::from_millis(5)), move || -> Result> { - if let Ok(batch) = subscription.try_recv() { + let mut batches: Vec = vec![]; + while let Ok(batch) = subscription.try_recv() { + batches.push(batch); + } + if !batches.is_empty() { + thread::sleep(config.global.packet_delay); + } + for batch in batches { handle_batch( &config, &mut registry.write(), @@ -203,7 +211,6 @@ fn spawn_batch_workers( batch, ); } - Ok(Next::Continue) }, ); From 5345919e42dcb724929683e74ee2dc2a98900cf4 Mon Sep 17 00:00:00 2001 From: colmazia Date: Wed, 1 Feb 2023 13:40:32 +0700 Subject: [PATCH 5/6] fix &Vec --- crates/relayer/src/event/rpc.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/relayer/src/event/rpc.rs b/crates/relayer/src/event/rpc.rs index 34e5073589..747687a1a9 100644 --- a/crates/relayer/src/event/rpc.rs +++ b/crates/relayer/src/event/rpc.rs @@ -116,7 +116,7 @@ use super::{ibc_event_try_from_abci_event, IbcEventWithHeight}; pub fn get_all_events( chain_id: &ChainId, result: RpcEvent, - ignore_port_channel: &Vec, + ignore_port_channel: &[PortChannelId], ) -> Result, String> { let mut events_with_height: Vec = vec![]; let RpcEvent { From e5d7829ae4116c25dd9d3aeb81f1aa61860323bb Mon Sep 17 00:00:00 2001 From: colmazia Date: Wed, 1 Feb 2023 13:42:03 +0700 Subject: [PATCH 6/6] add packet_delay to example config --- config_example.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config_example.toml b/config_example.toml index 19010f0ce4..d8f5a251b7 100644 --- a/config_example.toml +++ b/config_example.toml @@ -4,7 +4,7 @@ # Specify the verbosity for the relayer logging output. Default: 'info' # Valid options are 'error', 'warn', 'info', 'debug', 'trace'. log_level = 'trace' - +packet_delay = '0s' # Specify the mode to be used by the relayer. [Required] [mode]