ic_evm_utils/
request.rs

1//! This module provides functions for making arbitrary requests to EVM RPC providers through the EVM RPC canister.
2use evm_rpc_canister_types::{EvmRpcCanister, RequestResult, RpcService};
3use serde::{Deserialize, Serialize};
4
5use crate::request_cost::request_cost;
6
7/// Make a arbitrary request to EVM RPC provider through the EVM RPC canister.
8///
9/// # Arguments
10///
11/// * `rpc_service` - The RPC service used to interact with the EVM.
12/// * `json_rpc_payload` - The JSON-RPC payload to send.
13/// * `max_response_bytes` - The maximum number of response bytes to accept.
14/// * `evm_rpc` - The EVM RPC canister.
15///
16/// # Returns
17///
18/// The result of the request.
19pub async fn request(
20    rpc_service: RpcService,
21    json_rpc_payload: String,
22    max_response_bytes: u64,
23    evm_rpc: EvmRpcCanister,
24) -> RequestResult {
25    // estimate cycles costs
26    let cycles = request_cost(
27        rpc_service.clone(),
28        json_rpc_payload.clone(),
29        max_response_bytes,
30        evm_rpc.clone(),
31    )
32    .await;
33    // call request with estimated cycles
34    match evm_rpc
35        .request(rpc_service, json_rpc_payload, max_response_bytes, cycles)
36        .await
37    {
38        Ok((res,)) => res,
39        Err(e) => ic_cdk::trap(format!("Error: {:?}", e).as_str()),
40    }
41}
42
43/// Represents a JSON-RPC result.
44#[derive(Clone, Debug, Serialize, Deserialize)]
45pub struct JsonRpcResult {
46    pub result: Option<String>,
47    pub error: Option<JsonRpcError>,
48}
49
50/// Represents a JSON-RPC error.
51#[derive(Clone, Debug, Serialize, Deserialize)]
52pub struct JsonRpcError {
53    pub code: isize,
54    pub message: String,
55}