@@ -16,6 +16,7 @@ use serde_with::{hex::Hex, serde_as};
16
16
use std:: cmp:: Ordering ;
17
17
use std:: collections:: { HashMap , HashSet } ;
18
18
use std:: fmt:: { Display , Formatter } ;
19
+ use std:: ops:: Neg ;
19
20
20
21
/// Protocol era
21
22
#[ derive(
@@ -126,7 +127,7 @@ pub struct AddressDelta {
126
127
pub address : Address ,
127
128
128
129
/// Balance change
129
- pub delta : i64 ,
130
+ pub delta : ValueDelta ,
130
131
}
131
132
132
133
/// Stake balance change
@@ -139,6 +140,88 @@ pub struct StakeAddressDelta {
139
140
pub delta : i64 ,
140
141
}
141
142
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
+
142
225
/// Transaction output (UTXO)
143
226
#[ derive( Debug , Clone , serde:: Serialize , serde:: Deserialize ) ]
144
227
pub struct TxOutput {
@@ -152,7 +235,7 @@ pub struct TxOutput {
152
235
pub address : Address ,
153
236
154
237
/// Output value (Lovelace)
155
- pub value : u64 ,
238
+ pub value : Value ,
156
239
// todo: Implement datum /// Datum (raw)
157
240
// !!! pub datum: Vec<u8>,
158
241
}
0 commit comments