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