From 814a4b6040f1edf5652f855166608c54a420a89a Mon Sep 17 00:00:00 2001 From: Franco Testagrossa Date: Tue, 30 May 2023 15:28:56 +0200 Subject: [PATCH] Fix script tx to be spent on L1 - Add missing collateral - Add missing witness during signing Note: By introducing the collateral utxo, now the key has more than one. This causes the resulting utxo from queryUTxOFor contained two entries: one for the normal utxo and another one for the collateral utxo. This was making createScriptOutput to build an invalid script tx in case the collateral utxo was selected, when finding a utxo that fits the total amount to deposit. Finally, removed debug lines --- hydra-cluster/src/Hydra/Cluster/Scenarios.hs | 39 ++++++++++---------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/hydra-cluster/src/Hydra/Cluster/Scenarios.hs b/hydra-cluster/src/Hydra/Cluster/Scenarios.hs index 542689d8942..a60329df31d 100644 --- a/hydra-cluster/src/Hydra/Cluster/Scenarios.hs +++ b/hydra-cluster/src/Hydra/Cluster/Scenarios.hs @@ -15,7 +15,6 @@ import CardanoClient ( queryProtocolParameters, querySystemStart, queryTip, - queryUTxOFor, submitTransaction, ) import CardanoNode (RunningNode (..)) @@ -27,13 +26,13 @@ import qualified Data.List as List import qualified Data.Set as Set import Hydra.API.RestServer (DraftCommitTxRequest (..), DraftCommitTxResponse (..)) import Hydra.Cardano.Api ( - mkTxOutDatumHash, AddressInEra, BuildTxWith (BuildTxWith), Key (SigningKey, getVerificationKey), - Lovelace, + Lovelace (..), PaymentKey, PlutusScriptV2, + ProtocolParameters, ScriptDatum (ScriptDatumForTxIn), ScriptWitnessInCtx (ScriptWitnessForSpending), ShelleyWitnessSigningKey (WitnessPaymentKey), @@ -50,6 +49,7 @@ import Hydra.Cardano.Api ( mkScriptAddress, mkScriptWitness, mkTxOutAutoBalance, + mkTxOutDatumHash, mkVkAddress, selectLovelace, setTxInsCollateral, @@ -62,7 +62,7 @@ import Hydra.Cardano.Api ( txOutValue, pattern ReferenceScriptNone, pattern ScriptWitness, - pattern TxInsCollateral, createAndValidateTransactionBody, ProtocolParameters, + pattern TxInsCollateral, ) import Hydra.Chain (HeadId) import Hydra.Chain.Direct.Wallet (signWith) @@ -90,9 +90,9 @@ import Network.HTTP.Req ( runReq, (/:), ) +import qualified PlutusLedgerApi.Test.Examples as Plutus import Test.Hspec.Expectations (shouldBe) import Test.QuickCheck (generate) -import qualified PlutusLedgerApi.Test.Examples as Plutus restartedNodeCanObserveCommitTx :: Tracer IO EndToEndLog -> FilePath -> RunningNode -> TxId -> IO () restartedNodeCanObserveCommitTx tracer workDir cardanoNode hydraScriptsTxId = do @@ -272,33 +272,31 @@ singlePartyCommitsFromExternalScript tracer workDir node hydraScriptsTxId = (someVk, someSk) <- generate genKeyPair pparams <- queryProtocolParameters networkId nodeSocket QueryTip normalUTxO <- seedFromFaucet node someVk 10_000_000 Normal (contramap FromFaucet tracer) - scriptUtxo <- createScriptOutput pparams scriptAddress someSk + scriptUtxo <- createScriptOutput pparams scriptAddress someSk normalUTxO + colateralUTxO <- seedFromFaucet node someVk 20_000_000 Normal (contramap FromFaucet tracer) let redeemer = toScriptData () datum = ScriptDatumForTxIn $ toScriptData () let scriptTxIn = List.head $ fst <$> UTxO.pairs scriptUtxo + collateralTxIns = fst <$> UTxO.pairs colateralUTxO scriptWitness = BuildTxWith $ ScriptWitness ScriptWitnessForSpending $ mkScriptWitness script datum redeemer - + -- TODO: temporary sanity check: Spend the script on L1 let body = defaultTxBodyContent & addTxIn (scriptTxIn, scriptWitness) - & setTxInsCollateral (TxInsCollateral mempty) + & setTxInsCollateral (TxInsCollateral collateralTxIns) & setTxProtocolParams (BuildTxWith $ Just pparams) systemStart <- querySystemStart networkId nodeSocket QueryTip epochInfo <- toLedgerEpochInfo <$> queryEraHistory networkId nodeSocket QueryTip - let changeAddress = mkVkAddress networkId someVk - - -- DEBUG - let validatedTx = createAndValidateTransactionBody body - print validatedTx - let balancedBody = + let changeAddress = mkVkAddress networkId someVk + balancedBody = makeTransactionBodyAutoBalance systemStart epochInfo @@ -311,7 +309,7 @@ singlePartyCommitsFromExternalScript tracer workDir node hydraScriptsTxId = & \case Left e -> error (show e) Right res -> balancedTxBody res - let spendScriptTx = signShelleyTransaction balancedBody [] + let spendScriptTx = signShelleyTransaction balancedBody [WitnessPaymentKey someSk] submitTransaction networkId nodeSocket spendScriptTx -- -- Request to build a draft commit tx from hydra-node @@ -345,9 +343,9 @@ singlePartyCommitsFromExternalScript tracer workDir node hydraScriptsTxId = ProtocolParameters -> AddressInEra -> SigningKey PaymentKey -> + UTxO -> IO UTxO - createScriptOutput pparams scriptAddress sk = do - utxo <- queryUTxOFor networkId nodeSocket QueryTip vk + createScriptOutput pparams scriptAddress sk utxo = do let outputs = [scriptTxOut] totalDeposit = sum (selectLovelace . txOutValue <$> outputs) someUTxO = @@ -358,7 +356,7 @@ singlePartyCommitsFromExternalScript tracer workDir node hydraScriptsTxId = nodeSocket changeAddress someUTxO - [] + collateralTxIns outputs >>= \case Left e -> @@ -367,8 +365,11 @@ singlePartyCommitsFromExternalScript tracer workDir node hydraScriptsTxId = let tx = makeSignedTransaction [makeShelleyKeyWitness body (WitnessPaymentKey sk)] body submitTransaction networkId nodeSocket tx newUtxo <- awaitTransaction networkId nodeSocket tx - pure $ UTxO.filter (\out -> txOutAddress out == scriptAddress) newUtxo + let scriptUtxo = UTxO.filter (\out -> txOutAddress out == scriptAddress) newUtxo + pure scriptUtxo where + collateralTxIns = mempty + vk = getVerificationKey sk changeAddress = mkVkAddress networkId vk