Skip to content

Commit 9b4d44b

Browse files
svyatonikbkchr
authored andcommitted
Increase rate from metric when estimating fee (#1340)
* ignore errors when dumping logs and container is missing * fixed typo * print correct payload length * increase conversion rate a bit when estimating fee (to avoid message rejects when rate update tx is active) * fmt
1 parent e822bbf commit 9b4d44b

File tree

4 files changed

+79
-41
lines changed

4 files changed

+79
-41
lines changed

bridges/relays/bin-substrate/src/cli/estimate_fee.rs

Lines changed: 75 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515
// along with Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
1616

1717
use crate::{
18-
cli::{bridge::FullBridge, Balance, CliChain, HexBytes, HexLaneId, SourceConnectionParams},
18+
cli::{
19+
bridge::FullBridge, relay_headers_and_messages::CONVERSION_RATE_ALLOWED_DIFFERENCE_RATIO,
20+
Balance, CliChain, HexBytes, HexLaneId, SourceConnectionParams,
21+
},
1922
select_full_bridge,
2023
};
2124
use bp_runtime::BalanceOf;
@@ -116,44 +119,78 @@ pub(crate) async fn estimate_message_delivery_and_dispatch_fee<
116119
// lane. So we MUST use the larger of two fees - one computed with stored fee and the one
117120
// computed with actual fee.
118121

119-
let conversion_rate_override = match (
122+
let conversion_rate_override =
123+
match (conversion_rate_override, Source::TOKEN_ID, Target::TOKEN_ID) {
124+
(Some(ConversionRateOverride::Explicit(v)), _, _) => {
125+
let conversion_rate_override = FixedU128::from_float(v);
126+
log::info!(
127+
target: "bridge",
128+
"{} -> {} conversion rate override: {:?} (explicit)",
129+
Target::NAME,
130+
Source::NAME,
131+
conversion_rate_override.to_float(),
132+
);
133+
Some(conversion_rate_override)
134+
},
135+
(
136+
Some(ConversionRateOverride::Metric),
137+
Some(source_token_id),
138+
Some(target_token_id),
139+
) => {
140+
let conversion_rate_override =
141+
tokens_conversion_rate_from_metrics(target_token_id, source_token_id).await?;
142+
// So we have current actual conversion rate and rate that is stored in the runtime.
143+
// And we may simply choose the maximal of these. But what if right now there's
144+
// rate update transaction on the way, that is updating rate to 10 seconds old
145+
// actual rate, which is bigger than the current rate? Then our message will be
146+
// rejected.
147+
//
148+
// So let's increase the actual rate by the same value that the conversion rate
149+
// updater is using.
150+
let increased_conversion_rate_override = FixedU128::from_float(
151+
conversion_rate_override * (1.0 + CONVERSION_RATE_ALLOWED_DIFFERENCE_RATIO),
152+
);
153+
log::info!(
154+
target: "bridge",
155+
"{} -> {} conversion rate override: {} (value from metric - {})",
156+
Target::NAME,
157+
Source::NAME,
158+
increased_conversion_rate_override.to_float(),
159+
conversion_rate_override,
160+
);
161+
Some(increased_conversion_rate_override)
162+
},
163+
_ => None,
164+
};
165+
166+
let without_override = do_estimate_message_delivery_and_dispatch_fee(
167+
client,
168+
estimate_fee_method,
169+
lane,
170+
payload.clone(),
171+
None,
172+
)
173+
.await?;
174+
let with_override = do_estimate_message_delivery_and_dispatch_fee(
175+
client,
176+
estimate_fee_method,
177+
lane,
178+
payload.clone(),
120179
conversion_rate_override,
121-
Source::TOKEN_ID,
122-
Target::TOKEN_ID,
123-
) {
124-
(Some(ConversionRateOverride::Explicit(v)), _, _) => {
125-
let conversion_rate_override = FixedU128::from_float(v);
126-
log::info!(target: "bridge", "{} -> {} conversion rate override: {:?} (explicit)", Target::NAME, Source::NAME, conversion_rate_override.to_float());
127-
Some(conversion_rate_override)
128-
},
129-
(Some(ConversionRateOverride::Metric), Some(source_token_id), Some(target_token_id)) => {
130-
let conversion_rate_override = FixedU128::from_float(
131-
tokens_conversion_rate_from_metrics(target_token_id, source_token_id).await?,
132-
);
133-
log::info!(target: "bridge", "{} -> {} conversion rate override: {:?} (from metric)", Target::NAME, Source::NAME, conversion_rate_override.to_float());
134-
Some(conversion_rate_override)
135-
},
136-
_ => None,
137-
};
138-
139-
Ok(std::cmp::max(
140-
do_estimate_message_delivery_and_dispatch_fee(
141-
client,
142-
estimate_fee_method,
143-
lane,
144-
payload.clone(),
145-
None,
146-
)
147-
.await?,
148-
do_estimate_message_delivery_and_dispatch_fee(
149-
client,
150-
estimate_fee_method,
151-
lane,
152-
payload.clone(),
153-
conversion_rate_override,
154-
)
155-
.await?,
156-
))
180+
)
181+
.await?;
182+
let maximal_fee = std::cmp::max(without_override, with_override);
183+
184+
log::info!(
185+
target: "bridge",
186+
"Estimated message fee: {:?} = max of {:?} (without rate override) and {:?} (with override to {:?})",
187+
maximal_fee,
188+
without_override,
189+
with_override,
190+
conversion_rate_override,
191+
);
192+
193+
Ok(maximal_fee)
157194
}
158195

159196
/// Estimate message delivery and dispatch fee with given conversion rate override.

bridges/relays/bin-substrate/src/cli/relay_headers_and_messages.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ use crate::{
5050
/// stored and real conversion rates. If it is large enough (e.g. > than 10 percents, which is 0.1),
5151
/// then rational relayers may stop relaying messages because they were submitted using
5252
/// lesser conversion rate.
53-
const CONVERSION_RATE_ALLOWED_DIFFERENCE_RATIO: f64 = 0.05;
53+
pub(crate) const CONVERSION_RATE_ALLOWED_DIFFERENCE_RATIO: f64 = 0.05;
5454

5555
/// Start headers+messages relayer process.
5656
#[derive(StructOpt)]

bridges/relays/bin-substrate/src/cli/send_message.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ impl SendMessage {
190190
),
191191
};
192192
let dispatch_weight = payload.weight;
193+
let payload_len = payload.encode().len();
193194
let send_message_call = Source::encode_call(&encode_call::Call::BridgeSendMessage {
194195
bridge_instance_index: self.bridge.bridge_instance_index(),
195196
lane: self.lane,
@@ -230,7 +231,7 @@ impl SendMessage {
230231
"Sending message to {}. Lane: {:?}. Size: {}. Dispatch weight: {}. Fee: {}",
231232
Target::NAME,
232233
lane,
233-
signed_source_call.len(),
234+
payload_len,
234235
dispatch_weight,
235236
fee,
236237
);

bridges/relays/bin-substrate/src/cli/swap_tokens.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ impl SwapTokens {
363363
//
364364

365365
if is_transfer_succeeded {
366-
log::info!(target: "bridge", "Claiming the swap swap");
366+
log::info!(target: "bridge", "Claiming the swap");
367367

368368
// prepare `claim_swap` message that will be sent over the bridge
369369
let claim_swap_call: CallOf<Source> =

0 commit comments

Comments
 (0)