cardano-foundation / cardano-foundation/cardano-rosetta-java
/construct/parse should fail more gracefully
- Dominant language
- Java
- Stars
- 26
- Forks
- 15
- Avg merge
- 5d 3h
- Merged PRs (30d)
- 2
Description
We should likely return a more descriptive information when failing to parse, right now when a broken transaction such that what is in the serialized transaction does not match with what are the operations is passed to Rosetta Java /construct/parse it will fail but with a http 500 and not very descriptive error.
```
2025-04-02T09:06:58.756Z INFO 1 --- [nio-8082-exec-8] o.c.r.common.util.ParseConstructionUtil : [parseCertsToOperations] About to parse 1 certs
2025-04-02T09:06:58.758Z ERROR 1 --- [nio-8082-exec-8] o.c.r.c.e.GlobalExceptionHandler : An error occurred during the request
java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at java.base/java.util.ImmutableCollections$ListN.get(ImmutableCollections.java:687) ~[na:na]
at org.cardanofoundation.rosetta.common.util.ParseConstructionUtil.parseCertsToOperations(ParseConstructionUtil.java:240) ~[!/:na]
at org.cardanofoundation.rosetta.api.construction.service.OperationService.fillCertOperations(OperationService.java:121) ~[!/:na]
at org.cardanofoundation.rosetta.api.construction.service.OperationService.getOperationsFromTransactionData(OperationService.java:52) ~[!/:na]
at org.cardanofoundation.rosetta.api.construction.service.CardanoConstructionServiceImpl.parseTransaction(CardanoConstructionServiceImpl.java:91) ~[!/:na]
at org.cardanofoundation.rosetta.api.construction.service.ConstructionApiServiceImpl.constructionParseService(ConstructionApiServiceImpl.java:285) ~[!/:na]
at org.cardanofoundation.rosetta.api.construction.controller.ConstructionApiImplementation.constructionParse(ConstructionApiImplementation.java:63) ~[!/:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
```
we observed this error based on wrong input:
```
{
"network_identifier": {
"blockchain": "cardano",
"network": "preprod"
},
"signed": false,
"transaction": "82790180613530306439303130323831383235383230663030376335373637626466623664393530666662646436613937353536356135313630303237343936346562363237303238653638656664356265623238363036303138313832353833393030643664626661383766313035346461396434376436313262383236333465666634343837316333373135353463386536373332643533663436626330666237626633666236333231336462383136353561333364386334613763316337653462643735666333336666313736373834623161303031343366323730323161303030326134333930333161303533313930386530346439303130323831383330393832303035383163366263306662376266336662363332313364623831363535613333643863346137633163376534626437356663333366663137363738346238323030353831633033636361653739346166666265323761356635663734646136323636303032646231316461613661653434366165613738336239373264a16a6f7065726174696f6e7381a7746f7065726174696f6e5f6964656e746966696572a165696e64657800676163636f756e74a16761646472657373786c616464725f7465737431717274646837353837797a356d3277353034736a68716e72666d6c356670637578753234666a387877766b34386172746372616868756c6d7676736e6d77716b326b336e6d727a3230737738756a3768746c706e6c75746b307039736a666e64336e66616d6f756e74a26863757272656e6379a26673796d626f6c6341444168646563696d616c73066576616c7565682d313530303030306b636f696e5f6368616e6765a26f636f696e5f6964656e746966696572a16a6964656e7469666965727842663030376335373637626466623664393530666662646436613937353536356135313630303237343936346562363237303238653638656664356265623238363a366b636f696e5f616374696f6e6a636f696e5f7370656e74686d65746164617461a06673746174757360647479706565696e707574"
}
```
revelant code to look at:
```
public static List parseCertsToOperations(
TransactionBody transactionBody,
List certOps,
Network network)
throws CborException, CborSerializationException {
List parsedOperations = new ArrayList<>();
List certs = transactionBody.getCerts();
int certsCount = getCertSize(certs);
log.info("[parseCertsToOperations] About to parse {} certs", certsCount);
if (certOps.size() != certsCount) {
log.error("[parseCertsToOperations] Certs count mismatch, this doesn't bode well");
//throw ExceptionFactory.certCountMismatchError();
}
```
we can't fix this issue without knowing what is the outcome of #380 investigation since in some cases the mismatch between certs and operations is expected perhaps.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.