-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Compilation, manipulation and decompilation of Bitcoin scripts
--   
--   Provides pure functions to compile, decompile and manipulate Bitcoin
--   scripts. This project relies heavily on the Haskoin project for the
--   compiling and decompiling of the script assembly, and continuously
--   merges changes downstream. The advantage this library has over Haskoin
--   is that it uses very few dependencies and doesn't rely on external
--   libraries such as LevelDB and snappy.
@package bitcoin-script
@version 0.11.1

module Data.Bitcoin.Script

-- | Decodes a hex representation of a script into a <a>Script</a> object.
decode :: ByteString -> Script

-- | Encodes a <a>Script</a> object into a hex representation
encode :: Script -> ByteString

-- | Data type representing all of the operators allowed inside a
--   <a>Script</a>.
data ScriptOp
OP_PUSHDATA :: ByteString -> PushDataType -> ScriptOp
OP_0 :: ScriptOp
OP_1NEGATE :: ScriptOp
OP_RESERVED :: 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 :: ScriptOp
OP_NOP :: ScriptOp
OP_VER :: ScriptOp
OP_IF :: ScriptOp
OP_NOTIF :: ScriptOp
OP_VERIF :: ScriptOp
OP_VERNOTIF :: ScriptOp
OP_ELSE :: ScriptOp
OP_ENDIF :: ScriptOp
OP_VERIFY :: ScriptOp
OP_RETURN :: ScriptOp
OP_TOALTSTACK :: ScriptOp
OP_FROMALTSTACK :: ScriptOp
OP_IFDUP :: ScriptOp
OP_DEPTH :: ScriptOp
OP_DROP :: ScriptOp
OP_DUP :: ScriptOp
OP_NIP :: ScriptOp
OP_OVER :: ScriptOp
OP_PICK :: ScriptOp
OP_ROLL :: ScriptOp
OP_ROT :: ScriptOp
OP_SWAP :: ScriptOp
OP_TUCK :: ScriptOp
OP_2DROP :: ScriptOp
OP_2DUP :: ScriptOp
OP_3DUP :: ScriptOp
OP_2OVER :: ScriptOp
OP_2ROT :: ScriptOp
OP_2SWAP :: ScriptOp
OP_CAT :: ScriptOp
OP_SUBSTR :: ScriptOp
OP_LEFT :: ScriptOp
OP_RIGHT :: ScriptOp
OP_SIZE :: ScriptOp
OP_INVERT :: ScriptOp
OP_AND :: ScriptOp
OP_OR :: ScriptOp
OP_XOR :: ScriptOp
OP_EQUAL :: ScriptOp
OP_EQUALVERIFY :: ScriptOp
OP_RESERVED1 :: ScriptOp
OP_RESERVED2 :: ScriptOp
OP_1ADD :: ScriptOp
OP_1SUB :: ScriptOp
OP_2MUL :: ScriptOp
OP_2DIV :: ScriptOp
OP_NEGATE :: ScriptOp
OP_ABS :: ScriptOp
OP_NOT :: ScriptOp
OP_0NOTEQUAL :: ScriptOp
OP_ADD :: ScriptOp
OP_SUB :: ScriptOp
OP_MUL :: ScriptOp
OP_DIV :: ScriptOp
OP_MOD :: ScriptOp
OP_LSHIFT :: ScriptOp
OP_RSHIFT :: ScriptOp
OP_BOOLAND :: ScriptOp
OP_BOOLOR :: ScriptOp
OP_NUMEQUAL :: ScriptOp
OP_NUMEQUALVERIFY :: ScriptOp
OP_NUMNOTEQUAL :: ScriptOp
OP_LESSTHAN :: ScriptOp
OP_GREATERTHAN :: ScriptOp
OP_LESSTHANOREQUAL :: ScriptOp
OP_GREATERTHANOREQUAL :: ScriptOp
OP_MIN :: ScriptOp
OP_MAX :: ScriptOp
OP_WITHIN :: ScriptOp
OP_RIPEMD160 :: ScriptOp
OP_SHA1 :: ScriptOp
OP_SHA256 :: ScriptOp
OP_HASH160 :: ScriptOp
OP_HASH256 :: ScriptOp
OP_CODESEPARATOR :: ScriptOp
OP_CHECKSIG :: ScriptOp
OP_CHECKSIGVERIFY :: ScriptOp
OP_CHECKMULTISIG :: ScriptOp
OP_CHECKMULTISIGVERIFY :: ScriptOp
OP_NOP1 :: ScriptOp
OP_NOP2 :: ScriptOp
OP_NOP3 :: ScriptOp
OP_NOP4 :: ScriptOp
OP_NOP5 :: ScriptOp
OP_NOP6 :: ScriptOp
OP_NOP7 :: ScriptOp
OP_NOP8 :: ScriptOp
OP_NOP9 :: ScriptOp
OP_NOP10 :: ScriptOp
OP_PUBKEYHASH :: ScriptOp
OP_PUBKEY :: ScriptOp
OP_INVALIDOPCODE :: Word8 -> ScriptOp

-- | Data type representing a transaction script. Scripts are defined as
--   lists of script operators <a>ScriptOp</a>. Scripts are used to:
--   
--   <ul>
--   <li>Define the spending conditions in the output of a transaction</li>
--   <li>Provide the spending signatures in the input of a transaction</li>
--   </ul>
data Script
Script :: [ScriptOp] -> Script

-- | List of script operators defining this script
[scriptOps] :: Script -> [ScriptOp]

-- | Data type representing the type of an OP_PUSHDATA opcode.
data PushDataType

-- | The next opcode bytes is data to be pushed onto the stack
OPCODE :: PushDataType

-- | The next byte contains the number of bytes to be pushed onto the stack
OPDATA1 :: PushDataType

-- | The next two bytes contains the number of bytes to be pushed onto the
--   stack
OPDATA2 :: PushDataType

-- | The next four bytes contains the number of bytes to be pushed onto the
--   stack
OPDATA4 :: PushDataType
