Skip to content

Commit 45cf0a3

Browse files
committed
Refactor tx builder to a dataclass
1 parent ffb1d44 commit 45cf0a3

File tree

1 file changed

+45
-32
lines changed

1 file changed

+45
-32
lines changed

pycardano/txbuilder.py

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
from copy import deepcopy
4+
from dataclasses import dataclass, field
45
from typing import Dict, List, Optional, Set, Union
56

67
from pycardano.address import Address
@@ -58,6 +59,7 @@
5859
)
5960

6061

62+
@dataclass
6163
class TransactionBuilder:
6264
"""A class builder that makes it easy to build a transaction.
6365
@@ -66,32 +68,45 @@ class TransactionBuilder:
6668
utxo_selectors (Optional[List[UTxOSelector]]): A list of UTxOSelectors that will select input UTxOs.
6769
"""
6870

69-
def __init__(
70-
self, context: ChainContext, utxo_selectors: Optional[List[UTxOSelector]] = None
71-
):
72-
self.context = context
73-
self._inputs = []
74-
self._excluded_inputs = []
75-
self._input_addresses = []
76-
self._outputs = []
77-
self._fee = 0
78-
self._ttl = None
79-
self._validity_start = None
80-
self._auxiliary_data = None
81-
self._native_scripts = None
82-
self._mint = None
83-
self._required_signers = None
84-
self._scripts = {}
85-
self._datums = {}
86-
self._redeemers = []
87-
self._inputs_to_redeemers = {}
88-
self._inputs_to_scripts = {}
89-
self._collaterals = []
90-
91-
if utxo_selectors:
92-
self.utxo_selectors = utxo_selectors
93-
else:
94-
self.utxo_selectors = [RandomImproveMultiAsset(), LargestFirstSelector()]
71+
context: ChainContext
72+
73+
utxo_selectors: List[UTxOSelector] = field(
74+
default_factory=lambda: [RandomImproveMultiAsset(), LargestFirstSelector()]
75+
)
76+
77+
_inputs: List[UTxO] = field(init=False, default_factory=lambda: [])
78+
79+
_excluded_inputs: List[UTxO] = field(init=False, default_factory=lambda: [])
80+
81+
_input_addresses: List[Address] = field(init=False, default_factory=lambda: [])
82+
83+
_outputs: List[TransactionOutput] = field(init=False, default_factory=lambda: [])
84+
85+
_fee: int = field(init=False, default=0)
86+
87+
_ttl: int = field(init=False, default=None)
88+
89+
_validity_start: int = field(init=False, default=None)
90+
91+
_auxiliary_data: AuxiliaryData = field(init=False, default=None)
92+
93+
_native_scripts: List[NativeScript] = field(init=False, default=None)
94+
95+
_mint: MultiAsset = field(init=False, default=None)
96+
97+
_required_signers: List[VerificationKeyHash] = field(init=False, default=None)
98+
99+
_datums: Dict[DatumHash, Datum] = field(init=False, default_factory=lambda: {})
100+
101+
_inputs_to_redeemers: Dict[UTxO, Redeemer] = field(
102+
init=False, default_factory=lambda: {}
103+
)
104+
105+
_inputs_to_scripts: Dict[UTxO, bytes] = field(
106+
init=False, default_factory=lambda: {}
107+
)
108+
109+
_collaterals: List[UTxO] = field(init=False, default_factory=lambda: [])
95110

96111
def add_input(self, utxo: UTxO) -> TransactionBuilder:
97112
"""Add a specific UTxO to transaction's inputs.
@@ -129,9 +144,7 @@ def add_script_input(
129144
f"Datum hash in transaction output is {utxo.output.datum_hash}, "
130145
f"but actual datum hash from input datum is {datum.hash()}."
131146
)
132-
self.scripts[plutus_script_hash(script)] = script
133147
self.datums[datum.hash()] = datum
134-
self.redeemers.append(redeemer)
135148
self._inputs_to_redeemers[utxo] = redeemer
136149
self._inputs_to_scripts[utxo] = script
137150
self.inputs.append(utxo)
@@ -252,16 +265,16 @@ def required_signers(self, signers: List[VerificationKeyHash]):
252265
self._required_signers = signers
253266

254267
@property
255-
def scripts(self) -> Dict[ScriptHash, bytes]:
256-
return self._scripts
268+
def scripts(self) -> List[bytes]:
269+
return list(set(self._inputs_to_scripts.values()))
257270

258271
@property
259272
def datums(self) -> Dict[DatumHash, Datum]:
260273
return self._datums
261274

262275
@property
263276
def redeemers(self) -> List[Redeemer]:
264-
return self._redeemers
277+
return list(self._inputs_to_redeemers.values())
265278

266279
@property
267280
def collaterals(self) -> List[UTxO]:
@@ -579,7 +592,7 @@ def build_witness_set(self) -> TransactionWitnessSet:
579592
"""
580593
return TransactionWitnessSet(
581594
native_scripts=self.native_scripts,
582-
plutus_script=list(self.scripts.values()) if self.scripts else None,
595+
plutus_script=self.scripts if self.scripts else None,
583596
redeemer=self.redeemers if self.redeemers else None,
584597
plutus_data=list(self.datums.values()) if self.datums else None,
585598
)

0 commit comments

Comments
 (0)