I have defined two endpoints. One for creating a UTxO at the script address with a Datum that contains the wallet's own PaymentPubKeyHash. And a second endpoint that spends such UTxOs from the script address. The validator only checks for equality between the two PaymentPubKeyHashes.
First endpoint:
one :: AsContractError e => Params -> Contract w s e ()
one Params{..} = do
pkh <- ownPaymentPubKeyHash
let dat = Stake PPDatum { owner = pkh }
tx = Constraints.mustPayToTheScript dat $ Ada.lovelaceValueOf amount
ledgerTx <- submitTxConstraints validatorInstance tx
void $ awaitTxConfirmed $ getCardanoTxId ledgerTx
Second endpoint:
second :: forall w s e. AsContractError e => Contract w s e ()
second = do
pkh <- ownPaymentPubKeyHash
utxos <- Map.filter (isSuitable pkh) <$> utxosAt validatorAddress
...
where
isSuitable :: PaymentPubKeyHash -> ChainIndexTxOut -> Bool
isSuitable pkh o = case _ciTxOutDatum o of
Left _ -> False
Right (Datum e) -> case PlutusTx.fromBuiltinData e of
Nothing -> False
Just d -> owner d == pkh
But the equality fails between the PaymentPubKeyHashes.
After testing around I recognized that the type of ownPaymentPubKeyHash does not just return a PaymentPubKeyHash but a Contract w s e PaymentPubKeyHash.
So how can I create the datum so that the PaymentPubKeyHashes match?