[
  {
    "path": ".gitignore",
    "content": "\n/.envrc\n"
  },
  {
    "path": "Pipfile",
    "content": "[[source]]\n\nurl = \"https://pypi.python.org/simple\"\nverify_ssl = true\n\n\n[packages]\n\nflask = \"*\"\nrecords = \"*\"\n\"psycopg2\" = \"*\"\nmaya = \"*\"\nflask-sslify = \"*\"\npyquery = \"*\"\npandas = \"*\"\n\"html5lib\" = \"*\"\n\"bs4\" = \"*\"\nrequests = \"*\"\nsimplejson = \"*\"\nflask-cache = \"*\"\nflask-common = \"*\"\naiohttp = \"<2.0.0\"\ncrayons = \"*\"\nscikit-learn = \"*\"\nscipy = \"*\"\npandas-datareader = \"*\"\nnumpy = \"*\"\ntablib = \"==0.12.0\"\nfbprophet = \"*\"\ncython = \"*\"\nflask-graphql = \"*\"\ngraphene = \"*\"\n\"mpld3\" = \"*\"\nraven = {extras = [\"flask\"]}\n\"ruamel.ordereddict\" = {version=\"*\",  markers=\"python_version < '3.0.0'\"}\n\n\n[requires]\n\npython_version = \"3.6\"\n"
  },
  {
    "path": "Procfile",
    "content": "web: gunicorn server:app -k gaiohttp"
  },
  {
    "path": "README.md",
    "content": "# ₿ Coinbin.org\n\n### The Human–Friendly API Service for Crypto Currency Information.\n\nThis free web service exists to provide information on \"coins\". Supports all crypto–currencies.\n\n### Example API Endpoints\n\n`$ curl https://coinbin.org/lbc`\n\n```json\n{\n  \"coin\": {\n    \"name\": \"LBRY Credits\", \n    \"rank\": \"100\", \n    \"ticker\": \"lbc\", \n    \"value\": 0.429737, \n    \"value.currency\": \"USD\"\n  }\n}\n```\n      \n\n`$ curl https://coinbin.org/lbc/42.01`\n\n```json\n{\n  \"coin\": {\n    \"exchange_rate\": 0.429737, \n    \"value\": 18.053251369999998, \n    \"value.currency\": \"USD\"\n  }\n}\n```\n      \n\n`$ curl https://coinbin.org/lbc/to/sc`\n\n```\n{\n  \"coin\": {\n    \"exchange_rate\": 61.98696034733942\n  }\n}\n```\n      \n\n`$ curl https://coinbin.org/lbc/42.01/to/sc`\n\n```json\n{\n  \"coin\": {\n    \"exchange_rate\": 61.98696034733942, \n    \"value\": 2604.072204191729, \n    \"value.coin\": \"sc\"\n  }\n}\n```\n\n`$ curl https://coinbin.org/lbc/history`\n\n```json\n{\n  \"history\": [\n    {\n      \"timestamp\": \"2017-08-24T04:00:55.932092Z\",\n      \"value\": 0.3404,\n      \"value.currency\": \"USD\",\n      \"when\": \"today\"\n    }, ...\n\n... {\n      \"timestamp\": \"2016-07-12T04:01:09.167162Z\",\n      \"value\": 0.239634,\n      \"value.currency\": \"USD\",\n      \"when\": \"Jul 12 2016\"\n    }\n  ]\n}\n```\n\n## More Resources\n\n- [Awesome Crypto Currency Tools & Algorithms (Guide)](https://github.com/kennethreitz/awesome-coins)\n"
  },
  {
    "path": "app.json",
    "content": "{\n  \"name\": \"coinbin.org\",\n  \"scripts\": {\n  },\n  \"env\": {\n    \"API_KEYS\": {\n      \"required\": true\n    },\n    \"HEROKU_POSTGRESQL_AMBER_URL\": {\n      \"required\": true\n    },\n    \"HEROKU_POSTGRESQL_TEAL_URL\": {\n      \"required\": true\n    },\n    \"SENTRY_DSN\": {\n      \"required\": true\n    },\n    \"WEB_CONCURRENCY\": {\n      \"required\": true\n    }\n  },\n  \"formation\": {\n  },\n  \"addons\": [\n    \"heroku-postgresql\",\n    \"heroku-postgresql\",\n    \"sentry\"\n  ],\n  \"buildpacks\": [\n    {\n      \"url\": \"heroku/python\"\n    }\n  ]\n}\n"
  },
  {
    "path": "graph.py",
    "content": "import scraper\n\nimport graphene\n\n\ndef name_to_ticker(name):\n    for coin in scraper.get_coins().values():\n        if coin['name'].lower() == name.lower():\n            return coin['ticker']\n\n\n\nclass Coin(graphene.ObjectType):\n    ticker = graphene.String()\n    name = graphene.String()\n    rank = graphene.Int()\n    usd = graphene.Float()\n\n    @classmethod\n    def from_coin(klass, c):\n\n        klass.ticker = c.ticker\n        klass.name = c.name\n        klass.rank = c.rank\n        klass.usd = c.usd\n\n        return klass\n\n\nclass Query(graphene.ObjectType):\n    coin = graphene.Field(Coin, name=graphene.String())\n    recent_top_coins = graphene.List(Coin)\n\n    @graphene.resolve_only_args\n    def resolve_coin(self, name=None, ticker=None):\n        if name and not ticker:\n            ticker = name_to_ticker(name)\n\n        c = Coin.from_coin(scraper.Coin(ticker))\n\n        c.name = name\n        return c\n\nschema = graphene.Schema(query=Query)"
  },
  {
    "path": "predictions.py",
    "content": "import time\nimport uuid\n\nimport records\nimport os\n\nimport maya\nimport numpy as np\nimport pandas as pd\n\n# Matplotlib hack.\n\nimport matplotlib\nmatplotlib.use('agg')\n\nimport mpld3\nfrom fbprophet import Prophet\n\nfrom scraper import Coin, MWT, convert_to_decimal\n\n\nPERIODS = 30\nGRAPH_PERIODS = 365\n\n\n\n@MWT(timeout=300)\ndef get_predictions(coin, render=False):\n    \"\"\"Returns a list of predictions, unless render is True.\n    Otherwise, returns the path of a rendered image.\n    \"\"\"\n\n    c = Coin(coin)\n\n    q = \"SELECT date as ds, value as y from api_coin WHERE name=:coin\"\n\n    db = records.Database()\n    rows = db.query(q, coin=c.name)\n\n    df = rows.export('df')\n\n    df['y_orig'] = df['y']  # to save a copy of the original data..you'll see why shortly. \n\n    # log-transform y\n    df['y'] = np.log(df['y'])\n\n    model = Prophet(weekly_seasonality=True, yearly_seasonality=True)\n    model.fit(df)\n\n    periods = PERIODS if not render else GRAPH_PERIODS\n\n    future_data = model.make_future_dataframe(periods=periods, freq='d')\n    forecast_data = model.predict(future_data)\n\n    if render:\n        matplotlib.pyplot.gcf()\n        fig = model.plot(forecast_data, xlabel='Date', ylabel='log($)')\n        return mpld3.fig_to_html(fig)\n\n    forecast_data_orig = forecast_data  # make sure we save the original forecast data\n    forecast_data_orig['yhat'] = np.exp(forecast_data_orig['yhat'])\n    forecast_data_orig['yhat_lower'] = np.exp(forecast_data_orig['yhat_lower'])\n    forecast_data_orig['yhat_upper'] = np.exp(forecast_data_orig['yhat_upper'])\n\n    df['y_log'] = df['y']  #copy the log-transformed data to another column\n    df['y'] = df['y_orig']  #copy the original data to 'y'\n\n    # print(forecast_data_orig)\n    d = forecast_data_orig['yhat'].to_dict()\n    predictions = []\n\n    for i, k in enumerate(list(d.keys())[-PERIODS:]):\n        w = maya.when(f'{i+1} days from now')\n        predictions.append({\n            'when': w.slang_time(),\n            'timestamp': w.iso8601(),\n            'usd': convert_to_decimal(d[k]),\n        })\n\n    return predictions\n\n\nif __name__ == '__main__':\n    print(get_predictions('btc'))\n"
  },
  {
    "path": "scraper.py",
    "content": "import pandas\nimport requests\n\nimport crayons\nfrom pyquery import PyQuery as pq\n\nimport time\nfrom collections import OrderedDict\nfrom decimal import Decimal\n\nurl = 'https://coinmarketcap.com/currencies/views/all/'\nsession = requests.Session()\n\n\nclass MWT(object):\n    \"\"\"Memoize With Timeout\"\"\"\n    _caches = {}\n    _timeouts = {}\n\n    def __init__(self, timeout=2):\n        self.timeout = timeout\n\n    def collect(self):\n        \"\"\"Clear cache of results which have timed out\"\"\"\n        for func in self._caches:\n            cache = {}\n            for key in self._caches[func]:\n                if (time.time() - self._caches[func][key][1]) < self._timeouts[func]:\n                    cache[key] = self._caches[func][key]\n            self._caches[func] = cache\n\n    def __call__(self, f):\n        self.cache = self._caches[f] = {}\n        self._timeouts[f] = self.timeout\n\n        def func(*args, **kwargs):\n            kw = sorted(kwargs.items())\n            key = (args, tuple(kw))\n            try:\n                v = self.cache[key]\n                if (time.time() - v[1]) > self.timeout:\n                    raise KeyError\n            except KeyError:\n                v = self.cache[key] = f(*args, **kwargs), time.time()\n            return v[0]\n        func.func_name = f.__name__\n\n        return func\n\n\ndef convert_to_decimal(f):\n    return Decimal(\"{0:.8f}\".format(f))\n\n\nclass Coin():\n    \"\"\"A Coin, unlike Mario's.\"\"\"\n\n    def __init__(self, ticker):\n        self.ticker = ticker\n        self.name = None\n        self.rank = None\n        self._value = None\n\n        self.update()\n\n    def update(self):\n        coins = get_coins()\n        print(f'Fetching data on {crayons.cyan(self.ticker)}...')\n\n        self.name = coins[self.ticker]['name']\n        self.rank = coins[self.ticker]['rank']\n        self._usd = coins[self.ticker]['usd']\n\n    @property\n    def usd(self):\n        return self._usd\n\n    @property\n    def btc(self):\n        coins = get_coins()\n        rate = coins['btc']['usd']\n        return convert_to_decimal(self.usd / rate)\n\n    def value(self, coin):\n        \"\"\"Example: BTC -> ETH\"\"\"\n        return convert_to_decimal(self.btc / Coin(coin).btc)\n\n    def __repr__(self):\n        return f'<Coin ticker={self.ticker!r}>'\n\n\n@MWT(timeout=300)\ndef get_coins():\n    coins_db = OrderedDict()\n\n    print(crayons.yellow('Scraping CoinMaketCap...'))\n\n    r = session.get(url)\n    html = pq(pq(r.content)('table')[0]).html()\n    df = pandas.read_html(\"<table>{}</table>\".format(html))\n    df = pandas.concat(df)\n\n    btc_value = float(df.to_dict()['Price'][0][1:].replace(',', ''))\n\n    for row in df.itertuples():\n\n        rank = int(row[1])\n        name = ' '.join(row[2].split()[1:])\n        ticker = row[3].lower()\n        try:\n            usd = float(row[5][1:].replace(',', ''))\n        except ValueError:\n            usd = 0\n        finally:\n            pass\n\n        btc = convert_to_decimal(usd / btc_value)\n\n        coins_db.update({ticker: {'rank': rank, 'name': name, 'ticker': ticker, 'usd': usd, 'btc': btc}})\n\n    return coins_db\n\n\ndef get_coin(ticker):\n    return Coin(ticker)\n\t\nif __name__ == '__main__':\n\tprint(get_coins())\n"
  },
  {
    "path": "server.py",
    "content": "import os\n\nfrom scraper import get_coins, get_coin, Coin, convert_to_decimal\nfrom predictions import get_predictions\nfrom graph import schema\n\nfrom flask import Flask, jsonify, render_template, request, send_file\nfrom flask_graphql import GraphQLView\nfrom flask_cache import Cache\nfrom flask_common import Common\nfrom flask_sslify import SSLify\n\nimport crayons\nimport maya\nimport requests\nimport records\n\n\nAPI_KEYS = os.environ.get('API_KEYS', '').split(':')\n\ndb = records.Database()\npro_db = records.Database(os.environ['HEROKU_POSTGRESQL_TEAL_URL'])\n\napp = Flask(__name__)\napp.debug = 'DEBUG' in os.environ\n\ncommon = Common(app)\nsslify = SSLify(app)\n\n@app.route('/')\n@common.cache.cached(timeout=60)\ndef hello():\n\n    lbc = get_coin('lbc')\n    lbc_42 = get_value_int('lbc', 42.01)\n    lbc_sc = get_exchange('lbc', 'sc')\n    lbc_42_sc = get_exchange_value('lbc', 'sc', 42.01)\n    lbc_forecast = get_forecast('lbc')\n\n    return render_template('index.html', lbc=lbc, lbc_42=lbc_42, lbc_sc=lbc_sc, lbc_42_sc=lbc_42_sc, coins=get_coins().values(), lbc_forecast=lbc_forecast)\n\n@app.route('/coins')\ndef all_coins():\n    return jsonify(coins=get_coins())\n\n\n@app.route('/<coin>')\ndef get_coin(coin):\n    c = Coin(coin.lower())\n\n    return jsonify(coin={\n        'name': c.name,\n        'ticker': c.ticker,\n        'rank': c.rank,\n        'usd': c.usd,\n        'btc': c.btc\n    })\n\n\n@app.route('/<coin>/forecast')\ndef get_forecast(coin):\n    return jsonify(forecast=get_predictions(coin.lower()))\n\n\n@app.route('/<coin>/forecast/graph')\ndef get_forecast_graph(coin):\n    return get_predictions(coin.lower(), render=True)\n    # return send_file(f_name, mimetype='image/png')\n\n\n@app.route('/<coin>/<float:n>')\ndef get_value(coin, n):\n    c = Coin(coin.lower())\n    return jsonify(coin={\n        'usd': convert_to_decimal(c.usd * n),\n        'exchange_rate': c.usd\n    })\n\n\n@app.route('/<coin>/<int:n>')\ndef get_value_int(coin, n):\n    return get_value(coin, n)\n\n\n@app.route('/<coin>/history')\ndef get_history(coin):\n    c = Coin(coin.lower())\n\n    q = \"SELECT * from api_coin WHERE name=:coin ORDER BY date desc\"\n\n    if request.args.get('key') in API_KEYS:\n        print(crayons.red('Pro request!'))\n        rows = pro_db.query(q, coin=c.name)\n    else:\n        rows = db.query(q, coin=c.name)\n\n    return jsonify(history=[\n        {\n            'value': r.value,\n            'value.currency': 'USD',\n            'timestamp': maya.MayaDT.from_datetime(r.date).subtract(hours=4).iso8601(),\n            'when': maya.MayaDT.from_datetime(r.date).subtract(hours=4).slang_time()\n        } for r in rows]\n    )\n\n@app.route('/<coin1>/to/<coin2>')\ndef get_exchange(coin1, coin2):\n    c = Coin(coin1.lower())\n    return jsonify(coin={\n        # 'name': c.name,\n        # 'ticker': c.ticker,\n        'exchange_rate': c.value(coin2.lower()),\n    })\n\n\n@app.route('/<coin1>/<float:n>/to/<coin2>/')\ndef get_exchange_value(coin1, coin2, n):\n    c = Coin(coin1.lower())\n    v = c.value(coin2.lower())\n    n = convert_to_decimal(n)\n\n    return jsonify(coin={\n        'value': convert_to_decimal(v * n),\n        'value.coin': coin2,\n        'exchange_rate': v\n    })\n\n\n@app.route('/<coin1>/<int:n>/to/<coin2>/')\ndef get_exchange_value_int(coin1, coin2, n):\n    return get_exchange_value(coin1.lower(), coin2, n)\n\n\n# GraphQL stuff.\napp.add_url_rule('/graphql', view_func=GraphQLView.as_view('graphql', schema=schema, graphiql=True))\n# app.add_url_rule('/graphql/batch', view_func=GraphQLView.as_view('graphql', schema=schema, batch=True))\n\n\nif __name__ == '__main__':\n    common.serve()\n"
  },
  {
    "path": "static/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Dave Liepmann\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "static/README.md",
    "content": "Tufte CSS\n=========\nEdward Tufte uses a distinctive style in his handouts: simple, with well-set\ntypography, extensive sidenotes, and tight integration of graphics and\ncharts. `tufte-css` brings that style to HTML documents.\n\nThis project is directly inspired by and\nbased on [Tufte-LaTeX](https://tufte-latex.github.io/tufte-latex/) and the\n[R Markdown Tufte Handout](http://rmarkdown.rstudio.com/examples/tufte-handout.pdf).\n\nGetting Started\n-\nThe file *index.html* is a self-describing demonstration document that walks through\nthe features of Tufte CSS. The live version at\n[https://edwardtufte.github.io/tufte-css/](https://edwardtufte.github.io/tufte-css/)\nis the best overview of the project.\n\nTo use Tufte CSS, just copy `tufte.css` and the `et-book` font\ndirectory to your project and add the following to your HTML doc's\nhead block:\n\n```html\n<link rel=\"stylesheet\" href=\"tufte.css\"/>\n```\n\nAll other files in the repository can be ignored, as they are merely\nused by the demonstration document.\n\nContributing\n-\nIf you notice something wrong or broken, let us know by opening an\nissue. **Pull requests are very welcome**.\n\nFor best results, keep pull requests to one change at a time, and\ntest your fix or new functionality against `index.html` on screens as\nsmall as an iPhone 4 and as big as, well, as big as you use\nnormally. (If you don't have a mobile device handy, fake different\ndevices with your browser's developer tools.)  See the Issues page, especially\n[Help Wanted](https://github.com/edwardtufte/tufte-css/labels/help%20wanted),\nfor opportunities to contribute. Keep our style guide in mind:\n\nCSS Style Guide\n-\n>Every major open-source project has its own style guide: a set of\n>conventions (sometimes arbitrary) about how to write code for that\n>project. It is much easier to understand a large codebase when all the\n>code in it is in a consistent style. <br/>\n> -- [Google Style Guide](https://github.com/google/styleguide)\n\nTufte CSS aims for clarity, concision, and uniformity. Here's a basic\nexample of our CSS conventions:\n\n```css\np { font-size: 1.4rem;\n    line-height: 2rem;\n    margin-top: 1.4rem;\n    margin-bottom: 1.4rem;\n    width: 55%;\n    padding-right: 0;\n    vertical-align: baseline; }\n    \n@media screen and (max-width: 600px) { p { width: 70%; }}\n@media screen and (max-width: 400px) { p { width: 90%; }}\n```\n\nNotice the single spacing between most syntactic markers, the single\nblank lines between unrelated blocks, and the absence of line breaks\nafter an open-paren and before end-parens. Notice also that these\nrules change slightly for media queries.\n\nContributors\n-\n - Dave Liepmann (creator, project maintainer, design)\n - Edward Tufte (editing, direction, design)\n - [Adam Schwartz](https://github.com/adamschwartz) (ET Book font, descender-clearing link underlines)\n - [Clay Harmon](https://github.com/edwardtufte/tufte-css/commits/master?author=clayh53) (media queries, rem units)\n - [Linjie Ding](https://github.com/edwardtufte/tufte-css/commits/master?author=pyrocat101) (italic typeface)\n - [Stephen A Thomas](https://github.com/edwardtufte/tufte-css/commits/master?author=sathomas) (automagically numbered sidenotes)\n - [Ben Newman](https://github.com/edwardtufte/tufte-css/pull/9) (sidenote numbering style)\n - [Kevin Godby](https://github.com/edwardtufte/tufte-css/commits/master?author=godbyk) (booktabs tables)\n - [James Kolce](https://github.com/edwardtufte/tufte-css/commits/master?author=jameskolce) (sidenote fixes)\n - [Chris MacKay](https://github.com/crmackay) (sidenote toggling on small screens)\n - [Paul Rodriguez](https://github.com/edwardtufte/tufte-css/commits/master?author=ruricolist)\n   (sidenote style tweaks)\n - [Claudiu-Vlad Ursache](https://github.com/edwardtufte/tufte-css/commits/master?author=ursachec) (HTML5 conformity)\n\nLicense\n-\nReleased under the MIT license. See [LICENSE](https://github.com/edwardtufte/tufte-css/blob/gh-pages/LICENSE).\n"
  },
  {
    "path": "static/latex.css",
    "content": ".latex-sub, .latex-sup { text-transform: uppercase;\n                         font-size: smaller;\n                         position: relative; }\n\n.latex-sub { top: 0.2rem;\n             margin-left: -0.1667rem;\n             margin-right: -0.125rem; }\n\n.latex-sup { top: -0.2rem;\n             margin-left: -0.36rem;\n             margin-right: -0.15rem;\n             text-shadow: none; }\n\n.latex::selection, .latex span:not(.latex-sup)::selection { text-shadow: 0.03em 0 #b4d5fe, -0.03em 0 #b4d5fe, 0 0.03em #b4d5fe, 0 -0.03em #b4d5fe, 0.06em 0 #b4d5fe, -0.06em 0 #b4d5fe, 0.09em 0 #b4d5fe, -0.09em 0 #b4d5fe, 0.12em 0 #b4d5fe, -0.12em 0 #b4d5fe, 0.15em 0 #b4d5fe, -0.15em 0 #b4d5fe;\n                    background: #b4d5fe; }\n\n.latex::-moz-selection, .latex span:not(.latex-sup)::-moz-selection { text-shadow: 0.03em 0 #b4d5fe, -0.03em 0 #b4d5fe, 0 0.03em #b4d5fe, 0 -0.03em #b4d5fe, 0.06em 0 #b4d5fe, -0.06em 0 #b4d5fe, 0.09em 0 #b4d5fe, -0.09em 0 #b4d5fe, 0.12em 0 #b4d5fe, -0.12em 0 #b4d5fe, 0.15em 0 #b4d5fe, -0.15em 0 #b4d5fe;\n                         background: #b4d5fe; }\n"
  },
  {
    "path": "static/tufte.css",
    "content": "@charset \"UTF-8\";\n\n/* Import ET Book styles\n   adapted from https://github.com/edwardtufte/et-book/blob/gh-pages/et-book.css */\n\n@font-face { font-family: \"et-book\";\n             src: url(\"et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot\");\n             src: url(\"et-book/et-book-roman-line-figures/et-book-roman-line-figures.eot?#iefix\") format(\"embedded-opentype\"), url(\"et-book/et-book-roman-line-figures/et-book-roman-line-figures.woff\") format(\"woff\"), url(\"et-book/et-book-roman-line-figures/et-book-roman-line-figures.ttf\") format(\"truetype\"), url(\"et-book/et-book-roman-line-figures/et-book-roman-line-figures.svg#etbookromanosf\") format(\"svg\");\n             font-weight: normal;\n             font-style: normal; }\n\n@font-face { font-family: \"et-book\";\n             src: url(\"et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot\");\n             src: url(\"et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.eot?#iefix\") format(\"embedded-opentype\"), url(\"et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.woff\") format(\"woff\"), url(\"et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.ttf\") format(\"truetype\"), url(\"et-book/et-book-display-italic-old-style-figures/et-book-display-italic-old-style-figures.svg#etbookromanosf\") format(\"svg\");\n             font-weight: normal;\n             font-style: italic; }\n\n@font-face { font-family: \"et-book\";\n             src: url(\"et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot\");\n             src: url(\"et-book/et-book-bold-line-figures/et-book-bold-line-figures.eot?#iefix\") format(\"embedded-opentype\"), url(\"et-book/et-book-bold-line-figures/et-book-bold-line-figures.woff\") format(\"woff\"), url(\"et-book/et-book-bold-line-figures/et-book-bold-line-figures.ttf\") format(\"truetype\"), url(\"et-book/et-book-bold-line-figures/et-book-bold-line-figures.svg#etbookromanosf\") format(\"svg\");\n             font-weight: bold;\n             font-style: normal; }\n\n@font-face { font-family: \"et-book-roman-old-style\";\n             src: url(\"et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot\");\n             src: url(\"et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.eot?#iefix\") format(\"embedded-opentype\"), url(\"et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.woff\") format(\"woff\"), url(\"et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.ttf\") format(\"truetype\"), url(\"et-book/et-book-roman-old-style-figures/et-book-roman-old-style-figures.svg#etbookromanosf\") format(\"svg\");\n             font-weight: normal;\n             font-style: normal; }\n\n/* Tufte CSS styles */\nhtml { font-size: 15px; }\n\nbody { width: 87.5%;\n       margin-left: auto;\n       margin-right: auto;\n       padding-left: 12.5%;\n       font-family: et-book, Palatino, \"Palatino Linotype\", \"Palatino LT STD\", \"Book Antiqua\", Georgia, serif;\n       background-color: #fffff8;\n       color: #111;\n       max-width: 1400px;\n       counter-reset: sidenote-counter; }\n\nh1 { font-weight: 400;\n     margin-top: 4rem;\n     margin-bottom: 1.5rem;\n     font-size: 3.2rem;\n     line-height: 1; }\n\nh2 { font-style: italic;\n     font-weight: 400;\n     margin-top: 2.1rem;\n     margin-bottom: 0;\n     font-size: 2.2rem;\n     line-height: 1; }\n\nh3 { font-style: italic;\n     font-weight: 400;\n     font-size: 1.7rem;\n     margin-top: 2rem;\n     margin-bottom: 0;\n     line-height: 1; }\n\nhr { display: block;\n     height: 1px;\n     width: 55%;\n     border: 0;\n     border-top: 1px solid #ccc;\n     margin: 1em 0;\n     padding: 0; }\n\np.subtitle { font-style: italic;\n             margin-top: 1rem;\n             margin-bottom: 1rem;\n             font-size: 1.8rem;\n             display: block;\n             line-height: 1; }\n\n.numeral { font-family: et-book-roman-old-style; }\n\n.danger { color: red; }\n\narticle { position: relative;\n          padding: 5rem 0rem; }\n\narticle pre { overflow: auto; }\n\nsection { padding-top: 1rem;\n          padding-bottom: 1rem; }\n\np, ol, ul { font-size: 1.4rem; }\n\np { line-height: 2rem;\n    margin-top: 1.4rem;\n    margin-bottom: 1.4rem;\n    padding-right: 0;\n    vertical-align: baseline; }\n\n/* Chapter Epigraphs */\ndiv.epigraph { margin: 5em 0; }\n\ndiv.epigraph > blockquote { margin-top: 3em;\n                            margin-bottom: 3em; }\n\ndiv.epigraph > blockquote, div.epigraph > blockquote > p { font-style: italic; }\n\ndiv.epigraph > blockquote > footer { font-style: normal; }\n\ndiv.epigraph > blockquote > footer > cite { font-style: italic; }\n/* end chapter epigraphs styles */\n\nblockquote { font-size: 1.4rem; }\n\nblockquote p { width: 55%;\n               margin-right: 40px; }\n\nblockquote footer { width: 55%;\n                    font-size: 1.1rem;\n                    text-align: right; }\n\nsection>ol, section>ul { width: 45%;\n                         -webkit-padding-start: 5%;\n                         -webkit-padding-end: 5%; }\n\nli { padding: 0.5rem 0; }\n\nfigure { padding: 0;\n         border: 0;\n         font-size: 100%;\n         font: inherit;\n         vertical-align: baseline;\n         max-width: 55%;\n         -webkit-margin-start: 0;\n         -webkit-margin-end: 0;\n         margin: 0 0 3em 0; }\n\nfigcaption { float: right;\n             clear: right;\n             margin-top: 0;\n             margin-bottom: 0;\n             font-size: 1.1rem;\n             line-height: 1.6;\n             vertical-align: baseline;\n             position: relative;\n             max-width: 40%; }\n\nfigure.fullwidth figcaption { margin-right: 24%; }\n\n/* Links: replicate underline that clears descenders */\na:link, a:visited { color: inherit; }\n\na:link { text-decoration: none;\n         background: -webkit-linear-gradient(#fffff8, #fffff8), -webkit-linear-gradient(#fffff8, #fffff8), -webkit-linear-gradient(#333, #333);\n         background: linear-gradient(#fffff8, #fffff8), linear-gradient(#fffff8, #fffff8), linear-gradient(#333, #333);\n         -webkit-background-size: 0.05em 1px, 0.05em 1px, 1px 1px;\n         -moz-background-size: 0.05em 1px, 0.05em 1px, 1px 1px;\n         background-size: 0.05em 1px, 0.05em 1px, 1px 1px;\n         background-repeat: no-repeat, no-repeat, repeat-x;\n         text-shadow: 0.03em 0 #fffff8, -0.03em 0 #fffff8, 0 0.03em #fffff8, 0 -0.03em #fffff8, 0.06em 0 #fffff8, -0.06em 0 #fffff8, 0.09em 0 #fffff8, -0.09em 0 #fffff8, 0.12em 0 #fffff8, -0.12em 0 #fffff8, 0.15em 0 #fffff8, -0.15em 0 #fffff8;\n         background-position: 0% 93%, 100% 93%, 0% 93%; }\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) { a:link { background-position-y: 87%, 87%, 87%; } }\n\na:link::selection { text-shadow: 0.03em 0 #b4d5fe, -0.03em 0 #b4d5fe, 0 0.03em #b4d5fe, 0 -0.03em #b4d5fe, 0.06em 0 #b4d5fe, -0.06em 0 #b4d5fe, 0.09em 0 #b4d5fe, -0.09em 0 #b4d5fe, 0.12em 0 #b4d5fe, -0.12em 0 #b4d5fe, 0.15em 0 #b4d5fe, -0.15em 0 #b4d5fe;\n                    background: #b4d5fe; }\n\na:link::-moz-selection { text-shadow: 0.03em 0 #b4d5fe, -0.03em 0 #b4d5fe, 0 0.03em #b4d5fe, 0 -0.03em #b4d5fe, 0.06em 0 #b4d5fe, -0.06em 0 #b4d5fe, 0.09em 0 #b4d5fe, -0.09em 0 #b4d5fe, 0.12em 0 #b4d5fe, -0.12em 0 #b4d5fe, 0.15em 0 #b4d5fe, -0.15em 0 #b4d5fe;\n                         background: #b4d5fe; }\n\n/* Sidenotes, margin notes, figures, captions */\nimg { max-width: 100%; }\n\n.sidenote, .marginnote { float: right;\n                         clear: right;\n                         margin-right: -60%;\n                         width: 50%;\n                         margin-top: 0;\n                         margin-bottom: 0;\n                         font-size: 1.1rem;\n                         line-height: 1.3;\n                         vertical-align: baseline;\n                         position: relative; }\n\n.sidenote-number { counter-increment: sidenote-counter; }\n\n.sidenote-number:after, .sidenote:before { content: counter(sidenote-counter) \" \";\n                                           font-family: et-book-roman-old-style;\n                                           position: relative;\n                                           vertical-align: baseline; }\n\n.sidenote-number:after { content: counter(sidenote-counter);\n                         font-size: 1rem;\n                         top: -0.5rem;\n                         left: 0.1rem; }\n\n.sidenote:before { content: counter(sidenote-counter) \" \";\n                   top: -0.5rem; }\n\nblockquote .sidenote, blockquote .marginnote { margin-right: -82%;\n                                               min-width: 59%;\n                                               text-align: left; }    \n\np, footer, table { width: 55%; }\n\ndiv.fullwidth, table.fullwidth { width: 100%; }\n\ndiv.table-wrapper { overflow-x: auto;\n                    font-family: \"Trebuchet MS\", \"Gill Sans\", \"Gill Sans MT\", sans-serif; }\n\n.sans { font-family: \"Gill Sans\", \"Gill Sans MT\", Calibri, sans-serif;\n        letter-spacing: .03em; }\n\ncode { font-family: Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n       font-size: 1.0rem;\n       line-height: 1.42; }\n\n.sans > code { font-size: 1.2rem; }\n\nh1 > code, h2 > code, h3 > code { font-size: 0.80em; }\n\n.marginnote > code, .sidenote > code { font-size: 1rem; }\n\npre.code { font-size: 0.9rem;\n           width: 52.5%;\n           margin-left: 2.5%;\n           overflow-x: auto; }\n\npre.code.fullwidth { width: 90%; }\n\n.fullwidth { max-width: 90%;\n             clear:both; }\n\nspan.newthought { font-variant: small-caps;\n                  font-size: 1.2em; }\n\ninput.margin-toggle { display: none; }\n\nlabel.sidenote-number { display: inline; }\n\nlabel.margin-toggle:not(.sidenote-number) { display: none; }\n\n@media (max-width: 760px) { body { width: 84%;\n                                   padding-left: 8%;\n                                   padding-right: 8%; }\n                            p, footer { width: 100%; }\n                            pre.code { width: 97%; }\n                            section > ol { width: 90%; }\n                            section > ul { width: 90%; }\n                            figure { max-width: 90%; }\n                            figcaption, figure.fullwidth figcaption { margin-right: 0%;\n                                                                      max-width: none; }\n                            blockquote { margin-left: 1.5em;\n                                         margin-right: 0em; }\n                            blockquote p, blockquote footer { width: 100%; }\n                            label.margin-toggle:not(.sidenote-number) { display: inline; }\n                            .sidenote, .marginnote { display: none; }\n                            .margin-toggle:checked + .sidenote,\n                            .margin-toggle:checked + .marginnote { display: block;\n                                                                   float: left;\n                                                                   left: 1rem;\n                                                                   clear: both;\n                                                                   width: 95%;\n                                                                   margin: 1rem 2.5%;\n                                                                   vertical-align: baseline;\n                                                                   position: relative; }\n                            label { cursor: pointer; }\n                            div.table-wrapper, table { width: 85%; }\n                            img { width: 100%; } }"
  },
  {
    "path": "templates/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\"/>\n    <title>Coinbin.org: A Human–Friendly API Service for Crypto Currency Information</title>\n    <link rel=\"stylesheet\" href=\"{{ url_for('static', filename='tufte.css') }}\"/>\n    <link rel=\"stylesheet\" href=\"{{ url_for('static', filename='latex.css') }}\"/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\">\n\n    <script>\n      function resizeIframe(obj) {\n        obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';\n        obj.style.width = obj.contentWindow.document.body.scrollWidth + 'px';\n      }\n    </script>\n\n  </head>\n\n  <body>\n\n    <article>\n      <h1 id=\"tufte-css\">₿ Coinbin.org</h1>\n\n      <p class=\"subtitle\">A Human–Friendly API Service for Crypto Currency Information.</p>\n\n      <p>This service provides machine (and human) friendly JSON data for all known crypto–currencies. All {{ coins|length }} active &amp; known coins are supported.</p>\n\n      <p>Historical data, exchange rates, conversion ratios, and value conversion endpoints are all available, free of charge. Data is refreshed every five minutes.</p>\n\n      <p>There is no rate limit. There never will be.</p>\n\n\n      <h2>Example API Endpoints</h2>\n      <p></p>\n      <code><strong>$ curl <a href=\"https://coinbin.org/lbc\">https://coinbin.org/lbc</a></strong></code>\n      <!-- <p><small>Returns current market data for any given coin.</small></p> -->\n      <!-- <q>Returns current market data for any given coin.</q> -->\n      <pre>\n{{ lbc.data.decode('utf-8') }}\n      </pre>\n      <p></p>\n<code><strong>$ curl <a href=\"https://coinbin.org/lbc/42.01\">https://coinbin.org/lbc/42.01</a></strong></code>\n      <pre>\n{{ lbc_42.data.decode('utf-8') }}\n      </pre>\n\n      <p></p>\n<code><strong>$ curl <a href=\"https://coinbin.org/lbc/to/sc\">https://coinbin.org/lbc/to/sc</a></strong></code>\n      <pre>\n{{ lbc_sc.data.decode('utf-8') }}\n      </pre>\n\n\n      <p></p>\n<code><strong>$ curl <a href=\"https://coinbin.org/lbc/42.01/to/sc\">https://coinbin.org/lbc/42.01/to/sc</a></strong></code>\n      <pre>\n{{ lbc_42_sc.data.decode('utf-8') }} </pre>\n\n      <p></p>\n<code><strong>$ curl <a href=\"https://coinbin.org/lbc/history\">https://coinbin.org/lbc/history</a></strong></code>\n      <pre>\n{\n  \"history\": [\n    {\n      \"timestamp\": \"2017-08-24T04:00:55.932092Z\",\n      \"value\": 0.3404,\n      \"value.currency\": \"USD\",\n      \"when\": \"today\"\n    }, ...\n\n... {\n      \"timestamp\": \"2016-07-12T04:01:09.167162Z\",\n      \"value\": 0.239634,\n      \"value.currency\": \"USD\",\n      \"when\": \"Jul 12 2016\"\n    }\n  ]\n}</pre>\n<p><small>This endpoint returns up to four years of daily USD data, on any given coin.</small></p>\n\n<h2>Pro Version</h2>\n\n<p>We're collecting historical data, moving forward<label for=\"sn-in-his-later-books\" class=\"margin-toggle sidenote-number\"></label></span><input type=\"checkbox\" id=\"sn-in-his-later-books\" class=\"margin-toggle\"/><span class=\"sidenote\"><em>We may backfill our historical data as well, if customers interest is high.</em></span>, every ten minutes (instead of daily). If you'd like access to this data, <a href=\"mailto:me@kennethreitz.org\">send us an email</a>. We accept payment in coins.</p>\n\n<h2>Experimental (e.g. <em>fun</em>) Endpoints</h2>\n\n      <h3><a href=\"https://coinbin.org/btc/forecast/graph\">Prediction of BTC Price</a> (using <em>machine learning</em>)</h3>\n      <p>&nbsp;</p>\n      <p><em><strong>Note — </strong>This information is presented for informational purposes\n        only, and is not recommended for making actual trading decisions.</em></p>\n\n      <pre><iframe src=\"/btc/forecast/graph\" frameborder=\"0\" scrolling=\"no\" onload=\"resizeIframe(this)\"></iframe></pre>\n\n      <p></p>\n<code><strong>$ curl <a href=\"https://coinbin.org/btc/forecast\">https://coinbin.org/btc/forecast</a></strong></code>\n      <pre>\n{{ lbc_forecast.data.decode('utf-8') }} </pre>\n\n\n<h2>Full List of Supported Coins (Ordered by Rank)</h2>\n\n  <p></p>\n<code><strong>$ curl <a href=\"https://coinbin.org/coins\">https://coinbin.org/coins</a></strong></code>\n      <pre>\n{\n  \"coins\": [{% for coin in coins %}\n    \"<strong><a href=\"/{{ coin['ticker'] }}\">{{ coin['ticker'] }}</a></strong>\":\n      {{ coin|tojson }},{% endfor %}\n  ]\n}\n      </pre>\n\n\n<h2>More Resources</h2>\n<ul>\n\n  <li><a href=\"https://github.com/kennethreitz/awesome-coins\">Awesome Crypto Currency Tools & Algorithms (Guide)</a></li>\n  <li><a href=\"https://github.com/shrayasr/Coinbin.net\">.NET Client for Coinbin.org</a></li>\n</ul>\n\n\n    </article>\n\n  <script type=\"text/javascript\">\n  var _gauges = _gauges || [];\n  (function() {\n    var t   = document.createElement('script');\n    t.type  = 'text/javascript';\n    t.async = true;\n    t.id    = 'gauges-tracker';\n    t.setAttribute('data-site-id', '599e2dbcbad3a763b70d2f2f');\n    t.setAttribute('data-track-path', 'https://track.gaug.es/track.gif');\n    t.src = 'https://d36ee2fcip1434.cloudfront.net/track.js';\n    var s = document.getElementsByTagName('script')[0];\n    s.parentNode.insertBefore(t, s);\n  })();\n</script>\n\n<a href=\"https://github.com/kennethreitz/coinbin.org\" class=\"github-corner\" aria-label=\"View source on Github\">\n  <svg width=\"80\" height=\"80\" viewBox=\"0 0 250 250\" style=\"fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;\" aria-hidden=\"true\">\n    <path d=\"M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z\"></path>\n    <path d=\"M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2\" fill=\"currentColor\" style=\"transform-origin: 130px 106px;\" class=\"octo-arm\"></path>\n    <path d=\"M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z\" fill=\"currentColor\" class=\"octo-body\"></path>\n  </svg>\n</a>\n<style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style>\n\n  </body>\n</html>\n\n"
  },
  {
    "path": "wallets.py",
    "content": "wallets = {\n    'btc': '1PYZH8SCXQF7c2qgpsQ8kDgKixXeYvVsKv',\n    'ltc': 'LXPtxt68njDdTBdu1ZvHUbARhHsPm9T3Zq',\n    'doge': 'DRDjoTo3zg64QHpq3xgrVVJnerLAvVzMbc',\n    'vtc': 'VvNd9XoYKavHagE6VkLNPeAazFmpgMZgQ5',\n    'ppc': 'PMQWpq15QxT4dR6h6NrvrJMNtehcmRVxYW',\n    'ftc': '6zDLXZmoNBdz87ZMvtK2JF7C3NRuKu2nVr',\n    'rdd': 'RudBYrzAQeYmDXHhMXs7hPsYJc7n1C7Trt',\n    'dash': 'XvtKBmKUhiEPQyEgNxvSRt9hyHBCN8Mia7',\n    'pot': 'PTjS6cpqGoUUbEKyUWMqHk92ymvXMi84Ti',\n    'blk': 'BKNihHBXHy24q7wWM6A45xnDWTvcKrcmXN',\n    'emc2': 'EbMSP6TnLgfiJEnL1SUf4N8tjSHsY2L8zA',\n    'xmy': 'MQPjf1pCpKQDVabTXe3do4JTQ9A81oJyHp',\n    'aur': 'AVdVKHAvQij7QWmZ8p8P3qArK1eunrUukK',\n    'gld': 'E6UVrbrd4VnvspMuDqDw7FfMhGAqj26dZE',\n    'fair': 'fVkBYTPiQpcWCmFGSTtxhug2yW2nDZw6x7',\n    'slr': '8WUGQdSjo6XikocLF54KfHfBJ2HQqwtE3t',\n    'ptc': 'LJ7NefEUuJ9DC8qneEW2541p5iJzxNMqyQ',\n    'grs': 'FZg2ceLVCRFaV48C1BViKd1ersC9pxcHeb',\n    'nlg': 'GTEBkz4H73YJgTNhAVtwvwZwUgTsEezVjR',\n    'xwc': 'WXiGQuL7YNhDj93GMdRWJK3gdPMJfQWB8e',\n    'mona': 'MSE8zn8b7tdHnCL45em7nes5BtTQfPuSwc',\n    'enrg': 'eBzzqNtRCsxYLDyKkBT4CSiu2c6hFK8N5X',\n    'rby': 'RRcRzBTcz8HhfNncH9rbKM1hppwMB4EpPj',\n    'thc': 'HMemWrgjEfmgutjkM7C2zMqgpj97SJtW7g',\n    'erc': 'EWeL8eYZRJJZnMFrwMvhidxJsXDcfsELgL',\n    'vrc': 'VUmKQQdfVdsNfSzGtWZddWnv1gD1VuYPSa',\n    'cure': 'BE1rrjqnMPXnLbsTXdbhe13wuRRN1q5qTy',\n    'cloak': 'BtMtdrXRWBw6YMfSsxtkBiRP1wYeFH2Xrk',\n    'bsd': 'iPcwLWBxp2BYfDCyGYbvHbjRCzGL7rjE2U',\n    'start': 'sdvC9GSopsBmJ8VtVmNxKf1xwcGtY9bzwz',\n    'kore': 'K8iJwoL5ojPWw2kjhnWJrNwm1rsoWewErb',\n    'trust': 'TUFooWK6jqDYHKUggZyREvPAeK6nhSYHAX',\n    'nav': 'NUBRSjHJ8h52bqF2d2U4iXzEF3v6fgskw4',\n    'xst': 'S6L8FQGNLhpGEhcZzt4YMYNHq1H98QKkmK',\n    'btcd': 'RCJPmNM6BaNBTiomfJ83c2hEjMpnLjFghe',\n    'via': 'Vcd9Be6s1NePuci1LvC16K21kBytYmRf1t',\n    'uno': 'uZsGhq6VfNpYPUtNqg9fdushmsuc6B9GMA',\n    'pink': '2EjF3ACSNJqudSKZaEeSHvkGqVFg4JtUSA',\n    'ioc': 'iZmhHdNtPGfEVwswTkaLEDEuxrHQFDGD77',\n    'cann': 'CemM7gxYYJK9weV6Ed8sw4B7fvPQgY8hfW',\n    'sys': 'SUNH2SNQqaZvxqqPvuQcBVNdZshPRq2ZTv',\n    'neos': 'NTM232LiTUz8tgXmAWg8TxbrKtcAkDW9Mr',\n    'dgb': 'DA2eLVocFESdqVETtgVLP6k1m319o4g4Yq',\n    'excl': 'EPdycUjUzcYvFFGvTPC8z9NriZ8EgxLL7P',\n    'dope': 'D6NTRES89hzLNYx55AEuqWuAs8rUsR3sVc',\n    'block': 'Ba3yDhGLkiqN28YXoMYgBPuSjKht4a2ZGK',\n    'aby': 'AMbFZwYzjMJHtjJL3fHti2k2JtpfqrX7Ud',\n    'byc': 'BGD2TfaNbN6wq6CZXHMG9fSEWdniVZhJzn',\n    'blitz': 'oWZsQvU3T9FU25FdmRnAousz5CpzXjd6Eg',\n    'bay': 'BFDi3ZSZorDPX17iYrmhRFRSQK5DniqG4v',\n    'spr': 'SYeuSdejAg8jbhrC6pYmwMMPn99egVmyaP',\n    'vtr': 'xr14J4LzdL4jYfRNpP5WdPjtq5dC2YNXiZA27ZayWqC87o4B4UwibZFWr6U5B3B3T7gdjfCqsN5c3btYhFSzBCf2fDL9Bvj1LAPqYQ',\n    'game': 'GMn4k4jXVDjVbSMCWabNguczwADkQxnnRu',\n    'nxs': '2RQbTTGVYJB1qkghsoZunueS71EPfc6KfCbhJqXveLJFCCK4U35',\n    'bitb': '2UjoiH7RmYhvdzJRGXAt5SVeP1iw9MP3Ka',\n    'xvg': 'DAtQMkVj14Vs4jUww8EcnurUGz1c92pBV9',\n    'geo': 'GR7Zj1EsHWc7M3KU5BDhTCSx4y9QR9nEEo',\n    'flo': 'FMSEzFyS9dWhb69ch72VF1ETePnXnb2qxY',\n    'nbt': 'BBijzpMJo92pT4dp1NxwGXY1kBJGxz1QJr',\n    'grc': 'S1t5Jr2WwxZSeSNn8p5RkAAycHa2ZraShi',\n    'mue': '7bSsG2TBa4645qitQsfBPj9Gp7ZW8QTa87',\n    'xvc': 'VpYaBkNXNCtYg3HTP7onhdvhTqtvGBwBCo',\n    'clam': 'xVJ7ySQNPfN3XKmAykTYapuZzZun23xsr5',\n    'dmd': 'dGRJXSHNiF9SoAatLeuoKYxmCbKJ8aXkga',\n    'gam': 'GSqe2k3G2EQQy3QNPwGyyyW33m7eEr6Df6',\n    'sphr': 'BPpGQCDR63NcN6Po9Lvo2D8nqQbhpiSHcE',\n    'ok': 'PGuDs5iu3sEaeAr1kMnMSwNCwJW2xUMTwA',\n    'snrg': 'SYkCDBer4Kap91ftY4cdDfrjnTh3nRvNqk',\n    'pkb': 'PLvXxUE6NrJqvoP1imR8sS23hDCmXoWcxz',\n    'cpc': 'CYWUbfBTAVW9H4zAPRe6yckWWBVRXaznT1',\n    'eth': '0xcf4c939ccae5c0ecc8b63505cce1513e5ef0d567',\n    'gcr': 'GRxryTQ43RET8xfzm38L42wYchim9H3cHf',\n    'tx': 'TixtGQBFrzfFH5Z1ouKjM4UDGqkKXcyw8p',\n    'exp': '0xbc4ee321e752cdd8ca54e4405de71c5f4f5b5f24',\n    'infx': 'iBJzRkcQk6coYUE4UFFDzvfi8Y1URMzyyA',\n    'omni': '15rebjRT6mESSbHU9yyLTh8oADdC4x4RWg',\n    'usdt': '1Ne3DYc5tJSAjS3rwqDt3GSN1FYMrHLPWr',\n    'amp': '13f3KoRoFD5iJw1zdQBw5Hum5EYRs9pB3x',\n    'agrs': '16EPWtBErUnT6fEsKmJfB4gxnJx5qndMCJ',\n    'bta': 'BJD3NHuuiibB85FrxYULSHTgJmye25PRKF',\n    'club': 'Ce9MJXxjasVSbVPntihwote3SjMbfqnvDJ',\n    'vox': 'VV5QjvbWFC9rvWtLyxMvsJDT1FFk9jgbWa',\n    'emc': 'EgPN6YhGXqgTL7np3UtAM2UReMs7eWVD8K',\n    'fct': 'FA3EuMt78kTLHdJsfS65r15xE4acVRtARBfUnKTqfMmGUyTzcNtP',\n    'maid': '1gUbRQjyQX2uJkezY8WY7KSEGGEmD9Zme',\n    'egc': 'EZYWa2KKhzUstJnTZG1SA8zp7stiyrt2Up',\n    'sls': 'SZVpV5LtN9WXdafou3BoHsacDhMcmCjUzr',\n    'rads': 'XcML29TJXQihsV5JmphEVbTPcS6xPkcZFj',\n    'dcr': 'DsUcYM48ZravjWaLCoeAxYQvTcNigqYaQVf',\n    'safex': '1jTMyxf2iP9NxNzMDAZVhQVQskj7zvDj9',\n    'pivx': 'DU6uyNH7E5VPse3hh4RZr4A12VQtM2E3Ue',\n    'meme': 'PCXXZ3NKQUMA26GsX5cjozE48yvM5uUnrR',\n    '2give': 'GpG7ygLvdd3GKsbAUvPRZbMR8GtXa7JizS',\n    'lsk': '3548326455915242856L',\n    'pdc': '12ZeM7mrPnZBM5rZWXh9QpNbe6eSTykxCr',\n    'dgd': '0x7e7cec0a54cbda02b44e6c24a298b2d89b8f3c31',\n    'brk': 'brfTVJS9JGtNX8prmKQBaQtWbtj1b1WJB7X',\n    'waves': '3P6H2V28Zzs9qX3U86Rs5hzTFkcCJrbDJEm',\n    'lbc': 'bVQKmE9tkLHxkjnu97SSe8eQHT9q4c69Zb',\n    'brx': 'bxVriVBdAZ1jXkKFvBAA3zQkS819kZFqWVd',\n    'etc': '0xb52c0534da8d758943e8604916b6be70071bc6d3',\n    'strat': 'Sf8iKKeaAFRX772JA5TWXDwZMJZkJNwmSZ',\n    'unb': '13izqwELn1jTt1j7umfoJKUPRUBBPmwpHv',\n    'ebst': 'e91xYCEFKh2J2VogvUraooeCFUUcCbrUnM',\n    'vrm': 'VXYWrM5h6YE7pU1zPjFpXYcGVoYnLAETyK',\n    'xaur': '0x1253295779080ec136551724a27143e4470073a2',\n    'seq': 'Se8Eg7u1k6izqAW3nmKAwuBewiJu1G2fbD',\n    'sngls': '0x6f4f433ff62347998785e4ed30f3048a2281fd98',\n    'rep': '0x16169642de5a4c43a5f3bcbc5eea36ca767ecc4d',\n    'shift': '3548326455915242856S',\n    'xzc': 'a3vmJpgzqDu4Yg6FPt9uj27m3sBAbMwtRs',\n    'neo': 'AG2dY41SYEMmZLLy5dS1gNwHkWEAshE3ft',\n    'zec': 't1fnCgLKXy7Q1ovFD5obWcH1Vmpp6ivVhJu',\n    'zcl': 't1bHV2hFD8mVoVH2S7KVSfAmdTX615xXGgy',\n    'iop': 'pEP4niYzA8eiPUfCcy5pnPxoETu7zx6n4G',\n    'ubq': '0x98b3ffb0a988308304b32077ba31e5b300be1567',\n    'hkg': '0x1567685a30ee1d1ace1f1e6291b727b1e2ca5eea',\n    'sib': 'Sicrwdsg9mVMCACVJJq23RfqSXiNfH7H2f',\n    'ion': 'ia2ts12ZrprJ9GjsuJChY1HmzeFnwy6k5x',\n    'lmc': 'LZFKYiQRjX3zLaBRMTzF6kaRReoAqsTGgX',\n    'qwark': '0xe4f1f6665f68489f6ff512194553918df13a1ae6',\n    'crw': '12rCC2LwBBuue46KELC9zE9H75Tq9ff492',\n    'swt': '0xaef9799c36cc1459d7876b56383a4a2107bc4b66',\n    'time': '0x1ddcfde92c5c82f5fc919b69478ce65db5446483',\n    'mln': '0x8c1d250c58133ff94b224390c3137d8dc4bf02bc',\n    'tks': '3PESLYrs1s5sNYGBHD8bZnqWvB3pW3BMcWd',\n    'ark': 'AJrDLieoPW46gg3XRANt3J8emDFdQPDUmq',\n    'music': '0x9248334cf30082b5e301bef6fa29642c3170e2e4',\n    'incnt': '3PEuNUJZpE4mjqhHZDCmisGabd4g1qzAeve',\n    'gbyte': 'RYLB7TCEBR4WK3ZEBMGOSLHOPU2COVMZ',\n    'gnt': '0x7da2d058575c81a0b5658878a3b3efed0de142d4',\n    'nxc': '0x06e1d5c1e7dded4b9e32f45845e1d352c0cf8bc5',\n    'edg': '0xdc8e6d7de95fb75774f2b3be2d03efd29d9242e8',\n    'lgd': '0xce7591232523f66b14189c4cec4679e3ab7b3d8e',\n    'trst': '0xa60ff29d26d373a88afbe74f6dbcab3aeca677e6',\n    'wings': '0xb4466e1575882d28388820a719516d1dff412961',\n    'rlc': '0xab916ef71e19c56c98de93d0dba99469b1283db1',\n    'bcc': '1LVojXegSH5EhrNQncWfxg7ErVh4N9HCAL',\n    'qtum': '0x1646d7c096047756ab0b1cb636cf5dd5d36959d2',\n    'part': 'Ph9oGH1vwtsFTHmAwYh3iS9J1vcVhoLXFk',\n    'cvc': '0x584827cad4a2cb47582ebd5a5ee6e4fd5ea63255',\n    'omg': '0xef24cccdad02b96e8bd3c68757c1aab5547ecda7',\n    'adx': '0x36f8b284fa87405389e672d74898d0bf2930a5d9',\n    'storj': '0x05feda4008e2d9253bc339332a29a5a862c8c5d2',\n    'mtl': '0x7b610ddc59fd76c1e8a23ff69904e5d4898bbf78',\n    'pay': '0x3a957df561559587b43eb77b4266c8f0063ec948',\n    'fun': '0xd9a996f367802920aa7bb5bce48de183f45eeb54',\n    'adt': '0x7853d58160a73d538e89278bb036d2b80e00c351',\n    'mco': '0xf3959d90b9b880ee29e62f1210a37fe9b54ce0c1',\n    'snt': '0x3f6526ddd2e452ca6f93033653f0f39ace19f71e',\n    'nmr': '0xcb83ccdd55939de0653b455d7aebf21982357320',\n    'bnt': '0x3363f5a728901533511427d27f3151fe9df152a0',\n    'cfi': '0xa27c5edf5d5ca32a3f3926f7d46d4dcbea43241d',\n    'myst': '0x9dfe066e10215254e7e62c86a30fd0aea1884be3',\n    'ptoy': '0x5bc546675be2ea8b3a56eab0161e7f8c6615930a',\n    'crb': '0x3e12bb90fffebdab71dffca9557a81587d32862f',\n    'qrl': '0x7e4b07296fc5a54031ca133b98546d350c0cd293',\n    '1st': '0x919865c75dd7949fb061e7a2102290b79e4d9150',\n    'bat': '0x04db9cf3de9183f8e5d5b7609c5793e4448c9bf6',\n    'sc': '6197b45062c2d75d8d94d7c7fe4a6530cc6fe6422e0edd9f285d237646b2392541c03005947d',\n    'zen': 'znmGXVrq1UcF3r59C8V75t6zqFkmqMzC4YY',\n    'ant': '0xd54c9c210d286e5bae0e5f59ca8817e9dc2378de',\n    'hmq': '0x0c3a58dc40e933b2031d0cbfe08cf0738f55a17d',\n    'tkn': '0x5a020b51b748b21274078e42b10a7eb3988e89e1',\n    'apx': '0x2c4588d7d92700966fc6101af9b1af4181ab5358',\n    'lun': '0x12c38554537d9677aef623cf7bd9b9460d51045b',\n    'gup': '0xf4b6b5fce73e455e93f80190b7f7e5999864a3de',\n    'gno': '0x8e2118d168713e639b624851958cc5fa46ebce2a',\n    'rlc': '0xab916ef71e19c56c98de93d0dba99469b1283db1'\n}"
  }
]