-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

-- | Address in Tezos.

module Hedgehog.Gen.Tezos.Address
  ( genAddress
  , genContractAddress
  , genKeyAddress
  ) where

import Hedgehog (MonadGen)
import Hedgehog.Gen qualified as Gen
import Hedgehog.Range qualified as Range

import Hedgehog.Gen.Tezos.Crypto (genKeyHash)
import Morley.Tezos.Address
import Morley.Tezos.Crypto

genAddress :: MonadGen m => m Address
genAddress :: forall (m :: * -> *). MonadGen m => m Address
genAddress = [m Address] -> m Address
forall (m :: * -> *) a. MonadGen m => [m a] -> m a
Gen.choice [KindedAddress 'AddressKindImplicit -> Address
forall (kind :: AddressKind). KindedAddress kind -> Address
MkAddress (KindedAddress 'AddressKindImplicit -> Address)
-> m (KindedAddress 'AddressKindImplicit) -> m Address
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (KindedAddress 'AddressKindImplicit)
forall (m :: * -> *).
MonadGen m =>
m (KindedAddress 'AddressKindImplicit)
genKeyAddress, KindedAddress 'AddressKindContract -> Address
forall (kind :: AddressKind). KindedAddress kind -> Address
MkAddress (KindedAddress 'AddressKindContract -> Address)
-> m (KindedAddress 'AddressKindContract) -> m Address
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (KindedAddress 'AddressKindContract)
forall (m :: * -> *).
MonadGen m =>
m (KindedAddress 'AddressKindContract)
genContractAddress]

genKeyAddress :: MonadGen m => m ImplicitAddress
genKeyAddress :: forall (m :: * -> *).
MonadGen m =>
m (KindedAddress 'AddressKindImplicit)
genKeyAddress = KeyHash -> KindedAddress 'AddressKindImplicit
ImplicitAddress (KeyHash -> KindedAddress 'AddressKindImplicit)
-> m KeyHash -> m (KindedAddress 'AddressKindImplicit)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m KeyHash
forall (m :: * -> *). MonadGen m => m KeyHash
genKeyHash

genContractAddress :: MonadGen m => m ContractAddress
genContractAddress :: forall (m :: * -> *).
MonadGen m =>
m (KindedAddress 'AddressKindContract)
genContractAddress = ContractHash -> KindedAddress 'AddressKindContract
ContractAddress (ContractHash -> KindedAddress 'AddressKindContract)
-> (ByteString -> ContractHash)
-> ByteString
-> KindedAddress 'AddressKindContract
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HashTag 'HashKindContract -> ByteString -> ContractHash
forall (kind :: HashKind). HashTag kind -> ByteString -> Hash kind
Hash HashTag 'HashKindContract
HashContract (ByteString -> KindedAddress 'AddressKindContract)
-> m ByteString -> m (KindedAddress 'AddressKindContract)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Range Int -> m ByteString
forall (m :: * -> *). MonadGen m => Range Int -> m ByteString
Gen.bytes (Int -> Range Int
forall a. a -> Range a
Range.singleton Int
20)