SymbolicData

{-# OPTIONS --safe #-}

open import Ledger.Prelude

module Test.SymbolicData
  (SD : Set) {{DecEq-Data : DecEq SD}} {{Show-Data : Show SD}} where

open import Test.Prelude SD

ScriptContext : Type
ScriptContext = STxInfo × SScriptPurpose

SData : Type
SData = SDatum  ScriptContext

instance ShowSData : Show SData
         ShowSData = mkShow  x  "")

open import Test.LedgerImplementation SData SData
open import Ledger.Conway.Specification.Script.ScriptPurpose SVTransactionStructure

open import Ledger.Conway.Specification.Transaction using (TransactionStructure)
open TransactionStructure SVTransactionStructure

open import Ledger.Conway.Specification.Script.Validation SVTransactionStructure

TxInToSymbolic : TxIn  STxIn
TxInToSymbolic x = x

credToSymbolic : Credential  SCredential
credToSymbolic (KeyHashObj x) = KeyHashObj x
credToSymbolic (ScriptObj x) = ScriptObj x

AddrToSymbolic : Addr  SAddr
AddrToSymbolic (inj₁ record { net = net ; pay = pay ; stake = stake })
  = inj₁ (record { net = net ; pay = credToSymbolic pay ; stake = maybe  x  just (credToSymbolic x)) nothing stake })
AddrToSymbolic (inj₂ record { net = net ; pay = pay ; attrsSize = attrsSize })
  = inj₂ (record { net = net ; pay = credToSymbolic pay ; attrsSize = attrsSize })

RwdAddrToSymbolic : RwdAddr  SRwdAddr
RwdAddrToSymbolic record { net = net ; stake = stake } = record { net = net ; stake = credToSymbolic stake }

DatumToSymbolic : Datum  Maybe SDatum
DatumToSymbolic (inj₁ x) = just x
DatumToSymbolic (inj₂ y) = nothing

DatumPairToSymbolic : Datum  DataHash  Maybe (SDatum  SDatum)
DatumPairToSymbolic (inj₁ (inj₁ x)) = just (inj₁ x)
DatumPairToSymbolic (inj₁ (inj₂ y)) = nothing
DatumPairToSymbolic (inj₂ (inj₁ x)) = just (inj₂ x)
DatumPairToSymbolic (inj₂ (inj₂ y)) = nothing

TxOutToSymbolic : TxOut  STxOut
TxOutToSymbolic (a , v , d , s) = AddrToSymbolic a , v , maybe DatumPairToSymbolic nothing d

UTxOToSymbolic : UTxO  SUTxO
UTxOToSymbolic x = map (\ x  (proj₁ x , TxOutToSymbolic (proj₂ x))) (setToList (x ˢ))

txInfoToSymbolic : TxInfo  STxInfo
txInfoToSymbolic txinfo =
  let open TxInfo txinfo
  in
    record
      { realizedInputs = UTxOToSymbolic realizedInputs
      ; txouts = map (\ x  (proj₁ x , TxOutToSymbolic (proj₂ x))) (setToList (txOuts ˢ))
      ; fee = fee
      ; mint = mint
      ; txwdrls = map (\ x  (RwdAddrToSymbolic (proj₁ x) , proj₂ x)) (setToList (txWithdrawals ˢ))
      ; txvldt = txVldt
      ; vkey = vkKey
      ; txdats = mapMaybe DatumToSymbolic (setToList txdats) 
      ; txid = txId
      }

ScriptPurposeToSymbolic : ScriptPurpose  SScriptPurpose
ScriptPurposeToSymbolic (Cert x) = Empty
ScriptPurposeToSymbolic (Rwrd x) = Rwrd (RwdAddrToSymbolic x)
ScriptPurposeToSymbolic (Mint x) = Mint x
ScriptPurposeToSymbolic (Spend x) = Spend x
ScriptPurposeToSymbolic (Vote x) = Empty
ScriptPurposeToSymbolic (Propose x) = Empty

valContext : TxInfo  ScriptPurpose  Data
valContext txinfo sp = inj₂ ((txInfoToSymbolic txinfo) , (ScriptPurposeToSymbolic sp))