@@ -7,32 +7,95 @@ pub(crate) struct TxBuilderInput {
77 pub ( crate ) amount : Value , // we need to keep track of the amount in the inputs for input selection
88}
99
10+ #[ derive( Clone , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
11+ pub enum PlutusScriptSourceEnum {
12+ Script ( PlutusScript ) ,
13+ RefInput ( TransactionInput , ScriptHash ) ,
14+ }
15+
16+ impl PlutusScriptSourceEnum {
17+ pub fn script_hash ( & self ) -> ScriptHash {
18+ match self {
19+ PlutusScriptSourceEnum :: Script ( script) => script. hash ( ) ,
20+ PlutusScriptSourceEnum :: RefInput ( _, script_hash) => script_hash. clone ( ) ,
21+ }
22+ }
23+ }
24+
1025#[ wasm_bindgen]
11- #[ derive(
12- Clone , Debug , Eq , Ord , PartialEq , PartialOrd , serde:: Serialize , serde:: Deserialize , JsonSchema ,
13- ) ]
26+ #[ derive( Clone , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
27+ pub struct PlutusScriptSource ( PlutusScriptSourceEnum ) ;
28+
29+ #[ wasm_bindgen]
30+ impl PlutusScriptSource {
31+ pub fn new ( script : & PlutusScript ) -> Self {
32+ Self ( PlutusScriptSourceEnum :: Script ( script. clone ( ) ) )
33+ }
34+
35+ pub fn new_ref_input ( script_hash : & ScriptHash , input : & TransactionInput ) -> Self {
36+ Self ( PlutusScriptSourceEnum :: RefInput ( input. clone ( ) , script_hash. clone ( ) ) )
37+ }
38+ }
39+
40+ #[ derive( Clone , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
41+ pub enum DatumSourceEnum {
42+ Datum ( PlutusData ) ,
43+ RefInput ( TransactionInput ) ,
44+ }
45+
46+ #[ wasm_bindgen]
47+ #[ derive( Clone , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
48+ pub struct DatumSource ( DatumSourceEnum ) ;
49+
50+ #[ wasm_bindgen]
51+ impl DatumSource {
52+ pub fn new ( datum : & PlutusData ) -> Self {
53+ Self ( DatumSourceEnum :: Datum ( datum. clone ( ) ) )
54+ }
55+
56+ pub fn new_ref_input ( input : & TransactionInput ) -> Self {
57+ Self ( DatumSourceEnum :: RefInput ( input. clone ( ) ) )
58+ }
59+ }
60+
61+ #[ wasm_bindgen]
62+ #[ derive( Clone , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
1463pub struct PlutusWitness {
15- script : PlutusScript ,
16- datum : PlutusData ,
64+ script : PlutusScriptSourceEnum ,
65+ datum : DatumSourceEnum ,
1766 redeemer : Redeemer ,
1867}
1968
2069#[ wasm_bindgen]
2170impl PlutusWitness {
2271 pub fn new ( script : & PlutusScript , datum : & PlutusData , redeemer : & Redeemer ) -> Self {
2372 Self {
24- script : script. clone ( ) ,
25- datum : datum. clone ( ) ,
73+ script : PlutusScriptSourceEnum :: Script ( script. clone ( ) ) ,
74+ datum : DatumSourceEnum :: Datum ( datum. clone ( ) ) ,
75+ redeemer : redeemer. clone ( ) ,
76+ }
77+ }
78+
79+ pub fn new_with_ref ( script : & PlutusScriptSource , datum : & DatumSource , redeemer : & Redeemer ) -> Self {
80+ Self {
81+ script : script. 0 . clone ( ) ,
82+ datum : datum. 0 . clone ( ) ,
2683 redeemer : redeemer. clone ( ) ,
2784 }
2885 }
2986
30- pub fn script ( & self ) -> PlutusScript {
31- self . script . clone ( )
87+ pub fn script ( & self ) -> Option < PlutusScript > {
88+ match & self . script {
89+ PlutusScriptSourceEnum :: Script ( script) => Some ( script. clone ( ) ) ,
90+ _ => None ,
91+ }
3292 }
3393
34- pub fn datum ( & self ) -> PlutusData {
35- self . datum . clone ( )
94+ pub fn datum ( & self ) -> Option < PlutusData > {
95+ match & self . datum {
96+ DatumSourceEnum :: Datum ( datum) => Some ( datum. clone ( ) ) ,
97+ _ => None ,
98+ }
3699 }
37100
38101 pub fn redeemer ( & self ) -> Redeemer {
@@ -49,9 +112,7 @@ impl PlutusWitness {
49112}
50113
51114#[ wasm_bindgen]
52- #[ derive(
53- Clone , Debug , Eq , Ord , PartialEq , PartialOrd , serde:: Serialize , serde:: Deserialize , JsonSchema ,
54- ) ]
115+ #[ derive( Clone , Debug , Eq , Ord , PartialEq , PartialOrd ) ]
55116pub struct PlutusWitnesses ( pub ( crate ) Vec < PlutusWitness > ) ;
56117
57118#[ wasm_bindgen]
@@ -77,8 +138,12 @@ impl PlutusWitnesses {
77138 let mut d = PlutusList :: new ( ) ;
78139 let mut r = Redeemers :: new ( ) ;
79140 self . 0 . iter ( ) . for_each ( |w| {
80- s. add ( & w. script ) ;
81- d. add ( & w. datum ) ;
141+ if let PlutusScriptSourceEnum :: Script ( script) = & w. script {
142+ s. add ( script) ;
143+ }
144+ if let DatumSourceEnum :: Datum ( datum) = & w. datum {
145+ d. add ( datum) ;
146+ }
82147 r. add ( & w. redeemer ) ;
83148 } ) ;
84149 ( s, d, r)
@@ -87,12 +152,7 @@ impl PlutusWitnesses {
87152
88153impl From < Vec < PlutusWitness > > for PlutusWitnesses {
89154 fn from ( scripts : Vec < PlutusWitness > ) -> Self {
90- scripts
91- . iter ( )
92- . fold ( PlutusWitnesses :: new ( ) , |mut scripts, s| {
93- scripts. add ( s) ;
94- scripts
95- } )
155+ Self ( scripts)
96156 }
97157}
98158
@@ -200,7 +260,8 @@ impl TxInputsBuilder {
200260 input : & TransactionInput ,
201261 amount : & Value ,
202262 ) {
203- let hash = witness. script . hash ( ) ;
263+ let hash = witness. script . script_hash ( ) ;
264+
204265 self . add_script_input ( & hash, input, amount) ;
205266 self . input_types . scripts . insert (
206267 hash,
@@ -306,7 +367,7 @@ impl TxInputsBuilder {
306367 /// Use `.count_missing_input_scripts` to find the number of still missing scripts
307368 pub fn add_required_plutus_input_scripts ( & mut self , scripts : & PlutusWitnesses ) -> usize {
308369 scripts. 0 . iter ( ) . for_each ( |s : & PlutusWitness | {
309- let hash = s. script . hash ( ) ;
370+ let hash = s. script . script_hash ( ) ;
310371 if self . input_types . scripts . contains_key ( & hash) {
311372 self . input_types . scripts . insert (
312373 hash,
@@ -317,6 +378,23 @@ impl TxInputsBuilder {
317378 self . count_missing_input_scripts ( )
318379 }
319380
381+ pub fn get_ref_inputs ( & self ) -> TransactionInputs {
382+ let mut inputs = Vec :: new ( ) ;
383+ for wintess in self . input_types . scripts . iter ( )
384+ . filter_map ( |( _, wit) | wit. as_ref ( ) ) {
385+ if let ScriptWitnessType :: PlutusScriptWitness ( plutus_witness) = wintess {
386+ if let DatumSourceEnum :: RefInput ( input) = & plutus_witness. datum {
387+ inputs. push ( input. clone ( ) ) ;
388+ }
389+ if let PlutusScriptSourceEnum :: RefInput ( input, _) = & plutus_witness. script {
390+ inputs. push ( input. clone ( ) ) ;
391+ }
392+ }
393+ }
394+
395+ TransactionInputs ( inputs)
396+ }
397+
320398 /// Returns a copy of the current script input witness scripts in the builder
321399 pub fn get_native_input_scripts ( & self ) -> Option < NativeScripts > {
322400 let mut scripts = NativeScripts :: new ( ) ;
0 commit comments