Skip to content

Commit 80c7fa2

Browse files
committed
fix: Triton average over window instead of last
1 parent 3820cb3 commit 80c7fa2

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/dynamic_fee.rs

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::Miner;
33
use ore_api::consts::BUS_ADDRESSES;
44
use reqwest::Client;
55
use serde_json::{json, Value};
6+
use solana_client::rpc_response::RpcPrioritizationFee;
67
use url::Url;
78

89
enum FeeStrategy {
@@ -84,12 +85,16 @@ impl Miner {
8485
.map(|fee| fee as u64)
8586
.ok_or_else(|| format!("Failed to parse priority fee. Response: {:?}", response))
8687
.unwrap(),
87-
FeeStrategy::Triton => response["result"]
88-
.as_array()
89-
.and_then(|arr| arr.last())
90-
.and_then(|last| last["prioritizationFee"].as_u64())
91-
.ok_or_else(|| format!("Failed to parse priority fee. Response: {:?}", response))
92-
.unwrap(),
88+
FeeStrategy::Triton => {
89+
serde_json::from_value::<Vec<RpcPrioritizationFee>>(response["result"].clone())
90+
.map(|arr| estimate_prioritization_fee_micro_lamports(&arr))
91+
.or_else(|error| {
92+
Err(format!(
93+
"Failed to parse priority fee. Response: {response:?}, error: {error}"
94+
))
95+
})
96+
.unwrap()
97+
}
9398
};
9499

95100
// Check if the calculated fee is higher than max
@@ -100,3 +105,28 @@ impl Miner {
100105
}
101106
}
102107
}
108+
109+
/// Our estimate is the average over the last 20 slots
110+
/// Take last 20 slots and average
111+
pub fn estimate_prioritization_fee_micro_lamports(
112+
prioritization_fees: &[RpcPrioritizationFee],
113+
) -> u64 {
114+
let prioritization_fees = prioritization_fees
115+
.iter()
116+
.rev()
117+
.take(20)
118+
.map(
119+
|RpcPrioritizationFee {
120+
prioritization_fee, ..
121+
}| *prioritization_fee,
122+
)
123+
.collect::<Vec<_>>();
124+
if prioritization_fees.is_empty() {
125+
panic!("Response does not contain any prioritization fees");
126+
}
127+
128+
let prioritization_fee =
129+
prioritization_fees.iter().sum::<u64>() / prioritization_fees.len() as u64;
130+
131+
prioritization_fee
132+
}

0 commit comments

Comments
 (0)