use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum AccountType {
ModularAccountV2,
LightAccount,
MultiOwnerLightAccount,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum KeyType {
Secp256k1,
Ecdsa,
Contract,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WebAuthnPublicKey {
pub x: String,
pub y: String,
#[serde(rename = "type")]
pub key_type: String,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreationHint {
#[serde(skip_serializing_if = "Option::is_none")]
pub account_type: Option<AccountType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub salt: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RequestAccountParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub signer_address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub signer_public_key: Option<WebAuthnPublicKey>,
#[serde(skip_serializing_if = "Option::is_none")]
pub account_address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub creation_hint: Option<CreationHint>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_counterfactual_info: Option<bool>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountResponse {
pub address: String,
pub id: Option<String>,
pub counterfactual: Option<CounterfactualInfo>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CounterfactualInfo {
pub factory_address: String,
pub factory_data: String,
pub is_deployed: bool,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WalletCall {
pub to: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PrepareCallsCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub paymaster_service: Option<PaymasterServiceCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gas_overrides: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PaymasterServiceCapability {
pub policy_id: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PrepareCallsRequest {
pub calls: Vec<WalletCall>,
pub from: String,
pub chain_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub capabilities: Option<PrepareCallsCapabilities>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PreparedCallsResponse {
pub prepared_call_id: String,
pub user_operations: Vec<serde_json::Value>,
pub signature_requests: Vec<SignatureRequest>,
pub fee_info: Option<FeeInfo>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SignatureRequest {
#[serde(rename = "type")]
pub sig_type: String,
pub data: serde_json::Value,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct FeeInfo {
pub estimated_gas: String,
pub estimated_gas_usd: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SendPreparedCallsRequest {
pub prepared_call_id: String,
pub signatures: Vec<Signature>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Signature {
#[serde(rename = "type")]
pub sig_type: String,
pub data: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SendPreparedCallsResponse {
pub call_id: String,
pub user_op_hashes: Vec<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CallsStatusResponse {
pub status: u16,
pub message: Option<String>,
pub receipts: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WalletCapabilities {
pub atomic_batch: Option<AtomicBatchCapability>,
pub paymaster: Option<PaymasterCapability>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct AtomicBatchCapability {
pub supported: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PaymasterCapability {
pub supported: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ListAccountsResponse {
pub accounts: Vec<AccountInfo>,
pub total_count: u64,
pub cursor: Option<String>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountInfo {
pub address: String,
pub id: String,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionPermission {
#[serde(rename = "type")]
pub permission_type: String,
pub data: serde_json::Value,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateSessionRequest {
pub account: String,
pub chain_id: String,
pub key: SessionKey,
pub permissions: Vec<SessionPermission>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiry_sec: Option<u64>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionKey {
#[serde(rename = "type")]
pub key_type: KeyType,
pub public_key: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateSessionResponse {
pub session_id: String,
pub chain_id: String,
pub signature_request: SignatureRequest,
}