cw_band/
packet.rs

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
45// create a serialized success message
46pub fn ack_success() -> Binary {
47    let res = AcknowledgementMsg::Result(b"1".into());
48    to_binary(&res).unwrap()
49}
50
51// create a serialized error message
52pub 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}