@@ -369,61 +369,75 @@ def _utxos_ogmios(self, address: str) -> List[UTxO]:
369
369
370
370
utxos = []
371
371
for result in results :
372
- in_ref = result [0 ]
373
- output = result [1 ]
374
- tx_in = TransactionInput .from_primitive ([in_ref ["txId" ], in_ref ["index" ]])
372
+ utxos .append (self ._utxo_from_ogmios_result (result ))
375
373
376
- lovelace_amount = output ["value" ]["coins" ]
377
-
378
- script = output .get ("script" , None )
379
- if script :
380
- if "plutus:v2" in script :
381
- script = PlutusV2Script (
382
- cbor2 .loads (bytes .fromhex (script ["plutus:v2" ]))
383
- )
384
- elif "plutus:v1" in script :
385
- script = PlutusV1Script (
386
- cbor2 .loads (bytes .fromhex (script ["plutus:v1" ]))
387
- )
388
- else :
389
- raise ValueError ("Unknown plutus script type" )
374
+ return utxos
390
375
391
- datum_hash = (
392
- DatumHash .from_primitive (output ["datumHash" ])
393
- if output .get ("datumHash" , None )
394
- else None
395
- )
376
+ def utxo_by_tx_id (self , tx_id : str , index : int ) -> Optional [UTxO ]:
377
+ """Get a UTxO associated with a tx_id and index.
396
378
397
- datum = None
379
+ Args:
380
+ tx_id (str): The transaction id.
381
+ index (int): The index for the UTxO at the specified transaction.
398
382
399
- if output ["datum" ] and output ["datum" ] != output ["datumHash" ]:
400
- datum = RawCBOR (bytes .fromhex (output ["datum" ]))
383
+ Returns:
384
+ Optional[UTxO]: Return a UTxO if exists at the tx_id and index.
385
+ """
386
+ results = self ._query_utxos_by_tx_id (tx_id , index )
401
387
402
- if not output ["value" ]["assets" ]:
403
- tx_out = TransactionOutput (
404
- Address .from_primitive (address ),
405
- amount = lovelace_amount ,
406
- datum_hash = datum_hash ,
407
- datum = datum ,
408
- script = script ,
409
- )
388
+ utxos = []
389
+ for result in results :
390
+ utxos .append (self ._utxo_from_ogmios_result (result ))
391
+
392
+ if len (utxos ) > 0 :
393
+ return utxos [0 ]
394
+ return None
395
+
396
+ def _utxo_from_ogmios_result (self , result ) -> UTxO :
397
+ in_ref = result [0 ]
398
+ output = result [1 ]
399
+ tx_in = TransactionInput .from_primitive ([in_ref ["txId" ], in_ref ["index" ]])
400
+ lovelace_amount = output ["value" ]["coins" ]
401
+ script = output .get ("script" , None )
402
+ if script :
403
+ if "plutus:v2" in script :
404
+ script = PlutusV2Script (cbor2 .loads (bytes .fromhex (script ["plutus:v2" ])))
405
+ elif "plutus:v1" in script :
406
+ script = PlutusV1Script (cbor2 .loads (bytes .fromhex (script ["plutus:v1" ])))
410
407
else :
411
- multi_assets = MultiAsset ()
412
-
413
- for asset , quantity in output ["value" ]["assets" ].items ():
414
- policy_hex , policy , asset_name_hex = self ._extract_asset_info (asset )
415
- multi_assets .setdefault (policy , Asset ())[asset_name_hex ] = quantity
416
-
417
- tx_out = TransactionOutput (
418
- Address .from_primitive (address ),
419
- amount = Value (lovelace_amount , multi_assets ),
420
- datum_hash = datum_hash ,
421
- datum = datum ,
422
- script = script ,
423
- )
424
- utxos .append (UTxO (tx_in , tx_out ))
425
-
426
- return utxos
408
+ raise ValueError ("Unknown plutus script type" )
409
+ datum_hash = (
410
+ DatumHash .from_primitive (output ["datumHash" ])
411
+ if output .get ("datumHash" , None )
412
+ else None
413
+ )
414
+ datum = None
415
+ if output ["datum" ] and output ["datum" ] != output ["datumHash" ]:
416
+ datum = RawCBOR (bytes .fromhex (output ["datum" ]))
417
+ if not output ["value" ]["assets" ]:
418
+ tx_out = TransactionOutput (
419
+ Address .from_primitive (output ["address" ]),
420
+ amount = lovelace_amount ,
421
+ datum_hash = datum_hash ,
422
+ datum = datum ,
423
+ script = script ,
424
+ )
425
+ else :
426
+ multi_assets = MultiAsset ()
427
+
428
+ for asset , quantity in output ["value" ]["assets" ].items ():
429
+ policy_hex , policy , asset_name_hex = self ._extract_asset_info (asset )
430
+ multi_assets .setdefault (policy , Asset ())[asset_name_hex ] = quantity
431
+
432
+ tx_out = TransactionOutput (
433
+ Address .from_primitive (output ["address" ]),
434
+ amount = Value (lovelace_amount , multi_assets ),
435
+ datum_hash = datum_hash ,
436
+ datum = datum ,
437
+ script = script ,
438
+ )
439
+ utxo = UTxO (tx_in , tx_out )
440
+ return utxo
427
441
428
442
def submit_tx (self , cbor : Union [bytes , str ]):
429
443
"""Submit a transaction to the blockchain.
0 commit comments