{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedRecordDot #-}
module Haskoin.Util.Arbitrary.Script where
import Crypto.Secp256k1
import Data.ByteString qualified as B
import Data.Maybe
import Data.Word
import Haskoin.Address
import Haskoin.Crypto.Keys.Common
import Haskoin.Network.Constants
import Haskoin.Network.Data
import Haskoin.Script
import Haskoin.Transaction.Common
import Haskoin.Util
import Haskoin.Util.Arbitrary.Address
import Haskoin.Util.Arbitrary.Crypto
import Haskoin.Util.Arbitrary.Keys
import Haskoin.Util.Arbitrary.Util
import Test.QuickCheck
arbitraryScript :: Gen Script
arbitraryScript :: Gen Script
arbitraryScript = [ScriptOp] -> Script
Script ([ScriptOp] -> Script) -> Gen [ScriptOp] -> Gen Script
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen ScriptOp -> Gen [ScriptOp]
forall a. Gen a -> Gen [a]
listOf Gen ScriptOp
arbitraryScriptOp
arbitraryScriptOp :: Gen ScriptOp
arbitraryScriptOp :: Gen ScriptOp
arbitraryScriptOp =
[Gen ScriptOp] -> Gen ScriptOp
forall a. [Gen a] -> Gen a
oneof
[ ByteString -> ScriptOp
opPushData (ByteString -> ScriptOp) -> Gen ByteString -> Gen ScriptOp
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen ByteString
arbitraryBS1,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_0,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_1NEGATE,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_RESERVED,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_1,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_2,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_3,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_4,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_5,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_6,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_7,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_8,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_9,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_10,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_11,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_12,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_13,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_14,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_15,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_16,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NOP,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_VER,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_IF,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NOTIF,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_VERIF,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_VERNOTIF,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_ELSE,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_ENDIF,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_VERIFY,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_RETURN,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_TOALTSTACK,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_FROMALTSTACK,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_IFDUP,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_DEPTH,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_DROP,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_DUP,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NIP,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_OVER,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_PICK,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_ROLL,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_ROT,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_SWAP,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_TUCK,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_2DROP,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_2DUP,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_3DUP,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_2OVER,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_2ROT,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_2SWAP,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_CAT,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_SUBSTR,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_LEFT,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_RIGHT,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_SIZE,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_INVERT,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_AND,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_OR,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_XOR,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_EQUAL,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_EQUALVERIFY,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_RESERVED1,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_RESERVED2,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_1ADD,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_1SUB,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_2MUL,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_2DIV,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NEGATE,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_ABS,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NOT,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_0NOTEQUAL,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_ADD,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_SUB,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_MUL,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_DIV,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_MOD,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_LSHIFT,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_RSHIFT,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_BOOLAND,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_BOOLOR,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NUMEQUAL,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NUMEQUALVERIFY,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NUMNOTEQUAL,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_LESSTHAN,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_GREATERTHAN,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_LESSTHANOREQUAL,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_GREATERTHANOREQUAL,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_MIN,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_MAX,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_WITHIN,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_RIPEMD160,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_SHA1,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_SHA256,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_HASH160,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_HASH256,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_CODESEPARATOR,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_CHECKSIG,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_CHECKSIGVERIFY,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_CHECKMULTISIG,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_CHECKMULTISIGVERIFY,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NOP1,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_CHECKLOCKTIMEVERIFY,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_CHECKSEQUENCEVERIFY,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NOP4,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NOP5,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NOP6,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NOP7,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NOP8,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NOP9,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_NOP10,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_CHECKDATASIG,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_CHECKDATASIGVERIFY,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_REVERSEBYTES,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_PUBKEYHASH,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return ScriptOp
OP_PUBKEY,
ScriptOp -> Gen ScriptOp
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptOp -> Gen ScriptOp) -> ScriptOp -> Gen ScriptOp
forall a b. (a -> b) -> a -> b
$ Word8 -> ScriptOp
OP_INVALIDOPCODE Word8
0xff
]
arbitraryIntScriptOp :: Gen ScriptOp
arbitraryIntScriptOp :: Gen ScriptOp
arbitraryIntScriptOp =
[ScriptOp] -> Gen ScriptOp
forall a. [a] -> Gen a
elements
[ ScriptOp
OP_1,
ScriptOp
OP_2,
ScriptOp
OP_3,
ScriptOp
OP_4,
ScriptOp
OP_5,
ScriptOp
OP_6,
ScriptOp
OP_7,
ScriptOp
OP_8,
ScriptOp
OP_9,
ScriptOp
OP_10,
ScriptOp
OP_11,
ScriptOp
OP_12,
ScriptOp
OP_13,
ScriptOp
OP_14,
ScriptOp
OP_15,
ScriptOp
OP_16
]
arbitraryPushDataType :: Gen PushDataType
arbitraryPushDataType :: Gen PushDataType
arbitraryPushDataType = [PushDataType] -> Gen PushDataType
forall a. [a] -> Gen a
elements [PushDataType
OPCODE, PushDataType
OPDATA1, PushDataType
OPDATA2, PushDataType
OPDATA4]
arbitrarySigHash :: Gen SigHash
arbitrarySigHash :: Gen SigHash
arbitrarySigHash = Word32 -> SigHash
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word32 -> SigHash) -> Gen Word32 -> Gen SigHash
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Gen Word32
forall a. Arbitrary a => Gen a
arbitrary :: Gen Word32)
arbitraryValidSigHash :: Network -> Gen SigHash
arbitraryValidSigHash :: Network -> Gen SigHash
arbitraryValidSigHash Network
net = do
SigHash
sh <- [SigHash] -> Gen SigHash
forall a. [a] -> Gen a
elements [SigHash
sigHashAll, SigHash
sigHashNone, SigHash
sigHashSingle]
SigHash -> SigHash
f1 <-
[SigHash -> SigHash] -> Gen (SigHash -> SigHash)
forall a. [a] -> Gen a
elements ([SigHash -> SigHash] -> Gen (SigHash -> SigHash))
-> [SigHash -> SigHash] -> Gen (SigHash -> SigHash)
forall a b. (a -> b) -> a -> b
$
if Maybe Word32 -> Bool
forall a. Maybe a -> Bool
isJust Network
net.sigHashForkId
then [SigHash -> SigHash
forall a. a -> a
id, SigHash -> SigHash
setForkIdFlag]
else [SigHash -> SigHash
forall a. a -> a
id]
SigHash -> SigHash
f2 <- [SigHash -> SigHash] -> Gen (SigHash -> SigHash)
forall a. [a] -> Gen a
elements [SigHash -> SigHash
forall a. a -> a
id, SigHash -> SigHash
setAnyoneCanPay]
SigHash -> Gen SigHash
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (SigHash -> Gen SigHash) -> SigHash -> Gen SigHash
forall a b. (a -> b) -> a -> b
$ SigHash -> SigHash
f1 (SigHash -> SigHash) -> SigHash -> SigHash
forall a b. (a -> b) -> a -> b
$ SigHash -> SigHash
f2 SigHash
sh
arbitrarySigHashFlag :: Gen SigHashFlag
arbitrarySigHashFlag :: Gen SigHashFlag
arbitrarySigHashFlag =
[SigHashFlag] -> Gen SigHashFlag
forall a. [a] -> Gen a
elements
[ SigHashFlag
SIGHASH_ALL,
SigHashFlag
SIGHASH_NONE,
SigHashFlag
SIGHASH_SINGLE,
SigHashFlag
SIGHASH_FORKID,
SigHashFlag
SIGHASH_ANYONECANPAY
]
arbitraryTxSignature :: Network -> Ctx -> Gen (TxHash, SecKey, TxSignature)
arbitraryTxSignature :: Network -> Ctx -> Gen (TxHash, SecKey, TxSignature)
arbitraryTxSignature Network
net Ctx
ctx = do
(Hash256
m, SecKey
key, Sig
sig) <- Ctx -> Gen (Hash256, SecKey, Sig)
arbitrarySignature Ctx
ctx
SigHash
sh <- (Word8 -> SigHash
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word8 -> SigHash) -> Gen Word8 -> Gen SigHash
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Gen Word8
forall a. Arbitrary a => Gen a
arbitrary :: Gen Word8)) Gen SigHash -> (SigHash -> Bool) -> Gen SigHash
forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` SigHash -> Bool
filterBad
let txsig :: TxSignature
txsig = Sig -> SigHash -> TxSignature
TxSignature Sig
sig SigHash
sh
(TxHash, SecKey, TxSignature) -> Gen (TxHash, SecKey, TxSignature)
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (Hash256 -> TxHash
TxHash Hash256
m, SecKey
key, TxSignature
txsig)
where
filterBad :: SigHash -> Bool
filterBad SigHash
sh =
Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$
SigHash -> Bool
isSigHashUnknown SigHash
sh
Bool -> Bool -> Bool
|| Maybe Word32 -> Bool
forall a. Maybe a -> Bool
isNothing Network
net.sigHashForkId Bool -> Bool -> Bool
&& SigHash -> Bool
hasForkIdFlag SigHash
sh
arbitraryTxSignatureEmpty :: Network -> Ctx -> Gen TxSignature
arbitraryTxSignatureEmpty :: Network -> Ctx -> Gen TxSignature
arbitraryTxSignatureEmpty Network
net Ctx
ctx =
[(Int, Gen TxSignature)] -> Gen TxSignature
forall a. [(Int, Gen a)] -> Gen a
frequency
[ (Int
1, TxSignature -> Gen TxSignature
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return TxSignature
TxSignatureEmpty),
(Int
10, (TxHash, SecKey, TxSignature) -> TxSignature
forall a b c. (a, b, c) -> c
lst3 ((TxHash, SecKey, TxSignature) -> TxSignature)
-> Gen (TxHash, SecKey, TxSignature) -> Gen TxSignature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Network -> Ctx -> Gen (TxHash, SecKey, TxSignature)
arbitraryTxSignature Network
net Ctx
ctx)
]
arbitraryMSParam :: Gen (Int, Int)
arbitraryMSParam :: Gen (Int, Int)
arbitraryMSParam = do
Int
m <- (Int, Int) -> Gen Int
forall a. Random a => (a, a) -> Gen a
choose (Int
1, Int
16)
Int
n <- (Int, Int) -> Gen Int
forall a. Random a => (a, a) -> Gen a
choose (Int
m, Int
16)
(Int, Int) -> Gen (Int, Int)
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
m, Int
n)
arbitraryScriptOutput :: Network -> Ctx -> Gen ScriptOutput
arbitraryScriptOutput :: Network -> Ctx -> Gen ScriptOutput
arbitraryScriptOutput Network
net Ctx
ctx =
[Gen ScriptOutput] -> Gen ScriptOutput
forall a. [Gen a] -> Gen a
oneof ([Gen ScriptOutput] -> Gen ScriptOutput)
-> [Gen ScriptOutput] -> Gen ScriptOutput
forall a b. (a -> b) -> a -> b
$
[ Ctx -> Gen ScriptOutput
arbitraryPKOutput Ctx
ctx,
Gen ScriptOutput
arbitraryPKHashOutput,
Ctx -> Gen ScriptOutput
arbitraryMSOutput Ctx
ctx,
Gen ScriptOutput
arbitrarySHOutput,
Gen ScriptOutput
arbitraryDCOutput
]
[Gen ScriptOutput] -> [Gen ScriptOutput] -> [Gen ScriptOutput]
forall a. [a] -> [a] -> [a]
++ if Network
net.segWit
then
[ Gen ScriptOutput
arbitraryWPKHashOutput,
Gen ScriptOutput
arbitraryWSHOutput,
Gen ScriptOutput
arbitraryWitOutput
]
else []
arbitrarySimpleOutput :: Ctx -> Gen ScriptOutput
arbitrarySimpleOutput :: Ctx -> Gen ScriptOutput
arbitrarySimpleOutput Ctx
ctx =
[Gen ScriptOutput] -> Gen ScriptOutput
forall a. [Gen a] -> Gen a
oneof
[ Ctx -> Gen ScriptOutput
arbitraryPKOutput Ctx
ctx,
Gen ScriptOutput
arbitraryPKHashOutput,
Ctx -> Gen ScriptOutput
arbitraryMSOutput Ctx
ctx
]
arbitraryPKOutput :: Ctx -> Gen ScriptOutput
arbitraryPKOutput :: Ctx -> Gen ScriptOutput
arbitraryPKOutput Ctx
ctx = PublicKey -> ScriptOutput
PayPK (PublicKey -> ScriptOutput)
-> ((PrivateKey, PublicKey) -> PublicKey)
-> (PrivateKey, PublicKey)
-> ScriptOutput
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PrivateKey, PublicKey) -> PublicKey
forall a b. (a, b) -> b
snd ((PrivateKey, PublicKey) -> ScriptOutput)
-> Gen (PrivateKey, PublicKey) -> Gen ScriptOutput
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ctx -> Gen (PrivateKey, PublicKey)
arbitraryKeyPair Ctx
ctx
arbitraryPKHashOutput :: Gen ScriptOutput
arbitraryPKHashOutput :: Gen ScriptOutput
arbitraryPKHashOutput = Hash160 -> ScriptOutput
PayPKHash (Hash160 -> ScriptOutput) -> Gen Hash160 -> Gen ScriptOutput
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Hash160
arbitraryHash160
arbitraryWPKHashOutput :: Gen ScriptOutput
arbitraryWPKHashOutput :: Gen ScriptOutput
arbitraryWPKHashOutput = Hash160 -> ScriptOutput
PayWitnessPKHash (Hash160 -> ScriptOutput) -> Gen Hash160 -> Gen ScriptOutput
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Hash160
arbitraryHash160
arbitraryWSHOutput :: Gen ScriptOutput
arbitraryWSHOutput :: Gen ScriptOutput
arbitraryWSHOutput = Hash256 -> ScriptOutput
PayWitnessScriptHash (Hash256 -> ScriptOutput) -> Gen Hash256 -> Gen ScriptOutput
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Hash256
arbitraryHash256
arbitraryWitOutput :: Gen ScriptOutput
arbitraryWitOutput :: Gen ScriptOutput
arbitraryWitOutput = do
Word8
ver <- (Word8, Word8) -> Gen Word8
forall a. Random a => (a, a) -> Gen a
choose (Word8
1, Word8
16)
Int
len <- (Int, Int) -> Gen Int
forall a. Random a => (a, a) -> Gen a
choose (Int
2, Int
40)
[Word8]
ws <- Int -> Gen Word8 -> Gen [Word8]
forall a. Int -> Gen a -> Gen [a]
vectorOf Int
len Gen Word8
forall a. Arbitrary a => Gen a
arbitrary
let bs :: ByteString
bs = [Word8] -> ByteString
B.pack [Word8]
ws
ScriptOutput -> Gen ScriptOutput
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptOutput -> Gen ScriptOutput)
-> ScriptOutput -> Gen ScriptOutput
forall a b. (a -> b) -> a -> b
$ Word8 -> ByteString -> ScriptOutput
PayWitness Word8
ver ByteString
bs
arbitraryMSOutput :: Ctx -> Gen ScriptOutput
arbitraryMSOutput :: Ctx -> Gen ScriptOutput
arbitraryMSOutput Ctx
ctx = do
(Int
m, Int
n) <- Gen (Int, Int)
arbitraryMSParam
[PublicKey]
keys <- ((PrivateKey, PublicKey) -> PublicKey)
-> [(PrivateKey, PublicKey)] -> [PublicKey]
forall a b. (a -> b) -> [a] -> [b]
map (PrivateKey, PublicKey) -> PublicKey
forall a b. (a, b) -> b
snd ([(PrivateKey, PublicKey)] -> [PublicKey])
-> Gen [(PrivateKey, PublicKey)] -> Gen [PublicKey]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen (PrivateKey, PublicKey) -> Gen [(PrivateKey, PublicKey)]
forall a. Int -> Gen a -> Gen [a]
vectorOf Int
n (Ctx -> Gen (PrivateKey, PublicKey)
arbitraryKeyPair Ctx
ctx)
ScriptOutput -> Gen ScriptOutput
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptOutput -> Gen ScriptOutput)
-> ScriptOutput -> Gen ScriptOutput
forall a b. (a -> b) -> a -> b
$ [PublicKey] -> Int -> ScriptOutput
PayMulSig [PublicKey]
keys Int
m
arbitraryMSOutputC :: Ctx -> Gen ScriptOutput
arbitraryMSOutputC :: Ctx -> Gen ScriptOutput
arbitraryMSOutputC Ctx
ctx = do
(Int
m, Int
n) <- Gen (Int, Int)
arbitraryMSParam
[PublicKey]
keys <-
((PrivateKey, PublicKey) -> PublicKey)
-> [(PrivateKey, PublicKey)] -> [PublicKey]
forall a b. (a -> b) -> [a] -> [b]
map (PrivateKey, PublicKey) -> PublicKey
forall a b. (a, b) -> b
snd
([(PrivateKey, PublicKey)] -> [PublicKey])
-> Gen [(PrivateKey, PublicKey)] -> Gen [PublicKey]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Gen (PrivateKey, PublicKey) -> Gen [(PrivateKey, PublicKey)]
forall a. Int -> Gen a -> Gen [a]
vectorOf Int
n (Ctx -> Gen (PrivateKey, PublicKey)
arbitraryKeyPair Ctx
ctx Gen (PrivateKey, PublicKey)
-> ((PrivateKey, PublicKey) -> Bool) -> Gen (PrivateKey, PublicKey)
forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` ((.compress) (PublicKey -> Bool)
-> ((PrivateKey, PublicKey) -> PublicKey)
-> (PrivateKey, PublicKey)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PrivateKey, PublicKey) -> PublicKey
forall a b. (a, b) -> b
snd))
ScriptOutput -> Gen ScriptOutput
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptOutput -> Gen ScriptOutput)
-> ScriptOutput -> Gen ScriptOutput
forall a b. (a -> b) -> a -> b
$ [PublicKey] -> Int -> ScriptOutput
PayMulSig [PublicKey]
keys Int
m
arbitrarySHOutput :: Gen ScriptOutput
arbitrarySHOutput :: Gen ScriptOutput
arbitrarySHOutput = Hash160 -> ScriptOutput
PayScriptHash (Hash160 -> ScriptOutput)
-> (Address -> Hash160) -> Address -> ScriptOutput
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (.hash160) (Address -> ScriptOutput) -> Gen Address -> Gen ScriptOutput
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen Address
arbitraryScriptAddress
arbitraryDCOutput :: Gen ScriptOutput
arbitraryDCOutput :: Gen ScriptOutput
arbitraryDCOutput = ByteString -> ScriptOutput
DataCarrier (ByteString -> ScriptOutput) -> Gen ByteString -> Gen ScriptOutput
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen ByteString
arbitraryBS1
arbitraryScriptInput :: Network -> Ctx -> Gen ScriptInput
arbitraryScriptInput :: Network -> Ctx -> Gen ScriptInput
arbitraryScriptInput Network
net Ctx
ctx =
[Gen ScriptInput] -> Gen ScriptInput
forall a. [Gen a] -> Gen a
oneof
[ Network -> Ctx -> Gen ScriptInput
arbitraryPKInput Network
net Ctx
ctx,
Network -> Ctx -> Gen ScriptInput
arbitraryPKHashInput Network
net Ctx
ctx,
Network -> Ctx -> Gen ScriptInput
arbitraryMSInput Network
net Ctx
ctx,
Network -> Ctx -> Gen ScriptInput
arbitrarySHInput Network
net Ctx
ctx
]
arbitrarySimpleInput :: Network -> Ctx -> Gen ScriptInput
arbitrarySimpleInput :: Network -> Ctx -> Gen ScriptInput
arbitrarySimpleInput Network
net Ctx
ctx =
[Gen ScriptInput] -> Gen ScriptInput
forall a. [Gen a] -> Gen a
oneof
[ Network -> Ctx -> Gen ScriptInput
arbitraryPKInput Network
net Ctx
ctx,
Network -> Ctx -> Gen ScriptInput
arbitraryPKHashInput Network
net Ctx
ctx,
Network -> Ctx -> Gen ScriptInput
arbitraryMSInput Network
net Ctx
ctx
]
arbitraryPKInput :: Network -> Ctx -> Gen ScriptInput
arbitraryPKInput :: Network -> Ctx -> Gen ScriptInput
arbitraryPKInput Network
net Ctx
ctx = SimpleInput -> ScriptInput
RegularInput (SimpleInput -> ScriptInput)
-> (TxSignature -> SimpleInput) -> TxSignature -> ScriptInput
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TxSignature -> SimpleInput
SpendPK (TxSignature -> ScriptInput) -> Gen TxSignature -> Gen ScriptInput
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Network -> Ctx -> Gen TxSignature
arbitraryTxSignatureEmpty Network
net Ctx
ctx
arbitraryPKHashInput :: Network -> Ctx -> Gen ScriptInput
arbitraryPKHashInput :: Network -> Ctx -> Gen ScriptInput
arbitraryPKHashInput Network
net Ctx
ctx = do
TxSignature
sig <- Network -> Ctx -> Gen TxSignature
arbitraryTxSignatureEmpty Network
net Ctx
ctx
PublicKey
key <- (PrivateKey, PublicKey) -> PublicKey
forall a b. (a, b) -> b
snd ((PrivateKey, PublicKey) -> PublicKey)
-> Gen (PrivateKey, PublicKey) -> Gen PublicKey
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ctx -> Gen (PrivateKey, PublicKey)
arbitraryKeyPair Ctx
ctx
ScriptInput -> Gen ScriptInput
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptInput -> Gen ScriptInput) -> ScriptInput -> Gen ScriptInput
forall a b. (a -> b) -> a -> b
$ SimpleInput -> ScriptInput
RegularInput (SimpleInput -> ScriptInput) -> SimpleInput -> ScriptInput
forall a b. (a -> b) -> a -> b
$ TxSignature -> PublicKey -> SimpleInput
SpendPKHash TxSignature
sig PublicKey
key
arbitraryPKHashInputFull :: Network -> Ctx -> Gen ScriptInput
arbitraryPKHashInputFull :: Network -> Ctx -> Gen ScriptInput
arbitraryPKHashInputFull Network
net Ctx
ctx = do
TxSignature
sig <- (TxHash, SecKey, TxSignature) -> TxSignature
forall a b c. (a, b, c) -> c
lst3 ((TxHash, SecKey, TxSignature) -> TxSignature)
-> Gen (TxHash, SecKey, TxSignature) -> Gen TxSignature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Network -> Ctx -> Gen (TxHash, SecKey, TxSignature)
arbitraryTxSignature Network
net Ctx
ctx
PublicKey
key <- (PrivateKey, PublicKey) -> PublicKey
forall a b. (a, b) -> b
snd ((PrivateKey, PublicKey) -> PublicKey)
-> Gen (PrivateKey, PublicKey) -> Gen PublicKey
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ctx -> Gen (PrivateKey, PublicKey)
arbitraryKeyPair Ctx
ctx
ScriptInput -> Gen ScriptInput
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptInput -> Gen ScriptInput) -> ScriptInput -> Gen ScriptInput
forall a b. (a -> b) -> a -> b
$ SimpleInput -> ScriptInput
RegularInput (SimpleInput -> ScriptInput) -> SimpleInput -> ScriptInput
forall a b. (a -> b) -> a -> b
$ TxSignature -> PublicKey -> SimpleInput
SpendPKHash TxSignature
sig PublicKey
key
arbitraryPKHashInputFullC :: Network -> Ctx -> Gen ScriptInput
arbitraryPKHashInputFullC :: Network -> Ctx -> Gen ScriptInput
arbitraryPKHashInputFullC Network
net Ctx
ctx = do
TxSignature
sig <- (TxHash, SecKey, TxSignature) -> TxSignature
forall a b c. (a, b, c) -> c
lst3 ((TxHash, SecKey, TxSignature) -> TxSignature)
-> Gen (TxHash, SecKey, TxSignature) -> Gen TxSignature
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Network -> Ctx -> Gen (TxHash, SecKey, TxSignature)
arbitraryTxSignature Network
net Ctx
ctx
PublicKey
key <- ((PrivateKey, PublicKey) -> PublicKey)
-> Gen (PrivateKey, PublicKey) -> Gen PublicKey
forall a b. (a -> b) -> Gen a -> Gen b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (PrivateKey, PublicKey) -> PublicKey
forall a b. (a, b) -> b
snd (Gen (PrivateKey, PublicKey) -> Gen PublicKey)
-> Gen (PrivateKey, PublicKey) -> Gen PublicKey
forall a b. (a -> b) -> a -> b
$ Ctx -> Gen (PrivateKey, PublicKey)
arbitraryKeyPair Ctx
ctx Gen (PrivateKey, PublicKey)
-> ((PrivateKey, PublicKey) -> Bool) -> Gen (PrivateKey, PublicKey)
forall a. Gen a -> (a -> Bool) -> Gen a
`suchThat` ((.compress) (PublicKey -> Bool)
-> ((PrivateKey, PublicKey) -> PublicKey)
-> (PrivateKey, PublicKey)
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PrivateKey, PublicKey) -> PublicKey
forall a b. (a, b) -> b
snd)
ScriptInput -> Gen ScriptInput
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptInput -> Gen ScriptInput) -> ScriptInput -> Gen ScriptInput
forall a b. (a -> b) -> a -> b
$ SimpleInput -> ScriptInput
RegularInput (SimpleInput -> ScriptInput) -> SimpleInput -> ScriptInput
forall a b. (a -> b) -> a -> b
$ TxSignature -> PublicKey -> SimpleInput
SpendPKHash TxSignature
sig PublicKey
key
arbitraryMSInput :: Network -> Ctx -> Gen ScriptInput
arbitraryMSInput :: Network -> Ctx -> Gen ScriptInput
arbitraryMSInput Network
net Ctx
ctx = do
Int
m <- (Int, Int) -> Int
forall a b. (a, b) -> a
fst ((Int, Int) -> Int) -> Gen (Int, Int) -> Gen Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Int, Int)
arbitraryMSParam
[TxSignature]
sigs <- Int -> Gen TxSignature -> Gen [TxSignature]
forall a. Int -> Gen a -> Gen [a]
vectorOf Int
m (Network -> Ctx -> Gen TxSignature
arbitraryTxSignatureEmpty Network
net Ctx
ctx)
ScriptInput -> Gen ScriptInput
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptInput -> Gen ScriptInput) -> ScriptInput -> Gen ScriptInput
forall a b. (a -> b) -> a -> b
$ SimpleInput -> ScriptInput
RegularInput (SimpleInput -> ScriptInput) -> SimpleInput -> ScriptInput
forall a b. (a -> b) -> a -> b
$ [TxSignature] -> SimpleInput
SpendMulSig [TxSignature]
sigs
arbitrarySHInput :: Network -> Ctx -> Gen ScriptInput
arbitrarySHInput :: Network -> Ctx -> Gen ScriptInput
arbitrarySHInput Network
net Ctx
ctx = do
ScriptInput
i <- Network -> Ctx -> Gen ScriptInput
arbitrarySimpleInput Network
net Ctx
ctx
SimpleInput -> ScriptOutput -> ScriptInput
ScriptHashInput ScriptInput
i.get (ScriptOutput -> ScriptInput)
-> Gen ScriptOutput -> Gen ScriptInput
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ctx -> Gen ScriptOutput
arbitrarySimpleOutput Ctx
ctx
arbitraryMulSigSHInput :: Network -> Ctx -> Gen ScriptInput
arbitraryMulSigSHInput :: Network -> Ctx -> Gen ScriptInput
arbitraryMulSigSHInput Network
net Ctx
ctx =
Ctx -> Gen ScriptOutput
arbitraryMSOutput Ctx
ctx Gen ScriptOutput
-> (ScriptOutput -> Gen ScriptInput) -> Gen ScriptInput
forall a b. Gen a -> (a -> Gen b) -> Gen b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
rdm :: ScriptOutput
rdm@(PayMulSig [PublicKey]
_ Int
m) -> do
[TxSignature]
sigs <- Int -> Gen TxSignature -> Gen [TxSignature]
forall a. Int -> Gen a -> Gen [a]
vectorOf Int
m (Network -> Ctx -> Gen TxSignature
arbitraryTxSignatureEmpty Network
net Ctx
ctx)
ScriptInput -> Gen ScriptInput
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptInput -> Gen ScriptInput) -> ScriptInput -> Gen ScriptInput
forall a b. (a -> b) -> a -> b
$ SimpleInput -> ScriptOutput -> ScriptInput
ScriptHashInput ([TxSignature] -> SimpleInput
SpendMulSig [TxSignature]
sigs) ScriptOutput
rdm
ScriptOutput
_ -> Gen ScriptInput
forall a. HasCallStack => a
undefined
arbitraryMulSigSHInputC :: Network -> Ctx -> Gen ScriptInput
arbitraryMulSigSHInputC :: Network -> Ctx -> Gen ScriptInput
arbitraryMulSigSHInputC Network
net Ctx
ctx =
Ctx -> Gen ScriptOutput
arbitraryMSOutputC Ctx
ctx Gen ScriptOutput
-> (ScriptOutput -> Gen ScriptInput) -> Gen ScriptInput
forall a b. Gen a -> (a -> Gen b) -> Gen b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
rdm :: ScriptOutput
rdm@(PayMulSig [PublicKey]
_ Int
m) -> do
[TxSignature]
sigs <- Int -> Gen TxSignature -> Gen [TxSignature]
forall a. Int -> Gen a -> Gen [a]
vectorOf Int
m (Network -> Ctx -> Gen TxSignature
arbitraryTxSignatureEmpty Network
net Ctx
ctx)
ScriptInput -> Gen ScriptInput
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptInput -> Gen ScriptInput) -> ScriptInput -> Gen ScriptInput
forall a b. (a -> b) -> a -> b
$ SimpleInput -> ScriptOutput -> ScriptInput
ScriptHashInput ([TxSignature] -> SimpleInput
SpendMulSig [TxSignature]
sigs) ScriptOutput
rdm
ScriptOutput
_ -> Gen ScriptInput
forall a. HasCallStack => a
undefined
arbitraryMulSigSHInputFull :: Network -> Ctx -> Gen ScriptInput
arbitraryMulSigSHInputFull :: Network -> Ctx -> Gen ScriptInput
arbitraryMulSigSHInputFull Network
net Ctx
ctx =
Ctx -> Gen ScriptOutput
arbitraryMSOutput Ctx
ctx Gen ScriptOutput
-> (ScriptOutput -> Gen ScriptInput) -> Gen ScriptInput
forall a b. Gen a -> (a -> Gen b) -> Gen b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
rdm :: ScriptOutput
rdm@(PayMulSig [PublicKey]
_ Int
m) -> do
[TxSignature]
sigs <- ((TxHash, SecKey, TxSignature) -> TxSignature)
-> [(TxHash, SecKey, TxSignature)] -> [TxSignature]
forall a b. (a -> b) -> [a] -> [b]
map (TxHash, SecKey, TxSignature) -> TxSignature
forall a b c. (a, b, c) -> c
lst3 ([(TxHash, SecKey, TxSignature)] -> [TxSignature])
-> Gen [(TxHash, SecKey, TxSignature)] -> Gen [TxSignature]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int
-> Gen (TxHash, SecKey, TxSignature)
-> Gen [(TxHash, SecKey, TxSignature)]
forall a. Int -> Gen a -> Gen [a]
vectorOf Int
m (Network -> Ctx -> Gen (TxHash, SecKey, TxSignature)
arbitraryTxSignature Network
net Ctx
ctx)
ScriptInput -> Gen ScriptInput
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptInput -> Gen ScriptInput) -> ScriptInput -> Gen ScriptInput
forall a b. (a -> b) -> a -> b
$ SimpleInput -> ScriptOutput -> ScriptInput
ScriptHashInput ([TxSignature] -> SimpleInput
SpendMulSig [TxSignature]
sigs) ScriptOutput
rdm
ScriptOutput
_ -> Gen ScriptInput
forall a. HasCallStack => a
undefined
arbitraryMulSigSHInputFullC :: Network -> Ctx -> Gen ScriptInput
arbitraryMulSigSHInputFullC :: Network -> Ctx -> Gen ScriptInput
arbitraryMulSigSHInputFullC Network
net Ctx
ctx =
Ctx -> Gen ScriptOutput
arbitraryMSOutputC Ctx
ctx Gen ScriptOutput
-> (ScriptOutput -> Gen ScriptInput) -> Gen ScriptInput
forall a b. Gen a -> (a -> Gen b) -> Gen b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
rdm :: ScriptOutput
rdm@(PayMulSig [PublicKey]
_ Int
m) -> do
[TxSignature]
sigs <- ((TxHash, SecKey, TxSignature) -> TxSignature)
-> [(TxHash, SecKey, TxSignature)] -> [TxSignature]
forall a b. (a -> b) -> [a] -> [b]
map (TxHash, SecKey, TxSignature) -> TxSignature
forall a b c. (a, b, c) -> c
lst3 ([(TxHash, SecKey, TxSignature)] -> [TxSignature])
-> Gen [(TxHash, SecKey, TxSignature)] -> Gen [TxSignature]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int
-> Gen (TxHash, SecKey, TxSignature)
-> Gen [(TxHash, SecKey, TxSignature)]
forall a. Int -> Gen a -> Gen [a]
vectorOf Int
m (Network -> Ctx -> Gen (TxHash, SecKey, TxSignature)
arbitraryTxSignature Network
net Ctx
ctx)
ScriptInput -> Gen ScriptInput
forall a. a -> Gen a
forall (m :: * -> *) a. Monad m => a -> m a
return (ScriptInput -> Gen ScriptInput) -> ScriptInput -> Gen ScriptInput
forall a b. (a -> b) -> a -> b
$ SimpleInput -> ScriptOutput -> ScriptInput
ScriptHashInput ([TxSignature] -> SimpleInput
SpendMulSig [TxSignature]
sigs) ScriptOutput
rdm
ScriptOutput
_ -> Gen ScriptInput
forall a. HasCallStack => a
undefined