module Crypto.Secp256k1.Gen where

import Crypto.Secp256k1 (KeyPair, PubKeyXO, PubKeyXY, SecKey, Tweak, derivePubKey, importSecKey, importTweak, keyPairCreate, xyToXO)
import Hedgehog (MonadGen)
import Hedgehog.Gen (bytes, discard, prune)
import Hedgehog.Range (singleton)


secKeyGen :: MonadGen m => m SecKey
secKeyGen :: forall (m :: * -> *). MonadGen m => m SecKey
secKeyGen = do
    ByteString
bs <- m ByteString -> m ByteString
forall (m :: * -> *) a. MonadGen m => m a -> m a
prune (m ByteString -> m ByteString) -> m ByteString -> m ByteString
forall a b. (a -> b) -> a -> b
$ Range Int -> m ByteString
forall (m :: * -> *). MonadGen m => Range Int -> m ByteString
bytes (Int -> Range Int
forall a. a -> Range a
singleton Int
32)
    m SecKey -> (SecKey -> m SecKey) -> Maybe SecKey -> m SecKey
forall b a. b -> (a -> b) -> Maybe a -> b
maybe m SecKey
forall (m :: * -> *) a. MonadGen m => m a
discard SecKey -> m SecKey
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ByteString -> Maybe SecKey
importSecKey ByteString
bs)


pubKeyXYGen :: MonadGen m => m PubKeyXY
pubKeyXYGen :: forall (m :: * -> *). MonadGen m => m PubKeyXY
pubKeyXYGen = SecKey -> PubKeyXY
derivePubKey (SecKey -> PubKeyXY) -> m SecKey -> m PubKeyXY
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m SecKey
forall (m :: * -> *). MonadGen m => m SecKey
secKeyGen


pubKeyXOGen :: MonadGen m => m PubKeyXO
pubKeyXOGen :: forall (m :: * -> *). MonadGen m => m PubKeyXO
pubKeyXOGen = (PubKeyXO, Bool) -> PubKeyXO
forall a b. (a, b) -> a
fst ((PubKeyXO, Bool) -> PubKeyXO)
-> (PubKeyXY -> (PubKeyXO, Bool)) -> PubKeyXY -> PubKeyXO
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PubKeyXY -> (PubKeyXO, Bool)
xyToXO (PubKeyXY -> PubKeyXO) -> m PubKeyXY -> m PubKeyXO
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m PubKeyXY
forall (m :: * -> *). MonadGen m => m PubKeyXY
pubKeyXYGen


keyPairGen :: MonadGen m => m KeyPair
keyPairGen :: forall (m :: * -> *). MonadGen m => m KeyPair
keyPairGen = SecKey -> KeyPair
keyPairCreate (SecKey -> KeyPair) -> m SecKey -> m KeyPair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m SecKey
forall (m :: * -> *). MonadGen m => m SecKey
secKeyGen


tweakGen :: MonadGen m => m Tweak
tweakGen :: forall (m :: * -> *). MonadGen m => m Tweak
tweakGen = do
    ByteString
bs <- m ByteString -> m ByteString
forall (m :: * -> *) a. MonadGen m => m a -> m a
prune (m ByteString -> m ByteString) -> m ByteString -> m ByteString
forall a b. (a -> b) -> a -> b
$ Range Int -> m ByteString
forall (m :: * -> *). MonadGen m => Range Int -> m ByteString
bytes (Int -> Range Int
forall a. a -> Range a
singleton Int
32)
    m Tweak -> (Tweak -> m Tweak) -> Maybe Tweak -> m Tweak
forall b a. b -> (a -> b) -> Maybe a -> b
maybe m Tweak
forall (m :: * -> *) a. MonadGen m => m a
discard Tweak -> m Tweak
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ByteString -> Maybe Tweak
importTweak ByteString
bs)