agora/agora-specs/Sample/Stake.hs
2022-12-08 17:28:26 +01:00

101 lines
2.8 KiB
Haskell

{- |
Module : Sample.Stake
Maintainer : emi@haskell.fyi
Description: Sample based testing for Stake utxos
This module tests primarily the happy path for Stake creation
-}
module Sample.Stake (
stakeAssetClass,
stakeSymbol,
signer,
-- * Script contexts
stakeDepositWithdraw,
DepositWithdrawExample (..),
) where
import Agora.Governor (Governor (gtClassRef))
import Agora.SafeMoney (GTTag)
import Agora.Stake (
StakeDatum (StakeDatum, stakedAmount),
)
import Data.Tagged (Tagged)
import Plutarch.Context (
SpendingBuilder,
buildSpending',
input,
output,
script,
signedWith,
txId,
withDatum,
withRef,
withSpendingOutRef,
withValue,
)
import Plutarch.Extra.AssetClass (assetClassValue)
import PlutusLedgerApi.V1.Contexts (TxOutRef (..))
import PlutusLedgerApi.V2 (
Credential (PubKeyCredential),
ScriptContext (..),
)
import Sample.Shared (
governor,
signer,
stakeAssetClass,
stakeScriptHash,
stakeSymbol,
)
import Test.Util (sortValue)
-- | Config for creating a ScriptContext that deposits or withdraws.
data DepositWithdrawExample = DepositWithdrawExample
{ startAmount :: Tagged GTTag Integer
-- ^ The amount of GT stored before the transaction.
, delta :: Tagged GTTag Integer
-- ^ The amount of GT deposited or withdrawn from the Stake.
}
-- | Create a ScriptContext that deposits or withdraws, given the config for it.
stakeDepositWithdraw :: DepositWithdrawExample -> ScriptContext
stakeDepositWithdraw config =
let st = assetClassValue stakeAssetClass 1 -- Stake ST
stakeBefore :: StakeDatum
stakeBefore = StakeDatum config.startAmount (PubKeyCredential signer) Nothing []
stakeAfter :: StakeDatum
stakeAfter = stakeBefore {stakedAmount = stakeBefore.stakedAmount + config.delta}
stakeRef :: TxOutRef
stakeRef = TxOutRef "0ffef57e30cc604342c738e31e0451593837b313e7bfb94b0922b142782f98e6" 1
builder :: SpendingBuilder
builder =
mconcat
[ txId "0b2086cbf8b6900f8cb65e012de4516cb66b5cb08a9aaba12a8b88be"
, signedWith signer
, input $
mconcat
[ script stakeScriptHash
, withValue
( sortValue $
st
<> assetClassValue governor.gtClassRef stakeBefore.stakedAmount
)
, withDatum stakeBefore
, withRef stakeRef
]
, output $
mconcat
[ script stakeScriptHash
, withValue
( sortValue $
st
<> assetClassValue governor.gtClassRef stakeAfter.stakedAmount
)
, withDatum stakeAfter
]
, withSpendingOutRef stakeRef
]
in buildSpending' builder