module Bulletproofs.RangeProof.Prover (
  generateProof,
  generateProofUnsafe,
) where

import Protolude

import Crypto.Random.Types (MonadRandom(..))
import PrimeField (PrimeField(..), toInt)

import Bulletproofs.RangeProof.Internal
import qualified Bulletproofs.MultiRangeProof.Prover as MRP

-- | Prove that a value lies in a specific range
generateProof
  :: (KnownNat p, MonadRandom m)
  => Integer                -- ^ Upper bound of the range we want to prove
  -> (PrimeField p, PrimeField p)
  -- ^ Values we want to prove in range and their blinding factors
  -> ExceptT (RangeProofError (PrimeField p)) m (RangeProof (PrimeField p))
generateProof upperBound (v, vBlinding) =
  MRP.generateProof upperBound [(v, vBlinding)]

-- | Generate range proof from valid inputs
generateProofUnsafe
  :: (KnownNat p, MonadRandom m)
  => Integer    -- ^ Upper bound of the range we want to prove
  -> (PrimeField p, PrimeField p)
  -- ^ Values we want to prove in range and their blinding factors
  -> m (RangeProof (PrimeField p))
generateProofUnsafe upperBound (v, vBlinding) =
  MRP.generateProofUnsafe upperBound [(v, vBlinding)]