#![allow(deprecated)]
use anyhow::Result;
use prost::Message;
use std::cmp::{max, min};
use super::signer::NetworkSigner;
pub(crate) trait Signable: Message {
async fn sign(&self, signer: &NetworkSigner) -> Result<Vec<u8>>;
}
impl<T: Message> Signable for T {
async fn sign(&self, signer: &NetworkSigner) -> Result<Vec<u8>> {
let signature = signer.sign_message(self.encode_to_vec().as_slice()).await?;
Ok(signature.as_bytes().to_vec())
}
}
pub(crate) async fn sign_raw(
message: &[u8],
signer: &NetworkSigner,
) -> Result<alloy_primitives::Signature> {
Ok(signer.sign_message(message).await?)
}
pub(crate) async fn sign_message(message: &[u8], signer: &NetworkSigner) -> Result<Vec<u8>> {
let signature = signer.sign_message(message).await?;
let bytes = signature.as_bytes();
let mut signature_bytes = bytes[..64].to_vec();
let v = bytes[64];
signature_bytes.push(v + 27);
Ok(signature_bytes)
}
pub(crate) fn calculate_timeout_from_gas_limit(gas_limit: u64) -> u64 {
let base_timeout = 300; let gas_based_timeout = gas_limit / 2_000_000;
min(max(base_timeout, gas_based_timeout), 14400)
}
#[must_use]
pub fn get_default_rpc_url_for_mode(network_mode: super::NetworkMode) -> String {
match network_mode {
super::NetworkMode::Mainnet => super::MAINNET_RPC_URL.to_string(),
super::NetworkMode::Reserved => super::RESERVED_RPC_URL.to_string(),
}
}
#[must_use]
pub fn get_explorer_url_for_mode(network_mode: super::NetworkMode) -> &'static str {
match network_mode {
super::NetworkMode::Mainnet => super::MAINNET_EXPLORER_URL,
super::NetworkMode::Reserved => super::RESERVED_EXPLORER_URL,
}
}
#[must_use]
pub fn get_default_cycle_limit_for_mode(network_mode: super::NetworkMode) -> u64 {
match network_mode {
super::NetworkMode::Mainnet => super::MAINNET_DEFAULT_CYCLE_LIMIT,
super::NetworkMode::Reserved => super::RESERVED_DEFAULT_CYCLE_LIMIT,
}
}