From 5205fa2ba36a041be947318a06795fce006ca30d Mon Sep 17 00:00:00 2001 From: Vamsi Krishna B Date: Mon, 16 Aug 2021 08:11:58 +0530 Subject: [PATCH] Added support for VK --- assets/static/images/onion-alt.png | Bin 0 -> 2116 bytes config/dev.exs | 4 +- .../controllers/page_controller.ex | 72 ++++++++++++- lib/zcash_explorer_web/live/vk_live.ex | 95 ++++++++++++++++++ lib/zcash_explorer_web/router.ex | 8 ++ .../templates/layout/app.html.eex | 1 + .../templates/page/vk.html.eex | 42 +++++++- .../templates/page/vk_txs.html.eex | 8 ++ mix.exs | 3 +- mix.lock | 12 ++- 10 files changed, 230 insertions(+), 15 deletions(-) create mode 100644 assets/static/images/onion-alt.png create mode 100644 lib/zcash_explorer_web/live/vk_live.ex create mode 100644 lib/zcash_explorer_web/templates/page/vk_txs.html.eex diff --git a/assets/static/images/onion-alt.png b/assets/static/images/onion-alt.png new file mode 100644 index 0000000000000000000000000000000000000000..4582ca3fec4783f59c7389f82fb4fd139c3173fa GIT binary patch literal 2116 zcmV-K2)p-*P)#H00004b3#c}2nYxW zdE9$6cIBDMNNtyrR11~fLckS zWogc&g%+h@IT=YcIm%R{GujV^%q+(#D>X%(Y^InP9UIU@hv3;r{1_mR5rhX1;^$ud zvG?Vkd%Wk~cONgVYv#<^XP1?7n6LEXh^b*~=Zz0X>=x5CAj#T>;4T z!12w-SCa0M+NywT2gWrUTvoe%^;PXJAbp3@YK>yf0cxCyfr0tU4GPC<6 zEy{u1!aIb@wMhCqaJHHKT+*JbNdhkEs)4#4PE@-i|JjBM<4P6p_vt{BAXH>oRaL~k=PQ`a+7Zs~$C zx&-L3boNYLcI^)Y-gmTvbOq3l1ABpu=~~2DE)Qb%wJsRvsN`fxTg~j=T>XeFV@e7& zy%_)jrc2r+X$57iE`9PLl2+!7e;aWAu>?5C%pOdGub@(iPD$sHz?ZAI(*wXfjsex1 zA!&0Wz`v)`KK2C8N#!v>A4zKqDBo+qwEqXdp(#n=lHQlM#*mhtxA^n%gX*-u zj!2%fGK|WQ_{^MLt#zycPOb;Cm!!pMJuaX&4IGu$>{SK#ze8p{m-_AC@hY_#mzgb0 zAn&1gaSOOn(jtoA+=vn9yiDCq4FGjBd#DKK6{*n^6mx(RB|Q$@QqZQvno2}v9&kb` zk8K2~Vo-Q-et>?-9d00|1*^%2BrOKcEP7Mm)O0Sfr6Fea{nAZIZ#D?Fm9+dyvoZ%b z$=z=Qc2@x~Q_@^_p9!og0NI~trl35d+llV7thnx;}|=X!5$5 zjRgoHY^d|H)#QAlg|X6teJt0Yx1=Aq`xk-3H98tg^zGRI?`h%=2MOR>;56XPP5>1! z&D?!F&9Lw?`l7<(V zsR?Fw2eq?v1A(una&I$R2u$n58g)s_x&wnHz2IK4Jg2++Qh2nl?mO1qyE|GOLI=c~ALHs(UAde8j4kC*hM19IwBpXfA zzkxHzXm|*rmCEeKWzl2%y=;YFgE$!y?G2w^*wQNakHpP8N58K5DA=M8uQz|20Ix%aBOXEz7BQT(UEx$eFQ z*q^Ce4NOeszCgRXx48RzI)T%HXAM{j{KMU^C&S3y{RN^o0ayc^RnXB?;Hg|)8)eGZ zm$+N9ks|3{D zeHP%79-*9k{fVTn0(}+J-?OW9R&AF0Qg)Zai8i#+6z3s#znNsyvkxzK_iqzJ+lPn> zw9nn=o7tTqgnK2;A!=||b_01O89`)SeSke7gk6#@Yy_pd-wC`_y3U8gOOpxtoSD5h zY4dtXQ`~)zne8LS@W0J;*o)|ip3n4inY-^K?u?9f_id7HpyRXp7%?yKHV>Hf{f=qy%b`q({x{uJraJB&{YY z)-Xx`Ov&DkhR55e^Xo=OQhmLFTaue>0sac?PcipFcfU~ahk@Yk7f5>1-Or_*)U73Z zCH*3Va0kU9Ps7qeOyw-k&BhkRja!#=xPvqJGVl#xNJj_nZ1QvjFvZNqyZh - # IO.inspect(resp) conn |> put_flash(:info, resp) |> render("broadcast.html", @@ -26,7 +26,6 @@ defmodule ZcashExplorerWeb.PageController do ) {:error, reason} -> - # IO.inspect(reason) conn |> put_flash(:error, reason) |> render("broadcast.html", @@ -80,6 +79,73 @@ defmodule ZcashExplorerWeb.PageController do end def vk(conn, _params) do - render(conn, "vk.html", csrf_token: get_csrf_token(), page_title: "Zcash Viewing Key") + height = + case Cachex.get(:app_cache, "metrics") do + {:ok, info} -> + info["blocks"] - 10000 + + {:error, _reason} -> + # hardcoded to canopy + 1_046_400 + end + + render(conn, "vk.html", + csrf_token: get_csrf_token(), + height: height, + page_title: "Zcash Viewing Key" + ) + end + + def do_import_vk(conn, params) do + height = params["scan-height"] + vkey = params["vkey"] + + with true <- String.starts_with?(vkey, "zxview"), + true <- is_integer(String.to_integer(height)), + true <- String.to_integer(height) >= 0 do + cmd = + MuonTrap.cmd("docker", [ + "create", + "-t", + "-i", + "--rm", + "--cpus", + Application.get_env(:zcash_explorer, Zcashex)[:vk_cpus], + "-m", + Application.get_env(:zcash_explorer, Zcashex)[:vk_mem], + "nighthawkapps/vkrunner", + "zecwallet-cli", + "import", + vkey, + height + ]) + + container_id = elem(cmd, 0) |> String.trim_trailing("\n") |> String.slice(0, 12) + task = Task.start(fn -> MuonTrap.cmd("docker", ["start", "-a", "-i", container_id]) end) + + render(conn, "vk_txs.html", + csrf_token: get_csrf_token(), + height: height, + container_id: container_id, + page_title: "Zcash Viewing Key" + ) + else + false -> + conn + |> put_flash(:error, "Invalid Input") + |> render("vk.html", + csrf_token: get_csrf_token(), + height: height, + page_title: "Zcash Viewing Key" + ) + end + end + + def vk_from_zecwalletcli(conn, params) do + container_id = Map.get(params, "hostname") + chan = "VK:" <> "#{container_id}" + txs = Map.get(params, "_json") + Phoenix.PubSub.broadcast(ZcashExplorer.PubSub, chan, {:received_txs, txs}) + json(conn, %{status: "received"}) end end diff --git a/lib/zcash_explorer_web/live/vk_live.ex b/lib/zcash_explorer_web/live/vk_live.ex new file mode 100644 index 0000000..ca6f4c1 --- /dev/null +++ b/lib/zcash_explorer_web/live/vk_live.ex @@ -0,0 +1,95 @@ +defmodule ZcashExplorerWeb.VkLive do + use Phoenix.LiveView + + def render(assigns) do + ~L""" + +
+ <%= @message["message"] %> +
+ + <%= if length(@message["txs"]) > 0 do %> +
+ + + + + + + + + + + + + <%= for tx <- @message["txs"] do %> + + + + + + + + <% end %> + + +
TxAmountAddressDateMemo
+ + <%= tx["txid"] %> + + + <%= ZcashExplorerWeb.AddressView.zatoshi_to_zec(tx["amount"]) %> + + <%= tx["address"] %> + + <%= ZcashExplorerWeb.BlockView.mined_time_rel(tx["datetime"]) %> + + <%= tx["memo"] %> +
+ <% end %> + + + + """ + end + + def mount(params, session, socket) do + if connected?(socket) do + container_id = Map.get(session, "container_id") + Process.send_after(self(), :update, 3000) + subscribed = Phoenix.PubSub.subscribe(ZcashExplorer.PubSub, "VK:" <> "#{container_id}") + end + + {:ok, + assign(socket, :message, %{ + "message" => "Starting to import the VK .", + "container_id" => Map.get(session, "container_id"), + "txs" => [] + })} + end + + def handle_info(:update, socket) do + if length(socket.assigns.message["txs"]) == 0 do + Process.send_after(self(), :update, 3000) + end + + cmd = MuonTrap.cmd("docker", ["logs", socket.assigns.message["container_id"]]) + logs = elem(cmd, 0) |> Phoenix.HTML.Format.text_to_html() + + {:noreply, + assign(socket, :message, %{ + "message" => logs, + "container_id" => socket.assigns.message["container_id"], + "txs" => socket.assigns.message["txs"] + })} + end + + def handle_info({:received_txs, txs}, socket) do + {:noreply, + assign(socket, :message, %{ + "message" => "Got list of txs", + "container_id" => socket.assigns.message["container_id"], + "txs" => txs + })} + end +end diff --git a/lib/zcash_explorer_web/router.ex b/lib/zcash_explorer_web/router.ex index 621c9e1..944a496 100644 --- a/lib/zcash_explorer_web/router.ex +++ b/lib/zcash_explorer_web/router.ex @@ -31,6 +31,7 @@ defmodule ZcashExplorerWeb.Router do live "/index/recent_transactions", RecentTransactionsLive live "/live/raw_mempool", RawMempoolLive live "/live/nodes", NodesLive + live "/vkdetails", VkLive get "/broadcast", PageController, :broadcast post "/broadcast", PageController, :do_broadcast get "/payment-disclosure", PageController, :disclosure @@ -41,6 +42,13 @@ defmodule ZcashExplorerWeb.Router do get "/mempool", PageController, :mempool get "/nodes", PageController, :nodes get "/vk", PageController, :vk + post "/vk", PageController, :do_import_vk + end + + scope "/", ZcashExplorerWeb do + pipe_through :api + + post "/api/vk/:hostname", PageController, :vk_from_zecwalletcli end # Other scopes may use custom stacks. diff --git a/lib/zcash_explorer_web/templates/layout/app.html.eex b/lib/zcash_explorer_web/templates/layout/app.html.eex index 2e962a1..0f63cf8 100644 --- a/lib/zcash_explorer_web/templates/layout/app.html.eex +++ b/lib/zcash_explorer_web/templates/layout/app.html.eex @@ -118,6 +118,7 @@ Heroicon name: outline/x" x-state:on="Menu open" x-state:off="Menu closed" class +

diff --git a/lib/zcash_explorer_web/templates/page/vk.html.eex b/lib/zcash_explorer_web/templates/page/vk.html.eex index d11f877..fc0280c 100644 --- a/lib/zcash_explorer_web/templates/page/vk.html.eex +++ b/lib/zcash_explorer_web/templates/page/vk.html.eex @@ -3,21 +3,53 @@

Zcash Viewing Key

-
+
+ +<%= if get_flash(@conn, :error) do %> +
+
+
+ + +
+
+

+ There was an error when importing the VK. +

+
+
    +
  • + <%= get_flash(@conn, :error) %> +
  • +
+
+
+
+
+<% end %>

- Paste the viewing key, click on view transactions button and grab a coffee ! + Paste the viewing key, click on the "start importing" button and grab a coffee !

- - + + + +
+ +
+ +
+
+
- diff --git a/lib/zcash_explorer_web/templates/page/vk_txs.html.eex b/lib/zcash_explorer_web/templates/page/vk_txs.html.eex new file mode 100644 index 0000000..55d2a0b --- /dev/null +++ b/lib/zcash_explorer_web/templates/page/vk_txs.html.eex @@ -0,0 +1,8 @@ +
+
+

+ Zcash Viewing Key +

+<%= live_render(@conn, ZcashExplorerWeb.VkLive,session: %{"container_id" => @container_id}) %> +
+
\ No newline at end of file diff --git a/mix.exs b/mix.exs index 07fb5a0..ffde8c4 100644 --- a/mix.exs +++ b/mix.exs @@ -56,7 +56,8 @@ defmodule ZcashExplorer.MixProject do {:timex, "~> 3.0"}, {:sizeable, "~> 1.0"}, {:eqrcode, "~> 0.1.8"}, - {:contex, "~> 0.3.0"} + {:contex, "~> 0.3.0"}, + {:muontrap, "~> 0.6.1"} ] end diff --git a/mix.lock b/mix.lock index 2c2bf3c..30d0b12 100644 --- a/mix.lock +++ b/mix.lock @@ -12,6 +12,7 @@ "ecto": {:hex, :ecto, "3.6.2", "efdf52acfc4ce29249bab5417415bd50abd62db7b0603b8bab0d7b996548c2bc", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "efad6dfb04e6f986b8a3047822b0f826d9affe8e4ebdd2aeedbfcb14fd48884e"}, "ecto_psql_extras": {:hex, :ecto_psql_extras, "0.6.5", "161a4343d2befafef79f7a9e73a85fe2543ab1933ea211838ad76c372d4b6da2", [:mix], [{:ecto_sql, "~> 3.4", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:postgrex, ">= 0.15.7", [hex: :postgrex, repo: "hexpm", optional: false]}, {:table_rex, "~> 3.1.1", [hex: :table_rex, repo: "hexpm", optional: false]}], "hexpm", "5dbe26a78110019d2192512201a17d15d691d1a7bc72e04484fce7ed4576582b"}, "ecto_sql": {:hex, :ecto_sql, "3.6.2", "9526b5f691701a5181427634c30655ac33d11e17e4069eff3ae1176c764e0ba3", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.6.2", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.4.0 or ~> 0.5.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5ec9d7e6f742ea39b63aceaea9ac1d1773d574ea40df5a53ef8afbd9242fdb6b"}, + "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"}, "eqrcode": {:hex, :eqrcode, "0.1.8", "5c97ce5626ad8712264eeb6cbb62f7300c3402d8de711c9159894c7b3db8af7b", [:mix], [], "hexpm", "cd15dda9e85b9e6bbd8ec536b373440d5268d1ef6200a9c0e367fd1f49b96e62"}, "eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"}, "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, @@ -26,21 +27,22 @@ "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, + "muontrap": {:hex, :muontrap, "0.6.1", "fa11dc9152470c4d0ce5a5fcb6524d8c1edc9bf6d63b3f6a89096f1e751ae271", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "86d1ef2fa0a30435a1d595e96f631ad4a24a931d8d855688e012fadd7147bd1d"}, "nimble_strftime": {:hex, :nimble_strftime, "0.1.1", "b988184d1bd945bc139b2c27dd00a6c0774ec94f6b0b580083abd62d5d07818b", [:mix], [], "hexpm", "89e599c9b8b4d1203b7bb5c79eb51ef7c6a28fbc6228230b312f8b796310d755"}, "observer_cli": {:hex, :observer_cli, "1.6.2", "016588e9a966247401bcbf02976d468f1e6f06891dde44f873c9259c6496cca1", [:mix, :rebar3], [{:recon, "~>2.5.1", [hex: :recon, repo: "hexpm", optional: false]}], "hexpm", "c23db9e4cca0e849adc42b0a099affb9e6267c5f23a871fc6f144348b249341f"}, "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, - "phoenix": {:hex, :phoenix, "1.5.9", "a6368d36cfd59d917b37c44386e01315bc89f7609a10a45a22f47c007edf2597", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7e4bce20a67c012f1fbb0af90e5da49fa7bf0d34e3a067795703b74aef75427d"}, + "phoenix": {:hex, :phoenix, "1.5.10", "3ee7d5c17ff9626d72d374d8fc8909bf00f4323fd15549fbe3abbbd38b5299c8", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f9c2eaa5a8fe5a412610c6aa84ccdb6f3e92f333d4df7fbaeb0d5a157dbfb48d"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.3.0", "2c69a452c2e0ee8c93345ae1cdc1696ef4877ff9cbb15c305def41960c3c4ebf", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "0ac491924217550c8f42c81c1f390b5d81517d12ceaf9abf3e701156760a848e"}, "phoenix_html": {:hex, :phoenix_html, "2.14.3", "51f720d0d543e4e157ff06b65de38e13303d5778a7919bcc696599e5934271b8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "efd697a7fff35a13eeeb6b43db884705cba353a1a41d127d118fda5f90c8e80f"}, "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.4.0", "87990e68b60213d7487e65814046f9a2bed4a67886c943270125913499b3e5c3", [:mix], [{:ecto_psql_extras, "~> 0.4.1 or ~> 0.5", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.14.1 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.15.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.4.0 or ~> 0.5.0 or ~> 0.6.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "8d52149e58188e9e4497cc0d8900ab94d9b66f96998ec38c47c7a4f8f4f50e57"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.3.3", "3a53772a6118d5679bf50fc1670505a290e32a1d195df9e069d8c53ab040c054", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "766796676e5f558dbae5d1bdb066849673e956005e3730dfd5affd7a6da4abac"}, "phoenix_live_view": {:hex, :phoenix_live_view, "0.15.7", "09720b8e5151b3ca8ef739cd7626d4feb987c69ba0b509c9bbdb861d5a365881", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.5.7", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 0.5", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a756cf662420272d0f1b3b908cce5222163b5a95aa9bab404f9d29aff53276e"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"}, - "plug": {:hex, :plug, "1.11.1", "f2992bac66fdae679453c9e86134a4201f6f43a687d8ff1cd1b2862d53c80259", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "23524e4fefbb587c11f0833b3910bfb414bf2e2534d61928e920f54e3a1b881f"}, - "plug_cowboy": {:hex, :plug_cowboy, "2.5.0", "51c998f788c4e68fc9f947a5eba8c215fbb1d63a520f7604134cab0270ea6513", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "5b2c8925a5e2587446f33810a58c01e66b3c345652eeec809b76ba007acde71a"}, + "plug": {:hex, :plug, "1.12.1", "645678c800601d8d9f27ad1aebba1fdb9ce5b2623ddb961a074da0b96c35187d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d57e799a777bc20494b784966dc5fbda91eb4a09f571f76545b72a634ce0d30b"}, + "plug_cowboy": {:hex, :plug_cowboy, "2.5.1", "7cc96ff645158a94cf3ec9744464414f02287f832d6847079adfe0b58761cbd0", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "107d0a5865fa92bcb48e631cc0729ae9ccfa0a9f9a1bd8f01acb513abf1c2d64"}, "plug_crypto": {:hex, :plug_crypto, "1.2.2", "05654514ac717ff3a1843204b424477d9e60c143406aa94daf2274fdd280794d", [:mix], [], "hexpm", "87631c7ad914a5a445f0a3809f99b079113ae4ed4b867348dd9eec288cecb6db"}, "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm", "fec8660eb7733ee4117b85f55799fd3833eb769a6df71ccf8903e8dc5447cfce"}, - "postgrex": {:hex, :postgrex, "0.15.9", "46f8fe6f25711aeb861c4d0ae09780facfdf3adbd2fb5594ead61504dd489bda", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "610719103e4cb2223d4ab78f9f0f3e720320eeca6011415ab4137ddef730adee"}, + "postgrex": {:hex, :postgrex, "0.15.10", "2809dee1b1d76f7cbabe570b2a9285c2e7b41be60cf792f5f2804a54b838a067", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "1560ca427542f6b213f8e281633ae1a3b31cdbcd84ebd7f50628765b8f6132be"}, "ranch": {:hex, :ranch, "1.8.0", "8c7a100a139fd57f17327b6413e4167ac559fbc04ca7448e9be9057311597a1d", [:make, :rebar3], [], "hexpm", "49fbcfd3682fab1f5d109351b61257676da1a2fdbe295904176d5e521a2ddfe5"}, "recon": {:hex, :recon, "2.5.2", "cba53fa8db83ad968c9a652e09c3ed7ddcc4da434f27c3eaa9ca47ffb2b1ff03", [:mix, :rebar3], [], "hexpm", "2c7523c8dee91dff41f6b3d63cba2bd49eb6d2fe5bf1eec0df7f87eb5e230e1c"}, "sizeable": {:hex, :sizeable, "1.0.2", "625fe06a5dad188b52121a140286f1a6ae1adf350a942cf419499ecd8a11ee29", [:mix], [], "hexpm", "4bab548e6dfba777b400ca50830a9e3a4128e73df77ab1582540cf5860601762"}, @@ -50,7 +52,7 @@ "telemetry": {:hex, :telemetry, "0.4.3", "a06428a514bdbc63293cd9a6263aad00ddeb66f608163bdec7c8995784080818", [:rebar3], [], "hexpm", "eb72b8365ffda5bed68a620d1da88525e326cb82a75ee61354fc24b844768041"}, "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.1", "315d9163a1d4660aedc3fee73f33f1d355dcc76c5c3ab3d59e76e3edf80eef1f", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7be9e0871c41732c233be71e4be11b96e56177bf15dde64a8ac9ce72ac9834c6"}, "telemetry_poller": {:hex, :telemetry_poller, "0.5.1", "21071cc2e536810bac5628b935521ff3e28f0303e770951158c73eaaa01e962a", [:rebar3], [{:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "4cab72069210bc6e7a080cec9afffad1b33370149ed5d379b81c7c5f0c663fd4"}, - "timex": {:hex, :timex, "3.7.5", "3eca56e23bfa4e0848f0b0a29a92fa20af251a975116c6d504966e8a90516dfd", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a15608dca680f2ef663d71c95842c67f0af08a0f3b1d00e17bbd22872e2874e4"}, + "timex": {:hex, :timex, "3.7.6", "502d2347ec550e77fdf419bc12d15bdccd31266bb7d925b30bf478268098282f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a296327f79cb1ec795b896698c56e662ed7210cc9eb31f0ab365eb3a62e2c589"}, "tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"}, "unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"}, "unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"},