waves_rust/model/transaction/
set_asset_script_transaction.rs

1use crate::error::{Error, Result};
2use crate::model::{AssetId, Base64String, ByteString};
3use crate::util::JsonDeserializer;
4use crate::waves_proto::SetAssetScriptTransactionData;
5use serde_json::{Map, Value};
6
7const TYPE: u8 = 15;
8
9#[derive(Clone, Eq, PartialEq, Debug)]
10pub struct SetAssetScriptTransactionInfo {
11    asset_id: AssetId,
12    script: Base64String,
13}
14
15impl SetAssetScriptTransactionInfo {
16    pub fn new(asset_id: AssetId, script: Base64String) -> Self {
17        Self { asset_id, script }
18    }
19
20    pub fn script(&self) -> Base64String {
21        self.script.clone()
22    }
23
24    pub fn asset_id(&self) -> AssetId {
25        self.asset_id.clone()
26    }
27}
28
29impl TryFrom<&Value> for SetAssetScriptTransactionInfo {
30    type Error = Error;
31
32    fn try_from(value: &Value) -> Result<Self> {
33        let script = JsonDeserializer::safe_to_string_from_field(value, "script")?;
34        let asset_id = JsonDeserializer::safe_to_string_from_field(value, "assetId")?;
35
36        Ok(SetAssetScriptTransactionInfo {
37            asset_id: AssetId::from_string(&asset_id)?,
38            script: Base64String::from_string(&script)?,
39        })
40    }
41}
42
43#[derive(Clone, Eq, PartialEq, Debug)]
44pub struct SetAssetScriptTransaction {
45    asset_id: AssetId,
46    script: Base64String,
47}
48
49impl SetAssetScriptTransaction {
50    pub fn new(asset_id: AssetId, script: Base64String) -> Self {
51        Self { asset_id, script }
52    }
53
54    pub fn script(&self) -> Base64String {
55        self.script.clone()
56    }
57
58    pub fn asset_id(&self) -> AssetId {
59        self.asset_id.clone()
60    }
61
62    pub fn tx_type() -> u8 {
63        TYPE
64    }
65}
66
67impl TryFrom<&Value> for SetAssetScriptTransaction {
68    type Error = Error;
69
70    fn try_from(value: &Value) -> Result<Self> {
71        let script = JsonDeserializer::safe_to_string_from_field(value, "script")?;
72        let asset_id = JsonDeserializer::safe_to_string_from_field(value, "assetId")?;
73
74        Ok(SetAssetScriptTransaction {
75            asset_id: AssetId::from_string(&asset_id)?,
76            script: Base64String::from_string(&script)?,
77        })
78    }
79}
80
81impl TryFrom<&SetAssetScriptTransaction> for Map<String, Value> {
82    type Error = Error;
83
84    fn try_from(value: &SetAssetScriptTransaction) -> Result<Self> {
85        let mut set_script_tx_json = Map::new();
86        set_script_tx_json.insert("assetId".to_owned(), value.asset_id.encoded().into());
87        set_script_tx_json.insert("script".to_owned(), value.script.encoded().into());
88        Ok(set_script_tx_json)
89    }
90}
91
92impl TryFrom<&SetAssetScriptTransaction> for SetAssetScriptTransactionData {
93    type Error = Error;
94
95    fn try_from(value: &SetAssetScriptTransaction) -> Result<Self> {
96        Ok(SetAssetScriptTransactionData {
97            asset_id: value.asset_id.bytes(),
98            script: value.script.bytes(),
99        })
100    }
101}
102
103#[cfg(test)]
104mod tests {
105    use crate::error::Result;
106    use crate::model::{AssetId, Base64String, ByteString, SetAssetScriptTransaction};
107    use crate::waves_proto::SetAssetScriptTransactionData;
108    use serde_json::{json, Map, Value};
109    use std::borrow::Borrow;
110    use std::fs;
111
112    const COMPILED_ASSET_SCRIPT: &str = "base64:AgQAAAAHbWFzdGVyMQkBAAAAEWFkZHJlc3NGcm9tU3RyaW5nAAAAAQIAAAAQMzMzbWFzdGVyQWRkcmVzcwQAAAAHJG1hdGNoMAUAAAACdHgDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAE1RyYW5zZmVyVHJhbnNhY3Rpb24EAAAAAXQFAAAAByRtYXRjaDADCQAAAAAAAAIIBQAAAAF0AAAABnNlbmRlcgUAAAAHbWFzdGVyMQYJAAAAAAAAAggFAAAAAXQAAAAJcmVjaXBpZW50BQAAAAdtYXN0ZXIxAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABdNYXNzVHJhbnNmZXJUcmFuc2FjdGlvbgQAAAACbXQFAAAAByRtYXRjaDAJAAAAAAAAAggFAAAAAm10AAAABnNlbmRlcgUAAAAHbWFzdGVyMQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAATRXhjaGFuZ2VUcmFuc2FjdGlvbgcGFLbwIw==";
113
114    #[test]
115    fn test_json_to_set_asset_script_transaction() {
116        let data = fs::read_to_string("./tests/resources/set_asset_script_rs.json")
117            .expect("Unable to read file");
118        let json: Value = serde_json::from_str(&data).expect("failed to generate json from str");
119
120        let set_script_from_json: SetAssetScriptTransaction = json.borrow().try_into().unwrap();
121
122        assert_eq!(
123            "CVwsbXjXmdYF2q4RCPuQKf7sLGpzhk7BNnYsxGZZJMym",
124            set_script_from_json.asset_id.encoded()
125        );
126
127        assert_eq!(
128            set_script_from_json.script().encoded_with_prefix(),
129            COMPILED_ASSET_SCRIPT
130        );
131    }
132
133    #[test]
134    fn test_set_asset_script_to_proto() -> Result<()> {
135        let set_asset_script_tx = &SetAssetScriptTransaction::new(
136            AssetId::from_string("CVwsbXjXmdYF2q4RCPuQKf7sLGpzhk7BNnYsxGZZJMym")?,
137            Base64String::from_string(COMPILED_ASSET_SCRIPT)?,
138        );
139        let proto: SetAssetScriptTransactionData = set_asset_script_tx.try_into()?;
140
141        assert_eq!(proto.asset_id, set_asset_script_tx.asset_id().bytes());
142        assert_eq!(proto.script, set_asset_script_tx.script().bytes());
143
144        Ok(())
145    }
146
147    #[test]
148    fn test_set_asset_script_to_json() -> Result<()> {
149        let set_asset_script_tx = &SetAssetScriptTransaction::new(
150            AssetId::from_string("CVwsbXjXmdYF2q4RCPuQKf7sLGpzhk7BNnYsxGZZJMym")?,
151            Base64String::from_string(COMPILED_ASSET_SCRIPT)?,
152        );
153
154        let map: Map<String, Value> = set_asset_script_tx.try_into()?;
155        let json: Value = map.into();
156        let expected_json = json!({
157            "assetId": "CVwsbXjXmdYF2q4RCPuQKf7sLGpzhk7BNnYsxGZZJMym",
158            "script": "AgQAAAAHbWFzdGVyMQkBAAAAEWFkZHJlc3NGcm9tU3RyaW5nAAAAAQIAAAAQMzMzbWFzdGVyQWRkcmVzcwQAAAAHJG1hdGNoMAUAAAACdHgDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAE1RyYW5zZmVyVHJhbnNhY3Rpb24EAAAAAXQFAAAAByRtYXRjaDADCQAAAAAAAAIIBQAAAAF0AAAABnNlbmRlcgUAAAAHbWFzdGVyMQYJAAAAAAAAAggFAAAAAXQAAAAJcmVjaXBpZW50BQAAAAdtYXN0ZXIxAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABdNYXNzVHJhbnNmZXJUcmFuc2FjdGlvbgQAAAACbXQFAAAAByRtYXRjaDAJAAAAAAAAAggFAAAAAm10AAAABnNlbmRlcgUAAAAHbWFzdGVyMQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAATRXhjaGFuZ2VUcmFuc2FjdGlvbgcGFLbwIw=="
159        });
160        assert_eq!(expected_json, json);
161        Ok(())
162    }
163}