@@ -16,6 +16,7 @@ use serde_with::{hex::Hex, serde_as};
1616use std:: cmp:: Ordering ;
1717use std:: collections:: { HashMap , HashSet } ;
1818use std:: fmt:: { Display , Formatter } ;
19+ use std:: ops:: Neg ;
1920
2021/// Protocol era
2122#[ derive(
@@ -126,7 +127,7 @@ pub struct AddressDelta {
126127 pub address : Address ,
127128
128129 /// Balance change
129- pub delta : i64 ,
130+ pub delta : ValueDelta ,
130131}
131132
132133/// Stake balance change
@@ -139,6 +140,88 @@ pub struct StakeAddressDelta {
139140 pub delta : i64 ,
140141}
141142
143+ /// Value (lovelace + multiasset)
144+ #[ derive( Debug , Clone , serde:: Serialize , serde:: Deserialize ) ]
145+ pub struct Value {
146+ pub lovelace : u64 ,
147+ pub assets : NativeAssets ,
148+ }
149+
150+ impl Value {
151+ pub fn new ( lovelace : u64 , assets : NativeAssets ) -> Self {
152+ Self { lovelace, assets }
153+ }
154+
155+ pub fn coin ( & self ) -> u64 {
156+ self . lovelace
157+ }
158+ }
159+
160+ #[ derive( Debug , Clone , serde:: Serialize , serde:: Deserialize ) ]
161+ pub struct ValueDelta {
162+ pub lovelace : i64 ,
163+ pub assets : Vec < ( PolicyId , Vec < NativeAssetDelta > ) > ,
164+ }
165+
166+ impl ValueDelta {
167+ pub fn new ( lovelace : i64 , assets : Vec < ( PolicyId , Vec < NativeAssetDelta > ) > ) -> Self {
168+ Self { lovelace, assets }
169+ }
170+ }
171+
172+ impl From < & Value > for ValueDelta {
173+ fn from ( v : & Value ) -> Self {
174+ ValueDelta {
175+ lovelace : v. lovelace as i64 ,
176+ assets : v
177+ . assets
178+ . iter ( )
179+ . map ( |( pid, nas) | {
180+ let nas_delta = nas
181+ . iter ( )
182+ . map ( |na| NativeAssetDelta {
183+ name : na. name . clone ( ) ,
184+ amount : na. amount as i64 ,
185+ } )
186+ . collect ( ) ;
187+ ( * pid, nas_delta)
188+ } )
189+ . collect ( ) ,
190+ }
191+ }
192+ }
193+
194+ impl Neg for ValueDelta {
195+ type Output = Self ;
196+
197+ fn neg ( mut self ) -> Self :: Output {
198+ self . lovelace = -self . lovelace ;
199+ for ( _, nas) in & mut self . assets {
200+ for na in nas {
201+ na. amount = -na. amount ;
202+ }
203+ }
204+ self
205+ }
206+ }
207+
208+ pub type PolicyId = [ u8 ; 28 ] ;
209+ pub type NativeAssets = Vec < ( PolicyId , Vec < NativeAsset > ) > ;
210+ pub type NativeAssetsDelta = Vec < ( PolicyId , Vec < NativeAssetDelta > ) > ;
211+ pub type AssetName = Vec < u8 > ;
212+
213+ #[ derive( Debug , Clone , serde:: Serialize , serde:: Deserialize ) ]
214+ pub struct NativeAsset {
215+ pub name : AssetName ,
216+ pub amount : u64 ,
217+ }
218+
219+ #[ derive( Debug , Clone , serde:: Serialize , serde:: Deserialize ) ]
220+ pub struct NativeAssetDelta {
221+ pub name : AssetName ,
222+ pub amount : i64 ,
223+ }
224+
142225/// Transaction output (UTXO)
143226#[ derive( Debug , Clone , serde:: Serialize , serde:: Deserialize ) ]
144227pub struct TxOutput {
@@ -152,7 +235,7 @@ pub struct TxOutput {
152235 pub address : Address ,
153236
154237 /// Output value (Lovelace)
155- pub value : u64 ,
238+ pub value : Value ,
156239 // todo: Implement datum /// Datum (raw)
157240 // !!! pub datum: Vec<u8>,
158241}
0 commit comments