1use cosmwasm_schema::cw_serde;
2use cosmwasm_std::{to_binary, Binary, Coin, Uint64};
3
4#[cw_serde]
5pub struct OracleRequestPacketData {
6 pub client_id: String,
7 pub oracle_script_id: Uint64,
8 pub calldata: Binary,
9 pub ask_count: Uint64,
10 pub min_count: Uint64,
11 pub fee_limit: Vec<Coin>,
12 pub prepare_gas: Uint64,
13 pub execute_gas: Uint64,
14}
15
16#[cw_serde]
17pub struct OracleResponsePacketData {
18 pub client_id: String,
19 pub request_id: Uint64,
20 pub ans_count: Uint64,
21 pub request_time: Uint64,
22 pub resolve_time: Uint64,
23 pub resolve_status: ResolveStatus,
24 pub result: Binary,
25}
26
27#[cw_serde]
28pub enum ResolveStatus {
29 #[serde(rename = "RESOLVE_STATUS_OPEN_UNSPECIFIED")]
30 Open,
31 #[serde(rename = "RESOLVE_STATUS_SUCCESS")]
32 Success,
33 #[serde(rename = "RESOLVE_STATUS_FAILURE")]
34 Failure,
35 #[serde(rename = "RESOLVE_STATUS_EXPIRED")]
36 Expired,
37}
38
39#[cw_serde]
40pub enum AcknowledgementMsg {
41 Result(Binary),
42 Error(String),
43}
44
45pub fn ack_success() -> Binary {
47 let res = AcknowledgementMsg::Result(b"1".into());
48 to_binary(&res).unwrap()
49}
50
51pub fn ack_fail(err: String) -> Binary {
53 let res = AcknowledgementMsg::Error(err);
54 to_binary(&res).unwrap()
55}
56
57#[cw_serde]
58pub struct BandAcknowledgement {
59 pub request_id: Uint64,
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65 use base64::decode;
66 use cosmwasm_std::from_slice;
67
68 #[test]
69 fn test_serialize_request_packet() {
70 let calldata = base64::decode("AAAAAgAAAANCVEMAAAADRVRIAQ==").unwrap();
71 let packet = OracleRequestPacketData {
72 client_id: "1".into(),
73 oracle_script_id: Uint64::from(360u64),
74 calldata: Binary(calldata),
75 ask_count: Uint64::from(1u64),
76 min_count: Uint64::from(1u64),
77 fee_limit: vec![Coin::new(1000, "uband")],
78 prepare_gas: Uint64::from(900000u64),
79 execute_gas: Uint64::from(4000000u64),
80 };
81
82 assert_eq!(hex::encode(to_binary(&packet).unwrap().to_vec()), "7b22636c69656e745f6964223a2231222c226f7261636c655f7363726970745f6964223a22333630222c2263616c6c64617461223a22414141414167414141414e4356454d41414141445256524941513d3d222c2261736b5f636f756e74223a2231222c226d696e5f636f756e74223a2231222c226665655f6c696d6974223a5b7b2264656e6f6d223a227562616e64222c22616d6f756e74223a2231303030227d5d2c22707265706172655f676173223a22393030303030222c22657865637574655f676173223a2234303030303030227d");
83 }
84
85 #[test]
86 fn test_deserialize_response_packet() {
87 let packet = from_slice::<OracleResponsePacketData>(&decode("eyJhbnNfY291bnQiOiIxNiIsImNsaWVudF9pZCI6IjQxMTg2MTEiLCJyZXF1ZXN0X2lkIjoiMTM4NTk4OTkiLCJyZXF1ZXN0X3RpbWUiOiIxNjY5NzkwNDQ1IiwicmVzb2x2ZV9zdGF0dXMiOiJSRVNPTFZFX1NUQVRVU19TVUNDRVNTIiwicmVzb2x2ZV90aW1lIjoiMTY2OTc5MDQ1MSIsInJlc3VsdCI6IkFBQUFCQUFBQUFBdld4dWdBQUFBQW1jZHVIQUFBQUFBQTlzK1h3QUFBQUFQTHdtRyJ9").unwrap()).unwrap();
88
89 assert_eq!(packet.resolve_status, ResolveStatus::Success);
90 assert_eq!(packet.request_id, Uint64::from(13859899u64))
91 }
92}