use crate::error::WalletAbiError;
use crate::wallet_abi::schema::runtime_params::RuntimeParams;
use crate::wallet_abi::schema::types::ErrorInfo;
use lwk_wollet::elements::Txid;
use serde::{Deserialize, Serialize};
use lwk_common::Network;
use uuid::Uuid;
pub const TX_CREATE_ABI_VERSION: &str = "wallet-abi-0.1";
pub fn generate_request_id() -> Uuid {
Uuid::new_v4()
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
pub struct TxCreateRequest {
pub abi_version: String,
pub request_id: Uuid,
pub network: Network,
pub params: RuntimeParams,
pub broadcast: bool,
}
impl TxCreateRequest {
pub fn validate_for_runtime(&self, runtime_network: Network) -> Result<(), WalletAbiError> {
if self.abi_version != TX_CREATE_ABI_VERSION {
return Err(WalletAbiError::InvalidRequest(format!(
"request abi_version mismatch: expected '{TX_CREATE_ABI_VERSION}', got '{}'",
self.abi_version
)));
}
if self.network != runtime_network {
return Err(WalletAbiError::InvalidRequest(format!(
"request network mismatch: expected {:?}, got {:?}",
runtime_network, self.network
)));
}
Ok(())
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TransactionInfo {
pub tx_hex: String,
pub txid: Txid,
}
pub type TxCreateArtifacts = serde_json::Map<String, serde_json::Value>;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum Status {
Ok,
Error,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TxCreateResponse {
pub abi_version: String,
pub request_id: Uuid,
pub network: Network,
pub status: Status,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub transaction: Option<TransactionInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub artifacts: Option<TxCreateArtifacts>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<ErrorInfo>,
}
impl TxCreateResponse {
pub fn ok(
request: &TxCreateRequest,
transaction: TransactionInfo,
artifacts: Option<TxCreateArtifacts>,
) -> Self {
Self {
abi_version: TX_CREATE_ABI_VERSION.to_string(),
request_id: request.request_id,
network: request.network,
status: Status::Ok,
transaction: Some(transaction),
artifacts,
error: None,
}
}
pub fn error(request: &TxCreateRequest, error: &WalletAbiError) -> Self {
Self {
abi_version: TX_CREATE_ABI_VERSION.to_string(),
request_id: request.request_id,
network: request.network,
status: Status::Error,
transaction: None,
artifacts: None,
error: Some(error.into()),
}
}
}