@@ -18,9 +18,9 @@ import Cardano.Api.Shelley (ProtocolParameters, ReferenceScript(..))
18
18
type WalletRef = MVar Wallet
19
19
20
20
type TxGenerator era = [Fund ] -> [TxOut CtxTx era ] -> Either String (Tx era , TxId )
21
- -- Todo: ToUTxO implicitly assumes that all outputs are of the same type (Plutus. normal, collateral).
22
- -- This is too special
23
- type ToUTxO era = [ Lovelace ] -> ([ TxOut CtxTx era ], TxId -> [ Fund ] )
21
+ type ToUTxOList era = [ Lovelace ] -> ([ TxOut CtxTx era ], TxId -> [ Fund ])
22
+
23
+ type ToUTxO era = Lovelace -> (TxOut CtxTx era , TxIx -> TxId -> Fund )
24
24
25
25
data Wallet = Wallet {
26
26
walletSeqNumber :: ! SeqNumber
@@ -80,7 +80,7 @@ sourceToStoreTransaction ::
80
80
TxGenerator era
81
81
-> FundSource
82
82
-> ([Lovelace ] -> [Lovelace ])
83
- -> ToUTxO era
83
+ -> ToUTxOList era
84
84
-> FundToStore
85
85
-> IO (Either String (Tx era ))
86
86
sourceToStoreTransaction txGenerator fundSource inToOut mkTxOut fundToStore = do
@@ -105,30 +105,46 @@ includeChange fee spend have = case compare changeValue 0 of
105
105
LT -> error " genTX: Bad transaction: insufficient funds"
106
106
where changeValue = sum have - sum spend - fee
107
107
108
- mkUTxO :: forall era . IsShelleyBasedEra era
108
+ mkUTxOList :: forall era . IsShelleyBasedEra era
109
109
=> NetworkId
110
110
-> SigningKey PaymentKey
111
111
-> Validity
112
- -> ToUTxO era
113
- mkUTxO = mkUTxOVariant PlainOldFund
112
+ -> ToUTxOList era
113
+ mkUTxOList = mkUTxOVariantList PlainOldFund
114
+
115
+ mkUTxOVariantList :: forall era . IsShelleyBasedEra era
116
+ => Variant
117
+ -> NetworkId
118
+ -> SigningKey PaymentKey
119
+ -> Validity
120
+ -> ToUTxOList era
121
+ mkUTxOVariantList variant networkId key validity
122
+ = mapToUTxO $ repeat $ mkUTxOVariant variant networkId key validity
123
+
124
+ mapToUTxO :: [ ToUTxO era ]-> ToUTxOList era
125
+ mapToUTxO fkts values
126
+ = (outs, \ txId -> map (\ f -> f txId) fs)
127
+ where
128
+ (outs, fs) = unzip $ map worker $ zip3 fkts values [TxIx 0 .. ]
129
+ worker (toUTxO, value, idx)
130
+ = let (o, f ) = toUTxO value
131
+ in (o, f idx)
114
132
115
133
mkUTxOVariant :: forall era . IsShelleyBasedEra era
116
134
=> Variant
117
135
-> NetworkId
118
136
-> SigningKey PaymentKey
119
137
-> Validity
120
138
-> ToUTxO era
121
- mkUTxOVariant variant networkId key validity values
122
- = ( map mkTxOut values
123
- , newFunds
139
+ mkUTxOVariant variant networkId key validity value
140
+ = ( mkTxOut value
141
+ , mkNewFund value
124
142
)
125
143
where
126
144
mkTxOut v = TxOut (keyAddress @ era networkId key) (lovelaceToTxOutValue v) TxOutDatumNone ReferenceScriptNone
127
145
128
- newFunds txId = zipWith (mkNewFund txId) [TxIx 0 .. ] values
129
-
130
- mkNewFund :: TxId -> TxIx -> Lovelace -> Fund
131
- mkNewFund txId txIx val = Fund $ InAnyCardanoEra (cardanoEra @ era) $ FundInEra {
146
+ mkNewFund :: Lovelace -> TxIx -> TxId -> Fund
147
+ mkNewFund val txIx txId = Fund $ InAnyCardanoEra (cardanoEra @ era) $ FundInEra {
132
148
_fundTxIn = TxIn txId txIx
133
149
, _fundVal = lovelaceToTxOutValue val
134
150
, _fundSigningKey = Just key
@@ -196,7 +212,7 @@ benchmarkWalletScript :: forall era .
196
212
-> NumberOfTxs
197
213
-> (Target -> FundSource )
198
214
-> ([Lovelace ] -> [Lovelace ])
199
- -> (Target -> SeqNumber -> ToUTxO era )
215
+ -> (Target -> SeqNumber -> ToUTxOList era )
200
216
-> FundToStore
201
217
-> Target
202
218
-> WalletScript era
0 commit comments