packages feed

bitcoin-payment-channel-1.0.0.0: src/PaymentChannel/Internal/Payment/Types.hs

module PaymentChannel.Internal.Payment.Types
(
  module PaymentChannel.Internal.Payment.Types
, module PaymentChannel.Internal.Types
, module Bitcoin.SpendCond.Cond
)
where

import PaymentChannel.Internal.Types
import Bitcoin.Types
import Bitcoin.SinglePair
import Bitcoin.SpendCond.Cond
import Bitcoin.Signature

import qualified Network.Haskoin.Transaction    as HT
import qualified Network.Haskoin.Crypto         as HC
import qualified Network.Haskoin.Script         as HS
import qualified Data.Ord                       as Ord



-- | scriptInput for a settlement transaction using client+server pubkey
data PaymentScriptSig = PaymentScriptSig
    { sssClientSig   :: BtcSig
    , sssServerSig   :: BtcSig
    }

instance TransformSigData BtcSig () ChanParams where
    mkSigData _ btcSig _ = btcSig

instance TransformSigData PaymentScriptSig BtcSig ChanParams where
    mkSigData clientSig serverSig _ = PaymentScriptSig clientSig serverSig

-- Two signatures
instance SpendFulfillment PaymentScriptSig ChanParams where
    rawSigs PaymentScriptSig{..} MkChanParams{..} =
        [ (getPubKey cpReceiverPubKey, sssClientSig)
        , (getPubKey cpSenderPubKey  , sssServerSig) ]
    signatureScript PaymentScriptSig{..} _ = Script
        [ opPush sssClientSig
        , opPush sssServerSig
        , OP_1]   -- Make OP_IF in reeemScript evaluate to true (two pubkeys/sigs)

-- Single (client) signature
instance SpendFulfillment BtcSig ChanParams where
    rawSigs clientSig MkChanParams{..} =
        [ (getPubKey cpSenderPubKey, clientSig) ]
    signatureScript _ _ = Script [] --TODO: separate rawSigs from signatureScript?


instance SpendCondition ChanParams where
    conditionScript = getRedeemScript