handle subscriptions and unimplemented
this also means we handle new methods that haven't been added to our list as only 2 cu
This commit is contained in:
parent
8cb57e2f88
commit
1a7d4c9cbb
@ -14,7 +14,12 @@ pub struct ComputeUnit(Decimal);
|
||||
|
||||
impl ComputeUnit {
|
||||
/// costs can vary widely depending on method and chain
|
||||
pub fn new(method: &str, chain_id: u64) -> Self {
|
||||
pub fn new(method: &str, chain_id: u64, response_bytes: u64) -> Self {
|
||||
// TODO: this works, but this is fragile. think of a better way to check the method is a subscription
|
||||
if method.ends_with(')') {
|
||||
return Self::subscription_response(response_bytes);
|
||||
}
|
||||
|
||||
let cu = match (chain_id, method) {
|
||||
(_, "debug_traceTransaction") => 309,
|
||||
(_, "debug_traceCall") => 309,
|
||||
@ -96,9 +101,8 @@ impl ComputeUnit {
|
||||
(_, "eth_getUserOperationReceipt") => 15,
|
||||
(_, "eth_supportedEntryPoints") => 5,
|
||||
(_, method) => {
|
||||
// default to 10 CU for methods that aren't included here
|
||||
warn!("unknown method {}", method);
|
||||
10
|
||||
return Self::unimplemented();
|
||||
}
|
||||
};
|
||||
|
||||
@ -123,13 +127,15 @@ impl ComputeUnit {
|
||||
/// All methods cost the same
|
||||
/// The number of bytes are based on input, and output bytes
|
||||
pub fn cost(&self, archive_request: bool, cache_hit: bool, usd_per_cu: Decimal) -> Decimal {
|
||||
// TODO: server errors are free. need to split server and user errors
|
||||
|
||||
let mut cost = self.0 * usd_per_cu;
|
||||
|
||||
if archive_request {
|
||||
cost *= Decimal::from_str("2.5").unwrap();
|
||||
}
|
||||
|
||||
// cache hits get a 50% discount
|
||||
// cache hits get a 25% discount
|
||||
if cache_hit {
|
||||
cost *= Decimal::from_str("0.75").unwrap()
|
||||
}
|
||||
|
@ -810,7 +810,7 @@ impl TryFrom<RequestMetadata> for RpcQueryStats {
|
||||
x => x,
|
||||
};
|
||||
|
||||
let cu = ComputeUnit::new(&metadata.method, metadata.chain_id);
|
||||
let cu = ComputeUnit::new(&metadata.method, metadata.chain_id, response_bytes);
|
||||
|
||||
// TODO: get from config? a helper function? how should we pick this?
|
||||
let usd_per_cu = match metadata.chain_id {
|
||||
|
Loading…
Reference in New Issue
Block a user