bitcoin-payment-channel-1.2.0.0: src/PaymentChannel/Internal/Error/User.hs
{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}
module PaymentChannel.Internal.Error.User where
import PaymentChannel.RBPCP.Parse
import PaymentChannel.Internal.Error.Status (HTTPError)
import PaymentChannel.Internal.Receiver.Open (OpenError)
import Bitcoin.Compare
import Bitcoin.LockTime.Types (LockTimeParseError)
import PaymentChannel.Internal.Types
import PaymentChannel.Internal.Util
import GHC.Generics
import Control.Exception
import qualified Network.Haskoin.Script as HS
data PayChanError =
SigVerifyFailed -- ^ Signature verification failed
| LockTimeParseError LockTimeParseError
| BadSigHashFlag HS.SigHash HS.SigHash -- ^ Unexpected 'SigHash' flag. Expected: SIGHASH_SINGLE|ANYONECANPAY.
| BadPaymentValue BtcAmount -- ^ Payment assigns less value to server than previous payment. Client change value is greater by the specified 'BtcAmount'.
| PaymentError (TxMismatch ChanParams)
| ChannelExpired -- ^ Channel has expired or is too close to expiration date
| StatusError HTTPError -- ^ Channel not ready for payment. 409=try again; 410=channel gone.
| RBPCPError ParseError -- ^ Failed to parse RBPCP payment
| OpenError OpenError -- ^ Channel-open error
deriving (Eq, Generic, NFData, ToJSON, FromJSON, Serialize)
class IsPayChanError e where
mkChanErr :: e -> PayChanError
instance IsPayChanError LockTimeParseError where
mkChanErr = LockTimeParseError
instance IsPayChanError HTTPError where
mkChanErr = StatusError
instance IsPayChanError ParseError where
mkChanErr = RBPCPError
instance IsPayChanError OpenError where
mkChanErr = OpenError
instance Exception PayChanError
instance Show PayChanError where
show SigVerifyFailed = "signature verification failed"
show (LockTimeParseError e) = show e
show (BadSigHashFlag sh1 sh2) =
"unexpected SIGHASH flag: " ++ show sh1 ++
". expected: " ++ show sh2
show (BadPaymentValue valDiff) =
"out-of-order payment (assigns " ++ show valDiff ++ " less value to receiver)"
show ChannelExpired =
"channel too close to expiration date"
show (StatusError he) = unwords
["status error:", show he]
show (PaymentError (TxInMismatch (InPrevOutMismatch op _))) =
"unexpected outpoint. expected: " ++ show op
show (PaymentError (TxOutMisMatch (OutAddressMismatch addr _))) =
"unexpected change address. expected: " ++ show addr
show (PaymentError (TxInMismatch (InRdmScrMismatch scr _))) =
"unexpected redeemScript. expected: " ++ cs (serHex scr)
show (PaymentError e) = "unexpected error: " ++ show e
show (RBPCPError pe) = "failed to parse payment: " ++ show pe
show (OpenError oe) = "open error: " ++ show oe
-- instance Serialize PayChanError -- Generic PayChanError instance