[
    {
        "name": "Eth.Sentry.ChainCmd",
        "comment": " For dApp Single Page Applications\nIf your EventSentry or TxSentry live at the top level of your model, and you are sending txs or listening to event in your sub-pages,\nuse ChainCmd. See examples.\n\n\n# Core\n\n@docs ChainCmd, Sentry, execute, batch, none, map\n\n\n# TxSentry\n\n@docs sendTx, sendWithReceipt, customSend\n\n\n# EventSentry\n\n@docs watchEvent, watchEventOnce, unWatch\n\n",
        "unions": [
            {
                "name": "ChainCmd",
                "comment": " ",
                "args": [
                    "msg"
                ],
                "cases": []
            }
        ],
        "aliases": [
            {
                "name": "Sentry",
                "comment": " ",
                "args": [
                    "msg"
                ],
                "type": "( TxSentry msg, EventSentry msg )"
            }
        ],
        "values": [
            {
                "name": "batch",
                "comment": " ",
                "type": "List (ChainCmd msg) -> ChainCmd msg"
            },
            {
                "name": "customSend",
                "comment": " ",
                "type": "CustomSend msg -> Send -> ChainCmd msg"
            },
            {
                "name": "execute",
                "comment": " ",
                "type": "Sentry msg -> ChainCmd msg -> ( Sentry msg, Cmd msg )"
            },
            {
                "name": "map",
                "comment": " ",
                "type": "(subMsg -> msg) -> ChainCmd subMsg -> ChainCmd msg"
            },
            {
                "name": "none",
                "comment": " ",
                "type": "ChainCmd msg"
            },
            {
                "name": "sendTx",
                "comment": " ",
                "type": "(Result String Tx -> msg) -> Send -> ChainCmd msg"
            },
            {
                "name": "sendWithReceipt",
                "comment": " ",
                "type": "(Result String Tx -> msg) -> (Result String TxReceipt -> msg) -> Send -> ChainCmd msg"
            },
            {
                "name": "unWatch",
                "comment": " ",
                "type": "LogFilter -> ChainCmd msg"
            },
            {
                "name": "watchEvent",
                "comment": " ",
                "type": "(Value -> msg) -> LogFilter -> ChainCmd msg"
            },
            {
                "name": "watchEventOnce",
                "comment": " ",
                "type": "(Value -> msg) -> LogFilter -> ChainCmd msg"
            }
        ],
        "binops": []
    },
    {
        "name": "Eth.Sentry.Wallet",
        "comment": " Wallet Sentry\n\n@docs WalletSentry, default, decoder, decodeToMsg\n\n",
        "unions": [],
        "aliases": [
            {
                "name": "WalletSentry",
                "comment": " ",
                "args": [],
                "type": "{ account : Maybe Address, networkId : NetworkId }"
            }
        ],
        "values": [
            {
                "name": "decodeToMsg",
                "comment": " ",
                "type": "(String -> msg) -> (WalletSentry -> msg) -> Value -> msg"
            },
            {
                "name": "decoder",
                "comment": " ",
                "type": "Decoder WalletSentry"
            },
            {
                "name": "default",
                "comment": " ",
                "type": "WalletSentry"
            }
        ],
        "binops": []
    },
    {
        "name": "Eth.Sentry.Tx",
        "comment": "\n\n\n# Core\n\n@docs TxSentry, Msg, update, init, OutPort, InPort, listen\n\n\n# Send Txs\n\n@docs send, sendWithReceipt\n\n\n# Custom Send\n\n@docs CustomSend, TxTracker, customSend\n\n\n# Utils\n\n@docs withDebug, changeNode\n\n",
        "unions": [
            {
                "name": "Msg",
                "comment": " ",
                "args": [],
                "cases": []
            },
            {
                "name": "TxSentry",
                "comment": " ",
                "args": [
                    "msg"
                ],
                "cases": []
            }
        ],
        "aliases": [
            {
                "name": "CustomSend",
                "comment": "\n\n    onSign : Message after metamask/wallet has signed tx and returned tx hash\n    onBroadcast : Message after tx is confirmed sitting in tx queue on the node\n    onMined : ( message after tx is mined,\n                (number of blocks deep to watch tx, message on each mined block after tx is sent - stops sending messages when first tuple value is reached)\n              )\n",
                "args": [
                    "msg"
                ],
                "type": "{ onSign : Maybe (Result String TxHash -> msg), onBroadcast : Maybe (Result String Tx -> msg), onMined : Maybe ( Result String TxReceipt -> msg, Maybe { confirmations : Int, toMsg : TxTracker -> msg } ) }"
            },
            {
                "name": "InPort",
                "comment": " The `txIn` subscription.\nWhere information from the outside comes IN to your elm app.\nUsed for getting the TxHash response from Metamask, or other wallets.\n\n     port txIn : (Value -> msg) -> Sub msg\n\n",
                "args": [],
                "type": "(Value -> Msg) -> Sub Msg"
            },
            {
                "name": "OutPort",
                "comment": " The `txOut` port.\nWhere information from your elm app is sent OUT to javascript land.\nUsed for sending `Send` Tx parameters to Metamask, or other wallets.\n\n    port txOut : Value -> Cmd msg\n\n",
                "args": [],
                "type": "Value -> Cmd Msg"
            },
            {
                "name": "TxTracker",
                "comment": " For checking whether a tx has reached a certain block depth (# of confirmations) in a customSend\n",
                "args": [],
                "type": "{ currentDepth : Int, minedInBlock : Int, stopWatchingAtBlock : Int, lastCheckedBlock : Int, txHash : TxHash, doneWatching : Bool, reOrg : Bool }"
            }
        ],
        "values": [
            {
                "name": "changeNode",
                "comment": " Look into the errors this might cause,\nsome kind of cleanup process should probably occur on changing a node.\n",
                "type": "HttpProvider -> TxSentry msg -> TxSentry msg"
            },
            {
                "name": "customSend",
                "comment": " ",
                "type": "TxSentry msg -> CustomSend msg -> Send -> ( TxSentry msg, Cmd msg )"
            },
            {
                "name": "init",
                "comment": " ",
                "type": "( OutPort, InPort ) -> (Msg -> msg) -> HttpProvider -> TxSentry msg"
            },
            {
                "name": "listen",
                "comment": " ",
                "type": "TxSentry msg -> Sub msg"
            },
            {
                "name": "send",
                "comment": " ",
                "type": "(Result String Tx -> msg) -> TxSentry msg -> Send -> ( TxSentry msg, Cmd msg )"
            },
            {
                "name": "sendWithReceipt",
                "comment": " ",
                "type": "(Result String Tx -> msg) -> (Result String TxReceipt -> msg) -> TxSentry msg -> Send -> ( TxSentry msg, Cmd msg )"
            },
            {
                "name": "update",
                "comment": " ",
                "type": "Msg -> TxSentry msg -> ( TxSentry msg, Cmd msg )"
            },
            {
                "name": "withDebug",
                "comment": " ",
                "type": "TxSentry msg -> TxSentry msg"
            }
        ],
        "binops": []
    },
    {
        "name": "Shh",
        "comment": " Whipser API (Use at your own risk! Work in progress)\n\n\n# Whisper messaging\n\n@docs Post, post\n\n\n# Whisper Id's\n\n@docs WhisperId, newIdentity, whisperIdToString, toWhisperId, version\n\n",
        "unions": [],
        "aliases": [
            {
                "name": "Post",
                "comment": " ",
                "args": [],
                "type": "{ from : Maybe String, to : Maybe String, topics : List String, payload : String, priority : Int, ttl : Int }"
            },
            {
                "name": "WhisperId",
                "comment": " ",
                "args": [],
                "type": "WhisperId"
            }
        ],
        "values": [
            {
                "name": "newIdentity",
                "comment": " ",
                "type": "HttpProvider -> Task Error WhisperId"
            },
            {
                "name": "post",
                "comment": " ",
                "type": "HttpProvider -> Post -> Task Error Bool"
            },
            {
                "name": "toWhisperId",
                "comment": " ",
                "type": "String -> Result String WhisperId"
            },
            {
                "name": "version",
                "comment": " ",
                "type": "HttpProvider -> Task Error Int"
            },
            {
                "name": "whisperIdToString",
                "comment": " ",
                "type": "WhisperId -> String"
            }
        ],
        "binops": []
    },
    {
        "name": "Eth.Sentry.Event",
        "comment": " Listen to contract events, and other chain activity\n\n\n# Types\n\n@docs EventSentry, Msg, FilterKey\n\n\n# Core\n\n@docs init, update, changeNode, listen, withDebug\n\n\n# Contract Events/Logs\n\n@docs watch, watchOnce, unWatch, toFilterKey\n\n\n# Blocks\n\n@docs newBlocks, unWatchNewBlocks, nextBlock\n\n\n# Pending Transactions\n\n@docs pendingTxs, unWatchPendingTxs\n\n",
        "unions": [
            {
                "name": "EventSentry",
                "comment": " ",
                "args": [
                    "msg"
                ],
                "cases": []
            },
            {
                "name": "FilterKey",
                "comment": " (Contract Address, Event Topic)\n\nNeed to come up with a better Key scheme to avoid collisions\nMaybe by hashing the Filter params\n\n",
                "args": [],
                "cases": []
            },
            {
                "name": "Msg",
                "comment": " ",
                "args": [],
                "cases": []
            }
        ],
        "aliases": [],
        "values": [
            {
                "name": "changeNode",
                "comment": " ",
                "type": "String -> EventSentry msg -> EventSentry msg"
            },
            {
                "name": "init",
                "comment": " ",
                "type": "(Msg -> msg) -> String -> EventSentry msg"
            },
            {
                "name": "listen",
                "comment": " ",
                "type": "EventSentry msg -> Sub msg"
            },
            {
                "name": "newBlocks",
                "comment": " ",
                "type": "(BlockHead -> msg) -> EventSentry msg -> ( EventSentry msg, Cmd msg )"
            },
            {
                "name": "nextBlock",
                "comment": " ",
                "type": "(BlockHead -> msg) -> EventSentry msg -> ( EventSentry msg, Cmd msg )"
            },
            {
                "name": "pendingTxs",
                "comment": " ",
                "type": "(TxHash -> msg) -> EventSentry msg -> ( EventSentry msg, Cmd msg )"
            },
            {
                "name": "toFilterKey",
                "comment": " ",
                "type": "LogFilter -> FilterKey"
            },
            {
                "name": "unWatch",
                "comment": " ",
                "type": "EventSentry msg -> LogFilter -> ( EventSentry msg, Cmd msg )"
            },
            {
                "name": "unWatchNewBlocks",
                "comment": " ",
                "type": "EventSentry msg -> ( EventSentry msg, Cmd msg )"
            },
            {
                "name": "unWatchPendingTxs",
                "comment": " ",
                "type": "EventSentry msg -> ( EventSentry msg, Cmd msg )"
            },
            {
                "name": "update",
                "comment": " ",
                "type": "Msg -> EventSentry msg -> ( EventSentry msg, Cmd msg )"
            },
            {
                "name": "watch",
                "comment": " ",
                "type": "(Value -> msg) -> EventSentry msg -> LogFilter -> ( EventSentry msg, Cmd msg )"
            },
            {
                "name": "watchOnce",
                "comment": " ",
                "type": "(Value -> msg) -> EventSentry msg -> LogFilter -> ( EventSentry msg, Cmd msg )"
            },
            {
                "name": "withDebug",
                "comment": " ",
                "type": "EventSentry msg -> EventSentry msg"
            }
        ],
        "binops": []
    },
    {
        "name": "Eth.Net",
        "comment": " NetworkId and RPC Methods\n\n@docs NetworkId, version, clientVersion, listening, peerCount, toNetworkId, networkIdToInt, networkIdToString, networkIdDecoder\n\n",
        "unions": [
            {
                "name": "NetworkId",
                "comment": " ",
                "args": [],
                "cases": [
                    [
                        "Mainnet",
                        []
                    ],
                    [
                        "Expanse",
                        []
                    ],
                    [
                        "Ropsten",
                        []
                    ],
                    [
                        "Rinkeby",
                        []
                    ],
                    [
                        "RskMain",
                        []
                    ],
                    [
                        "RskTest",
                        []
                    ],
                    [
                        "Kovan",
                        []
                    ],
                    [
                        "ETCMain",
                        []
                    ],
                    [
                        "ETCTest",
                        []
                    ],
                    [
                        "Private",
                        [
                            "Int"
                        ]
                    ]
                ]
            }
        ],
        "aliases": [],
        "values": [
            {
                "name": "clientVersion",
                "comment": " Get the current client version.\n\n    Ok \"Mist/v0.9.3/darwin/go1.4.1\"\n\n",
                "type": "HttpProvider -> Task Error String"
            },
            {
                "name": "listening",
                "comment": " Returns true if the node is actively listening for network connections.\n",
                "type": "HttpProvider -> Task Error Bool"
            },
            {
                "name": "networkIdDecoder",
                "comment": " Decode a JSON stringy int or JSON int to a NetworkId\n\n    decodeString networkIdDecoder \"1\"          == Ok Mainnet\n    decodeString networkIdDecoder 3            == Ok Ropsten\n    decodeString networkIdDecoder \"five\"       == Err ...\n\n",
                "type": "Decoder NetworkId"
            },
            {
                "name": "networkIdToInt",
                "comment": " Convert an int into it's NetworkId\n",
                "type": "NetworkId -> Int"
            },
            {
                "name": "networkIdToString",
                "comment": " Get a NetworkId's name\n",
                "type": "NetworkId -> String"
            },
            {
                "name": "peerCount",
                "comment": " Get the number of peers currently connected to the client.\n",
                "type": "HttpProvider -> Task Error Int"
            },
            {
                "name": "toNetworkId",
                "comment": " Convert an int into it's NetworkId\n",
                "type": "Int -> NetworkId"
            },
            {
                "name": "version",
                "comment": " Get the current network id.\n\n    Ok Mainnet\n\n",
                "type": "HttpProvider -> Task Error NetworkId"
            }
        ],
        "binops": []
    },
    {
        "name": "Eth.Decode",
        "comment": " Eth Decoders\n\n@docs address, hex, txHash, blockHash, ipfsHash, event, blockHead, tx\n\n",
        "unions": [],
        "aliases": [],
        "values": [
            {
                "name": "address",
                "comment": " ",
                "type": "Decoder Address"
            },
            {
                "name": "blockHash",
                "comment": " ",
                "type": "Decoder BlockHash"
            },
            {
                "name": "blockHead",
                "comment": " ",
                "type": "Decoder BlockHead"
            },
            {
                "name": "event",
                "comment": " Used by [elm-ethereum-generator](https://github.com/cmditch/elm-ethereum-generator)\n\nUseful with `Eth.Sentry.Event` and `LogFilter` related functions in `Eth` module.\n\n",
                "type": "Decoder a -> Decoder (Event a)"
            },
            {
                "name": "hex",
                "comment": " ",
                "type": "Decoder Hex"
            },
            {
                "name": "ipfsHash",
                "comment": " ",
                "type": "Decoder IPFSHash"
            },
            {
                "name": "tx",
                "comment": " ",
                "type": "Decoder Tx"
            },
            {
                "name": "txHash",
                "comment": " ",
                "type": "Decoder TxHash"
            }
        ],
        "binops": []
    },
    {
        "name": "Eth",
        "comment": " Ethereum RPC Methods\n\nSee the [official docs][rpc-docs] for reference.\n\n[rpc-docs]: [https://github.com/ethereum/wiki/wiki/JSON-RPC]\n\n\n# Contracts\n\nMake sure to use the [elm-ethereum-generator](https://github.com/cmditch/elm-ethereum-generator)\nto auto-generate the necessary `Elm <-> Contract` interface from a contract's ABI.\n\nIf you're making Eth transactions, you'll need to build a `Call`,\nconvert it to a `Send`, and use `Eth.Sentry.Tx` to hand it off to your browser's wallet (e.g., MetaMask, Trust).\n\n    ( newSentry, sentryCmd ) =\n        myCallParams\n            |> Eth.toSend\n            |> TxSentry.send TxSendResponse model.txSentry\n\n@docs call, estimateGas, getStorageAt, getCode, callAtBlock, getStorageAtBlock, getCodeAtBlock\n\n\n# Transactions\n\n@docs getTx, getTxReceipt, toSend, encodeSend, sendTx, sendRawTx, getTxByBlockHashAndIndex, getTxByBlockNumberAndIndex\n\n\n# Address/Accounts\n\n@docs getBalance, getTxCount, getBalanceAtBlock, getTxCountAtBlock\n\n\n# Blocks\n\n@docs getBlockNumber, getBlock, getBlockByHash, getBlockWithTxObjs, getBlockByHashWithTxObjs, getBlockTxCount, getBlockTxCountByHash, getUncleCount, getUncleCountByHash, getUncleAtIndex, getUncleByBlockHashAtIndex\n\n\n# Filter/Logs/Events\n\nIf you have access to a websocket RPC endpoint, it's much easier to just use `Eth.Sentry.Event`.\nGeth, Parity, and Infura support websockets.\n\n@docs getLogs, newFilter, newBlockFilter, newPendingTxFilter, getFilterChanges, getFilterLogs, uninstallFilter\n\n\n# Misc\n\n@docs sign, protocolVersion, syncing, coinbase, mining, hashrate, gasPrice, accounts\n\n",
        "unions": [],
        "aliases": [],
        "values": [
            {
                "name": "accounts",
                "comment": " Returns a list of addresses owned by client.\n",
                "type": "HttpProvider -> Task Error (List Address)"
            },
            {
                "name": "call",
                "comment": " Call a function on an Ethereum contract.\nUseful for reading data from contracts, or simulating a transaction before doing a real `Send`.\n\nUse the [elm-ethereum-generator](https://github.com/cmditch/elm-ethereum-generator) code generator to produce an interface for a smart contract from it's ABI.\n\n**Note** The decoder for a call is baked into the Call record to allow for a smoother developer experience.\n\n",
                "type": "HttpProvider -> Call a -> Task Error a"
            },
            {
                "name": "callAtBlock",
                "comment": " Call a function on an Ethereum contract from a particular point in history.\n",
                "type": "HttpProvider -> Call a -> BlockId -> Task Error a"
            },
            {
                "name": "coinbase",
                "comment": " Get the client's coinbase address.\n",
                "type": "HttpProvider -> Task Error Address"
            },
            {
                "name": "encodeSend",
                "comment": " Useful if your handling txParams in javascript land yourself.\n",
                "type": "Send -> Value"
            },
            {
                "name": "estimateGas",
                "comment": " Generates and returns an estimate of how much gas is necessary to allow the transaction to complete.\n\n**Note** that the estimate may be significantly more than the amount of gas actually used by the transaction,\nfor a variety of reasons including EVM mechanics and node performance.\n\n",
                "type": "HttpProvider -> Call a -> Task Error Int"
            },
            {
                "name": "gasPrice",
                "comment": " Get the current price per gas in wei\n\n**Note**: not always accurate. See EthGasStation website\n\n",
                "type": "HttpProvider -> Task Error BigInt"
            },
            {
                "name": "getBalance",
                "comment": " Get the balance of a given address/account.\nReturns Wei amount as BigInt\n",
                "type": "HttpProvider -> Address -> Task Error BigInt"
            },
            {
                "name": "getBalanceAtBlock",
                "comment": " Get the balance of a given address/account, at a certain block height\n",
                "type": "HttpProvider -> Address -> BlockId -> Task Error BigInt"
            },
            {
                "name": "getBlock",
                "comment": " Get information about a block given a valid block number.\n\nThe transactions field will be an array of TxHash's mined during this block.\n\n",
                "type": "HttpProvider -> Int -> Task Error (Block TxHash)"
            },
            {
                "name": "getBlockByHash",
                "comment": " Get information about a block given a valid block hash.\n",
                "type": "HttpProvider -> BlockHash -> Task Error (Block TxHash)"
            },
            {
                "name": "getBlockByHashWithTxObjs",
                "comment": " See `getBlockWithTxObjs` above.\n\nUses block hash instead of number for the identifier.\n\n",
                "type": "HttpProvider -> BlockHash -> Task Error (Block Tx)"
            },
            {
                "name": "getBlockNumber",
                "comment": " Get the block number of the most recently mined block.\n",
                "type": "HttpProvider -> Task Error Int"
            },
            {
                "name": "getBlockTxCount",
                "comment": " Get the number of transactions in a block from a given block number.\n",
                "type": "HttpProvider -> Int -> Task Error Int"
            },
            {
                "name": "getBlockTxCountByHash",
                "comment": " Get the number of transactions in a block from a given block hash.\n",
                "type": "HttpProvider -> BlockHash -> Task Error Int"
            },
            {
                "name": "getBlockWithTxObjs",
                "comment": " Get information about a block given a valid block number.\n\nThe transactions field will be an array of `Tx` objects instead of TxHash's.\n\n",
                "type": "HttpProvider -> Int -> Task Error (Block Tx)"
            },
            {
                "name": "getCode",
                "comment": " Returns the bytecode from a contract at a given contract's address.\n",
                "type": "HttpProvider -> Address -> Task Error String"
            },
            {
                "name": "getCodeAtBlock",
                "comment": " Returns the bytecode from a contract at a given address, at a certain block height.\n",
                "type": "HttpProvider -> Address -> BlockId -> Task Error String"
            },
            {
                "name": "getFilterChanges",
                "comment": " Polling method for a filter, which returns an array of logs which occurred since last poll.\n\nUse the correct decoder for the given filter type:\n\nFor a `newFilter`:\n\n    import Eth.Decode as Decode\n    import Eth.Evm.Decode as Evm\n    import Json.Decode exposing (Decoder)\n    import Json.Decode.Pipeline exposing (custom)\n\n    transferEventDecoder : Decoder (Event Erc20Transfer)\n    transferEventDecoder =\n        Decode.event erc20TransferDecoder\n\n    type alias Erc20Transfer =\n        { from : Address\n        , to : Address\n        , value : BigInt\n        }\n\n    erc20TransferDecoder : Decoder Erc20Transfer\n    erc20TransferDecoder =\n        decode Transfer\n            |> custom (Evm.topic 1 Evm.address)\n            |> custom (Evm.topic 2 Evm.address)\n            |> custom (Evm.data 0 Evm.uint)\n\nFor a `newBlockFilter`:\n\n    newBlockDecoder : Decoder BlockHead\n    newBlockDecoder =\n        Eth.Decode.blockHead\n\nFor a `newPendingTxFilter`:\n\n    newPendingTxDecoder : Decoder TxHash\n    newPendingTxDecoder =\n        Eth.Decode.tx\n\n",
                "type": "HttpProvider -> Decoder a -> FilterId -> Task Error (List a)"
            },
            {
                "name": "getFilterLogs",
                "comment": " Returns an array of all logs matching filter with given id. See above note on decoders.\n",
                "type": "HttpProvider -> Decoder a -> FilterId -> Task Error (List a)"
            },
            {
                "name": "getLogs",
                "comment": " Get an array of all logs matching a given filter object.\nMost likely you won't need this, as they are generated for you in [elm-ethereum-generator](https://github.com/cmditch/elm-ethereum-generator)\n",
                "type": "HttpProvider -> LogFilter -> Task Error (List Log)"
            },
            {
                "name": "getStorageAt",
                "comment": " Returns the value from a storage position at a given address.\nSee Ethereum JSON-RPC methods for specification on retrieving data from complex data structures like maps.\n",
                "type": "HttpProvider -> Address -> Int -> Task Error String"
            },
            {
                "name": "getStorageAtBlock",
                "comment": " Returns the value from a storage position at a given address, at a certain block height.\n",
                "type": "HttpProvider -> Address -> Int -> BlockId -> Task Error String"
            },
            {
                "name": "getTx",
                "comment": " Get transaction information from it's hash.\nIncludes pre-execution info: value, nonce, data/input, gas, gasPrice, to, and from.\n",
                "type": "HttpProvider -> TxHash -> Task Error Tx"
            },
            {
                "name": "getTxByBlockHashAndIndex",
                "comment": " Get a transaction by it's index in a certain block given the block hash.\n",
                "type": "HttpProvider -> BlockHash -> Int -> Task Error Tx"
            },
            {
                "name": "getTxByBlockNumberAndIndex",
                "comment": " Get a transaction by it's index in a certain block given the block number.\n",
                "type": "HttpProvider -> Int -> Int -> Task Error Tx"
            },
            {
                "name": "getTxCount",
                "comment": " Get the number of transactions sent from a given address/account.\n",
                "type": "HttpProvider -> Address -> Task Error Int"
            },
            {
                "name": "getTxCountAtBlock",
                "comment": " Get the number of transactions sent from a given address/account at a given block height.\n",
                "type": "HttpProvider -> Address -> BlockId -> Task Error Int"
            },
            {
                "name": "getTxReceipt",
                "comment": " Get the receipt of a transaction from it's hash.\nOnly exists after the transaction has been mined!\n\nIncludes post-execution info: gasUsed, cumulativeGasUsed, contractAddress, logs, logsBloom.\nAlso includes the tx execution status (only if block is post-byzantium).\n\n",
                "type": "HttpProvider -> TxHash -> Task Error TxReceipt"
            },
            {
                "name": "getUncleAtIndex",
                "comment": " Get information about an uncle given it's index in a block by block number\n",
                "type": "HttpProvider -> Int -> Int -> Task Error Uncle"
            },
            {
                "name": "getUncleByBlockHashAtIndex",
                "comment": " Get information about an uncle given it's index in a block by block hash\n",
                "type": "HttpProvider -> BlockHash -> Int -> Task Error Uncle"
            },
            {
                "name": "getUncleCount",
                "comment": " Get the number of uncles in a given block given a block number.\n",
                "type": "HttpProvider -> Int -> Task Error Int"
            },
            {
                "name": "getUncleCountByHash",
                "comment": " Get the number of uncles in a given block given a block hash.\n",
                "type": "HttpProvider -> BlockHash -> Task Error Int"
            },
            {
                "name": "hashrate",
                "comment": " Returns the number of hashes per second that the node is mining with.\n",
                "type": "HttpProvider -> Task Error Int"
            },
            {
                "name": "mining",
                "comment": " See whether or not a given node is mining.\n",
                "type": "HttpProvider -> Task Error Bool"
            },
            {
                "name": "newBlockFilter",
                "comment": " Creates a filter in the node to notify when a new block arrives.\nTo check if the state has changed, call getFilterChanges.\n",
                "type": "HttpProvider -> Task Error FilterId"
            },
            {
                "name": "newFilter",
                "comment": " Establishes a filter object on a given node.\nUseful for contract events.\n\nTo check if the state has changed, call getFilterChanges.\n\n",
                "type": "HttpProvider -> LogFilter -> Task Error FilterId"
            },
            {
                "name": "newPendingTxFilter",
                "comment": " Creates a filter in the node to notify when new pending transactions arrive.\nTo check if the state has changed, call getFilterChanges.\n",
                "type": "HttpProvider -> Task Error FilterId"
            },
            {
                "name": "protocolVersion",
                "comment": " Get the current ethereum protocol version.\n",
                "type": "HttpProvider -> Task Error Int"
            },
            {
                "name": "sendRawTx",
                "comment": " Broadcast a signed and RLP encoded transaction.\n",
                "type": "HttpProvider -> String -> Task Error TxHash"
            },
            {
                "name": "sendTx",
                "comment": " Execute a transaction on chain.\nOnly useful if your keys live on the node your talking too, which is generally considered very poor practice.\n\nNOTE: You probably don't need this.\nIf you're writing a proper dApp, look at using the `Eth.Sentry.Tx` to interface with wallets like MetaMask.\n\n",
                "type": "HttpProvider -> Send -> Task Error TxHash"
            },
            {
                "name": "sign",
                "comment": " Sign an arbitrary chunk of N bytes.\n\nThe sign method calculates an Ethereum specific signature with: sign(keccak256(\"\\x19Ethereum Signed Message:\\n\" + len(message) + message))).\n\nBy adding a prefix to the message makes the calculated signature recognisable as an Ethereum specific signature.\nThis prevents misuse where a malicious DApp can sign arbitrary data (e.g. transaction) and use the signature to impersonate the victim.\n\n**Note** the address to sign with must be unlocked.\n\n",
                "type": "HttpProvider -> Address -> String -> Task Error String"
            },
            {
                "name": "syncing",
                "comment": " Get the sync status of a particular node.\n\n    Nothing == Not Syncing\n    Just SyncStatus == starting, current, and highestBlock\n\n",
                "type": "HttpProvider -> Task Error (Maybe SyncStatus)"
            },
            {
                "name": "toSend",
                "comment": " Prepare a Call to be executed on chain.\nUsed in `Eth.Sentry.Tx`, a means to interact with MetaMask.\n",
                "type": "Call a -> Send"
            },
            {
                "name": "uninstallFilter",
                "comment": " Uninstalls a filter with given id.\nShould always be called when watch is no longer needed.\nAdditonally Filters timeout when they aren't requested with eth_getFilterChanges for a period of time.\n",
                "type": "HttpProvider -> FilterId -> Task Error FilterId"
            }
        ],
        "binops": []
    },
    {
        "name": "Abi.Decode",
        "comment": " Decode RPC Responses\n\n)\n\n\n# Primitives\n\n@docs AbiDecoder, uint, int, bool, address, string\n\n\n# Bytes\n\n@docs staticBytes, dynamicBytes\n\n\n# Arrays\n\n@docs staticArray, dynamicArray\n\n\n# Special\n\n@docs ipfsHash\n\n\n# Run Decoders\n\n@docs abiDecode, andMap, toElmDecoder, toElmDecoderWithDebug, fromString\n\n\n# Events/Logs\n\n@docs topic, data\n\n",
        "unions": [
            {
                "name": "AbiDecoder",
                "comment": " ",
                "args": [
                    "a"
                ],
                "cases": []
            }
        ],
        "aliases": [],
        "values": [
            {
                "name": "abiDecode",
                "comment": " Similar to Json.Decode.Pipeline.decode\nalso a synonym for Json.Decode.succeed\n",
                "type": "a -> AbiDecoder a"
            },
            {
                "name": "address",
                "comment": " ",
                "type": "AbiDecoder Address"
            },
            {
                "name": "andMap",
                "comment": " ",
                "type": "AbiDecoder a -> AbiDecoder (a -> b) -> AbiDecoder b"
            },
            {
                "name": "bool",
                "comment": " ",
                "type": "AbiDecoder Bool"
            },
            {
                "name": "data",
                "comment": " Useful for decoding data withing events/logs.\n",
                "type": "Int -> AbiDecoder a -> Decoder a"
            },
            {
                "name": "dynamicArray",
                "comment": " Decode Dynamically Sized Arrays\n\n    dynamicArray address == address[]\n\n",
                "type": "AbiDecoder a -> AbiDecoder (List a)"
            },
            {
                "name": "dynamicBytes",
                "comment": " ",
                "type": "AbiDecoder String"
            },
            {
                "name": "fromString",
                "comment": " ",
                "type": "AbiDecoder a -> String -> Result String a"
            },
            {
                "name": "int",
                "comment": " ",
                "type": "AbiDecoder BigInt"
            },
            {
                "name": "ipfsHash",
                "comment": " Decodes bytes32 into IPFS Hash (assuming use of 32 byte sha256)\nNot IPFS future proof. See <https://ethereum.stackexchange.com/questions/17094/how-to-store-ipfs-hash-using-bytes>\n",
                "type": "AbiDecoder IPFSHash"
            },
            {
                "name": "staticArray",
                "comment": " Decode Statically Sized Arrays\n\n    staticArray 10 uint == uint256[10]\n\n",
                "type": "Int -> AbiDecoder a -> AbiDecoder (List a)"
            },
            {
                "name": "staticBytes",
                "comment": " ",
                "type": "Int -> AbiDecoder String"
            },
            {
                "name": "string",
                "comment": " ",
                "type": "AbiDecoder String"
            },
            {
                "name": "toElmDecoder",
                "comment": " ",
                "type": "AbiDecoder a -> Decoder a"
            },
            {
                "name": "toElmDecoderWithDebug",
                "comment": " ",
                "type": "String -> AbiDecoder a -> Decoder a"
            },
            {
                "name": "topic",
                "comment": " Useful for decoding data withing events/logs.\n",
                "type": "Int -> AbiDecoder a -> Decoder a"
            },
            {
                "name": "uint",
                "comment": " ",
                "type": "AbiDecoder BigInt"
            }
        ],
        "binops": []
    },
    {
        "name": "Abi.Encode",
        "comment": " Encode before sending RPC Calls\n\n@docs Encoding, functionCall, functionCallWithDebug\n\n@docs address, uint, int, bool, staticBytes, ipfsHash, custom\n\n\n# Low-Level\n\n@docs abiEncode\n\n",
        "unions": [
            {
                "name": "Encoding",
                "comment": " Not yet implemented : Dynamic Bytes, String, List\n",
                "args": [],
                "cases": []
            }
        ],
        "aliases": [],
        "values": [
            {
                "name": "abiEncode",
                "comment": " ",
                "type": "Encoding -> Hex"
            },
            {
                "name": "address",
                "comment": " ",
                "type": "Address -> Encoding"
            },
            {
                "name": "bool",
                "comment": " ",
                "type": "Bool -> Encoding"
            },
            {
                "name": "custom",
                "comment": " ",
                "type": "String -> Encoding"
            },
            {
                "name": "functionCall",
                "comment": " ",
                "type": "String -> List Encoding -> Hex"
            },
            {
                "name": "functionCallWithDebug",
                "comment": " ",
                "type": "String -> List Encoding -> Hex"
            },
            {
                "name": "int",
                "comment": " ",
                "type": "BigInt -> Encoding"
            },
            {
                "name": "ipfsHash",
                "comment": " ",
                "type": "IPFSHash -> Encoding"
            },
            {
                "name": "staticBytes",
                "comment": " ",
                "type": "Hex -> Encoding"
            },
            {
                "name": "uint",
                "comment": " ",
                "type": "BigInt -> Encoding"
            }
        ],
        "binops": []
    },
    {
        "name": "Eth.Utils",
        "comment": " String/Type Conversion and Application Helpers\n\n\n# Address\n\n@docs toAddress, addressToString, addressToChecksumString, isAddress, isChecksumAddress\n\n\n# Hex\n\n@docs toHex, hexToString, isHex, hexToAscii, hexToUtf8, hexAppend, hexConcat\n\n\n# Transaction Hash\n\n@docs toTxHash, txHashToString, isTxHash\n\n\n# Block Hash\n\n@docs toBlockHash, blockHashToString, isBlockHash\n\n\n# SHA3\n\n@docs functionSig, keccak256, isSha256, lowLevelKeccak256\n\n\n# IPFS\n\n@docs ipfsHashToString, ipfsToBytes32, toIPFSHash, isIPFSHash\n\n\n# Unsafe\n\nUser beware!! These are sidestepping the power of Elm, and it's static types.\n\nUndoubtedly convenient for baking values, like contract addresses, into your source code.\n\nAll values coming from the outside world, like user input or server responses, should use the safe functions.\n\n@docs unsafeToHex, unsafeToAddress, unsafeToTxHash, unsafeToBlockHash, unsafeToIPFSHash\n\n\n# Application Helpers\n\n@docs Retry, retry, valueToMsg\n\n",
        "unions": [],
        "aliases": [
            {
                "name": "Retry",
                "comment": " Config for a `retry` task\n",
                "args": [],
                "type": "{ attempts : Int, sleep : Float }"
            }
        ],
        "values": [
            {
                "name": "addressToChecksumString",
                "comment": " Convert an Address to a string conforming to the EIP-55 checksum.\n\n**Note**: This lowercases all the characters inside the `Address` and runs it through the checksum algorithm.\n\n",
                "type": "Address -> String"
            },
            {
                "name": "addressToString",
                "comment": " Convert an Address to a String\n",
                "type": "Address -> String"
            },
            {
                "name": "blockHashToString",
                "comment": " Convert a given BlockHash to a string.\n",
                "type": "BlockHash -> String"
            },
            {
                "name": "functionSig",
                "comment": " Convert a contract function name to it's 4-byte function signature.\n\n    Utils.functionSig \"transfer(address,uint256)\" == (Hex \"a9059cbb\")\n\n",
                "type": "String -> Hex"
            },
            {
                "name": "hexAppend",
                "comment": " Append two Hex's together.\n\n    hexAppend (Hex 0x12) (Hex 0x34) == Hex 0x1234\n\n",
                "type": "Hex -> Hex -> Hex"
            },
            {
                "name": "hexConcat",
                "comment": " Concatenate a list of Hex's\n\n    hexConcat [ Hex 0x12, Hex 0x34, Hex 0x56 ] == Hex 0x123456\n\n",
                "type": "List Hex -> Hex"
            },
            {
                "name": "hexToAscii",
                "comment": " Convert Given Hex into ASCII. Will fail if Hex is an uneven length.\n",
                "type": "Hex -> Result String String"
            },
            {
                "name": "hexToString",
                "comment": " Convert a `Hex` into a string.\n",
                "type": "Hex -> String"
            },
            {
                "name": "hexToUtf8",
                "comment": " Convert Given Hex into UTF8. Will fail if Hex is an uneven length.\n",
                "type": "Hex -> Result String String"
            },
            {
                "name": "ipfsHashToString",
                "comment": " Convert an IPFSHash to a string.\n",
                "type": "IPFSHash -> String"
            },
            {
                "name": "ipfsToBytes32",
                "comment": " Prepares IPFS Hash to store as soldity bytes32\n\n**Note**: This assumes a SHA256 IPFS hash is used and chops off the \"Qm\".\nAn \"opinionated\" feature of this library that helps save gas costs\nby avoiding the more expensive dynamic types like `string` or `bytes`.\nThe \"Qm\" is there to help future proof IPFS, and allow for other hashing algorithms to be used.\n\n    U.toIPFSHash \"QmNXnCWPS2szLaQGVA6TFtiUAJB2YnFTJJFTXPGuc4wocQ\"\n        |> Result.map U.ipfsToBytes32\n\n    > Ok (Hex \"02d9db84e21354dd4cc160eca9d13fa6f1b1bb44324013204098ae24090e717d\")\n\nCan be decoded safely decoded back to it's \"Qm\"-edness with `Evm.Decode.ipfsHash`.\n\n",
                "type": "IPFSHash -> Hex"
            },
            {
                "name": "isAddress",
                "comment": " Check if given string is a valid address.\n\n**Note**: Works on mixed case strings, with or without the 0x.\n\n",
                "type": "String -> Bool"
            },
            {
                "name": "isBlockHash",
                "comment": " Check if given string is a valid BlockHash.\n\ni.e. Hex and 64 characters long.\n\n",
                "type": "String -> Bool"
            },
            {
                "name": "isChecksumAddress",
                "comment": " Check if given string is a valid checksum address.\n",
                "type": "String -> Bool"
            },
            {
                "name": "isHex",
                "comment": " Check if given string is valid Hex\n",
                "type": "String -> Bool"
            },
            {
                "name": "isIPFSHash",
                "comment": " Check if given string is a valid IPFS Hash.\n",
                "type": "String -> Bool"
            },
            {
                "name": "isSha256",
                "comment": " Checks if a given string is valid hex and 64 chars long.\n",
                "type": "String -> Bool"
            },
            {
                "name": "isTxHash",
                "comment": " Check if given string is a valid TxHash.\n\ni.e. Hex and 64 characters long.\n\n",
                "type": "String -> Bool"
            },
            {
                "name": "keccak256",
                "comment": " Hash a given string into it's SHA3/Keccak256 form.\n",
                "type": "String -> Hex"
            },
            {
                "name": "lowLevelKeccak256",
                "comment": " Same as `ethereum_keccak_256` from [this](http://package.elm-lang.org/packages/prozacchiwawa/elm-keccak/latest) library.\n",
                "type": "List Int -> List Int"
            },
            {
                "name": "retry",
                "comment": " Retry a given `Task` till it succeeds, or runs out of time.\n\nThe below will wait for 5 minutes until giving up, and polls every 5 seconds.\n\n    pollForMinedTx : HttpProvider -> TxHash -> Task Http.Error TxReceipt\n    pollForMinedTx ethNode txHash =\n        Eth.getTxReceipt ethNode txHash\n            |> retry { attempts = 60, sleep = 5 }\n\n",
                "type": "Retry -> Task x a -> Task x a"
            },
            {
                "name": "toAddress",
                "comment": " Safely convert a string into an address.\n\nAll lowercase or uppercase strings, shaped like addresses, will result in `Ok`.\nMixed case strings will return `Err` if the EIP-55 checksum is invalid.\n\n",
                "type": "String -> Result String Address"
            },
            {
                "name": "toBlockHash",
                "comment": " Safely convert a given string to a BlockHash.\n",
                "type": "String -> Result String BlockHash"
            },
            {
                "name": "toHex",
                "comment": " Safely convert a string into Hex.\n",
                "type": "String -> Result String Hex"
            },
            {
                "name": "toIPFSHash",
                "comment": " Safely convert a stringy IPFS Hash to it's properly typed form.\n",
                "type": "String -> Result String IPFSHash"
            },
            {
                "name": "toTxHash",
                "comment": " Safely convert a string to a TxHash.\n",
                "type": "String -> Result String TxHash"
            },
            {
                "name": "txHashToString",
                "comment": " Convert a given TxHash to a string.\n",
                "type": "TxHash -> String"
            },
            {
                "name": "unsafeToAddress",
                "comment": " ",
                "type": "String -> Address"
            },
            {
                "name": "unsafeToBlockHash",
                "comment": " ",
                "type": "String -> BlockHash"
            },
            {
                "name": "unsafeToHex",
                "comment": " ",
                "type": "String -> Hex"
            },
            {
                "name": "unsafeToIPFSHash",
                "comment": " ",
                "type": "String -> IPFSHash"
            },
            {
                "name": "unsafeToTxHash",
                "comment": " ",
                "type": "String -> TxHash"
            },
            {
                "name": "valueToMsg",
                "comment": " Useful for decoding past a result straight into a Msg.\nComes in handy with Eth.Sentry.Event values.\n\n    transferDecoder : Value -> Msg\n    transferDecoder =\n        valueToMsg Transfer Error transferEventDecoder\n\n    type Msg\n        = Transfer (Event Transfer)\n        | Error String\n\n",
                "type": "(a -> msg) -> (String -> msg) -> Decoder a -> Value -> msg"
            }
        ],
        "binops": []
    },
    {
        "name": "Eth.Defaults",
        "comment": " Default values.\nFor those withDefault shenanigans.\n\n@docs invalidAddress, zeroAddress, emptyBlockHash, emptyTxHash, emptyLogFilter\n\n",
        "unions": [],
        "aliases": [],
        "values": [
            {
                "name": "emptyBlockHash",
                "comment": " ",
                "type": "BlockHash"
            },
            {
                "name": "emptyLogFilter",
                "comment": " ",
                "type": "LogFilter"
            },
            {
                "name": "emptyTxHash",
                "comment": " ",
                "type": "TxHash"
            },
            {
                "name": "invalidAddress",
                "comment": " ",
                "type": "Address"
            },
            {
                "name": "zeroAddress",
                "comment": " Danger Will Robinson, why are you using this?\nOnly to burn things should it be used.\n",
                "type": "Address"
            }
        ],
        "binops": []
    },
    {
        "name": "Eth.Types",
        "comment": " Types\n\n\n# Simple\n\n@docs Address, TxHash, BlockHash, Hex\n\n\n# Complex\n\n@docs Call, Send, Tx, TxReceipt, BlockId, Block, Uncle, BlockHead, Log, Event, LogFilter, SyncStatus\n\n\n# Misc\n\n@docs HttpProvider, WebsocketProvider, FilterId, IPFSHash\n\n",
        "unions": [
            {
                "name": "BlockId",
                "comment": " ",
                "args": [],
                "cases": [
                    [
                        "BlockNum",
                        [
                            "Int"
                        ]
                    ],
                    [
                        "EarliestBlock",
                        []
                    ],
                    [
                        "LatestBlock",
                        []
                    ],
                    [
                        "PendingBlock",
                        []
                    ]
                ]
            }
        ],
        "aliases": [
            {
                "name": "Address",
                "comment": " ",
                "args": [],
                "type": "Address"
            },
            {
                "name": "Block",
                "comment": " ",
                "args": [
                    "a"
                ],
                "type": "{ number : Int, hash : BlockHash, parentHash : BlockHash, nonce : String, sha3Uncles : String, logsBloom : String, transactionsRoot : String, stateRoot : String, receiptsRoot : String, miner : Address, difficulty : BigInt, totalDifficulty : BigInt, extraData : String, size : Int, gasLimit : Int, gasUsed : Int, timestamp : Time, transactions : List a, uncles : List String }"
            },
            {
                "name": "BlockHash",
                "comment": " ",
                "args": [],
                "type": "BlockHash"
            },
            {
                "name": "BlockHead",
                "comment": " ",
                "args": [],
                "type": "{ number : Int, hash : BlockHash, parentHash : BlockHash, nonce : String, sha3Uncles : String, logsBloom : String, transactionsRoot : String, stateRoot : String, receiptsRoot : String, miner : Address, difficulty : BigInt, extraData : String, gasLimit : Int, gasUsed : Int, mixHash : String, timestamp : Time }"
            },
            {
                "name": "Call",
                "comment": " ",
                "args": [
                    "a"
                ],
                "type": "{ to : Maybe Address, from : Maybe Address, gas : Maybe Int, gasPrice : Maybe BigInt, value : Maybe BigInt, data : Maybe Hex, nonce : Maybe Int, decoder : Decoder a }"
            },
            {
                "name": "Event",
                "comment": " ",
                "args": [
                    "a"
                ],
                "type": "{ address : Address, data : String, topics : List Hex, removed : Bool, logIndex : Int, transactionIndex : Int, transactionHash : TxHash, blockHash : BlockHash, blockNumber : Int, returnData : a }"
            },
            {
                "name": "FilterId",
                "comment": " ",
                "args": [],
                "type": "String"
            },
            {
                "name": "Hex",
                "comment": " ",
                "args": [],
                "type": "Hex"
            },
            {
                "name": "HttpProvider",
                "comment": " ",
                "args": [],
                "type": "String"
            },
            {
                "name": "IPFSHash",
                "comment": " ",
                "args": [],
                "type": "IPFSHash"
            },
            {
                "name": "Log",
                "comment": " ",
                "args": [],
                "type": "{ address : Address, data : String, topics : List Hex, removed : Bool, logIndex : Int, transactionIndex : Int, transactionHash : TxHash, blockHash : BlockHash, blockNumber : Int }"
            },
            {
                "name": "LogFilter",
                "comment": " NOTE: Different from JSON RPC API, removed some optionality to reduce complexity\n",
                "args": [],
                "type": "{ fromBlock : BlockId, toBlock : BlockId, address : Address, topics : List (Maybe Hex) }"
            },
            {
                "name": "Send",
                "comment": " ",
                "args": [],
                "type": "{ to : Maybe Address, from : Maybe Address, gas : Maybe Int, gasPrice : Maybe BigInt, value : Maybe BigInt, data : Maybe Hex, nonce : Maybe Int }"
            },
            {
                "name": "SyncStatus",
                "comment": " ",
                "args": [],
                "type": "{ startingBlock : Int, currentBlock : Int, highestBlock : Int, knownStates : Int, pulledStates : Int }"
            },
            {
                "name": "Tx",
                "comment": " ",
                "args": [],
                "type": "{ hash : TxHash, nonce : Int, blockHash : Maybe BlockHash, blockNumber : Maybe Int, transactionIndex : Int, from : Address, to : Maybe Address, value : BigInt, gasPrice : BigInt, gas : Int, input : String }"
            },
            {
                "name": "TxHash",
                "comment": " ",
                "args": [],
                "type": "TxHash"
            },
            {
                "name": "TxReceipt",
                "comment": " ",
                "args": [],
                "type": "{ hash : TxHash, index : Int, blockHash : BlockHash, blockNumber : Int, gasUsed : BigInt, cumulativeGasUsed : BigInt, contractAddress : Maybe Address, logs : List Log, logsBloom : String, root : Maybe String, status : Maybe Bool }"
            },
            {
                "name": "Uncle",
                "comment": " ",
                "args": [],
                "type": "Block ()"
            },
            {
                "name": "WebsocketProvider",
                "comment": " ",
                "args": [],
                "type": "String"
            }
        ],
        "values": [],
        "binops": []
    },
    {
        "name": "Eth.Units",
        "comment": " Conversions and Helpers\n\n\n# Concise Units\n\nUseful helpers for concise value declarations.\n\n    txParams : Send\n    txParams =\n        { to = Just myContract\n        , from = Nothing\n        , gas = Nothing\n        , gasPrice = Just (gwei 3)\n        , value = Just (eth 3)\n        , data = Just data\n        , nonce = Nothing\n        }\n\n@docs gwei, eth\n\n\n# Precise Units\n\nHelpers for dealing with floats.\n\n@docs EthUnit, toWei, fromWei, bigIntToWei\n\n",
        "unions": [
            {
                "name": "EthUnit",
                "comment": " Eth Unit\nUseful for displaying to, and taking user input from, the UI\n",
                "args": [],
                "cases": [
                    [
                        "Wei",
                        []
                    ],
                    [
                        "Kwei",
                        []
                    ],
                    [
                        "Mwei",
                        []
                    ],
                    [
                        "Gwei",
                        []
                    ],
                    [
                        "Microether",
                        []
                    ],
                    [
                        "Milliether",
                        []
                    ],
                    [
                        "Ether",
                        []
                    ],
                    [
                        "Kether",
                        []
                    ],
                    [
                        "Mether",
                        []
                    ],
                    [
                        "Gether",
                        []
                    ],
                    [
                        "Tether",
                        []
                    ]
                ]
            }
        ],
        "aliases": [],
        "values": [
            {
                "name": "bigIntToWei",
                "comment": " Convert a given BigInt EthUnit to it's Wei equivalent\n",
                "type": "EthUnit -> BigInt -> BigInt"
            },
            {
                "name": "eth",
                "comment": " ",
                "type": "Int -> BigInt"
            },
            {
                "name": "fromWei",
                "comment": " Convert stringy Wei to a given EthUnit\n\n    fromWei Gwei (BigInt.fromInt 123456789) == \"0.123456789\"\n    fromWei Ether (BigInt.fromInt 123456789) == \"0.000000000123456789\"\n\n**Note** Do not pass anything larger than MAX_SAFE_INTEGER into BigInt.fromInt\nMAX_SAFE_INTEGER == 9007199254740991\n\n",
                "type": "EthUnit -> BigInt -> String"
            },
            {
                "name": "gwei",
                "comment": " ",
                "type": "Int -> BigInt"
            },
            {
                "name": "toWei",
                "comment": " Convert a given stringy EthUnit to it's Wei equivalent\n\n    toWei Gwei \"50\" == Ok (BigInt.fromInt 50000000000)\n    toWei Wei \"40.9123\" == Ok (BigInt.fromInt 40)\n    toWei Kwei \"40.9123\" == Ok (BigInt.fromInt 40912)\n    toWei Gwei \"ten\" == Err\n\n",
                "type": "EthUnit -> String -> Result String BigInt"
            }
        ],
        "binops": []
    },
    {
        "name": "Eth.RPC",
        "comment": " Json RPC Helpers\n@docs RpcRequest, toTask\n\n\n# Low Level\n\n@docs encode, toHttpBody\n\n",
        "unions": [],
        "aliases": [
            {
                "name": "RpcRequest",
                "comment": " ",
                "args": [
                    "a"
                ],
                "type": "{ url : String, method : String, params : List Value, decoder : Decoder a }"
            }
        ],
        "values": [
            {
                "name": "encode",
                "comment": " ",
                "type": "Int -> String -> List Value -> Value"
            },
            {
                "name": "toHttpBody",
                "comment": " ",
                "type": "Int -> String -> List Value -> Body"
            },
            {
                "name": "toTask",
                "comment": " ",
                "type": "RpcRequest a -> Task Error a"
            }
        ],
        "binops": []
    }
]