sig
  type 'a monad_t
  val getbestblockhash :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.blkhash_t Bitcoin.ENGINE.monad_t
  val getblock :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.blkhash_t -> Bitcoin.hexblk_t Bitcoin.ENGINE.monad_t
  val getblock_verbose :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.blkhash_t -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val getblockchaininfo :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val getblockcount :
    ?conn:Bitcoin.conn_t -> unit -> int Bitcoin.ENGINE.monad_t
  val getblockhash :
    ?conn:Bitcoin.conn_t -> int -> Bitcoin.blkhash_t Bitcoin.ENGINE.monad_t
  val getchaintips :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val getdifficulty :
    ?conn:Bitcoin.conn_t -> unit -> float Bitcoin.ENGINE.monad_t
  val getmempoolinfo :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val getrawmempool :
    ?conn:Bitcoin.conn_t ->
    unit -> Bitcoin.txid_t list Bitcoin.ENGINE.monad_t
  val getrawmempool_verbose :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val gettxout :
    ?conn:Bitcoin.conn_t ->
    ?includemempool:bool ->
    Bitcoin.txoutput_t -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val gettxoutsetinfo :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val verifychain :
    ?conn:Bitcoin.conn_t ->
    ?checklevel:int -> ?numblocks:int -> unit -> bool Bitcoin.ENGINE.monad_t
  val stop : ?conn:Bitcoin.conn_t -> unit -> unit Bitcoin.ENGINE.monad_t
  val getgenerate :
    ?conn:Bitcoin.conn_t -> unit -> bool Bitcoin.ENGINE.monad_t
  val setgenerate :
    ?conn:Bitcoin.conn_t ->
    ?genproclimit:int -> bool -> unit Bitcoin.ENGINE.monad_t
  val getblocktemplate :
    ?conn:Bitcoin.conn_t ->
    ?obj:Bitcoin.assoc_t -> unit -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val getmininginfo :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val getnetworkhashps :
    ?conn:Bitcoin.conn_t ->
    ?blocks:int -> ?height:int -> unit -> int Bitcoin.ENGINE.monad_t
  val prioritisetransaction :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.txid_t ->
    float -> Bitcoin.amount_t -> bool Bitcoin.ENGINE.monad_t
  val submitblock :
    ?conn:Bitcoin.conn_t -> Bitcoin.hexblk_t -> unit Bitcoin.ENGINE.monad_t
  val addnode :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.node_t ->
    [ `Add | `Onetry | `Remove ] -> unit Bitcoin.ENGINE.monad_t
  val getaddednodeinfo :
    ?conn:Bitcoin.conn_t ->
    ?node:Bitcoin.node_t ->
    unit -> Bitcoin.node_t list Bitcoin.ENGINE.monad_t
  val getaddednodeinfo_verbose :
    ?conn:Bitcoin.conn_t ->
    ?node:Bitcoin.node_t ->
    unit -> Bitcoin.assoc_t list Bitcoin.ENGINE.monad_t
  val getconnectioncount :
    ?conn:Bitcoin.conn_t -> unit -> int Bitcoin.ENGINE.monad_t
  val getnettotals :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val getnetworkinfo :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val getpeerinfo :
    ?conn:Bitcoin.conn_t ->
    unit -> Bitcoin.assoc_t list Bitcoin.ENGINE.monad_t
  val ping : ?conn:Bitcoin.conn_t -> unit -> unit Bitcoin.ENGINE.monad_t
  val createrawtransaction :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.txoutput_t list ->
    (Bitcoin.address_t * Bitcoin.amount_t) list ->
    Bitcoin.hextx_t Bitcoin.ENGINE.monad_t
  val decoderawtransaction :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.hextx_t -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val decodescript :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.hexspk_t -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val getrawtransaction :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.txid_t -> Bitcoin.hextx_t Bitcoin.ENGINE.monad_t
  val getrawtransaction_verbose :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.txid_t -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val sendrawtransaction :
    ?conn:Bitcoin.conn_t ->
    ?allow_high_fees:bool ->
    Bitcoin.hextx_t -> Bitcoin.txid_t Bitcoin.ENGINE.monad_t
  val signrawtransaction :
    ?conn:Bitcoin.conn_t ->
    ?parents:(Bitcoin.txoutput_t * Bitcoin.hexspk_t) list ->
    ?keys:Bitcoin.priv_t list ->
    ?sighash:[ `All | `None | `Single ] * bool ->
    Bitcoin.hextx_t -> (Bitcoin.hextx_t * bool) Bitcoin.ENGINE.monad_t
  val createmultisig :
    ?conn:Bitcoin.conn_t ->
    int ->
    Bitcoin.multi_t list ->
    (Bitcoin.address_t * Bitcoin.hexspk_t) Bitcoin.ENGINE.monad_t
  val estimatefee :
    ?conn:Bitcoin.conn_t -> int -> Bitcoin.amount_t Bitcoin.ENGINE.monad_t
  val estimatepriority :
    ?conn:Bitcoin.conn_t -> int -> float option Bitcoin.ENGINE.monad_t
  val validateaddress :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.address_t -> Bitcoin.assoc_t option Bitcoin.ENGINE.monad_t
  val verifymessage :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.address_t ->
    Bitcoin.sig_t -> string -> bool Bitcoin.ENGINE.monad_t
  val addmultisigaddress :
    ?conn:Bitcoin.conn_t ->
    ?account:Bitcoin.account_t ->
    int -> Bitcoin.multi_t list -> Bitcoin.address_t Bitcoin.ENGINE.monad_t
  val backupwallet :
    ?conn:Bitcoin.conn_t -> string -> unit Bitcoin.ENGINE.monad_t
  val dumpprivkey :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.address_t -> Bitcoin.priv_t Bitcoin.ENGINE.monad_t
  val dumpwallet :
    ?conn:Bitcoin.conn_t -> string -> unit Bitcoin.ENGINE.monad_t
  val encryptwallet :
    ?conn:Bitcoin.conn_t -> string -> unit Bitcoin.ENGINE.monad_t
  val getaccount :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.address_t -> Bitcoin.account_t Bitcoin.ENGINE.monad_t
  val getaccountaddress :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.account_t -> Bitcoin.address_t Bitcoin.ENGINE.monad_t
  val getaddressesbyaccount :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.account_t -> Bitcoin.address_t list Bitcoin.ENGINE.monad_t
  val getbalance :
    ?conn:Bitcoin.conn_t ->
    ?account:Bitcoin.account_t ->
    ?minconf:int -> unit -> Bitcoin.amount_t Bitcoin.ENGINE.monad_t
  val getnewaddress :
    ?conn:Bitcoin.conn_t ->
    ?account:Bitcoin.account_t ->
    unit -> Bitcoin.address_t Bitcoin.ENGINE.monad_t
  val getrawchangeaddress :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.address_t Bitcoin.ENGINE.monad_t
  val getreceivedbyaccount :
    ?conn:Bitcoin.conn_t ->
    ?minconf:int ->
    Bitcoin.account_t -> Bitcoin.amount_t Bitcoin.ENGINE.monad_t
  val getreceivedbyaddress :
    ?conn:Bitcoin.conn_t ->
    ?minconf:int ->
    Bitcoin.address_t -> Bitcoin.amount_t Bitcoin.ENGINE.monad_t
  val gettransaction :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.txid_t -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val getunconfirmedbalance :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.amount_t Bitcoin.ENGINE.monad_t
  val getwalletinfo :
    ?conn:Bitcoin.conn_t -> unit -> Bitcoin.assoc_t Bitcoin.ENGINE.monad_t
  val importaddress :
    ?conn:Bitcoin.conn_t ->
    ?account:Bitcoin.account_t ->
    ?rescan:bool -> Bitcoin.multi_t -> unit Bitcoin.ENGINE.monad_t
  val importprivkey :
    ?conn:Bitcoin.conn_t ->
    ?account:Bitcoin.account_t ->
    ?rescan:bool -> Bitcoin.priv_t -> unit Bitcoin.ENGINE.monad_t
  val importwallet :
    ?conn:Bitcoin.conn_t -> string -> unit Bitcoin.ENGINE.monad_t
  val keypoolrefill :
    ?conn:Bitcoin.conn_t -> ?size:int -> unit -> unit Bitcoin.ENGINE.monad_t
  val listaccounts :
    ?conn:Bitcoin.conn_t ->
    ?minconf:int ->
    unit ->
    (Bitcoin.account_t * Bitcoin.amount_t) list Bitcoin.ENGINE.monad_t
  val listaddressgroupings :
    ?conn:Bitcoin.conn_t ->
    unit ->
    (Bitcoin.address_t * Bitcoin.amount_t * Bitcoin.account_t) list list
    Bitcoin.ENGINE.monad_t
  val listlockunspent :
    ?conn:Bitcoin.conn_t ->
    unit -> Bitcoin.txoutput_t list Bitcoin.ENGINE.monad_t
  val listreceivedbyaccount :
    ?conn:Bitcoin.conn_t ->
    ?minconf:int ->
    ?includeempty:bool ->
    unit ->
    (Bitcoin.account_t * Bitcoin.amount_t * int) list Bitcoin.ENGINE.monad_t
  val listreceivedbyaddress :
    ?conn:Bitcoin.conn_t ->
    ?minconf:int ->
    ?includeempty:bool ->
    unit ->
    (Bitcoin.address_t * Bitcoin.account_t * Bitcoin.amount_t * int *
     Bitcoin.txid_t list)
    list Bitcoin.ENGINE.monad_t
  val listsinceblock :
    ?conn:Bitcoin.conn_t ->
    ?blockhash:Bitcoin.blkhash_t ->
    ?minconf:int ->
    unit -> (Bitcoin.assoc_t list * Bitcoin.blkhash_t) Bitcoin.ENGINE.monad_t
  val listtransactions :
    ?conn:Bitcoin.conn_t ->
    ?account:Bitcoin.account_t ->
    ?count:int ->
    ?from:int -> unit -> Bitcoin.assoc_t list Bitcoin.ENGINE.monad_t
  val listunspent :
    ?conn:Bitcoin.conn_t ->
    ?minconf:int ->
    ?maxconf:int ->
    ?addresses:Bitcoin.address_t list ->
    unit -> Bitcoin.assoc_t list Bitcoin.ENGINE.monad_t
  val lockunspent :
    ?conn:Bitcoin.conn_t ->
    ?outputs:Bitcoin.txoutput_t list ->
    [ `Lock | `Unlock ] -> bool Bitcoin.ENGINE.monad_t
  val move :
    ?conn:Bitcoin.conn_t ->
    ?minconf:int ->
    ?comment:string ->
    Bitcoin.account_t ->
    Bitcoin.account_t -> Bitcoin.amount_t -> bool Bitcoin.ENGINE.monad_t
  val sendfrom :
    ?conn:Bitcoin.conn_t ->
    ?minconf:int ->
    ?comment:string ->
    ?recipient:string ->
    Bitcoin.account_t ->
    Bitcoin.address_t ->
    Bitcoin.amount_t -> Bitcoin.txid_t Bitcoin.ENGINE.monad_t
  val sendmany :
    ?conn:Bitcoin.conn_t ->
    ?minconf:int ->
    ?comment:string ->
    Bitcoin.account_t ->
    (Bitcoin.address_t * Bitcoin.amount_t) list ->
    Bitcoin.txid_t Bitcoin.ENGINE.monad_t
  val sendtoaddress :
    ?conn:Bitcoin.conn_t ->
    ?comment:string ->
    ?recipient:string ->
    Bitcoin.address_t ->
    Bitcoin.amount_t -> Bitcoin.txid_t Bitcoin.ENGINE.monad_t
  val setaccount :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.address_t -> Bitcoin.account_t -> unit Bitcoin.ENGINE.monad_t
  val settxfee :
    ?conn:Bitcoin.conn_t -> Bitcoin.amount_t -> bool Bitcoin.ENGINE.monad_t
  val signmessage :
    ?conn:Bitcoin.conn_t ->
    Bitcoin.address_t -> string -> Bitcoin.sig_t Bitcoin.ENGINE.monad_t
  val walletlock :
    ?conn:Bitcoin.conn_t -> unit -> unit Bitcoin.ENGINE.monad_t
  val walletpassphrase :
    ?conn:Bitcoin.conn_t -> string -> int -> unit Bitcoin.ENGINE.monad_t
  val walletpassphrasechange :
    ?conn:Bitcoin.conn_t -> string -> string -> unit Bitcoin.ENGINE.monad_t
end