packages feed

haskoin-wallet-0.0.1: tests/QuickCheckUtils.hs

module QuickCheckUtils where

import Test.QuickCheck 
    ( Arbitrary
    , arbitrary
    , vectorOf
    , choose
    )

import Control.Applicative ((<$>))
import Data.List (permutations)

import Network.Haskoin.Wallet
import Network.Haskoin.Wallet.Arbitrary ()
import Network.Haskoin.Script
import Network.Haskoin.Crypto
import Network.Haskoin.Protocol
import Network.Haskoin.Util

data PKHashSigTemplate = PKHashSigTemplate Tx [SigInput] [PrvKey]
    deriving (Eq, Show)

-- Generates data for signing a PKHash transaction
instance Arbitrary PKHashSigTemplate where
    arbitrary = do
        inCount   <- choose (0,10)
        perm      <- choose (0,max 0 $ inCount-1)
        outPoints <- vectorOf inCount arbitrary
        prvKeys   <- vectorOf inCount arbitrary
        sigHashes <- vectorOf inCount arbitrary
        payTo <- choose (0,10) >>= \n -> do
            h <- (map (addrToBase58 . PubKeyAddress)) <$> vectorOf n arbitrary    
            v <- vectorOf n $ choose (1,2100000000000000)
            return $ zip h v
        let pubKeys   = map derivePubKey prvKeys
            scriptOut = map (PayPKHash . pubKeyAddr) pubKeys
            scripts   = map encodeOutput scriptOut
            sigInputs = map (\(s,o,h) -> SigInput s o h) 
                            (zip3 scripts outPoints sigHashes)
            perInputs = (permutations sigInputs) !! perm
            perKeys   = (permutations prvKeys) !! perm
            tx        = fromRight $ buildAddrTx outPoints payTo
        return $ PKHashSigTemplate tx perInputs perKeys