40
40
"Datum" ,
41
41
"RedeemerTag" ,
42
42
"ExecutionUnits" ,
43
+ "PlutusScript" ,
43
44
"PlutusV1Script" ,
44
45
"PlutusV2Script" ,
45
46
"PlutusV3Script" ,
@@ -1049,33 +1050,66 @@ class RedeemerMap(DictCBORSerializable):
1049
1050
Redeemers = Union [List [Redeemer ], RedeemerMap ]
1050
1051
1051
1052
1052
- def plutus_script_hash (
1053
- script : Union [bytes , PlutusV1Script , PlutusV2Script ]
1054
- ) -> ScriptHash :
1053
+ def plutus_script_hash (script : Union [NativeScript , PlutusScript ]) -> ScriptHash :
1055
1054
"""Calculates the hash of a Plutus script.
1056
1055
1057
1056
Args:
1058
- script (Union[bytes, PlutusV1Script, PlutusV2Script ]): A plutus script.
1057
+ script (Union[bytes, PlutusScript ]): A plutus script.
1059
1058
1060
1059
Returns:
1061
1060
ScriptHash: blake2b hash of the script.
1062
1061
"""
1063
1062
return script_hash (script )
1064
1063
1065
1064
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
1068
1092
1069
1093
1070
- class PlutusV2Script (bytes ):
1071
- pass
1094
+ class PlutusV2Script (PlutusScript ):
1095
+ def get_script_hash_prefix (self ) -> bytes :
1096
+ return bytes .fromhex ("02" )
1072
1097
1098
+ @property
1099
+ def version (self ) -> int :
1100
+ return 2
1073
1101
1074
- class PlutusV3Script (bytes ):
1075
- pass
1076
1102
1103
+ class PlutusV3Script (PlutusScript ):
1104
+ def get_script_hash_prefix (self ) -> bytes :
1105
+ return bytes .fromhex ("03" )
1077
1106
1078
- ScriptType = Union [bytes , NativeScript , PlutusV1Script , PlutusV2Script ]
1107
+ @property
1108
+ def version (self ) -> int :
1109
+ return 3
1110
+
1111
+
1112
+ ScriptType = Union [NativeScript , PlutusScript ]
1079
1113
"""Script type. A Union type that contains all valid script types."""
1080
1114
1081
1115
@@ -1090,17 +1124,17 @@ def script_hash(script: ScriptType) -> ScriptHash:
1090
1124
"""
1091
1125
if isinstance (script , NativeScript ):
1092
1126
return script .hash ()
1093
- elif isinstance (script , PlutusV1Script ) or type ( script ) is bytes :
1127
+ elif isinstance (script , PlutusScript ) :
1094
1128
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
+ )
1100
1134
)
1101
- elif isinstance (script , PlutusV3Script ) :
1135
+ elif type (script ) is bytes :
1102
1136
return ScriptHash (
1103
- blake2b (bytes .fromhex ("03 " ) + script , SCRIPT_HASH_SIZE , encoder = RawEncoder )
1137
+ blake2b (bytes .fromhex ("01 " ) + script , SCRIPT_HASH_SIZE , encoder = RawEncoder )
1104
1138
)
1105
1139
else :
1106
1140
raise TypeError (f"Unexpected script type: { type (script )} " )
0 commit comments