1
1
package org .xrpl .xrpl4j .model .transactions ;
2
2
3
3
import static org .assertj .core .api .AssertionsForClassTypes .assertThat ;
4
- import static org .assertj .core .api .AssertionsForClassTypes .assertThatThrownBy ;
5
4
6
5
import com .fasterxml .jackson .databind .ObjectMapper ;
7
6
import org .junit .jupiter .api .Test ;
@@ -112,6 +111,29 @@ void deserializeLedgerResultWithNegativeAmounts(String ledgerResultFileName) thr
112
111
});
113
112
}
114
113
114
+ /**
115
+ * This test validates that the ledger 94084608 and all of its transactions and metadata are handled correctly, even
116
+ * in the presence of a `UnlModify` transaction that has an empty `Account`.
117
+ */
118
+ @ ParameterizedTest
119
+ @ ValueSource (strings = {
120
+ "ledger-result-94084608.json" // <-- See https://github.com/XRPLF/xrpl4j/issues/590
121
+ })
122
+ void deserializeLedgerResultWithSpecialObjects (String ledgerResultFileName ) throws IOException {
123
+ Objects .requireNonNull (ledgerResultFileName );
124
+
125
+ File jsonFile = new File (
126
+ "src/test/resources/special-object-ledgers/" + ledgerResultFileName
127
+ );
128
+
129
+ LedgerResult ledgerResult = objectMapper .readValue (jsonFile , LedgerResult .class );
130
+
131
+ ledgerResult .ledger ().transactions ().forEach (transactionResult -> {
132
+ assertThat (transactionResult .metadata ().isPresent ()).isTrue ();
133
+ transactionResult .metadata ().ifPresent (this ::handleTransactionMetadata );
134
+ });
135
+ }
136
+
115
137
/**
116
138
* This test validates that the ledger 87704323 and all of its transactions and metadata are handled correctly, even
117
139
* in the presence of negative XRP or IOU amounts.
@@ -144,9 +166,13 @@ private void handleTransactionMetadata(final TransactionMetadata transactionMeta
144
166
} else if (ledgerEntryType .equals (MetaLedgerEntryType .RIPPLE_STATE )) {
145
167
handleMetaLedgerObject ((MetaRippleStateObject ) createdNode .newFields ());
146
168
} else if (ledgerEntryType .equals (MetaLedgerEntryType .DIRECTORY_NODE )) {
147
- logger .warn ("Ignoring ledger entry type {}" , ledgerEntryType );
169
+ logger .warn ("Ignoring CreatedNode ledger entry type {}" , ledgerEntryType );
170
+ } else if (ledgerEntryType .equals (MetaLedgerEntryType .NEGATIVE_UNL )) {
171
+ logger .warn (
172
+ "Ignoring DeletedNode ledger entry type {}. See https://github.com/XRPLF/xrpl4j/issues/16" ,
173
+ ledgerEntryType );
148
174
} else {
149
- throw new RuntimeException ("Unhandled ledger entry type: " + ledgerEntryType );
175
+ throw new RuntimeException ("Unhandled CreatedNode ledger entry type: " + ledgerEntryType );
150
176
}
151
177
},
152
178
(modifiedNode ) -> {
@@ -159,8 +185,19 @@ private void handleTransactionMetadata(final TransactionMetadata transactionMeta
159
185
handleMetaLedgerObject ((MetaAccountRootObject ) metaLedgerObject );
160
186
} else if (ledgerEntryType .equals (MetaLedgerEntryType .RIPPLE_STATE )) {
161
187
handleMetaLedgerObject ((MetaRippleStateObject ) metaLedgerObject );
188
+ } else if (ledgerEntryType .equals (MetaLedgerEntryType .DIRECTORY_NODE )) {
189
+ logger .warn ("Ignoring ModifiedNode ledger entry type {}" , ledgerEntryType );
190
+ } else if (ledgerEntryType .equals (MetaLedgerEntryType .NEGATIVE_UNL )) {
191
+ logger .warn (
192
+ "Ignoring DeletedNode ledger entry type {}. See https://github.com/XRPLF/xrpl4j/issues/16" ,
193
+ ledgerEntryType );
194
+ } else if (ledgerEntryType .equals (MetaLedgerEntryType .AMM )) {
195
+ logger .warn (
196
+ "Ignoring DeletedNode ledger entry type {}. See https://github.com/XRPLF/xrpl4j/issues/591" ,
197
+ ledgerEntryType );
162
198
} else {
163
- throw new RuntimeException ("Unhandled ledger entry type: " + ledgerEntryType );
199
+ throw new RuntimeException (
200
+ "Unhandled ModifiedNode PreviousFields ledger entry type: " + ledgerEntryType );
164
201
}
165
202
});
166
203
@@ -173,10 +210,15 @@ private void handleTransactionMetadata(final TransactionMetadata transactionMeta
173
210
handleMetaLedgerObject ((MetaAccountRootObject ) metaLedgerObject );
174
211
} else if (ledgerEntryType .equals (MetaLedgerEntryType .RIPPLE_STATE )) {
175
212
handleMetaLedgerObject ((MetaRippleStateObject ) metaLedgerObject );
176
- } else if (ledgerEntryType .equals (MetaLedgerEntryType .DIRECTORY_NODE )) {
177
- logger .warn ("Ignoring ledger entry type {}" , ledgerEntryType );
213
+ } else if (
214
+ ledgerEntryType .equals (MetaLedgerEntryType .DIRECTORY_NODE )) {
215
+ logger .warn ("Ignoring ModifiedNode ledger entry type {}" , ledgerEntryType );
216
+ } else if (ledgerEntryType .equals (MetaLedgerEntryType .AMM )) {
217
+ logger .warn (
218
+ "Ignoring ModifiedNode ledger entry type {}. See See https://github.com/XRPLF/xrpl4j/issues/591" ,
219
+ ledgerEntryType );
178
220
} else {
179
- throw new RuntimeException ("Unhandled ledger entry type: " + ledgerEntryType );
221
+ throw new RuntimeException ("Unhandled ModifiedNode FinalFields ledger entry type: " + ledgerEntryType );
180
222
}
181
223
});
182
224
},
@@ -191,7 +233,8 @@ private void handleTransactionMetadata(final TransactionMetadata transactionMeta
191
233
} else if (ledgerEntryType .equals (MetaLedgerEntryType .RIPPLE_STATE )) {
192
234
handleMetaLedgerObject ((MetaRippleStateObject ) metaLedgerObject );
193
235
} else {
194
- throw new RuntimeException ("Unhandled ledger entry type: " + ledgerEntryType );
236
+ throw new RuntimeException (
237
+ "Unhandled DeletedNode PreviousFields ledger entry type: " + ledgerEntryType );
195
238
}
196
239
});
197
240
@@ -204,14 +247,15 @@ private void handleTransactionMetadata(final TransactionMetadata transactionMeta
204
247
} else if (ledgerEntryType .equals (MetaLedgerEntryType .RIPPLE_STATE )) {
205
248
handleMetaLedgerObject ((MetaRippleStateObject ) finalFields );
206
249
} else if (ledgerEntryType .equals (MetaLedgerEntryType .TICKET )) {
207
- logger .info ("Ignoring ledger entry type {} because it has no currency values for negative checking" ,
208
- ledgerEntryType );
250
+ logger .info (
251
+ "Ignoring ledger entry type {} because it has no currency values for negative checking" , ledgerEntryType
252
+ );
209
253
} else if (ledgerEntryType .equals (MetaLedgerEntryType .DIRECTORY_NODE )) {
210
- logger .warn ("Ignoring ledger entry type {}" , ledgerEntryType );
254
+ logger .warn ("Ignoring DeletedNode ledger entry type {}" , ledgerEntryType );
211
255
} else if (ledgerEntryType .equals (MetaLedgerEntryType .NFTOKEN_OFFER )) {
212
256
handleMetaLedgerObject ((MetaNfTokenOfferObject ) finalFields );
213
257
} else {
214
- throw new RuntimeException ("Unhandled ledger entry type: " + ledgerEntryType );
258
+ throw new RuntimeException ("Unhandled DeletedNode FinalFields ledger entry type: " + ledgerEntryType );
215
259
}
216
260
}
217
261
);
@@ -292,4 +336,4 @@ private void handleMetaLedgerObject(MetaNfTokenOfferObject metaNfTokenOfferObjec
292
336
issuedCurrencyAmount .value ().startsWith ("-" ))
293
337
));
294
338
}
295
- }
339
+ }
0 commit comments