Crate switchboard_evm

source ·
Expand description

Switchboard is a multi-chain, permissionless oracle protocol providing verifiable off-chain compute for smart contracts.

This library provides the ethers-rs bindings for interacting and operating Switchboard, along side the [EvmFunctionRunner] to write custom Switchboard Functions.

Here’s an example of using the EvmFunctionRunner inside a Switchboard Function:

// Generate your contract's ABI
abigen!(Receiver, r#"[ function callback(int256, uint256) ]"#,);

#[derive(Debug, Deserialize)]
pub struct DeribitRespnseInner {
    pub mark_iv: f64,
    pub timestamp: u64,
}

#[derive(Debug, Deserialize)]
pub struct DeribitResponse {
    pub result: DeribitRespnseInner,
}

#[tokio::main(worker_threads = 12)]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // --- Initialize clients ---
    let function_runner = EvmFunctionRunner::new()?;
    let client = function_runner.get_client(None).await?;

    let receiver: Address = env!("EXAMPLE_PROGRAM").parse()?;
    let receiver_contract = Receiver::new(receiver, client.into());
    // --- Logic Below ---
    let url = "https://www.deribit.com/api/v2/public/get_order_book?instrument_name=ETH-29SEP23-2000-C";
    let derebit_response: DeribitResponse = reqwest::get(url).await?.json().await?;
    let timestamp = derebit_response.result.timestamp.into();
    let mut mark_iv = Decimal::from_f64(derebit_response.result.mark_iv).unwrap();
    mark_iv.rescale(8);
    // --- Send the callback to the contract with Switchboard verification ---
    let callback = receiver_contract.callback(mark_iv.mantissa().into(), timestamp);
    let expiration = (Utc::now().timestamp() + 120).into();
    let gas_limit = 5_500_000.into();
    function_runner.emit(receiver, expiration, gas_limit, vec![callback])?;
    Ok(())
}

Re-exports

Modules

Macros

Structs

Enums

Constants

Statics

Traits

Functions

Type Aliases

Attribute Macros