use cosmwasm_std::{entry_point, Binary, DepsMut, Env, Response, StdResult};
use serde::{Deserialize, Serialize};
// Contract Manager sudo message structures (exact format from source code)
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum SudoMsg {
Response {
request: RequestPacket,
data: Binary,
},
Error {
request: RequestPacket,
details: String,
},
Timeout {
request: RequestPacket,
},
// ... other sudo messages
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct RequestPacket {
pub sequence: Option<u64>,
pub source_port: Option<String>,
pub source_channel: Option<String>,
pub destination_port: Option<String>,
pub destination_channel: Option<String>,
pub data: Option<Binary>,
pub timeout_height: Option<RequestPacketTimeoutHeight>,
pub timeout_timestamp: Option<u64>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct RequestPacketTimeoutHeight {
pub revision_number: Option<u64>,
pub revision_height: Option<u64>,
}
#[cfg_attr(not(feature = "library"), entry_point)]
pub fn sudo(deps: DepsMut, env: Env, msg: SudoMsg) -> Result<Response, ContractError> {
match msg {
SudoMsg::Response { request, data } => handle_ibc_acknowledgement(deps, env, request, data),
SudoMsg::Error { request, details } => handle_ibc_error(deps, env, request, details),
SudoMsg::Timeout { request } => handle_ibc_timeout(deps, env, request),
_ => Err(ContractError::UnsupportedSudoType {}),
}
}
fn handle_ibc_acknowledgement(
deps: DepsMut,
env: Env,
request: RequestPacket,
data: Binary,
) -> Result<Response, ContractError> {
// The 'data' field contains the acknowledgement result
// Parse based on your expected acknowledgement format
deps.api.debug("IBC transfer acknowledged successfully");
// Store transfer result or update contract state
// request.sequence contains the packet sequence ID for correlation
Ok(Response::new()
.add_attribute("action", "ibc_ack_received")
.add_attribute("sequence", request.sequence.unwrap_or(0).to_string()))
}
fn handle_ibc_error(
deps: DepsMut,
env: Env,
request: RequestPacket,
details: String,
) -> Result<Response, ContractError> {
// Handle acknowledgement with error
deps.api.debug(&format!("IBC transfer failed: {}", details));
Ok(Response::new()
.add_attribute("action", "ibc_error_received")
.add_attribute("error", details))
}
fn handle_ibc_timeout(
deps: DepsMut,
env: Env,
request: RequestPacket,
) -> Result<Response, ContractError> {
// Handle timeout - tokens are automatically returned by IBC Transfer module
deps.api.debug("IBC transfer timed out");
Ok(Response::new()
.add_attribute("action", "ibc_timeout_received")
.add_attribute("sequence", request.sequence.unwrap_or(0).to_string()))
}