packages feed

bitcoin-payment-channel-1.0.1.0: src/Bitcoin/SpendCond/Util.hs

module Bitcoin.SpendCond.Util where

import Bitcoin.Util
import qualified Network.Haskoin.Transaction as HT
import Bitcoin.SpendCond.Cond


-- | Create inputs from outputs that pay to the given redeemScript
getPrevIn :: forall r t. (SpendCondition r, HasSpendCond r t) =>
       HT.Tx
    -> r
    -> [InputG t ()]
getPrevIn tx rdmScr =
    map (mapInputType mkCond . mkInput) $ catMaybes $
        zipWith checkOut [0..] (HT.txOut tx)
  where
    mkInput (idx,val) = mkNoSigTxIn (mkPrevOut idx) (fromIntegral val) rdmScr
    mkPrevOut = HT.OutPoint (HT.txHash tx)
    scrHash = hash160 $ conditionScript rdmScr
    checkMatch idx (hash,val) = if hash == scrHash then Just (idx,val) else Nothing
    checkOut idx out =
        either (const Nothing) (checkMatch idx)
            (decodeScriptHash (HT.scriptOutput out) >>= \sh -> Right (sh, HT.outValue out))