4040 "Datum" ,
4141 "RedeemerTag" ,
4242 "ExecutionUnits" ,
43+ "PlutusScript" ,
4344 "PlutusV1Script" ,
4445 "PlutusV2Script" ,
4546 "PlutusV3Script" ,
@@ -1049,33 +1050,66 @@ class RedeemerMap(DictCBORSerializable):
10491050Redeemers = Union [List [Redeemer ], RedeemerMap ]
10501051
10511052
1052- def plutus_script_hash (
1053- script : Union [bytes , PlutusV1Script , PlutusV2Script ]
1054- ) -> ScriptHash :
1053+ def plutus_script_hash (script : Union [NativeScript , PlutusScript ]) -> ScriptHash :
10551054 """Calculates the hash of a Plutus script.
10561055
10571056 Args:
1058- script (Union[bytes, PlutusV1Script, PlutusV2Script ]): A plutus script.
1057+ script (Union[bytes, PlutusScript ]): A plutus script.
10591058
10601059 Returns:
10611060 ScriptHash: blake2b hash of the script.
10621061 """
10631062 return script_hash (script )
10641063
10651064
1066- class PlutusV1Script (bytes ):
1067- pass
1065+ class PlutusScript (bytes ):
1066+ @property
1067+ def version (self ) -> int :
1068+ raise NotImplementedError ("" )
1069+
1070+ @classmethod
1071+ def from_version (cls , version : int , script_data : bytes ) -> "PlutusScript" :
1072+ if version == 1 :
1073+ return PlutusV1Script (script_data )
1074+ elif version == 2 :
1075+ return PlutusV2Script (script_data )
1076+ elif version == 3 :
1077+ return PlutusV3Script (script_data )
1078+ else :
1079+ raise ValueError (f"No Plutus script class found for version { version } " )
1080+
1081+ def get_script_hash_prefix (self ) -> bytes :
1082+ raise NotImplementedError ("" )
1083+
1084+
1085+ class PlutusV1Script (PlutusScript ):
1086+ def get_script_hash_prefix (self ) -> bytes :
1087+ return bytes .fromhex ("01" )
1088+
1089+ @property
1090+ def version (self ) -> int :
1091+ return 1
10681092
10691093
1070- class PlutusV2Script (bytes ):
1071- pass
1094+ class PlutusV2Script (PlutusScript ):
1095+ def get_script_hash_prefix (self ) -> bytes :
1096+ return bytes .fromhex ("02" )
10721097
1098+ @property
1099+ def version (self ) -> int :
1100+ return 2
10731101
1074- class PlutusV3Script (bytes ):
1075- pass
10761102
1103+ class PlutusV3Script (PlutusScript ):
1104+ def get_script_hash_prefix (self ) -> bytes :
1105+ return bytes .fromhex ("03" )
10771106
1078- ScriptType = Union [bytes , NativeScript , PlutusV1Script , PlutusV2Script ]
1107+ @property
1108+ def version (self ) -> int :
1109+ return 3
1110+
1111+
1112+ ScriptType = Union [NativeScript , PlutusScript ]
10791113"""Script type. A Union type that contains all valid script types."""
10801114
10811115
@@ -1090,17 +1124,17 @@ def script_hash(script: ScriptType) -> ScriptHash:
10901124 """
10911125 if isinstance (script , NativeScript ):
10921126 return script .hash ()
1093- elif isinstance (script , PlutusV1Script ) or type ( script ) is bytes :
1127+ elif isinstance (script , PlutusScript ) :
10941128 return ScriptHash (
1095- blake2b (bytes . fromhex ( "01" ) + script , SCRIPT_HASH_SIZE , encoder = RawEncoder )
1096- )
1097- elif isinstance ( script , PlutusV2Script ):
1098- return ScriptHash (
1099- blake2b ( bytes . fromhex ( "02" ) + script , SCRIPT_HASH_SIZE , encoder = RawEncoder )
1129+ blake2b (
1130+ script . get_script_hash_prefix () + script ,
1131+ SCRIPT_HASH_SIZE ,
1132+ encoder = RawEncoder ,
1133+ )
11001134 )
1101- elif isinstance (script , PlutusV3Script ) :
1135+ elif type (script ) is bytes :
11021136 return ScriptHash (
1103- blake2b (bytes .fromhex ("03 " ) + script , SCRIPT_HASH_SIZE , encoder = RawEncoder )
1137+ blake2b (bytes .fromhex ("01 " ) + script , SCRIPT_HASH_SIZE , encoder = RawEncoder )
11041138 )
11051139 else :
11061140 raise TypeError (f"Unexpected script type: { type (script )} " )
0 commit comments