waves_rust/model/transaction/
set_asset_script_transaction.rs1use 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}