{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE UndecidableInstances #-}

module Test.Cardano.Protocol.Crypto.VRF (
  VRFKeyPair (..),
) where

import qualified Cardano.Crypto.VRF.Class as VRF
import Cardano.Protocol.Crypto
import Test.Cardano.Ledger.Common

data VRFKeyPair c = VRFKeyPair
  { forall c. VRFKeyPair c -> SignKeyVRF (VRF c)
vrfSignKey :: !(VRF.SignKeyVRF (VRF c))
  , forall c. VRFKeyPair c -> VerKeyVRF (VRF c)
vrfVerKey :: !(VRF.VerKeyVRF (VRF c))
  }

deriving instance
  (Show (VRF.SignKeyVRF (VRF c)), Show (VRF.VerKeyVRF (VRF c))) => Show (VRFKeyPair c)

instance (Crypto c, Arbitrary (VRF.SignKeyVRF (VRF c))) => Arbitrary (VRFKeyPair c) where
  arbitrary :: Gen (VRFKeyPair c)
arbitrary = do
    SignKeyVRF (VRF c)
signKey <- forall a. Arbitrary a => Gen a
arbitrary
    forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$
      VRFKeyPair
        { vrfSignKey :: SignKeyVRF (VRF c)
vrfSignKey = SignKeyVRF (VRF c)
signKey
        , vrfVerKey :: VerKeyVRF (VRF c)
vrfVerKey = forall v. VRFAlgorithm v => SignKeyVRF v -> VerKeyVRF v
VRF.deriveVerKeyVRF SignKeyVRF (VRF c)
signKey
        }