Skip to content

Commit

Permalink
Add collateral balancing test case
Browse files Browse the repository at this point in the history
  • Loading branch information
carbolymer committed Sep 10, 2024
1 parent e7e0ed0 commit e9573ac
Showing 1 changed file with 152 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -178,35 +178,155 @@ prop_make_transaction_body_autobalance_return_correct_fee_for_multi_asset = H.pr
H.note_ "There are differences between fees for two autobalanced TxBodyContents. Diff:"
H.diff balancedContentWithTxoutAsset (\_ _ -> feeWithTxoutAsset == fee) balancedContent
feeWithTxoutAsset === fee
where
loadPlutusWitness
:: HasCallStack
=> MonadFail m
=> MonadIO m
=> MonadTest m
=> m (ScriptWitness WitCtxMint ConwayEra)
loadPlutusWitness = do
envelope <-
H.leftFailM $
fmap (deserialiseFromJSON AsTextEnvelope) . H.evalIO $
B.readFile "test/cardano-api-test/files/input/plutus/v3.alwaysTrue.json"
ScriptInAnyLang (PlutusScriptLanguage PlutusScriptV3) (PlutusScript PlutusScriptV3 script) <-
H.leftFail $ deserialiseFromTextEnvelopeAnyOf textEnvTypes envelope
pure $
PlutusScriptWitness
PlutusScriptV3InConway
PlutusScriptV3
(PScript script)
NoScriptDatumForMint
(unsafeHashableScriptData (ScriptDataMap []))
(ExecutionUnits 0 0)

textEnvTypes :: [FromSomeType HasTextEnvelope ScriptInAnyLang]
textEnvTypes =
[ FromSomeType
(AsScript AsPlutusScriptV3)
(ScriptInAnyLang (PlutusScriptLanguage PlutusScriptV3))
]

prop_make_transaction_body_autobalance_multi_asset_collateral :: Property
prop_make_transaction_body_autobalance_multi_asset_collateral = H.propertyOnce $ do
let sbe = ShelleyBasedEraConway
era = toCardanoEra sbe
aeo <- H.nothingFail $ forEraMaybeEon @AlonzoEraOnwards era

systemStart <-
fmap SystemStart . H.evalIO $
DT.parseTimeM True DT.defaultTimeLocale "%Y-%m-%dT%H:%M:%S%QZ" "2021-09-01T00:00:00Z"

let epochInfo = LedgerEpochInfo $ CS.fixedEpochInfo (CS.EpochSize 100) (CS.mkSlotLength 1000)

pparams <-
LedgerProtocolParameters @ConwayEra
<$> H.readJsonFileOk "test/cardano-api-test/files/input/protocol-parameters/conway.json"

plutusWitness <- loadPlutusWitness

let scriptHashStr = "e2b715a86bee4f14fef84081217f9e2646893a7d60a38af69e0aa572"
let policyId' = fromString scriptHashStr
let scriptHash = L.ScriptHash $ fromString scriptHashStr
-- one UTXO with an asset - the same we're minting in the transaction
let utxos =
UTxO
[
( TxIn
"01f4b788593d4f70de2a45c2e1e87088bfbdfa29577ae1b62aba60e095e3ab53"
(TxIx 0)
, TxOut
( AddressInEra
(ShelleyAddressInEra ShelleyBasedEraConway)
( ShelleyAddress
L.Testnet
( L.KeyHashObj $
L.KeyHash "ebe9de78a37f84cc819c0669791aa0474d4f0a764e54b9f90cfe2137"
)
L.StakeRefNull
)
)
( TxOutValueShelleyBased
ShelleyBasedEraConway
( L.MaryValue
(L.Coin 4_000_000)
(L.MultiAsset [(L.PolicyID scriptHash, [(L.AssetName "eeee", 1)])])
)
)
TxOutDatumNone
ReferenceScriptNone
)
]

txInputs = map (,BuildTxWith (KeyWitness KeyWitnessForSpending)) . toList . M.keys . unUTxO $ utxos
txInputsCollateral = TxInsCollateral aeo $ toList . M.keys . unUTxO $ utxos

let address =
AddressInEra
(ShelleyAddressInEra ShelleyBasedEraConway)
( ShelleyAddress
L.Testnet
(L.ScriptHashObj scriptHash)
L.StakeRefNull
)
let txOutputs doesIncludeAsset =
[ TxOut
address
( TxOutValueShelleyBased
ShelleyBasedEraConway
( L.MaryValue
(L.Coin 2_000_000)
( L.MultiAsset $
if doesIncludeAsset
then [(L.PolicyID scriptHash, [(L.AssetName "eeee", 2)])]
else []
)
)
)
TxOutDatumNone
ReferenceScriptNone
]

let txMint =
TxMintValue
MaryEraOnwardsConway
[(AssetId policyId' "eeee", 1)]
(BuildTxWith [(policyId', plutusWitness)])

let content =
defaultTxBodyContent sbe
& setTxIns txInputs
& setTxInsCollateral txInputsCollateral
& setTxOuts (txOutputs False) -- include minted asset in txout manually
& setTxMintValue txMint
& setTxProtocolParams (pure $ pure pparams)

-- autobalanced body has assets and ADA in the change txout
(BalancedTxBody balancedContent _ _ fee) <-
H.leftFail $
makeTransactionBodyAutoBalance
sbe
systemStart
epochInfo
pparams
mempty
mempty
mempty
utxos
content
address
Nothing

335_475 === fee
TxReturnCollateral _ (TxOut _ txOutValue _ _) <- H.noteShow $ txReturnCollateral balancedContent
let assets = [a | a@(AssetId _ _, _) <- toList $ txOutValueToValue txOutValue]
H.annotateShow assets

H.noteShow_ fee
H.failure

-- * Utilities

loadPlutusWitness
:: HasCallStack
=> MonadFail m
=> MonadIO m
=> MonadTest m
=> m (ScriptWitness WitCtxMint ConwayEra)
loadPlutusWitness = do
envelope <-
H.leftFailM $
fmap (deserialiseFromJSON AsTextEnvelope) . H.evalIO $
B.readFile "test/cardano-api-test/files/input/plutus/v3.alwaysTrue.json"
ScriptInAnyLang (PlutusScriptLanguage PlutusScriptV3) (PlutusScript PlutusScriptV3 script) <-
H.leftFail $ deserialiseFromTextEnvelopeAnyOf textEnvTypes envelope
pure $
PlutusScriptWitness
PlutusScriptV3InConway
PlutusScriptV3
(PScript script)
NoScriptDatumForMint
(unsafeHashableScriptData (ScriptDataMap []))
(ExecutionUnits 0 0)

textEnvTypes :: [FromSomeType HasTextEnvelope ScriptInAnyLang]
textEnvTypes =
[ FromSomeType
(AsScript AsPlutusScriptV3)
(ScriptInAnyLang (PlutusScriptLanguage PlutusScriptV3))
]

tests :: TestTree
tests =
Expand All @@ -215,4 +335,7 @@ tests =
[ testProperty
"makeTransactionBodyAutoBalance test correct fees when mutli-asset tx"
prop_make_transaction_body_autobalance_return_correct_fee_for_multi_asset
, testProperty
"makeTransactionBodyAutoBalance autobalances multi-asset collateral"
prop_make_transaction_body_autobalance_multi_asset_collateral
]

0 comments on commit e9573ac

Please sign in to comment.