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