Skip to content

Commit fff7519

Browse files
committed
utxo_by_tx_id
1 parent afe78c3 commit fff7519

File tree

1 file changed

+63
-49
lines changed

1 file changed

+63
-49
lines changed

pycardano/backend/ogmios.py

Lines changed: 63 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -369,61 +369,75 @@ def _utxos_ogmios(self, address: str) -> List[UTxO]:
369369

370370
utxos = []
371371
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))
375373

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
390375

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.
396378
397-
datum = None
379+
Args:
380+
tx_id (str): The transaction id.
381+
index (int): The index for the UTxO at the specified transaction.
398382
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)
401387

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"])))
410407
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
427441

428442
def submit_tx(self, cbor: Union[bytes, str]):
429443
"""Submit a transaction to the blockchain.

0 commit comments

Comments
 (0)