haskoin-wallet-0.0.1: Network/Haskoin/Wallet/Arbitrary.hs
{-|
Arbitrary instances for wallet data types.
-}
module Network.Haskoin.Wallet.Arbitrary
( genPubKeyC
, genMulSigInput
, genRegularInput
, genAddrOutput
, RegularTx(..)
, MSParam(..)
) where
import Test.QuickCheck
( Gen
, Arbitrary
, arbitrary
, vectorOf
, oneof
, choose
, elements
)
import Control.Monad (liftM)
import Control.Applicative ((<$>),(<*>))
import Data.Maybe (fromJust)
import Network.Haskoin.Crypto.Arbitrary
import Network.Haskoin.Protocol.Arbitrary ()
import Network.Haskoin.Script.Arbitrary ()
import Network.Haskoin.Wallet
import Network.Haskoin.Script
import Network.Haskoin.Protocol
import Network.Haskoin.Crypto
-- | Data type for generating arbitrary valid multisignature parameters (m of n)
data MSParam = MSParam Int Int deriving (Eq, Show)
instance Arbitrary MSParam where
arbitrary = do
n <- choose (1,16)
m <- choose (1,n)
return $ MSParam m n
-- | Data type for generating arbitrary transaction with inputs and outputs
-- consisting only of script hash or pub key hash scripts.
data RegularTx = RegularTx Tx deriving (Eq, Show)
-- | Generate an arbitrary compressed public key.
genPubKeyC :: Gen PubKey
genPubKeyC = derivePubKey <$> genPrvKeyC
-- | Generate an arbitrary script hash input spending a multisignature
-- pay to script hash.
genMulSigInput :: Gen ScriptHashInput
genMulSigInput = do
(MSParam m n) <- arbitrary
rdm <- PayMulSig <$> (vectorOf n genPubKeyC) <*> (return m)
inp <- SpendMulSig <$> (vectorOf m arbitrary) <*> (return m)
return $ ScriptHashInput inp rdm
-- | Generate an arbitrary transaction input spending a public key hash or
-- script hash output.
genRegularInput :: Gen TxIn
genRegularInput = do
op <- arbitrary
sq <- arbitrary
sc <- oneof [ encodeScriptHash <$> genMulSigInput
, encodeInput <$> (SpendPKHash <$> arbitrary <*> genPubKeyC)
]
return $ TxIn op sc sq
-- | Generate an arbitrary output paying to a public key hash or script hash
-- address.
genAddrOutput :: Gen TxOut
genAddrOutput = do
v <- arbitrary
sc <- oneof [ (PayPKHash . pubKeyAddr) <$> arbitrary
, (PayScriptHash . scriptAddr) <$> arbitrary
]
return $ TxOut v $ encodeOutput sc
instance Arbitrary RegularTx where
arbitrary = do
x <- choose (1,10)
y <- choose (1,10)
liftM RegularTx $ Tx <$> arbitrary
<*> (vectorOf x genRegularInput)
<*> (vectorOf y genAddrOutput)
<*> arbitrary
instance Arbitrary XPrvKey where
arbitrary = XPrvKey <$> arbitrary
<*> arbitrary
<*> arbitrary
<*> arbitrary
<*> genPrvKeyC
instance Arbitrary XPubKey where
arbitrary = deriveXPubKey <$> arbitrary
instance Arbitrary MasterKey where
arbitrary = fromJust . makeMasterKey <$> arbitrary
instance Arbitrary AccPrvKey where
arbitrary = do
master <- arbitrary
index <- choose (0,0x7fffffff)
return $ fromJust $ accPrvKey master index
instance Arbitrary AccPubKey where
arbitrary = do
master <- arbitrary
index <- choose (0,0x7fffffff)
return $ fromJust $ accPubKey master index
instance Arbitrary AddrPrvKey where
arbitrary = do
accKey <- arbitrary
index <- arbitrary
elements [ fromJust $ extPrvKey accKey index
, fromJust $ intPrvKey accKey index
]
instance Arbitrary AddrPubKey where
arbitrary = do
accKey <- arbitrary
index <- arbitrary
elements [ fromJust $ extPubKey accKey index
, fromJust $ intPubKey accKey index
]
instance Arbitrary Coin where
arbitrary = Coin <$> arbitrary <*> arbitrary <*> arbitrary