use crate::{
network::{signer::NetworkSigner, utils::sign_raw},
SP1Stdin,
};
use alloy_primitives::{Address, Signature as AlloySignature};
use serde::{Deserialize, Serialize};
use k256::ecdsa::Signature;
#[derive(Debug, Serialize, Deserialize)]
pub struct TEERequest {
pub id: [u8; 32],
pub program: Vec<u8>,
pub cycle_limit: u64,
pub stdin: SP1Stdin,
pub signature: AlloySignature,
}
impl TEERequest {
pub(crate) async fn new(
signer: &NetworkSigner,
id: [u8; 32],
program: Vec<u8>,
stdin: SP1Stdin,
cycle_limit: u64,
) -> Result<Self, anyhow::Error> {
let signature = sign_raw(&id, signer).await?;
Ok(Self { id, program, cycle_limit, stdin, signature })
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct TEEResponse {
pub vkey: [u8; 32],
pub public_values: Vec<u8>,
pub signature: Signature,
pub recovery_id: u8,
}
impl TEEResponse {
#[must_use]
pub fn as_prefix_bytes(&self) -> Vec<u8> {
let mut bytes = Vec::new();
let version_bytes = super::SP1_TEE_VERSION.to_le_bytes();
let version_bytes_len: u8 = version_bytes.len().try_into().unwrap();
bytes.extend_from_slice(&Self::selector());
bytes.extend_from_slice(&self.recovery_id.to_be_bytes());
bytes.extend_from_slice(&self.signature.to_bytes());
bytes.push(version_bytes_len);
bytes.extend_from_slice(&version_bytes);
bytes
}
fn selector() -> [u8; 4] {
alloy_primitives::keccak256("SP1TeeVerifier")[0..4].try_into().unwrap()
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct GetAddressResponse {
pub address: Address,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum EventPayload {
Success(TEEResponse),
Error(String),
}