+ <.card_preheding class="text-4xl sm:text-5xl font-bold font-foreground">
+ Operator Details
+
+ <.card
+ class="px-4 py-5 min-h-fit flex flex-col"
+ inner_class="font-semibold inline-flex flex-col text-base gap-y-2 text-muted-foreground [&>p]:text-foreground [&>a]:text-foreground [&>*]:break-all [&>*]:font-normal"
+ >
+
+ 
+
+
+ <%= @operator.name %>
+
+
+ <%= @operator.description %>
+
+ <.a href={@operator.website} target="_blank" rel="noopener">
+ Website
+
+ <.a href={@operator.twitter} target="_blank" rel="noopener">
+ X/Twitter
+
+
+
+ Address:
+
+ <%= @operator.address %>
+
+
+
diff --git a/explorer/lib/explorer_web/live/pages/operators/index.html.heex b/explorer/lib/explorer_web/live/pages/operators/index.html.heex
index f657fd491c..d85b7e100a 100644
--- a/explorer/lib/explorer_web/live/pages/operators/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/operators/index.html.heex
@@ -2,13 +2,17 @@
<.card_preheding>Operators
<.table id="operators" rows={@operators}>
<:col :let={operator} label="Name">
-
- 
+ <.link navigate={~p"/operators/#{operator.address}"} class="flex gap-x-2">
+ 
<%= operator.name %>
<.tooltip>
<%= operator.address %>
-
+
<:col :let={_operator} label="Restake Concentration">
TODO
diff --git a/explorer/lib/explorer_web/router.ex b/explorer/lib/explorer_web/router.ex
index 6ef767eee8..946b51e435 100644
--- a/explorer/lib/explorer_web/router.ex
+++ b/explorer/lib/explorer_web/router.ex
@@ -24,6 +24,7 @@ defmodule ExplorerWeb.Router do
live "/batches", Batches.Index
live "/assets", Assets.Index
live "/operators", Operators.Index
+ live "/operators/:address", Operator.Index
end
end
From 1fbc65a379cfc6953eaada04ebb37df48550a362 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Tue, 30 Jul 2024 19:44:01 -0300
Subject: [PATCH 066/201] chore: remove warnings and small refactors
---
..._directory.ex => avs_directory_manager.ex} | 21 ++++++++++---------
explorer/lib/explorer/delegation_manager.ex | 16 +++++++-------
explorer/lib/explorer/models/operators.ex | 3 ++-
explorer/lib/explorer/models/restakings.ex | 2 +-
explorer/lib/explorer/models/tokens.ex | 8 ++++++-
explorer/lib/explorer/periodically.ex | 2 +-
6 files changed, 30 insertions(+), 22 deletions(-)
rename explorer/lib/explorer/{avs_directory.ex => avs_directory_manager.ex} (90%)
diff --git a/explorer/lib/explorer/avs_directory.ex b/explorer/lib/explorer/avs_directory_manager.ex
similarity index 90%
rename from explorer/lib/explorer/avs_directory.ex
rename to explorer/lib/explorer/avs_directory_manager.ex
index b511060ddd..c4abf131cb 100644
--- a/explorer/lib/explorer/avs_directory.ex
+++ b/explorer/lib/explorer/avs_directory_manager.ex
@@ -22,12 +22,12 @@ defmodule AVSDirectory do
|> Map.get("addresses")
|> Map.get("avsDirectory")
- @first_block (case @environment do
- "devnet" -> 0
- "holesky" -> 1_600_000
- "mainnet" -> 20_020_000
- _ -> raise("Invalid environment")
- end)
+ # @first_block (case @environment do
+ # "devnet" -> 0
+ # "holesky" -> 1_600_000
+ # "mainnet" -> 20_020_000
+ # _ -> raise("Invalid environment")
+ # end)
use Ethers.Contract,
abi_file: "lib/abi/AVSDirectory.json",
@@ -101,7 +101,7 @@ defmodule AVSDirectory do
IO.inspect("Operator unregistered")
AVSDirectory.handle_operator_unregistration(event)
- other ->
+ _other ->
IO.inspect("Unexpected event data", event.data)
end
_ ->
@@ -120,15 +120,16 @@ defmodule AVSDirectory do
operator_metadata
{:error, reason} ->
- IO.inspect("Error fetching operator metadata")
+ IO.inspect("Error fetching operator metadata:")
+ IO.inspect(reason)
%EigenOperatorMetadataStruct{name: nil, website: nil, description: nil, logo: nil, twitter: nil}
end
Operators.register_operator(%Operators{name: operator_metadata.name, address: Enum.at(event.topics, 1), url: operator_url, website: operator_metadata.website, description: operator_metadata.description, logo_link: operator_metadata.logo, twitter: operator_metadata.twitter})
# TODO read its first stake
end
- def handle_operator_unregistration(event) do
- IO.inspect("Handling operator unregistration")
+ def handle_operator_unregistration(_event) do
+ IO.inspect("TODO: Handle operator unregistration")
# Operators.unregister_operator(%Operators{address: Enum.at(event.topics, 1)})
end
end
diff --git a/explorer/lib/explorer/delegation_manager.ex b/explorer/lib/explorer/delegation_manager.ex
index d1ab66fb0e..0277b8bda2 100644
--- a/explorer/lib/explorer/delegation_manager.ex
+++ b/explorer/lib/explorer/delegation_manager.ex
@@ -22,12 +22,12 @@ defmodule DelegationManager do
|> Map.get("addresses")
|> Map.get("delegationManager")
- @first_block (case @environment do
- "devnet" -> 0
- "holesky" -> 1_600_000
- "mainnet" -> 20_020_000
- _ -> raise("Invalid environment")
- end)
+ # @first_block (case @environment do
+ # "devnet" -> 0
+ # "holesky" -> 1_600_000
+ # "mainnet" -> 20_020_000
+ # _ -> raise("Invalid environment")
+ # end)
use Ethers.Contract,
abi_file: "lib/abi/DelegationManager.json",
@@ -41,9 +41,9 @@ defmodule DelegationManager do
DelegationManager.EventFilters.operator_metadata_uri_updated(operator_address)
|> Ethers.get_logs(fromBlock: 0)
|> case do
- {ok, data} -> List.last(data).data |> hd()
+ {:ok, data} -> List.last(data).data |> hd()
- {error, reason} ->
+ {:error, reason} ->
IO.inspect("Error getting operator url")
IO.inspect(reason)
diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex
index 6fc1beb081..90a6914ece 100644
--- a/explorer/lib/explorer/models/operators.ex
+++ b/explorer/lib/explorer/models/operators.ex
@@ -20,6 +20,7 @@ defmodule Operators do
operator
|> cast(attrs, [:name, :address, :url, :website, :description, :logo_link, :twitter])
|> validate_required([:address, :url])
+ |> unique_constraint(:address)
end
def get_operators() do
@@ -32,7 +33,7 @@ defmodule Operators do
Explorer.Repo.one(query)
end
- def register_operator(%Operators{name: _name, address: _address, url: _url} = operator) do
+ def register_operator(%Operators{} = operator) do
Explorer.Repo.insert(operator)
end
diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex
index 6c4438b650..d9ec5e801c 100644
--- a/explorer/lib/explorer/models/restakings.ex
+++ b/explorer/lib/explorer/models/restakings.ex
@@ -1,7 +1,7 @@
defmodule Restakings do
use Ecto.Schema
import Ecto.Changeset
- import Ecto.Query
+ # import Ecto.Query
schema "restakings" do
field :operator_id, :integer
diff --git a/explorer/lib/explorer/models/tokens.ex b/explorer/lib/explorer/models/tokens.ex
index 8bd1ffacd4..a1624e738c 100644
--- a/explorer/lib/explorer/models/tokens.ex
+++ b/explorer/lib/explorer/models/tokens.ex
@@ -1,7 +1,7 @@
defmodule Tokens do
use Ecto.Schema
import Ecto.Changeset
- import Ecto.Query
+ # import Ecto.Query
schema "tokens" do
field :name, :string
@@ -20,4 +20,10 @@ defmodule Tokens do
|> validate_required([:name, :symbol, :decimals, :address, :total_staked])
end
+ def add_token(%Tokens{name: name, symbol: symbol, decimals: decimals, address: address, total_staked: total_staked} = new_token) do
+ new_token
+ |> Tokens.changeset(%{name: name, symbol: symbol, decimals: decimals, address: address, total_staked: total_staked})
+ |> Explorer.Repo.insert()
+ end
+
end
diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex
index bc52fd8ea6..7e15373627 100644
--- a/explorer/lib/explorer/periodically.ex
+++ b/explorer/lib/explorer/periodically.ex
@@ -116,7 +116,7 @@ defmodule Explorer.Periodically do
)
end
- defp process_operators(fromBlock) do
+ def process_operators(fromBlock) do
"Processing operators..." |> IO.inspect()
AVSDirectory.process_operator_data(%{fromBlock: fromBlock})
end
From 492e80adc4f209556409e7d424997f9f4a34a275 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Tue, 30 Jul 2024 19:44:15 -0300
Subject: [PATCH 067/201] chore: upgrade mix
---
explorer/mix.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/explorer/mix.lock b/explorer/mix.lock
index 0c08a15d4c..a6dce9df35 100644
--- a/explorer/mix.lock
+++ b/explorer/mix.lock
@@ -21,7 +21,7 @@
"floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"},
"gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"},
"hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"},
- "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized", depth: 1]},
+ "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized"]},
"hpax": {:hex, :hpax, "0.2.0", "5a58219adcb75977b2edce5eb22051de9362f08236220c9e859a47111c194ff5", [:mix], [], "hexpm", "bea06558cdae85bed075e6c036993d43cd54d447f76d8190a8db0dc5893fa2f1"},
"httpoison": {:hex, :httpoison, "2.2.1", "87b7ed6d95db0389f7df02779644171d7319d319178f6680438167d7b69b1f3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "51364e6d2f429d80e14fe4b5f8e39719cacd03eb3f9a9286e61e216feac2d2df"},
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
From 9f80af4733c070bbe32e5bf36bc99eb37d05473f Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Tue, 30 Jul 2024 19:45:13 -0300
Subject: [PATCH 068/201] fix: remove decimals from tokens table
---
explorer/lib/explorer/models/tokens.ex | 9 ++++-----
.../repo/migrations/20240719202751_add_tokens_table.exs | 1 -
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/explorer/lib/explorer/models/tokens.ex b/explorer/lib/explorer/models/tokens.ex
index a1624e738c..7ec8b2abe4 100644
--- a/explorer/lib/explorer/models/tokens.ex
+++ b/explorer/lib/explorer/models/tokens.ex
@@ -6,7 +6,6 @@ defmodule Tokens do
schema "tokens" do
field :name, :string
field :symbol, :string
- field :decimals, :integer
field :address, :binary
field :total_staked, :decimal
@@ -16,13 +15,13 @@ defmodule Tokens do
@doc false
def changeset(token, attrs) do
token
- |> cast(attrs, [:name, :symbol, :decimals, :address, :total_staked])
- |> validate_required([:name, :symbol, :decimals, :address, :total_staked])
+ |> cast(attrs, [:name, :symbol, :address, :total_staked])
+ |> validate_required([:name, :symbol, :address, :total_staked])
end
- def add_token(%Tokens{name: name, symbol: symbol, decimals: decimals, address: address, total_staked: total_staked} = new_token) do
+ def add_token(%Tokens{name: name, symbol: symbol, address: address, total_staked: total_staked} = new_token) do
new_token
- |> Tokens.changeset(%{name: name, symbol: symbol, decimals: decimals, address: address, total_staked: total_staked})
+ |> Tokens.changeset(%{name: name, symbol: symbol, address: address, total_staked: total_staked})
|> Explorer.Repo.insert()
end
diff --git a/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs b/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs
index 153066883c..1cecbba9d6 100644
--- a/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs
+++ b/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs
@@ -6,7 +6,6 @@ defmodule Explorer.Repo.Migrations.AddTokensTable do
add :id, :bigserial, primary_key: true
add :name, :string, null: false
add :symbol, :string, null: false
- add :decimals, :integer, null: false # TODO goes? i dont think so
add :address, :binary, null: false # TODO goes?
add :total_staked, :decimal, precision: 22, scale: 0, null: false
From 07de268dea0178291de03a2a54dfe0104a58dae7 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Tue, 30 Jul 2024 19:57:18 -0300
Subject: [PATCH 069/201] style(operator-detail): color hierarchy
---
explorer/lib/explorer_web/live/pages/operator/index.html.heex | 4 ++--
explorer/mix.lock | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/explorer/lib/explorer_web/live/pages/operator/index.html.heex b/explorer/lib/explorer_web/live/pages/operator/index.html.heex
index 76b2e74c7a..65b2097801 100644
--- a/explorer/lib/explorer_web/live/pages/operator/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/operator/index.html.heex
@@ -12,8 +12,8 @@
class="rounded-full size-24 object-scale-down"
src={@operator.logo_link}
/>
-
-
+
+
<%= @operator.name %>
diff --git a/explorer/mix.lock b/explorer/mix.lock
index a6dce9df35..0c08a15d4c 100644
--- a/explorer/mix.lock
+++ b/explorer/mix.lock
@@ -21,7 +21,7 @@
"floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"},
"gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"},
"hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"},
- "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized"]},
+ "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized", depth: 1]},
"hpax": {:hex, :hpax, "0.2.0", "5a58219adcb75977b2edce5eb22051de9362f08236220c9e859a47111c194ff5", [:mix], [], "hexpm", "bea06558cdae85bed075e6c036993d43cd54d447f76d8190a8db0dc5893fa2f1"},
"httpoison": {:hex, :httpoison, "2.2.1", "87b7ed6d95db0389f7df02779644171d7319d319178f6680438167d7b69b1f3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "51364e6d2f429d80e14fe4b5f8e39719cacd03eb3f9a9286e61e216feac2d2df"},
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
From 7fea83322937b01d8dd0196500498497134b6618 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 31 Jul 2024 12:13:07 -0300
Subject: [PATCH 070/201] feat: fetch old operators script
---
Makefile | 4 +++
.../lib/explorer/avs_directory_manager.ex | 9 ++++--
explorer/lib/explorer/periodically.ex | 2 --
explorer/lib/explorer_web/live/utils.ex | 2 +-
explorer/lib/scripts/fetch_old_operators.ex | 11 +++++++
explorer/scripts/fetch_old_operators.sh | 30 +++++++++++++++++++
6 files changed, 53 insertions(+), 5 deletions(-)
create mode 100644 explorer/lib/scripts/fetch_old_operators.ex
create mode 100755 explorer/scripts/fetch_old_operators.sh
diff --git a/Makefile b/Makefile
index 635a680578..f39e9b2685 100644
--- a/Makefile
+++ b/Makefile
@@ -653,3 +653,7 @@ recover_db: run_db
explorer_fetch_old_batches:
@cd explorer && \
./scripts/fetch_old_batches.sh 1728056 1729806
+
+explorer_fetch_old_operators:
+ @cd explorer && \
+ ./scripts/fetch_old_operators.sh 1728056
diff --git a/explorer/lib/explorer/avs_directory_manager.ex b/explorer/lib/explorer/avs_directory_manager.ex
index c4abf131cb..75f64d81b1 100644
--- a/explorer/lib/explorer/avs_directory_manager.ex
+++ b/explorer/lib/explorer/avs_directory_manager.ex
@@ -120,8 +120,12 @@ defmodule AVSDirectory do
operator_metadata
{:error, reason} ->
- IO.inspect("Error fetching operator metadata:")
- IO.inspect(reason)
+ case reason do
+ %Jason.DecodeError{} ->
+ dbg("Error decoding operator metadata: operator link does not contain a JSON")
+ _ ->
+ dbg("Error fetching operator metadata:", reason)
+ end
%EigenOperatorMetadataStruct{name: nil, website: nil, description: nil, logo: nil, twitter: nil}
end
Operators.register_operator(%Operators{name: operator_metadata.name, address: Enum.at(event.topics, 1), url: operator_url, website: operator_metadata.website, description: operator_metadata.description, logo_link: operator_metadata.logo, twitter: operator_metadata.twitter})
@@ -130,6 +134,7 @@ defmodule AVSDirectory do
def handle_operator_unregistration(_event) do
IO.inspect("TODO: Handle operator unregistration")
+ # change flag is_active to false
# Operators.unregister_operator(%Operators{address: Enum.at(event.topics, 1)})
end
end
diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex
index 7e15373627..d307f844be 100644
--- a/explorer/lib/explorer/periodically.ex
+++ b/explorer/lib/explorer/periodically.ex
@@ -12,8 +12,6 @@ defmodule Explorer.Periodically do
end
def send_work() do
- # TODO think a better place to put this
- Task.start(fn -> process_operators(0) end)
# once per block
seconds = 12
diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex
index 830fb18333..7d43881373 100644
--- a/explorer/lib/explorer_web/live/utils.ex
+++ b/explorer/lib/explorer_web/live/utils.ex
@@ -184,7 +184,7 @@ defmodule Utils do
case Jason.decode(body) do
{:ok, json} -> {:ok, EigenOperatorMetadataStruct.map_to_struct(json)}
{:error, reason} ->
- {:error, {reason}}
+ {:error, reason}
end
{:ok, %Finch.Response{status: status_code}} ->
diff --git a/explorer/lib/scripts/fetch_old_operators.ex b/explorer/lib/scripts/fetch_old_operators.ex
new file mode 100644
index 0000000000..1f2a9de3cc
--- /dev/null
+++ b/explorer/lib/scripts/fetch_old_operators.ex
@@ -0,0 +1,11 @@
+defmodule Scripts.FetchOldOperators do
+
+ # This Script is to fetch old operators from the blockchain activity
+ # and insert them into the Ecto database
+
+ def run(fromBlock) do
+ "running fetch_old_operators" |> IO.inspect()
+ AVSDirectory.process_operator_data(%{fromBlock: fromBlock})
+ end
+
+end
diff --git a/explorer/scripts/fetch_old_operators.sh b/explorer/scripts/fetch_old_operators.sh
new file mode 100755
index 0000000000..a0198c411e
--- /dev/null
+++ b/explorer/scripts/fetch_old_operators.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+source .env
+
+export ENVIRONMENT=$ENVIRONMENT
+export RPC_URL=$RPC_URL
+export PHX_HOST=$PHX_HOST
+export DB_NAME=$DB_NAME
+export DB_USER=$DB_USER
+export DB_PASS=$DB_PASS
+export DB_HOST=$DB_HOST
+export ELIXIR_HOSTNAME=$ELIXIR_HOSTNAME
+export ALIGNED_CONFIG_FILE=$ALIGNED_CONFIG_FILE
+
+if [ "$#" -eq 0 ]; then
+ echo "Error, No arguments provided."
+ exit 1
+elif [ "$#" -eq 1 ]; then
+ # argument provided, use it
+ FROM=$1
+else
+ echo "Please provide 1 arguments."
+ exit 1
+fi
+
+echo "Running fetch_old_operators.sh from block: $FROM"
+
+mix compile --force #force recompile to get the latest .env values
+
+iex --sname fetch_old_operators --remsh explorer@$ELIXIR_HOSTNAME -S mix run -e "Scripts.FetchOldOperators.run($FROM)"
From c03e2e91127d7fdc6dc5ec78599751b87641369d Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 31 Jul 2024 12:13:38 -0300
Subject: [PATCH 071/201] feat: operator is_active column
---
explorer/lib/explorer/avs_directory_manager.ex | 4 ++--
.../explorer/models/eigen_metadata_struct.ex | 5 ++++-
explorer/lib/explorer/models/operators.ex | 17 +++++++++++++----
.../20240719193311_add_operators_table.exs | 1 +
4 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/explorer/lib/explorer/avs_directory_manager.ex b/explorer/lib/explorer/avs_directory_manager.ex
index 75f64d81b1..98be0d07c6 100644
--- a/explorer/lib/explorer/avs_directory_manager.ex
+++ b/explorer/lib/explorer/avs_directory_manager.ex
@@ -126,9 +126,9 @@ defmodule AVSDirectory do
_ ->
dbg("Error fetching operator metadata:", reason)
end
- %EigenOperatorMetadataStruct{name: nil, website: nil, description: nil, logo: nil, twitter: nil}
+ %EigenOperatorMetadataStruct{name: nil, website: nil, description: nil, logo: nil, twitter: nil} #TODO handle is_active for this case, should be false?
end
- Operators.register_operator(%Operators{name: operator_metadata.name, address: Enum.at(event.topics, 1), url: operator_url, website: operator_metadata.website, description: operator_metadata.description, logo_link: operator_metadata.logo, twitter: operator_metadata.twitter})
+ Operators.register_operator(%Operators{name: operator_metadata.name, address: Enum.at(event.topics, 1), url: operator_url, website: operator_metadata.website, description: operator_metadata.description, logo_link: operator_metadata.logo, twitter: operator_metadata.twitter, is_active: true})
# TODO read its first stake
end
diff --git a/explorer/lib/explorer/models/eigen_metadata_struct.ex b/explorer/lib/explorer/models/eigen_metadata_struct.ex
index d341c484a0..1da8bba3e1 100644
--- a/explorer/lib/explorer/models/eigen_metadata_struct.ex
+++ b/explorer/lib/explorer/models/eigen_metadata_struct.ex
@@ -17,6 +17,9 @@ defmodule EigenOperatorMetadataStruct do
}
end
- def map_to_struct(_), do: {:error, :invalid_format}
+ def map_to_struct(other) do
+ dbg(other)
+ {:error, :invalid_format}
+ end
end
diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex
index d815ebcc45..9eb8bec436 100644
--- a/explorer/lib/explorer/models/operators.ex
+++ b/explorer/lib/explorer/models/operators.ex
@@ -11,6 +11,7 @@ defmodule Operators do
field :description, :string
field :logo_link, :string
field :twitter, :string
+ field :is_active, :boolean
timestamps()
end
@@ -18,8 +19,8 @@ defmodule Operators do
@doc false
def changeset(operator, attrs) do
operator
- |> cast(attrs, [:name, :address, :url, :website, :description, :logo_link, :twitter])
- |> validate_required([:address, :url])
+ |> cast(attrs, [:name, :address, :url, :website, :description, :logo_link, :twitter, :is_active])
+ |> validate_required([:address, :url, :is_active])
|> unique_constraint(:address)
end
@@ -35,12 +36,20 @@ defmodule Operators do
end
def get_amount_of_operators do
- query = from(o in Operators, select: count(o.id))
+ query = from(
+ o in Operators,
+ where: o.is_active == true,
+ select: count(o.id)
+ )
Explorer.Repo.one(query)
end
+ # def register_operator(%Operators{} = operator) do
+ # Explorer.Repo.insert(operator)
+ # end
+
def register_operator(%Operators{} = operator) do
- Explorer.Repo.insert(operator)
+ Operators.changeset(operator, %{}) |> Explorer.Repo.insert()
end
def unregister_operator(%Operators{address: address}) do
diff --git a/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs b/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
index aab149e185..58ea2ef013 100644
--- a/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
+++ b/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
@@ -11,6 +11,7 @@ defmodule Explorer.Repo.Migrations.AddOperatorsTable do
add :description, :text
add :logo_link, :string
add :twitter, :string
+ add :is_active, :boolean, default: false
timestamps()
end
From 2c9d5862f1444246136184779d67ed12e21701b2 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 31 Jul 2024 15:32:02 -0300
Subject: [PATCH 072/201] feat: handle operator unregistration
---
.../lib/explorer/avs_directory_manager.ex | 11 ++++-----
explorer/lib/explorer/delegation_manager.ex | 2 +-
explorer/lib/explorer/models/operators.ex | 24 +++++++++++++------
.../20240719202751_add_tokens_table.exs | 2 +-
4 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/explorer/lib/explorer/avs_directory_manager.ex b/explorer/lib/explorer/avs_directory_manager.ex
index 98be0d07c6..b2365f702a 100644
--- a/explorer/lib/explorer/avs_directory_manager.ex
+++ b/explorer/lib/explorer/avs_directory_manager.ex
@@ -126,15 +126,14 @@ defmodule AVSDirectory do
_ ->
dbg("Error fetching operator metadata:", reason)
end
- %EigenOperatorMetadataStruct{name: nil, website: nil, description: nil, logo: nil, twitter: nil} #TODO handle is_active for this case, should be false?
+ %EigenOperatorMetadataStruct{name: nil, website: nil, description: nil, logo: nil, twitter: nil}
end
- Operators.register_operator(%Operators{name: operator_metadata.name, address: Enum.at(event.topics, 1), url: operator_url, website: operator_metadata.website, description: operator_metadata.description, logo_link: operator_metadata.logo, twitter: operator_metadata.twitter, is_active: true})
+ Operators.register_or_update_operator(%Operators{name: operator_metadata.name, address: Enum.at(event.topics, 1), url: operator_url, website: operator_metadata.website, description: operator_metadata.description, logo_link: operator_metadata.logo, twitter: operator_metadata.twitter, is_active: true})
# TODO read its first stake
end
- def handle_operator_unregistration(_event) do
- IO.inspect("TODO: Handle operator unregistration")
- # change flag is_active to false
- # Operators.unregister_operator(%Operators{address: Enum.at(event.topics, 1)})
+ def handle_operator_unregistration(event) do
+ IO.inspect("WIP: Handling operator unregistration")
+ Operators.unregister_operator(%Operators{address: Enum.at(event.topics, 1)})
end
end
diff --git a/explorer/lib/explorer/delegation_manager.ex b/explorer/lib/explorer/delegation_manager.ex
index 0277b8bda2..ae35769a8d 100644
--- a/explorer/lib/explorer/delegation_manager.ex
+++ b/explorer/lib/explorer/delegation_manager.ex
@@ -41,7 +41,7 @@ defmodule DelegationManager do
DelegationManager.EventFilters.operator_metadata_uri_updated(operator_address)
|> Ethers.get_logs(fromBlock: 0)
|> case do
- {:ok, data} -> List.last(data).data |> hd()
+ {:ok, data} -> List.last(data).data |> hd() # most recent entry
{:error, reason} ->
IO.inspect("Error getting operator url")
diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex
index 9eb8bec436..4311e0a0e2 100644
--- a/explorer/lib/explorer/models/operators.ex
+++ b/explorer/lib/explorer/models/operators.ex
@@ -24,6 +24,10 @@ defmodule Operators do
|> unique_constraint(:address)
end
+ def generate_changeset(%Operators{} = operator) do
+ Operators.changeset(%Operators{}, Map.from_struct(operator))
+ end
+
def get_operator_by_address(address) do
query = from(o in Operators, where: o.address == ^address, select: o)
Explorer.Repo.one(query)
@@ -44,18 +48,24 @@ defmodule Operators do
Explorer.Repo.one(query)
end
- # def register_operator(%Operators{} = operator) do
- # Explorer.Repo.insert(operator)
- # end
+ def register_or_update_operator(%Operators{} = operator) do
+ changeset = Operators.generate_changeset(operator)
+ case Explorer.Repo.get_by(Operators, address: operator.address) do
+ nil ->
+ dbg("Inserting new operator")
+ Explorer.Repo.insert(changeset)
- def register_operator(%Operators{} = operator) do
- Operators.changeset(operator, %{}) |> Explorer.Repo.insert()
+ existing_operator ->
+ dbg("Updating operator")
+ Ecto.Changeset.change(existing_operator, changeset.changes)
+ |> Explorer.Repo.update()
+ end
end
def unregister_operator(%Operators{address: address}) do
query = from(o in Operators, where: o.address == ^address)
- #TODO delete? or update status? also update their stake?
- Explorer.Repo.delete(query)
+ Explorer.Repo.update_all(query, set: [is_active: false])
+ # TODO also update their stake?
end
end
diff --git a/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs b/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs
index 1cecbba9d6..bb2614a707 100644
--- a/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs
+++ b/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs
@@ -6,7 +6,7 @@ defmodule Explorer.Repo.Migrations.AddTokensTable do
add :id, :bigserial, primary_key: true
add :name, :string, null: false
add :symbol, :string, null: false
- add :address, :binary, null: false # TODO goes?
+ add :address, :binary, null: false
add :total_staked, :decimal, precision: 22, scale: 0, null: false
timestamps()
From 9698f02d9dc62a7c2d9f050ebfcd6ba98496863a Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 31 Jul 2024 15:34:38 -0300
Subject: [PATCH 073/201] chore: mix.lock
---
explorer/mix.lock | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/explorer/mix.lock b/explorer/mix.lock
index 0c08a15d4c..a6dce9df35 100644
--- a/explorer/mix.lock
+++ b/explorer/mix.lock
@@ -21,7 +21,7 @@
"floki": {:hex, :floki, "0.36.2", "a7da0193538c93f937714a6704369711998a51a6164a222d710ebd54020aa7a3", [:mix], [], "hexpm", "a8766c0bc92f074e5cb36c4f9961982eda84c5d2b8e979ca67f5c268ec8ed580"},
"gettext": {:hex, :gettext, "0.24.0", "6f4d90ac5f3111673cbefc4ebee96fe5f37a114861ab8c7b7d5b30a1108ce6d8", [:mix], [{:expo, "~> 0.5.1", [hex: :expo, repo: "hexpm", optional: false]}], "hexpm", "bdf75cdfcbe9e4622dd18e034b227d77dd17f0f133853a1c73b97b3d6c770e8b"},
"hackney": {:hex, :hackney, "1.20.1", "8d97aec62ddddd757d128bfd1df6c5861093419f8f7a4223823537bad5d064e2", [:rebar3], [{:certifi, "~> 2.12.0", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~> 6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~> 1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~> 1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.4.1", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~> 1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "fe9094e5f1a2a2c0a7d10918fee36bfec0ec2a979994cff8cfe8058cd9af38e3"},
- "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized", depth: 1]},
+ "heroicons": {:git, "https://github.com/tailwindlabs/heroicons.git", "88ab3a0d790e6a47404cba02800a6b25d2afae50", [tag: "v2.1.1", sparse: "optimized"]},
"hpax": {:hex, :hpax, "0.2.0", "5a58219adcb75977b2edce5eb22051de9362f08236220c9e859a47111c194ff5", [:mix], [], "hexpm", "bea06558cdae85bed075e6c036993d43cd54d447f76d8190a8db0dc5893fa2f1"},
"httpoison": {:hex, :httpoison, "2.2.1", "87b7ed6d95db0389f7df02779644171d7319d319178f6680438167d7b69b1f3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "51364e6d2f429d80e14fe4b5f8e39719cacd03eb3f9a9286e61e216feac2d2df"},
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~> 0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
From 6dafb75968d8f374ff62455d23c500a49e9835b2 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 31 Jul 2024 16:16:22 -0300
Subject: [PATCH 074/201] feat: is_active on front
---
explorer/lib/explorer/models/operators.ex | 1 -
explorer/lib/explorer_web/live/pages/operators/index.html.heex | 3 +++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex
index 4311e0a0e2..d6c57c8ca0 100644
--- a/explorer/lib/explorer/models/operators.ex
+++ b/explorer/lib/explorer/models/operators.ex
@@ -65,7 +65,6 @@ defmodule Operators do
def unregister_operator(%Operators{address: address}) do
query = from(o in Operators, where: o.address == ^address)
Explorer.Repo.update_all(query, set: [is_active: false])
- # TODO also update their stake?
end
end
diff --git a/explorer/lib/explorer_web/live/pages/operators/index.html.heex b/explorer/lib/explorer_web/live/pages/operators/index.html.heex
index d85b7e100a..1efb85ce18 100644
--- a/explorer/lib/explorer_web/live/pages/operators/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/operators/index.html.heex
@@ -19,6 +19,9 @@
<:col :let={_operator} label="Total ETH Restaked">
TODO
+
+ <:col :let={operator} label="Active">
+ <%= operator.is_active %>
From 27525e71bcb65edfd34faf744520b2b7b6d53b62 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 31 Jul 2024 20:14:25 -0300
Subject: [PATCH 075/201] feat: restakeable stratergies
---
Makefile | 7 +-
explorer/lib/abi/IERC20Metadata.json | 1 +
explorer/lib/abi/IStrategy.json | 1 +
.../explorer/aligned_layer_service_manager.ex | 10 ++
explorer/lib/explorer/models/erc20.ex | 13 +++
explorer/lib/explorer/models/strategies.ex | 93 +++++++++++++++++++
explorer/lib/explorer/models/tokens.ex | 28 ------
explorer/lib/explorer/periodically.ex | 3 +-
.../20240719202751_add_strategies_table.exs | 19 ++++
.../20240719202751_add_tokens_table.exs | 15 ---
...40719202825_add_restakings_table copy.exs} | 0
.../scripts/fetch_restakeable_strategies.sh | 17 ++++
12 files changed, 162 insertions(+), 45 deletions(-)
create mode 100644 explorer/lib/abi/IERC20Metadata.json
create mode 100644 explorer/lib/abi/IStrategy.json
create mode 100644 explorer/lib/explorer/models/erc20.ex
create mode 100644 explorer/lib/explorer/models/strategies.ex
delete mode 100644 explorer/lib/explorer/models/tokens.ex
create mode 100644 explorer/priv/repo/migrations/20240719202751_add_strategies_table.exs
delete mode 100644 explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs
rename explorer/priv/repo/migrations/{20240719202825_add_restakings_table.exs => 20240719202825_add_restakings_table copy.exs} (100%)
create mode 100755 explorer/scripts/fetch_restakeable_strategies.sh
diff --git a/Makefile b/Makefile
index f39e9b2685..5f24f13721 100644
--- a/Makefile
+++ b/Makefile
@@ -656,4 +656,9 @@ explorer_fetch_old_batches:
explorer_fetch_old_operators:
@cd explorer && \
- ./scripts/fetch_old_operators.sh 1728056
+ ./scripts/fetch_old_operators.sh 0
+# ./scripts/fetch_old_operators.sh 1728056
+
+explorer_fetch_restakeable_strategies:
+ @cd explorer && \
+ ./scripts/fetch_restakeable_strategies.sh
diff --git a/explorer/lib/abi/IERC20Metadata.json b/explorer/lib/abi/IERC20Metadata.json
new file mode 100644
index 0000000000..70db25a6b0
--- /dev/null
+++ b/explorer/lib/abi/IERC20Metadata.json
@@ -0,0 +1 @@
+{"abi":[{"type":"function","name":"allowance","inputs":[{"name":"owner","type":"address","internalType":"address"},{"name":"spender","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"name":"spender","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"balanceOf","inputs":[{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"transfer","inputs":[{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transferFrom","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"to","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"event","name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true,"internalType":"address"},{"name":"spender","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"value","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"allowance(address,address)":"dd62ed3e","approve(address,uint256)":"095ea7b3","balanceOf(address)":"70a08231","decimals()":"313ce567","name()":"06fdde03","symbol()":"95d89b41","totalSupply()":"18160ddd","transfer(address,uint256)":"a9059cbb","transferFrom(address,address,uint256)":"23b872dd"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Interface for the optional metadata functions from the ERC20 standard. _Available since v4.1._\",\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called.\"},\"approve(address,uint256)\":{\"details\":\"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event.\"},\"balanceOf(address)\":{\"details\":\"Returns the amount of tokens owned by `account`.\"},\"decimals()\":{\"details\":\"Returns the decimals places of the token.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token.\"},\"totalSupply()\":{\"details\":\"Returns the amount of tokens in existence.\"},\"transfer(address,uint256)\":{\"details\":\"Moves `amount` tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"Moves `amount` tokens from `from` to `to` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":\"IERC20Metadata\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/\",\":eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/\",\":eigenlayer-middleware/=lib/eigenlayer-middleware/src/\",\":eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/\",\":erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/\"]},\"sources\":{\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.12+commit.f00d7308"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"owner","type":"address","indexed":true},{"internalType":"address","name":"spender","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"Approval","anonymous":false},{"inputs":[{"internalType":"address","name":"from","type":"address","indexed":true},{"internalType":"address","name":"to","type":"address","indexed":true},{"internalType":"uint256","name":"value","type":"uint256","indexed":false}],"type":"event","name":"Transfer","anonymous":false},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"stateMutability":"view","type":"function","name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"stateMutability":"view","type":"function","name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"name","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}]}],"devdoc":{"kind":"dev","methods":{"allowance(address,address)":{"details":"Returns the remaining number of tokens that `spender` will be allowed to spend on behalf of `owner` through {transferFrom}. This is zero by default. This value changes when {approve} or {transferFrom} are called."},"approve(address,uint256)":{"details":"Sets `amount` as the allowance of `spender` over the caller's tokens. Returns a boolean value indicating whether the operation succeeded. IMPORTANT: Beware that changing an allowance with this method brings the risk that someone may use both the old and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 Emits an {Approval} event."},"balanceOf(address)":{"details":"Returns the amount of tokens owned by `account`."},"decimals()":{"details":"Returns the decimals places of the token."},"name()":{"details":"Returns the name of the token."},"symbol()":{"details":"Returns the symbol of the token."},"totalSupply()":{"details":"Returns the amount of tokens in existence."},"transfer(address,uint256)":{"details":"Moves `amount` tokens from the caller's account to `to`. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."},"transferFrom(address,address,uint256)":{"details":"Moves `amount` tokens from `from` to `to` using the allowance mechanism. `amount` is then deducted from the caller's allowance. Returns a boolean value indicating whether the operation succeeded. Emits a {Transfer} event."}},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"remappings":["@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/","eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/","eigenlayer-middleware/=lib/eigenlayer-middleware/src/","eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/","erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":"IERC20Metadata"},"evmVersion":"london","libraries":{}},"sources":{"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca","urls":["bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd","dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8"],"license":"MIT"}},"version":1},"id":68}
\ No newline at end of file
diff --git a/explorer/lib/abi/IStrategy.json b/explorer/lib/abi/IStrategy.json
new file mode 100644
index 0000000000..1ccbff96da
--- /dev/null
+++ b/explorer/lib/abi/IStrategy.json
@@ -0,0 +1 @@
+{"abi":[{"type":"function","name":"deposit","inputs":[{"name":"token","type":"address","internalType":"contract IERC20"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"explanation","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"shares","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"sharesToUnderlying","inputs":[{"name":"amountShares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"sharesToUnderlyingView","inputs":[{"name":"amountShares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"totalShares","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"underlyingToShares","inputs":[{"name":"amountUnderlying","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"underlyingToSharesView","inputs":[{"name":"amountUnderlying","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"underlyingToken","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IERC20"}],"stateMutability":"view"},{"type":"function","name":"userUnderlying","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"userUnderlyingView","inputs":[{"name":"user","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"withdraw","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"token","type":"address","internalType":"contract IERC20"},{"name":"amountShares","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"deposit(address,uint256)":"47e7ef24","explanation()":"ab5921e1","shares(address)":"ce7c2ac2","sharesToUnderlying(uint256)":"f3e73875","sharesToUnderlyingView(uint256)":"7a8b2637","totalShares()":"3a98ef39","underlyingToShares(uint256)":"8c871019","underlyingToSharesView(uint256)":"e3dae51c","underlyingToken()":"2495a599","userUnderlying(address)":"8f6a6240","userUnderlyingView(address)":"553ca5f8","withdraw(address,address,uint256)":"d9caed12"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"deposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"explanation\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"shares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountShares\",\"type\":\"uint256\"}],\"name\":\"sharesToUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountShares\",\"type\":\"uint256\"}],\"name\":\"sharesToUnderlyingView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountUnderlying\",\"type\":\"uint256\"}],\"name\":\"underlyingToShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountUnderlying\",\"type\":\"uint256\"}],\"name\":\"underlyingToSharesView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"underlyingToken\",\"outputs\":[{\"internalType\":\"contract IERC20\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"userUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"userUnderlyingView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amountShares\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Layr Labs, Inc.\",\"kind\":\"dev\",\"methods\":{\"deposit(address,uint256)\":{\"details\":\"This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's `depositIntoStrategy` function, and individual share balances are recorded in the strategyManager as well.\",\"params\":{\"amount\":\"is the amount of token being deposited\",\"token\":\"is the ERC20 token being deposited\"},\"returns\":{\"_0\":\"newShares is the number of new shares issued at the current exchange ratio.\"}},\"sharesToUnderlying(uint256)\":{\"details\":\"Implementation for these functions in particular may vary significantly for different strategies\",\"params\":{\"amountShares\":\"is the amount of shares to calculate its conversion into the underlying token\"},\"returns\":{\"_0\":\"The amount of underlying tokens corresponding to the input `amountShares`\"}},\"sharesToUnderlyingView(uint256)\":{\"details\":\"Implementation for these functions in particular may vary significantly for different strategies\",\"params\":{\"amountShares\":\"is the amount of shares to calculate its conversion into the underlying token\"},\"returns\":{\"_0\":\"The amount of shares corresponding to the input `amountUnderlying`\"}},\"underlyingToShares(uint256)\":{\"details\":\"Implementation for these functions in particular may vary significantly for different strategies\",\"params\":{\"amountUnderlying\":\"is the amount of `underlyingToken` to calculate its conversion into strategy shares\"},\"returns\":{\"_0\":\"The amount of underlying tokens corresponding to the input `amountShares`\"}},\"underlyingToSharesView(uint256)\":{\"details\":\"Implementation for these functions in particular may vary significantly for different strategies\",\"params\":{\"amountUnderlying\":\"is the amount of `underlyingToken` to calculate its conversion into strategy shares\"},\"returns\":{\"_0\":\"The amount of shares corresponding to the input `amountUnderlying`\"}},\"withdraw(address,address,uint256)\":{\"details\":\"This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's other functions, and individual share balances are recorded in the strategyManager as well.\",\"params\":{\"amountShares\":\"is the amount of shares being withdrawn\",\"recipient\":\"is the address to receive the withdrawn funds\",\"token\":\"is the ERC20 token being transferred out\"}}},\"title\":\"Minimal interface for an `Strategy` contract.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"deposit(address,uint256)\":{\"notice\":\"Used to deposit tokens into this Strategy\"},\"explanation()\":{\"notice\":\"Returns either a brief string explaining the strategy's goal & purpose, or a link to metadata that explains in more detail.\"},\"shares(address)\":{\"notice\":\"convenience function for fetching the current total shares of `user` in this strategy, by querying the `strategyManager` contract\"},\"sharesToUnderlying(uint256)\":{\"notice\":\"Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy.In contrast to `sharesToUnderlyingView`, this function **may** make state modifications\"},\"sharesToUnderlyingView(uint256)\":{\"notice\":\"Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy.In contrast to `sharesToUnderlying`, this function guarantees no state modifications\"},\"totalShares()\":{\"notice\":\"The total number of extant shares in this Strategy\"},\"underlyingToShares(uint256)\":{\"notice\":\"Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy.In contrast to `underlyingToSharesView`, this function **may** make state modifications\"},\"underlyingToSharesView(uint256)\":{\"notice\":\"Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy.In contrast to `underlyingToShares`, this function guarantees no state modifications\"},\"underlyingToken()\":{\"notice\":\"The underlying token for shares in this Strategy\"},\"userUnderlying(address)\":{\"notice\":\"convenience function for fetching the current underlying value of all of the `user`'s shares in this strategy. In contrast to `userUnderlyingView`, this function **may** make state modifications\"},\"userUnderlyingView(address)\":{\"notice\":\"convenience function for fetching the current underlying value of all of the `user`'s shares in this strategy. In contrast to `userUnderlying`, this function guarantees no state modifications\"},\"withdraw(address,address,uint256)\":{\"notice\":\"Used to withdraw tokens from this Strategy, to the `recipient`'s address\"}},\"notice\":\"Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-serviceCustom `Strategy` implementations may expand extensively on this interface.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol\":\"IStrategy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/\",\":eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/\",\":eigenlayer-middleware/=lib/eigenlayer-middleware/src/\",\":eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/\",\":erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/\"]},\"sources\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol\":{\"keccak256\":\"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73\",\"dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.12+commit.f00d7308"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"explanation","outputs":[{"internalType":"string","name":"","type":"string"}]},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"stateMutability":"view","type":"function","name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"amountShares","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"sharesToUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"amountShares","type":"uint256"}],"stateMutability":"view","type":"function","name":"sharesToUnderlyingView","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"amountUnderlying","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"underlyingToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"amountUnderlying","type":"uint256"}],"stateMutability":"view","type":"function","name":"underlyingToSharesView","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"underlyingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"userUnderlying","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"stateMutability":"view","type":"function","name":"userUnderlyingView","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amountShares","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"withdraw"}],"devdoc":{"kind":"dev","methods":{"deposit(address,uint256)":{"details":"This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's `depositIntoStrategy` function, and individual share balances are recorded in the strategyManager as well.","params":{"amount":"is the amount of token being deposited","token":"is the ERC20 token being deposited"},"returns":{"_0":"newShares is the number of new shares issued at the current exchange ratio."}},"sharesToUnderlying(uint256)":{"details":"Implementation for these functions in particular may vary significantly for different strategies","params":{"amountShares":"is the amount of shares to calculate its conversion into the underlying token"},"returns":{"_0":"The amount of underlying tokens corresponding to the input `amountShares`"}},"sharesToUnderlyingView(uint256)":{"details":"Implementation for these functions in particular may vary significantly for different strategies","params":{"amountShares":"is the amount of shares to calculate its conversion into the underlying token"},"returns":{"_0":"The amount of shares corresponding to the input `amountUnderlying`"}},"underlyingToShares(uint256)":{"details":"Implementation for these functions in particular may vary significantly for different strategies","params":{"amountUnderlying":"is the amount of `underlyingToken` to calculate its conversion into strategy shares"},"returns":{"_0":"The amount of underlying tokens corresponding to the input `amountShares`"}},"underlyingToSharesView(uint256)":{"details":"Implementation for these functions in particular may vary significantly for different strategies","params":{"amountUnderlying":"is the amount of `underlyingToken` to calculate its conversion into strategy shares"},"returns":{"_0":"The amount of shares corresponding to the input `amountUnderlying`"}},"withdraw(address,address,uint256)":{"details":"This function is only callable by the strategyManager contract. It is invoked inside of the strategyManager's other functions, and individual share balances are recorded in the strategyManager as well.","params":{"amountShares":"is the amount of shares being withdrawn","recipient":"is the address to receive the withdrawn funds","token":"is the ERC20 token being transferred out"}}},"version":1},"userdoc":{"kind":"user","methods":{"deposit(address,uint256)":{"notice":"Used to deposit tokens into this Strategy"},"explanation()":{"notice":"Returns either a brief string explaining the strategy's goal & purpose, or a link to metadata that explains in more detail."},"shares(address)":{"notice":"convenience function for fetching the current total shares of `user` in this strategy, by querying the `strategyManager` contract"},"sharesToUnderlying(uint256)":{"notice":"Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy.In contrast to `sharesToUnderlyingView`, this function **may** make state modifications"},"sharesToUnderlyingView(uint256)":{"notice":"Used to convert a number of shares to the equivalent amount of underlying tokens for this strategy.In contrast to `sharesToUnderlying`, this function guarantees no state modifications"},"totalShares()":{"notice":"The total number of extant shares in this Strategy"},"underlyingToShares(uint256)":{"notice":"Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy.In contrast to `underlyingToSharesView`, this function **may** make state modifications"},"underlyingToSharesView(uint256)":{"notice":"Used to convert an amount of underlying tokens to the equivalent amount of shares in this strategy.In contrast to `underlyingToShares`, this function guarantees no state modifications"},"underlyingToken()":{"notice":"The underlying token for shares in this Strategy"},"userUnderlying(address)":{"notice":"convenience function for fetching the current underlying value of all of the `user`'s shares in this strategy. In contrast to `userUnderlyingView`, this function **may** make state modifications"},"userUnderlyingView(address)":{"notice":"convenience function for fetching the current underlying value of all of the `user`'s shares in this strategy. In contrast to `userUnderlying`, this function guarantees no state modifications"},"withdraw(address,address,uint256)":{"notice":"Used to withdraw tokens from this Strategy, to the `recipient`'s address"}},"version":1}},"settings":{"remappings":["@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/","eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/","eigenlayer-middleware/=lib/eigenlayer-middleware/src/","eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/","erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol":"IStrategy"},"evmVersion":"london","libraries":{}},"sources":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol":{"keccak256":"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420","urls":["bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73","dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"}},"version":1},"id":21}
\ No newline at end of file
diff --git a/explorer/lib/explorer/aligned_layer_service_manager.ex b/explorer/lib/explorer/aligned_layer_service_manager.ex
index 974bdfd735..a66ef7593e 100644
--- a/explorer/lib/explorer/aligned_layer_service_manager.ex
+++ b/explorer/lib/explorer/aligned_layer_service_manager.ex
@@ -227,4 +227,14 @@ defmodule AlignedLayerServiceManager do
:error -> raise("Error parsing @gas_per_proof")
end
end
+
+ def update_restakeable_stratergies() do
+ case AlignedLayerServiceManager.get_restakeable_strategies() |> Ethers.call() do
+ {:ok, restakeable_strategies} ->
+ Strategies.update(restakeable_strategies)
+ {:error, error} ->
+ dbg("Error fetching restakeable stratergies: #{error}")
+ raise("Error fetching restakeable stratergies: #{error}")
+ end
+ end
end
diff --git a/explorer/lib/explorer/models/erc20.ex b/explorer/lib/explorer/models/erc20.ex
new file mode 100644
index 0000000000..cd401f8384
--- /dev/null
+++ b/explorer/lib/explorer/models/erc20.ex
@@ -0,0 +1,13 @@
+defmodule ERC20 do
+ use Ethers.Contract,
+ abi_file: "lib/abi/IERC20Metadata.json"
+
+ def symbol(address) do
+ ERC20.symbol() |> Ethers.call(to: address)
+ end
+
+ def name(address) do
+ "address: #{address}" |> dbg
+ ERC20.name() |> Ethers.call(to: address)
+ end
+end
diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex
new file mode 100644
index 0000000000..61a9c5c139
--- /dev/null
+++ b/explorer/lib/explorer/models/strategies.ex
@@ -0,0 +1,93 @@
+defmodule Strategies do
+ use Ecto.Schema
+ import Ecto.Changeset
+ import Ecto.Query
+
+ use Ethers.Contract,
+ abi_file: "lib/abi/IStrategy.json"
+
+ schema "strategies" do
+ field :strategy_address, :binary
+ field :token_address, :binary
+ field :name, :string
+ field :symbol, :string
+ field :total_staked, :decimal
+
+ timestamps()
+ end
+
+ @doc false
+ def changeset(strategy, attrs) do
+ strategy
+ |> cast(attrs, [:name, :symbol, :address, :total_staked])
+ |> validate_required([:name, :symbol, :address, :total_staked])
+ |> unique_constraint(:address)
+ end
+
+ def generate_changeset(%Strategies{} = strategy) do
+ Strategies.changeset(%Strategies{}, Map.from_struct(strategy))
+ end
+
+ def update(restakeable_strategies) do
+ restakeable_strategies
+ |> Enum.map(&remove_redundant/1)
+ |> Enum.map(&extract_info/1)
+ |> Enum.map(&add_strategy/1)
+ end
+
+ def remove_redundant(strategy_address) do
+ case Strategies.get_by_strategy_address(strategy_address) do
+ :nil ->
+ strategy_address
+ _ -> :nil
+ end
+ end
+
+ def get_by_strategy_address(strategy_address) do
+ query = from(s in Strategies,
+ where: s.strategy_address == ^strategy_address,
+ select: s)
+ Explorer.Repo.one(query)
+ end
+
+ def extract_info(strategy_address) do
+ current_strategy = %Strategies{strategy_address: strategy_address}
+
+ current_strategy = case Strategies.underlying_token() |> Ethers.call(to: current_strategy.strategy_address) do
+ {:ok, token_address} ->
+ %{current_strategy | token_address: token_address}
+ error ->
+ dbg("Error fetching token address")
+ dbg(error)
+ end
+
+ current_strategy |> dbg
+ current_strategy = case ERC20.name(current_strategy.token_address) do
+ {:ok, name} ->
+ %{current_strategy | name: name}
+ error ->
+ dbg("Error fetching token name")
+ dbg(error)
+ end
+
+ current_strategy = case ERC20.symbol(current_strategy.token_address) do
+ {:ok, symbol} ->
+ %{current_strategy | symbol: symbol}
+
+ error ->
+ dbg("Error fetching token symbol")
+ dbg(error)
+ end
+
+ dbg(current_strategy)
+
+ # WIP handle errors
+
+ # Total stake is set when inserting rows to `Restakings` table
+ end
+
+ def add_strategy(new_strategy) do
+ Strategies.generate_changeset(new_strategy) |> Explorer.Repo.insert()
+ end
+
+end
diff --git a/explorer/lib/explorer/models/tokens.ex b/explorer/lib/explorer/models/tokens.ex
deleted file mode 100644
index 7ec8b2abe4..0000000000
--- a/explorer/lib/explorer/models/tokens.ex
+++ /dev/null
@@ -1,28 +0,0 @@
-defmodule Tokens do
- use Ecto.Schema
- import Ecto.Changeset
- # import Ecto.Query
-
- schema "tokens" do
- field :name, :string
- field :symbol, :string
- field :address, :binary
- field :total_staked, :decimal
-
- timestamps()
- end
-
- @doc false
- def changeset(token, attrs) do
- token
- |> cast(attrs, [:name, :symbol, :address, :total_staked])
- |> validate_required([:name, :symbol, :address, :total_staked])
- end
-
- def add_token(%Tokens{name: name, symbol: symbol, address: address, total_staked: total_staked} = new_token) do
- new_token
- |> Tokens.changeset(%{name: name, symbol: symbol, address: address, total_staked: total_staked})
- |> Explorer.Repo.insert()
- end
-
-end
diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex
index d307f844be..c6e6fde6ee 100644
--- a/explorer/lib/explorer/periodically.ex
+++ b/explorer/lib/explorer/periodically.ex
@@ -12,7 +12,8 @@ defmodule Explorer.Periodically do
end
def send_work() do
-
+ # on restart the server
+ AlignedLayerServiceManager.update_restakeable_stratergies()
# once per block
seconds = 12
# send every n seconds
diff --git a/explorer/priv/repo/migrations/20240719202751_add_strategies_table.exs b/explorer/priv/repo/migrations/20240719202751_add_strategies_table.exs
new file mode 100644
index 0000000000..b357e3c0dc
--- /dev/null
+++ b/explorer/priv/repo/migrations/20240719202751_add_strategies_table.exs
@@ -0,0 +1,19 @@
+defmodule Explorer.Repo.Migrations.AddTokensTable do
+ use Ecto.Migration
+
+ def change do
+ create table("strategies", primary_key: false) do
+ add :id, :bigserial, primary_key: true
+ add :strategy_address, :binary, null: false
+ add :token_address, :binary, null: false
+ add :name, :string, null: false
+ add :symbol, :string, null: false
+ add :total_staked, :decimal, precision: 22, scale: 0
+
+ timestamps()
+ end
+
+ create unique_index("strategies", [:strategy_address], name: :strategy_address_index)
+ create unique_index("strategies", [:token_address], name: :tokens_address_index)
+ end
+end
diff --git a/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs b/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs
deleted file mode 100644
index bb2614a707..0000000000
--- a/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs
+++ /dev/null
@@ -1,15 +0,0 @@
-defmodule Explorer.Repo.Migrations.AddTokensTable do
- use Ecto.Migration
-
- def change do
- create table("tokens", primary_key: false) do
- add :id, :bigserial, primary_key: true
- add :name, :string, null: false
- add :symbol, :string, null: false
- add :address, :binary, null: false
- add :total_staked, :decimal, precision: 22, scale: 0, null: false
-
- timestamps()
- end
- end
-end
diff --git a/explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs b/explorer/priv/repo/migrations/20240719202825_add_restakings_table copy.exs
similarity index 100%
rename from explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs
rename to explorer/priv/repo/migrations/20240719202825_add_restakings_table copy.exs
diff --git a/explorer/scripts/fetch_restakeable_strategies.sh b/explorer/scripts/fetch_restakeable_strategies.sh
new file mode 100755
index 0000000000..0391a37962
--- /dev/null
+++ b/explorer/scripts/fetch_restakeable_strategies.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+source .env
+
+export ENVIRONMENT=$ENVIRONMENT
+export RPC_URL=$RPC_URL
+export PHX_HOST=$PHX_HOST
+export DB_NAME=$DB_NAME
+export DB_USER=$DB_USER
+export DB_PASS=$DB_PASS
+export DB_HOST=$DB_HOST
+export ELIXIR_HOSTNAME=$ELIXIR_HOSTNAME
+export ALIGNED_CONFIG_FILE=$ALIGNED_CONFIG_FILE
+
+mix compile --force #force recompile to get the latest .env values
+
+iex --sname fetch_restakeable_strategies --remsh explorer@$ELIXIR_HOSTNAME -S mix run -e "AlignedLayerServiceManager.update_restakeable_stratergies()"
From b9f19bbf7b654f4199f190eec5bdd97727f53fa4 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Fri, 2 Aug 2024 10:39:04 -0300
Subject: [PATCH 076/201] feat: error handling in fetch restakeable strategies
---
explorer/lib/explorer/models/erc20.ex | 1 -
explorer/lib/explorer/models/strategies.ex | 84 +++++++++++++---------
2 files changed, 50 insertions(+), 35 deletions(-)
diff --git a/explorer/lib/explorer/models/erc20.ex b/explorer/lib/explorer/models/erc20.ex
index cd401f8384..50883abc47 100644
--- a/explorer/lib/explorer/models/erc20.ex
+++ b/explorer/lib/explorer/models/erc20.ex
@@ -7,7 +7,6 @@ defmodule ERC20 do
end
def name(address) do
- "address: #{address}" |> dbg
ERC20.name() |> Ethers.call(to: address)
end
end
diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex
index 61a9c5c139..47caf7c945 100644
--- a/explorer/lib/explorer/models/strategies.ex
+++ b/explorer/lib/explorer/models/strategies.ex
@@ -19,9 +19,10 @@ defmodule Strategies do
@doc false
def changeset(strategy, attrs) do
strategy
- |> cast(attrs, [:name, :symbol, :address, :total_staked])
- |> validate_required([:name, :symbol, :address, :total_staked])
- |> unique_constraint(:address)
+ |> cast(attrs, [:strategy_address, :token_address, :name, :symbol, :total_staked])
+ |> validate_required([:strategy_address, :token_address, :name, :symbol])
+ |> unique_constraint(:strategy_address)
+ |> unique_constraint(:token_address)
end
def generate_changeset(%Strategies{} = strategy) do
@@ -30,19 +31,12 @@ defmodule Strategies do
def update(restakeable_strategies) do
restakeable_strategies
- |> Enum.map(&remove_redundant/1)
+ |> Enum.reject(&Strategies.get_by_strategy_address/1)
|> Enum.map(&extract_info/1)
+ |> Enum.reject(&is_nil/1)
|> Enum.map(&add_strategy/1)
end
- def remove_redundant(strategy_address) do
- case Strategies.get_by_strategy_address(strategy_address) do
- :nil ->
- strategy_address
- _ -> :nil
- end
- end
-
def get_by_strategy_address(strategy_address) do
query = from(s in Strategies,
where: s.strategy_address == ^strategy_address,
@@ -51,43 +45,65 @@ defmodule Strategies do
end
def extract_info(strategy_address) do
- current_strategy = %Strategies{strategy_address: strategy_address}
+ %Strategies{strategy_address: strategy_address}
+ |> fetch_token_address()
+ |> fetch_token_name()
+ |> fetch_token_symbol()
+ |> tap(&dbg/1)
+ # Total stake is set when inserting rows to `Restakings` table
+ end
- current_strategy = case Strategies.underlying_token() |> Ethers.call(to: current_strategy.strategy_address) do
- {:ok, token_address} ->
- %{current_strategy | token_address: token_address}
- error ->
- dbg("Error fetching token address")
- dbg(error)
+ defp fetch_token_address(%Strategies{strategy_address: strategy_address} = strategy) do
+ case Strategies.underlying_token() |> Ethers.call(to: strategy_address) do
+ {:ok, "0x"} ->
+ dbg("Strategy has invalid underlying token: #{strategy_address}, token_address: '0x'")
+ {:error, :invalid_token_address}
+ {:ok, token_address} -> %{strategy | token_address: token_address}
+
+ {:error, %{"code" => -32015}} ->
+ dbg("Strategy has no underlying token: #{strategy_address}") # thus, its not a strategy contract
+ {:error, :not_strategy}
+
+ other_error ->
+ dbg("Error fetching token address for #{strategy_address}")
+ dbg(other_error)
+ other_error
end
+ end
- current_strategy |> dbg
- current_strategy = case ERC20.name(current_strategy.token_address) do
- {:ok, name} ->
- %{current_strategy | name: name}
+ defp fetch_token_name(%Strategies{token_address: token_address} = strategy) do
+ case ERC20.name(token_address) do
+ {:ok, name} -> %{strategy | name: name}
error ->
dbg("Error fetching token name")
dbg(error)
+ error
end
+ end
+ defp fetch_token_name({:error, error}) do
+ {:error, error}
+ end
- current_strategy = case ERC20.symbol(current_strategy.token_address) do
- {:ok, symbol} ->
- %{current_strategy | symbol: symbol}
-
+ defp fetch_token_symbol(%Strategies{token_address: token_address} = strategy) do
+ case ERC20.symbol(token_address) do
+ {:ok, symbol} -> %{strategy | symbol: symbol}
error ->
dbg("Error fetching token symbol")
dbg(error)
+ error
end
-
- dbg(current_strategy)
-
- # WIP handle errors
-
- # Total stake is set when inserting rows to `Restakings` table
+ end
+ defp fetch_token_symbol({:error, error}) do
+ {:error, error}
end
- def add_strategy(new_strategy) do
+ def add_strategy(%Strategies{} = new_strategy) do
+ dbg("adding strategy")
+ dbg(new_strategy)
Strategies.generate_changeset(new_strategy) |> Explorer.Repo.insert()
end
+ def add_strategy({:error, error}) do
+ :nil
+ end
end
From a76a2e14b12cc0e9cc357fa58ccce87d6b88f449 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Fri, 2 Aug 2024 10:44:09 -0300
Subject: [PATCH 077/201] fix: add docs to navbar
---
explorer/lib/explorer_web/components/nav.ex | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/explorer/lib/explorer_web/components/nav.ex b/explorer/lib/explorer_web/components/nav.ex
index 3963553702..b92cebd066 100644
--- a/explorer/lib/explorer_web/components/nav.ex
+++ b/explorer/lib/explorer_web/components/nav.ex
@@ -36,16 +36,16 @@ defmodule NavComponent do
<.live_component module={SearchComponent} id="nav_search" />
From def737671452f663c30bf649a480905aeb51d637 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Fri, 2 Aug 2024 10:44:29 -0300
Subject: [PATCH 078/201] fix: replace latest batches for just batches
---
explorer/lib/explorer_web/live/pages/batches/index.html.heex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/explorer/lib/explorer_web/live/pages/batches/index.html.heex b/explorer/lib/explorer_web/live/pages/batches/index.html.heex
index 4ce29f3588..c4442761d5 100644
--- a/explorer/lib/explorer_web/live/pages/batches/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/batches/index.html.heex
@@ -1,5 +1,5 @@
- <.card_preheding>Latest Batches
+ <.card_preheding>Batches
<%= if @batches != :empty and @batches != [] do %>
<.table id="batches" rows={@batches}>
<:col :let={batch} label="Merkle Root">
From cc2d3042074b49d192562cd0952a33da09f1499d Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Fri, 2 Aug 2024 17:01:12 -0300
Subject: [PATCH 079/201] refactor: operators primary key is now address
---
explorer/lib/explorer/models/operators.ex | 18 +++++++++++++-----
explorer/lib/explorer/models/strategies.ex | 2 +-
explorer/lib/scripts/fetch_old_operators.ex | 3 ++-
.../20240719193311_add_operators_table.exs | 4 ++--
...0240719202825_add_restakings_table copy.exs | 2 +-
5 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex
index d6c57c8ca0..fdc13dcb41 100644
--- a/explorer/lib/explorer/models/operators.ex
+++ b/explorer/lib/explorer/models/operators.ex
@@ -3,9 +3,10 @@ defmodule Operators do
import Ecto.Changeset
import Ecto.Query
+ @primary_key {:address, :binary, autogenerate: false}
schema "operators" do
+ field :id, :binary
field :name, :string
- field :address, :binary
field :url, :string
field :website, :string
field :description, :string
@@ -19,9 +20,10 @@ defmodule Operators do
@doc false
def changeset(operator, attrs) do
operator
- |> cast(attrs, [:name, :address, :url, :website, :description, :logo_link, :twitter, :is_active])
- |> validate_required([:address, :url, :is_active])
+ |> cast(attrs, [:address, :id, :name, :url, :website, :description, :logo_link, :twitter, :is_active])
+ |> validate_required([:address, :id, :url, :is_active])
|> unique_constraint(:address)
+ |> unique_constraint(:id)
end
def generate_changeset(%Operators{} = operator) do
@@ -43,13 +45,19 @@ defmodule Operators do
query = from(
o in Operators,
where: o.is_active == true,
- select: count(o.id)
+ select: count(o.address)
)
Explorer.Repo.one(query)
end
def register_or_update_operator(%Operators{} = operator) do
- changeset = Operators.generate_changeset(operator)
+ changeset = case Operators.generate_changeset(operator) do
+ %Ecto.Changeset{valid?: false} = changeset ->
+ dbg("Invalid changeset: #{inspect(changeset)}")
+ :nil
+ changeset ->
+ changeset
+ end
case Explorer.Repo.get_by(Operators, address: operator.address) do
nil ->
dbg("Inserting new operator")
diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex
index 47caf7c945..5861998949 100644
--- a/explorer/lib/explorer/models/strategies.ex
+++ b/explorer/lib/explorer/models/strategies.ex
@@ -102,7 +102,7 @@ defmodule Strategies do
dbg(new_strategy)
Strategies.generate_changeset(new_strategy) |> Explorer.Repo.insert()
end
- def add_strategy({:error, error}) do
+ def add_strategy({:error, _error}) do
:nil
end
diff --git a/explorer/lib/scripts/fetch_old_operators.ex b/explorer/lib/scripts/fetch_old_operators.ex
index 1f2a9de3cc..7f13b47882 100644
--- a/explorer/lib/scripts/fetch_old_operators.ex
+++ b/explorer/lib/scripts/fetch_old_operators.ex
@@ -5,7 +5,8 @@ defmodule Scripts.FetchOldOperators do
def run(fromBlock) do
"running fetch_old_operators" |> IO.inspect()
- AVSDirectory.process_operator_data(%{fromBlock: fromBlock})
+ AVSDirectoryManager.process_operator_data(%{fromBlock: fromBlock})
+ "done running fetch_old_operators" |> IO.inspect()
end
end
diff --git a/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs b/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
index 58ea2ef013..4089b4138c 100644
--- a/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
+++ b/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
@@ -3,9 +3,9 @@ defmodule Explorer.Repo.Migrations.AddOperatorsTable do
def change do
create table("operators", primary_key: false) do
- add :id, :bigserial, primary_key: true
+ add :address, :binary, primary_key: true
+ add :id, :binary
add :name, :string
- add :address, :binary, null: false
add :url, :string, null: false
add :website, :string
add :description, :text
diff --git a/explorer/priv/repo/migrations/20240719202825_add_restakings_table copy.exs b/explorer/priv/repo/migrations/20240719202825_add_restakings_table copy.exs
index ba7fee48ac..d924d1f86c 100644
--- a/explorer/priv/repo/migrations/20240719202825_add_restakings_table copy.exs
+++ b/explorer/priv/repo/migrations/20240719202825_add_restakings_table copy.exs
@@ -4,7 +4,7 @@ defmodule Explorer.Repo.Migrations.AddRestakingsTable do
def change do
create table("restakings", primary_key: false) do
add :id, :bigserial, primary_key: true
- add :operator_id, references(:operators, column: :id, type: :bigserial), null: false
+ add :operator_address, references(:operators, column: :address, type: :binary), null: false
add :amount, :decimal, precision: 22, scale: 0, null: false
timestamps()
From 3770f7c0becf4eafdf540c197cea758b8e502179 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Fri, 2 Aug 2024 17:01:27 -0300
Subject: [PATCH 080/201] feat: start registry coordinator
---
explorer/lib/abi/IRegistryCoordinator.json | 1 +
.../registry_coordinator_manager.ex | 65 +++++++++++++++++++
2 files changed, 66 insertions(+)
create mode 100644 explorer/lib/abi/IRegistryCoordinator.json
create mode 100644 explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex
diff --git a/explorer/lib/abi/IRegistryCoordinator.json b/explorer/lib/abi/IRegistryCoordinator.json
new file mode 100644
index 0000000000..53ece9cf8e
--- /dev/null
+++ b/explorer/lib/abi/IRegistryCoordinator.json
@@ -0,0 +1 @@
+{"abi":[{"type":"function","name":"blsApkRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IBLSApkRegistry"}],"stateMutability":"view"},{"type":"function","name":"ejectOperator","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getCurrentQuorumBitmap","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint192","internalType":"uint192"}],"stateMutability":"view"},{"type":"function","name":"getOperator","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRegistryCoordinator.OperatorInfo","components":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"status","type":"uint8","internalType":"enum IRegistryCoordinator.OperatorStatus"}]}],"stateMutability":"view"},{"type":"function","name":"getOperatorFromId","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"operator","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getOperatorId","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getOperatorSetParams","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRegistryCoordinator.OperatorSetParam","components":[{"name":"maxOperatorCount","type":"uint32","internalType":"uint32"},{"name":"kickBIPsOfOperatorStake","type":"uint16","internalType":"uint16"},{"name":"kickBIPsOfTotalStake","type":"uint16","internalType":"uint16"}]}],"stateMutability":"view"},{"type":"function","name":"getOperatorStatus","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint8","internalType":"enum IRegistryCoordinator.OperatorStatus"}],"stateMutability":"view"},{"type":"function","name":"getQuorumBitmapAtBlockNumberByIndex","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint192","internalType":"uint192"}],"stateMutability":"view"},{"type":"function","name":"getQuorumBitmapHistoryLength","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getQuorumBitmapIndicesAtBlockNumber","inputs":[{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"operatorIds","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"","type":"uint32[]","internalType":"uint32[]"}],"stateMutability":"view"},{"type":"function","name":"getQuorumBitmapUpdateByIndex","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IRegistryCoordinator.QuorumBitmapUpdate","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"quorumBitmap","type":"uint192","internalType":"uint192"}]}],"stateMutability":"view"},{"type":"function","name":"indexRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IIndexRegistry"}],"stateMutability":"view"},{"type":"function","name":"numRegistries","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"pubkeyRegistrationMessageHash","inputs":[{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"tuple","internalType":"struct BN254.G1Point","components":[{"name":"X","type":"uint256","internalType":"uint256"},{"name":"Y","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"quorumCount","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"quorumUpdateBlockNumber","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"registries","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"stakeRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IStakeRegistry"}],"stateMutability":"view"},{"type":"event","name":"ChurnApproverUpdated","inputs":[{"name":"prevChurnApprover","type":"address","indexed":false,"internalType":"address"},{"name":"newChurnApprover","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EjectorUpdated","inputs":[{"name":"prevEjector","type":"address","indexed":false,"internalType":"address"},{"name":"newEjector","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"OperatorDeregistered","inputs":[{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"operatorId","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"OperatorRegistered","inputs":[{"name":"operator","type":"address","indexed":true,"internalType":"address"},{"name":"operatorId","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"OperatorSetParamsUpdated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"operatorSetParams","type":"tuple","indexed":false,"internalType":"struct IRegistryCoordinator.OperatorSetParam","components":[{"name":"maxOperatorCount","type":"uint32","internalType":"uint32"},{"name":"kickBIPsOfOperatorStake","type":"uint16","internalType":"uint16"},{"name":"kickBIPsOfTotalStake","type":"uint16","internalType":"uint16"}]}],"anonymous":false},{"type":"event","name":"QuorumBlockNumberUpdated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"blocknumber","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"blsApkRegistry()":"5df45946","ejectOperator(address,bytes)":"6e3b17db","getCurrentQuorumBitmap(bytes32)":"871ef049","getOperator(address)":"5865c60c","getOperatorFromId(bytes32)":"296bb064","getOperatorId(address)":"13542a4e","getOperatorSetParams(uint8)":"e65797ad","getOperatorStatus(address)":"fd39105a","getQuorumBitmapAtBlockNumberByIndex(bytes32,uint32,uint256)":"04ec6351","getQuorumBitmapHistoryLength(bytes32)":"03fd3492","getQuorumBitmapIndicesAtBlockNumber(uint32,bytes32[])":"c391425e","getQuorumBitmapUpdateByIndex(bytes32,uint256)":"1eb812da","indexRegistry()":"9e9923c2","numRegistries()":"d72d8dd6","owner()":"8da5cb5b","pubkeyRegistrationMessageHash(address)":"3c2a7f4c","quorumCount()":"9aa1653d","quorumUpdateBlockNumber(uint8)":"249a0c42","registries(uint256)":"6347c900","stakeRegistry()":"68304835"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"prevChurnApprover\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newChurnApprover\",\"type\":\"address\"}],\"name\":\"ChurnApproverUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"prevEjector\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newEjector\",\"type\":\"address\"}],\"name\":\"EjectorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"}],\"name\":\"OperatorDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"}],\"name\":\"OperatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"maxOperatorCount\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"kickBIPsOfOperatorStake\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"kickBIPsOfTotalStake\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"struct IRegistryCoordinator.OperatorSetParam\",\"name\":\"operatorSetParams\",\"type\":\"tuple\"}],\"name\":\"OperatorSetParamsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"blocknumber\",\"type\":\"uint256\"}],\"name\":\"QuorumBlockNumberUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"blsApkRegistry\",\"outputs\":[{\"internalType\":\"contract IBLSApkRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"ejectOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"}],\"name\":\"getCurrentQuorumBitmap\",\"outputs\":[{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getOperator\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"enum IRegistryCoordinator.OperatorStatus\",\"name\":\"status\",\"type\":\"uint8\"}],\"internalType\":\"struct IRegistryCoordinator.OperatorInfo\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"}],\"name\":\"getOperatorFromId\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getOperatorId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getOperatorSetParams\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"maxOperatorCount\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"kickBIPsOfOperatorStake\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"kickBIPsOfTotalStake\",\"type\":\"uint16\"}],\"internalType\":\"struct IRegistryCoordinator.OperatorSetParam\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"getOperatorStatus\",\"outputs\":[{\"internalType\":\"enum IRegistryCoordinator.OperatorStatus\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getQuorumBitmapAtBlockNumberByIndex\",\"outputs\":[{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"}],\"name\":\"getQuorumBitmapHistoryLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"operatorIds\",\"type\":\"bytes32[]\"}],\"name\":\"getQuorumBitmapIndicesAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint32[]\",\"name\":\"\",\"type\":\"uint32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getQuorumBitmapUpdateByIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint192\",\"name\":\"quorumBitmap\",\"type\":\"uint192\"}],\"internalType\":\"struct IRegistryCoordinator.QuorumBitmapUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"indexRegistry\",\"outputs\":[{\"internalType\":\"contract IIndexRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numRegistries\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"pubkeyRegistrationMessageHash\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"X\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"Y\",\"type\":\"uint256\"}],\"internalType\":\"struct BN254.G1Point\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quorumCount\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"quorumUpdateBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"registries\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakeRegistry\",\"outputs\":[{\"internalType\":\"contract IStakeRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Layr Labs, Inc.\",\"kind\":\"dev\",\"methods\":{\"ejectOperator(address,bytes)\":{\"params\":{\"operator\":\"is the operator to eject\",\"quorumNumbers\":\"are the quorum numbers to eject the operator from\"}},\"getQuorumBitmapAtBlockNumberByIndex(bytes32,uint32,uint256)\":{\"details\":\"reverts if `index` is incorrect \"},\"pubkeyRegistrationMessageHash(address)\":{\"params\":{\"operator\":\"is the address of the operator registering their BLS public key\"}}},\"title\":\"Interface for a contract that coordinates between various registries for an AVS.\",\"version\":1},\"userdoc\":{\"events\":{\"OperatorDeregistered(address,bytes32)\":{\"notice\":\"Emits when an operator is deregistered\"},\"OperatorRegistered(address,bytes32)\":{\"notice\":\"Emits when an operator is registered\"},\"QuorumBlockNumberUpdated(uint8,uint256)\":{\"notice\":\"emitted when all the operators for a quorum are updated at once\"}},\"kind\":\"user\",\"methods\":{\"blsApkRegistry()\":{\"notice\":\"the BLS Aggregate Pubkey Registry contract that will keep track of operators' BLS aggregate pubkeys per quorum\"},\"ejectOperator(address,bytes)\":{\"notice\":\"Ejects the provided operator from the provided quorums from the AVS\"},\"getCurrentQuorumBitmap(bytes32)\":{\"notice\":\"Returns the current quorum bitmap for the given `operatorId`\"},\"getOperator(address)\":{\"notice\":\"Returns the operator struct for the given `operator`\"},\"getOperatorFromId(bytes32)\":{\"notice\":\"Returns the operator address for the given `operatorId`\"},\"getOperatorId(address)\":{\"notice\":\"Returns the operatorId for the given `operator`\"},\"getOperatorSetParams(uint8)\":{\"notice\":\"Returns the operator set params for the given `quorumNumber`\"},\"getOperatorStatus(address)\":{\"notice\":\"Returns the status for the given `operator`\"},\"getQuorumBitmapAtBlockNumberByIndex(bytes32,uint32,uint256)\":{\"notice\":\"Returns the quorum bitmap for the given `operatorId` at the given `blockNumber` via the `index`\"},\"getQuorumBitmapHistoryLength(bytes32)\":{\"notice\":\"Returns the length of the quorum bitmap history for the given `operatorId`\"},\"getQuorumBitmapIndicesAtBlockNumber(uint32,bytes32[])\":{\"notice\":\"Returns the indices of the quorumBitmaps for the provided `operatorIds` at the given `blockNumber`\"},\"getQuorumBitmapUpdateByIndex(bytes32,uint256)\":{\"notice\":\"Returns the `index`th entry in the operator with `operatorId`'s bitmap history\"},\"indexRegistry()\":{\"notice\":\"the index Registry contract that will keep track of operators' indexes\"},\"numRegistries()\":{\"notice\":\"Returns the number of registries\"},\"owner()\":{\"notice\":\"The owner of the registry coordinator\"},\"pubkeyRegistrationMessageHash(address)\":{\"notice\":\"Returns the message hash that an operator must sign to register their BLS public key.\"},\"quorumCount()\":{\"notice\":\"Returns the number of quorums the registry coordinator has created\"},\"quorumUpdateBlockNumber(uint8)\":{\"notice\":\"returns the blocknumber the quorum was last updated all at once for all operators\"},\"registries(uint256)\":{\"notice\":\"Returns the registry at the desired index\"},\"stakeRegistry()\":{\"notice\":\"the Stake registry contract that will keep track of operators' stakes\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol\":\"IRegistryCoordinator\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/\",\":eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/\",\":eigenlayer-middleware/=lib/eigenlayer-middleware/src/\",\":eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/\",\":erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/\"]},\"sources\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol\":{\"keccak256\":\"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983\",\"dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol\":{\"keccak256\":\"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914\",\"dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol\":{\"keccak256\":\"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c\",\"license\":\"CC0-1.0\",\"urls\":[\"bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91\",\"dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol\":{\"keccak256\":\"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc\",\"dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol\":{\"keccak256\":\"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8\",\"dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol\":{\"keccak256\":\"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324\",\"dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol\":{\"keccak256\":\"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d\",\"dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol\":{\"keccak256\":\"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c\",\"dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol\":{\"keccak256\":\"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232\",\"dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol\":{\"keccak256\":\"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73\",\"dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol\":{\"keccak256\":\"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef\",\"dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol\":{\"keccak256\":\"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7\",\"dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol\":{\"keccak256\":\"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f\",\"dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol\":{\"keccak256\":\"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f\",\"dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/eigenlayer-middleware/src/interfaces/IBLSApkRegistry.sol\":{\"keccak256\":\"0xc07a5edfd95ab4f16f16a8dc8e76eadf4b0e90fe49db90540d01daaad86898c5\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://52b53266450a53da641e82d8ae3be93c5e09f8342b4ea0cc96bb9038d8406354\",\"dweb:/ipfs/QmVuoiQyqPTLCGnyt8zDaxiyaj4ETdgTGKv4MDHWzqEDjp\"]},\"lib/eigenlayer-middleware/src/interfaces/IIndexRegistry.sol\":{\"keccak256\":\"0x83b2d56aacf27e65c4959a832c5de573e013908c044f6e48ea8284ac5282ae2b\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://877af382587e96bb39bcc6db8bb5e4b871db5025c52347d4bee9afeaa4a6cc8d\",\"dweb:/ipfs/QmdnhsQCChzq2o5NgbeT3JxSsEcMm1PC9QW6zenZNPjD9F\"]},\"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol\":{\"keccak256\":\"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25\",\"dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY\"]},\"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol\":{\"keccak256\":\"0xdd8effb082c1d5957d5ff43d7c59497b32866a6d82bcc7d5efa49ea9bc9b3385\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cb33a2a1446585b13b7a509e880c60d658d2d2522ec48a9f02e30d2cff54002d\",\"dweb:/ipfs/QmVNG8ZPZkXzNEadPdTj1uBYLiZdCnYfsE5iGU6nJcJXiD\"]},\"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol\":{\"keccak256\":\"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97\",\"dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B\"]},\"lib/eigenlayer-middleware/src/libraries/BN254.sol\":{\"keccak256\":\"0xb428c8d0c3b325507a88a61a80115493eb88606ccc19ed64a31e11294ab853b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7b6fb935bfe0494e6ff970c8f30a86d5f4cf5c3e0967300c28cd383c043acae\",\"dweb:/ipfs/QmUHfFZaVjLPXhkBmcxrZhAHZaSFQDqXtrLGpjGBQBa5Ki\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.12+commit.f00d7308"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"prevChurnApprover","type":"address","indexed":false},{"internalType":"address","name":"newChurnApprover","type":"address","indexed":false}],"type":"event","name":"ChurnApproverUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"prevEjector","type":"address","indexed":false},{"internalType":"address","name":"newEjector","type":"address","indexed":false}],"type":"event","name":"EjectorUpdated","anonymous":false},{"inputs":[{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bytes32","name":"operatorId","type":"bytes32","indexed":true}],"type":"event","name":"OperatorDeregistered","anonymous":false},{"inputs":[{"internalType":"address","name":"operator","type":"address","indexed":true},{"internalType":"bytes32","name":"operatorId","type":"bytes32","indexed":true}],"type":"event","name":"OperatorRegistered","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"struct IRegistryCoordinator.OperatorSetParam","name":"operatorSetParams","type":"tuple","components":[{"internalType":"uint32","name":"maxOperatorCount","type":"uint32"},{"internalType":"uint16","name":"kickBIPsOfOperatorStake","type":"uint16"},{"internalType":"uint16","name":"kickBIPsOfTotalStake","type":"uint16"}],"indexed":false}],"type":"event","name":"OperatorSetParamsUpdated","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"uint256","name":"blocknumber","type":"uint256","indexed":false}],"type":"event","name":"QuorumBlockNumberUpdated","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"blsApkRegistry","outputs":[{"internalType":"contract IBLSApkRegistry","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"ejectOperator"},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getCurrentQuorumBitmap","outputs":[{"internalType":"uint192","name":"","type":"uint192"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"getOperator","outputs":[{"internalType":"struct IRegistryCoordinator.OperatorInfo","name":"","type":"tuple","components":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"enum IRegistryCoordinator.OperatorStatus","name":"status","type":"uint8"}]}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getOperatorFromId","outputs":[{"internalType":"address","name":"operator","type":"address"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"getOperatorId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getOperatorSetParams","outputs":[{"internalType":"struct IRegistryCoordinator.OperatorSetParam","name":"","type":"tuple","components":[{"internalType":"uint32","name":"maxOperatorCount","type":"uint32"},{"internalType":"uint16","name":"kickBIPsOfOperatorStake","type":"uint16"},{"internalType":"uint16","name":"kickBIPsOfTotalStake","type":"uint16"}]}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"getOperatorStatus","outputs":[{"internalType":"enum IRegistryCoordinator.OperatorStatus","name":"","type":"uint8"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getQuorumBitmapAtBlockNumberByIndex","outputs":[{"internalType":"uint192","name":"","type":"uint192"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"}],"stateMutability":"view","type":"function","name":"getQuorumBitmapHistoryLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes32[]","name":"operatorIds","type":"bytes32[]"}],"stateMutability":"view","type":"function","name":"getQuorumBitmapIndicesAtBlockNumber","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getQuorumBitmapUpdateByIndex","outputs":[{"internalType":"struct IRegistryCoordinator.QuorumBitmapUpdate","name":"","type":"tuple","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint192","name":"quorumBitmap","type":"uint192"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"indexRegistry","outputs":[{"internalType":"contract IIndexRegistry","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"numRegistries","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"pubkeyRegistrationMessageHash","outputs":[{"internalType":"struct BN254.G1Point","name":"","type":"tuple","components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}]}]},{"inputs":[],"stateMutability":"view","type":"function","name":"quorumCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"quorumUpdateBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"registries","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"stakeRegistry","outputs":[{"internalType":"contract IStakeRegistry","name":"","type":"address"}]}],"devdoc":{"kind":"dev","methods":{"ejectOperator(address,bytes)":{"params":{"operator":"is the operator to eject","quorumNumbers":"are the quorum numbers to eject the operator from"}},"getQuorumBitmapAtBlockNumberByIndex(bytes32,uint32,uint256)":{"details":"reverts if `index` is incorrect "},"pubkeyRegistrationMessageHash(address)":{"params":{"operator":"is the address of the operator registering their BLS public key"}}},"version":1},"userdoc":{"kind":"user","methods":{"blsApkRegistry()":{"notice":"the BLS Aggregate Pubkey Registry contract that will keep track of operators' BLS aggregate pubkeys per quorum"},"ejectOperator(address,bytes)":{"notice":"Ejects the provided operator from the provided quorums from the AVS"},"getCurrentQuorumBitmap(bytes32)":{"notice":"Returns the current quorum bitmap for the given `operatorId`"},"getOperator(address)":{"notice":"Returns the operator struct for the given `operator`"},"getOperatorFromId(bytes32)":{"notice":"Returns the operator address for the given `operatorId`"},"getOperatorId(address)":{"notice":"Returns the operatorId for the given `operator`"},"getOperatorSetParams(uint8)":{"notice":"Returns the operator set params for the given `quorumNumber`"},"getOperatorStatus(address)":{"notice":"Returns the status for the given `operator`"},"getQuorumBitmapAtBlockNumberByIndex(bytes32,uint32,uint256)":{"notice":"Returns the quorum bitmap for the given `operatorId` at the given `blockNumber` via the `index`"},"getQuorumBitmapHistoryLength(bytes32)":{"notice":"Returns the length of the quorum bitmap history for the given `operatorId`"},"getQuorumBitmapIndicesAtBlockNumber(uint32,bytes32[])":{"notice":"Returns the indices of the quorumBitmaps for the provided `operatorIds` at the given `blockNumber`"},"getQuorumBitmapUpdateByIndex(bytes32,uint256)":{"notice":"Returns the `index`th entry in the operator with `operatorId`'s bitmap history"},"indexRegistry()":{"notice":"the index Registry contract that will keep track of operators' indexes"},"numRegistries()":{"notice":"Returns the number of registries"},"owner()":{"notice":"The owner of the registry coordinator"},"pubkeyRegistrationMessageHash(address)":{"notice":"Returns the message hash that an operator must sign to register their BLS public key."},"quorumCount()":{"notice":"Returns the number of quorums the registry coordinator has created"},"quorumUpdateBlockNumber(uint8)":{"notice":"returns the blocknumber the quorum was last updated all at once for all operators"},"registries(uint256)":{"notice":"Returns the registry at the desired index"},"stakeRegistry()":{"notice":"the Stake registry contract that will keep track of operators' stakes"}},"version":1}},"settings":{"remappings":["@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/","eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/","eigenlayer-middleware/=lib/eigenlayer-middleware/src/","eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/","erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol":"IRegistryCoordinator"},"evmVersion":"london","libraries":{}},"sources":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol":{"keccak256":"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00","urls":["bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983","dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol":{"keccak256":"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9","urls":["bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914","dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol":{"keccak256":"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c","urls":["bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91","dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz"],"license":"CC0-1.0"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol":{"keccak256":"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba","urls":["bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc","dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol":{"keccak256":"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c","urls":["bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8","dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol":{"keccak256":"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f","urls":["bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324","dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol":{"keccak256":"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49","urls":["bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d","dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol":{"keccak256":"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092","urls":["bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c","dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol":{"keccak256":"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79","urls":["bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232","dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol":{"keccak256":"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420","urls":["bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73","dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol":{"keccak256":"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52","urls":["bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef","dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol":{"keccak256":"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377","urls":["bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7","dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol":{"keccak256":"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d","urls":["bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f","dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol":{"keccak256":"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71","urls":["bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f","dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61","urls":["bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354","dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/eigenlayer-middleware/src/interfaces/IBLSApkRegistry.sol":{"keccak256":"0xc07a5edfd95ab4f16f16a8dc8e76eadf4b0e90fe49db90540d01daaad86898c5","urls":["bzz-raw://52b53266450a53da641e82d8ae3be93c5e09f8342b4ea0cc96bb9038d8406354","dweb:/ipfs/QmVuoiQyqPTLCGnyt8zDaxiyaj4ETdgTGKv4MDHWzqEDjp"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IIndexRegistry.sol":{"keccak256":"0x83b2d56aacf27e65c4959a832c5de573e013908c044f6e48ea8284ac5282ae2b","urls":["bzz-raw://877af382587e96bb39bcc6db8bb5e4b871db5025c52347d4bee9afeaa4a6cc8d","dweb:/ipfs/QmdnhsQCChzq2o5NgbeT3JxSsEcMm1PC9QW6zenZNPjD9F"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol":{"keccak256":"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3","urls":["bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25","dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol":{"keccak256":"0xdd8effb082c1d5957d5ff43d7c59497b32866a6d82bcc7d5efa49ea9bc9b3385","urls":["bzz-raw://cb33a2a1446585b13b7a509e880c60d658d2d2522ec48a9f02e30d2cff54002d","dweb:/ipfs/QmVNG8ZPZkXzNEadPdTj1uBYLiZdCnYfsE5iGU6nJcJXiD"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol":{"keccak256":"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4","urls":["bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97","dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/libraries/BN254.sol":{"keccak256":"0xb428c8d0c3b325507a88a61a80115493eb88606ccc19ed64a31e11294ab853b3","urls":["bzz-raw://d7b6fb935bfe0494e6ff970c8f30a86d5f4cf5c3e0967300c28cd383c043acae","dweb:/ipfs/QmUHfFZaVjLPXhkBmcxrZhAHZaSFQDqXtrLGpjGBQBa5Ki"],"license":"MIT"}},"version":1},"id":130}
\ No newline at end of file
diff --git a/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex b/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex
new file mode 100644
index 0000000000..4cb9e4b400
--- /dev/null
+++ b/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex
@@ -0,0 +1,65 @@
+defmodule RegistryCoordinatorManager do
+ require Logger
+
+ @aligned_config_file System.get_env("ALIGNED_CONFIG_FILE")
+
+ config_file_path =
+ case @aligned_config_file do
+ nil -> raise("ALIGNED_CONFIG_FILE not set in .env")
+ file -> file
+ end
+
+ {status, config_json_string} = File.read(config_file_path)
+
+ case status do
+ :ok ->
+ Logger.debug("Eigenlayer deployment file read successfully")
+
+ :error ->
+ raise(
+ "Config file not read successfully, did you run make create-env? If you did,\n make sure Eigenlayer config file is correctly stored"
+ )
+ end
+
+ @registry_coordinator_address Jason.decode!(config_json_string)
+ |> Map.get("addresses")
+ |> Map.get("registryCoordinator")
+
+ use Ethers.Contract,
+ abi_file: "lib/abi/IRegistryCoordinator.json",
+ default_address: @registry_coordinator_address
+
+ def get_registry_coordinator_address() do
+ @registry_coordinator_address
+ end
+
+ # relevant:
+ # /// Emits when an operator is registered
+ # event OperatorRegistered(address indexed operator, bytes32 indexed operatorId);
+
+ # /// Emits when an operator is deregistered
+ # event OperatorDeregistered(address indexed operator, bytes32 indexed operatorId);
+
+ # /// @notice Returns the operator struct for the given `operator`
+ # function getOperator(address operator) external view returns (OperatorInfo memory);
+
+ # /// @notice Returns the operatorId for the given `operator`
+ # function getOperatorId(address operator) external view returns (bytes32);
+
+ # /// @notice Returns the operator address for the given `operatorId`
+ # function getOperatorFromId(bytes32 operatorId) external view returns (address operator);
+
+ # /// @notice Returns the status for the given `operator`
+ # function getOperatorStatus(address operator) external view returns (IRegistryCoordinator.OperatorStatus);
+
+ def get_operator_id_from_chain(operator_address) do
+ case RegistryCoordinatorManager.get_operator_id(Utils.string_to_bytes32(operator_address))
+ |> Ethers.call() do
+ {:ok, data} ->
+ data
+ error ->
+ {:error, error}
+ end
+ end
+
+end
From e9f2dd9f60bc877ef082f665064fd22af406a05b Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Fri, 2 Aug 2024 17:01:41 -0300
Subject: [PATCH 081/201] feat: start stake registrty
---
explorer/lib/abi/IStakeRegistry.json | 1 +
.../stake_registry_manager.ex | 36 +++++++++++++++++++
2 files changed, 37 insertions(+)
create mode 100644 explorer/lib/abi/IStakeRegistry.json
create mode 100644 explorer/lib/explorer/contract_managers/stake_registry_manager.ex
diff --git a/explorer/lib/abi/IStakeRegistry.json b/explorer/lib/abi/IStakeRegistry.json
new file mode 100644
index 0000000000..4bedb2dc28
--- /dev/null
+++ b/explorer/lib/abi/IStakeRegistry.json
@@ -0,0 +1 @@
+{"abi":[{"type":"function","name":"WEIGHTING_DIVISOR","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"type":"function","name":"addStrategies","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"strategyParams","type":"tuple[]","internalType":"struct IStakeRegistry.StrategyParams[]","components":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"multiplier","type":"uint96","internalType":"uint96"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegation","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IDelegationManager"}],"stateMutability":"view"},{"type":"function","name":"deregisterOperator","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getCurrentStake","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getCurrentTotalStake","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getLatestStakeUpdate","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StakeUpdate","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"getStakeAtBlockNumber","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getStakeAtBlockNumberAndIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getStakeHistory","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IStakeRegistry.StakeUpdate[]","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"getStakeUpdateAtIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StakeUpdate","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"getStakeUpdateIndexAtBlockNumber","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeAtBlockNumberFromIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeHistoryLength","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeIndicesAtBlockNumber","inputs":[{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint32[]","internalType":"uint32[]"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeUpdateAtIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StakeUpdate","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"initializeQuorum","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"minimumStake","type":"uint96","internalType":"uint96"},{"name":"strategyParams","type":"tuple[]","internalType":"struct IStakeRegistry.StrategyParams[]","components":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"multiplier","type":"uint96","internalType":"uint96"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"minimumStakeForQuorum","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"modifyStrategyParams","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"strategyIndices","type":"uint256[]","internalType":"uint256[]"},{"name":"newMultipliers","type":"uint96[]","internalType":"uint96[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"registerOperator","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint96[]","internalType":"uint96[]"},{"name":"","type":"uint96[]","internalType":"uint96[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"registryCoordinator","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"removeStrategies","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"indicesToRemove","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"strategyParamsByIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StrategyParams","components":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"multiplier","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"strategyParamsLength","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"updateOperatorStake","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint192","internalType":"uint192"}],"stateMutability":"nonpayable"},{"type":"function","name":"weightOfOperatorForQuorum","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"event","name":"MinimumStakeForQuorumUpdated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"minimumStake","type":"uint96","indexed":false,"internalType":"uint96"}],"anonymous":false},{"type":"event","name":"OperatorStakeUpdate","inputs":[{"name":"operatorId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"stake","type":"uint96","indexed":false,"internalType":"uint96"}],"anonymous":false},{"type":"event","name":"QuorumCreated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"StrategyAddedToQuorum","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"}],"anonymous":false},{"type":"event","name":"StrategyMultiplierUpdated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"},{"name":"multiplier","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"StrategyRemovedFromQuorum","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"WEIGHTING_DIVISOR()":"5e5a6775","addStrategies(uint8,(address,uint96)[])":"c601527d","delegation()":"df5cf723","deregisterOperator(bytes32,bytes)":"bd29b8cd","getCurrentStake(bytes32,uint8)":"5401ed27","getCurrentTotalStake(uint8)":"d5eccc05","getLatestStakeUpdate(bytes32,uint8)":"f851e198","getStakeAtBlockNumber(bytes32,uint8,uint32)":"fa28c627","getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)":"f2be94ae","getStakeHistory(bytes32,uint8)":"2cd95940","getStakeUpdateAtIndex(uint8,bytes32,uint256)":"ac6bfb03","getStakeUpdateIndexAtBlockNumber(bytes32,uint8,uint32)":"dd9846b9","getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)":"c8294c56","getTotalStakeHistoryLength(uint8)":"0491b41c","getTotalStakeIndicesAtBlockNumber(uint32,bytes)":"81c07502","getTotalStakeUpdateAtIndex(uint8,uint256)":"b6904b78","initializeQuorum(uint8,uint96,(address,uint96)[])":"ff694a77","minimumStakeForQuorum(uint8)":"c46778a5","modifyStrategyParams(uint8,uint256[],uint96[])":"20b66298","registerOperator(address,bytes32,bytes)":"25504777","registryCoordinator()":"6d14a987","removeStrategies(uint8,uint256[])":"5f1f2d77","strategyParamsByIndex(uint8,uint256)":"adc804da","strategyParamsLength(uint8)":"3ca5a5f5","updateOperatorStake(address,bytes32,bytes)":"66acfefe","weightOfOperatorForQuorum(uint8,address)":"1f9b74e0"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"minimumStake\",\"type\":\"uint96\"}],\"name\":\"MinimumStakeForQuorumUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"name\":\"OperatorStakeUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"QuorumCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"StrategyAddedToQuorum\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"multiplier\",\"type\":\"uint256\"}],\"name\":\"StrategyMultiplierUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"StrategyRemovedFromQuorum\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"WEIGHTING_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"multiplier\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StrategyParams[]\",\"name\":\"strategyParams\",\"type\":\"tuple[]\"}],\"name\":\"addStrategies\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"delegation\",\"outputs\":[{\"internalType\":\"contract IDelegationManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"deregisterOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getCurrentStake\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getCurrentTotalStake\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getLatestStakeUpdate\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"}],\"name\":\"getStakeAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getStakeAtBlockNumberAndIndex\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getStakeHistory\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getStakeUpdateAtIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"}],\"name\":\"getStakeUpdateIndexAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getTotalStakeAtBlockNumberFromIndex\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getTotalStakeHistoryLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"getTotalStakeIndicesAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint32[]\",\"name\":\"\",\"type\":\"uint32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getTotalStakeUpdateAtIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint96\",\"name\":\"minimumStake\",\"type\":\"uint96\"},{\"components\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"multiplier\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StrategyParams[]\",\"name\":\"strategyParams\",\"type\":\"tuple[]\"}],\"name\":\"initializeQuorum\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"minimumStakeForQuorum\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256[]\",\"name\":\"strategyIndices\",\"type\":\"uint256[]\"},{\"internalType\":\"uint96[]\",\"name\":\"newMultipliers\",\"type\":\"uint96[]\"}],\"name\":\"modifyStrategyParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"registerOperator\",\"outputs\":[{\"internalType\":\"uint96[]\",\"name\":\"\",\"type\":\"uint96[]\"},{\"internalType\":\"uint96[]\",\"name\":\"\",\"type\":\"uint96[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registryCoordinator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256[]\",\"name\":\"indicesToRemove\",\"type\":\"uint256[]\"}],\"name\":\"removeStrategies\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"strategyParamsByIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"multiplier\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StrategyParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"strategyParamsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"updateOperatorStake\",\"outputs\":[{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"weightOfOperatorForQuorum\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Layr Labs, Inc.\",\"kind\":\"dev\",\"methods\":{\"deregisterOperator(bytes32,bytes)\":{\"details\":\"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already deregistered 5) `quorumNumbers` is a subset of the quorumNumbers that the operator is registered for\",\"params\":{\"operatorId\":\"The id of the operator to deregister.\",\"quorumNumbers\":\"The quorum numbers the operator is deregistering from, where each byte is an 8 bit integer quorumNumber.\"}},\"getCurrentStake(bytes32,uint8)\":{\"details\":\"Function returns weight of **0** in the event that the operator has no stake history\"},\"getCurrentTotalStake(uint8)\":{\"details\":\"Will revert if `_totalStakeHistory[quorumNumber]` is empty.\"},\"getLatestStakeUpdate(bytes32,uint8)\":{\"details\":\"Function returns an StakeUpdate struct with **every entry equal to 0** in the event that the operator has no stake history\"},\"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)\":{\"details\":\"Function will revert if `index` is out-of-bounds.used the BLSSignatureChecker to get past stakes of signing operators\",\"params\":{\"blockNumber\":\"Block number to make sure the stake is from.\",\"index\":\"Array index for lookup, within the dynamic array `operatorIdToStakeHistory[operatorId][quorumNumber]`.\",\"operatorId\":\"The id of the operator of interest.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getStakeHistory(bytes32,uint8)\":{\"params\":{\"operatorId\":\"The id of the operator of interest.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getStakeUpdateAtIndex(uint8,bytes32,uint256)\":{\"details\":\"Function will revert if `index` is out-of-bounds.\",\"params\":{\"index\":\"Array index for lookup, within the dynamic array `operatorIdToStakeHistory[operatorId][quorumNumber]`.\",\"operatorId\":\"The id of the operator of interest.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)\":{\"details\":\"Function will revert if `index` is out-of-bounds.used the BLSSignatureChecker to get past stakes of signing operators\",\"params\":{\"blockNumber\":\"Block number to make sure the stake is from.\",\"index\":\"Array index for lookup, within the dynamic array `totalStakeHistory[quorumNumber]`.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getTotalStakeUpdateAtIndex(uint8,uint256)\":{\"params\":{\"index\":\"Array index for lookup, within the dynamic array `totalStakeHistory[quorumNumber]`.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"modifyStrategyParams(uint8,uint256[],uint96[])\":{\"params\":{\"newMultipliers\":\"are the new multipliers for the strategies\",\"quorumNumber\":\"is the quorum number to change the strategy for\",\"strategyIndices\":\"are the indices of the strategies to change\"}},\"registerOperator(address,bytes32,bytes)\":{\"details\":\"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already registered\",\"params\":{\"operator\":\"The address of the operator to register.\",\"operatorId\":\"The id of the operator to register.\",\"quorumNumbers\":\"The quorum numbers the operator is registering for, where each byte is an 8 bit integer quorumNumber.\"},\"returns\":{\"_0\":\"The operator's current stake for each quorum, and the total stake for each quorum\"}},\"removeStrategies(uint8,uint256[])\":{\"details\":\"higher indices should be *first* in the list of @param indicesToRemove, since otherwise the removal of lower index entries will cause a shift in the indices of the other strategiesToRemove\",\"params\":{\"quorumNumber\":\".\"}},\"updateOperatorStake(address,bytes32,bytes)\":{\"returns\":{\"_0\":\"A bitmap of quorums where the operator no longer meets the minimum stake and should be deregistered.\"}},\"weightOfOperatorForQuorum(uint8,address)\":{\"details\":\"reverts in the case that `quorumNumber` is greater than or equal to `quorumCount`\"}},\"title\":\"Interface for a `Registry` that keeps track of stakes of operators for up to 256 quorums.\",\"version\":1},\"userdoc\":{\"events\":{\"MinimumStakeForQuorumUpdated(uint8,uint96)\":{\"notice\":\"emitted when the minimum stake for a quorum is updated\"},\"OperatorStakeUpdate(bytes32,uint8,uint96)\":{\"notice\":\"emitted whenever the stake of `operator` is updated\"},\"QuorumCreated(uint8)\":{\"notice\":\"emitted when a new quorum is created\"},\"StrategyAddedToQuorum(uint8,address)\":{\"notice\":\"emitted when `strategy` has been added to the array at `strategyParams[quorumNumber]`\"},\"StrategyMultiplierUpdated(uint8,address,uint256)\":{\"notice\":\"emitted when `strategy` has its `multiplier` updated in the array at `strategyParams[quorumNumber]`\"},\"StrategyRemovedFromQuorum(uint8,address)\":{\"notice\":\"emitted when `strategy` has removed from the array at `strategyParams[quorumNumber]`\"}},\"kind\":\"user\",\"methods\":{\"WEIGHTING_DIVISOR()\":{\"notice\":\"Constant used as a divisor in calculating weights.\"},\"addStrategies(uint8,(address,uint96)[])\":{\"notice\":\"Adds new strategies and the associated multipliers to the @param quorumNumber.\"},\"delegation()\":{\"notice\":\"Returns the EigenLayer delegation manager contract.\"},\"deregisterOperator(bytes32,bytes)\":{\"notice\":\"Deregisters the operator with `operatorId` for the specified `quorumNumbers`.\"},\"getCurrentStake(bytes32,uint8)\":{\"notice\":\"Returns the most recent stake weight for the `operatorId` for quorum `quorumNumber`\"},\"getCurrentTotalStake(uint8)\":{\"notice\":\"Returns the stake weight from the latest entry in `_totalStakeHistory` for quorum `quorumNumber`.\"},\"getLatestStakeUpdate(bytes32,uint8)\":{\"notice\":\"Returns the most recent stake weight for the `operatorId` for a certain quorum\"},\"getStakeAtBlockNumber(bytes32,uint8,uint32)\":{\"notice\":\"Returns the stake of the operator for the provided `quorumNumber` at the given `blockNumber`\"},\"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)\":{\"notice\":\"Returns the stake weight corresponding to `operatorId` for quorum `quorumNumber`, at the `index`-th entry in the `operatorIdToStakeHistory[operatorId][quorumNumber]` array if the entry corresponds to the operator's stake at `blockNumber`. Reverts otherwise.\"},\"getStakeHistory(bytes32,uint8)\":{\"notice\":\"Returns the entire `operatorIdToStakeHistory[operatorId][quorumNumber]` array.\"},\"getStakeUpdateAtIndex(uint8,bytes32,uint256)\":{\"notice\":\"Returns the `index`-th entry in the `operatorIdToStakeHistory[operatorId][quorumNumber]` array.\"},\"getStakeUpdateIndexAtBlockNumber(bytes32,uint8,uint32)\":{\"notice\":\"Returns the indices of the operator stakes for the provided `quorumNumber` at the given `blockNumber`\"},\"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)\":{\"notice\":\"Returns the total stake weight for quorum `quorumNumber`, at the `index`-th entry in the `totalStakeHistory[quorumNumber]` array if the entry corresponds to the total stake at `blockNumber`. Reverts otherwise.\"},\"getTotalStakeIndicesAtBlockNumber(uint32,bytes)\":{\"notice\":\"Returns the indices of the total stakes for the provided `quorumNumbers` at the given `blockNumber`\"},\"getTotalStakeUpdateAtIndex(uint8,uint256)\":{\"notice\":\"Returns the `index`-th entry in the dynamic array of total stake, `totalStakeHistory` for quorum `quorumNumber`.\"},\"initializeQuorum(uint8,uint96,(address,uint96)[])\":{\"notice\":\"Initialize a new quorum created by the registry coordinator by setting strategies, weights, and minimum stake\"},\"minimumStakeForQuorum(uint8)\":{\"notice\":\"In order to register for a quorum i, an operator must have at least `minimumStakeForQuorum[i]`\"},\"modifyStrategyParams(uint8,uint256[],uint96[])\":{\"notice\":\"This function is used for modifying the weights of strategies that are already in the mapping strategyParams for a specific\"},\"registerOperator(address,bytes32,bytes)\":{\"notice\":\"Registers the `operator` with `operatorId` for the specified `quorumNumbers`.\"},\"removeStrategies(uint8,uint256[])\":{\"notice\":\"This function is used for removing strategies and their associated weights from the\"},\"strategyParamsByIndex(uint8,uint256)\":{\"notice\":\"Returns the strategy and weight multiplier for the `index`'th strategy in the quorum `quorumNumber`\"},\"strategyParamsLength(uint8)\":{\"notice\":\"Returns the length of the dynamic array stored in `strategyParams[quorumNumber]`.\"},\"updateOperatorStake(address,bytes32,bytes)\":{\"notice\":\"Called by the registry coordinator to update an operator's stake for one or more quorums. If the operator no longer has the minimum stake required for a quorum, they are added to the\"},\"weightOfOperatorForQuorum(uint8,address)\":{\"notice\":\"This function computes the total weight of the @param operator in the quorum @param quorumNumber.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol\":\"IStakeRegistry\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/\",\":eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/\",\":eigenlayer-middleware/=lib/eigenlayer-middleware/src/\",\":eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/\",\":erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/\"]},\"sources\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol\":{\"keccak256\":\"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983\",\"dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol\":{\"keccak256\":\"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914\",\"dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol\":{\"keccak256\":\"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c\",\"license\":\"CC0-1.0\",\"urls\":[\"bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91\",\"dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol\":{\"keccak256\":\"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc\",\"dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol\":{\"keccak256\":\"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8\",\"dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol\":{\"keccak256\":\"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324\",\"dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol\":{\"keccak256\":\"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d\",\"dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol\":{\"keccak256\":\"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c\",\"dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol\":{\"keccak256\":\"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232\",\"dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol\":{\"keccak256\":\"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73\",\"dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol\":{\"keccak256\":\"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef\",\"dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol\":{\"keccak256\":\"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7\",\"dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol\":{\"keccak256\":\"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f\",\"dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol\":{\"keccak256\":\"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f\",\"dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol\":{\"keccak256\":\"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25\",\"dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY\"]},\"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol\":{\"keccak256\":\"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97\",\"dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.12+commit.f00d7308"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"uint96","name":"minimumStake","type":"uint96","indexed":false}],"type":"event","name":"MinimumStakeForQuorumUpdated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32","indexed":true},{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":false},{"internalType":"uint96","name":"stake","type":"uint96","indexed":false}],"type":"event","name":"OperatorStakeUpdate","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true}],"type":"event","name":"QuorumCreated","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false}],"type":"event","name":"StrategyAddedToQuorum","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false},{"internalType":"uint256","name":"multiplier","type":"uint256","indexed":false}],"type":"event","name":"StrategyMultiplierUpdated","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false}],"type":"event","name":"StrategyRemovedFromQuorum","anonymous":false},{"inputs":[],"stateMutability":"pure","type":"function","name":"WEIGHTING_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"struct IStakeRegistry.StrategyParams[]","name":"strategyParams","type":"tuple[]","components":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint96","name":"multiplier","type":"uint96"}]}],"stateMutability":"nonpayable","type":"function","name":"addStrategies"},{"inputs":[],"stateMutability":"view","type":"function","name":"delegation","outputs":[{"internalType":"contract IDelegationManager","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"deregisterOperator"},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getCurrentStake","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getCurrentTotalStake","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getLatestStakeUpdate","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate","name":"","type":"tuple","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"stateMutability":"view","type":"function","name":"getStakeAtBlockNumber","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getStakeAtBlockNumberAndIndex","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getStakeHistory","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate[]","name":"","type":"tuple[]","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getStakeUpdateAtIndex","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate","name":"","type":"tuple","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"stateMutability":"view","type":"function","name":"getStakeUpdateIndexAtBlockNumber","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getTotalStakeAtBlockNumberFromIndex","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getTotalStakeHistoryLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"view","type":"function","name":"getTotalStakeIndicesAtBlockNumber","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getTotalStakeUpdateAtIndex","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate","name":"","type":"tuple","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint96","name":"minimumStake","type":"uint96"},{"internalType":"struct IStakeRegistry.StrategyParams[]","name":"strategyParams","type":"tuple[]","components":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint96","name":"multiplier","type":"uint96"}]}],"stateMutability":"nonpayable","type":"function","name":"initializeQuorum"},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"minimumStakeForQuorum","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256[]","name":"strategyIndices","type":"uint256[]"},{"internalType":"uint96[]","name":"newMultipliers","type":"uint96[]"}],"stateMutability":"nonpayable","type":"function","name":"modifyStrategyParams"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"registerOperator","outputs":[{"internalType":"uint96[]","name":"","type":"uint96[]"},{"internalType":"uint96[]","name":"","type":"uint96[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"registryCoordinator","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256[]","name":"indicesToRemove","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function","name":"removeStrategies"},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"strategyParamsByIndex","outputs":[{"internalType":"struct IStakeRegistry.StrategyParams","name":"","type":"tuple","components":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint96","name":"multiplier","type":"uint96"}]}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"strategyParamsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateOperatorStake","outputs":[{"internalType":"uint192","name":"","type":"uint192"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"weightOfOperatorForQuorum","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]}],"devdoc":{"kind":"dev","methods":{"deregisterOperator(bytes32,bytes)":{"details":"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already deregistered 5) `quorumNumbers` is a subset of the quorumNumbers that the operator is registered for","params":{"operatorId":"The id of the operator to deregister.","quorumNumbers":"The quorum numbers the operator is deregistering from, where each byte is an 8 bit integer quorumNumber."}},"getCurrentStake(bytes32,uint8)":{"details":"Function returns weight of **0** in the event that the operator has no stake history"},"getCurrentTotalStake(uint8)":{"details":"Will revert if `_totalStakeHistory[quorumNumber]` is empty."},"getLatestStakeUpdate(bytes32,uint8)":{"details":"Function returns an StakeUpdate struct with **every entry equal to 0** in the event that the operator has no stake history"},"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)":{"details":"Function will revert if `index` is out-of-bounds.used the BLSSignatureChecker to get past stakes of signing operators","params":{"blockNumber":"Block number to make sure the stake is from.","index":"Array index for lookup, within the dynamic array `operatorIdToStakeHistory[operatorId][quorumNumber]`.","operatorId":"The id of the operator of interest.","quorumNumber":"The quorum number to get the stake for."}},"getStakeHistory(bytes32,uint8)":{"params":{"operatorId":"The id of the operator of interest.","quorumNumber":"The quorum number to get the stake for."}},"getStakeUpdateAtIndex(uint8,bytes32,uint256)":{"details":"Function will revert if `index` is out-of-bounds.","params":{"index":"Array index for lookup, within the dynamic array `operatorIdToStakeHistory[operatorId][quorumNumber]`.","operatorId":"The id of the operator of interest.","quorumNumber":"The quorum number to get the stake for."}},"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)":{"details":"Function will revert if `index` is out-of-bounds.used the BLSSignatureChecker to get past stakes of signing operators","params":{"blockNumber":"Block number to make sure the stake is from.","index":"Array index for lookup, within the dynamic array `totalStakeHistory[quorumNumber]`.","quorumNumber":"The quorum number to get the stake for."}},"getTotalStakeUpdateAtIndex(uint8,uint256)":{"params":{"index":"Array index for lookup, within the dynamic array `totalStakeHistory[quorumNumber]`.","quorumNumber":"The quorum number to get the stake for."}},"modifyStrategyParams(uint8,uint256[],uint96[])":{"params":{"newMultipliers":"are the new multipliers for the strategies","quorumNumber":"is the quorum number to change the strategy for","strategyIndices":"are the indices of the strategies to change"}},"registerOperator(address,bytes32,bytes)":{"details":"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already registered","params":{"operator":"The address of the operator to register.","operatorId":"The id of the operator to register.","quorumNumbers":"The quorum numbers the operator is registering for, where each byte is an 8 bit integer quorumNumber."},"returns":{"_0":"The operator's current stake for each quorum, and the total stake for each quorum"}},"removeStrategies(uint8,uint256[])":{"details":"higher indices should be *first* in the list of @param indicesToRemove, since otherwise the removal of lower index entries will cause a shift in the indices of the other strategiesToRemove","params":{"quorumNumber":"."}},"updateOperatorStake(address,bytes32,bytes)":{"returns":{"_0":"A bitmap of quorums where the operator no longer meets the minimum stake and should be deregistered."}},"weightOfOperatorForQuorum(uint8,address)":{"details":"reverts in the case that `quorumNumber` is greater than or equal to `quorumCount`"}},"version":1},"userdoc":{"kind":"user","methods":{"WEIGHTING_DIVISOR()":{"notice":"Constant used as a divisor in calculating weights."},"addStrategies(uint8,(address,uint96)[])":{"notice":"Adds new strategies and the associated multipliers to the @param quorumNumber."},"delegation()":{"notice":"Returns the EigenLayer delegation manager contract."},"deregisterOperator(bytes32,bytes)":{"notice":"Deregisters the operator with `operatorId` for the specified `quorumNumbers`."},"getCurrentStake(bytes32,uint8)":{"notice":"Returns the most recent stake weight for the `operatorId` for quorum `quorumNumber`"},"getCurrentTotalStake(uint8)":{"notice":"Returns the stake weight from the latest entry in `_totalStakeHistory` for quorum `quorumNumber`."},"getLatestStakeUpdate(bytes32,uint8)":{"notice":"Returns the most recent stake weight for the `operatorId` for a certain quorum"},"getStakeAtBlockNumber(bytes32,uint8,uint32)":{"notice":"Returns the stake of the operator for the provided `quorumNumber` at the given `blockNumber`"},"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)":{"notice":"Returns the stake weight corresponding to `operatorId` for quorum `quorumNumber`, at the `index`-th entry in the `operatorIdToStakeHistory[operatorId][quorumNumber]` array if the entry corresponds to the operator's stake at `blockNumber`. Reverts otherwise."},"getStakeHistory(bytes32,uint8)":{"notice":"Returns the entire `operatorIdToStakeHistory[operatorId][quorumNumber]` array."},"getStakeUpdateAtIndex(uint8,bytes32,uint256)":{"notice":"Returns the `index`-th entry in the `operatorIdToStakeHistory[operatorId][quorumNumber]` array."},"getStakeUpdateIndexAtBlockNumber(bytes32,uint8,uint32)":{"notice":"Returns the indices of the operator stakes for the provided `quorumNumber` at the given `blockNumber`"},"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)":{"notice":"Returns the total stake weight for quorum `quorumNumber`, at the `index`-th entry in the `totalStakeHistory[quorumNumber]` array if the entry corresponds to the total stake at `blockNumber`. Reverts otherwise."},"getTotalStakeIndicesAtBlockNumber(uint32,bytes)":{"notice":"Returns the indices of the total stakes for the provided `quorumNumbers` at the given `blockNumber`"},"getTotalStakeUpdateAtIndex(uint8,uint256)":{"notice":"Returns the `index`-th entry in the dynamic array of total stake, `totalStakeHistory` for quorum `quorumNumber`."},"initializeQuorum(uint8,uint96,(address,uint96)[])":{"notice":"Initialize a new quorum created by the registry coordinator by setting strategies, weights, and minimum stake"},"minimumStakeForQuorum(uint8)":{"notice":"In order to register for a quorum i, an operator must have at least `minimumStakeForQuorum[i]`"},"modifyStrategyParams(uint8,uint256[],uint96[])":{"notice":"This function is used for modifying the weights of strategies that are already in the mapping strategyParams for a specific"},"registerOperator(address,bytes32,bytes)":{"notice":"Registers the `operator` with `operatorId` for the specified `quorumNumbers`."},"removeStrategies(uint8,uint256[])":{"notice":"This function is used for removing strategies and their associated weights from the"},"strategyParamsByIndex(uint8,uint256)":{"notice":"Returns the strategy and weight multiplier for the `index`'th strategy in the quorum `quorumNumber`"},"strategyParamsLength(uint8)":{"notice":"Returns the length of the dynamic array stored in `strategyParams[quorumNumber]`."},"updateOperatorStake(address,bytes32,bytes)":{"notice":"Called by the registry coordinator to update an operator's stake for one or more quorums. If the operator no longer has the minimum stake required for a quorum, they are added to the"},"weightOfOperatorForQuorum(uint8,address)":{"notice":"This function computes the total weight of the @param operator in the quorum @param quorumNumber."}},"version":1}},"settings":{"remappings":["@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/","eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/","eigenlayer-middleware/=lib/eigenlayer-middleware/src/","eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/","erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol":"IStakeRegistry"},"evmVersion":"london","libraries":{}},"sources":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol":{"keccak256":"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00","urls":["bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983","dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol":{"keccak256":"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9","urls":["bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914","dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol":{"keccak256":"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c","urls":["bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91","dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz"],"license":"CC0-1.0"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol":{"keccak256":"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba","urls":["bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc","dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol":{"keccak256":"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c","urls":["bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8","dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol":{"keccak256":"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f","urls":["bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324","dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol":{"keccak256":"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49","urls":["bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d","dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol":{"keccak256":"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092","urls":["bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c","dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol":{"keccak256":"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79","urls":["bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232","dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol":{"keccak256":"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420","urls":["bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73","dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol":{"keccak256":"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52","urls":["bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef","dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol":{"keccak256":"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377","urls":["bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7","dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol":{"keccak256":"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d","urls":["bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f","dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol":{"keccak256":"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71","urls":["bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f","dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61","urls":["bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354","dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol":{"keccak256":"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3","urls":["bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25","dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol":{"keccak256":"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4","urls":["bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97","dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B"],"license":"BUSL-1.1"}},"version":1},"id":134}
\ No newline at end of file
diff --git a/explorer/lib/explorer/contract_managers/stake_registry_manager.ex b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex
new file mode 100644
index 0000000000..54e7656cb3
--- /dev/null
+++ b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex
@@ -0,0 +1,36 @@
+defmodule StakeRegistryManager do
+ require Logger
+
+ @aligned_config_file System.get_env("ALIGNED_CONFIG_FILE")
+
+ config_file_path =
+ case @aligned_config_file do
+ nil -> raise("ALIGNED_CONFIG_FILE not set in .env")
+ file -> file
+ end
+
+ {status, config_json_string} = File.read(config_file_path)
+
+ case status do
+ :ok ->
+ Logger.debug("Eigenlayer deployment file read successfully")
+
+ :error ->
+ raise(
+ "Config file not read successfully, did you run make create-env? If you did,\n make sure Eigenlayer config file is correctly stored"
+ )
+ end
+
+ @stake_registry_manager Jason.decode!(config_json_string)
+ |> Map.get("addresses")
+ |> Map.get("stakeRegistry")
+
+ use Ethers.Contract,
+ abi_file: "lib/abi/IStakeRegistry.json",
+ default_address: @stake_registry_manager
+
+ def get_stake_registry_manager() do
+ @stake_registry_manager
+ end
+
+end
From a429552f5cbb79645993a36d550e1ed69efe4a40 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Fri, 2 Aug 2024 17:02:08 -0300
Subject: [PATCH 082/201] refactor: delegation manager
---
.../{ => contract_managers}/delegation_manager.ex | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
rename explorer/lib/explorer/{ => contract_managers}/delegation_manager.ex (84%)
diff --git a/explorer/lib/explorer/delegation_manager.ex b/explorer/lib/explorer/contract_managers/delegation_manager.ex
similarity index 84%
rename from explorer/lib/explorer/delegation_manager.ex
rename to explorer/lib/explorer/contract_managers/delegation_manager.ex
index ae35769a8d..004802b42b 100644
--- a/explorer/lib/explorer/delegation_manager.ex
+++ b/explorer/lib/explorer/contract_managers/delegation_manager.ex
@@ -1,12 +1,15 @@
defmodule DelegationManager do
require Logger
- @environment System.get_env("ENVIRONMENT")
+ @aligned_config_file System.get_env("ALIGNED_CONFIG_FILE")
- file_path =
- "../contracts/script/output/#{@environment}/eigenlayer_deployment_output.json"
+ config_file_path =
+ case @aligned_config_file do
+ nil -> raise("ALIGNED_CONFIG_FILE not set in .env")
+ file -> file
+ end
- {status, config_json_string} = File.read(file_path)
+ {status, config_json_string} = File.read(config_file_path)
case status do
:ok ->
From 8fc8f43a075322a84ef3a112b9ffa4fc4bc3d2e0 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Fri, 2 Aug 2024 17:03:14 -0300
Subject: [PATCH 083/201] feat: avs directory manager with operator id
---
.../aligned_layer_service_manager.ex | 0
.../avs_directory_manager.ex | 56 ++++++-------------
2 files changed, 18 insertions(+), 38 deletions(-)
rename explorer/lib/explorer/{ => contract_managers}/aligned_layer_service_manager.ex (100%)
rename explorer/lib/explorer/{ => contract_managers}/avs_directory_manager.ex (67%)
diff --git a/explorer/lib/explorer/aligned_layer_service_manager.ex b/explorer/lib/explorer/contract_managers/aligned_layer_service_manager.ex
similarity index 100%
rename from explorer/lib/explorer/aligned_layer_service_manager.ex
rename to explorer/lib/explorer/contract_managers/aligned_layer_service_manager.ex
diff --git a/explorer/lib/explorer/avs_directory_manager.ex b/explorer/lib/explorer/contract_managers/avs_directory_manager.ex
similarity index 67%
rename from explorer/lib/explorer/avs_directory_manager.ex
rename to explorer/lib/explorer/contract_managers/avs_directory_manager.ex
index b2365f702a..3fe8ba45a9 100644
--- a/explorer/lib/explorer/avs_directory_manager.ex
+++ b/explorer/lib/explorer/contract_managers/avs_directory_manager.ex
@@ -1,4 +1,4 @@
-defmodule AVSDirectory do
+defmodule AVSDirectoryManager do
require Logger
@environment System.get_env("ENVIRONMENT")
@@ -37,38 +37,8 @@ defmodule AVSDirectory do
@avs_directory_address
end
- # def get_operator_status_updated_events() do
- # AVSDirectory.EventFilters.operator_avs_registration_status_updated(
- # nil,
- # AlignedLayerServiceManager.get_aligned_layer_service_manager_address()
- # )
- # |> Ethers.get_logs(fromBlock: @first_block)
- # end
-
- # tail-call recursion
- # defp count_operators_registered(list), do: sum_operators_registered(list, 0)
- # defp sum_operators_registered([], val), do: val
-
- # defp sum_operators_registered([head | tail], val),
- # do: sum_operators_registered(tail, evaluate_operator(head, val))
-
- # defp evaluate_operator(event, val) do
- # # registered or unregistered
- # case event.data |> hd() == 1 do
- # true -> val + 1
- # false -> val - 1
- # end
- # end
-
- def get_operator_registration_status_updated_events(%{fromBlock: fromBlock}) do
- AVSDirectory.EventFilters.operator_avs_registration_status_updated(
- nil, # any operator
- AlignedLayerServiceManager.get_aligned_layer_service_manager_address() # our AVS
- ) |> Ethers.get_logs(fromBlock: fromBlock)
- end
-
def process_operator_data(%{fromBlock: fromBlock}) do
- AVSDirectory.get_operator_registration_status_updated_events(%{fromBlock: fromBlock})
+ AVSDirectoryManager.get_operator_registration_status_updated_events(%{fromBlock: fromBlock})
|> case do
{:ok, events} ->
Enum.map(events, &extract_operator_event_info/1)
@@ -83,23 +53,32 @@ defmodule AVSDirectory do
end
end
+
+ def get_operator_registration_status_updated_events(%{fromBlock: fromBlock}) do
+ AVSDirectoryManager.EventFilters.operator_avs_registration_status_updated(
+ nil, # any operator
+ AlignedLayerServiceManager.get_aligned_layer_service_manager_address() # our AVS
+ ) |> Ethers.get_logs(fromBlock: fromBlock)
+ end
+
def extract_operator_event_info(event) do
case Mutex.lock(OperatorMutex, {event.topics |> Enum.at(1)}) do
{:error, :busy} ->
"Operator already being processed: #{event.topics |> Enum.at(1)}" |> IO.inspect()
:empty
+ # TODO also extract operator ID from this event
{:ok, lock} ->
case event.topics |> hd do
"OperatorAVSRegistrationStatusUpdated(address,address,uint8)" ->
case event.data |> hd do
1 ->
IO.inspect("Operator registered")
- AVSDirectory.handle_operator_registration(event)
+ AVSDirectoryManager.handle_operator_registration(event)
0 ->
IO.inspect("Operator unregistered")
- AVSDirectory.handle_operator_unregistration(event)
+ AVSDirectoryManager.handle_operator_unregistration(event)
_other ->
IO.inspect("Unexpected event data", event.data)
@@ -113,8 +92,10 @@ defmodule AVSDirectory do
end
def handle_operator_registration(event) do
- IO.inspect("Handling operator registration")
- operator_url = DelegationManager.get_operator_url(Enum.at(event.topics, 1))
+ operator_address = Enum.at(event.topics, 1)
+ # TODO also extract operator ID from this event
+ operator_id = RegistryCoordinatorManager.get_operator_id_from_chain(operator_address)
+ operator_url = DelegationManager.get_operator_url(operator_address)
operator_metadata = case Utils.fetch_eigen_operator_metadata(operator_url) do
{:ok, operator_metadata} ->
operator_metadata
@@ -128,12 +109,11 @@ defmodule AVSDirectory do
end
%EigenOperatorMetadataStruct{name: nil, website: nil, description: nil, logo: nil, twitter: nil}
end
- Operators.register_or_update_operator(%Operators{name: operator_metadata.name, address: Enum.at(event.topics, 1), url: operator_url, website: operator_metadata.website, description: operator_metadata.description, logo_link: operator_metadata.logo, twitter: operator_metadata.twitter, is_active: true})
+ Operators.register_or_update_operator(%Operators{id: operator_id, name: operator_metadata.name, address: operator_address, url: operator_url, website: operator_metadata.website, description: operator_metadata.description, logo_link: operator_metadata.logo, twitter: operator_metadata.twitter, is_active: true})
# TODO read its first stake
end
def handle_operator_unregistration(event) do
- IO.inspect("WIP: Handling operator unregistration")
Operators.unregister_operator(%Operators{address: Enum.at(event.topics, 1)})
end
end
From 78d4be7271b967fa5f43d66943e471aa70052165 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Mon, 5 Aug 2024 12:00:14 -0300
Subject: [PATCH 084/201] refactor: move random_id function to utils
---
.../components/core_components.ex | 10 ++++----
explorer/lib/explorer_web/live/utils.ex | 23 ++++++++++++-------
2 files changed, 20 insertions(+), 13 deletions(-)
diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex
index df2346e180..907fe38ec0 100644
--- a/explorer/lib/explorer_web/components/core_components.ex
+++ b/explorer/lib/explorer_web/components/core_components.ex
@@ -854,7 +854,7 @@ defmodule ExplorerWeb.CoreComponents do
def tooltip(assigns) do
~H"""
"_" <> (:crypto.strong_rand_bytes(8) |> Base.url_encode64(padding: false))
- end
-
@doc """
Divider component.
+
+ ## Example
+ <.divider />
+
"""
attr :class, :string, default: nil
diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex
index 7d43881373..fb481b376a 100644
--- a/explorer/lib/explorer_web/live/utils.ex
+++ b/explorer/lib/explorer_web/live/utils.ex
@@ -1,3 +1,4 @@
+# Frontend Utils
defmodule ExplorerWeb.Utils do
def shorten_hash(hash, decimals \\ 6) do
case String.length(hash) do
@@ -98,6 +99,7 @@ defmodule ExplorerWeb.Utils do
end
end
+# Backend utils
defmodule Utils do
require Logger
@@ -125,13 +127,12 @@ defmodule Utils do
def calculate_proof_hashes({:ok, batch_json}) do
batch_json
- |> Enum.map(
- fn s3_object ->
- # TODO this is current prod version
- :crypto.hash(:sha3_256, s3_object["proof"])
- # TODO this is current stage version
- # :crypto.hash(:sha3_256, s3_object["verification_data"]["proof"])
- end)
+ |> Enum.map(fn s3_object ->
+ # TODO this is current prod version
+ :crypto.hash(:sha3_256, s3_object["proof"])
+ # TODO this is current stage version
+ # :crypto.hash(:sha3_256, s3_object["verification_data"]["proof"])
+ end)
end
def calculate_proof_hashes({:error, reason}) do
@@ -182,7 +183,9 @@ defmodule Utils do
case Finch.build(:get, url) |> Finch.request(Explorer.Finch) do
{:ok, %Finch.Response{status: 200, body: body}} ->
case Jason.decode(body) do
- {:ok, json} -> {:ok, EigenOperatorMetadataStruct.map_to_struct(json)}
+ {:ok, json} ->
+ {:ok, EigenOperatorMetadataStruct.map_to_struct(json)}
+
{:error, reason} ->
{:error, reason}
end
@@ -194,4 +197,8 @@ defmodule Utils do
{:error, {:http_error, reason}}
end
end
+
+ def random_id(prefix) do
+ prefix <> "_" <> (:crypto.strong_rand_bytes(8) |> Base.url_encode64(padding: false))
+ end
end
From a68a8dbbdb974010898cc664c20dfbeb43a5a714 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Mon, 5 Aug 2024 13:47:09 -0300
Subject: [PATCH 085/201] feat: add eigen operator url
---
.../live/pages/operator/index.html.heex | 11 ++++++++++-
explorer/lib/explorer_web/live/utils.ex | 16 ++++++++++++++++
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/explorer/lib/explorer_web/live/pages/operator/index.html.heex b/explorer/lib/explorer_web/live/pages/operator/index.html.heex
index 65b2097801..7b873ecf94 100644
--- a/explorer/lib/explorer_web/live/pages/operator/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/operator/index.html.heex
@@ -16,7 +16,7 @@
<%= @operator.name %>
-
+
<%= @operator.description %>
<.a href={@operator.website} target="_blank" rel="noopener">
@@ -25,6 +25,15 @@
<.a href={@operator.twitter} target="_blank" rel="noopener">
X/Twitter
+ <.a
+ href={
+ "#{Utils.get_eigenlayer_explorer_url()}/operator/#{@operator.address}"
+ }
+ target="_blank"
+ rel="noopener"
+ >
+ EigenLayer Profile
+
Address:
diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex
index fb481b376a..de4df91d96 100644
--- a/explorer/lib/explorer_web/live/utils.ex
+++ b/explorer/lib/explorer_web/live/utils.ex
@@ -97,6 +97,22 @@ defmodule ExplorerWeb.Utils do
defp pad_leading_zero(value) do
Integer.to_string(value) |> String.pad_leading(2, "0")
end
+
+ @doc """
+ Get the EigenLayer Explorer URL based on the environment.
+ - `holesky` -> https://holesky.eigenlayer.xyz
+ - `mainnet` -> https://app.eigenlayer.xyz
+ - `default` -> http://localhost:4000
+ """
+ def get_eigenlayer_explorer_url() do
+ prefix = System.get_env("ENVIRONMENT")
+
+ case prefix do
+ "holesky" -> "https://holesky.eigenlayer.xyz"
+ "mainnet" -> "https://app.eigenlayer.xyz"
+ _ -> "http://localhost:4000"
+ end
+ end
end
# Backend utils
From 9ec420ae2949b34536cb14e655c455d1ed065487 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Mon, 5 Aug 2024 13:47:39 -0300
Subject: [PATCH 086/201] style: use dynamic badge for operator status
---
.../lib/explorer_web/components/core_components.ex | 10 +++++-----
.../explorer_web/live/pages/operators/index.html.heex | 4 ++--
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex
index 907fe38ec0..6638059d65 100644
--- a/explorer/lib/explorer_web/components/core_components.ex
+++ b/explorer/lib/explorer_web/components/core_components.ex
@@ -383,8 +383,8 @@ defmodule ExplorerWeb.CoreComponents do
"""
attr :class, :string, default: nil
attr :status, :boolean, default: true
- attr :pending_text, :string, default: "Pending"
- attr :verified_text, :string, default: "Verified"
+ attr :falsy_text, :string, default: "Pending"
+ attr :truthy_text, :string, default: "Verified"
slot :inner_block, default: nil
def dynamic_badge(assigns) do
@@ -398,8 +398,8 @@ defmodule ExplorerWeb.CoreComponents do
@class
]}>
<%= case @status do
- true -> @verified_text
- false -> @pending_text
+ true -> @truthy_text
+ false -> @falsy_text
end %>
<%= render_slot(@inner_block) %>
@@ -874,7 +874,7 @@ defmodule ExplorerWeb.CoreComponents do
## Example
<.divider />
-
+
"""
attr :class, :string, default: nil
diff --git a/explorer/lib/explorer_web/live/pages/operators/index.html.heex b/explorer/lib/explorer_web/live/pages/operators/index.html.heex
index 1efb85ce18..88eb877eee 100644
--- a/explorer/lib/explorer_web/live/pages/operators/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/operators/index.html.heex
@@ -20,8 +20,8 @@
<:col :let={_operator} label="Total ETH Restaked">
TODO
- <:col :let={operator} label="Active">
- <%= operator.is_active %>
+ <:col :let={operator} label="Status">
+ <.dynamic_badge status={operator.is_active} truthy_text="Active" falsy_text="Inactive" />
From 69ac789fc6d13d563718cb335b6bfd6130f807d3 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Mon, 5 Aug 2024 13:47:58 -0300
Subject: [PATCH 087/201] fix: replace merkle root for batch hash
---
explorer/lib/explorer_web/live/pages/batches/index.html.heex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/explorer/lib/explorer_web/live/pages/batches/index.html.heex b/explorer/lib/explorer_web/live/pages/batches/index.html.heex
index c4442761d5..462cc9c8e6 100644
--- a/explorer/lib/explorer_web/live/pages/batches/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/batches/index.html.heex
@@ -2,7 +2,7 @@
<.card_preheding>Batches
<%= if @batches != :empty and @batches != [] do %>
<.table id="batches" rows={@batches}>
- <:col :let={batch} label="Merkle Root">
+ <:col :let={batch} label="Batch Hash">
<.link navigate={~p"/batches/#{batch.merkle_root}"}>
Date: Mon, 5 Aug 2024 14:14:16 -0300
Subject: [PATCH 088/201] style: change badge false state bg color
---
explorer/lib/explorer_web/components/core_components.ex | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex
index 6638059d65..ea7f259a09 100644
--- a/explorer/lib/explorer_web/components/core_components.ex
+++ b/explorer/lib/explorer_web/components/core_components.ex
@@ -393,7 +393,7 @@ defmodule ExplorerWeb.CoreComponents do
"px-3 py-1 rounded-full",
case @status do
true -> "text-black bg-primary group-hover:bg-primary/80"
- false -> "text-white bg-secondary group-hover:bg-secondary/80"
+ false -> "text-black bg-destructive-foreground group-hover:bg-destructive-foreground/80"
end,
@class
]}>
@@ -858,7 +858,7 @@ defmodule ExplorerWeb.CoreComponents do
class={[
"tooltip",
"animate-in fade-in slide-in-from-bottom duration-50",
- "px-2 py-1 text-sm text-foreground bg-card border border-muted-foreground/30 rounded-full shadow-sm drop-shadow-sm",
+ "px-2 py-1 text-sm text-foreground bg-popover border border-muted-foreground/30 rounded-full shadow-sm drop-shadow-sm",
@class
]}
role="tooltip"
From df47e25fb507a67c2bcd3769954a39166952711a Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:46:49 -0300
Subject: [PATCH 089/201] feat: improvements on ecto migrates
---
.../20240719193311_add_operators_table.exs | 3 +++
.../20240719202751_add_strategies_table.exs | 2 +-
.../20240719202825_add_restakings_table copy.exs | 13 -------------
3 files changed, 4 insertions(+), 14 deletions(-)
delete mode 100644 explorer/priv/repo/migrations/20240719202825_add_restakings_table copy.exs
diff --git a/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs b/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
index 4089b4138c..a3b03ddbef 100644
--- a/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
+++ b/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
@@ -15,5 +15,8 @@ defmodule Explorer.Repo.Migrations.AddOperatorsTable do
timestamps()
end
+
+ create unique_index("operators", [:id], name: :operator_id_index)
+
end
end
diff --git a/explorer/priv/repo/migrations/20240719202751_add_strategies_table.exs b/explorer/priv/repo/migrations/20240719202751_add_strategies_table.exs
index b357e3c0dc..4fdd559b3a 100644
--- a/explorer/priv/repo/migrations/20240719202751_add_strategies_table.exs
+++ b/explorer/priv/repo/migrations/20240719202751_add_strategies_table.exs
@@ -8,7 +8,7 @@ defmodule Explorer.Repo.Migrations.AddTokensTable do
add :token_address, :binary, null: false
add :name, :string, null: false
add :symbol, :string, null: false
- add :total_staked, :decimal, precision: 22, scale: 0
+ add :total_staked, :decimal, precision: 30, scale: 0
timestamps()
end
diff --git a/explorer/priv/repo/migrations/20240719202825_add_restakings_table copy.exs b/explorer/priv/repo/migrations/20240719202825_add_restakings_table copy.exs
deleted file mode 100644
index d924d1f86c..0000000000
--- a/explorer/priv/repo/migrations/20240719202825_add_restakings_table copy.exs
+++ /dev/null
@@ -1,13 +0,0 @@
-defmodule Explorer.Repo.Migrations.AddRestakingsTable do
- use Ecto.Migration
-
- def change do
- create table("restakings", primary_key: false) do
- add :id, :bigserial, primary_key: true
- add :operator_address, references(:operators, column: :address, type: :binary), null: false
- add :amount, :decimal, precision: 22, scale: 0, null: false
-
- timestamps()
- end
- end
-end
From f59cbea0a97024fdd6bb24422b9ef0d02b361487 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:47:03 -0300
Subject: [PATCH 090/201] feat: add restakings ecto migrate
---
.../20240719202825_add_restakings_table.exs | 15 +++++++++++++++
1 file changed, 15 insertions(+)
create mode 100644 explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs
diff --git a/explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs b/explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs
new file mode 100644
index 0000000000..3ee37f6e12
--- /dev/null
+++ b/explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs
@@ -0,0 +1,15 @@
+defmodule Explorer.Repo.Migrations.AddRestakingsTable do
+ use Ecto.Migration
+
+ def change do
+ create table("restakings", primary_key: false) do
+ add :id, :bigserial, primary_key: true
+ add :operator_id, references(:operators, column: :id, type: :binary), null: false
+ add :stake, :decimal, precision: 30, scale: 0, null: false
+ add :quorum_number, references(:quorums, column: :id, type: :integer), null: false
+
+ timestamps()
+ end
+
+ end
+end
From 08ed7c6b70ac887e89461c1bbb72f7c33528b15b Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:47:20 -0300
Subject: [PATCH 091/201] feat: add quorums and quorum_strategies ecto migrate
---
.../20240719202824_add_quorums_table.exs | 20 +++++++++++++++++++
1 file changed, 20 insertions(+)
create mode 100644 explorer/priv/repo/migrations/20240719202824_add_quorums_table.exs
diff --git a/explorer/priv/repo/migrations/20240719202824_add_quorums_table.exs b/explorer/priv/repo/migrations/20240719202824_add_quorums_table.exs
new file mode 100644
index 0000000000..e4da7f9de3
--- /dev/null
+++ b/explorer/priv/repo/migrations/20240719202824_add_quorums_table.exs
@@ -0,0 +1,20 @@
+defmodule Explorer.Repo.Migrations.AddQuorumsTable do
+ use Ecto.Migration
+
+ def change do
+ create table("quorums", primary_key: false) do
+ add :id, :integer, primary_key: true
+
+ timestamps()
+ end
+
+ create table("quorum_strategies", primary_key: false) do
+ add :id, :bigserial, primary_key: true
+ add :quorum_id, references(:quorums, column: :id, on_delete: :delete_all), null: false
+ add :strategy_id, references(:strategies, column: :id, on_delete: :delete_all), null: false
+ timestamps()
+ end
+ create unique_index(:quorum_strategies, [:quorum_id, :strategy_id])
+
+ end
+end
From 7eb54b9a2460573ae1dae894167bf71dd8935d1e Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:51:27 -0300
Subject: [PATCH 092/201] feat: stake_registry_manager and restakings model
---
explorer/lib/abi/IStakeRegistry.json | 1 -
explorer/lib/abi/StakeRegistry.json | 1 +
.../stake_registry_manager.ex | 88 ++++++++++++++++++-
explorer/lib/explorer/models/restakings.ex | 62 +++++++++++--
4 files changed, 144 insertions(+), 8 deletions(-)
delete mode 100644 explorer/lib/abi/IStakeRegistry.json
create mode 100644 explorer/lib/abi/StakeRegistry.json
diff --git a/explorer/lib/abi/IStakeRegistry.json b/explorer/lib/abi/IStakeRegistry.json
deleted file mode 100644
index 4bedb2dc28..0000000000
--- a/explorer/lib/abi/IStakeRegistry.json
+++ /dev/null
@@ -1 +0,0 @@
-{"abi":[{"type":"function","name":"WEIGHTING_DIVISOR","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"pure"},{"type":"function","name":"addStrategies","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"strategyParams","type":"tuple[]","internalType":"struct IStakeRegistry.StrategyParams[]","components":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"multiplier","type":"uint96","internalType":"uint96"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegation","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IDelegationManager"}],"stateMutability":"view"},{"type":"function","name":"deregisterOperator","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getCurrentStake","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getCurrentTotalStake","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getLatestStakeUpdate","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StakeUpdate","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"getStakeAtBlockNumber","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getStakeAtBlockNumberAndIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getStakeHistory","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IStakeRegistry.StakeUpdate[]","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"getStakeUpdateAtIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StakeUpdate","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"getStakeUpdateIndexAtBlockNumber","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeAtBlockNumberFromIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeHistoryLength","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeIndicesAtBlockNumber","inputs":[{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint32[]","internalType":"uint32[]"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeUpdateAtIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StakeUpdate","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"initializeQuorum","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"minimumStake","type":"uint96","internalType":"uint96"},{"name":"strategyParams","type":"tuple[]","internalType":"struct IStakeRegistry.StrategyParams[]","components":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"multiplier","type":"uint96","internalType":"uint96"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"minimumStakeForQuorum","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"modifyStrategyParams","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"strategyIndices","type":"uint256[]","internalType":"uint256[]"},{"name":"newMultipliers","type":"uint96[]","internalType":"uint96[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"registerOperator","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint96[]","internalType":"uint96[]"},{"name":"","type":"uint96[]","internalType":"uint96[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"registryCoordinator","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"removeStrategies","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"indicesToRemove","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"strategyParamsByIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StrategyParams","components":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"multiplier","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"strategyParamsLength","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"updateOperatorStake","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint192","internalType":"uint192"}],"stateMutability":"nonpayable"},{"type":"function","name":"weightOfOperatorForQuorum","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"event","name":"MinimumStakeForQuorumUpdated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"minimumStake","type":"uint96","indexed":false,"internalType":"uint96"}],"anonymous":false},{"type":"event","name":"OperatorStakeUpdate","inputs":[{"name":"operatorId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"stake","type":"uint96","indexed":false,"internalType":"uint96"}],"anonymous":false},{"type":"event","name":"QuorumCreated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"StrategyAddedToQuorum","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"}],"anonymous":false},{"type":"event","name":"StrategyMultiplierUpdated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"},{"name":"multiplier","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"StrategyRemovedFromQuorum","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"}],"anonymous":false}],"bytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"deployedBytecode":{"object":"0x","sourceMap":"","linkReferences":{}},"methodIdentifiers":{"WEIGHTING_DIVISOR()":"5e5a6775","addStrategies(uint8,(address,uint96)[])":"c601527d","delegation()":"df5cf723","deregisterOperator(bytes32,bytes)":"bd29b8cd","getCurrentStake(bytes32,uint8)":"5401ed27","getCurrentTotalStake(uint8)":"d5eccc05","getLatestStakeUpdate(bytes32,uint8)":"f851e198","getStakeAtBlockNumber(bytes32,uint8,uint32)":"fa28c627","getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)":"f2be94ae","getStakeHistory(bytes32,uint8)":"2cd95940","getStakeUpdateAtIndex(uint8,bytes32,uint256)":"ac6bfb03","getStakeUpdateIndexAtBlockNumber(bytes32,uint8,uint32)":"dd9846b9","getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)":"c8294c56","getTotalStakeHistoryLength(uint8)":"0491b41c","getTotalStakeIndicesAtBlockNumber(uint32,bytes)":"81c07502","getTotalStakeUpdateAtIndex(uint8,uint256)":"b6904b78","initializeQuorum(uint8,uint96,(address,uint96)[])":"ff694a77","minimumStakeForQuorum(uint8)":"c46778a5","modifyStrategyParams(uint8,uint256[],uint96[])":"20b66298","registerOperator(address,bytes32,bytes)":"25504777","registryCoordinator()":"6d14a987","removeStrategies(uint8,uint256[])":"5f1f2d77","strategyParamsByIndex(uint8,uint256)":"adc804da","strategyParamsLength(uint8)":"3ca5a5f5","updateOperatorStake(address,bytes32,bytes)":"66acfefe","weightOfOperatorForQuorum(uint8,address)":"1f9b74e0"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"minimumStake\",\"type\":\"uint96\"}],\"name\":\"MinimumStakeForQuorumUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"name\":\"OperatorStakeUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"QuorumCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"StrategyAddedToQuorum\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"multiplier\",\"type\":\"uint256\"}],\"name\":\"StrategyMultiplierUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"StrategyRemovedFromQuorum\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"WEIGHTING_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"multiplier\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StrategyParams[]\",\"name\":\"strategyParams\",\"type\":\"tuple[]\"}],\"name\":\"addStrategies\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"delegation\",\"outputs\":[{\"internalType\":\"contract IDelegationManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"deregisterOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getCurrentStake\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getCurrentTotalStake\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getLatestStakeUpdate\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"}],\"name\":\"getStakeAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getStakeAtBlockNumberAndIndex\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getStakeHistory\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getStakeUpdateAtIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"}],\"name\":\"getStakeUpdateIndexAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getTotalStakeAtBlockNumberFromIndex\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getTotalStakeHistoryLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"getTotalStakeIndicesAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint32[]\",\"name\":\"\",\"type\":\"uint32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getTotalStakeUpdateAtIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint96\",\"name\":\"minimumStake\",\"type\":\"uint96\"},{\"components\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"multiplier\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StrategyParams[]\",\"name\":\"strategyParams\",\"type\":\"tuple[]\"}],\"name\":\"initializeQuorum\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"minimumStakeForQuorum\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256[]\",\"name\":\"strategyIndices\",\"type\":\"uint256[]\"},{\"internalType\":\"uint96[]\",\"name\":\"newMultipliers\",\"type\":\"uint96[]\"}],\"name\":\"modifyStrategyParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"registerOperator\",\"outputs\":[{\"internalType\":\"uint96[]\",\"name\":\"\",\"type\":\"uint96[]\"},{\"internalType\":\"uint96[]\",\"name\":\"\",\"type\":\"uint96[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registryCoordinator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256[]\",\"name\":\"indicesToRemove\",\"type\":\"uint256[]\"}],\"name\":\"removeStrategies\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"strategyParamsByIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"multiplier\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StrategyParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"strategyParamsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"updateOperatorStake\",\"outputs\":[{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"weightOfOperatorForQuorum\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Layr Labs, Inc.\",\"kind\":\"dev\",\"methods\":{\"deregisterOperator(bytes32,bytes)\":{\"details\":\"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already deregistered 5) `quorumNumbers` is a subset of the quorumNumbers that the operator is registered for\",\"params\":{\"operatorId\":\"The id of the operator to deregister.\",\"quorumNumbers\":\"The quorum numbers the operator is deregistering from, where each byte is an 8 bit integer quorumNumber.\"}},\"getCurrentStake(bytes32,uint8)\":{\"details\":\"Function returns weight of **0** in the event that the operator has no stake history\"},\"getCurrentTotalStake(uint8)\":{\"details\":\"Will revert if `_totalStakeHistory[quorumNumber]` is empty.\"},\"getLatestStakeUpdate(bytes32,uint8)\":{\"details\":\"Function returns an StakeUpdate struct with **every entry equal to 0** in the event that the operator has no stake history\"},\"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)\":{\"details\":\"Function will revert if `index` is out-of-bounds.used the BLSSignatureChecker to get past stakes of signing operators\",\"params\":{\"blockNumber\":\"Block number to make sure the stake is from.\",\"index\":\"Array index for lookup, within the dynamic array `operatorIdToStakeHistory[operatorId][quorumNumber]`.\",\"operatorId\":\"The id of the operator of interest.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getStakeHistory(bytes32,uint8)\":{\"params\":{\"operatorId\":\"The id of the operator of interest.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getStakeUpdateAtIndex(uint8,bytes32,uint256)\":{\"details\":\"Function will revert if `index` is out-of-bounds.\",\"params\":{\"index\":\"Array index for lookup, within the dynamic array `operatorIdToStakeHistory[operatorId][quorumNumber]`.\",\"operatorId\":\"The id of the operator of interest.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)\":{\"details\":\"Function will revert if `index` is out-of-bounds.used the BLSSignatureChecker to get past stakes of signing operators\",\"params\":{\"blockNumber\":\"Block number to make sure the stake is from.\",\"index\":\"Array index for lookup, within the dynamic array `totalStakeHistory[quorumNumber]`.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getTotalStakeUpdateAtIndex(uint8,uint256)\":{\"params\":{\"index\":\"Array index for lookup, within the dynamic array `totalStakeHistory[quorumNumber]`.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"modifyStrategyParams(uint8,uint256[],uint96[])\":{\"params\":{\"newMultipliers\":\"are the new multipliers for the strategies\",\"quorumNumber\":\"is the quorum number to change the strategy for\",\"strategyIndices\":\"are the indices of the strategies to change\"}},\"registerOperator(address,bytes32,bytes)\":{\"details\":\"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already registered\",\"params\":{\"operator\":\"The address of the operator to register.\",\"operatorId\":\"The id of the operator to register.\",\"quorumNumbers\":\"The quorum numbers the operator is registering for, where each byte is an 8 bit integer quorumNumber.\"},\"returns\":{\"_0\":\"The operator's current stake for each quorum, and the total stake for each quorum\"}},\"removeStrategies(uint8,uint256[])\":{\"details\":\"higher indices should be *first* in the list of @param indicesToRemove, since otherwise the removal of lower index entries will cause a shift in the indices of the other strategiesToRemove\",\"params\":{\"quorumNumber\":\".\"}},\"updateOperatorStake(address,bytes32,bytes)\":{\"returns\":{\"_0\":\"A bitmap of quorums where the operator no longer meets the minimum stake and should be deregistered.\"}},\"weightOfOperatorForQuorum(uint8,address)\":{\"details\":\"reverts in the case that `quorumNumber` is greater than or equal to `quorumCount`\"}},\"title\":\"Interface for a `Registry` that keeps track of stakes of operators for up to 256 quorums.\",\"version\":1},\"userdoc\":{\"events\":{\"MinimumStakeForQuorumUpdated(uint8,uint96)\":{\"notice\":\"emitted when the minimum stake for a quorum is updated\"},\"OperatorStakeUpdate(bytes32,uint8,uint96)\":{\"notice\":\"emitted whenever the stake of `operator` is updated\"},\"QuorumCreated(uint8)\":{\"notice\":\"emitted when a new quorum is created\"},\"StrategyAddedToQuorum(uint8,address)\":{\"notice\":\"emitted when `strategy` has been added to the array at `strategyParams[quorumNumber]`\"},\"StrategyMultiplierUpdated(uint8,address,uint256)\":{\"notice\":\"emitted when `strategy` has its `multiplier` updated in the array at `strategyParams[quorumNumber]`\"},\"StrategyRemovedFromQuorum(uint8,address)\":{\"notice\":\"emitted when `strategy` has removed from the array at `strategyParams[quorumNumber]`\"}},\"kind\":\"user\",\"methods\":{\"WEIGHTING_DIVISOR()\":{\"notice\":\"Constant used as a divisor in calculating weights.\"},\"addStrategies(uint8,(address,uint96)[])\":{\"notice\":\"Adds new strategies and the associated multipliers to the @param quorumNumber.\"},\"delegation()\":{\"notice\":\"Returns the EigenLayer delegation manager contract.\"},\"deregisterOperator(bytes32,bytes)\":{\"notice\":\"Deregisters the operator with `operatorId` for the specified `quorumNumbers`.\"},\"getCurrentStake(bytes32,uint8)\":{\"notice\":\"Returns the most recent stake weight for the `operatorId` for quorum `quorumNumber`\"},\"getCurrentTotalStake(uint8)\":{\"notice\":\"Returns the stake weight from the latest entry in `_totalStakeHistory` for quorum `quorumNumber`.\"},\"getLatestStakeUpdate(bytes32,uint8)\":{\"notice\":\"Returns the most recent stake weight for the `operatorId` for a certain quorum\"},\"getStakeAtBlockNumber(bytes32,uint8,uint32)\":{\"notice\":\"Returns the stake of the operator for the provided `quorumNumber` at the given `blockNumber`\"},\"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)\":{\"notice\":\"Returns the stake weight corresponding to `operatorId` for quorum `quorumNumber`, at the `index`-th entry in the `operatorIdToStakeHistory[operatorId][quorumNumber]` array if the entry corresponds to the operator's stake at `blockNumber`. Reverts otherwise.\"},\"getStakeHistory(bytes32,uint8)\":{\"notice\":\"Returns the entire `operatorIdToStakeHistory[operatorId][quorumNumber]` array.\"},\"getStakeUpdateAtIndex(uint8,bytes32,uint256)\":{\"notice\":\"Returns the `index`-th entry in the `operatorIdToStakeHistory[operatorId][quorumNumber]` array.\"},\"getStakeUpdateIndexAtBlockNumber(bytes32,uint8,uint32)\":{\"notice\":\"Returns the indices of the operator stakes for the provided `quorumNumber` at the given `blockNumber`\"},\"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)\":{\"notice\":\"Returns the total stake weight for quorum `quorumNumber`, at the `index`-th entry in the `totalStakeHistory[quorumNumber]` array if the entry corresponds to the total stake at `blockNumber`. Reverts otherwise.\"},\"getTotalStakeIndicesAtBlockNumber(uint32,bytes)\":{\"notice\":\"Returns the indices of the total stakes for the provided `quorumNumbers` at the given `blockNumber`\"},\"getTotalStakeUpdateAtIndex(uint8,uint256)\":{\"notice\":\"Returns the `index`-th entry in the dynamic array of total stake, `totalStakeHistory` for quorum `quorumNumber`.\"},\"initializeQuorum(uint8,uint96,(address,uint96)[])\":{\"notice\":\"Initialize a new quorum created by the registry coordinator by setting strategies, weights, and minimum stake\"},\"minimumStakeForQuorum(uint8)\":{\"notice\":\"In order to register for a quorum i, an operator must have at least `minimumStakeForQuorum[i]`\"},\"modifyStrategyParams(uint8,uint256[],uint96[])\":{\"notice\":\"This function is used for modifying the weights of strategies that are already in the mapping strategyParams for a specific\"},\"registerOperator(address,bytes32,bytes)\":{\"notice\":\"Registers the `operator` with `operatorId` for the specified `quorumNumbers`.\"},\"removeStrategies(uint8,uint256[])\":{\"notice\":\"This function is used for removing strategies and their associated weights from the\"},\"strategyParamsByIndex(uint8,uint256)\":{\"notice\":\"Returns the strategy and weight multiplier for the `index`'th strategy in the quorum `quorumNumber`\"},\"strategyParamsLength(uint8)\":{\"notice\":\"Returns the length of the dynamic array stored in `strategyParams[quorumNumber]`.\"},\"updateOperatorStake(address,bytes32,bytes)\":{\"notice\":\"Called by the registry coordinator to update an operator's stake for one or more quorums. If the operator no longer has the minimum stake required for a quorum, they are added to the\"},\"weightOfOperatorForQuorum(uint8,address)\":{\"notice\":\"This function computes the total weight of the @param operator in the quorum @param quorumNumber.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol\":\"IStakeRegistry\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/\",\":eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/\",\":eigenlayer-middleware/=lib/eigenlayer-middleware/src/\",\":eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/\",\":erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/\"]},\"sources\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol\":{\"keccak256\":\"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983\",\"dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol\":{\"keccak256\":\"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914\",\"dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol\":{\"keccak256\":\"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c\",\"license\":\"CC0-1.0\",\"urls\":[\"bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91\",\"dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol\":{\"keccak256\":\"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc\",\"dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol\":{\"keccak256\":\"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8\",\"dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol\":{\"keccak256\":\"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324\",\"dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol\":{\"keccak256\":\"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d\",\"dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol\":{\"keccak256\":\"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c\",\"dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol\":{\"keccak256\":\"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232\",\"dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol\":{\"keccak256\":\"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73\",\"dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol\":{\"keccak256\":\"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef\",\"dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol\":{\"keccak256\":\"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7\",\"dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol\":{\"keccak256\":\"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f\",\"dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol\":{\"keccak256\":\"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f\",\"dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol\":{\"keccak256\":\"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25\",\"dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY\"]},\"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol\":{\"keccak256\":\"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97\",\"dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.12+commit.f00d7308"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"uint96","name":"minimumStake","type":"uint96","indexed":false}],"type":"event","name":"MinimumStakeForQuorumUpdated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32","indexed":true},{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":false},{"internalType":"uint96","name":"stake","type":"uint96","indexed":false}],"type":"event","name":"OperatorStakeUpdate","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true}],"type":"event","name":"QuorumCreated","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false}],"type":"event","name":"StrategyAddedToQuorum","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false},{"internalType":"uint256","name":"multiplier","type":"uint256","indexed":false}],"type":"event","name":"StrategyMultiplierUpdated","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false}],"type":"event","name":"StrategyRemovedFromQuorum","anonymous":false},{"inputs":[],"stateMutability":"pure","type":"function","name":"WEIGHTING_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"struct IStakeRegistry.StrategyParams[]","name":"strategyParams","type":"tuple[]","components":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint96","name":"multiplier","type":"uint96"}]}],"stateMutability":"nonpayable","type":"function","name":"addStrategies"},{"inputs":[],"stateMutability":"view","type":"function","name":"delegation","outputs":[{"internalType":"contract IDelegationManager","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"deregisterOperator"},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getCurrentStake","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getCurrentTotalStake","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getLatestStakeUpdate","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate","name":"","type":"tuple","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"stateMutability":"view","type":"function","name":"getStakeAtBlockNumber","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getStakeAtBlockNumberAndIndex","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getStakeHistory","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate[]","name":"","type":"tuple[]","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getStakeUpdateAtIndex","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate","name":"","type":"tuple","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"stateMutability":"view","type":"function","name":"getStakeUpdateIndexAtBlockNumber","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getTotalStakeAtBlockNumberFromIndex","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getTotalStakeHistoryLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"view","type":"function","name":"getTotalStakeIndicesAtBlockNumber","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getTotalStakeUpdateAtIndex","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate","name":"","type":"tuple","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint96","name":"minimumStake","type":"uint96"},{"internalType":"struct IStakeRegistry.StrategyParams[]","name":"strategyParams","type":"tuple[]","components":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint96","name":"multiplier","type":"uint96"}]}],"stateMutability":"nonpayable","type":"function","name":"initializeQuorum"},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"minimumStakeForQuorum","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256[]","name":"strategyIndices","type":"uint256[]"},{"internalType":"uint96[]","name":"newMultipliers","type":"uint96[]"}],"stateMutability":"nonpayable","type":"function","name":"modifyStrategyParams"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"registerOperator","outputs":[{"internalType":"uint96[]","name":"","type":"uint96[]"},{"internalType":"uint96[]","name":"","type":"uint96[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"registryCoordinator","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256[]","name":"indicesToRemove","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function","name":"removeStrategies"},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"strategyParamsByIndex","outputs":[{"internalType":"struct IStakeRegistry.StrategyParams","name":"","type":"tuple","components":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint96","name":"multiplier","type":"uint96"}]}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"strategyParamsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateOperatorStake","outputs":[{"internalType":"uint192","name":"","type":"uint192"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"weightOfOperatorForQuorum","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]}],"devdoc":{"kind":"dev","methods":{"deregisterOperator(bytes32,bytes)":{"details":"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already deregistered 5) `quorumNumbers` is a subset of the quorumNumbers that the operator is registered for","params":{"operatorId":"The id of the operator to deregister.","quorumNumbers":"The quorum numbers the operator is deregistering from, where each byte is an 8 bit integer quorumNumber."}},"getCurrentStake(bytes32,uint8)":{"details":"Function returns weight of **0** in the event that the operator has no stake history"},"getCurrentTotalStake(uint8)":{"details":"Will revert if `_totalStakeHistory[quorumNumber]` is empty."},"getLatestStakeUpdate(bytes32,uint8)":{"details":"Function returns an StakeUpdate struct with **every entry equal to 0** in the event that the operator has no stake history"},"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)":{"details":"Function will revert if `index` is out-of-bounds.used the BLSSignatureChecker to get past stakes of signing operators","params":{"blockNumber":"Block number to make sure the stake is from.","index":"Array index for lookup, within the dynamic array `operatorIdToStakeHistory[operatorId][quorumNumber]`.","operatorId":"The id of the operator of interest.","quorumNumber":"The quorum number to get the stake for."}},"getStakeHistory(bytes32,uint8)":{"params":{"operatorId":"The id of the operator of interest.","quorumNumber":"The quorum number to get the stake for."}},"getStakeUpdateAtIndex(uint8,bytes32,uint256)":{"details":"Function will revert if `index` is out-of-bounds.","params":{"index":"Array index for lookup, within the dynamic array `operatorIdToStakeHistory[operatorId][quorumNumber]`.","operatorId":"The id of the operator of interest.","quorumNumber":"The quorum number to get the stake for."}},"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)":{"details":"Function will revert if `index` is out-of-bounds.used the BLSSignatureChecker to get past stakes of signing operators","params":{"blockNumber":"Block number to make sure the stake is from.","index":"Array index for lookup, within the dynamic array `totalStakeHistory[quorumNumber]`.","quorumNumber":"The quorum number to get the stake for."}},"getTotalStakeUpdateAtIndex(uint8,uint256)":{"params":{"index":"Array index for lookup, within the dynamic array `totalStakeHistory[quorumNumber]`.","quorumNumber":"The quorum number to get the stake for."}},"modifyStrategyParams(uint8,uint256[],uint96[])":{"params":{"newMultipliers":"are the new multipliers for the strategies","quorumNumber":"is the quorum number to change the strategy for","strategyIndices":"are the indices of the strategies to change"}},"registerOperator(address,bytes32,bytes)":{"details":"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already registered","params":{"operator":"The address of the operator to register.","operatorId":"The id of the operator to register.","quorumNumbers":"The quorum numbers the operator is registering for, where each byte is an 8 bit integer quorumNumber."},"returns":{"_0":"The operator's current stake for each quorum, and the total stake for each quorum"}},"removeStrategies(uint8,uint256[])":{"details":"higher indices should be *first* in the list of @param indicesToRemove, since otherwise the removal of lower index entries will cause a shift in the indices of the other strategiesToRemove","params":{"quorumNumber":"."}},"updateOperatorStake(address,bytes32,bytes)":{"returns":{"_0":"A bitmap of quorums where the operator no longer meets the minimum stake and should be deregistered."}},"weightOfOperatorForQuorum(uint8,address)":{"details":"reverts in the case that `quorumNumber` is greater than or equal to `quorumCount`"}},"version":1},"userdoc":{"kind":"user","methods":{"WEIGHTING_DIVISOR()":{"notice":"Constant used as a divisor in calculating weights."},"addStrategies(uint8,(address,uint96)[])":{"notice":"Adds new strategies and the associated multipliers to the @param quorumNumber."},"delegation()":{"notice":"Returns the EigenLayer delegation manager contract."},"deregisterOperator(bytes32,bytes)":{"notice":"Deregisters the operator with `operatorId` for the specified `quorumNumbers`."},"getCurrentStake(bytes32,uint8)":{"notice":"Returns the most recent stake weight for the `operatorId` for quorum `quorumNumber`"},"getCurrentTotalStake(uint8)":{"notice":"Returns the stake weight from the latest entry in `_totalStakeHistory` for quorum `quorumNumber`."},"getLatestStakeUpdate(bytes32,uint8)":{"notice":"Returns the most recent stake weight for the `operatorId` for a certain quorum"},"getStakeAtBlockNumber(bytes32,uint8,uint32)":{"notice":"Returns the stake of the operator for the provided `quorumNumber` at the given `blockNumber`"},"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)":{"notice":"Returns the stake weight corresponding to `operatorId` for quorum `quorumNumber`, at the `index`-th entry in the `operatorIdToStakeHistory[operatorId][quorumNumber]` array if the entry corresponds to the operator's stake at `blockNumber`. Reverts otherwise."},"getStakeHistory(bytes32,uint8)":{"notice":"Returns the entire `operatorIdToStakeHistory[operatorId][quorumNumber]` array."},"getStakeUpdateAtIndex(uint8,bytes32,uint256)":{"notice":"Returns the `index`-th entry in the `operatorIdToStakeHistory[operatorId][quorumNumber]` array."},"getStakeUpdateIndexAtBlockNumber(bytes32,uint8,uint32)":{"notice":"Returns the indices of the operator stakes for the provided `quorumNumber` at the given `blockNumber`"},"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)":{"notice":"Returns the total stake weight for quorum `quorumNumber`, at the `index`-th entry in the `totalStakeHistory[quorumNumber]` array if the entry corresponds to the total stake at `blockNumber`. Reverts otherwise."},"getTotalStakeIndicesAtBlockNumber(uint32,bytes)":{"notice":"Returns the indices of the total stakes for the provided `quorumNumbers` at the given `blockNumber`"},"getTotalStakeUpdateAtIndex(uint8,uint256)":{"notice":"Returns the `index`-th entry in the dynamic array of total stake, `totalStakeHistory` for quorum `quorumNumber`."},"initializeQuorum(uint8,uint96,(address,uint96)[])":{"notice":"Initialize a new quorum created by the registry coordinator by setting strategies, weights, and minimum stake"},"minimumStakeForQuorum(uint8)":{"notice":"In order to register for a quorum i, an operator must have at least `minimumStakeForQuorum[i]`"},"modifyStrategyParams(uint8,uint256[],uint96[])":{"notice":"This function is used for modifying the weights of strategies that are already in the mapping strategyParams for a specific"},"registerOperator(address,bytes32,bytes)":{"notice":"Registers the `operator` with `operatorId` for the specified `quorumNumbers`."},"removeStrategies(uint8,uint256[])":{"notice":"This function is used for removing strategies and their associated weights from the"},"strategyParamsByIndex(uint8,uint256)":{"notice":"Returns the strategy and weight multiplier for the `index`'th strategy in the quorum `quorumNumber`"},"strategyParamsLength(uint8)":{"notice":"Returns the length of the dynamic array stored in `strategyParams[quorumNumber]`."},"updateOperatorStake(address,bytes32,bytes)":{"notice":"Called by the registry coordinator to update an operator's stake for one or more quorums. If the operator no longer has the minimum stake required for a quorum, they are added to the"},"weightOfOperatorForQuorum(uint8,address)":{"notice":"This function computes the total weight of the @param operator in the quorum @param quorumNumber."}},"version":1}},"settings":{"remappings":["@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/","eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/","eigenlayer-middleware/=lib/eigenlayer-middleware/src/","eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/","erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol":"IStakeRegistry"},"evmVersion":"london","libraries":{}},"sources":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol":{"keccak256":"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00","urls":["bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983","dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol":{"keccak256":"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9","urls":["bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914","dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol":{"keccak256":"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c","urls":["bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91","dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz"],"license":"CC0-1.0"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol":{"keccak256":"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba","urls":["bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc","dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol":{"keccak256":"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c","urls":["bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8","dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol":{"keccak256":"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f","urls":["bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324","dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol":{"keccak256":"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49","urls":["bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d","dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol":{"keccak256":"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092","urls":["bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c","dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol":{"keccak256":"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79","urls":["bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232","dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol":{"keccak256":"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420","urls":["bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73","dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol":{"keccak256":"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52","urls":["bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef","dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol":{"keccak256":"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377","urls":["bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7","dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol":{"keccak256":"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d","urls":["bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f","dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol":{"keccak256":"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71","urls":["bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f","dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61","urls":["bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354","dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol":{"keccak256":"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3","urls":["bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25","dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol":{"keccak256":"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4","urls":["bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97","dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B"],"license":"BUSL-1.1"}},"version":1},"id":134}
\ No newline at end of file
diff --git a/explorer/lib/abi/StakeRegistry.json b/explorer/lib/abi/StakeRegistry.json
new file mode 100644
index 0000000000..dac6eebaa1
--- /dev/null
+++ b/explorer/lib/abi/StakeRegistry.json
@@ -0,0 +1 @@
+{"abi":[{"type":"constructor","inputs":[{"name":"_registryCoordinator","type":"address","internalType":"contract IRegistryCoordinator"},{"name":"_delegationManager","type":"address","internalType":"contract IDelegationManager"}],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_WEIGHING_FUNCTION_LENGTH","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"WEIGHTING_DIVISOR","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"addStrategies","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"_strategyParams","type":"tuple[]","internalType":"struct IStakeRegistry.StrategyParams[]","components":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"multiplier","type":"uint96","internalType":"uint96"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegation","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IDelegationManager"}],"stateMutability":"view"},{"type":"function","name":"deregisterOperator","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getCurrentStake","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getCurrentTotalStake","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getLatestStakeUpdate","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StakeUpdate","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"getStakeAtBlockNumber","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getStakeAtBlockNumberAndIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getStakeHistory","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"tuple[]","internalType":"struct IStakeRegistry.StakeUpdate[]","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"getStakeHistoryLength","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getStakeUpdateAtIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StakeUpdate","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"getStakeUpdateIndexAtBlockNumber","inputs":[{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"}],"outputs":[{"name":"","type":"uint32","internalType":"uint32"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeAtBlockNumberFromIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeHistoryLength","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeIndicesAtBlockNumber","inputs":[{"name":"blockNumber","type":"uint32","internalType":"uint32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint32[]","internalType":"uint32[]"}],"stateMutability":"view"},{"type":"function","name":"getTotalStakeUpdateAtIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StakeUpdate","components":[{"name":"updateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"nextUpdateBlockNumber","type":"uint32","internalType":"uint32"},{"name":"stake","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"initializeQuorum","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"minimumStake","type":"uint96","internalType":"uint96"},{"name":"_strategyParams","type":"tuple[]","internalType":"struct IStakeRegistry.StrategyParams[]","components":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"multiplier","type":"uint96","internalType":"uint96"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"minimumStakeForQuorum","inputs":[{"name":"","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"modifyStrategyParams","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"strategyIndices","type":"uint256[]","internalType":"uint256[]"},{"name":"newMultipliers","type":"uint96[]","internalType":"uint96[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"registerOperator","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint96[]","internalType":"uint96[]"},{"name":"","type":"uint96[]","internalType":"uint96[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"registryCoordinator","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"removeStrategies","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"indicesToRemove","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setMinimumStakeForQuorum","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"minimumStake","type":"uint96","internalType":"uint96"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"strategiesPerQuorum","inputs":[{"name":"","type":"uint8","internalType":"uint8"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"contract IStrategy"}],"stateMutability":"view"},{"type":"function","name":"strategyParams","inputs":[{"name":"","type":"uint8","internalType":"uint8"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"multiplier","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"function","name":"strategyParamsByIndex","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct IStakeRegistry.StrategyParams","components":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"multiplier","type":"uint96","internalType":"uint96"}]}],"stateMutability":"view"},{"type":"function","name":"strategyParamsLength","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"updateOperatorStake","inputs":[{"name":"operator","type":"address","internalType":"address"},{"name":"operatorId","type":"bytes32","internalType":"bytes32"},{"name":"quorumNumbers","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"uint192","internalType":"uint192"}],"stateMutability":"nonpayable"},{"type":"function","name":"weightOfOperatorForQuorum","inputs":[{"name":"quorumNumber","type":"uint8","internalType":"uint8"},{"name":"operator","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint96","internalType":"uint96"}],"stateMutability":"view"},{"type":"event","name":"MinimumStakeForQuorumUpdated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"minimumStake","type":"uint96","indexed":false,"internalType":"uint96"}],"anonymous":false},{"type":"event","name":"OperatorStakeUpdate","inputs":[{"name":"operatorId","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"quorumNumber","type":"uint8","indexed":false,"internalType":"uint8"},{"name":"stake","type":"uint96","indexed":false,"internalType":"uint96"}],"anonymous":false},{"type":"event","name":"QuorumCreated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"StrategyAddedToQuorum","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"}],"anonymous":false},{"type":"event","name":"StrategyMultiplierUpdated","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"},{"name":"multiplier","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"StrategyRemovedFromQuorum","inputs":[{"name":"quorumNumber","type":"uint8","indexed":true,"internalType":"uint8"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"}],"anonymous":false}],"bytecode":{"object":"0x60c06040523480156200001157600080fd5b506040516200395838038062003958833981016040819052620000349162000065565b6001600160a01b0391821660a05216608052620000a4565b6001600160a01b03811681146200006257600080fd5b50565b600080604083850312156200007957600080fd5b825162000086816200004c565b602084015190925062000099816200004c565b809150509250929050565b60805160a05161384f620001096000396000818161037a015281816106320152818161096f01528181610ce6015281816111110152818161170301528181611805015281816119290152611ce70152600081816105290152611ea8015261384f6000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80639f3ccf651161010f578063c8294c56116100a2578063f2be94ae11610071578063f2be94ae1461054b578063f851e1981461055e578063fa28c62714610571578063ff694a771461058457600080fd5b8063c8294c56146104d6578063d5eccc05146104e9578063dd9846b9146104fc578063df5cf7231461052457600080fd5b8063bc9a40c3116100de578063bc9a40c314610474578063bd29b8cd14610487578063c46778a51461049a578063c601527d146104c357600080fd5b80639f3ccf65146103ee578063ac6bfb0314610401578063adc804da14610421578063b6904b781461046157600080fd5b80634bd26e091161018757806366acfefe1161015657806366acfefe1461034a5780636d14a987146103755780637c172347146103b457806381c07502146103ce57600080fd5b80634bd26e09146102e55780635401ed27146103155780635e5a6775146103285780635f1f2d771461033757600080fd5b806320b66298116101c357806320b662981461026c57806325504777146102815780632cd95940146102a25780633ca5a5f5146102c257600080fd5b80630491b41c146101ea57806308732461146102205780631f9b74e014610241575b600080fd5b61020d6101f8366004612c27565b60ff1660009081526001602052604090205490565b6040519081526020015b60405180910390f35b61023361022e366004612c42565b610597565b604051610217929190612c6c565b61025461024f366004612ca6565b6105e0565b6040516001600160601b039091168152602001610217565b61027f61027a366004612d21565b610630565b005b61029461028f366004612de2565b610961565b604051610217929190612e81565b6102b56102b0366004612ea6565b610c2c565b6040516102179190612ed2565b61020d6102d0366004612c27565b60ff1660009081526003602052604090205490565b61020d6102f3366004612ea6565b600091825260026020908152604080842060ff93909316845291905290205490565b610254610323366004612ea6565b610ccb565b61020d670de0b6b3a764000081565b61027f610345366004612fdb565b610ce4565b61035d610358366004612de2565b611104565b6040516001600160c01b039091168152602001610217565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610217565b6103bc602081565b60405160ff9091168152602001610217565b6103e16103dc366004613097565b61125e565b60405161021791906130e9565b61039c6103fc366004612c42565b611528565b61041461040f366004613127565b611560565b604051610217919061315a565b61043461042f366004612c42565b6115f8565b6040805182516001600160a01b031681526020928301516001600160601b03169281019290925201610217565b61041461046f366004612c42565b611672565b61027f6104823660046131a6565b611701565b61027f6104953660046131d0565b6117fa565b6102546104a8366004612c27565b6000602081905290815260409020546001600160601b031681565b61027f6104d136600461329c565b611927565b6102546104e43660046132e9565b611a1b565b6102546104f7366004612c27565b611a99565b61050f61050a366004613325565b611aec565b60405163ffffffff9091168152602001610217565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b610254610559366004613361565b611b01565b61041461056c366004612ea6565b611b96565b61025461057f366004613325565b611c7b565b61027f6105923660046133a3565b611cdc565b600360205281600052604060002081815481106105b357600080fd5b6000918252602090912001546001600160a01b0381169250600160a01b90046001600160601b0316905082565b60ff8216600090815260016020526040812054839061061a5760405162461bcd60e51b815260040161061190613400565b60405180910390fd5b60006106268585611e47565b5095945050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b29190613451565b6001600160a01b0316336001600160a01b0316146106e25760405162461bcd60e51b81526004016106119061346e565b846106fe8160ff16600090815260016020526040902054151590565b61071a5760405162461bcd60e51b815260040161061190613400565b8380610790576040805162461bcd60e51b81526020600482015260248101919091527f5374616b6552656769737472792e6d6f6469667953747261746567795061726160448201527f6d733a206e6f20737472617465677920696e64696365732070726f76696465646064820152608401610611565b8281146108055760405162461bcd60e51b815260206004820152603960248201527f5374616b6552656769737472792e6d6f6469667953747261746567795061726160448201527f6d733a20696e707574206c656e677468206d69736d61746368000000000000006064820152608401610611565b60ff87166000908152600360205260408120905b8281101561095657858582818110610833576108336134ea565b90506020020160208101906108489190613500565b8289898481811061085b5761085b6134ea565b9050602002013581548110610872576108726134ea565b9060005260206000200160000160146101000a8154816001600160601b0302191690836001600160601b031602179055508860ff167f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a75838a8a858181106108db576108db6134ea565b90506020020135815481106108f2576108f26134ea565b6000918252602090912001546001600160a01b0316888885818110610919576109196134ea565b905060200201602081019061092e9190613500565b60405161093c929190612c6c565b60405180910390a28061094e81613531565b915050610819565b505050505050505050565b606080336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109ac5760405162461bcd60e51b81526004016106119061354c565b6000836001600160401b038111156109c6576109c6612f4a565b6040519080825280602002602001820160405280156109ef578160200160208202803683370190505b5090506000846001600160401b03811115610a0c57610a0c612f4a565b604051908082528060200260200182016040528015610a35578160200160208202803683370190505b50905060005b85811015610c1e576000878783818110610a5757610a576134ea565b919091013560f81c60008181526001602052604090205490925015159050610adf5760405162461bcd60e51b815260206004820152603560248201527f5374616b6552656769737472792e72656769737465724f70657261746f723a206044820152741c5d5bdc9d5b48191bd95cc81b9bdd08195e1a5cdd605a1b6064820152608401610611565b600080610aec838d611e47565b9150915080610b895760405162461bcd60e51b815260206004820152605b60248201527f5374616b6552656769737472792e72656769737465724f70657261746f723a2060448201527f4f70657261746f7220646f6573206e6f74206d656574206d696e696d756d207360648201527f74616b6520726571756972656d656e7420666f722071756f72756d0000000000608482015260a401610611565b6000610b968c8585612045565b905082878681518110610bab57610bab6134ea565b60200260200101906001600160601b031690816001600160601b031681525050610bd584826122c5565b868681518110610be757610be76134ea565b60200260200101906001600160601b031690816001600160601b031681525050505050508080610c1690613531565b915050610a3b565b509097909650945050505050565b600082815260026020908152604080832060ff851684528252808320805482518185028101850190935280835260609492939192909184015b82821015610cbe576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b82041683850152600160401b90046001600160601b031690820152825260019092019101610c65565b5050505090505b92915050565b600080610cd88484611b96565b60400151949350505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d669190613451565b6001600160a01b0316336001600160a01b031614610d965760405162461bcd60e51b81526004016106119061346e565b81610db28160ff16600090815260016020526040902054151590565b610dce5760405162461bcd60e51b815260040161061190613400565b815180610e435760405162461bcd60e51b815260206004820152603d60248201527f5374616b6552656769737472792e72656d6f7665537472617465676965733a2060448201527f6e6f20696e646963657320746f2072656d6f76652070726f76696465640000006064820152608401610611565b60ff841660009081526003602090815260408083206004909252822090915b838110156110fb578660ff167f31fa2e2cd280c9375e13ffcf3d81e2378100186e4058f8d3ddb690b82dcd31f784888481518110610ea257610ea26134ea565b602002602001015181548110610eba57610eba6134ea565b600091825260209182902001546040516001600160a01b0390911681520160405180910390a28660ff167f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a7584888481518110610f1857610f186134ea565b602002602001015181548110610f3057610f306134ea565b600091825260208083209190910154604080516001600160a01b039092168252918101929092520160405180910390a282548390610f70906001906135be565b81548110610f8057610f806134ea565b9060005260206000200183878381518110610f9d57610f9d6134ea565b602002602001015181548110610fb557610fb56134ea565b600091825260209091208254910180546001600160a01b0319166001600160a01b03909216918217815591546001600160601b03600160a01b9182900416021790558254839080611008576110086135d5565b60008281526020812082016000199081019190915501905581548290611030906001906135be565b81548110611040576110406134ea565b9060005260206000200160009054906101000a90046001600160a01b031682878381518110611071576110716134ea565b602002602001015181548110611089576110896134ea565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550818054806110c7576110c76135d5565b600082815260209020810160001990810180546001600160a01b0319169055019055806110f381613531565b915050610e62565b50505050505050565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461114e5760405162461bcd60e51b81526004016106119061354c565b6000805b8381101561062657600085858381811061116e5761116e6134ea565b919091013560f81c600081815260016020526040902054909250151590506111fe5760405162461bcd60e51b815260206004820152603860248201527f5374616b6552656769737472792e7570646174654f70657261746f725374616b60448201527f653a2071756f72756d20646f6573206e6f7420657869737400000000000000006064820152608401610611565b60008061120b838b611e47565b915091508061122d5760009150600160ff84161b6001600160c01b0386161794505b600061123a8a8585612045565b905061124684826122c5565b5050505050808061125690613531565b915050611152565b60606000826001600160401b0381111561127a5761127a612f4a565b6040519080825280602002602001820160405280156112a3578160200160208202803683370190505b50905060005b8381101561151d5760008585838181106112c5576112c56134ea565b919091013560f81c600081815260016020526040902054909250151590506113645760405162461bcd60e51b815260206004820152604660248201527f5374616b6552656769737472792e676574546f74616c5374616b65496e64696360448201527f65734174426c6f636b4e756d6265723a2071756f72756d20646f6573206e6f7460648201526508195e1a5cdd60d21b608482015260a401610611565b60ff81166000908152600160205260408120805463ffffffff8a16929061138d5761138d6134ea565b60009182526020909120015463ffffffff1611156114395760405162461bcd60e51b815260206004820152605b60248201527f5374616b6552656769737472792e676574546f74616c5374616b65496e64696360448201527f65734174426c6f636b4e756d6265723a2071756f72756d20686173206e6f207360648201527f74616b6520686973746f727920617420626c6f636b4e756d6265720000000000608482015260a401610611565b60ff8116600090815260016020526040812054905b818110156115075760ff8316600090815260016020819052604090912063ffffffff8b169161147d84866135be565b61148791906135be565b81548110611497576114976134ea565b60009182526020909120015463ffffffff16116114f55760016114ba82846135be565b6114c491906135be565b8585815181106114d6576114d66134ea565b602002602001019063ffffffff16908163ffffffff1681525050611507565b806114ff81613531565b91505061144e565b505050808061151590613531565b9150506112a9565b5090505b9392505050565b6004602052816000526040600020818154811061154457600080fd5b6000918252602090912001546001600160a01b03169150829050565b60408051606081018252600080825260208083018290528284018290528582526002815283822060ff881683529052919091208054839081106115a5576115a56134ea565b600091825260209182902060408051606081018252929091015463ffffffff8082168452600160201b82041693830193909352600160401b9092046001600160601b031691810191909152949350505050565b604080518082019091526000808252602082015260ff83166000908152600360205260409020805483908110611630576116306134ea565b6000918252602091829020604080518082019091529101546001600160a01b0381168252600160a01b90046001600160601b0316918101919091529392505050565b604080516060810182526000808252602080830182905282840182905260ff8616825260019052919091208054839081106116af576116af6134ea565b600091825260209182902060408051606081018252929091015463ffffffff8082168452600160201b82041693830193909352600160401b9092046001600160601b0316918101919091529392505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561175f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117839190613451565b6001600160a01b0316336001600160a01b0316146117b35760405162461bcd60e51b81526004016106119061346e565b816117cf8160ff16600090815260016020526040902054151590565b6117eb5760405162461bcd60e51b815260040161061190613400565b6117f5838361243f565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118425760405162461bcd60e51b81526004016106119061354c565b60005b81811015611921576000838383818110611861576118616134ea565b919091013560f81c600081815260016020526040902054909250151590506118f15760405162461bcd60e51b815260206004820152603760248201527f5374616b6552656769737472792e646572656769737465724f70657261746f7260448201527f3a2071756f72756d20646f6573206e6f742065786973740000000000000000006064820152608401610611565b60006118ff86836000612045565b905061190b82826122c5565b505050808061191990613531565b915050611845565b50505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611985573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a99190613451565b6001600160a01b0316336001600160a01b0316146119d95760405162461bcd60e51b81526004016106119061346e565b816119f58160ff16600090815260016020526040902054151590565b611a115760405162461bcd60e51b815260040161061190613400565b6117f583836124a8565b60ff83166000908152600160205260408120805482919084908110611a4257611a426134ea565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b90930492909216908201529050610cd881856128eb565b60ff81166000908152600160208190526040822080549091611aba916135be565b81548110611aca57611aca6134ea565b600091825260209091200154600160401b90046001600160601b031692915050565b6000611af9848484612a65565b949350505050565b600082815260026020908152604080832060ff881684529091528120805482919084908110611b3257611b326134ea565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b90930492909216908201529050611b8981866128eb565b6040015195945050505050565b6040805160608082018352600080835260208084018290528385018290528682526002815284822060ff87168352815284822054855193840186528284529083018290529382015290919081611bef579150610cc59050565b600085815260026020908152604080832060ff881684529091529020611c166001846135be565b81548110611c2657611c266134ea565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b90930492909216908201529250610cc5915050565b600083815260026020908152604080832060ff861684529091528120611ca2858585612a65565b63ffffffff1681548110611cb857611cb86134ea565b600091825260209091200154600160401b90046001600160601b0316949350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d245760405162461bcd60e51b81526004016106119061354c565b60ff831660009081526001602052604090205415611da25760405162461bcd60e51b815260206004820152603560248201527f5374616b6552656769737472792e696e697469616c697a6551756f72756d3a2060448201527471756f72756d20616c72656164792065786973747360581b6064820152608401610611565b611dac83826124a8565b611db6838361243f565b505060ff166000908152600160208181526040808420815160608101835263ffffffff438116825281850187815293820187815283549687018455928752939095209451949093018054915193516001600160601b0316600160401b02600160401b600160a01b0319948416600160201b0267ffffffffffffffff1990931695909316949094171791909116179055565b600080600080611e668660ff1660009081526003602052604090205490565b604080518082019091526000808252602082015290915060ff871660009081526004602081905260408083209051639004134760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692639004134792611edb928c92016135eb565b600060405180830381865afa158015611ef8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f20919081019061364a565b905060005b838110156120115760ff89166000908152600360205260409020805482908110611f5157611f516134ea565b60009182526020808320604080518082019091529201546001600160a01b0381168352600160a01b90046001600160601b0316908201528351909450839083908110611f9f57611f9f6134ea565b60200260200101511115611fff57670de0b6b3a764000083602001516001600160601b0316838381518110611fd657611fd66134ea565b6020026020010151611fe891906136da565b611ff291906136f9565b611ffc908661371b565b94505b8061200981613531565b915050611f25565b50505060ff8616600090815260208190526040902054919350506001600160601b03908116908316101590505b9250929050565b600083815260026020908152604080832060ff8616845290915281205481908061210957600086815260026020908152604080832060ff891684528252808320815160608101835263ffffffff43811682528185018681526001600160601b03808c16958401958652845460018101865594885295909620915191909201805495519351909416600160401b02600160401b600160a01b0319938316600160201b0267ffffffffffffffff199096169190921617939093171691909117905561226b565b600086815260026020908152604080832060ff8916845290915281206121306001846135be565b81548110612140576121406134ea565b600091825260209091200180546001600160601b03600160401b9091048116945090915085168314156121795760009350505050611521565b80544363ffffffff908116911614156121b3578054600160401b600160a01b031916600160401b6001600160601b03871602178155612269565b805467ffffffff000000001916600160201b4363ffffffff90811682810293909317845560008a815260026020908152604080832060ff8d168452825280832081516060810183529687528683018481526001600160601b038d81169389019384528254600181018455928652939094209651960180549351915196851667ffffffffffffffff1990941693909317931690930291909117600160401b600160a01b031916600160401b93909216929092021790555b505b6040805160ff871681526001600160601b038616602082015287917f2f527d527e95d8fe40aec55377743bb779087da3f6d0d08f12e36444da62327d910160405180910390a26122bb8285612bcb565b9695505050505050565b60ff8216600090815260016020819052604082208054918391906122e990846135be565b815481106122f9576122f96134ea565b90600052602060002001905083600014156123285754600160401b90046001600160601b03169150610cc59050565b805460009061234790600160401b90046001600160601b031686612be3565b82549091504363ffffffff90811691161415612384578154600160401b600160a01b031916600160401b6001600160601b03831602178255612436565b815463ffffffff438116600160201b81810267ffffffff000000001990941693909317855560ff8916600090815260016020818152604080842081516060810183529586528583018581526001600160601b03808b169388019384528254958601835591865292909420945194909201805491519251909316600160401b02600160401b600160a01b031992861690960267ffffffffffffffff19909116939094169290921792909217169190911790555b95945050505050565b60ff82166000818152602081815260409182902080546bffffffffffffffffffffffff19166001600160601b03861690811790915591519182527f26eecff2b70b0a71104ff4d940ba7162d23a95c248771fc487a7be17a596b3cf910160405180910390a25050565b600081511161250d5760405162461bcd60e51b815260206004820152603860248201526000805160206137fa83398151915260448201527f3a206e6f20737472617465676965732070726f766964656400000000000000006064820152608401610611565b805160ff8316600090815260036020908152604090912054906125308383613746565b11156125a05760405162461bcd60e51b815260206004820152604560248201526000805160206137fa83398151915260448201527f3a20657863656564204d41585f5745494748494e475f46554e4354494f4e5f4c60648201526408a9c8ea8960db1b608482015260a401610611565b60005b828110156128e45760005b6125b88284613746565b811015612699578482815181106125d1576125d16134ea565b6020026020010151600001516001600160a01b0316600360008860ff1660ff1681526020019081526020016000208281548110612610576126106134ea565b6000918252602090912001546001600160a01b031614156126875760405162461bcd60e51b815260206004820152603d60248201526000805160206137fa83398151915260448201527f3a2063616e6e6f74206164642073616d652073747261746567792032780000006064820152608401610611565b8061269181613531565b9150506125ae565b5060008482815181106126ae576126ae6134ea565b6020026020010151602001516001600160601b0316116127335760405162461bcd60e51b815260206004820152604660248201526000805160206137fa83398151915260448201527f3a2063616e6e6f74206164642073747261746567792077697468207a65726f206064820152651dd95a59da1d60d21b608482015260a401610611565b60ff851660009081526003602052604090208451859083908110612759576127596134ea565b602090810291909101810151825460018101845560009384528284208251928401516001600160601b0316600160a01b026001600160a01b039093169290921791015560ff87168252600490526040902084518590839081106127be576127be6134ea565b6020908102919091018101515182546001810184556000938452919092200180546001600160a01b0319166001600160a01b03909216919091179055835160ff8616907f10565e56cacbf32eca267945f054fec02e59750032d113d3302182ad967f540490869084908110612835576128356134ea565b602090810291909101810151516040516001600160a01b0390911681520160405180910390a28460ff167f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a75858381518110612892576128926134ea565b6020026020010151600001518684815181106128b0576128b06134ea565b6020026020010151602001516040516128ca929190612c6c565b60405180910390a2806128dc81613531565b9150506125a3565b5050505050565b816000015163ffffffff168163ffffffff1610156129905760405162461bcd60e51b815260206004820152605660248201527f5374616b6552656769737472792e5f76616c69646174655374616b655570646160448201527f74654174426c6f636b4e756d6265723a207374616b6555706461746520697320606482015275333937b69030b33a32b910313637b1b5a73ab6b132b960511b608482015260a401610611565b602082015163ffffffff1615806129b65750816020015163ffffffff168163ffffffff16105b612a615760405162461bcd60e51b815260206004820152606a60248201527f5374616b6552656769737472792e5f76616c69646174655374616b655570646160448201527f74654174426c6f636b4e756d6265723a2074686572652069732061206e65776560648201527f72207374616b6555706461746520617661696c61626c65206265666f726520626084820152693637b1b5a73ab6b132b960b11b60a482015260c401610611565b5050565b600083815260026020908152604080832060ff86168452909152812054805b8015612b0657600086815260026020908152604080832060ff89168452909152902063ffffffff851690612ab96001846135be565b81548110612ac957612ac96134ea565b60009182526020909120015463ffffffff1611612af457612aeb6001826135be565b92505050611521565b80612afe8161375e565b915050612a84565b5060405162461bcd60e51b815260206004820152608160248201527f5374616b6552656769737472792e5f6765745374616b65557064617465496e6460448201527f6578466f724f70657261746f724174426c6f636b4e756d6265723a206e6f207360648201527f74616b652075706461746520666f756e6420666f72206f70657261746f72496460848201527f20616e642071756f72756d4e756d62657220617420626c6f636b206e756d626560a4820152603960f91b60c482015260e401610611565b60006115216001600160601b03808516908416613775565b600080821215612c0757612bf6826137b4565b612c0090846137d1565b9050610cc5565b612c00828461371b565b803560ff81168114612c2257600080fd5b919050565b600060208284031215612c3957600080fd5b61152182612c11565b60008060408385031215612c5557600080fd5b612c5e83612c11565b946020939093013593505050565b6001600160a01b039290921682526001600160601b0316602082015260400190565b6001600160a01b0381168114612ca357600080fd5b50565b60008060408385031215612cb957600080fd5b612cc283612c11565b91506020830135612cd281612c8e565b809150509250929050565b60008083601f840112612cef57600080fd5b5081356001600160401b03811115612d0657600080fd5b6020830191508360208260051b850101111561203e57600080fd5b600080600080600060608688031215612d3957600080fd5b612d4286612c11565b945060208601356001600160401b0380821115612d5e57600080fd5b612d6a89838a01612cdd565b90965094506040880135915080821115612d8357600080fd5b50612d9088828901612cdd565b969995985093965092949392505050565b60008083601f840112612db357600080fd5b5081356001600160401b03811115612dca57600080fd5b60208301915083602082850101111561203e57600080fd5b60008060008060608587031215612df857600080fd5b8435612e0381612c8e565b93506020850135925060408501356001600160401b03811115612e2557600080fd5b612e3187828801612da1565b95989497509550505050565b600081518084526020808501945080840160005b83811015612e765781516001600160601b031687529582019590820190600101612e51565b509495945050505050565b604081526000612e946040830185612e3d565b82810360208401526124368185612e3d565b60008060408385031215612eb957600080fd5b82359150612ec960208401612c11565b90509250929050565b6020808252825182820181905260009190848201906040850190845b81811015612f3e57612f2b83855163ffffffff808251168352806020830151166020840152506001600160601b0360408201511660408301525050565b9284019260609290920191600101612eee565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612f8257612f82612f4a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612fb057612fb0612f4a565b604052919050565b60006001600160401b03821115612fd157612fd1612f4a565b5060051b60200190565b60008060408385031215612fee57600080fd5b612ff783612c11565b91506020808401356001600160401b0381111561301357600080fd5b8401601f8101861361302457600080fd5b803561303761303282612fb8565b612f88565b81815260059190911b8201830190838101908883111561305657600080fd5b928401925b828410156130745783358252928401929084019061305b565b80955050505050509250929050565b803563ffffffff81168114612c2257600080fd5b6000806000604084860312156130ac57600080fd5b6130b584613083565b925060208401356001600160401b038111156130d057600080fd5b6130dc86828701612da1565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b81811015612f3e57835163ffffffff1683529284019291840191600101613105565b60008060006060848603121561313c57600080fd5b61314584612c11565b95602085013595506040909401359392505050565b815163ffffffff9081168252602080840151909116908201526040808301516001600160601b03169082015260608101610cc5565b80356001600160601b0381168114612c2257600080fd5b600080604083850312156131b957600080fd5b6131c283612c11565b9150612ec96020840161318f565b6000806000604084860312156131e557600080fd5b8335925060208401356001600160401b038111156130d057600080fd5b600082601f83011261321357600080fd5b8135602061322361303283612fb8565b82815260069290921b8401810191818101908684111561324257600080fd5b8286015b84811015613291576040818903121561325f5760008081fd5b613267612f60565b813561327281612c8e565b815261327f82860161318f565b81860152835291830191604001613246565b509695505050505050565b600080604083850312156132af57600080fd5b6132b883612c11565b915060208301356001600160401b038111156132d357600080fd5b6132df85828601613202565b9150509250929050565b6000806000606084860312156132fe57600080fd5b61330784612c11565b925061331560208501613083565b9150604084013590509250925092565b60008060006060848603121561333a57600080fd5b8335925061334a60208501612c11565b915061335860408501613083565b90509250925092565b6000806000806080858703121561337757600080fd5b61338085612c11565b935061338e60208601613083565b93969395505050506040820135916060013590565b6000806000606084860312156133b857600080fd5b6133c184612c11565b92506133cf6020850161318f565b915060408401356001600160401b038111156133ea57600080fd5b6133f686828701613202565b9150509250925092565b60208082526031908201527f5374616b6552656769737472792e71756f72756d4578697374733a2071756f726040820152701d5b48191bd95cc81b9bdd08195e1a5cdd607a1b606082015260800190565b60006020828403121561346357600080fd5b815161152181612c8e565b60208082526056908201527f5374616b6552656769737472792e6f6e6c79436f6f7264696e61746f724f776e60408201527f65723a2063616c6c6572206973206e6f7420746865206f776e6572206f6620746060820152753432903932b3b4b9ba393ca1b7b7b93234b730ba37b960511b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561351257600080fd5b6115218261318f565b634e487b7160e01b600052601160045260246000fd5b60006000198214156135455761354561351b565b5060010190565b6020808252604c908201527f5374616b6552656769737472792e6f6e6c795265676973747279436f6f72646960408201527f6e61746f723a2063616c6c6572206973206e6f7420746865205265676973747260608201526b3ca1b7b7b93234b730ba37b960a11b608082015260a00190565b6000828210156135d0576135d061351b565b500390565b634e487b7160e01b600052603160045260246000fd5b60006040820160018060a01b03808616845260206040818601528286548085526060870191508760005282600020945060005b8181101561363c57855485168352600195860195928401920161361e565b509098975050505050505050565b6000602080838503121561365d57600080fd5b82516001600160401b0381111561367357600080fd5b8301601f8101851361368457600080fd5b805161369261303282612fb8565b81815260059190911b820183019083810190878311156136b157600080fd5b928401925b828410156136cf578351825292840192908401906136b6565b979650505050505050565b60008160001904831182151516156136f4576136f461351b565b500290565b60008261371657634e487b7160e01b600052601260045260246000fd5b500490565b60006001600160601b0380831681851680830382111561373d5761373d61351b565b01949350505050565b600082198211156137595761375961351b565b500190565b60008161376d5761376d61351b565b506000190190565b60008083128015600160ff1b8501841216156137935761379361351b565b6001600160ff1b03840183138116156137ae576137ae61351b565b50500390565b6000600160ff1b8214156137ca576137ca61351b565b5060000390565b60006001600160601b03838116908316818110156137f1576137f161351b565b03939250505056fe5374616b6552656769737472792e5f6164645374726174656779506172616d73a264697066735822122013e43aa0d17be9068c90a8cc3e1e30a67f8fb3af90dd77b77812e62b135f0e1364736f6c634300080c0033","sourceMap":"960:31820:123:-:0;;;1675:181;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2269:51:124;;;;;2330:31;;;960:31820:123;;14:153:184;-1:-1:-1;;;;;111:31:184;;101:42;;91:70;;157:1;154;147:12;91:70;14:153;:::o;172:486::-;308:6;316;369:2;357:9;348:7;344:23;340:32;337:52;;;385:1;382;375:12;337:52;417:9;411:16;436:53;483:5;436:53;:::i;:::-;558:2;543:18;;537:25;508:5;;-1:-1:-1;571:55:184;537:25;571:55;:::i;:::-;645:7;635:17;;;172:486;;;;;:::o;:::-;960:31820:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80639f3ccf651161010f578063c8294c56116100a2578063f2be94ae11610071578063f2be94ae1461054b578063f851e1981461055e578063fa28c62714610571578063ff694a771461058457600080fd5b8063c8294c56146104d6578063d5eccc05146104e9578063dd9846b9146104fc578063df5cf7231461052457600080fd5b8063bc9a40c3116100de578063bc9a40c314610474578063bd29b8cd14610487578063c46778a51461049a578063c601527d146104c357600080fd5b80639f3ccf65146103ee578063ac6bfb0314610401578063adc804da14610421578063b6904b781461046157600080fd5b80634bd26e091161018757806366acfefe1161015657806366acfefe1461034a5780636d14a987146103755780637c172347146103b457806381c07502146103ce57600080fd5b80634bd26e09146102e55780635401ed27146103155780635e5a6775146103285780635f1f2d771461033757600080fd5b806320b66298116101c357806320b662981461026c57806325504777146102815780632cd95940146102a25780633ca5a5f5146102c257600080fd5b80630491b41c146101ea57806308732461146102205780631f9b74e014610241575b600080fd5b61020d6101f8366004612c27565b60ff1660009081526001602052604090205490565b6040519081526020015b60405180910390f35b61023361022e366004612c42565b610597565b604051610217929190612c6c565b61025461024f366004612ca6565b6105e0565b6040516001600160601b039091168152602001610217565b61027f61027a366004612d21565b610630565b005b61029461028f366004612de2565b610961565b604051610217929190612e81565b6102b56102b0366004612ea6565b610c2c565b6040516102179190612ed2565b61020d6102d0366004612c27565b60ff1660009081526003602052604090205490565b61020d6102f3366004612ea6565b600091825260026020908152604080842060ff93909316845291905290205490565b610254610323366004612ea6565b610ccb565b61020d670de0b6b3a764000081565b61027f610345366004612fdb565b610ce4565b61035d610358366004612de2565b611104565b6040516001600160c01b039091168152602001610217565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610217565b6103bc602081565b60405160ff9091168152602001610217565b6103e16103dc366004613097565b61125e565b60405161021791906130e9565b61039c6103fc366004612c42565b611528565b61041461040f366004613127565b611560565b604051610217919061315a565b61043461042f366004612c42565b6115f8565b6040805182516001600160a01b031681526020928301516001600160601b03169281019290925201610217565b61041461046f366004612c42565b611672565b61027f6104823660046131a6565b611701565b61027f6104953660046131d0565b6117fa565b6102546104a8366004612c27565b6000602081905290815260409020546001600160601b031681565b61027f6104d136600461329c565b611927565b6102546104e43660046132e9565b611a1b565b6102546104f7366004612c27565b611a99565b61050f61050a366004613325565b611aec565b60405163ffffffff9091168152602001610217565b61039c7f000000000000000000000000000000000000000000000000000000000000000081565b610254610559366004613361565b611b01565b61041461056c366004612ea6565b611b96565b61025461057f366004613325565b611c7b565b61027f6105923660046133a3565b611cdc565b600360205281600052604060002081815481106105b357600080fd5b6000918252602090912001546001600160a01b0381169250600160a01b90046001600160601b0316905082565b60ff8216600090815260016020526040812054839061061a5760405162461bcd60e51b815260040161061190613400565b60405180910390fd5b60006106268585611e47565b5095945050505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b29190613451565b6001600160a01b0316336001600160a01b0316146106e25760405162461bcd60e51b81526004016106119061346e565b846106fe8160ff16600090815260016020526040902054151590565b61071a5760405162461bcd60e51b815260040161061190613400565b8380610790576040805162461bcd60e51b81526020600482015260248101919091527f5374616b6552656769737472792e6d6f6469667953747261746567795061726160448201527f6d733a206e6f20737472617465677920696e64696365732070726f76696465646064820152608401610611565b8281146108055760405162461bcd60e51b815260206004820152603960248201527f5374616b6552656769737472792e6d6f6469667953747261746567795061726160448201527f6d733a20696e707574206c656e677468206d69736d61746368000000000000006064820152608401610611565b60ff87166000908152600360205260408120905b8281101561095657858582818110610833576108336134ea565b90506020020160208101906108489190613500565b8289898481811061085b5761085b6134ea565b9050602002013581548110610872576108726134ea565b9060005260206000200160000160146101000a8154816001600160601b0302191690836001600160601b031602179055508860ff167f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a75838a8a858181106108db576108db6134ea565b90506020020135815481106108f2576108f26134ea565b6000918252602090912001546001600160a01b0316888885818110610919576109196134ea565b905060200201602081019061092e9190613500565b60405161093c929190612c6c565b60405180910390a28061094e81613531565b915050610819565b505050505050505050565b606080336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109ac5760405162461bcd60e51b81526004016106119061354c565b6000836001600160401b038111156109c6576109c6612f4a565b6040519080825280602002602001820160405280156109ef578160200160208202803683370190505b5090506000846001600160401b03811115610a0c57610a0c612f4a565b604051908082528060200260200182016040528015610a35578160200160208202803683370190505b50905060005b85811015610c1e576000878783818110610a5757610a576134ea565b919091013560f81c60008181526001602052604090205490925015159050610adf5760405162461bcd60e51b815260206004820152603560248201527f5374616b6552656769737472792e72656769737465724f70657261746f723a206044820152741c5d5bdc9d5b48191bd95cc81b9bdd08195e1a5cdd605a1b6064820152608401610611565b600080610aec838d611e47565b9150915080610b895760405162461bcd60e51b815260206004820152605b60248201527f5374616b6552656769737472792e72656769737465724f70657261746f723a2060448201527f4f70657261746f7220646f6573206e6f74206d656574206d696e696d756d207360648201527f74616b6520726571756972656d656e7420666f722071756f72756d0000000000608482015260a401610611565b6000610b968c8585612045565b905082878681518110610bab57610bab6134ea565b60200260200101906001600160601b031690816001600160601b031681525050610bd584826122c5565b868681518110610be757610be76134ea565b60200260200101906001600160601b031690816001600160601b031681525050505050508080610c1690613531565b915050610a3b565b509097909650945050505050565b600082815260026020908152604080832060ff851684528252808320805482518185028101850190935280835260609492939192909184015b82821015610cbe576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b82041683850152600160401b90046001600160601b031690820152825260019092019101610c65565b5050505090505b92915050565b600080610cd88484611b96565b60400151949350505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d669190613451565b6001600160a01b0316336001600160a01b031614610d965760405162461bcd60e51b81526004016106119061346e565b81610db28160ff16600090815260016020526040902054151590565b610dce5760405162461bcd60e51b815260040161061190613400565b815180610e435760405162461bcd60e51b815260206004820152603d60248201527f5374616b6552656769737472792e72656d6f7665537472617465676965733a2060448201527f6e6f20696e646963657320746f2072656d6f76652070726f76696465640000006064820152608401610611565b60ff841660009081526003602090815260408083206004909252822090915b838110156110fb578660ff167f31fa2e2cd280c9375e13ffcf3d81e2378100186e4058f8d3ddb690b82dcd31f784888481518110610ea257610ea26134ea565b602002602001015181548110610eba57610eba6134ea565b600091825260209182902001546040516001600160a01b0390911681520160405180910390a28660ff167f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a7584888481518110610f1857610f186134ea565b602002602001015181548110610f3057610f306134ea565b600091825260208083209190910154604080516001600160a01b039092168252918101929092520160405180910390a282548390610f70906001906135be565b81548110610f8057610f806134ea565b9060005260206000200183878381518110610f9d57610f9d6134ea565b602002602001015181548110610fb557610fb56134ea565b600091825260209091208254910180546001600160a01b0319166001600160a01b03909216918217815591546001600160601b03600160a01b9182900416021790558254839080611008576110086135d5565b60008281526020812082016000199081019190915501905581548290611030906001906135be565b81548110611040576110406134ea565b9060005260206000200160009054906101000a90046001600160a01b031682878381518110611071576110716134ea565b602002602001015181548110611089576110896134ea565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550818054806110c7576110c76135d5565b600082815260209020810160001990810180546001600160a01b0319169055019055806110f381613531565b915050610e62565b50505050505050565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461114e5760405162461bcd60e51b81526004016106119061354c565b6000805b8381101561062657600085858381811061116e5761116e6134ea565b919091013560f81c600081815260016020526040902054909250151590506111fe5760405162461bcd60e51b815260206004820152603860248201527f5374616b6552656769737472792e7570646174654f70657261746f725374616b60448201527f653a2071756f72756d20646f6573206e6f7420657869737400000000000000006064820152608401610611565b60008061120b838b611e47565b915091508061122d5760009150600160ff84161b6001600160c01b0386161794505b600061123a8a8585612045565b905061124684826122c5565b5050505050808061125690613531565b915050611152565b60606000826001600160401b0381111561127a5761127a612f4a565b6040519080825280602002602001820160405280156112a3578160200160208202803683370190505b50905060005b8381101561151d5760008585838181106112c5576112c56134ea565b919091013560f81c600081815260016020526040902054909250151590506113645760405162461bcd60e51b815260206004820152604660248201527f5374616b6552656769737472792e676574546f74616c5374616b65496e64696360448201527f65734174426c6f636b4e756d6265723a2071756f72756d20646f6573206e6f7460648201526508195e1a5cdd60d21b608482015260a401610611565b60ff81166000908152600160205260408120805463ffffffff8a16929061138d5761138d6134ea565b60009182526020909120015463ffffffff1611156114395760405162461bcd60e51b815260206004820152605b60248201527f5374616b6552656769737472792e676574546f74616c5374616b65496e64696360448201527f65734174426c6f636b4e756d6265723a2071756f72756d20686173206e6f207360648201527f74616b6520686973746f727920617420626c6f636b4e756d6265720000000000608482015260a401610611565b60ff8116600090815260016020526040812054905b818110156115075760ff8316600090815260016020819052604090912063ffffffff8b169161147d84866135be565b61148791906135be565b81548110611497576114976134ea565b60009182526020909120015463ffffffff16116114f55760016114ba82846135be565b6114c491906135be565b8585815181106114d6576114d66134ea565b602002602001019063ffffffff16908163ffffffff1681525050611507565b806114ff81613531565b91505061144e565b505050808061151590613531565b9150506112a9565b5090505b9392505050565b6004602052816000526040600020818154811061154457600080fd5b6000918252602090912001546001600160a01b03169150829050565b60408051606081018252600080825260208083018290528284018290528582526002815283822060ff881683529052919091208054839081106115a5576115a56134ea565b600091825260209182902060408051606081018252929091015463ffffffff8082168452600160201b82041693830193909352600160401b9092046001600160601b031691810191909152949350505050565b604080518082019091526000808252602082015260ff83166000908152600360205260409020805483908110611630576116306134ea565b6000918252602091829020604080518082019091529101546001600160a01b0381168252600160a01b90046001600160601b0316918101919091529392505050565b604080516060810182526000808252602080830182905282840182905260ff8616825260019052919091208054839081106116af576116af6134ea565b600091825260209182902060408051606081018252929091015463ffffffff8082168452600160201b82041693830193909352600160401b9092046001600160601b0316918101919091529392505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561175f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117839190613451565b6001600160a01b0316336001600160a01b0316146117b35760405162461bcd60e51b81526004016106119061346e565b816117cf8160ff16600090815260016020526040902054151590565b6117eb5760405162461bcd60e51b815260040161061190613400565b6117f5838361243f565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118425760405162461bcd60e51b81526004016106119061354c565b60005b81811015611921576000838383818110611861576118616134ea565b919091013560f81c600081815260016020526040902054909250151590506118f15760405162461bcd60e51b815260206004820152603760248201527f5374616b6552656769737472792e646572656769737465724f70657261746f7260448201527f3a2071756f72756d20646f6573206e6f742065786973740000000000000000006064820152608401610611565b60006118ff86836000612045565b905061190b82826122c5565b505050808061191990613531565b915050611845565b50505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611985573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a99190613451565b6001600160a01b0316336001600160a01b0316146119d95760405162461bcd60e51b81526004016106119061346e565b816119f58160ff16600090815260016020526040902054151590565b611a115760405162461bcd60e51b815260040161061190613400565b6117f583836124a8565b60ff83166000908152600160205260408120805482919084908110611a4257611a426134ea565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b90930492909216908201529050610cd881856128eb565b60ff81166000908152600160208190526040822080549091611aba916135be565b81548110611aca57611aca6134ea565b600091825260209091200154600160401b90046001600160601b031692915050565b6000611af9848484612a65565b949350505050565b600082815260026020908152604080832060ff881684529091528120805482919084908110611b3257611b326134ea565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b90930492909216908201529050611b8981866128eb565b6040015195945050505050565b6040805160608082018352600080835260208084018290528385018290528682526002815284822060ff87168352815284822054855193840186528284529083018290529382015290919081611bef579150610cc59050565b600085815260026020908152604080832060ff881684529091529020611c166001846135be565b81548110611c2657611c266134ea565b600091825260209182902060408051606081018252919092015463ffffffff8082168352600160201b820416938201939093526001600160601b03600160401b90930492909216908201529250610cc5915050565b600083815260026020908152604080832060ff861684529091528120611ca2858585612a65565b63ffffffff1681548110611cb857611cb86134ea565b600091825260209091200154600160401b90046001600160601b0316949350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d245760405162461bcd60e51b81526004016106119061354c565b60ff831660009081526001602052604090205415611da25760405162461bcd60e51b815260206004820152603560248201527f5374616b6552656769737472792e696e697469616c697a6551756f72756d3a2060448201527471756f72756d20616c72656164792065786973747360581b6064820152608401610611565b611dac83826124a8565b611db6838361243f565b505060ff166000908152600160208181526040808420815160608101835263ffffffff438116825281850187815293820187815283549687018455928752939095209451949093018054915193516001600160601b0316600160401b02600160401b600160a01b0319948416600160201b0267ffffffffffffffff1990931695909316949094171791909116179055565b600080600080611e668660ff1660009081526003602052604090205490565b604080518082019091526000808252602082015290915060ff871660009081526004602081905260408083209051639004134760e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692639004134792611edb928c92016135eb565b600060405180830381865afa158015611ef8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f20919081019061364a565b905060005b838110156120115760ff89166000908152600360205260409020805482908110611f5157611f516134ea565b60009182526020808320604080518082019091529201546001600160a01b0381168352600160a01b90046001600160601b0316908201528351909450839083908110611f9f57611f9f6134ea565b60200260200101511115611fff57670de0b6b3a764000083602001516001600160601b0316838381518110611fd657611fd66134ea565b6020026020010151611fe891906136da565b611ff291906136f9565b611ffc908661371b565b94505b8061200981613531565b915050611f25565b50505060ff8616600090815260208190526040902054919350506001600160601b03908116908316101590505b9250929050565b600083815260026020908152604080832060ff8616845290915281205481908061210957600086815260026020908152604080832060ff891684528252808320815160608101835263ffffffff43811682528185018681526001600160601b03808c16958401958652845460018101865594885295909620915191909201805495519351909416600160401b02600160401b600160a01b0319938316600160201b0267ffffffffffffffff199096169190921617939093171691909117905561226b565b600086815260026020908152604080832060ff8916845290915281206121306001846135be565b81548110612140576121406134ea565b600091825260209091200180546001600160601b03600160401b9091048116945090915085168314156121795760009350505050611521565b80544363ffffffff908116911614156121b3578054600160401b600160a01b031916600160401b6001600160601b03871602178155612269565b805467ffffffff000000001916600160201b4363ffffffff90811682810293909317845560008a815260026020908152604080832060ff8d168452825280832081516060810183529687528683018481526001600160601b038d81169389019384528254600181018455928652939094209651960180549351915196851667ffffffffffffffff1990941693909317931690930291909117600160401b600160a01b031916600160401b93909216929092021790555b505b6040805160ff871681526001600160601b038616602082015287917f2f527d527e95d8fe40aec55377743bb779087da3f6d0d08f12e36444da62327d910160405180910390a26122bb8285612bcb565b9695505050505050565b60ff8216600090815260016020819052604082208054918391906122e990846135be565b815481106122f9576122f96134ea565b90600052602060002001905083600014156123285754600160401b90046001600160601b03169150610cc59050565b805460009061234790600160401b90046001600160601b031686612be3565b82549091504363ffffffff90811691161415612384578154600160401b600160a01b031916600160401b6001600160601b03831602178255612436565b815463ffffffff438116600160201b81810267ffffffff000000001990941693909317855560ff8916600090815260016020818152604080842081516060810183529586528583018581526001600160601b03808b169388019384528254958601835591865292909420945194909201805491519251909316600160401b02600160401b600160a01b031992861690960267ffffffffffffffff19909116939094169290921792909217169190911790555b95945050505050565b60ff82166000818152602081815260409182902080546bffffffffffffffffffffffff19166001600160601b03861690811790915591519182527f26eecff2b70b0a71104ff4d940ba7162d23a95c248771fc487a7be17a596b3cf910160405180910390a25050565b600081511161250d5760405162461bcd60e51b815260206004820152603860248201526000805160206137fa83398151915260448201527f3a206e6f20737472617465676965732070726f766964656400000000000000006064820152608401610611565b805160ff8316600090815260036020908152604090912054906125308383613746565b11156125a05760405162461bcd60e51b815260206004820152604560248201526000805160206137fa83398151915260448201527f3a20657863656564204d41585f5745494748494e475f46554e4354494f4e5f4c60648201526408a9c8ea8960db1b608482015260a401610611565b60005b828110156128e45760005b6125b88284613746565b811015612699578482815181106125d1576125d16134ea565b6020026020010151600001516001600160a01b0316600360008860ff1660ff1681526020019081526020016000208281548110612610576126106134ea565b6000918252602090912001546001600160a01b031614156126875760405162461bcd60e51b815260206004820152603d60248201526000805160206137fa83398151915260448201527f3a2063616e6e6f74206164642073616d652073747261746567792032780000006064820152608401610611565b8061269181613531565b9150506125ae565b5060008482815181106126ae576126ae6134ea565b6020026020010151602001516001600160601b0316116127335760405162461bcd60e51b815260206004820152604660248201526000805160206137fa83398151915260448201527f3a2063616e6e6f74206164642073747261746567792077697468207a65726f206064820152651dd95a59da1d60d21b608482015260a401610611565b60ff851660009081526003602052604090208451859083908110612759576127596134ea565b602090810291909101810151825460018101845560009384528284208251928401516001600160601b0316600160a01b026001600160a01b039093169290921791015560ff87168252600490526040902084518590839081106127be576127be6134ea565b6020908102919091018101515182546001810184556000938452919092200180546001600160a01b0319166001600160a01b03909216919091179055835160ff8616907f10565e56cacbf32eca267945f054fec02e59750032d113d3302182ad967f540490869084908110612835576128356134ea565b602090810291909101810151516040516001600160a01b0390911681520160405180910390a28460ff167f11a5641322da1dff56a4b66eaac31ffa465295ece907cd163437793b4d009a75858381518110612892576128926134ea565b6020026020010151600001518684815181106128b0576128b06134ea565b6020026020010151602001516040516128ca929190612c6c565b60405180910390a2806128dc81613531565b9150506125a3565b5050505050565b816000015163ffffffff168163ffffffff1610156129905760405162461bcd60e51b815260206004820152605660248201527f5374616b6552656769737472792e5f76616c69646174655374616b655570646160448201527f74654174426c6f636b4e756d6265723a207374616b6555706461746520697320606482015275333937b69030b33a32b910313637b1b5a73ab6b132b960511b608482015260a401610611565b602082015163ffffffff1615806129b65750816020015163ffffffff168163ffffffff16105b612a615760405162461bcd60e51b815260206004820152606a60248201527f5374616b6552656769737472792e5f76616c69646174655374616b655570646160448201527f74654174426c6f636b4e756d6265723a2074686572652069732061206e65776560648201527f72207374616b6555706461746520617661696c61626c65206265666f726520626084820152693637b1b5a73ab6b132b960b11b60a482015260c401610611565b5050565b600083815260026020908152604080832060ff86168452909152812054805b8015612b0657600086815260026020908152604080832060ff89168452909152902063ffffffff851690612ab96001846135be565b81548110612ac957612ac96134ea565b60009182526020909120015463ffffffff1611612af457612aeb6001826135be565b92505050611521565b80612afe8161375e565b915050612a84565b5060405162461bcd60e51b815260206004820152608160248201527f5374616b6552656769737472792e5f6765745374616b65557064617465496e6460448201527f6578466f724f70657261746f724174426c6f636b4e756d6265723a206e6f207360648201527f74616b652075706461746520666f756e6420666f72206f70657261746f72496460848201527f20616e642071756f72756d4e756d62657220617420626c6f636b206e756d626560a4820152603960f91b60c482015260e401610611565b60006115216001600160601b03808516908416613775565b600080821215612c0757612bf6826137b4565b612c0090846137d1565b9050610cc5565b612c00828461371b565b803560ff81168114612c2257600080fd5b919050565b600060208284031215612c3957600080fd5b61152182612c11565b60008060408385031215612c5557600080fd5b612c5e83612c11565b946020939093013593505050565b6001600160a01b039290921682526001600160601b0316602082015260400190565b6001600160a01b0381168114612ca357600080fd5b50565b60008060408385031215612cb957600080fd5b612cc283612c11565b91506020830135612cd281612c8e565b809150509250929050565b60008083601f840112612cef57600080fd5b5081356001600160401b03811115612d0657600080fd5b6020830191508360208260051b850101111561203e57600080fd5b600080600080600060608688031215612d3957600080fd5b612d4286612c11565b945060208601356001600160401b0380821115612d5e57600080fd5b612d6a89838a01612cdd565b90965094506040880135915080821115612d8357600080fd5b50612d9088828901612cdd565b969995985093965092949392505050565b60008083601f840112612db357600080fd5b5081356001600160401b03811115612dca57600080fd5b60208301915083602082850101111561203e57600080fd5b60008060008060608587031215612df857600080fd5b8435612e0381612c8e565b93506020850135925060408501356001600160401b03811115612e2557600080fd5b612e3187828801612da1565b95989497509550505050565b600081518084526020808501945080840160005b83811015612e765781516001600160601b031687529582019590820190600101612e51565b509495945050505050565b604081526000612e946040830185612e3d565b82810360208401526124368185612e3d565b60008060408385031215612eb957600080fd5b82359150612ec960208401612c11565b90509250929050565b6020808252825182820181905260009190848201906040850190845b81811015612f3e57612f2b83855163ffffffff808251168352806020830151166020840152506001600160601b0360408201511660408301525050565b9284019260609290920191600101612eee565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715612f8257612f82612f4a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612fb057612fb0612f4a565b604052919050565b60006001600160401b03821115612fd157612fd1612f4a565b5060051b60200190565b60008060408385031215612fee57600080fd5b612ff783612c11565b91506020808401356001600160401b0381111561301357600080fd5b8401601f8101861361302457600080fd5b803561303761303282612fb8565b612f88565b81815260059190911b8201830190838101908883111561305657600080fd5b928401925b828410156130745783358252928401929084019061305b565b80955050505050509250929050565b803563ffffffff81168114612c2257600080fd5b6000806000604084860312156130ac57600080fd5b6130b584613083565b925060208401356001600160401b038111156130d057600080fd5b6130dc86828701612da1565b9497909650939450505050565b6020808252825182820181905260009190848201906040850190845b81811015612f3e57835163ffffffff1683529284019291840191600101613105565b60008060006060848603121561313c57600080fd5b61314584612c11565b95602085013595506040909401359392505050565b815163ffffffff9081168252602080840151909116908201526040808301516001600160601b03169082015260608101610cc5565b80356001600160601b0381168114612c2257600080fd5b600080604083850312156131b957600080fd5b6131c283612c11565b9150612ec96020840161318f565b6000806000604084860312156131e557600080fd5b8335925060208401356001600160401b038111156130d057600080fd5b600082601f83011261321357600080fd5b8135602061322361303283612fb8565b82815260069290921b8401810191818101908684111561324257600080fd5b8286015b84811015613291576040818903121561325f5760008081fd5b613267612f60565b813561327281612c8e565b815261327f82860161318f565b81860152835291830191604001613246565b509695505050505050565b600080604083850312156132af57600080fd5b6132b883612c11565b915060208301356001600160401b038111156132d357600080fd5b6132df85828601613202565b9150509250929050565b6000806000606084860312156132fe57600080fd5b61330784612c11565b925061331560208501613083565b9150604084013590509250925092565b60008060006060848603121561333a57600080fd5b8335925061334a60208501612c11565b915061335860408501613083565b90509250925092565b6000806000806080858703121561337757600080fd5b61338085612c11565b935061338e60208601613083565b93969395505050506040820135916060013590565b6000806000606084860312156133b857600080fd5b6133c184612c11565b92506133cf6020850161318f565b915060408401356001600160401b038111156133ea57600080fd5b6133f686828701613202565b9150509250925092565b60208082526031908201527f5374616b6552656769737472792e71756f72756d4578697374733a2071756f726040820152701d5b48191bd95cc81b9bdd08195e1a5cdd607a1b606082015260800190565b60006020828403121561346357600080fd5b815161152181612c8e565b60208082526056908201527f5374616b6552656769737472792e6f6e6c79436f6f7264696e61746f724f776e60408201527f65723a2063616c6c6572206973206e6f7420746865206f776e6572206f6620746060820152753432903932b3b4b9ba393ca1b7b7b93234b730ba37b960511b608082015260a00190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561351257600080fd5b6115218261318f565b634e487b7160e01b600052601160045260246000fd5b60006000198214156135455761354561351b565b5060010190565b6020808252604c908201527f5374616b6552656769737472792e6f6e6c795265676973747279436f6f72646960408201527f6e61746f723a2063616c6c6572206973206e6f7420746865205265676973747260608201526b3ca1b7b7b93234b730ba37b960a11b608082015260a00190565b6000828210156135d0576135d061351b565b500390565b634e487b7160e01b600052603160045260246000fd5b60006040820160018060a01b03808616845260206040818601528286548085526060870191508760005282600020945060005b8181101561363c57855485168352600195860195928401920161361e565b509098975050505050505050565b6000602080838503121561365d57600080fd5b82516001600160401b0381111561367357600080fd5b8301601f8101851361368457600080fd5b805161369261303282612fb8565b81815260059190911b820183019083810190878311156136b157600080fd5b928401925b828410156136cf578351825292840192908401906136b6565b979650505050505050565b60008160001904831182151516156136f4576136f461351b565b500290565b60008261371657634e487b7160e01b600052601260045260246000fd5b500490565b60006001600160601b0380831681851680830382111561373d5761373d61351b565b01949350505050565b600082198211156137595761375961351b565b500190565b60008161376d5761376d61351b565b506000190190565b60008083128015600160ff1b8501841216156137935761379361351b565b6001600160ff1b03840183138116156137ae576137ae61351b565b50500390565b6000600160ff1b8214156137ca576137ca61351b565b5060000390565b60006001600160601b03838116908316818110156137f1576137f161351b565b03939250505056fe5374616b6552656769737472792e5f6164645374726174656779506172616d73a264697066735822122013e43aa0d17be9068c90a8cc3e1e30a67f8fb3af90dd77b77812e62b135f0e1364736f6c634300080c0033","sourceMap":"960:31820:123:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29348:151;;;;;;:::i;:::-;29453:32;;29427:7;29453:32;;;:18;:32;;;;;:39;;29348:151;;;;508:25:184;;;496:2;481:18;29348:151:123;;;;;;;;2016:56:124;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;23351:268:123:-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1747:39:184;;;1729:58;;1717:2;1702:18;23351:268:123;1585:208:184;12019:891:123;;;;;;:::i;:::-;;:::i;:::-;;2913:1550;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;24963:203::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23723:139::-;;;;;;:::i;:::-;23820:28;;23794:7;23820:28;;;:14;:28;;;;;:35;;23723:139;24521:202;;;;;;:::i;:::-;24637:7;24663:32;;;:20;:32;;;;;;;;:46;;;;;;;;;;;;:53;;24521:202;25384:242;;;;;;:::i;:::-;;:::i;748:48:124:-;;792:4;748:48;;10540:1151:123;;;;;;:::i;:::-;;:::i;6652:1876::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8184:32:184;;;8166:51;;8154:2;8139:18;6652:1876:123;8020:203:184;1270:44:124;;;;;;;;-1:-1:-1;;;;;8392:32:184;;;8374:51;;8362:2;8347:18;1270:44:124;8228:203:184;884:55:124;;937:2;884:55;;;;;8608:4:184;8596:17;;;8578:36;;8566:2;8551:18;884:55:124;8436:184:184;31695:1083:123;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2078:56:124:-;;;;;;:::i;:::-;;:::i;26832:236:123:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23984:196::-;;;;;;:::i;:::-;;:::i;:::-;;;;10979:13:184;;-1:-1:-1;;;;;10975:39:184;10957:58;;11075:4;11063:17;;;11057:24;-1:-1:-1;;;;;11053:57:184;11031:20;;;11024:87;;;;10930:18;23984:196:123;10745:372:184;30217:199:123;;;;;;:::i;:::-;;:::i;9210:231::-;;;;;;:::i;:::-;;:::i;5234:982::-;;;;;;:::i;:::-;;:::i;1490:53:124:-;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;1490:53:124;;;9970:236:123;;;;;;:::i;:::-;;:::i;30953:368::-;;;;;;:::i;:::-;;:::i;29706:188::-;;;;;;:::i;:::-;;:::i;27662:270::-;;;;;;:::i;:::-;;:::i;:::-;;;14385:10:184;14373:23;;;14355:42;;14343:2;14328:18;27662:270:123;14211:192:184;1138:46:124;;;;;28599:413:123;;;;;;:::i;:::-;;:::i;25877:517::-;;;;;;:::i;:::-;;:::i;27183:355::-;;;;;;:::i;:::-;;:::i;8608:596::-;;;;;;:::i;:::-;;:::i;2016:56:124:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2016:56:124;;;-1:-1:-1;;;;2016:56:124;;-1:-1:-1;;;;;2016:56:124;;-1:-1:-1;2016:56:124;:::o;23351:268:123:-;22902:32;;;23503:6;22902:32;;;:18;:32;;;;;:39;23480:12;;1562:89;;;;-1:-1:-1;;;1562:89:123;;;;;;;:::i;:::-;;;;;;;;;23522:12:::1;23540:50;23567:12;23581:8;23540:26;:50::i;:::-;-1:-1:-1::0;23521:69:123;23351:268;-1:-1:-1;;;;;23351:268:123:o;12019:891::-;1367:19;-1:-1:-1;;;;;1346:47:123;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1332:63:123;:10;-1:-1:-1;;;;;1332:63:123;;1324:162;;;;-1:-1:-1;;;1324:162:123;;;;;;;:::i;:::-;12218:12:::1;1570:27;1584:12;22902:32:::0;;22879:4;22902:32;;;:18;:32;;;;;:39;:44;;;22813:140;1570:27:::1;1562:89;;;;-1:-1:-1::0;;;1562:89:123::1;;;;;;;:::i;:::-;12262:15:::0;12302:13;12294:90:::2;;;::::0;;-1:-1:-1;;;12294:90:123;;16952:2:184;12294:90:123::2;::::0;::::2;16934:21:184::0;16971:18;;;16964:30;;;;17030:34;17010:18;;;17003:62;17101:34;17081:18;;;17074:62;17153:19;;12294:90:123::2;16750:428:184::0;12294:90:123::2;12402:34:::0;;::::2;12394:104;;;::::0;-1:-1:-1;;;12394:104:123;;17385:2:184;12394:104:123::2;::::0;::::2;17367:21:184::0;17424:2;17404:18;;;17397:30;17463:34;17443:18;;;17436:62;17534:27;17514:18;;;17507:55;17579:19;;12394:104:123::2;17183:421:184::0;12394:104:123::2;12552:28;::::0;::::2;12509:40;12552:28:::0;;;:14:::2;:28;::::0;;;;;12591:313:::2;12615:9;12611:1;:13;12591:313;;;12753:14;;12768:1;12753:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;12704:15;12720;;12736:1;12720:18;;;;;;;:::i;:::-;;;;;;;12704:35;;;;;;;;:::i;:::-;;;;;;;;:46;;;:66;;;;;-1:-1:-1::0;;;;;12704:66:123::2;;;;;-1:-1:-1::0;;;;;12704:66:123::2;;;;;;12815:12;12789:104;;;12829:15;12845;;12861:1;12845:18;;;;;;;:::i;:::-;;;;;;;12829:35;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;:44:::0;-1:-1:-1;;;;;12829:44:123::2;12875:14:::0;;12890:1;12875:17;;::::2;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;12789:104;;;;;;;:::i;:::-;;;;;;;;12626:3:::0;::::2;::::0;::::2;:::i;:::-;;;;12591:313;;;;12232:678;;1496:1:::1;12019:891:::0;;;;;:::o;2913:1550::-;3085:15;;1114:10;-1:-1:-1;;;;;1136:19:123;1114:42;;1093:165;;;;-1:-1:-1;;;1093:165:123;;;;;;;:::i;:::-;3130:29:::1;3175:13:::0;-1:-1:-1;;;;;3162:34:123;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;3162:34:123::1;-1:-1:-1::0;3130:66:123;-1:-1:-1;3206:27:123::1;3249:13:::0;-1:-1:-1;;;;;3236:34:123;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;3236:34:123::1;;3206:64;;3285:9;3280:1131;3300:24:::0;;::::1;3280:1131;;;3370:18;3397:13;;3411:1;3397:16;;;;;;;:::i;:::-;::::0;;;::::1;;;;22879:4:::0;22902:32;;;:18;:32;;;;;:39;3397:16;;-1:-1:-1;22902:44:123;;;-1:-1:-1;3428:93:123::1;;;::::0;-1:-1:-1;;;3428:93:123;;19218:2:184;3428:93:123::1;::::0;::::1;19200:21:184::0;19257:2;19237:18;;;19230:30;19296:34;19276:18;;;19269:62;-1:-1:-1;;;19347:18:184;;;19340:51;19408:19;;3428:93:123::1;19016:417:184::0;3428:93:123::1;3674:19;3695:20:::0;3719:50:::1;3746:12;3760:8;3719:26;:50::i;:::-;3673:96;;;;3808:15;3783:165;;;::::0;-1:-1:-1;;;3783:165:123;;19640:2:184;3783:165:123::1;::::0;::::1;19622:21:184::0;19679:2;19659:18;;;19652:30;19718:34;19698:18;;;19691:62;19789:34;19769:18;;;19762:62;19861:29;19840:19;;;19833:58;19908:19;;3783:165:123::1;19438:495:184::0;3783:165:123::1;4006:17;4026:167;4083:10;4126:12;4166;4026:26;:167::i;:::-;4006:187;;4308:12;4289:13;4303:1;4289:16;;;;;;;;:::i;:::-;;;;;;:31;-1:-1:-1::0;;;;;4289:31:123::1;;;-1:-1:-1::0;;;;;4289:31:123::1;;;::::0;::::1;4351:49;4375:12;4389:10;4351:23;:49::i;:::-;4334:11;4346:1;4334:14;;;;;;;;:::i;:::-;;;;;;:66;-1:-1:-1::0;;;;;4334:66:123::1;;;-1:-1:-1::0;;;;;4334:66:123::1;;;::::0;::::1;3331:1080;;;;3326:3;;;;;:::i;:::-;;;;3280:1131;;;-1:-1:-1::0;4429:13:123;;;;-1:-1:-1;2913:1550:123;-1:-1:-1;;;;;2913:1550:123:o;24963:203::-;25113:32;;;;:20;:32;;;;;;;;:46;;;;;;;;;;25106:53;;;;;;;;;;;;;;;;;25074:20;;25106:53;;25113:46;;25106:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25106:53:123;;;;;;;-1:-1:-1;;;25106:53:123;;-1:-1:-1;;;;;25106:53:123;;;;;;;;;;;;;;;;;;;;;;24963:203;;;;;:::o;25384:242::-;25472:6;25490:38;25531:46;25552:10;25564:12;25531:20;:46::i;:::-;25594:25;;;;25384:242;-1:-1:-1;;;;25384:242:123:o;10540:1151::-;1367:19;-1:-1:-1;;;;;1346:47:123;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1332:63:123;:10;-1:-1:-1;;;;;1332:63:123;;1324:162;;;;-1:-1:-1;;;1324:162:123;;;;;;;:::i;:::-;10691:12:::1;1570:27;1584:12;22902:32:::0;;22879:4;22902:32;;;:18;:32;;;;;:39;:44;;;22813:140;1570:27:::1;1562:89;;;;-1:-1:-1::0;;;1562:89:123::1;;;;;;;:::i;:::-;10740:22:::0;;10780:18;10772:92:::2;;;::::0;-1:-1:-1;;;10772:92:123;;20140:2:184;10772:92:123::2;::::0;::::2;20122:21:184::0;20179:2;20159:18;;;20152:30;20218:34;20198:18;;;20191:62;20289:31;20269:18;;;20262:59;20338:19;;10772:92:123::2;19938:425:184::0;10772:92:123::2;10918:28;::::0;::::2;10875:40;10918:28:::0;;;:14:::2;:28;::::0;;;;;;;10999:19:::2;:33:::0;;;;;10918:28;;11043:642:::2;11067:14;11063:1;:18;11043:642;;;11133:12;11107:85;;;11147:15;11163;11179:1;11163:18;;;;;;;;:::i;:::-;;;;;;;11147:35;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;::::2;:44:::0;11107:85:::2;::::0;-1:-1:-1;;;;;11147:44:123;;::::2;8374:51:184::0;;8347:18;11107:85:123::2;;;;;;;11237:12;11211:88;;;11251:15;11267;11283:1;11267:18;;;;;;;;:::i;:::-;;;;;;;11251:35;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;;;::::2;:44:::0;11211:88:::2;::::0;;-1:-1:-1;;;;;11251:44:123;;::::2;20568:51:184::0;;20635:18;;;20628:34;;;;20541:18;11211:88:123::2;;;;;;;11462:22:::0;;11446:15;;11462:26:::2;::::0;11487:1:::2;::::0;11462:26:::2;:::i;:::-;11446:43;;;;;;;;:::i;:::-;;;;;;;;11408:15;11424;11440:1;11424:18;;;;;;;;:::i;:::-;;;;;;;11408:35;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:81;;:35;::::2;:81:::0;;-1:-1:-1;;;;;;11408:81:123::2;-1:-1:-1::0;;;;;11408:81:123;;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;;;;;;;;11408:81:123;;;::::2;;;;::::0;;11503:21;;:15;;:21;::::2;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;-1:-1:-1;;11503:21:123;;;;;;;;;;11602:27;;11581:20;;11602:31:::2;::::0;11503:21:::2;::::0;11602:31:::2;:::i;:::-;11581:53;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;11581:53:123::2;11538:20;11559:15;11575:1;11559:18;;;;;;;;:::i;:::-;;;;;;;11538:40;;;;;;;;:::i;:::-;;;;;;;;;:96;;;;;-1:-1:-1::0;;;;;11538:96:123::2;;;;;-1:-1:-1::0;;;;;11538:96:123::2;;;;;;11648:20;:26;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;-1:-1:-1;;11648:26:123;;;;;-1:-1:-1;;;;;;11648:26:123::2;::::0;;;;;11083:3;::::2;::::0;::::2;:::i;:::-;;;;11043:642;;;;10705:986;;;1496:1:::1;10540:1151:::0;;:::o;6652:1876::-;6823:7;1114:10;-1:-1:-1;;;;;1136:19:123;1114:42;;1093:165;;;;-1:-1:-1;;;1093:165:123;;;;;;;:::i;:::-;6842:23:::1;::::0;7246:1243:::1;7266:24:::0;;::::1;7246:1243;;;7311:18;7338:13;;7352:1;7338:16;;;;;;;:::i;:::-;::::0;;;::::1;;;;22879:4:::0;22902:32;;;:18;:32;;;;;:39;7338:16;;-1:-1:-1;22902:44:123;;;-1:-1:-1;7369:96:123::1;;;::::0;-1:-1:-1;;;7369:96:123;;21137:2:184;7369:96:123::1;::::0;::::1;21119:21:184::0;21176:2;21156:18;;;21149:30;21215:34;21195:18;;;21188:62;21286:26;21266:18;;;21259:54;21330:19;;7369:96:123::1;20935:420:184::0;7369:96:123::1;7645:18;7665:20:::0;7689:50:::1;7716:12;7730:8;7689:26;:50::i;:::-;7644:95;;;;7875:15;7870:151;;7924:1;::::0;-1:-1:-1;7805:1:136;:8;;;;-1:-1:-1;;;;;7969:22:123;::::1;7795:19:136::0;7943:63:123::1;;7870:151;8170:17;8190:165;8247:10;8289:12;8329:11;8190:26;:165::i;:::-;8170:185;;8429:49;8453:12;8467:10;8429:23;:49::i;:::-;;7297:1192;;;;7292:3;;;;;:::i;:::-;;;;7246:1243;;31695:1083:::0;31833:15;31860:23;31899:13;-1:-1:-1;;;;;31886:34:123;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31886:34:123;;31860:60;;31935:9;31930:818;31950:24;;;31930:818;;;31995:18;32022:13;;32036:1;32022:16;;;;;;;:::i;:::-;;;;;;;;22879:4;22902:32;;;:18;:32;;;;;:39;32022:16;;-1:-1:-1;22902:44:123;;;-1:-1:-1;32053:110:123;;;;-1:-1:-1;;;32053:110:123;;21562:2:184;32053:110:123;;;21544:21:184;21601:2;21581:18;;;21574:30;21640:34;21620:18;;;21613:62;21711:34;21691:18;;;21684:62;-1:-1:-1;;;21762:19:184;;;21755:37;21809:19;;32053:110:123;21360:474:184;32053:110:123;32202:32;;;;;;;:18;:32;;;;;:35;;:68;;;;:32;:35;;;;:::i;:::-;;;;;;;;;;:53;;;:68;;32177:218;;;;-1:-1:-1;;;32177:218:123;;22041:2:184;32177:218:123;;;22023:21:184;22080:2;22060:18;;;22053:30;22119:34;22099:18;;;22092:62;22190:34;22170:18;;;22163:62;22262:29;22241:19;;;22234:58;22309:19;;32177:218:123;21839:495:184;32177:218:123;32426:32;;;32409:14;32426:32;;;:18;:32;;;;;:39;;32479:259;32503:6;32499:1;:10;32479:259;;;32538:32;;;;;;;:18;:32;;;;;;;;:81;;;;32571:10;32580:1;32571:6;:10;:::i;:::-;:14;;;;:::i;:::-;32538:48;;;;;;;;:::i;:::-;;;;;;;;;;:66;;;:81;32534:190;;32676:1;32663:10;32672:1;32663:6;:10;:::i;:::-;:14;;;;:::i;:::-;32643:7;32651:1;32643:10;;;;;;;;:::i;:::-;;;;;;:35;;;;;;;;;;;32700:5;;32534:190;32511:3;;;;:::i;:::-;;;;32479:259;;;;31981:767;;31976:3;;;;;:::i;:::-;;;;31930:818;;;-1:-1:-1;32764:7:123;-1:-1:-1;31695:1083:123;;;;;;:::o;2078:56:124:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2078:56:124;;-1:-1:-1;2078:56:124;;-1:-1:-1;2078:56:124:o;26832:236:123:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;27008:32:123;;;:20;:32;;;;;:46;;;;;;;;;;;:53;;27055:5;;27008:53;;;;;;:::i;:::-;;;;;;;;;;27001:60;;;;;;;;27008:53;;;;27001:60;;;;;;;-1:-1:-1;;;27001:60:123;;;;;;;;;;-1:-1:-1;;;27001:60:123;;;-1:-1:-1;;;;;27001:60:123;;;;;;;;;26832:236;-1:-1:-1;;;;26832:236:123:o;23984:196::-;-1:-1:-1;;;;;;;;;;;;;;;;;24138:28:123;;;;;;;:14;:28;;;;;:35;;24167:5;;24138:35;;;;;;:::i;:::-;;;;;;;;;;24131:42;;;;;;;;;24138:35;;24131:42;-1:-1:-1;;;;;24131:42:123;;;;-1:-1:-1;;;24131:42:123;;-1:-1:-1;;;;;24131:42:123;;;;;;;;;23984:196;-1:-1:-1;;;23984:196:123:o;30217:199::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;30370:32:123;;;;;:18;:32;;;;;;:39;;30403:5;;30370:39;;;;;;:::i;:::-;;;;;;;;;;30363:46;;;;;;;;30370:39;;;;30363:46;;;;;;;-1:-1:-1;;;30363:46:123;;;;;;;;;;-1:-1:-1;;;30363:46:123;;;-1:-1:-1;;;;;30363:46:123;;;;;;;;;30217:199;-1:-1:-1;;;30217:199:123:o;9210:231::-;1367:19;-1:-1:-1;;;;;1346:47:123;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1332:63:123;:10;-1:-1:-1;;;;;1332:63:123;;1324:162;;;;-1:-1:-1;;;1324:162:123;;;;;;;:::i;:::-;9357:12:::1;1570:27;1584:12;22902:32:::0;;22879:4;22902:32;;;:18;:32;;;;;:39;:44;;;22813:140;1570:27:::1;1562:89;;;;-1:-1:-1::0;;;1562:89:123::1;;;;;;;:::i;:::-;9381:53:::2;9407:12;9421;9381:25;:53::i;:::-;1496:1:::1;9210:231:::0;;:::o;5234:982::-;1114:10;-1:-1:-1;;;;;1136:19:123;1114:42;;1093:165;;;;-1:-1:-1;;;1093:165:123;;;;;;;:::i;:::-;5557:9:::1;5552:658;5572:24:::0;;::::1;5552:658;;;5617:18;5644:13;;5658:1;5644:16;;;;;;;:::i;:::-;::::0;;;::::1;;;;22879:4:::0;22902:32;;;:18;:32;;;;;:39;5644:16;;-1:-1:-1;22902:44:123;;;-1:-1:-1;5675:95:123::1;;;::::0;-1:-1:-1;;;5675:95:123;;22541:2:184;5675:95:123::1;::::0;::::1;22523:21:184::0;22580:2;22560:18;;;22553:30;22619:34;22599:18;;;22592:62;22690:25;22670:18;;;22663:53;22733:19;;5675:95:123::1;22339:419:184::0;5675:95:123::1;5875:17;5895:157;5952:10;5995:12;6036:1;5895:26;:157::i;:::-;5875:177;;6150:49;6174:12;6188:10;6150:23;:49::i;:::-;;5603:607;;5598:3;;;;;:::i;:::-;;;;5552:658;;;;5234:982:::0;;;:::o;9970:236::-;1367:19;-1:-1:-1;;;;;1346:47:123;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;1332:63:123;:10;-1:-1:-1;;;;;1332:63:123;;1324:162;;;;-1:-1:-1;;;1324:162:123;;;;;;;:::i;:::-;10126:12:::1;1570:27;1584:12;22902:32:::0;;22879:4;22902:32;;;:18;:32;;;;;:39;:44;;;22813:140;1570:27:::1;1562:89;;;;-1:-1:-1::0;;;1562:89:123::1;;;;;;;:::i;:::-;10150:49:::2;10169:12;10183:15;10150:18;:49::i;30953:368::-:0;31162:32;;;31106:6;31162:32;;;:18;:32;;;;;:39;;31106:6;;31162:32;31195:5;;31162:39;;;;;;:::i;:::-;;;;;;;;;;31124:77;;;;;;;;31162:39;;;;31124:77;;;;;;;-1:-1:-1;;;31124:77:123;;;;;;;;;;-1:-1:-1;;;;;;;;31124:77:123;;;;;;;;;;;;-1:-1:-1;31211:64:123;31124:77;31263:11;31211:33;:64::i;29706:188::-;29804:32;;;29779:6;29804:32;;;:18;:32;;;;;;;29837:39;;29804:32;;29837:43;;;:::i;:::-;29804:77;;;;;;;;:::i;:::-;;;;;;;;;;:83;-1:-1:-1;;;29804:83:123;;-1:-1:-1;;;;;29804:83:123;;;-1:-1:-1;;29706:188:123:o;27662:270::-;27817:6;27842:83;27887:10;27899:12;27913:11;27842:44;:83::i;:::-;27835:90;27662:270;-1:-1:-1;;;;27662:270:123:o;28599:413::-;28774:6;28833:32;;;:20;:32;;;;;;;;:46;;;;;;;;;;:53;;28774:6;;28833:46;28880:5;;28833:53;;;;;;:::i;:::-;;;;;;;;;;28792:94;;;;;;;;28833:53;;;;28792:94;;;;;;;-1:-1:-1;;;28792:94:123;;;;;;;;;;-1:-1:-1;;;;;;;;28792:94:123;;;;;;;;;;;;-1:-1:-1;28896:67:123;28792:94;28951:11;28896:33;:67::i;:::-;28980:25;;;;28599:413;-1:-1:-1;;;;;28599:413:123:o;25877:517::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;26044:32:123;;;:20;:32;;;;;:46;;;;;;;;;;:53;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;26044:53:123;;26155:233;;26200:19;-1:-1:-1;26193:26:123;;-1:-1:-1;26193:26:123;26155:233;26272:32;;;;:20;:32;;;;;;;;:46;;;;;;;;;;26319:17;26335:1;26319:13;:17;:::i;:::-;26272:65;;;;;;;;:::i;:::-;;;;;;;;;;26250:87;;;;;;;;26272:65;;;;26250:87;;;;;;;-1:-1:-1;;;26250:87:123;;;;;;;;;;-1:-1:-1;;;;;;;;26250:87:123;;;;;;;;;;;;-1:-1:-1;26351:26:123;;-1:-1:-1;;26351:26:123;27183:355;27327:6;27364:32;;;:20;:32;;;;;;;;:46;;;;;;;;;;27428:83;27385:10;27397:12;27499:11;27428:44;:83::i;:::-;27364:161;;;;;;;;;;:::i;:::-;;;;;;;;;;:167;-1:-1:-1;;;27364:167:123;;-1:-1:-1;;;;;27364:167:123;;27183:355;-1:-1:-1;;;;27183:355:123:o;8608:596::-;1114:10;-1:-1:-1;;;;;1136:19:123;1114:42;;1093:165;;;;-1:-1:-1;;;1093:165:123;;;;;;;:::i;:::-;22902:32;;;22879:4;22902:32;;;:18;:32;;;;;:39;:44;8795:94:::1;;;::::0;-1:-1:-1;;;8795:94:123;;22965:2:184;8795:94:123::1;::::0;::::1;22947:21:184::0;23004:2;22984:18;;;22977:30;23043:34;23023:18;;;23016:62;-1:-1:-1;;;23094:18:184;;;23087:51;23155:19;;8795:94:123::1;22763:417:184::0;8795:94:123::1;8899:49;8918:12;8932:15;8899:18;:49::i;:::-;8958:53;8984:12;8998;8958:25;:53::i;:::-;-1:-1:-1::0;;9022:32:123::1;;;::::0;;;:18:::1;:32;::::0;;;;;;;9060:136;;::::1;::::0;::::1;::::0;;::::1;9112:12;9060:136:::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;9022:175;;;;::::1;::::0;;;;;;;;;;;;;;::::1;::::0;;;;;;-1:-1:-1;;;;;9022:175:123::1;-1:-1:-1::0;;;9022:175:123::1;-1:-1:-1::0;;;;;;;;9022:175:123;;::::1;-1:-1:-1::0;;;9022:175:123::1;-1:-1:-1::0;;9022:175:123;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;;::::0;;8608:596::o;21690:1051::-;21795:6;21803:4;21819:13;21842:20;21865:34;21886:12;23820:28;;23794:7;23820:28;;;:14;:28;;;;;:35;;23723:139;21865:34;-1:-1:-1;;;;;;;;;;;;;;;;;21842:57:123;;-1:-1:-1;22036:33:123;;;21963:31;22036:33;;;:19;:33;;;;;;;;21997:73;;-1:-1:-1;;;21997:73:123;;-1:-1:-1;;;;;21997:10:123;:28;;;;:73;;22026:8;;21997:73;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21997:73:123;;;;;;;;;;;;:::i;:::-;21963:107;;22085:9;22080:444;22104:12;22100:1;:16;22080:444;;;22234:28;;;;;;;:14;:28;;;;;:31;;22263:1;;22234:31;;;;;;:::i;:::-;;;;;;;;;22210:55;;;;;;;;;22234:31;;22210:55;-1:-1:-1;;;;;22210:55:123;;;;-1:-1:-1;;;22210:55:123;;-1:-1:-1;;;;;22210:55:123;;;;;22368:17;;22210:55;;-1:-1:-1;22368:17:123;;22383:1;;22368:17;;;;;;:::i;:::-;;;;;;;:21;22364:150;;;792:4:124;22446:21:123;:32;;;-1:-1:-1;;;;;22426:52:123;:14;22441:1;22426:17;;;;;;;;:::i;:::-;;;;;;;:52;;;;:::i;:::-;:72;;;;:::i;:::-;22409:90;;;;:::i;:::-;;;22364:150;22118:3;;;;:::i;:::-;;;;22080:444;;;-1:-1:-1;;;22657:35:123;;;22624:20;22657:35;;;;;;;;;;;22647:6;;-1:-1:-1;;;;;;;22657:35:123;;;22647:45;;;;;;-1:-1:-1;21690:1051:123;;;;;;:::o;14377:1857::-;14518:6;14587:32;;;:20;:32;;;;;;;;:46;;;;;;;;;;:53;14518:6;;14655:18;14651:1393;;14750:32;;;;:20;:32;;;;;;;;:46;;;;;;;;;;14802:159;;;;;;;;14858:12;14802:159;;;;;;;;;;-1:-1:-1;;;;;14802:159:123;;;;;;;;;14750:212;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14750:212:123;-1:-1:-1;;;;;;;;14750:212:123;;;-1:-1:-1;;;14750:212:123;-1:-1:-1;;14750:212:123;;;;;;;;;;;;;;;;;;;14651:1393;;;15068:30;15101:32;;;:20;:32;;;;;;;;:46;;;;;;;;;;15148:15;15162:1;15148:13;:15;:::i;:::-;15101:63;;;;;;;;:::i;:::-;;;;;;;;;;15191:16;;-1:-1:-1;;;;;;;;15191:16:123;;;;;;-1:-1:-1;15101:63:123;;-1:-1:-1;15290:21:123;;;;15286:68;;;15338:1;15331:8;;;;;;;15286:68;15580:28;;15619:12;15580:52;;;;:28;;:52;15576:458;;;15652:27;;-1:-1:-1;;;;;;;;15652:27:123;-1:-1:-1;;;;;;;;15652:27:123;;;;;;15576:458;;;15718:55;;-1:-1:-1;;15718:55:123;-1:-1:-1;;;15760:12:123;15718:55;;;;;;;;;;;;;-1:-1:-1;15791:32:123;;;:20;:32;;;;;;;;:46;;;;;;;;;;15843:175;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15843:175:123;;;;;;;;;15791:228;;-1:-1:-1;15791:228:123;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15791:228:123;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;15791:228:123;-1:-1:-1;;;15791:228:123;;;;;;;;;;;15576:458;14979:1065;14651:1393;16104:55;;;25718:4:184;25706:17;;25688:36;;-1:-1:-1;;;;;25760:39:184;;25755:2;25740:18;;25733:67;16124:10:123;;16104:55;;25661:18:184;16104:55:123;;;;;;;16176:51;16200:9;16216:8;16176:15;:51::i;:::-;16169:58;14377:1857;-1:-1:-1;;;;;;14377:1857:123:o;16378:1272::-;16556:32;;;16468:6;16556:32;;;:18;:32;;;;;;;:39;;;16468:6;;16556:32;16676:17;;16556:39;16676:17;:::i;:::-;16643:51;;;;;;;;:::i;:::-;;;;;;;;16605:89;;16756:10;16770:1;16756:15;16752:74;;;16794:21;-1:-1:-1;;;16794:21:123;;-1:-1:-1;;;;;16794:21:123;;-1:-1:-1;16787:28:123;;-1:-1:-1;16787:28:123;16752:74;16959:21;;16929:15;;16947:46;;-1:-1:-1;;;16959:21:123;;-1:-1:-1;;;;;16959:21:123;16982:10;16947:11;:46::i;:::-;17199:33;;16929:64;;-1:-1:-1;17243:12:123;17199:57;;;;:33;;:57;17195:423;;;17272:32;;-1:-1:-1;;;;;;;;17272:32:123;-1:-1:-1;;;;;;;;17272:32:123;;;;;;17195:423;;;17335:60;;;17382:12;17335:60;;-1:-1:-1;;;17335:60:123;;;-1:-1:-1;;17335:60:123;;;;;;;;;17409:32;;;17335:37;17409:32;;;-1:-1:-1;17409:32:123;;;;;;;;17447:159;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17447:159:123;;;;;;;;;17409:198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17409:198:123;-1:-1:-1;;;;;;;;17409:198:123;;;;;;-1:-1:-1;;17409:198:123;;;;;;;;;;;;;;;;;;;;;;17195:423;17635:8;16378:1272;-1:-1:-1;;;;;16378:1272:123:o;13969:223::-;14064:35;;;:21;:35;;;;;;;;;;;;:50;;-1:-1:-1;;14064:50:123;-1:-1:-1;;;;;14064:50:123;;;;;;;;14129:56;;1729:58:184;;;14129:56:123;;1702:18:184;14129:56:123;;;;;;;13969:223;;:::o;18193:1628::-;18356:1;18331:15;:22;:26;18323:95;;;;-1:-1:-1;;;18323:95:123;;26013:2:184;18323:95:123;;;25995:21:184;26052:2;26032:18;;;26025:30;-1:-1:-1;;;;;;;;;;;26071:18:184;;;26064:62;26162:26;26142:18;;;26135:54;26206:19;;18323:95:123;25811:420:184;18323:95:123;18453:22;;18513:28;;;18428:22;18513:28;;;:14;:28;;;;;;;;:35;;18579:34;18453:22;18513:35;18579:34;:::i;:::-;:66;;18558:182;;;;-1:-1:-1;;;18558:182:123;;26571:2:184;18558:182:123;;;26553:21:184;26610:2;26590:18;;;26583:30;-1:-1:-1;;;;;;;;;;;26629:18:184;;;26622:62;26720:34;26700:18;;;26693:62;-1:-1:-1;;;26771:19:184;;;26764:36;26817:19;;18558:182:123;26369:473:184;18558:182:123;18755:9;18750:1065;18774:14;18770:1;:18;18750:1065;;;18933:9;18928:290;18953:21;18973:1;18953:17;:21;:::i;:::-;18948:1;:27;18928:290;;;19073:15;19089:1;19073:18;;;;;;;;:::i;:::-;;;;;;;:27;;;-1:-1:-1;;;;;19029:71:123;:14;:28;19044:12;19029:28;;;;;;;;;;;;;;;19058:1;19029:31;;;;;;;;:::i;:::-;;;;;;;;;;:40;-1:-1:-1;;;;;19029:40:123;:71;;19000:203;;;;-1:-1:-1;;;19000:203:123;;27049:2:184;19000:203:123;;;27031:21:184;27088:2;27068:18;;;27061:30;-1:-1:-1;;;;;;;;;;;27107:18:184;;;27100:62;27198:31;27178:18;;;27171:59;27247:19;;19000:203:123;26847:425:184;19000:203:123;18977:3;;;;:::i;:::-;;;;18928:290;;;;19288:1;19256:15;19272:1;19256:18;;;;;;;;:::i;:::-;;;;;;;:29;;;-1:-1:-1;;;;;19256:33:123;;19231:162;;;;-1:-1:-1;;;19231:162:123;;27479:2:184;19231:162:123;;;27461:21:184;27518:2;27498:18;;;27491:30;-1:-1:-1;;;;;;;;;;;27537:18:184;;;27530:62;27628:34;27608:18;;;27601:62;-1:-1:-1;;;27679:19:184;;;27672:37;27726:19;;19231:162:123;27277:474:184;19231:162:123;19407:28;;;;;;;:14;:28;;;;;19441:18;;:15;;19457:1;;19441:18;;;;;;:::i;:::-;;;;;;;;;;;;19407:53;;;;;;;-1:-1:-1;19407:53:123;;;;;;;;;;;;-1:-1:-1;;;;;19407:53:123;-1:-1:-1;;;19407:53:123;-1:-1:-1;;;;;19407:53:123;;;;;;;;;;19474:33;;;;;:19;:33;;;;;19513:18;;:15;;19529:1;;19513:18;;;;;;:::i;:::-;;;;;;;;;;;;:27;19474:67;;;;;;;-1:-1:-1;19474:67:123;;;;;;;;;;-1:-1:-1;;;;;;19474:67:123;-1:-1:-1;;;;;19474:67:123;;;;;;;;;19596:18;;19560:64;;;;;;19596:18;;19612:1;;19596:18;;;;;;:::i;:::-;;;;;;;;;;;;:27;19560:64;;-1:-1:-1;;;;;8392:32:184;;;8374:51;;8347:18;19560:64:123;;;;;;;19686:12;19643:161;;;19716:15;19732:1;19716:18;;;;;;;;:::i;:::-;;;;;;;:27;;;19761:15;19777:1;19761:18;;;;;;;;:::i;:::-;;;;;;;:29;;;19643:161;;;;;;;:::i;:::-;;;;;;;;18790:3;;;;:::i;:::-;;;;18750:1065;;;;18313:1508;;18193:1628;;:::o;20475:830::-;20905:11;:29;;;20890:44;;:11;:44;;;;20869:177;;;;-1:-1:-1;;;20869:177:123;;27958:2:184;20869:177:123;;;27940:21:184;27997:2;27977:18;;;27970:30;28036:34;28016:18;;;28009:62;28107:34;28087:18;;;28080:62;-1:-1:-1;;;28158:19:184;;;28151:53;28221:19;;20869:177:123;27756:490:184;20869:177:123;21077:33;;;;:38;;;;:89;;;21133:11;:33;;;21119:47;;:11;:47;;;21077:89;21056:242;;;;-1:-1:-1;;;21056:242:123;;28453:2:184;21056:242:123;;;28435:21:184;28492:3;28472:18;;;28465:31;28532:34;28512:18;;;28505:62;28603:34;28583:18;;;28576:62;28675:34;28654:19;;;28647:63;-1:-1:-1;;;28726:19:184;;;28719:41;28777:19;;21056:242:123;28251:551:184;21056:242:123;20475:830;;:::o;13134:829::-;13301:6;13336:32;;;:20;:32;;;;;;;;:46;;;;;;;;;;:53;;13508:206;13533:5;;13508:206;;13563:32;;;;:20;:32;;;;;;;;:46;;;;;;;;;;:86;;;;13610:5;13614:1;13610;:5;:::i;:::-;13563:53;;;;;;;;:::i;:::-;;;;;;;;;;:71;;;:86;13559:145;;13683:5;13687:1;13683;:5;:::i;:::-;13669:20;;;;;;13559:145;13540:3;;;;:::i;:::-;;;;13508:206;;;-1:-1:-1;13795:161:123;;-1:-1:-1;;;13795:161:123;;29150:2:184;13795:161:123;;;29132:21:184;29189:3;29169:18;;;29162:31;29229:34;29209:18;;;29202:62;29300:34;29280:18;;;29273:62;29372:34;29351:19;;;29344:63;29444:34;29423:19;;;29416:63;-1:-1:-1;;;29495:19:184;;;29488:32;29537:19;;13795:161:123;28948:614:184;19915:149:123;19988:6;20013:44;-1:-1:-1;;;;;20043:13:123;;;;20020:12;;20013:44;:::i;20144:242::-;20216:6;20246:1;20238:5;:9;20234:146;;;20293:6;20294:5;20293:6;:::i;:::-;20270:31;;:5;:31;:::i;:::-;20263:38;;;;20234:146;20339:30;20362:5;20339;:30;:::i;14:156:184:-;80:20;;140:4;129:16;;119:27;;109:55;;160:1;157;150:12;109:55;14:156;;;:::o;175:182::-;232:6;285:2;273:9;264:7;260:23;256:32;253:52;;;301:1;298;291:12;253:52;324:27;341:9;324:27;:::i;544:250::-;610:6;618;671:2;659:9;650:7;646:23;642:32;639:52;;;687:1;684;677:12;639:52;710:27;727:9;710:27;:::i;:::-;700:37;784:2;769:18;;;;756:32;;-1:-1:-1;;;544:250:184:o;799:323::-;-1:-1:-1;;;;;1007:32:184;;;;989:51;;-1:-1:-1;;;;;1076:39:184;1071:2;1056:18;;1049:67;977:2;962:18;;799:323::o;1127:131::-;-1:-1:-1;;;;;1202:31:184;;1192:42;;1182:70;;1248:1;1245;1238:12;1182:70;1127:131;:::o;1263:317::-;1329:6;1337;1390:2;1378:9;1369:7;1365:23;1361:32;1358:52;;;1406:1;1403;1396:12;1358:52;1429:27;1446:9;1429:27;:::i;:::-;1419:37;;1506:2;1495:9;1491:18;1478:32;1519:31;1544:5;1519:31;:::i;:::-;1569:5;1559:15;;;1263:317;;;;;:::o;1798:367::-;1861:8;1871:6;1925:3;1918:4;1910:6;1906:17;1902:27;1892:55;;1943:1;1940;1933:12;1892:55;-1:-1:-1;1966:20:184;;-1:-1:-1;;;;;1998:30:184;;1995:50;;;2041:1;2038;2031:12;1995:50;2078:4;2070:6;2066:17;2054:29;;2138:3;2131:4;2121:6;2118:1;2114:14;2106:6;2102:27;2098:38;2095:47;2092:67;;;2155:1;2152;2145:12;2170:842;2298:6;2306;2314;2322;2330;2383:2;2371:9;2362:7;2358:23;2354:32;2351:52;;;2399:1;2396;2389:12;2351:52;2422:27;2439:9;2422:27;:::i;:::-;2412:37;;2500:2;2489:9;2485:18;2472:32;-1:-1:-1;;;;;2564:2:184;2556:6;2553:14;2550:34;;;2580:1;2577;2570:12;2550:34;2619:70;2681:7;2672:6;2661:9;2657:22;2619:70;:::i;:::-;2708:8;;-1:-1:-1;2593:96:184;-1:-1:-1;2796:2:184;2781:18;;2768:32;;-1:-1:-1;2812:16:184;;;2809:36;;;2841:1;2838;2831:12;2809:36;;2880:72;2944:7;2933:8;2922:9;2918:24;2880:72;:::i;:::-;2170:842;;;;-1:-1:-1;2170:842:184;;-1:-1:-1;2971:8:184;;2854:98;2170:842;-1:-1:-1;;;2170:842:184:o;3017:347::-;3068:8;3078:6;3132:3;3125:4;3117:6;3113:17;3109:27;3099:55;;3150:1;3147;3140:12;3099:55;-1:-1:-1;3173:20:184;;-1:-1:-1;;;;;3205:30:184;;3202:50;;;3248:1;3245;3238:12;3202:50;3285:4;3277:6;3273:17;3261:29;;3337:3;3330:4;3321:6;3313;3309:19;3305:30;3302:39;3299:59;;;3354:1;3351;3344:12;3369:612;3457:6;3465;3473;3481;3534:2;3522:9;3513:7;3509:23;3505:32;3502:52;;;3550:1;3547;3540:12;3502:52;3589:9;3576:23;3608:31;3633:5;3608:31;:::i;:::-;3658:5;-1:-1:-1;3710:2:184;3695:18;;3682:32;;-1:-1:-1;3765:2:184;3750:18;;3737:32;-1:-1:-1;;;;;3781:30:184;;3778:50;;;3824:1;3821;3814:12;3778:50;3863:58;3913:7;3904:6;3893:9;3889:22;3863:58;:::i;:::-;3369:612;;;;-1:-1:-1;3940:8:184;-1:-1:-1;;;;3369:612:184:o;3986:467::-;4038:3;4076:5;4070:12;4103:6;4098:3;4091:19;4129:4;4158:2;4153:3;4149:12;4142:19;;4195:2;4188:5;4184:14;4216:1;4226:202;4240:6;4237:1;4234:13;4226:202;;;4305:13;;-1:-1:-1;;;;;4301:46:184;4289:59;;4368:12;;;;4403:15;;;;4262:1;4255:9;4226:202;;;-1:-1:-1;4444:3:184;;3986:467;-1:-1:-1;;;;;3986:467:184:o;4458:459::-;4711:2;4700:9;4693:21;4674:4;4737:55;4788:2;4777:9;4773:18;4765:6;4737:55;:::i;:::-;4840:9;4832:6;4828:22;4823:2;4812:9;4808:18;4801:50;4868:43;4904:6;4896;4868:43;:::i;4922:250::-;4988:6;4996;5049:2;5037:9;5028:7;5024:23;5020:32;5017:52;;;5065:1;5062;5055:12;5017:52;5101:9;5088:23;5078:33;;5130:36;5162:2;5151:9;5147:18;5130:36;:::i;:::-;5120:46;;4922:250;;;;;:::o;5470:717::-;5701:2;5753:21;;;5823:13;;5726:18;;;5845:22;;;5672:4;;5701:2;5924:15;;;;5898:2;5883:18;;;5672:4;5967:194;5981:6;5978:1;5975:13;5967:194;;;6030:49;6075:3;6066:6;6060:13;5252:10;5301:2;5293:5;5287:12;5283:21;5278:3;5271:34;5366:2;5358:4;5351:5;5347:16;5341:23;5337:32;5330:4;5325:3;5321:14;5314:56;;-1:-1:-1;;;;;5423:4:184;5416:5;5412:16;5406:23;5402:56;5395:4;5390:3;5386:14;5379:80;5177:288;;;6030:49;6136:15;;;;6108:4;6099:14;;;;;6003:1;5996:9;5967:194;;;-1:-1:-1;6178:3:184;;5470:717;-1:-1:-1;;;;;;5470:717:184:o;6192:127::-;6253:10;6248:3;6244:20;6241:1;6234:31;6284:4;6281:1;6274:15;6308:4;6305:1;6298:15;6324:257;6396:4;6390:11;;;6428:17;;-1:-1:-1;;;;;6460:34:184;;6496:22;;;6457:62;6454:88;;;6522:18;;:::i;:::-;6558:4;6551:24;6324:257;:::o;6586:275::-;6657:2;6651:9;6722:2;6703:13;;-1:-1:-1;;6699:27:184;6687:40;;-1:-1:-1;;;;;6742:34:184;;6778:22;;;6739:62;6736:88;;;6804:18;;:::i;:::-;6840:2;6833:22;6586:275;;-1:-1:-1;6586:275:184:o;6866:183::-;6926:4;-1:-1:-1;;;;;6951:6:184;6948:30;6945:56;;;6981:18;;:::i;:::-;-1:-1:-1;7026:1:184;7022:14;7038:4;7018:25;;6866:183::o;7054:961::-;7145:6;7153;7206:2;7194:9;7185:7;7181:23;7177:32;7174:52;;;7222:1;7219;7212:12;7174:52;7245:27;7262:9;7245:27;:::i;:::-;7235:37;;7291:2;7344;7333:9;7329:18;7316:32;-1:-1:-1;;;;;7363:6:184;7360:30;7357:50;;;7403:1;7400;7393:12;7357:50;7426:22;;7479:4;7471:13;;7467:27;-1:-1:-1;7457:55:184;;7508:1;7505;7498:12;7457:55;7544:2;7531:16;7567:60;7583:43;7623:2;7583:43;:::i;:::-;7567:60;:::i;:::-;7661:15;;;7743:1;7739:10;;;;7731:19;;7727:28;;;7692:12;;;;7767:19;;;7764:39;;;7799:1;7796;7789:12;7764:39;7823:11;;;;7843:142;7859:6;7854:3;7851:15;7843:142;;;7925:17;;7913:30;;7876:12;;;;7963;;;;7843:142;;;8004:5;7994:15;;;;;;;7054:961;;;;;:::o;8625:163::-;8692:20;;8752:10;8741:22;;8731:33;;8721:61;;8778:1;8775;8768:12;8793:481;8871:6;8879;8887;8940:2;8928:9;8919:7;8915:23;8911:32;8908:52;;;8956:1;8953;8946:12;8908:52;8979:28;8997:9;8979:28;:::i;:::-;8969:38;;9058:2;9047:9;9043:18;9030:32;-1:-1:-1;;;;;9077:6:184;9074:30;9071:50;;;9117:1;9114;9107:12;9071:50;9156:58;9206:7;9197:6;9186:9;9182:22;9156:58;:::i;:::-;8793:481;;9233:8;;-1:-1:-1;9130:84:184;;-1:-1:-1;;;;8793:481:184:o;9279:647::-;9448:2;9500:21;;;9570:13;;9473:18;;;9592:22;;;9419:4;;9448:2;9671:15;;;;9645:2;9630:18;;;9419:4;9714:186;9728:6;9725:1;9722:13;9714:186;;;9793:13;;9808:10;9789:30;9777:43;;9875:15;;;;9840:12;;;;9750:1;9743:9;9714:186;;10157:318;10232:6;10240;10248;10301:2;10289:9;10280:7;10276:23;10272:32;10269:52;;;10317:1;10314;10307:12;10269:52;10340:27;10357:9;10340:27;:::i;:::-;10330:37;10414:2;10399:18;;10386:32;;-1:-1:-1;10465:2:184;10450:18;;;10437:32;;10157:318;-1:-1:-1;;;10157:318:184:o;10480:260::-;5287:12;;5252:10;5283:21;;;5271:34;;5358:4;5347:16;;;5341:23;5337:32;;;5321:14;;;5314:56;5423:4;5412:16;;;5406:23;-1:-1:-1;;;;;5402:56:184;5386:14;;;5379:80;10674:2;10659:18;;10686:48;5177:288;11122:179;11189:20;;-1:-1:-1;;;;;11238:38:184;;11228:49;;11218:77;;11291:1;11288;11281:12;11306:254;11371:6;11379;11432:2;11420:9;11411:7;11407:23;11403:32;11400:52;;;11448:1;11445;11438:12;11400:52;11471:27;11488:9;11471:27;:::i;:::-;11461:37;;11517;11550:2;11539:9;11535:18;11517:37;:::i;11565:477::-;11644:6;11652;11660;11713:2;11701:9;11692:7;11688:23;11684:32;11681:52;;;11729:1;11726;11719:12;11681:52;11765:9;11752:23;11742:33;;11826:2;11815:9;11811:18;11798:32;-1:-1:-1;;;;;11845:6:184;11842:30;11839:50;;;11885:1;11882;11875:12;12047:1035;12115:5;12168:3;12161:4;12153:6;12149:17;12145:27;12135:55;;12186:1;12183;12176:12;12135:55;12222:6;12209:20;12248:4;12272:60;12288:43;12328:2;12288:43;:::i;12272:60::-;12366:15;;;12452:1;12448:10;;;;12436:23;;12432:32;;;12397:12;;;;12476:15;;;12473:35;;;12504:1;12501;12494:12;12473:35;12540:2;12532:6;12528:15;12552:501;12568:6;12563:3;12560:15;12552:501;;;12646:4;12640:3;12635;12631:13;12627:24;12624:114;;;12692:1;12721:2;12717;12710:14;12624:114;12764:22;;:::i;:::-;12827:3;12814:17;12844:33;12869:7;12844:33;:::i;:::-;12890:22;;12948:31;12966:12;;;12948:31;:::i;:::-;12932:14;;;12925:55;12993:18;;13031:12;;;;12594:4;12585:14;12552:501;;;-1:-1:-1;13071:5:184;12047:1035;-1:-1:-1;;;;;;12047:1035:184:o;13087:465::-;13211:6;13219;13272:2;13260:9;13251:7;13247:23;13243:32;13240:52;;;13288:1;13285;13278:12;13240:52;13311:27;13328:9;13311:27;:::i;:::-;13301:37;;13389:2;13378:9;13374:18;13361:32;-1:-1:-1;;;;;13408:6:184;13405:30;13402:50;;;13448:1;13445;13438:12;13402:50;13471:75;13538:7;13529:6;13518:9;13514:22;13471:75;:::i;:::-;13461:85;;;13087:465;;;;;:::o;13557:322::-;13631:6;13639;13647;13700:2;13688:9;13679:7;13675:23;13671:32;13668:52;;;13716:1;13713;13706:12;13668:52;13739:27;13756:9;13739:27;:::i;:::-;13729:37;;13785;13818:2;13807:9;13803:18;13785:37;:::i;:::-;13775:47;;13869:2;13858:9;13854:18;13841:32;13831:42;;13557:322;;;;;:::o;13884:::-;13958:6;13966;13974;14027:2;14015:9;14006:7;14002:23;13998:32;13995:52;;;14043:1;14040;14033:12;13995:52;14079:9;14066:23;14056:33;;14108:36;14140:2;14129:9;14125:18;14108:36;:::i;:::-;14098:46;;14163:37;14196:2;14185:9;14181:18;14163:37;:::i;:::-;14153:47;;13884:322;;;;;:::o;14643:391::-;14726:6;14734;14742;14750;14803:3;14791:9;14782:7;14778:23;14774:33;14771:53;;;14820:1;14817;14810:12;14771:53;14843:27;14860:9;14843:27;:::i;:::-;14833:37;;14889;14922:2;14911:9;14907:18;14889:37;:::i;:::-;14643:391;;14879:47;;-1:-1:-1;;;;14973:2:184;14958:18;;14945:32;;15024:2;15009:18;14996:32;;14643:391::o;15039:537::-;15171:6;15179;15187;15240:2;15228:9;15219:7;15215:23;15211:32;15208:52;;;15256:1;15253;15246:12;15208:52;15279:27;15296:9;15279:27;:::i;:::-;15269:37;;15325;15358:2;15347:9;15343:18;15325:37;:::i;:::-;15315:47;;15413:2;15402:9;15398:18;15385:32;-1:-1:-1;;;;;15432:6:184;15429:30;15426:50;;;15472:1;15469;15462:12;15426:50;15495:75;15562:7;15553:6;15542:9;15538:22;15495:75;:::i;:::-;15485:85;;;15039:537;;;;;:::o;15581:413::-;15783:2;15765:21;;;15822:2;15802:18;;;15795:30;15861:34;15856:2;15841:18;;15834:62;-1:-1:-1;;;15927:2:184;15912:18;;15905:47;15984:3;15969:19;;15581:413::o;15999:251::-;16069:6;16122:2;16110:9;16101:7;16097:23;16093:32;16090:52;;;16138:1;16135;16128:12;16090:52;16170:9;16164:16;16189:31;16214:5;16189:31;:::i;16255:490::-;16457:2;16439:21;;;16496:2;16476:18;;;16469:30;16535:34;16530:2;16515:18;;16508:62;16606:34;16601:2;16586:18;;16579:62;-1:-1:-1;;;16672:3:184;16657:19;;16650:53;16735:3;16720:19;;16255:490::o;17609:127::-;17670:10;17665:3;17661:20;17658:1;17651:31;17701:4;17698:1;17691:15;17725:4;17722:1;17715:15;17741:184;17799:6;17852:2;17840:9;17831:7;17827:23;17823:32;17820:52;;;17868:1;17865;17858:12;17820:52;17891:28;17909:9;17891:28;:::i;18259:127::-;18320:10;18315:3;18311:20;18308:1;18301:31;18351:4;18348:1;18341:15;18375:4;18372:1;18365:15;18391:135;18430:3;-1:-1:-1;;18451:17:184;;18448:43;;;18471:18;;:::i;:::-;-1:-1:-1;18518:1:184;18507:13;;18391:135::o;18531:480::-;18733:2;18715:21;;;18772:2;18752:18;;;18745:30;18811:34;18806:2;18791:18;;18784:62;18882:34;18877:2;18862:18;;18855:62;-1:-1:-1;;;18948:3:184;18933:19;;18926:43;19001:3;18986:19;;18531:480::o;20673:125::-;20713:4;20741:1;20738;20735:8;20732:34;;;20746:18;;:::i;:::-;-1:-1:-1;20783:9:184;;20673:125::o;20803:127::-;20864:10;20859:3;20855:20;20852:1;20845:31;20895:4;20892:1;20885:15;20919:4;20916:1;20909:15;23185:800;23370:4;23418:2;23407:9;23403:18;23457:1;23453;23448:3;23444:11;23440:19;23498:2;23490:6;23486:15;23475:9;23468:34;23521:2;23559;23554;23543:9;23539:18;23532:30;23582:6;23617;23611:13;23648:6;23640;23633:22;23686:2;23675:9;23671:18;23664:25;;23708:6;23705:1;23698:17;23751:2;23748:1;23738:16;23724:30;;23772:1;23782:177;23796:6;23793:1;23790:13;23782:177;;;23861:13;;23857:22;;23845:35;;23947:1;23935:14;;;;23900:12;;;;23811:9;23782:177;;;-1:-1:-1;23976:3:184;;23185:800;-1:-1:-1;;;;;;;;23185:800:184:o;23990:881::-;24085:6;24116:2;24159;24147:9;24138:7;24134:23;24130:32;24127:52;;;24175:1;24172;24165:12;24127:52;24208:9;24202:16;-1:-1:-1;;;;;24233:6:184;24230:30;24227:50;;;24273:1;24270;24263:12;24227:50;24296:22;;24349:4;24341:13;;24337:27;-1:-1:-1;24327:55:184;;24378:1;24375;24368:12;24327:55;24407:2;24401:9;24430:60;24446:43;24486:2;24446:43;:::i;24430:60::-;24524:15;;;24606:1;24602:10;;;;24594:19;;24590:28;;;24555:12;;;;24630:19;;;24627:39;;;24662:1;24659;24652:12;24627:39;24686:11;;;;24706:135;24722:6;24717:3;24714:15;24706:135;;;24788:10;;24776:23;;24739:12;;;;24819;;;;24706:135;;;24860:5;23990:881;-1:-1:-1;;;;;;;23990:881:184:o;24876:168::-;24916:7;24982:1;24978;24974:6;24970:14;24967:1;24964:21;24959:1;24952:9;24945:17;24941:45;24938:71;;;24989:18;;:::i;:::-;-1:-1:-1;25029:9:184;;24876:168::o;25049:217::-;25089:1;25115;25105:132;;25159:10;25154:3;25150:20;25147:1;25140:31;25194:4;25191:1;25184:15;25222:4;25219:1;25212:15;25105:132;-1:-1:-1;25251:9:184;;25049:217::o;25271:244::-;25310:3;-1:-1:-1;;;;;25391:2:184;25388:1;25384:10;25421:2;25418:1;25414:10;25452:3;25448:2;25444:12;25439:3;25436:21;25433:47;;;25460:18;;:::i;:::-;25496:13;;25271:244;-1:-1:-1;;;;25271:244:184:o;26236:128::-;26276:3;26307:1;26303:6;26300:1;26297:13;26294:39;;;26313:18;;:::i;:::-;-1:-1:-1;26349:9:184;;26236:128::o;28807:136::-;28846:3;28874:5;28864:39;;28883:18;;:::i;:::-;-1:-1:-1;;;28919:18:184;;28807:136::o;29567:267::-;29606:4;29635:9;;;29660:10;;-1:-1:-1;;;29679:19:184;;29672:27;;29656:44;29653:70;;;29703:18;;:::i;:::-;-1:-1:-1;;;;;29750:27:184;;29743:35;;29735:44;;29732:70;;;29782:18;;:::i;:::-;-1:-1:-1;;29819:9:184;;29567:267::o;29839:136::-;29874:3;-1:-1:-1;;;29895:22:184;;29892:48;;;29920:18;;:::i;:::-;-1:-1:-1;29960:1:184;29956:13;;29839:136::o;29980:237::-;30019:4;-1:-1:-1;;;;;30124:10:184;;;;30094;;30146:12;;;30143:38;;;30161:18;;:::i;:::-;30198:13;;29980:237;-1:-1:-1;;;29980:237:184:o","linkReferences":{},"immutableReferences":{"28060":[{"start":1321,"length":32},{"start":7848,"length":32}],"28063":[{"start":890,"length":32},{"start":1586,"length":32},{"start":2415,"length":32},{"start":3302,"length":32},{"start":4369,"length":32},{"start":5891,"length":32},{"start":6149,"length":32},{"start":6441,"length":32},{"start":7399,"length":32}]}},"methodIdentifiers":{"MAX_WEIGHING_FUNCTION_LENGTH()":"7c172347","WEIGHTING_DIVISOR()":"5e5a6775","addStrategies(uint8,(address,uint96)[])":"c601527d","delegation()":"df5cf723","deregisterOperator(bytes32,bytes)":"bd29b8cd","getCurrentStake(bytes32,uint8)":"5401ed27","getCurrentTotalStake(uint8)":"d5eccc05","getLatestStakeUpdate(bytes32,uint8)":"f851e198","getStakeAtBlockNumber(bytes32,uint8,uint32)":"fa28c627","getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)":"f2be94ae","getStakeHistory(bytes32,uint8)":"2cd95940","getStakeHistoryLength(bytes32,uint8)":"4bd26e09","getStakeUpdateAtIndex(uint8,bytes32,uint256)":"ac6bfb03","getStakeUpdateIndexAtBlockNumber(bytes32,uint8,uint32)":"dd9846b9","getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)":"c8294c56","getTotalStakeHistoryLength(uint8)":"0491b41c","getTotalStakeIndicesAtBlockNumber(uint32,bytes)":"81c07502","getTotalStakeUpdateAtIndex(uint8,uint256)":"b6904b78","initializeQuorum(uint8,uint96,(address,uint96)[])":"ff694a77","minimumStakeForQuorum(uint8)":"c46778a5","modifyStrategyParams(uint8,uint256[],uint96[])":"20b66298","registerOperator(address,bytes32,bytes)":"25504777","registryCoordinator()":"6d14a987","removeStrategies(uint8,uint256[])":"5f1f2d77","setMinimumStakeForQuorum(uint8,uint96)":"bc9a40c3","strategiesPerQuorum(uint8,uint256)":"9f3ccf65","strategyParams(uint8,uint256)":"08732461","strategyParamsByIndex(uint8,uint256)":"adc804da","strategyParamsLength(uint8)":"3ca5a5f5","updateOperatorStake(address,bytes32,bytes)":"66acfefe","weightOfOperatorForQuorum(uint8,address)":"1f9b74e0"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IRegistryCoordinator\",\"name\":\"_registryCoordinator\",\"type\":\"address\"},{\"internalType\":\"contract IDelegationManager\",\"name\":\"_delegationManager\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"minimumStake\",\"type\":\"uint96\"}],\"name\":\"MinimumStakeForQuorumUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"name\":\"OperatorStakeUpdate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"QuorumCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"StrategyAddedToQuorum\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"multiplier\",\"type\":\"uint256\"}],\"name\":\"StrategyMultiplierUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"StrategyRemovedFromQuorum\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_WEIGHING_FUNCTION_LENGTH\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WEIGHTING_DIVISOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"multiplier\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StrategyParams[]\",\"name\":\"_strategyParams\",\"type\":\"tuple[]\"}],\"name\":\"addStrategies\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"delegation\",\"outputs\":[{\"internalType\":\"contract IDelegationManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"deregisterOperator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getCurrentStake\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getCurrentTotalStake\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getLatestStakeUpdate\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"}],\"name\":\"getStakeAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getStakeAtBlockNumberAndIndex\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getStakeHistory\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getStakeHistoryLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getStakeUpdateAtIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"}],\"name\":\"getStakeUpdateIndexAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getTotalStakeAtBlockNumberFromIndex\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"getTotalStakeHistoryLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"getTotalStakeIndicesAtBlockNumber\",\"outputs\":[{\"internalType\":\"uint32[]\",\"name\":\"\",\"type\":\"uint32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getTotalStakeUpdateAtIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"updateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"nextUpdateBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"stake\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StakeUpdate\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint96\",\"name\":\"minimumStake\",\"type\":\"uint96\"},{\"components\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"multiplier\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StrategyParams[]\",\"name\":\"_strategyParams\",\"type\":\"tuple[]\"}],\"name\":\"initializeQuorum\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"minimumStakeForQuorum\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256[]\",\"name\":\"strategyIndices\",\"type\":\"uint256[]\"},{\"internalType\":\"uint96[]\",\"name\":\"newMultipliers\",\"type\":\"uint96[]\"}],\"name\":\"modifyStrategyParams\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"registerOperator\",\"outputs\":[{\"internalType\":\"uint96[]\",\"name\":\"\",\"type\":\"uint96[]\"},{\"internalType\":\"uint96[]\",\"name\":\"\",\"type\":\"uint96[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registryCoordinator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256[]\",\"name\":\"indicesToRemove\",\"type\":\"uint256[]\"}],\"name\":\"removeStrategies\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint96\",\"name\":\"minimumStake\",\"type\":\"uint96\"}],\"name\":\"setMinimumStakeForQuorum\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"strategiesPerQuorum\",\"outputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"strategyParams\",\"outputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"multiplier\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"strategyParamsByIndex\",\"outputs\":[{\"components\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint96\",\"name\":\"multiplier\",\"type\":\"uint96\"}],\"internalType\":\"struct IStakeRegistry.StrategyParams\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"}],\"name\":\"strategyParamsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"operatorId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"quorumNumbers\",\"type\":\"bytes\"}],\"name\":\"updateOperatorStake\",\"outputs\":[{\"internalType\":\"uint192\",\"name\":\"\",\"type\":\"uint192\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"quorumNumber\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"weightOfOperatorForQuorum\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Layr Labs, Inc.\",\"kind\":\"dev\",\"methods\":{\"addStrategies(uint8,(address,uint96)[])\":{\"details\":\"Checks to make sure that the *same* strategy cannot be added multiple times (checks against both against existing and new strategies).This function has no check to make sure that the strategies for a single quorum have the same underlying asset. This is a concious choice, since a middleware may want, e.g., a stablecoin quorum that accepts USDC, USDT, DAI, etc. as underlying assets and trades them as \\\"equivalent\\\".\"},\"deregisterOperator(bytes32,bytes)\":{\"details\":\"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already deregistered 5) `quorumNumbers` is a subset of the quorumNumbers that the operator is registered for\",\"params\":{\"operatorId\":\"The id of the operator to deregister.\",\"quorumNumbers\":\"The quorum numbers the operator is deregistering from, where each byte is an 8 bit integer quorumNumber.\"}},\"getCurrentStake(bytes32,uint8)\":{\"details\":\"Function returns weight of **0** in the event that the operator has no stake history\"},\"getCurrentTotalStake(uint8)\":{\"details\":\"Will revert if `_totalStakeHistory[quorumNumber]` is empty.\"},\"getLatestStakeUpdate(bytes32,uint8)\":{\"details\":\"Function returns an StakeUpdate struct with **every entry equal to 0** in the event that the operator has no stake history\"},\"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)\":{\"details\":\"Function will revert if `index` is out-of-bounds.\",\"params\":{\"blockNumber\":\"Block number to make sure the stake is from.\",\"index\":\"Array index for lookup, within the dynamic array `operatorStakeHistory[operatorId][quorumNumber]`.\",\"operatorId\":\"The id of the operator of interest.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getStakeHistory(bytes32,uint8)\":{\"params\":{\"operatorId\":\"The id of the operator of interest.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getStakeUpdateAtIndex(uint8,bytes32,uint256)\":{\"details\":\"Function will revert if `index` is out-of-bounds.\",\"params\":{\"index\":\"Array index for lookup, within the dynamic array `operatorStakeHistory[operatorId][quorumNumber]`.\",\"operatorId\":\"The id of the operator of interest.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)\":{\"details\":\"Function will revert if `index` is out-of-bounds.\",\"params\":{\"blockNumber\":\"Block number to make sure the stake is from.\",\"index\":\"Array index for lookup, within the dynamic array `_totalStakeHistory[quorumNumber]`.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"getTotalStakeIndicesAtBlockNumber(uint32,bytes)\":{\"details\":\"Function will revert if there are no indices for the given `blockNumber`\",\"params\":{\"blockNumber\":\"Block number to retrieve the stake indices from.\",\"quorumNumbers\":\"The quorum numbers to get the stake indices for.\"}},\"getTotalStakeUpdateAtIndex(uint8,uint256)\":{\"params\":{\"index\":\"Array index for lookup, within the dynamic array `_totalStakeHistory[quorumNumber]`.\",\"quorumNumber\":\"The quorum number to get the stake for.\"}},\"modifyStrategyParams(uint8,uint256[],uint96[])\":{\"params\":{\"newMultipliers\":\"are the new multipliers for the strategies\",\"quorumNumber\":\"is the quorum number to which the strategies belong\",\"strategyIndices\":\"are the indices of the strategies to change\"}},\"registerOperator(address,bytes32,bytes)\":{\"details\":\"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already registered\",\"params\":{\"operator\":\"The address of the operator to register.\",\"operatorId\":\"The id of the operator to register.\",\"quorumNumbers\":\"The quorum numbers the operator is registering for, where each byte is an 8 bit integer quorumNumber.\"},\"returns\":{\"_0\":\"The operator's current stake for each quorum, and the total stake for each quorum\"}},\"removeStrategies(uint8,uint256[])\":{\"details\":\"higher indices should be *first* in the list of @param indicesToRemove, since otherwise the removal of lower index entries will cause a shift in the indices of the other strategies to remove\"},\"updateOperatorStake(address,bytes32,bytes)\":{\"returns\":{\"_0\":\"A bitmap of quorums where the operator no longer meets the minimum stake and should be deregistered.\"}},\"weightOfOperatorForQuorum(uint8,address)\":{\"details\":\"reverts if the quorum does not exist\"}},\"title\":\"A `Registry` that keeps track of stakes of operators for up to 256 quorums. Specifically, it keeps track of 1) The stake of each operator in all the quorums they are a part of for block ranges 2) The total stake of all operators in each quorum for block ranges 3) The minimum stake required to register for each quorum It allows an additional functionality (in addition to registering and deregistering) to update the stake of an operator.\",\"version\":1},\"userdoc\":{\"events\":{\"MinimumStakeForQuorumUpdated(uint8,uint96)\":{\"notice\":\"emitted when the minimum stake for a quorum is updated\"},\"OperatorStakeUpdate(bytes32,uint8,uint96)\":{\"notice\":\"emitted whenever the stake of `operator` is updated\"},\"QuorumCreated(uint8)\":{\"notice\":\"emitted when a new quorum is created\"},\"StrategyAddedToQuorum(uint8,address)\":{\"notice\":\"emitted when `strategy` has been added to the array at `strategyParams[quorumNumber]`\"},\"StrategyMultiplierUpdated(uint8,address,uint256)\":{\"notice\":\"emitted when `strategy` has its `multiplier` updated in the array at `strategyParams[quorumNumber]`\"},\"StrategyRemovedFromQuorum(uint8,address)\":{\"notice\":\"emitted when `strategy` has removed from the array at `strategyParams[quorumNumber]`\"}},\"kind\":\"user\",\"methods\":{\"MAX_WEIGHING_FUNCTION_LENGTH()\":{\"notice\":\"Maximum length of dynamic arrays in the `strategyParams` mapping.\"},\"WEIGHTING_DIVISOR()\":{\"notice\":\"Constant used as a divisor in calculating weights.\"},\"addStrategies(uint8,(address,uint96)[])\":{\"notice\":\"Adds strategies and weights to the quorum\"},\"delegation()\":{\"notice\":\"The address of the Delegation contract for EigenLayer.\"},\"deregisterOperator(bytes32,bytes)\":{\"notice\":\"Deregisters the operator with `operatorId` for the specified `quorumNumbers`.\"},\"getCurrentStake(bytes32,uint8)\":{\"notice\":\"Returns the most recent stake weight for the `operatorId` for quorum `quorumNumber`\"},\"getCurrentTotalStake(uint8)\":{\"notice\":\"Returns the stake weight from the latest entry in `_totalStakeHistory` for quorum `quorumNumber`.\"},\"getLatestStakeUpdate(bytes32,uint8)\":{\"notice\":\"Returns the most recent stake weight for the `operatorId` for a certain quorum\"},\"getStakeAtBlockNumber(bytes32,uint8,uint32)\":{\"notice\":\"Returns the stake of the operator for the provided `quorumNumber` at the given `blockNumber`\"},\"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)\":{\"notice\":\"Returns the stake weight corresponding to `operatorId` for quorum `quorumNumber`, at the `index`-th entry in the `operatorStakeHistory[operatorId][quorumNumber]` array if it was the operator's stake at `blockNumber`. Reverts otherwise.\"},\"getStakeHistory(bytes32,uint8)\":{\"notice\":\"Returns the entire `operatorStakeHistory[operatorId][quorumNumber]` array.\"},\"getStakeHistoryLength(bytes32,uint8)\":{\"notice\":\"Returns the length of an operator's stake history for the given quorum\"},\"getStakeUpdateAtIndex(uint8,bytes32,uint256)\":{\"notice\":\"Returns the `index`-th entry in the `operatorStakeHistory[operatorId][quorumNumber]` array.\"},\"getStakeUpdateIndexAtBlockNumber(bytes32,uint8,uint32)\":{\"notice\":\"Returns the indices of the operator stakes for the provided `quorumNumber` at the given `blockNumber`\"},\"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)\":{\"notice\":\"Returns the total stake weight for quorum `quorumNumber`, at the `index`-th entry in the `_totalStakeHistory[quorumNumber]` array if it was the stake at `blockNumber`. Reverts otherwise.\"},\"getTotalStakeHistoryLength(uint8)\":{\"notice\":\"Returns the length of the total stake history for the given quorum\"},\"getTotalStakeIndicesAtBlockNumber(uint32,bytes)\":{\"notice\":\"Returns the indices of the total stakes for the provided `quorumNumbers` at the given `blockNumber`\"},\"getTotalStakeUpdateAtIndex(uint8,uint256)\":{\"notice\":\"Returns the `index`-th entry in the dynamic array of total stake, `_totalStakeHistory` for quorum `quorumNumber`.\"},\"initializeQuorum(uint8,uint96,(address,uint96)[])\":{\"notice\":\"Initialize a new quorum and push its first history update\"},\"minimumStakeForQuorum(uint8)\":{\"notice\":\"In order to register for a quorum i, an operator must have at least `minimumStakeForQuorum[i]` evaluated by this contract's 'VoteWeigher' logic.\"},\"modifyStrategyParams(uint8,uint256[],uint96[])\":{\"notice\":\"Modifies the weights of existing strategies for a specific quorum\"},\"registerOperator(address,bytes32,bytes)\":{\"notice\":\"Registers the `operator` with `operatorId` for the specified `quorumNumbers`.\"},\"registryCoordinator()\":{\"notice\":\"the coordinator contract that this registry is associated with\"},\"removeStrategies(uint8,uint256[])\":{\"notice\":\"Remove strategies and their associated weights from the quorum's considered strategies\"},\"strategyParams(uint8,uint256)\":{\"notice\":\"mapping from quorum number to the list of strategies considered and their corresponding multipliers for that specific quorum\"},\"strategyParamsByIndex(uint8,uint256)\":{\"notice\":\"Returns the strategy and weight multiplier for the `index`'th strategy in the quorum `quorumNumber`\"},\"strategyParamsLength(uint8)\":{\"notice\":\"Returns the length of the dynamic array stored in `strategyParams[quorumNumber]`.\"},\"updateOperatorStake(address,bytes32,bytes)\":{\"notice\":\"Called by the registry coordinator to update an operator's stake for one or more quorums. If the operator no longer has the minimum stake required for a quorum, they are added to the `quorumsToRemove`, which is returned to the registry coordinator\"},\"weightOfOperatorForQuorum(uint8,address)\":{\"notice\":\"This function computes the total weight of the @param operator in the quorum @param quorumNumber.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/eigenlayer-middleware/src/StakeRegistry.sol\":\"StakeRegistry\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/\",\":eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/\",\":eigenlayer-middleware/=lib/eigenlayer-middleware/src/\",\":eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/\",\":erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/\"]},\"sources\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol\":{\"keccak256\":\"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983\",\"dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol\":{\"keccak256\":\"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914\",\"dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol\":{\"keccak256\":\"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c\",\"license\":\"CC0-1.0\",\"urls\":[\"bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91\",\"dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol\":{\"keccak256\":\"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc\",\"dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol\":{\"keccak256\":\"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8\",\"dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol\":{\"keccak256\":\"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324\",\"dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol\":{\"keccak256\":\"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d\",\"dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol\":{\"keccak256\":\"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c\",\"dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol\":{\"keccak256\":\"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232\",\"dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol\":{\"keccak256\":\"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73\",\"dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol\":{\"keccak256\":\"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef\",\"dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol\":{\"keccak256\":\"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7\",\"dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol\":{\"keccak256\":\"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f\",\"dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol\":{\"keccak256\":\"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f\",\"dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/eigenlayer-middleware/src/StakeRegistry.sol\":{\"keccak256\":\"0xb065491d1a4ab43172487534f297369c2eefe9548d6db0cc41f870566f0d6bff\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://53a87f0a1ff6655ae03cc8859c255d5212ad5284e1a7225cb83092116c188327\",\"dweb:/ipfs/QmeURXtkWV5G89qv6wYbEmwqoubb5YzYPRFQ5qpk1GiuaH\"]},\"lib/eigenlayer-middleware/src/StakeRegistryStorage.sol\":{\"keccak256\":\"0xd0675a2edd88adf10f0e7f6f17f8274b3f660cf891bdd781defb1f229d0144d1\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://8d044348b69a2e71016b196a9011436bfe5c3b48e3942cce4706c0795cab8732\",\"dweb:/ipfs/Qmb1Khrwj57BMmQ71NdMUdXrnTNw9Fnc7k79svkT6HtJ5s\"]},\"lib/eigenlayer-middleware/src/interfaces/IBLSApkRegistry.sol\":{\"keccak256\":\"0xc07a5edfd95ab4f16f16a8dc8e76eadf4b0e90fe49db90540d01daaad86898c5\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://52b53266450a53da641e82d8ae3be93c5e09f8342b4ea0cc96bb9038d8406354\",\"dweb:/ipfs/QmVuoiQyqPTLCGnyt8zDaxiyaj4ETdgTGKv4MDHWzqEDjp\"]},\"lib/eigenlayer-middleware/src/interfaces/IIndexRegistry.sol\":{\"keccak256\":\"0x83b2d56aacf27e65c4959a832c5de573e013908c044f6e48ea8284ac5282ae2b\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://877af382587e96bb39bcc6db8bb5e4b871db5025c52347d4bee9afeaa4a6cc8d\",\"dweb:/ipfs/QmdnhsQCChzq2o5NgbeT3JxSsEcMm1PC9QW6zenZNPjD9F\"]},\"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol\":{\"keccak256\":\"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25\",\"dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY\"]},\"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol\":{\"keccak256\":\"0xdd8effb082c1d5957d5ff43d7c59497b32866a6d82bcc7d5efa49ea9bc9b3385\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cb33a2a1446585b13b7a509e880c60d658d2d2522ec48a9f02e30d2cff54002d\",\"dweb:/ipfs/QmVNG8ZPZkXzNEadPdTj1uBYLiZdCnYfsE5iGU6nJcJXiD\"]},\"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol\":{\"keccak256\":\"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97\",\"dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B\"]},\"lib/eigenlayer-middleware/src/libraries/BN254.sol\":{\"keccak256\":\"0xb428c8d0c3b325507a88a61a80115493eb88606ccc19ed64a31e11294ab853b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7b6fb935bfe0494e6ff970c8f30a86d5f4cf5c3e0967300c28cd383c043acae\",\"dweb:/ipfs/QmUHfFZaVjLPXhkBmcxrZhAHZaSFQDqXtrLGpjGBQBa5Ki\"]},\"lib/eigenlayer-middleware/src/libraries/BitmapUtils.sol\":{\"keccak256\":\"0x44315ac460be30a6b18fd4df4d1b8afb46653bf4dc06ca9f93c32353fd0605c5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da14f2ead3a375b02afd09d4a02edddf7b63a88945746b96789b2473184fdb04\",\"dweb:/ipfs/QmRqcjxa2Vv2MrLdPeAwsktXdWTirapEDsRbJCyYRtKT6g\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.12+commit.f00d7308"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IRegistryCoordinator","name":"_registryCoordinator","type":"address"},{"internalType":"contract IDelegationManager","name":"_delegationManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"uint96","name":"minimumStake","type":"uint96","indexed":false}],"type":"event","name":"MinimumStakeForQuorumUpdated","anonymous":false},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32","indexed":true},{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":false},{"internalType":"uint96","name":"stake","type":"uint96","indexed":false}],"type":"event","name":"OperatorStakeUpdate","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true}],"type":"event","name":"QuorumCreated","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false}],"type":"event","name":"StrategyAddedToQuorum","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false},{"internalType":"uint256","name":"multiplier","type":"uint256","indexed":false}],"type":"event","name":"StrategyMultiplierUpdated","anonymous":false},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8","indexed":true},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false}],"type":"event","name":"StrategyRemovedFromQuorum","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_WEIGHING_FUNCTION_LENGTH","outputs":[{"internalType":"uint8","name":"","type":"uint8"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"WEIGHTING_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"struct IStakeRegistry.StrategyParams[]","name":"_strategyParams","type":"tuple[]","components":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint96","name":"multiplier","type":"uint96"}]}],"stateMutability":"nonpayable","type":"function","name":"addStrategies"},{"inputs":[],"stateMutability":"view","type":"function","name":"delegation","outputs":[{"internalType":"contract IDelegationManager","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"deregisterOperator"},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getCurrentStake","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getCurrentTotalStake","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getLatestStakeUpdate","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate","name":"","type":"tuple","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"stateMutability":"view","type":"function","name":"getStakeAtBlockNumber","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getStakeAtBlockNumberAndIndex","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getStakeHistory","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate[]","name":"","type":"tuple[]","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getStakeHistoryLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getStakeUpdateAtIndex","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate","name":"","type":"tuple","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"}],"stateMutability":"view","type":"function","name":"getStakeUpdateIndexAtBlockNumber","outputs":[{"internalType":"uint32","name":"","type":"uint32"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getTotalStakeAtBlockNumberFromIndex","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"getTotalStakeHistoryLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"view","type":"function","name":"getTotalStakeIndicesAtBlockNumber","outputs":[{"internalType":"uint32[]","name":"","type":"uint32[]"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"getTotalStakeUpdateAtIndex","outputs":[{"internalType":"struct IStakeRegistry.StakeUpdate","name":"","type":"tuple","components":[{"internalType":"uint32","name":"updateBlockNumber","type":"uint32"},{"internalType":"uint32","name":"nextUpdateBlockNumber","type":"uint32"},{"internalType":"uint96","name":"stake","type":"uint96"}]}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint96","name":"minimumStake","type":"uint96"},{"internalType":"struct IStakeRegistry.StrategyParams[]","name":"_strategyParams","type":"tuple[]","components":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint96","name":"multiplier","type":"uint96"}]}],"stateMutability":"nonpayable","type":"function","name":"initializeQuorum"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function","name":"minimumStakeForQuorum","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256[]","name":"strategyIndices","type":"uint256[]"},{"internalType":"uint96[]","name":"newMultipliers","type":"uint96[]"}],"stateMutability":"nonpayable","type":"function","name":"modifyStrategyParams"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"registerOperator","outputs":[{"internalType":"uint96[]","name":"","type":"uint96[]"},{"internalType":"uint96[]","name":"","type":"uint96[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"registryCoordinator","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256[]","name":"indicesToRemove","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function","name":"removeStrategies"},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint96","name":"minimumStake","type":"uint96"}],"stateMutability":"nonpayable","type":"function","name":"setMinimumStakeForQuorum"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"strategiesPerQuorum","outputs":[{"internalType":"contract IStrategy","name":"","type":"address"}]},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"strategyParams","outputs":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint96","name":"multiplier","type":"uint96"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"view","type":"function","name":"strategyParamsByIndex","outputs":[{"internalType":"struct IStakeRegistry.StrategyParams","name":"","type":"tuple","components":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint96","name":"multiplier","type":"uint96"}]}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"}],"stateMutability":"view","type":"function","name":"strategyParamsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes32","name":"operatorId","type":"bytes32"},{"internalType":"bytes","name":"quorumNumbers","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"updateOperatorStake","outputs":[{"internalType":"uint192","name":"","type":"uint192"}]},{"inputs":[{"internalType":"uint8","name":"quorumNumber","type":"uint8"},{"internalType":"address","name":"operator","type":"address"}],"stateMutability":"view","type":"function","name":"weightOfOperatorForQuorum","outputs":[{"internalType":"uint96","name":"","type":"uint96"}]}],"devdoc":{"kind":"dev","methods":{"addStrategies(uint8,(address,uint96)[])":{"details":"Checks to make sure that the *same* strategy cannot be added multiple times (checks against both against existing and new strategies).This function has no check to make sure that the strategies for a single quorum have the same underlying asset. This is a concious choice, since a middleware may want, e.g., a stablecoin quorum that accepts USDC, USDT, DAI, etc. as underlying assets and trades them as \"equivalent\"."},"deregisterOperator(bytes32,bytes)":{"details":"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already deregistered 5) `quorumNumbers` is a subset of the quorumNumbers that the operator is registered for","params":{"operatorId":"The id of the operator to deregister.","quorumNumbers":"The quorum numbers the operator is deregistering from, where each byte is an 8 bit integer quorumNumber."}},"getCurrentStake(bytes32,uint8)":{"details":"Function returns weight of **0** in the event that the operator has no stake history"},"getCurrentTotalStake(uint8)":{"details":"Will revert if `_totalStakeHistory[quorumNumber]` is empty."},"getLatestStakeUpdate(bytes32,uint8)":{"details":"Function returns an StakeUpdate struct with **every entry equal to 0** in the event that the operator has no stake history"},"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)":{"details":"Function will revert if `index` is out-of-bounds.","params":{"blockNumber":"Block number to make sure the stake is from.","index":"Array index for lookup, within the dynamic array `operatorStakeHistory[operatorId][quorumNumber]`.","operatorId":"The id of the operator of interest.","quorumNumber":"The quorum number to get the stake for."}},"getStakeHistory(bytes32,uint8)":{"params":{"operatorId":"The id of the operator of interest.","quorumNumber":"The quorum number to get the stake for."}},"getStakeUpdateAtIndex(uint8,bytes32,uint256)":{"details":"Function will revert if `index` is out-of-bounds.","params":{"index":"Array index for lookup, within the dynamic array `operatorStakeHistory[operatorId][quorumNumber]`.","operatorId":"The id of the operator of interest.","quorumNumber":"The quorum number to get the stake for."}},"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)":{"details":"Function will revert if `index` is out-of-bounds.","params":{"blockNumber":"Block number to make sure the stake is from.","index":"Array index for lookup, within the dynamic array `_totalStakeHistory[quorumNumber]`.","quorumNumber":"The quorum number to get the stake for."}},"getTotalStakeIndicesAtBlockNumber(uint32,bytes)":{"details":"Function will revert if there are no indices for the given `blockNumber`","params":{"blockNumber":"Block number to retrieve the stake indices from.","quorumNumbers":"The quorum numbers to get the stake indices for."}},"getTotalStakeUpdateAtIndex(uint8,uint256)":{"params":{"index":"Array index for lookup, within the dynamic array `_totalStakeHistory[quorumNumber]`.","quorumNumber":"The quorum number to get the stake for."}},"modifyStrategyParams(uint8,uint256[],uint96[])":{"params":{"newMultipliers":"are the new multipliers for the strategies","quorumNumber":"is the quorum number to which the strategies belong","strategyIndices":"are the indices of the strategies to change"}},"registerOperator(address,bytes32,bytes)":{"details":"access restricted to the RegistryCoordinatorPreconditions (these are assumed, not validated in this contract): 1) `quorumNumbers` has no duplicates 2) `quorumNumbers.length` != 0 3) `quorumNumbers` is ordered in ascending order 4) the operator is not already registered","params":{"operator":"The address of the operator to register.","operatorId":"The id of the operator to register.","quorumNumbers":"The quorum numbers the operator is registering for, where each byte is an 8 bit integer quorumNumber."},"returns":{"_0":"The operator's current stake for each quorum, and the total stake for each quorum"}},"removeStrategies(uint8,uint256[])":{"details":"higher indices should be *first* in the list of @param indicesToRemove, since otherwise the removal of lower index entries will cause a shift in the indices of the other strategies to remove"},"updateOperatorStake(address,bytes32,bytes)":{"returns":{"_0":"A bitmap of quorums where the operator no longer meets the minimum stake and should be deregistered."}},"weightOfOperatorForQuorum(uint8,address)":{"details":"reverts if the quorum does not exist"}},"version":1},"userdoc":{"kind":"user","methods":{"MAX_WEIGHING_FUNCTION_LENGTH()":{"notice":"Maximum length of dynamic arrays in the `strategyParams` mapping."},"WEIGHTING_DIVISOR()":{"notice":"Constant used as a divisor in calculating weights."},"addStrategies(uint8,(address,uint96)[])":{"notice":"Adds strategies and weights to the quorum"},"delegation()":{"notice":"The address of the Delegation contract for EigenLayer."},"deregisterOperator(bytes32,bytes)":{"notice":"Deregisters the operator with `operatorId` for the specified `quorumNumbers`."},"getCurrentStake(bytes32,uint8)":{"notice":"Returns the most recent stake weight for the `operatorId` for quorum `quorumNumber`"},"getCurrentTotalStake(uint8)":{"notice":"Returns the stake weight from the latest entry in `_totalStakeHistory` for quorum `quorumNumber`."},"getLatestStakeUpdate(bytes32,uint8)":{"notice":"Returns the most recent stake weight for the `operatorId` for a certain quorum"},"getStakeAtBlockNumber(bytes32,uint8,uint32)":{"notice":"Returns the stake of the operator for the provided `quorumNumber` at the given `blockNumber`"},"getStakeAtBlockNumberAndIndex(uint8,uint32,bytes32,uint256)":{"notice":"Returns the stake weight corresponding to `operatorId` for quorum `quorumNumber`, at the `index`-th entry in the `operatorStakeHistory[operatorId][quorumNumber]` array if it was the operator's stake at `blockNumber`. Reverts otherwise."},"getStakeHistory(bytes32,uint8)":{"notice":"Returns the entire `operatorStakeHistory[operatorId][quorumNumber]` array."},"getStakeHistoryLength(bytes32,uint8)":{"notice":"Returns the length of an operator's stake history for the given quorum"},"getStakeUpdateAtIndex(uint8,bytes32,uint256)":{"notice":"Returns the `index`-th entry in the `operatorStakeHistory[operatorId][quorumNumber]` array."},"getStakeUpdateIndexAtBlockNumber(bytes32,uint8,uint32)":{"notice":"Returns the indices of the operator stakes for the provided `quorumNumber` at the given `blockNumber`"},"getTotalStakeAtBlockNumberFromIndex(uint8,uint32,uint256)":{"notice":"Returns the total stake weight for quorum `quorumNumber`, at the `index`-th entry in the `_totalStakeHistory[quorumNumber]` array if it was the stake at `blockNumber`. Reverts otherwise."},"getTotalStakeHistoryLength(uint8)":{"notice":"Returns the length of the total stake history for the given quorum"},"getTotalStakeIndicesAtBlockNumber(uint32,bytes)":{"notice":"Returns the indices of the total stakes for the provided `quorumNumbers` at the given `blockNumber`"},"getTotalStakeUpdateAtIndex(uint8,uint256)":{"notice":"Returns the `index`-th entry in the dynamic array of total stake, `_totalStakeHistory` for quorum `quorumNumber`."},"initializeQuorum(uint8,uint96,(address,uint96)[])":{"notice":"Initialize a new quorum and push its first history update"},"minimumStakeForQuorum(uint8)":{"notice":"In order to register for a quorum i, an operator must have at least `minimumStakeForQuorum[i]` evaluated by this contract's 'VoteWeigher' logic."},"modifyStrategyParams(uint8,uint256[],uint96[])":{"notice":"Modifies the weights of existing strategies for a specific quorum"},"registerOperator(address,bytes32,bytes)":{"notice":"Registers the `operator` with `operatorId` for the specified `quorumNumbers`."},"registryCoordinator()":{"notice":"the coordinator contract that this registry is associated with"},"removeStrategies(uint8,uint256[])":{"notice":"Remove strategies and their associated weights from the quorum's considered strategies"},"strategyParams(uint8,uint256)":{"notice":"mapping from quorum number to the list of strategies considered and their corresponding multipliers for that specific quorum"},"strategyParamsByIndex(uint8,uint256)":{"notice":"Returns the strategy and weight multiplier for the `index`'th strategy in the quorum `quorumNumber`"},"strategyParamsLength(uint8)":{"notice":"Returns the length of the dynamic array stored in `strategyParams[quorumNumber]`."},"updateOperatorStake(address,bytes32,bytes)":{"notice":"Called by the registry coordinator to update an operator's stake for one or more quorums. If the operator no longer has the minimum stake required for a quorum, they are added to the `quorumsToRemove`, which is returned to the registry coordinator"},"weightOfOperatorForQuorum(uint8,address)":{"notice":"This function computes the total weight of the @param operator in the quorum @param quorumNumber."}},"version":1}},"settings":{"remappings":["@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/","eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/","eigenlayer-middleware/=lib/eigenlayer-middleware/src/","eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/","erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/eigenlayer-middleware/src/StakeRegistry.sol":"StakeRegistry"},"evmVersion":"london","libraries":{}},"sources":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol":{"keccak256":"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00","urls":["bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983","dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol":{"keccak256":"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9","urls":["bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914","dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol":{"keccak256":"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c","urls":["bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91","dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz"],"license":"CC0-1.0"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol":{"keccak256":"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba","urls":["bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc","dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol":{"keccak256":"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c","urls":["bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8","dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol":{"keccak256":"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f","urls":["bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324","dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol":{"keccak256":"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49","urls":["bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d","dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol":{"keccak256":"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092","urls":["bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c","dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol":{"keccak256":"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79","urls":["bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232","dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol":{"keccak256":"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420","urls":["bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73","dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol":{"keccak256":"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52","urls":["bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef","dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol":{"keccak256":"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377","urls":["bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7","dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol":{"keccak256":"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d","urls":["bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f","dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol":{"keccak256":"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71","urls":["bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f","dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61","urls":["bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354","dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/eigenlayer-middleware/src/StakeRegistry.sol":{"keccak256":"0xb065491d1a4ab43172487534f297369c2eefe9548d6db0cc41f870566f0d6bff","urls":["bzz-raw://53a87f0a1ff6655ae03cc8859c255d5212ad5284e1a7225cb83092116c188327","dweb:/ipfs/QmeURXtkWV5G89qv6wYbEmwqoubb5YzYPRFQ5qpk1GiuaH"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/StakeRegistryStorage.sol":{"keccak256":"0xd0675a2edd88adf10f0e7f6f17f8274b3f660cf891bdd781defb1f229d0144d1","urls":["bzz-raw://8d044348b69a2e71016b196a9011436bfe5c3b48e3942cce4706c0795cab8732","dweb:/ipfs/Qmb1Khrwj57BMmQ71NdMUdXrnTNw9Fnc7k79svkT6HtJ5s"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IBLSApkRegistry.sol":{"keccak256":"0xc07a5edfd95ab4f16f16a8dc8e76eadf4b0e90fe49db90540d01daaad86898c5","urls":["bzz-raw://52b53266450a53da641e82d8ae3be93c5e09f8342b4ea0cc96bb9038d8406354","dweb:/ipfs/QmVuoiQyqPTLCGnyt8zDaxiyaj4ETdgTGKv4MDHWzqEDjp"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IIndexRegistry.sol":{"keccak256":"0x83b2d56aacf27e65c4959a832c5de573e013908c044f6e48ea8284ac5282ae2b","urls":["bzz-raw://877af382587e96bb39bcc6db8bb5e4b871db5025c52347d4bee9afeaa4a6cc8d","dweb:/ipfs/QmdnhsQCChzq2o5NgbeT3JxSsEcMm1PC9QW6zenZNPjD9F"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IRegistry.sol":{"keccak256":"0x51426a17fb7e54bd3720e2890104e97a8559a13ff248b3d6b840916751c143d3","urls":["bzz-raw://01f91289e6100d528cb8b318cb14ff22a0bc52882c9d4db41585e030cc9ddc25","dweb:/ipfs/Qmb22nqGrsrtNovHRwbMCvDHGENuxAgrWu3Db4p7Er2MHY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IRegistryCoordinator.sol":{"keccak256":"0xdd8effb082c1d5957d5ff43d7c59497b32866a6d82bcc7d5efa49ea9bc9b3385","urls":["bzz-raw://cb33a2a1446585b13b7a509e880c60d658d2d2522ec48a9f02e30d2cff54002d","dweb:/ipfs/QmVNG8ZPZkXzNEadPdTj1uBYLiZdCnYfsE5iGU6nJcJXiD"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/interfaces/IStakeRegistry.sol":{"keccak256":"0x1b8b4d757c1b804bc4cf6fbbf8bf8f89ebdeb30a31014751fe7d01deb9d513d4","urls":["bzz-raw://984bf2777b898ed187d28997f9783f5c293a1a1848e3e9aa470ce9183d454c97","dweb:/ipfs/Qme3aTpBrkLu8wYHFMZbCfhXHoZ1M6SpXkeC237T9BuU5B"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/src/libraries/BN254.sol":{"keccak256":"0xb428c8d0c3b325507a88a61a80115493eb88606ccc19ed64a31e11294ab853b3","urls":["bzz-raw://d7b6fb935bfe0494e6ff970c8f30a86d5f4cf5c3e0967300c28cd383c043acae","dweb:/ipfs/QmUHfFZaVjLPXhkBmcxrZhAHZaSFQDqXtrLGpjGBQBa5Ki"],"license":"MIT"},"lib/eigenlayer-middleware/src/libraries/BitmapUtils.sol":{"keccak256":"0x44315ac460be30a6b18fd4df4d1b8afb46653bf4dc06ca9f93c32353fd0605c5","urls":["bzz-raw://da14f2ead3a375b02afd09d4a02edddf7b63a88945746b96789b2473184fdb04","dweb:/ipfs/QmRqcjxa2Vv2MrLdPeAwsktXdWTirapEDsRbJCyYRtKT6g"],"license":"MIT"}},"version":1},"id":123}
\ No newline at end of file
diff --git a/explorer/lib/explorer/contract_managers/stake_registry_manager.ex b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex
index 54e7656cb3..7b501470fb 100644
--- a/explorer/lib/explorer/contract_managers/stake_registry_manager.ex
+++ b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex
@@ -13,7 +13,7 @@ defmodule StakeRegistryManager do
case status do
:ok ->
- Logger.debug("Eigenlayer deployment file read successfully")
+ Logger.debug("Aligned deployment file read successfully")
:error ->
raise(
@@ -26,11 +26,95 @@ defmodule StakeRegistryManager do
|> Map.get("stakeRegistry")
use Ethers.Contract,
- abi_file: "lib/abi/IStakeRegistry.json",
+ abi_file: "lib/abi/StakeRegistry.json",
default_address: @stake_registry_manager
def get_stake_registry_manager() do
@stake_registry_manager
end
+ def get_latest_stake_update(%{fromBlock: fromBlock, operator_id: operator_id}) do
+ StakeRegistryManager.EventFilters.operator_stake_update(operator_id)
+ |> Ethers.get_logs(fromBlock: fromBlock)
+ |> case do
+ {:ok, data} ->
+ List.last(data) # most recent entry
+
+ {:error, reason} ->
+ dbg("Error getting latest operator stake update")
+ dbg(reason)
+
+ other ->
+ dbg("Unexpected response:")
+ dbg(other)
+ end
+ end
+
+ def get_strategies_of_quorum(quorum_number) do
+ "get_strategies_of_quorum" |> dbg
+
+ amount_of_strategies = case StakeRegistryManager.strategy_params_length(quorum_number) |> Ethers.call() do
+ {:ok, amount} ->
+ amount
+ {:error, error} ->
+ dbg("Error fetching amount of strategies: #{error}")
+ raise("Error fetching amount of strategies: #{error}")
+ end
+
+ strategies = Enum.reduce(0..(amount_of_strategies - 1), [], fn index, acc ->
+ case StakeRegistryManager.strategies_per_quorum(quorum_number, index) |> Ethers.call() do
+ {:ok, strategy_address} ->
+ [strategy_address | acc]
+ {:error, error} ->
+ dbg("Error fetching strategy at index #{index}: #{error}")
+ acc
+ end
+ end)
+
+ strategies |> Enum.reverse()
+ end
+
end
+
+ # relevant structs:
+ # /// @ struct used to store the stakes of an individual operator or the sum of all operators' stakes, for storage
+ # struct StakeUpdate {
+ # // the block number at which the stake amounts were updated and stored
+ # uint32 updateBlockNumber;
+ # // the block number at which the *next update* occurred.
+ # /// @notice This entry has the value **0** until another update takes place.
+ # uint32 nextUpdateBlockNumber;
+ # // stake weight for the quorum
+ # uint96 stake;
+ # }
+
+ # relevant events:
+
+ # /// @ emitted whenever the stake of `operator` is updated
+ # event OperatorStakeUpdate(
+ # bytes32 indexed operatorId,
+ # uint8 quorumNumber,
+ # uint96 stake
+ # );
+
+ # relevant views:
+# /**
+# * @ This function computes the total weight of the @param operator in the quorum @param quorumNumber.
+# */
+# function weightOfOperatorForQuorum(uint8 quorumNumber, address operator) external view returns (uint96);
+
+# /**
+# * @ Returns the most recent stake weight for the `operatorId` for a certain quorum
+# * @dev Function returns an StakeUpdate struct with **every entry equal to 0** in the event that the operator has no stake history
+# */
+# function getLatestStakeUpdate(bytes32 operatorId, uint8 quorumNumber) external view returns (StakeUpdate memory);
+
+# /**
+# * @ Returns the stake weight from the latest entry in `_totalStakeHistory` for quorum `quorumNumber`.
+# */
+# function getCurrentTotalStake(uint8 quorumNumber) external view returns (uint96);
+
+# /**
+# * @ Returns the most recent stake weight for the `operatorId` for quorum `quorumNumber`
+# */
+# function getCurrentStake(bytes32 operatorId, uint8 quorumNumber) external view returns (uint96);
diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex
index d9ec5e801c..5da3a7662c 100644
--- a/explorer/lib/explorer/models/restakings.ex
+++ b/explorer/lib/explorer/models/restakings.ex
@@ -1,11 +1,12 @@
defmodule Restakings do
use Ecto.Schema
import Ecto.Changeset
- # import Ecto.Query
+ import Ecto.Query
schema "restakings" do
- field :operator_id, :integer
- field :amount, :decimal
+ field :operator_id, :binary
+ field :stake, :decimal
+ field :quorum_number, :integer
timestamps()
end
@@ -13,8 +14,59 @@ defmodule Restakings do
@doc false
def changeset(restaking, attrs) do
restaking
- |> cast(attrs, [:operator_id, :amount])
- |> validate_required([:operator_id, :amount])
+ |> cast(attrs, [:operator_id, :stake, :quorum_number])
+ |> validate_required([:operator_id, :stake, :quorum_number])
+ end
+
+ def generate_changeset(%Restakings{} = restaking) do
+ Restakings.changeset(%Restakings{}, Map.from_struct(restaking))
+ end
+
+ def process_restaking_changes(%{fromBlock: from_block}) do
+ Operators.get_operators()
+ |> Enum.map(fn operator -> StakeRegistryManager.get_latest_stake_update(%{fromBlock: from_block, operator_id: operator.id}) end)
+ |> Enum.map(&parse_stake_update_event/1)
+ |> Enum.map(&insert_or_update_restakings/1)
+ end
+
+ def parse_stake_update_event(%Ethers.Event{} = event) do
+ %Restakings{
+ operator_id: Enum.at(event.topics, 1),
+ quorum_number: Enum.at(event.data, 0),
+ stake: Enum.at(event.data, 1)
+ }
+ end
+
+ def insert_or_update_restakings(%Restakings{} = restaking) do
+ dbg restaking
+ changeset = restaking |> generate_changeset()
+ Quorums.handle_quorum(%Quorums{id: restaking.quorum_number})
+
+ case Restakings.get_by_quorum_and_operator_id(restaking.quorum_number, restaking.operator_id) do
+ nil ->
+ "inserting restaking" |> dbg
+ Explorer.Repo.insert(changeset)
+
+ [] ->
+ "inserting restaking" |> dbg
+ Explorer.Repo.insert(changeset)
+
+ existing_restaking ->
+ "updating restaking" |> dbg
+ Explorer.Repo.update(Ecto.Changeset.change(existing_restaking, changeset.changes))
+
+ end
+ end
+
+ def get_by_quorum_and_operator_id(quorum_number, operator_id) do
+ query = from(
+ r in Restakings,
+ where: r.quorum_number == ^quorum_number
+ and r.operator_id == ^operator_id,
+ select: r
+ )
+
+ Explorer.Repo.one(query)
end
end
From 38a184887059e90d2cfce9873a47774acb4db2c9 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:55:05 -0300
Subject: [PATCH 093/201] feat: periodically now runs necessary info gathering
processes
---
explorer/lib/explorer/periodically.ex | 29 ++++++++++++++++-------
explorer/lib/scripts/fetch_old_batches.ex | 2 +-
2 files changed, 22 insertions(+), 9 deletions(-)
diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex
index c6e6fde6ee..821bb49a59 100644
--- a/explorer/lib/explorer/periodically.ex
+++ b/explorer/lib/explorer/periodically.ex
@@ -12,8 +12,6 @@ defmodule Explorer.Periodically do
end
def send_work() do
- # on restart the server
- AlignedLayerServiceManager.update_restakeable_stratergies()
# once per block
seconds = 12
# send every n seconds
@@ -26,21 +24,25 @@ defmodule Explorer.Periodically do
latest_block_number = AlignedLayerServiceManager.get_latest_block_number()
read_from_block = max(0, latest_block_number - read_block_qty)
- Task.start(fn -> process_blocks_from_to(read_from_block, latest_block_number) end)
+ Task.start(fn -> process_batches(read_from_block, latest_block_number) end)
- # Gets previous unverified batches and checks if they were verified
run_every_n_iterations = 8
new_count = rem(count + 1, run_every_n_iterations)
if new_count == 0 do
Task.start(&process_unverified_batches/0)
- # Task.start(fn -> process_operators(read_from_block) end)
+ Task.start(fn -> process_operators(read_from_block) end)
+ Task.start(fn -> process_quorum_strategy_changes(read_from_block) end)
+ Task.start(fn -> process_restaking_changes(read_from_block) end)
end
- Task.start(fn -> process_operators(read_from_block) end)
+ # process_operators(0)
+ # process_quorum_strategy_changes()
+ # process_restaking_changes(0)
+
{:noreply, new_count}
end
- def process_blocks_from_to(fromBlock, toBlock) do
+ def process_batches(fromBlock, toBlock) do
"Processing from block #{fromBlock} to block #{toBlock}..." |> IO.inspect()
try do
@@ -117,6 +119,17 @@ defmodule Explorer.Periodically do
def process_operators(fromBlock) do
"Processing operators..." |> IO.inspect()
- AVSDirectory.process_operator_data(%{fromBlock: fromBlock})
+ AVSDirectoryManager.process_operator_data(%{fromBlock: fromBlock})
+ end
+
+ def process_quorum_strategy_changes() do
+ "Processing strategy changes..." |> IO.inspect()
+ AlignedLayerServiceManager.update_restakeable_strategies()
+ Quorums.process_quorum_changes()
+ end
+
+ def process_restaking_changes(read_from_block) do
+ "Processing restaking changes..." |> IO.inspect()
+ Restakings.process_restaking_changes(%{fromBlock: read_from_block})
end
end
diff --git a/explorer/lib/scripts/fetch_old_batches.ex b/explorer/lib/scripts/fetch_old_batches.ex
index 56f08e2292..8851d69cc5 100644
--- a/explorer/lib/scripts/fetch_old_batches.ex
+++ b/explorer/lib/scripts/fetch_old_batches.ex
@@ -27,7 +27,7 @@ defmodule Scripts.FetchOldBatches do
"Making old batches request" |> IO.inspect()
"from #{fromBlock} to #{toBlock}" |> IO.inspect()
try do
- Explorer.Periodically.process_blocks_from_to(fromBlock, toBlock)
+ Explorer.Periodically.process_batches(fromBlock, toBlock)
rescue
error -> IO.puts("An error occurred during batch processing*:\n#{inspect(error)}")
end
From 40af693ebc091eb067271931aa73484c5566e422 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:55:32 -0300
Subject: [PATCH 094/201] fix: small bugs on contract managers
---
.../aligned_layer_service_manager.ex | 2 +-
.../lib/explorer/contract_managers/erc20_manager.ex | 12 ++++++++++++
explorer/lib/explorer/models/erc20.ex | 12 ------------
3 files changed, 13 insertions(+), 13 deletions(-)
create mode 100644 explorer/lib/explorer/contract_managers/erc20_manager.ex
delete mode 100644 explorer/lib/explorer/models/erc20.ex
diff --git a/explorer/lib/explorer/contract_managers/aligned_layer_service_manager.ex b/explorer/lib/explorer/contract_managers/aligned_layer_service_manager.ex
index a66ef7593e..e583a9e194 100644
--- a/explorer/lib/explorer/contract_managers/aligned_layer_service_manager.ex
+++ b/explorer/lib/explorer/contract_managers/aligned_layer_service_manager.ex
@@ -228,7 +228,7 @@ defmodule AlignedLayerServiceManager do
end
end
- def update_restakeable_stratergies() do
+ def update_restakeable_strategies() do
case AlignedLayerServiceManager.get_restakeable_strategies() |> Ethers.call() do
{:ok, restakeable_strategies} ->
Strategies.update(restakeable_strategies)
diff --git a/explorer/lib/explorer/contract_managers/erc20_manager.ex b/explorer/lib/explorer/contract_managers/erc20_manager.ex
new file mode 100644
index 0000000000..4f3447333c
--- /dev/null
+++ b/explorer/lib/explorer/contract_managers/erc20_manager.ex
@@ -0,0 +1,12 @@
+defmodule ERC20Manager do
+ use Ethers.Contract,
+ abi_file: "lib/abi/IERC20Metadata.json"
+
+ def symbol(address) do
+ ERC20Manager.symbol() |> Ethers.call(to: address)
+ end
+
+ def name(address) do
+ ERC20Manager.name() |> Ethers.call(to: address)
+ end
+end
diff --git a/explorer/lib/explorer/models/erc20.ex b/explorer/lib/explorer/models/erc20.ex
deleted file mode 100644
index 50883abc47..0000000000
--- a/explorer/lib/explorer/models/erc20.ex
+++ /dev/null
@@ -1,12 +0,0 @@
-defmodule ERC20 do
- use Ethers.Contract,
- abi_file: "lib/abi/IERC20Metadata.json"
-
- def symbol(address) do
- ERC20.symbol() |> Ethers.call(to: address)
- end
-
- def name(address) do
- ERC20.name() |> Ethers.call(to: address)
- end
-end
From 0ba8566b06a7c50e5dd7d1f474a0fc1b19ca323e Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:57:06 -0300
Subject: [PATCH 095/201] refactor: style
---
.../avs_directory_manager.ex | 1 -
.../contract_managers/delegation_manager.ex | 2 +-
.../registry_coordinator_manager.ex | 34 ++++++++-----------
explorer/lib/explorer/models/proofs.ex | 1 -
4 files changed, 15 insertions(+), 23 deletions(-)
diff --git a/explorer/lib/explorer/contract_managers/avs_directory_manager.ex b/explorer/lib/explorer/contract_managers/avs_directory_manager.ex
index 3fe8ba45a9..ca0f23ed06 100644
--- a/explorer/lib/explorer/contract_managers/avs_directory_manager.ex
+++ b/explorer/lib/explorer/contract_managers/avs_directory_manager.ex
@@ -53,7 +53,6 @@ defmodule AVSDirectoryManager do
end
end
-
def get_operator_registration_status_updated_events(%{fromBlock: fromBlock}) do
AVSDirectoryManager.EventFilters.operator_avs_registration_status_updated(
nil, # any operator
diff --git a/explorer/lib/explorer/contract_managers/delegation_manager.ex b/explorer/lib/explorer/contract_managers/delegation_manager.ex
index 004802b42b..f700f3610f 100644
--- a/explorer/lib/explorer/contract_managers/delegation_manager.ex
+++ b/explorer/lib/explorer/contract_managers/delegation_manager.ex
@@ -13,7 +13,7 @@ defmodule DelegationManager do
case status do
:ok ->
- Logger.debug("Eigenlayer deployment file read successfully")
+ Logger.debug("Aligned deployment file read successfully")
:error ->
raise(
diff --git a/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex b/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex
index 4cb9e4b400..10c38a3df3 100644
--- a/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex
+++ b/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex
@@ -13,7 +13,7 @@ defmodule RegistryCoordinatorManager do
case status do
:ok ->
- Logger.debug("Eigenlayer deployment file read successfully")
+ Logger.debug("Aligned deployment file read successfully")
:error ->
raise(
@@ -33,25 +33,6 @@ defmodule RegistryCoordinatorManager do
@registry_coordinator_address
end
- # relevant:
- # /// Emits when an operator is registered
- # event OperatorRegistered(address indexed operator, bytes32 indexed operatorId);
-
- # /// Emits when an operator is deregistered
- # event OperatorDeregistered(address indexed operator, bytes32 indexed operatorId);
-
- # /// @notice Returns the operator struct for the given `operator`
- # function getOperator(address operator) external view returns (OperatorInfo memory);
-
- # /// @notice Returns the operatorId for the given `operator`
- # function getOperatorId(address operator) external view returns (bytes32);
-
- # /// @notice Returns the operator address for the given `operatorId`
- # function getOperatorFromId(bytes32 operatorId) external view returns (address operator);
-
- # /// @notice Returns the status for the given `operator`
- # function getOperatorStatus(address operator) external view returns (IRegistryCoordinator.OperatorStatus);
-
def get_operator_id_from_chain(operator_address) do
case RegistryCoordinatorManager.get_operator_id(Utils.string_to_bytes32(operator_address))
|> Ethers.call() do
@@ -63,3 +44,16 @@ defmodule RegistryCoordinatorManager do
end
end
+
+# relevant:
+# /// Emits when an operator is registered
+# event OperatorRegistered(address indexed operator, bytes32 indexed operatorId);
+
+# /// Emits when an operator is deregistered
+# event OperatorDeregistered(address indexed operator, bytes32 indexed operatorId);
+
+# /// @notice Returns the operator struct for the given `operator`
+# function getOperator(address operator) external view returns (OperatorInfo memory);
+
+# /// @notice Returns the operatorId for the given `operator`
+# function getOperatorId(address operator) external view returns (bytes32);
diff --git a/explorer/lib/explorer/models/proofs.ex b/explorer/lib/explorer/models/proofs.ex
index c73467b49e..eebc9520f6 100644
--- a/explorer/lib/explorer/models/proofs.ex
+++ b/explorer/lib/explorer/models/proofs.ex
@@ -16,7 +16,6 @@ defmodule Proofs do
|> cast(updates, [:batch_merkle_root, :proof_hash])
|> validate_required([:batch_merkle_root, :proof_hash])
|> validate_format(:batch_merkle_root, ~r/0x[a-fA-F0-9]{64}/)
- # |> validate_format(:proof_hash, ~r/0x[a-fA-F0-9]{64}/) //TODO is binary, check size
end
def cast_to_proofs(%BatchDB{} = batch) do
From a8f58d91e19f5d36e3137d41b7c431a8280a9179 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:57:27 -0300
Subject: [PATCH 096/201] feat: strategy_manager
---
.../contract_managers/strategy_manager.ex | 50 +++++++++++++++++++
1 file changed, 50 insertions(+)
create mode 100644 explorer/lib/explorer/contract_managers/strategy_manager.ex
diff --git a/explorer/lib/explorer/contract_managers/strategy_manager.ex b/explorer/lib/explorer/contract_managers/strategy_manager.ex
new file mode 100644
index 0000000000..2b1ba5ea5f
--- /dev/null
+++ b/explorer/lib/explorer/contract_managers/strategy_manager.ex
@@ -0,0 +1,50 @@
+defmodule StrategyManager do
+ require Logger
+
+ use Ethers.Contract,
+ abi_file: "lib/abi/IStrategy.json"
+
+ def fetch_token_address(%Strategies{strategy_address: strategy_address} = strategy) do
+ case StrategyManager.underlying_token() |> Ethers.call(to: strategy_address) do
+ {:ok, "0x"} ->
+ dbg("Strategy has invalid underlying token: #{strategy_address}, token_address: '0x'")
+ {:error, :invalid_token_address}
+ {:ok, token_address} -> %{strategy | token_address: token_address}
+
+ {:error, %{"code" => -32015}} ->
+ dbg("Strategy has no underlying token: #{strategy_address}") # thus, its not a strategy contract
+ {:error, :not_strategy}
+
+ other_error ->
+ dbg("Error fetching token address for #{strategy_address}")
+ dbg(other_error)
+ other_error
+ end
+ end
+
+ def fetch_token_name(%Strategies{token_address: token_address} = strategy) do
+ case ERC20Manager.name(token_address) do
+ {:ok, name} -> %{strategy | name: name}
+ error ->
+ dbg("Error fetching token name")
+ dbg(error)
+ error
+ end
+ end
+ def fetch_token_name({:error, error}) do
+ {:error, error}
+ end
+
+ def fetch_token_symbol(%Strategies{token_address: token_address} = strategy) do
+ case ERC20Manager.symbol(token_address) do
+ {:ok, symbol} -> %{strategy | symbol: symbol}
+ error ->
+ dbg("Error fetching token symbol")
+ dbg(error)
+ error
+ end
+ end
+ def fetch_token_symbol({:error, error}) do
+ {:error, error}
+ end
+end
From a43ec9d34a7a2ba6ecf7fc1e0d065c556b50fa5c Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:57:52 -0300
Subject: [PATCH 097/201] feat: quorums model
---
explorer/lib/explorer/models/quorums.ex | 117 ++++++++++++++++++++++++
1 file changed, 117 insertions(+)
create mode 100644 explorer/lib/explorer/models/quorums.ex
diff --git a/explorer/lib/explorer/models/quorums.ex b/explorer/lib/explorer/models/quorums.ex
new file mode 100644
index 0000000000..9dfb9d6077
--- /dev/null
+++ b/explorer/lib/explorer/models/quorums.ex
@@ -0,0 +1,117 @@
+defmodule Quorums do
+ use Ecto.Schema
+ import Ecto.Changeset
+ import Ecto.Query
+
+ schema "quorums" do
+ many_to_many :strategies, Strategies, join_through: "quorum_strategies"
+ timestamps()
+ end
+
+
+ @doc false
+ # def changeset(x, attrs) do
+ # x
+ # |> cast(attrs, [])
+ # end
+
+ # def generate_changeset(%Quorums{} = quorum) do
+ # end
+
+ def process_quorum_changes() do
+ our_quorums = get_all_quorums()
+
+ Enum.each(our_quorums, &handle_quorum/1)
+ end
+
+ def handle_quorum(%Quorums{} = quorum) do
+ strategy_addresses = StakeRegistryManager.get_strategies_of_quorum(quorum.id)
+
+ insert_quorum_if_not_present(quorum)
+
+ Enum.each(strategy_addresses,
+ fn strategy_address ->
+ QuorumStrategies.insert_quorum_strategy(
+ quorum,
+ Strategies.get_by_strategy_address(strategy_address)
+ )
+ end)
+
+ quorum
+ end
+
+ def insert_quorum_if_not_present(%Quorums{} = quorum) do
+ dbg "inserting quorum?"
+ case get_quorum_by_id(quorum.id) do
+ nil ->
+ dbg "inserted quorum"
+ Explorer.Repo.insert(quorum)
+ _ ->
+ nil
+ end
+ end
+
+ def get_quorum_by_id(quorum_id) do
+ query = from(q in Quorums,
+ where: q.id == ^quorum_id,
+ select: q)
+ Explorer.Repo.one(query)
+ end
+
+ def get_all_quorums() do
+ query = from(q in Quorums,
+ select: q)
+ Explorer.Repo.all(query)
+ end
+end
+
+defmodule QuorumStrategies do
+ use Ecto.Schema
+ import Ecto.Changeset
+ import Ecto.Query
+
+ schema "quorum_strategies" do
+ belongs_to :quorum, Quorum
+ belongs_to :strategy, Strategy
+ timestamps()
+ end
+
+ def changeset(quorum_strategy, attrs) do
+ quorum_strategy
+ |> cast(attrs, [:quorum_id, :strategy_id])
+ |> validate_required([:quorum_id, :strategy_id])
+ |> unique_constraint([:quorum_id, :strategy_id])
+ end
+
+ def generate_changeset(quorum_id, strategy_id) do
+ QuorumStrategies.changeset(%QuorumStrategies{}, Map.from_struct(%QuorumStrategies{quorum_id: quorum_id, strategy_id: strategy_id})) |> tap(&dbg/1)
+ end
+
+
+ def get_quorum_strategy_associations(%Quorums{} = quorum) do
+ dbg "get_quorum_strategy_associations"
+ dbg quorum
+ query = from(qs in "quorum_strategies",
+ where: qs.quorum_id == ^quorum.id,
+ select: qs.strategy_id)
+ Explorer.Repo.all(query)
+ end
+
+ def insert_quorum_strategy(%Quorums{} = quorum, %Strategies{} = strategy) do
+ dbg "pre inserting quorum-strategy"
+
+ existing_strategies = QuorumStrategies.get_quorum_strategy_associations(quorum)
+ dbg "existing_strategies: #{inspect(existing_strategies)}"
+ dbg "strategy: #{inspect(strategy)}"
+
+ unless strategy.id in existing_strategies do
+ dbg "inserting quorum-strategy"
+ QuorumStrategies.generate_changeset(quorum.id, strategy.id) |> Explorer.Repo.insert() |> dbg
+ dbg "done"
+ end
+ end
+ def insert_quorum_strategy(_any, nil) do
+ dbg "trying to insert a nil or errored strategy, skipping"
+ nil
+ end
+end
From ae0599313eef154b3c9a91adda055a92d0c2aa05 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:59:39 -0300
Subject: [PATCH 098/201] fix: strategies model
---
explorer/lib/explorer/models/strategies.ex | 55 ++--------------------
1 file changed, 4 insertions(+), 51 deletions(-)
diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex
index 5861998949..a4601582b5 100644
--- a/explorer/lib/explorer/models/strategies.ex
+++ b/explorer/lib/explorer/models/strategies.ex
@@ -3,8 +3,6 @@ defmodule Strategies do
import Ecto.Changeset
import Ecto.Query
- use Ethers.Contract,
- abi_file: "lib/abi/IStrategy.json"
schema "strategies" do
field :strategy_address, :binary
@@ -12,6 +10,7 @@ defmodule Strategies do
field :name, :string
field :symbol, :string
field :total_staked, :decimal
+ many_to_many :quorums, Quorums, join_through: "quorum_strategies"
timestamps()
end
@@ -46,60 +45,14 @@ defmodule Strategies do
def extract_info(strategy_address) do
%Strategies{strategy_address: strategy_address}
- |> fetch_token_address()
- |> fetch_token_name()
- |> fetch_token_symbol()
- |> tap(&dbg/1)
+ |> StrategyManager.fetch_token_address()
+ |> StrategyManager.fetch_token_name()
+ |> StrategyManager.fetch_token_symbol()
# Total stake is set when inserting rows to `Restakings` table
end
- defp fetch_token_address(%Strategies{strategy_address: strategy_address} = strategy) do
- case Strategies.underlying_token() |> Ethers.call(to: strategy_address) do
- {:ok, "0x"} ->
- dbg("Strategy has invalid underlying token: #{strategy_address}, token_address: '0x'")
- {:error, :invalid_token_address}
- {:ok, token_address} -> %{strategy | token_address: token_address}
-
- {:error, %{"code" => -32015}} ->
- dbg("Strategy has no underlying token: #{strategy_address}") # thus, its not a strategy contract
- {:error, :not_strategy}
-
- other_error ->
- dbg("Error fetching token address for #{strategy_address}")
- dbg(other_error)
- other_error
- end
- end
-
- defp fetch_token_name(%Strategies{token_address: token_address} = strategy) do
- case ERC20.name(token_address) do
- {:ok, name} -> %{strategy | name: name}
- error ->
- dbg("Error fetching token name")
- dbg(error)
- error
- end
- end
- defp fetch_token_name({:error, error}) do
- {:error, error}
- end
-
- defp fetch_token_symbol(%Strategies{token_address: token_address} = strategy) do
- case ERC20.symbol(token_address) do
- {:ok, symbol} -> %{strategy | symbol: symbol}
- error ->
- dbg("Error fetching token symbol")
- dbg(error)
- error
- end
- end
- defp fetch_token_symbol({:error, error}) do
- {:error, error}
- end
-
def add_strategy(%Strategies{} = new_strategy) do
dbg("adding strategy")
- dbg(new_strategy)
Strategies.generate_changeset(new_strategy) |> Explorer.Repo.insert()
end
def add_strategy({:error, _error}) do
From 64fd480919fdc476f4b05a94cc8b1edb8c010c2e Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 17:59:48 -0300
Subject: [PATCH 099/201] feat: hex_string_to_int util
---
explorer/lib/explorer_web/live/utils.ex | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex
index 7d43881373..45e719a8f6 100644
--- a/explorer/lib/explorer_web/live/utils.ex
+++ b/explorer/lib/explorer_web/live/utils.ex
@@ -116,6 +116,10 @@ defmodule Utils do
end
end
+ def hex_string_to_int(hex_string) do
+ hex_string |> String.replace_prefix("0x", "") |> String.to_integer(16)
+ end
+
def get_last_n_items(events, n) when is_list(events) and is_integer(n) and n >= 0 do
events
|> Enum.reverse()
From a5ed7f22ba9d97be14fd49e994e988868d5d4b02 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 18:00:37 -0300
Subject: [PATCH 100/201] fix: make explorer_fetch_old_operators
---
Makefile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Makefile b/Makefile
index ec447e14d9..565945973d 100644
--- a/Makefile
+++ b/Makefile
@@ -666,8 +666,8 @@ explorer_fetch_old_batches:
explorer_fetch_old_operators:
@cd explorer && \
- ./scripts/fetch_old_operators.sh 0
-# ./scripts/fetch_old_operators.sh 1728056
+ ./scripts/fetch_old_operators.sh 1728056
+# ./scripts/fetch_old_operators.sh 0 or 1728056
explorer_fetch_restakeable_strategies:
@cd explorer && \
From 7e42cac7a5ef385363c4f6f07537766ed9d78560 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 18:26:41 -0300
Subject: [PATCH 101/201] feat: migration script
---
Makefile | 4 ++--
explorer/lib/explorer/models/quorums.ex | 2 +-
explorer/lib/explorer/periodically.ex | 2 +-
explorer/lib/scripts/fetch_old_operators.ex | 12 ----------
...fetch_old_operators_strategies_restakes.ex | 23 +++++++++++++++++++
...etch_old_operators_strategies_restakes.sh} | 2 +-
6 files changed, 28 insertions(+), 17 deletions(-)
delete mode 100644 explorer/lib/scripts/fetch_old_operators.ex
create mode 100644 explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex
rename explorer/scripts/{fetch_old_operators.sh => fetch_old_operators_strategies_restakes.sh} (90%)
diff --git a/Makefile b/Makefile
index 8dc8bf0f56..ed57f5a8d4 100644
--- a/Makefile
+++ b/Makefile
@@ -664,9 +664,9 @@ explorer_fetch_old_batches:
@cd explorer && \
./scripts/fetch_old_batches.sh 1728056 1729806
-explorer_fetch_old_operators:
+explorer_fetch_old_operators_strategies_restakes:
@cd explorer && \
- ./scripts/fetch_old_operators.sh 1728056
+ ./scripts/fetch_old_operators_strategies_restakes.sh 1728056
# ./scripts/fetch_old_operators.sh 0 or 1728056
explorer_fetch_restakeable_strategies:
diff --git a/explorer/lib/explorer/models/quorums.ex b/explorer/lib/explorer/models/quorums.ex
index 9dfb9d6077..0199439fc1 100644
--- a/explorer/lib/explorer/models/quorums.ex
+++ b/explorer/lib/explorer/models/quorums.ex
@@ -72,7 +72,7 @@ defmodule QuorumStrategies do
schema "quorum_strategies" do
belongs_to :quorum, Quorum
- belongs_to :strategy, Strategy
+ belongs_to :strategy, Strategies
timestamps()
end
diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex
index 821bb49a59..13204f6bb4 100644
--- a/explorer/lib/explorer/periodically.ex
+++ b/explorer/lib/explorer/periodically.ex
@@ -31,7 +31,7 @@ defmodule Explorer.Periodically do
if new_count == 0 do
Task.start(&process_unverified_batches/0)
Task.start(fn -> process_operators(read_from_block) end)
- Task.start(fn -> process_quorum_strategy_changes(read_from_block) end)
+ Task.start(fn -> process_quorum_strategy_changes() end)
Task.start(fn -> process_restaking_changes(read_from_block) end)
end
# process_operators(0)
diff --git a/explorer/lib/scripts/fetch_old_operators.ex b/explorer/lib/scripts/fetch_old_operators.ex
deleted file mode 100644
index 7f13b47882..0000000000
--- a/explorer/lib/scripts/fetch_old_operators.ex
+++ /dev/null
@@ -1,12 +0,0 @@
-defmodule Scripts.FetchOldOperators do
-
- # This Script is to fetch old operators from the blockchain activity
- # and insert them into the Ecto database
-
- def run(fromBlock) do
- "running fetch_old_operators" |> IO.inspect()
- AVSDirectoryManager.process_operator_data(%{fromBlock: fromBlock})
- "done running fetch_old_operators" |> IO.inspect()
- end
-
-end
diff --git a/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex b/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex
new file mode 100644
index 0000000000..6f06aa7338
--- /dev/null
+++ b/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex
@@ -0,0 +1,23 @@
+defmodule Scripts.FetchOldOperatorsStrategiesRestakes do
+
+ # This Script is to fetch old operators from the blockchain activity
+ # and insert them into the Ecto database
+
+ def run(fromBlock) do
+ # "running fetch_old_operators" |> IO.inspect()
+ # AVSDirectoryManager.process_operator_data(%{fromBlock: fromBlock})
+ # "done running fetch_old_operators" |> IO.inspect()
+
+ dbg "fetching old operators"
+ Explorer.Periodically.process_operators(fromBlock)
+
+ dbg "fetching old quorum strategy changes"
+ Explorer.Periodically.process_quorum_strategy_changes()
+
+ dbg "fetching old restaking changes"
+ Explorer.Periodically.process_restaking_changes(fromBlock)
+
+ dbg "done"
+ end
+
+end
diff --git a/explorer/scripts/fetch_old_operators.sh b/explorer/scripts/fetch_old_operators_strategies_restakes.sh
similarity index 90%
rename from explorer/scripts/fetch_old_operators.sh
rename to explorer/scripts/fetch_old_operators_strategies_restakes.sh
index a0198c411e..eb6c57f05b 100755
--- a/explorer/scripts/fetch_old_operators.sh
+++ b/explorer/scripts/fetch_old_operators_strategies_restakes.sh
@@ -27,4 +27,4 @@ echo "Running fetch_old_operators.sh from block: $FROM"
mix compile --force #force recompile to get the latest .env values
-iex --sname fetch_old_operators --remsh explorer@$ELIXIR_HOSTNAME -S mix run -e "Scripts.FetchOldOperators.run($FROM)"
+iex --sname fetch_old_operators --remsh explorer@$ELIXIR_HOSTNAME -S mix run -e "Scripts.FetchOldOperatorsStrategiesRestakes.run($FROM)"
From 3fa48db674361843801353d5e8c1754ba2c2e63f Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 18:30:58 -0300
Subject: [PATCH 102/201] feat: get_all_strategies
---
explorer/lib/explorer/models/strategies.ex | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex
index a4601582b5..9874a3bf3a 100644
--- a/explorer/lib/explorer/models/strategies.ex
+++ b/explorer/lib/explorer/models/strategies.ex
@@ -59,4 +59,10 @@ defmodule Strategies do
:nil
end
+ def get_all_strategies() do
+ query = from(s in Strategies,
+ select: s)
+ Explorer.Repo.all(query)
+ end
+
end
From e07ad3e8b899c01d858d6805bd8de5849fa00409 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 18:33:49 -0300
Subject: [PATCH 103/201] feat: get_aggregated_restakings
---
explorer/lib/explorer/models/restakings.ex | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex
index 5da3a7662c..60fe2fcd5c 100644
--- a/explorer/lib/explorer/models/restakings.ex
+++ b/explorer/lib/explorer/models/restakings.ex
@@ -69,4 +69,13 @@ defmodule Restakings do
Explorer.Repo.one(query)
end
+ def get_aggregated_restakings() do
+ query = from(
+ r in Restakings,
+ select: %{total_stake: sum(r.stake)}
+ )
+
+ Explorer.Repo.all(query)
+ end
+
end
From c200b6a49f776188ed003e655eb3f5e509c8d4b7 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 18:35:59 -0300
Subject: [PATCH 104/201] feat: get restakes of operators
---
explorer/lib/explorer/models/restakings.ex | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex
index 60fe2fcd5c..bbe1ec9dfc 100644
--- a/explorer/lib/explorer/models/restakings.ex
+++ b/explorer/lib/explorer/models/restakings.ex
@@ -78,4 +78,24 @@ defmodule Restakings do
Explorer.Repo.all(query)
end
+ def get_restakes_by_operator(operator_id) do
+ query = from(
+ r in Restakings,
+ where: r.operator_id == ^operator_id,
+ select: r
+ )
+
+ Explorer.Repo.all(query)
+ end
+
+ def get_aggregated_restake_by_operator(operator_id) do
+ query = from(
+ r in Restakings,
+ where: r.operator_id == ^operator_id,
+ select: %{total_stake: sum(r.stake)}
+ )
+
+ Explorer.Repo.one(query)
+ end
+
end
From fb8e7f4beebaf7b69f47473ca6e1e3051a914211 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Wed, 7 Aug 2024 18:48:27 -0300
Subject: [PATCH 105/201] fix(home): grid after merge
---
explorer/lib/explorer_web/components/contracts.ex | 4 +++-
explorer/lib/explorer_web/live/pages/home/index.html.heex | 2 +-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/explorer/lib/explorer_web/components/contracts.ex b/explorer/lib/explorer_web/components/contracts.ex
index 4e1c12fa33..141f29d7eb 100644
--- a/explorer/lib/explorer_web/components/contracts.ex
+++ b/explorer/lib/explorer_web/components/contracts.ex
@@ -1,6 +1,8 @@
defmodule ContractsComponent do
use ExplorerWeb, :live_component
+ attr :class, :string, default: nil
+
@impl true
def mount(socket) do
{:ok,
@@ -16,7 +18,7 @@ defmodule ContractsComponent do
@impl true
def render(assigns) do
~H"""
-
+
<.card
inner_class="text-base leading-9 flex flex-wrap sm:flex-row overflow-x-auto gap-x-2"
title="Contract Addresses"
diff --git a/explorer/lib/explorer_web/live/pages/home/index.html.heex b/explorer/lib/explorer_web/live/pages/home/index.html.heex
index fd0002b31c..8dda33c168 100644
--- a/explorer/lib/explorer_web/live/pages/home/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/home/index.html.heex
@@ -32,7 +32,7 @@
0
<% end %>
- <.live_component module={ContractsComponent} id="contracts_card" />
+ <.live_component module={ContractsComponent} id="contracts_card" class="sm:col-span-2" />
<%= if @latest_batches != :empty and @latest_batches != [] do %>
<.card
class="relative sm:col-span-2 w-full flex flex-col space-y-1"
From 1da0c88dcc70d8a900d1922bc19a6381a6587e5d Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 18:54:00 -0300
Subject: [PATCH 106/201] remove: make explorer_fetch_restakeable_strategies
---
Makefile | 4 ----
.../scripts/fetch_restakeable_strategies.sh | 17 -----------------
2 files changed, 21 deletions(-)
delete mode 100755 explorer/scripts/fetch_restakeable_strategies.sh
diff --git a/Makefile b/Makefile
index b72dcc4db4..055b75eb17 100644
--- a/Makefile
+++ b/Makefile
@@ -664,7 +664,3 @@ explorer_fetch_old_operators_strategies_restakes:
@cd explorer && \
./scripts/fetch_old_operators_strategies_restakes.sh 1728056
# ./scripts/fetch_old_operators.sh 0 or 1728056
-
-explorer_fetch_restakeable_strategies:
- @cd explorer && \
- ./scripts/fetch_restakeable_strategies.sh
diff --git a/explorer/scripts/fetch_restakeable_strategies.sh b/explorer/scripts/fetch_restakeable_strategies.sh
deleted file mode 100755
index 0391a37962..0000000000
--- a/explorer/scripts/fetch_restakeable_strategies.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-
-source .env
-
-export ENVIRONMENT=$ENVIRONMENT
-export RPC_URL=$RPC_URL
-export PHX_HOST=$PHX_HOST
-export DB_NAME=$DB_NAME
-export DB_USER=$DB_USER
-export DB_PASS=$DB_PASS
-export DB_HOST=$DB_HOST
-export ELIXIR_HOSTNAME=$ELIXIR_HOSTNAME
-export ALIGNED_CONFIG_FILE=$ALIGNED_CONFIG_FILE
-
-mix compile --force #force recompile to get the latest .env values
-
-iex --sname fetch_restakeable_strategies --remsh explorer@$ELIXIR_HOSTNAME -S mix run -e "AlignedLayerServiceManager.update_restakeable_stratergies()"
From d6e22d0ba05fc6bba5734d3511b16cfb954fb78f Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Wed, 7 Aug 2024 19:07:24 -0300
Subject: [PATCH 107/201] fix: aggregated_restakings no longer an array
---
explorer/lib/explorer/models/restakings.ex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex
index bbe1ec9dfc..69ce67a430 100644
--- a/explorer/lib/explorer/models/restakings.ex
+++ b/explorer/lib/explorer/models/restakings.ex
@@ -75,7 +75,7 @@ defmodule Restakings do
select: %{total_stake: sum(r.stake)}
)
- Explorer.Repo.all(query)
+ Explorer.Repo.one(query)
end
def get_restakes_by_operator(operator_id) do
From 200533d0ce68a282837f324d52f7a77de7c0f52d Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Wed, 7 Aug 2024 19:26:28 -0300
Subject: [PATCH 108/201] feat(home): display restaked amount
---
.../lib/explorer_web/live/pages/home/index.ex | 17 +++++++++++++++--
.../live/pages/home/index.html.heex | 6 +++---
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/explorer/lib/explorer_web/live/pages/home/index.ex b/explorer/lib/explorer_web/live/pages/home/index.ex
index cf001ad411..57b31bb3d1 100644
--- a/explorer/lib/explorer_web/live/pages/home/index.ex
+++ b/explorer/lib/explorer_web/live/pages/home/index.ex
@@ -15,13 +15,20 @@ defmodule ExplorerWeb.Home.Index do
verified_proofs = Batches.get_amount_of_verified_proofs()
+ restaked_amount =
+ Restakings.get_aggregated_restakings()
+ |> Map.get(:total_stake)
+ |> Decimal.to_integer()
+ |> EthConverter.wei_to_eth(2)
+
{:noreply,
assign(
socket,
verified_batches: verified_batches,
operators_registered: operators_registered,
latest_batches: latest_batches,
- verified_proofs: verified_proofs
+ verified_proofs: verified_proofs,
+ restaked_amount: restaked_amount
)}
end
@@ -38,6 +45,12 @@ defmodule ExplorerWeb.Home.Index do
verified_proofs = Batches.get_amount_of_verified_proofs()
+ restaked_amount =
+ Restakings.get_aggregated_restakings()
+ |> Map.get(:total_stake)
+ |> Decimal.to_integer()
+ |> EthConverter.wei_to_eth(2)
+
if connected?(socket), do: Phoenix.PubSub.subscribe(Explorer.PubSub, "update_views")
{:ok,
@@ -48,7 +61,7 @@ defmodule ExplorerWeb.Home.Index do
verified_proofs: verified_proofs,
service_manager_address:
AlignedLayerServiceManager.get_aligned_layer_service_manager_address(),
- network: System.get_env("ENVIRONMENT"),
+ restaked_amount: restaked_amount,
page_title: "Welcome"
)}
rescue
diff --git a/explorer/lib/explorer_web/live/pages/home/index.html.heex b/explorer/lib/explorer_web/live/pages/home/index.html.heex
index 8dda33c168..1c9dc18b46 100644
--- a/explorer/lib/explorer_web/live/pages/home/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/home/index.html.heex
@@ -12,10 +12,10 @@
<% end %>
<.card_link navigate={~p"/assets"} title="Total ETH Restaked">
- <%= if @operators_registered != :empty do %>
- ?
+ <%= if @restaked_amount != :nil and @restaked_amount != :nil do %>
+ <%= @restaked_amount %>
<% else %>
- ?
+ 0
<% end %>
<.card title="verified batches">
From e2b0c98afe2d928dc5018008e7ad9737dc1cf50d Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Wed, 7 Aug 2024 20:03:25 -0300
Subject: [PATCH 109/201] feat(operator-detail): add aggregated restake in eth
---
.../explorer_web/live/pages/batch/index.ex | 6 +-
.../lib/explorer_web/live/pages/home/index.ex | 8 +-
.../live/pages/home/index.html.heex | 4 +-
.../explorer_web/live/pages/operator/index.ex | 75 ++++++++++++++++++-
.../live/pages/operator/index.html.heex | 44 -----------
.../live/pages/operators/index.ex | 6 ++
6 files changed, 85 insertions(+), 58 deletions(-)
delete mode 100644 explorer/lib/explorer_web/live/pages/operator/index.html.heex
diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex
index 7e91c15b5d..45bb1499c5 100644
--- a/explorer/lib/explorer_web/live/pages/batch/index.ex
+++ b/explorer/lib/explorer_web/live/pages/batch/index.ex
@@ -3,9 +3,7 @@ defmodule ExplorerWeb.Batch.Index do
use ExplorerWeb, :live_view
@impl true
- def mount(params, _, socket) do
- merkle_root = params["merkle_root"]
-
+ def mount(%{"merkle_root" => merkle_root}, _, socket) do
if connected?(socket), do: Phoenix.PubSub.subscribe(Explorer.PubSub, "update_views")
current_batch =
@@ -109,6 +107,4 @@ defmodule ExplorerWeb.Batch.Index do
nil
end
end
-
- embed_templates "*"
end
diff --git a/explorer/lib/explorer_web/live/pages/home/index.ex b/explorer/lib/explorer_web/live/pages/home/index.ex
index 57b31bb3d1..4702b2541d 100644
--- a/explorer/lib/explorer_web/live/pages/home/index.ex
+++ b/explorer/lib/explorer_web/live/pages/home/index.ex
@@ -15,7 +15,7 @@ defmodule ExplorerWeb.Home.Index do
verified_proofs = Batches.get_amount_of_verified_proofs()
- restaked_amount =
+ restaked_amount_eth =
Restakings.get_aggregated_restakings()
|> Map.get(:total_stake)
|> Decimal.to_integer()
@@ -28,7 +28,7 @@ defmodule ExplorerWeb.Home.Index do
operators_registered: operators_registered,
latest_batches: latest_batches,
verified_proofs: verified_proofs,
- restaked_amount: restaked_amount
+ restaked_amount_eth: restaked_amount_eth
)}
end
@@ -45,7 +45,7 @@ defmodule ExplorerWeb.Home.Index do
verified_proofs = Batches.get_amount_of_verified_proofs()
- restaked_amount =
+ restaked_amount_eth =
Restakings.get_aggregated_restakings()
|> Map.get(:total_stake)
|> Decimal.to_integer()
@@ -61,7 +61,7 @@ defmodule ExplorerWeb.Home.Index do
verified_proofs: verified_proofs,
service_manager_address:
AlignedLayerServiceManager.get_aligned_layer_service_manager_address(),
- restaked_amount: restaked_amount,
+ restaked_amount_eth: restaked_amount_eth,
page_title: "Welcome"
)}
rescue
diff --git a/explorer/lib/explorer_web/live/pages/home/index.html.heex b/explorer/lib/explorer_web/live/pages/home/index.html.heex
index 1c9dc18b46..7cb39efd21 100644
--- a/explorer/lib/explorer_web/live/pages/home/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/home/index.html.heex
@@ -12,8 +12,8 @@
<% end %>
<.card_link navigate={~p"/assets"} title="Total ETH Restaked">
- <%= if @restaked_amount != :nil and @restaked_amount != :nil do %>
- <%= @restaked_amount %>
+ <%= if @restaked_amount_eth != :nil and @restaked_amount_eth != :nil do %>
+ <%= @restaked_amount_eth %>
<% else %>
0
<% end %>
diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex
index 7eef3576e3..eb33e4257b 100644
--- a/explorer/lib/explorer_web/live/pages/operator/index.ex
+++ b/explorer/lib/explorer_web/live/pages/operator/index.ex
@@ -2,9 +2,78 @@ defmodule ExplorerWeb.Operator.Index do
use ExplorerWeb, :live_view
@impl true
- def mount(params, _, socket) do
- address = params["address"]
+ def mount(%{"address" => address}, _, socket) do
operator = Operators.get_operator_by_address(address)
- {:ok, assign(socket, operator: operator, page_title: "Operators")}
+
+ restaked_amount_eth =
+ Restakings.get_aggregated_restake_by_operator(operator.id)
+ |> Map.get(:total_stake)
+ |> Decimal.to_integer()
+ |> EthConverter.wei_to_eth(2)
+
+ {:ok,
+ assign(socket,
+ operator: operator,
+ restaked_amount_eth: restaked_amount_eth,
+ page_title: operator.name
+ )}
+ end
+
+ @impl true
+ def render(assigns) do
+ ~H"""
+
+ <.card_preheding class="text-4xl sm:text-5xl font-bold font-foreground">
+ Operator Details
+
+ <.card
+ class="px-4 py-5 min-h-fit flex flex-col"
+ inner_class="font-semibold inline-flex flex-col text-base gap-y-2 text-muted-foreground [&>div>p]:text-foreground [&>p]:text-foreground [&>a]:text-foreground [&>*]:break-all [&>*]:font-normal"
+ >
+
+ 
+
+
+ <%= @operator.name %>
+
+
+ <%= @operator.description %>
+
+ <.a href={@operator.website} target="_blank" rel="noopener">
+ Website
+
+ <.a href={@operator.twitter} target="_blank" rel="noopener">
+ X/Twitter
+
+ <.a
+ href={
+ "#{Utils.get_eigenlayer_explorer_url()}/operator/#{@operator.address}"
+ }
+ target="_blank"
+ rel="noopener"
+ >
+ EigenLayer Profile
+
+
+
+ Address:
+
+ <%= @operator.address %>
+
+
+
+ Total Restaked:
+
+
+ <%= @restaked_amount_eth %> ETH
+
+
+
+
+ """
end
end
diff --git a/explorer/lib/explorer_web/live/pages/operator/index.html.heex b/explorer/lib/explorer_web/live/pages/operator/index.html.heex
deleted file mode 100644
index 7b873ecf94..0000000000
--- a/explorer/lib/explorer_web/live/pages/operator/index.html.heex
+++ /dev/null
@@ -1,44 +0,0 @@
-
- <.card_preheding class="text-4xl sm:text-5xl font-bold font-foreground">
- Operator Details
-
- <.card
- class="px-4 py-5 min-h-fit flex flex-col"
- inner_class="font-semibold inline-flex flex-col text-base gap-y-2 text-muted-foreground [&>p]:text-foreground [&>a]:text-foreground [&>*]:break-all [&>*]:font-normal"
- >
-
- 
-
-
- <%= @operator.name %>
-
-
- <%= @operator.description %>
-
- <.a href={@operator.website} target="_blank" rel="noopener">
- Website
-
- <.a href={@operator.twitter} target="_blank" rel="noopener">
- X/Twitter
-
- <.a
- href={
- "#{Utils.get_eigenlayer_explorer_url()}/operator/#{@operator.address}"
- }
- target="_blank"
- rel="noopener"
- >
- EigenLayer Profile
-
-
-
- Address:
-
- <%= @operator.address %>
-
-
-
diff --git a/explorer/lib/explorer_web/live/pages/operators/index.ex b/explorer/lib/explorer_web/live/pages/operators/index.ex
index c1a7d2ba5b..b07c0d6a25 100644
--- a/explorer/lib/explorer_web/live/pages/operators/index.ex
+++ b/explorer/lib/explorer_web/live/pages/operators/index.ex
@@ -1,6 +1,12 @@
defmodule ExplorerWeb.Operators.Index do
use ExplorerWeb, :live_view
+ @impl true
+ def handle_info(_, socket) do
+ operators = Operators.get_operators()
+ {:noreply, assign(socket, operators: operators)}
+ end
+
@impl true
def mount(_, _, socket) do
{:ok, assign(socket, page_title: "Operators")}
From 7e335695db72b02f22b9f70c3a9281534158ceab Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Thu, 8 Aug 2024 12:03:27 -0300
Subject: [PATCH 110/201] feat: handling of native eth restaking
---
.../lib/explorer/contract_managers/erc20_manager.ex | 6 ++++++
.../explorer/contract_managers/strategy_manager.ex | 12 ++++++------
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/explorer/lib/explorer/contract_managers/erc20_manager.ex b/explorer/lib/explorer/contract_managers/erc20_manager.ex
index 4f3447333c..bc851b918f 100644
--- a/explorer/lib/explorer/contract_managers/erc20_manager.ex
+++ b/explorer/lib/explorer/contract_managers/erc20_manager.ex
@@ -2,10 +2,16 @@ defmodule ERC20Manager do
use Ethers.Contract,
abi_file: "lib/abi/IERC20Metadata.json"
+ def symbol("0x") do
+ {:ok, "ETH"}
+ end
def symbol(address) do
ERC20Manager.symbol() |> Ethers.call(to: address)
end
+ def name("0x") do
+ {:ok, "Native ETH"}
+ end
def name(address) do
ERC20Manager.name() |> Ethers.call(to: address)
end
diff --git a/explorer/lib/explorer/contract_managers/strategy_manager.ex b/explorer/lib/explorer/contract_managers/strategy_manager.ex
index 2b1ba5ea5f..4190e0e62a 100644
--- a/explorer/lib/explorer/contract_managers/strategy_manager.ex
+++ b/explorer/lib/explorer/contract_managers/strategy_manager.ex
@@ -6,9 +6,9 @@ defmodule StrategyManager do
def fetch_token_address(%Strategies{strategy_address: strategy_address} = strategy) do
case StrategyManager.underlying_token() |> Ethers.call(to: strategy_address) do
- {:ok, "0x"} ->
- dbg("Strategy has invalid underlying token: #{strategy_address}, token_address: '0x'")
- {:error, :invalid_token_address}
+ {:ok, "0x"} -> # Strategy is native ETH
+ %{strategy | token_address: "0x"} #storing "0x" as its token address, and handling its cases in ERC20Manager
+
{:ok, token_address} -> %{strategy | token_address: token_address}
{:error, %{"code" => -32015}} ->
@@ -16,9 +16,9 @@ defmodule StrategyManager do
{:error, :not_strategy}
other_error ->
- dbg("Error fetching token address for #{strategy_address}")
- dbg(other_error)
- other_error
+ dbg("Error fetching token address for #{strategy_address}")
+ dbg(other_error)
+ other_error
end
end
From e085151fd7123cf0d6325b845e9fe8dc80fdef27 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Thu, 8 Aug 2024 14:30:40 -0300
Subject: [PATCH 111/201] style: add arrow icon on internal links
---
.../components/core_components.ex | 3 ++-
.../live/pages/home/index.html.heex | 4 ++--
.../live/pages/operators/index.html.heex | 21 +++++++++++--------
3 files changed, 16 insertions(+), 12 deletions(-)
diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex
index 45a6fc6f9d..896f8f9b07 100644
--- a/explorer/lib/explorer_web/components/core_components.ex
+++ b/explorer/lib/explorer_web/components/core_components.ex
@@ -323,6 +323,7 @@ defmodule ExplorerWeb.CoreComponents do
attr :title, :string, default: nil
attr :href, :string, default: nil
attr :rest, :global, include: ~w(href target navigate)
+ attr :icon, :string, default: "hero-arrow-top-right-on-square-solid"
slot :inner_block, default: nil
@@ -332,7 +333,7 @@ defmodule ExplorerWeb.CoreComponents do
<.card_background class={@class}>
<%= @title %>
- <.icon name="hero-arrow-top-right-on-square-solid" class="size-4" />
+ <.icon name={@icon} class="size-4 mb-1" />
<%= render_slot(@inner_block) %>
diff --git a/explorer/lib/explorer_web/live/pages/home/index.html.heex b/explorer/lib/explorer_web/live/pages/home/index.html.heex
index 7cb39efd21..9281b5ba48 100644
--- a/explorer/lib/explorer_web/live/pages/home/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/home/index.html.heex
@@ -4,14 +4,14 @@
- <.card_link navigate={~p"/operators"} title="Registered Operators">
+ <.card_link icon="hero-arrow-right-solid" navigate={~p"/operators"} title="Registered Operators">
<%= if @operators_registered != :empty do %>
<%= @operators_registered %>
<% else %>
0
<% end %>
- <.card_link navigate={~p"/assets"} title="Total ETH Restaked">
+ <.card_link icon="hero-arrow-right-solid" navigate={~p"/assets"} title="Total ETH Restaked">
<%= if @restaked_amount_eth != :nil and @restaked_amount_eth != :nil do %>
<%= @restaked_amount_eth %>
<% else %>
diff --git a/explorer/lib/explorer_web/live/pages/operators/index.html.heex b/explorer/lib/explorer_web/live/pages/operators/index.html.heex
index 88eb877eee..61ddb232a7 100644
--- a/explorer/lib/explorer_web/live/pages/operators/index.html.heex
+++ b/explorer/lib/explorer_web/live/pages/operators/index.html.heex
@@ -3,15 +3,18 @@
<.table id="operators" rows={@operators}>
<:col :let={operator} label="Name">
<.link navigate={~p"/operators/#{operator.address}"} class="flex gap-x-2">
- 
- <%= operator.name %>
- <.tooltip>
- <%= operator.address %>
-
+
+
+ <%= operator.name %>
+ <.right_arrow />
+ <.tooltip>
+ <%= operator.address %>
+
+
<:col :let={_operator} label="Restake Concentration">
From fb0036449b794d67cc990f80f2feebb46f525a41 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Thu, 8 Aug 2024 16:18:36 -0300
Subject: [PATCH 112/201] chore: remove assets from nav
---
explorer/lib/explorer_web/components/nav.ex | 3 ---
1 file changed, 3 deletions(-)
diff --git a/explorer/lib/explorer_web/components/nav.ex b/explorer/lib/explorer_web/components/nav.ex
index b92cebd066..7e3856056c 100644
--- a/explorer/lib/explorer_web/components/nav.ex
+++ b/explorer/lib/explorer_web/components/nav.ex
@@ -29,9 +29,6 @@ defmodule NavComponent do
>
Operators
- <.link class="text-foreground/80 hover:text-foreground font-semibold" navigate={~p"/assets"}>
- Assets
-
<.live_component module={SearchComponent} id="nav_search" />
From f3ac2468d61f6a3b7df4e7afdd6d6cbfad3ae189 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Thu, 8 Aug 2024 16:18:46 -0300
Subject: [PATCH 113/201] fix: selection text
---
explorer/lib/explorer_web/components/core_components.ex | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex
index 896f8f9b07..d59dc203d6 100644
--- a/explorer/lib/explorer_web/components/core_components.ex
+++ b/explorer/lib/explorer_web/components/core_components.ex
@@ -258,7 +258,7 @@ defmodule ExplorerWeb.CoreComponents do
def root_background(assigns) do
~H"""
-
+
<%= render_slot(@inner_block) %>
From ffe37ba56b9757046ca190d85f1550bc9640e181 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Sat, 10 Aug 2024 20:17:45 -0300
Subject: [PATCH 114/201] feat: operator has total_stake an restakings filled
with each operator restaking
---
explorer/lib/abi/StrategyManager.json | 1 +
.../avs_directory_manager.ex | 33 +------
.../contract_managers/delegation_manager.ex | 51 +++++++----
.../stake_registry_manager.ex | 85 ++++++-------------
.../explorer/contract_managers/strategy.ex | 50 +++++++++++
.../contract_managers/strategy_manager.ex | 61 ++++++-------
explorer/lib/explorer/models/operators.ex | 41 ++++++++-
explorer/lib/explorer/models/quorums.ex | 21 +----
explorer/lib/explorer/models/restakings.ex | 39 ++++-----
explorer/lib/explorer/models/strategies.ex | 15 +++-
explorer/lib/explorer/periodically.ex | 12 +--
explorer/lib/explorer_web/live/utils.ex | 8 +-
...fetch_old_operators_strategies_restakes.ex | 10 +--
.../20240719193311_add_operators_table.exs | 1 +
.../20240719202825_add_restakings_table.exs | 2 +
15 files changed, 229 insertions(+), 201 deletions(-)
create mode 100644 explorer/lib/abi/StrategyManager.json
create mode 100644 explorer/lib/explorer/contract_managers/strategy.ex
diff --git a/explorer/lib/abi/StrategyManager.json b/explorer/lib/abi/StrategyManager.json
new file mode 100644
index 0000000000..67179897e3
--- /dev/null
+++ b/explorer/lib/abi/StrategyManager.json
@@ -0,0 +1 @@
+{"abi":[{"type":"constructor","inputs":[{"name":"_delegation","type":"address","internalType":"contract IDelegationManager"},{"name":"_eigenPodManager","type":"address","internalType":"contract IEigenPodManager"},{"name":"_slasher","type":"address","internalType":"contract ISlasher"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEPOSIT_TYPEHASH","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DOMAIN_TYPEHASH","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addShares","inputs":[{"name":"staker","type":"address","internalType":"address"},{"name":"token","type":"address","internalType":"contract IERC20"},{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addStrategiesToDepositWhitelist","inputs":[{"name":"strategiesToWhitelist","type":"address[]","internalType":"contract IStrategy[]"},{"name":"thirdPartyTransfersForbiddenValues","type":"bool[]","internalType":"bool[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"delegation","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IDelegationManager"}],"stateMutability":"view"},{"type":"function","name":"depositIntoStrategy","inputs":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"token","type":"address","internalType":"contract IERC20"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"depositIntoStrategyWithSignature","inputs":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"token","type":"address","internalType":"contract IERC20"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"staker","type":"address","internalType":"address"},{"name":"expiry","type":"uint256","internalType":"uint256"},{"name":"signature","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"shares","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"domainSeparator","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"eigenPodManager","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IEigenPodManager"}],"stateMutability":"view"},{"type":"function","name":"getDeposits","inputs":[{"name":"staker","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"address[]","internalType":"contract IStrategy[]"},{"name":"","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"initialOwner","type":"address","internalType":"address"},{"name":"initialStrategyWhitelister","type":"address","internalType":"address"},{"name":"_pauserRegistry","type":"address","internalType":"contract IPauserRegistry"},{"name":"initialPausedStatus","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"nonces","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"pause","inputs":[{"name":"newPausedStatus","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pauseAll","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"paused","inputs":[{"name":"index","type":"uint8","internalType":"uint8"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"pauserRegistry","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IPauserRegistry"}],"stateMutability":"view"},{"type":"function","name":"removeShares","inputs":[{"name":"staker","type":"address","internalType":"address"},{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeStrategiesFromDepositWhitelist","inputs":[{"name":"strategiesToRemoveFromWhitelist","type":"address[]","internalType":"contract IStrategy[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setPauserRegistry","inputs":[{"name":"newPauserRegistry","type":"address","internalType":"contract IPauserRegistry"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setStrategyWhitelister","inputs":[{"name":"newStrategyWhitelister","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setThirdPartyTransfersForbidden","inputs":[{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"value","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"slasher","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ISlasher"}],"stateMutability":"view"},{"type":"function","name":"stakerStrategyList","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"contract IStrategy"}],"stateMutability":"view"},{"type":"function","name":"stakerStrategyListLength","inputs":[{"name":"staker","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"stakerStrategyShares","inputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"address","internalType":"contract IStrategy"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"strategyIsWhitelistedForDeposit","inputs":[{"name":"","type":"address","internalType":"contract IStrategy"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"strategyWhitelister","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"thirdPartyTransfersForbidden","inputs":[{"name":"","type":"address","internalType":"contract IStrategy"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"unpause","inputs":[{"name":"newPausedStatus","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawSharesAsTokens","inputs":[{"name":"recipient","type":"address","internalType":"address"},{"name":"strategy","type":"address","internalType":"contract IStrategy"},{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"token","type":"address","internalType":"contract IERC20"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Deposit","inputs":[{"name":"staker","type":"address","indexed":false,"internalType":"address"},{"name":"token","type":"address","indexed":false,"internalType":"contract IERC20"},{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint8","indexed":false,"internalType":"uint8"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"newPausedStatus","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"PauserRegistrySet","inputs":[{"name":"pauserRegistry","type":"address","indexed":false,"internalType":"contract IPauserRegistry"},{"name":"newPauserRegistry","type":"address","indexed":false,"internalType":"contract IPauserRegistry"}],"anonymous":false},{"type":"event","name":"StrategyAddedToDepositWhitelist","inputs":[{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"}],"anonymous":false},{"type":"event","name":"StrategyRemovedFromDepositWhitelist","inputs":[{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"}],"anonymous":false},{"type":"event","name":"StrategyWhitelisterChanged","inputs":[{"name":"previousAddress","type":"address","indexed":false,"internalType":"address"},{"name":"newAddress","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"newPausedStatus","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"UpdatedThirdPartyTransfersForbidden","inputs":[{"name":"strategy","type":"address","indexed":false,"internalType":"contract IStrategy"},{"name":"value","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false}],"bytecode":{"object":"0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea264697066735822122078a77ee71704c26ce62db1149f0906c813c896ae6dd2117779e31e5f8a79defd64736f6c634300080c0033","sourceMap":"969:20694:7:-:0;;;2277:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4395:24:8;;;;;4429:34;;;;;4473:18;;;;2479:22:7::1;:20;:22::i;:::-;-1:-1:-1::0;;2531:13:7::1;2511:33;::::0;-1:-1:-1;969:20694:7;;5388:279:46;5456:13;;;;;;;5455:14;5447:66;;;;-1:-1:-1;;;5447:66:46;;1025:2:184;5447:66:46;;;1007:21:184;1064:2;1044:18;;;1037:30;1103:34;1083:18;;;1076:62;-1:-1:-1;;;1154:18:184;;;1147:37;1201:19;;5447:66:46;;;;;;;;5527:12;;5542:15;5527:12;;;:30;5523:138;;;5573:12;:30;;-1:-1:-1;;5573:30:46;5588:15;5573:30;;;;;;5622:28;;1373:36:184;;;5622:28:46;;1361:2:184;1346:18;5622:28:46;;;;;;;5523:138;5388:279::o;14:151:184:-;-1:-1:-1;;;;;109:31:184;;99:42;;89:70;;155:1;152;145:12;89:70;14:151;:::o;170:648::-;327:6;335;343;396:2;384:9;375:7;371:23;367:32;364:52;;;412:1;409;402:12;364:52;444:9;438:16;463:51;508:5;463:51;:::i;:::-;583:2;568:18;;562:25;533:5;;-1:-1:-1;596:53:184;562:25;596:53;:::i;:::-;720:2;705:18;;699:25;668:7;;-1:-1:-1;733:53:184;699:25;733:53;:::i;:::-;805:7;795:17;;;170:648;;;;;:::o;1231:184::-;969:20694:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea264697066735822122078a77ee71704c26ce62db1149f0906c813c896ae6dd2117779e31e5f8a79defd64736f6c634300080c0033","sourceMap":"969:20694:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5826:138:29;;;;;;:::i;:::-;;:::i;:::-;;3832:392;;;;;;:::i;:::-;;:::i;681:130:8:-;;731:80;681:130;;;;;791:25:184;;;779:2;764:18;681:130:8;;;;;;;;6409:1579:7;;;;;;:::i;:::-;;:::i;1300:49:8:-;;;;;;;;-1:-1:-1;;;;;2897:32:184;;;2879:51;;2867:2;2852:18;1300:49:8;2708:228:184;898:162:8;;949:111;898:162;;9470:194:7;;;;;;:::i;:::-;;:::i;4299:136:29:-;;;:::i;5606:149::-;;;;;;:::i;:::-;5724:7;;5695:1;:10;;;;;;;;5724:14;;;5723:24;;5606:149;;;;3925:14:184;;3918:22;3900:41;;3888:2;3873:18;5606:149:29;3760:187:184;5418:87:29;5491:7;;5418:87;;3377:65:8;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2071:101:42;;;:::i;2347:77:8:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1808:41;;;;;;:::i;:::-;;;;;;;;;;;;;;1825:37:29;;;;;-1:-1:-1;;;;;1825:37:29;;;20794:139:7;;;;;;:::i;:::-;-1:-1:-1;;;;;20893:26:7;20867:7;20893:26;;;:18;:26;;;;;:33;;20794:139;8130:191;;;;;;:::i;:::-;;:::i;1441:85:42:-;1513:6;;-1:-1:-1;;;;;1513:6:42;1441:85;;20195:504:7;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;1981:34:8:-;;;;;-1:-1:-1;;;;;1981:34:8;;;4218:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1355:33;;;;;11792:921:7;;;;;;:::i;:::-;;:::i;8449:214::-;;;;;;:::i;:::-;;:::i;8782:230::-;;;;;;:::i;:::-;;:::i;9846:147::-;;;;;;:::i;:::-;;:::i;2519:57:8:-;;;;;;:::i;:::-;;:::i;3123:431:7:-;;;;;;:::i;:::-;;:::i;10413:1073::-;;;;;;:::i;:::-;;:::i;1248:46:8:-;;;;;4426:274:7;;;;;;:::i;:::-;;:::i;2321:198:42:-;;;;;;:::i;:::-;;:::i;21140:227:7:-;;;:::i;4911:437:29:-;;;;;;:::i;:::-;;:::i;5826:138::-;2285:14;;;;;;;;;-1:-1:-1;;;;;2285:14:29;-1:-1:-1;;;;;2285:23:29;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2271:39:29;:10;-1:-1:-1;;;;;2271:39:29;;2263:94;;;;-1:-1:-1;;;2263:94:29;;;;;;;:::i;:::-;;;;;;;;;5920:37:::1;5939:17;5920:18;:37::i;:::-;5826:138:::0;:::o;3832:392::-;2125:14;;:35;;-1:-1:-1;;;2125:35:29;;2149:10;2125:35;;;2879:51:184;-1:-1:-1;;;;;2125:14:29;;;;:23;;2852:18:184;;2125:35:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2117:88;;;;-1:-1:-1;;;2117:88:29;;;;;;;:::i;:::-;4064:7:::1;::::0;4034:25;;::::1;4033:38;4025:107;;;::::0;-1:-1:-1;;;4025:107:29;;13927:2:184;4025:107:29::1;::::0;::::1;13909:21:184::0;13966:2;13946:18;;;13939:30;14005:34;13985:18;;;13978:62;14076:26;14056:18;;;14049:54;14120:19;;4025:107:29::1;13725:420:184::0;4025:107:29::1;4142:7;:25:::0;;;4182:35:::1;::::0;791:25:184;;;4189:10:29::1;::::0;4182:35:::1;::::0;779:2:184;764:18;4182:35:29::1;;;;;;;;3832:392:::0;:::o;6409:1579:7:-;5724:7:29;;6677:14:7;;;;5695:1:29;5724:14;;;5723:24;2767:14;2759:52;;;;-1:-1:-1;;;2759:52:29;;14352:2:184;2759:52:29;;;14334:21:184;14391:2;14371:18;;;14364:30;-1:-1:-1;;;14410:18:184;;;14403:55;14475:18;;2759:52:29;14150:349:184;2759:52:29;1815:1:49::1;2569:7;;:19;;2561:63;;;::::0;-1:-1:-1;;;2561:63:49;;14706:2:184;2561:63:49::1;::::0;::::1;14688:21:184::0;14745:2;14725:18;;;14718:30;14784:33;14764:18;;;14757:61;14835:18;;2561:63:49::1;14504:355:184::0;2561:63:49::1;1815:1;2699:7;:18:::0;-1:-1:-1;;;;;6725:38:7;::::2;;::::0;;;:28:::2;:38;::::0;;;;;::::2;;6724:39;6703:160;;;::::0;-1:-1:-1;;;6703:160:7;;15066:2:184;6703:160:7::2;::::0;::::2;15048:21:184::0;15105:2;15085:18;;;15078:30;15144:34;15124:18;;;15117:62;15215:34;15195:18;;;15188:62;-1:-1:-1;;;15266:19:184;;;15259:41;15317:19;;6703:160:7::2;14864:478:184::0;6703:160:7::2;6891:15;6881:6;:25;;6873:105;;;::::0;-1:-1:-1;;;6873:105:7;;15549:2:184;6873:105:7::2;::::0;::::2;15531:21:184::0;15588:2;15568:18;;;15561:30;15627:34;15607:18;;;15600:62;15698:34;15678:18;;;15671:62;-1:-1:-1;;;15749:19:184;;;15742:34;15793:19;;6873:105:7::2;15347:471:184::0;6873:105:7::2;-1:-1:-1::0;;;;;7070:14:7;;::::2;7054:13;7070:14:::0;;;:6:::2;:14;::::0;;;;;;;;7125:76;;949:111:8::2;7125:76:7::0;;::::2;16172:25:184::0;;;;16251:18;;;16244:43;;;;16323:15;;;16303:18;;;16296:43;16375:15;;;16355:18;;;16348:43;16407:19;;;16400:35;;;16451:19;;;16444:35;;;16495:19;;;16488:35;;;7070:14:7;;16144:19:184;;7125:76:7::2;::::0;;-1:-1:-1;;7125:76:7;;::::2;::::0;;;;;;7115:87;;7125:76:::2;7115:87:::0;;::::2;::::0;-1:-1:-1;;;;;7236:14:7;::::2;;::::0;;;:6:::2;:14:::0;;;;;;7261:1:::2;7253:9:::0;::::2;7236:26:::0;;7115:87;-1:-1:-1;7380:17:7::2;:15;:17::i;:::-;7351:59;::::0;-1:-1:-1;;;7351:59:7::2;::::0;::::2;16792:27:184::0;16835:11;;;16828:27;;;;16871:12;;;16864:28;;;16908:12;;7351:59:7::2;;;;;;;;;;;;7341:70;;;;;;7320:91;;7737:75;7782:6;7790:10;7802:9;7737:44;:75::i;:::-;7928:53;7949:6;7957:8;7967:5;7974:6;7928:20;:53::i;:::-;1772:1:49::1;2872:7;:22:::0;7919:62:7;6409:1579;-1:-1:-1;;;;;;;;;;;6409:1579:7:o;9470:194::-;1436:19;;-1:-1:-1;;;;;1436:19:7;1422:10;:33;1401:148;;;;-1:-1:-1;;;1401:148:7;;;;;;;:::i;:::-;9608:49:::1;9641:8;9651:5;9608:32;:49::i;:::-;9470:194:::0;;:::o;4299:136:29:-;2125:14;;:35;;-1:-1:-1;;;2125:35:29;;2149:10;2125:35;;;2879:51:184;-1:-1:-1;;;;;2125:14:29;;;;:23;;2852:18:184;;2125:35:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2117:88;;;;-1:-1:-1;;;2117:88:29;;;;;;;:::i;:::-;-1:-1:-1;;4349:7:29::1;:27:::0;;;4391:37:::1;::::0;791:25:184;;;4398:10:29::1;::::0;4391:37:::1;::::0;779:2:184;764:18;4391:37:29::1;;;;;;;4299:136::o:0;2071:101:42:-;1334:13;:11;:13::i;:::-;2135:30:::1;2162:1;2135:18;:30::i;:::-;2071:101::o:0;8130:191:7:-;1888:10;-1:-1:-1;;;;;1910:10:7;1888:33;;1880:110;;;;-1:-1:-1;;;1880:110:7;;;;;;;:::i;:::-;8275:39:::1;8289:6;8297:8;8307:6;8275:13;:39::i;:::-;;8130:191:::0;;;:::o;20195:504::-;-1:-1:-1;;;;;20330:26:7;;20303:24;20330:26;;;:18;:26;;;;;:33;20255:18;;;;20330:33;;20399:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20399:31:7;;20373:57;;20446:9;20441:199;20465:16;20461:1;:20;20441:199;;;-1:-1:-1;;;;;20511:28:7;;;;;;:20;:28;;;;;;;;20540:18;:26;;;;;:29;;20511:28;;;20567:1;;20540:29;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;20540:29:7;20511:59;;;;;;;;;;;;;20499:9;;:6;;20506:1;;20499:9;;;;;;:::i;:::-;;;;;;;;;;:71;20612:3;;20441:199;;;;20657:18;:26;20676:6;-1:-1:-1;;;;;20657:26:7;-1:-1:-1;;;;;20657:26:7;;;;;;;;;;;;20685:6;20649:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20649:43:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20195:504;;;:::o;11792:921::-;1436:19;;-1:-1:-1;;;;;1436:19:7;1422:10;:33;1401:148;;;;-1:-1:-1;;;1401:148:7;;;;;;;:::i;:::-;11997:31;11949:45:::1;12045:662;12069:37;12065:1;:41;12045:662;;;12214:31;:67;12246:31;;12278:1;12246:34;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12214:67:7::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;12214:67:7;;::::1;;12210:428;;;12371:5;12301:31;:67;12333:31;;12365:1;12333:34;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12301:67:7::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;12301:67:7;:75;;-1:-1:-1;;12301:75:7::1;::::0;::::1;;::::0;;;::::1;::::0;;12399:71:::1;12435:31:::0;;12467:1;12435:34;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;12399:71;::::0;-1:-1:-1;;;;;2897:32:184;;;2879:51;;2867:2;2852:18;12399:71:7::1;;;;;;;12548:75;12581:31;;12613:1;12581:34;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;12617:5;12548:32;:75::i;:::-;12679:3;;12045:662;;8449:214:::0;1888:10;-1:-1:-1;;;;;1910:10:7;1888:33;;1880:110;;;;-1:-1:-1;;;1880:110:7;;;;;;;:::i;:::-;8613:43:::1;8624:6;8632:5;8639:8;8649:6;8613:10;:43::i;8782:230::-:0;1888:10;-1:-1:-1;;;;;1910:10:7;1888:33;;1880:110;;;;-1:-1:-1;;;1880:110:7;;;;;;;:::i;:::-;8962:43:::1;::::0;-1:-1:-1;;;8962:43:7;;-1:-1:-1;;;;;18247:15:184;;;8962:43:7::1;::::0;::::1;18229:34:184::0;18299:15;;;18279:18;;;18272:43;18331:18;;;18324:34;;;8962:17:7;::::1;::::0;::::1;::::0;18164:18:184;;8962:43:7::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8782:230:::0;;;;:::o;9846:147::-;1334:13:42;:11;:13::i;:::-;9939:47:7::1;9963:22;9939:23;:47::i;2519:57:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2519:57:8;;-1:-1:-1;2519:57:8;;-1:-1:-1;2519:57:8:o;3123:431:7:-;3111:19:46;3134:13;;;;;;3133:14;;3179:34;;;;-1:-1:-1;3197:12:46;;3212:1;3197:12;;;;:16;3179:34;3178:108;;;-1:-1:-1;3258:4:46;1476:19:50;:23;;;3219:66:46;;-1:-1:-1;3268:12:46;;;;;:17;3219:66;3157:201;;;;-1:-1:-1;;;3157:201:46;;18571:2:184;3157:201:46;;;18553:21:184;18610:2;18590:18;;;18583:30;18649:34;18629:18;;;18622:62;-1:-1:-1;;;18700:18:184;;;18693:44;18754:19;;3157:201:46;18369:410:184;3157:201:46;3368:12;:16;;-1:-1:-1;;3368:16:46;3383:1;3368:16;;;3394:65;;;;3428:13;:20;;-1:-1:-1;;3428:20:46;;;;;3394:65;3352:27:7::1;:25;:27::i;:::-;3332:17;:47:::0;3389:55:::1;3407:15:::0;3424:19;3389:17:::1;:55::i;:::-;3454:32;3473:12;3454:18;:32::i;:::-;3496:51;3520:26;3496:23;:51::i;:::-;3483:14:46::0;3479:99;;;3529:5;3513:21;;-1:-1:-1;;3513:21:46;;;3553:14;;-1:-1:-1;18936:36:184;;3553:14:46;;18924:2:184;18909:18;3553:14:46;;;;;;;3479:99;3101:483;3123:431:7;;;;:::o;10413:1073::-;1436:19;;-1:-1:-1;;;;;1436:19:7;1422:10;:33;1401:148;;;;-1:-1:-1;;;1401:148:7;;;;;;;:::i;:::-;10636:73;;::::1;10615:195;;;::::0;-1:-1:-1;;;10615:195:7;;19185:2:184;10615:195:7::1;::::0;::::1;19167:21:184::0;19224:2;19204:18;;;19197:30;19263:34;19243:18;;;19236:62;19334:34;19314:18;;;19307:62;-1:-1:-1;;;19385:19:184;;;19378:42;19437:19;;10615:195:7::1;18983:479:184::0;10615:195:7::1;10858:21:::0;10820:35:::1;10896:584;10920:27;10916:1;:31;10896:584;;;11060:31;:57;11092:21;;11114:1;11092:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11060:57:7::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;11060:57:7;;::::1;;11055:356;;11197:4;11137:31;:57;11169:21;;11191:1;11169:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;11137:57:7::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;11137:57:7;:64;;-1:-1:-1;;11137:64:7::1;::::0;::::1;;::::0;;;::::1;::::0;;11224:57:::1;11256:21:::0;;11278:1;11256:24;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;11224:57;::::0;-1:-1:-1;;;;;2897:32:184;;;2879:51;;2867:2;2852:18;11224:57:7::1;;;;;;;11299:97;11332:21;;11354:1;11332:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;11358:34;;11393:1;11358:37;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;11299:32;:97::i;:::-;11452:3;;10896:584;;;;10605:881;10413:1073:::0;;;;:::o;4426:274::-;5724:7:29;;4601:14:7;;;;5695:1:29;5724:14;;;5723:24;2767:14;2759:52;;;;-1:-1:-1;;;2759:52:29;;14352:2:184;2759:52:29;;;14334:21:184;14391:2;14371:18;;;14364:30;-1:-1:-1;;;14410:18:184;;;14403:55;14475:18;;2759:52:29;14150:349:184;2759:52:29;1815:1:49::1;2569:7;;:19;;2561:63;;;::::0;-1:-1:-1;;;2561:63:49;;14706:2:184;2561:63:49::1;::::0;::::1;14688:21:184::0;14745:2;14725:18;;;14718:30;14784:33;14764:18;;;14757:61;14835:18;;2561:63:49::1;14504:355:184::0;2561:63:49::1;1815:1;2699:7;:18:::0;4636:57:7::2;4657:10;4669:8:::0;4679:5;4686:6;4636:20:::2;:57::i;:::-;1772:1:49::1;2872:7;:22:::0;4627:66:7;4426:274;-1:-1:-1;;;;;4426:274:7:o;2321:198:42:-;1334:13;:11;:13::i;:::-;-1:-1:-1;;;;;2409:22:42;::::1;2401:73;;;::::0;-1:-1:-1;;;2401:73:42;;19915:2:184;2401:73:42::1;::::0;::::1;19897:21:184::0;19954:2;19934:18;;;19927:30;19993:34;19973:18;;;19966:62;-1:-1:-1;;;20044:18:184;;;20037:36;20090:19;;2401:73:42::1;19713:402:184::0;2401:73:42::1;2484:28;2503:8;2484:18;:28::i;21140:227:7:-:0;21188:7;21228:17;21211:13;:34;21207:154;;;-1:-1:-1;21268:17:7;;;21140:227::o;21207:154::-;21323:27;:25;:27::i;:::-;21316:34;;21140:227;:::o;4911:437:29:-;2285:14;;;;;;;;;-1:-1:-1;;;;;2285:14:29;-1:-1:-1;;;;;2285:23:29;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2271:39:29;:10;-1:-1:-1;;;;;2271:39:29;;2263:94;;;;-1:-1:-1;;;2263:94:29;;;;;;;:::i;:::-;5164:7:::1;;5163:8;5141:15;5140:16;5128:7;;5127:8;5126:31;5125:47;5104:150;;;::::0;-1:-1:-1;;;5104:150:29;;20322:2:184;5104:150:29::1;::::0;::::1;20304:21:184::0;20361:2;20341:18;;;20334:30;20400:34;20380:18;;;20373:62;20471:26;20451:18;;;20444:54;20515:19;;5104:150:29::1;20120:420:184::0;5104:150:29::1;5264:7;:25:::0;;;5304:37:::1;::::0;791:25:184;;;5313:10:29::1;::::0;5304:37:::1;::::0;779:2:184;764:18;5304:37:29::1;645:177:184::0;6024:360:29;-1:-1:-1;;;;;6127:40:29;;6106:160;;;;-1:-1:-1;;;6106:160:29;;20747:2:184;6106:160:29;;;20729:21:184;20786:2;20766:18;;;20759:30;20825:34;20805:18;;;20798:62;20896:34;20876:18;;;20869:62;-1:-1:-1;;;20947:19:184;;;20940:40;20997:19;;6106:160:29;20545:477:184;6106:160:29;6299:14;;6281:52;;;-1:-1:-1;;;;;6299:14:29;;;21287:34:184;;21357:15;;;21352:2;21337:18;;21330:43;6281:52:29;;21222:18:184;6281:52:29;;;;;;;6343:14;:34;;-1:-1:-1;;;;;;6343:34:29;-1:-1:-1;;;;;6343:34:29;;;;;;;;;;6024:360::o;974:926:25:-;-1:-1:-1;;;;;1476:19:50;;;:23;1410:484:25;;1481:56;;-1:-1:-1;;;1481:56:25;;;1541:18;-1:-1:-1;;;;;1481:33:25;;;574:10;;1481:56;;1515:10;;1527:9;;1481:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1481:78:25;;1456:220;;;;-1:-1:-1;;;1456:220:25;;22699:2:184;1456:220:25;;;22681:21:184;22738:2;22718:18;;;22711:30;22777:34;22757:18;;;22750:62;22848:34;22828:18;;;22821:62;-1:-1:-1;;;22899:19:184;;;22892:50;22959:19;;1456:220:25;22497:487:184;1456:220:25;974:926;;;:::o;1410:484::-;1772:6;-1:-1:-1;;;;;1732:46:25;:36;1746:10;1758:9;1732:13;:36::i;:::-;-1:-1:-1;;;;;1732:46:25;;1707:176;;;;-1:-1:-1;;;1707:176:25;;23191:2:184;1707:176:25;;;23173:21:184;23230:2;23210:18;;;23203:30;23269:34;23249:18;;;23242:62;23340:34;23320:18;;;23313:62;-1:-1:-1;;;23391:19:184;;;23384:38;23439:19;;1707:176:25;22989:475:184;15016:811:7;-1:-1:-1;;;;;1669:41:7;;15214:14;1669:41;;;:31;:41;;;;;;15195:8;;1669:41;;1648:165;;;;-1:-1:-1;;;1648:165:7;;23671:2:184;1648:165:7;;;23653:21:184;23710:2;23690:18;;;23683:30;23749:34;23729:18;;;23722:62;23820:34;23800:18;;;23793:62;-1:-1:-1;;;23871:19:184;;;23864:44;23925:19;;1648:165:7;23469:481:184;1648:165:7;15299:61:::1;-1:-1:-1::0;;;;;15299:22:7;::::1;15322:10;15342:8:::0;15353:6;15299:22:::1;:61::i;:::-;15495:31;::::0;-1:-1:-1;;;15495:31:7;;-1:-1:-1;;;;;24163:32:184;;;15495:31:7::1;::::0;::::1;24145:51:184::0;24212:18;;;24205:34;;;15495:16:7;::::1;::::0;::::1;::::0;24118:18:184;;15495:31:7::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15486:40;;15622:43;15633:6;15641:5;15648:8;15658:6;15622:10;:43::i;:::-;15736:60;::::0;-1:-1:-1;;;15736:60:7;;-1:-1:-1;;;;;18247:15:184;;;15736:60:7::1;::::0;::::1;18229:34:184::0;18299:15;;;18279:18;;;18272:43;18331:18;;;18324:34;;;15736:10:7::1;:34;::::0;::::1;::::0;18164:18:184;;15736:60:7::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;15016:811:::0;;;;;;;:::o;19226:213::-;19324:52;;;-1:-1:-1;;;;;25041:32:184;;25023:51;;25117:14;;25110:22;25105:2;25090:18;;25083:50;19324:52:7;;24996:18:184;19324:52:7;;;;;;;-1:-1:-1;;;;;19386:38:7;;;;;;;;:28;:38;;;;;:46;;-1:-1:-1;;19386:46:7;;;;;;;;;;19226:213::o;1599:130:42:-;1513:6;;-1:-1:-1;;;;;1513:6:42;929:10:51;1662:23:42;1654:68;;;;-1:-1:-1;;;1654:68:42;;25346:2:184;1654:68:42;;;25328:21:184;;;25365:18;;;25358:30;25424:34;25404:18;;;25397:62;25476:18;;1654:68:42;25144:356:184;2673:187:42;2765:6;;;-1:-1:-1;;;;;2781:17:42;;;-1:-1:-1;;;;;;2781:17:42;;;;;;;2813:40;;2765:6;;;2781:17;2765:6;;2813:40;;2746:16;;2813:40;2736:124;2673:187;:::o;16360:1255:7:-;16488:4;16547:16;16539:91;;;;-1:-1:-1;;;16539:91:7;;25707:2:184;16539:91:7;;;25689:21:184;25746:2;25726:18;;;25719:30;25785:34;25765:18;;;25758:62;25856:32;25836:18;;;25829:60;25906:19;;16539:91:7;25505:426:184;16539:91:7;-1:-1:-1;;;;;16714:28:7;;;16693:18;16714:28;;;:20;:28;;;;;;;;:38;;;;;;;;;;16771:25;;;;16763:89;;;;-1:-1:-1;;;16763:89:7;;26138:2:184;16763:89:7;;;26120:21:184;26177:2;26157:18;;;26150:30;26216:34;26196:18;;;26189:62;-1:-1:-1;;;26267:18:184;;;26260:49;26326:19;;16763:89:7;25936:415:184;16763:89:7;-1:-1:-1;;;;;17091:28:7;;;;;;;:20;:28;;;;;;;;:38;;;;;;;;;16963:24;;;17091:51;;;;16963:24;17257:15;;17253:229;;;17288:55;17326:6;17334:8;17288:37;:55::i;:::-;17467:4;17460:11;;;;;17253:229;17603:5;17596:12;;;16360:1255;;;;;;:::o;13502:949::-;-1:-1:-1;;;;;13650:20:7;;13642:90;;;;-1:-1:-1;;;13642:90:7;;26558:2:184;13642:90:7;;;26540:21:184;26597:2;26577:18;;;26570:30;26636:34;26616:18;;;26609:62;26707:27;26687:18;;;26680:55;26752:19;;13642:90:7;26356:421:184;13642:90:7;13750:11;13742:78;;;;-1:-1:-1;;;13742:78:7;;26984:2:184;13742:78:7;;;26966:21:184;27023:2;27003:18;;;26996:30;27062:34;27042:18;;;27035:62;-1:-1:-1;;;27113:18:184;;;27106:52;27175:19;;13742:78:7;26782:418:184;13742:78:7;-1:-1:-1;;;;;13921:28:7;;;;;;;:20;:28;;;;;;;;:38;;;;;;;;;;13917:335;;-1:-1:-1;;;;;14005:26:7;;;;;;:18;1215:2:8;14005:26:7;;;;;;;:33;:67;13980:206;;;;-1:-1:-1;;;13980:206:7;;27407:2:184;13980:206:7;;;27389:21:184;27446:2;27426:18;;;27419:30;27485:34;27465:18;;;27458:62;27556:34;27536:18;;;27529:62;-1:-1:-1;;;27607:19:184;;;27600:47;27664:19;;13980:206:7;27205:484:184;13980:206:7;-1:-1:-1;;;;;14200:26:7;;;;;;;:18;:26;;;;;;;:41;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14200:41:7;;;;;;;;;;13917:335;-1:-1:-1;;;;;14340:28:7;;;;;;;:20;:28;;;;;;;;:38;;;;;;;;;;;:48;;14382:6;;14340:28;:48;;14382:6;;14340:48;:::i;:::-;;;;-1:-1:-1;;14404:40:7;;;-1:-1:-1;;;;;28280:15:184;;;28262:34;;28332:15;;;28327:2;28312:18;;28305:43;28384:15;;28364:18;;;28357:43;28431:2;28416:18;;28409:34;;;14404:40:7;;;;;;;28211:3:184;14404:40:7;;;13502:949;;;;:::o;19699:221::-;19815:19;;19788:71;;;-1:-1:-1;;;;;19815:19:7;;;21287:34:184;;21357:15;;;21352:2;21337:18;;21330:43;19788:71:7;;21222:18:184;19788:71:7;;;;;;;19869:19;:44;;-1:-1:-1;;;;;;19869:44:7;-1:-1:-1;;;;;19869:44:7;;;;;;;;;;19699:221::o;21468:193::-;21602:19;;;;;;;;;;;-1:-1:-1;;;21602:19:7;;;;;21564:89;;731:80:8;21564:89:7;;;28994:25:184;21592:30:7;29035:18:184;;;29028:34;21624:13:7;29078:18:184;;;29071:34;21647:4:7;29121:18:184;;;;29114:60;;;;21564:89:7;;;;;;;;;;28966:19:184;;;;21564:89:7;;;21554:100;;;;;;21468:193::o;2943:441:29:-;3077:14;;-1:-1:-1;;;;;3077:14:29;3069:37;:79;;;;-1:-1:-1;;;;;;3110:38:29;;;;3069:79;3048:197;;;;-1:-1:-1;;;3048:197:29;;29387:2:184;3048:197:29;;;29369:21:184;29426:2;29406:18;;;29399:30;29465:34;29445:18;;;29438:62;29536:34;29516:18;;;29509:62;-1:-1:-1;;;29587:19:184;;;29580:38;29635:19;;3048:197:29;29185:475:184;3048:197:29;3255:7;:26;;;3296:36;;791:25:184;;;3303:10:29;;3296:36;;779:2:184;764:18;3296:36:29;;;;;;;3342:35;3361:15;3342:18;:35::i;4402:227:77:-;4480:7;4500:17;4519:18;4541:27;4552:4;4558:9;4541:10;:27::i;:::-;4499:69;;;;4578:18;4590:5;4578:11;:18::i;:::-;-1:-1:-1;4613:9:77;4402:227;-1:-1:-1;;;4402:227:77:o;974:241:71:-;1139:68;;;-1:-1:-1;;;;;18247:15:184;;;1139:68:71;;;18229:34:184;18299:15;;18279:18;;;18272:43;18331:18;;;;18324:34;;;1139:68:71;;;;;;;;;;18164:18:184;;;;1139:68:71;;;;;;;;-1:-1:-1;;;;;1139:68:71;-1:-1:-1;;;1139:68:71;;;1112:96;;1132:5;;1112:19;:96::i;17904:957:7:-;-1:-1:-1;;;;;18130:26:7;;18107:20;18130:26;;;:18;:26;;;;;:33;;18196:394;18207:12;18203:1;:16;18196:394;;;-1:-1:-1;;;;;18241:26:7;;;;;;;:18;:26;;;;;:29;;:41;;;;18268:1;;18241:29;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;18241:29:7;:41;18237:312;;;-1:-1:-1;;;;;18408:26:7;;;;;;:18;:26;;;;;18456:33;;:37;;18492:1;;18456:37;:::i;:::-;18408:103;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;18376:26:7;;;;;:18;:26;;;;;;;:29;;18408:103;;;;;18376:26;18403:1;;18376:29;;;;;;:::i;:::-;;;;;;;;;:135;;;;;-1:-1:-1;;;;;18376:135:7;;;;;-1:-1:-1;;;;;18376:135:7;;;;;;18529:5;;18237:312;18574:3;;18196:394;;;18662:12;18657:1;:17;;18649:103;;;;-1:-1:-1;;;18649:103:7;;30377:2:184;18649:103:7;;;30359:21:184;30416:2;30396:18;;;30389:30;30455:34;30435:18;;;30428:62;30526:34;30506:18;;;30499:62;-1:-1:-1;;;30577:19:184;;;30570:40;30627:19;;18649:103:7;30175:477:184;18649:103:7;-1:-1:-1;;;;;18822:26:7;;;;;;:18;:26;;;;;:32;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;18822:32:7;;;;;-1:-1:-1;;;;;;18822:32:7;;;;;;-1:-1:-1;;;;17904:957:7:o;2243:1373:77:-;2324:7;2333:12;2554:9;:16;2574:2;2554:22;2550:1060;;;2890:4;2875:20;;2869:27;2939:4;2924:20;;2918:27;2996:4;2981:20;;2975:27;2592:9;2967:36;3037:25;3048:4;2967:36;2869:27;2918;3037:10;:25::i;:::-;3030:32;;;;;;;;;2550:1060;3083:9;:16;3103:2;3083:22;3079:531;;;3399:4;3384:20;;3378:27;3449:4;3434:20;;3428:27;3489:23;3500:4;3378:27;3428;3489:10;:23::i;:::-;3482:30;;;;;;;;3079:531;-1:-1:-1;3559:1:77;;-1:-1:-1;3563:35:77;3079:531;2243:1373;;;;;:::o;548:631::-;625:20;616:5;:29;;;;;;;;:::i;:::-;;612:561;;;548:631;:::o;612:561::-;721:29;712:5;:38;;;;;;;;:::i;:::-;;708:465;;;766:34;;-1:-1:-1;;;766:34:77;;31123:2:184;766:34:77;;;31105:21:184;31162:2;31142:18;;;31135:30;31201:26;31181:18;;;31174:54;31245:18;;766:34:77;30921:348:184;708:465:77;830:35;821:5;:44;;;;;;;;:::i;:::-;;817:356;;;881:41;;-1:-1:-1;;;881:41:77;;31476:2:184;881:41:77;;;31458:21:184;31515:2;31495:18;;;31488:30;31554:33;31534:18;;;31527:61;31605:18;;881:41:77;31274:355:184;817:356:77;952:30;943:5;:39;;;;;;;;:::i;:::-;;939:234;;;998:44;;-1:-1:-1;;;998:44:77;;31836:2:184;998:44:77;;;31818:21:184;31875:2;31855:18;;;31848:30;31914:34;31894:18;;;31887:62;-1:-1:-1;;;31965:18:184;;;31958:32;32007:19;;998:44:77;31634:398:184;939:234:77;1072:30;1063:5;:39;;;;;;;;:::i;:::-;;1059:114;;;1118:44;;-1:-1:-1;;;1118:44:77;;32239:2:184;1118:44:77;;;32221:21:184;32278:2;32258:18;;;32251:30;32317:34;32297:18;;;32290:62;-1:-1:-1;;;32368:18:184;;;32361:32;32410:19;;1118:44:77;32037:398:184;3747:706:71;4166:23;4192:69;4220:4;4192:69;;;;;;;;;;;;;;;;;4200:5;-1:-1:-1;;;;;4192:27:71;;;:69;;;;;:::i;:::-;4275:17;;4166:95;;-1:-1:-1;4275:21:71;4271:176;;4370:10;4359:30;;;;;;;;;;;;:::i;:::-;4351:85;;;;-1:-1:-1;;;4351:85:71;;32642:2:184;4351:85:71;;;32624:21:184;32681:2;32661:18;;;32654:30;32720:34;32700:18;;;32693:62;-1:-1:-1;;;32771:18:184;;;32764:40;32821:19;;4351:85:71;32440:406:184;5810:1603:77;5936:7;;6860:66;6847:79;;6843:161;;;-1:-1:-1;6958:1:77;;-1:-1:-1;6962:30:77;6942:51;;6843:161;7017:1;:7;;7022:2;7017:7;;:18;;;;;7028:1;:7;;7033:2;7028:7;;7017:18;7013:100;;;-1:-1:-1;7067:1:77;;-1:-1:-1;7071:30:77;7051:51;;7013:100;7224:24;;;7207:14;7224:24;;;;;;;;;33078:25:184;;;33151:4;33139:17;;33119:18;;;33112:45;;;;33173:18;;;33166:34;;;33216:18;;;33209:34;;;7224:24:77;;33050:19:184;;7224:24:77;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7224:24:77;;-1:-1:-1;;7224:24:77;;;-1:-1:-1;;;;;;;7262:20:77;;7258:101;;7314:1;7318:29;7298:50;;;;;;;7258:101;7377:6;-1:-1:-1;7385:20:77;;-1:-1:-1;5810:1603:77;;;;;;;;:::o;4883:336::-;4993:7;;-1:-1:-1;;;;;5038:80:77;;4993:7;5144:25;5160:3;5145:18;;;5167:2;5144:25;:::i;:::-;5128:42;;5187:25;5198:4;5204:1;5207;5210;5187:10;:25::i;:::-;5180:32;;;;;;4883:336;;;;;;:::o;3861:223:72:-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;:::-;4018:59;3861:223;-1:-1:-1;;;;3861:223:72:o;4948:499::-;5113:12;5170:5;5145:21;:30;;5137:81;;;;-1:-1:-1;;;5137:81:72;;33456:2:184;5137:81:72;;;33438:21:184;33495:2;33475:18;;;33468:30;33534:34;33514:18;;;33507:62;-1:-1:-1;;;33585:18:184;;;33578:36;33631:19;;5137:81:72;33254:402:184;5137:81:72;-1:-1:-1;;;;;1476:19:50;;;5228:60:72;;;;-1:-1:-1;;;5228:60:72;;33863:2:184;5228:60:72;;;33845:21:184;33902:2;33882:18;;;33875:30;33941:31;33921:18;;;33914:59;33990:18;;5228:60:72;33661:353:184;5228:60:72;5300:12;5314:23;5341:6;-1:-1:-1;;;;;5341:11:72;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;4948:499;-1:-1:-1;;;;;;;4948:499:72:o;7561:742::-;7707:12;7735:7;7731:566;;;-1:-1:-1;7765:10:72;7758:17;;7731:566;7876:17;;:21;7872:415;;8120:10;8114:17;8180:15;8167:10;8163:2;8159:19;8152:44;7872:415;8259:12;8252:20;;-1:-1:-1;;;8252:20:72;;;;;;;;:::i;14:148:184:-;-1:-1:-1;;;;;106:31:184;;96:42;;86:70;;152:1;149;142:12;167:288;250:6;303:2;291:9;282:7;278:23;274:32;271:52;;;319:1;316;309:12;271:52;358:9;345:23;377:48;419:5;377:48;:::i;460:180::-;519:6;572:2;560:9;551:7;547:23;543:32;540:52;;;588:1;585;578:12;540:52;-1:-1:-1;611:23:184;;460:180;-1:-1:-1;460:180:184:o;827:127::-;888:10;883:3;879:20;876:1;869:31;919:4;916:1;909:15;943:4;940:1;933:15;959:1562;1106:6;1114;1122;1130;1138;1146;1199:3;1187:9;1178:7;1174:23;1170:33;1167:53;;;1216:1;1213;1206:12;1167:53;1255:9;1242:23;1274:48;1316:5;1274:48;:::i;:::-;1341:5;-1:-1:-1;1398:2:184;1383:18;;1370:32;1411:50;1370:32;1411:50;:::i;:::-;1480:7;-1:-1:-1;1534:2:184;1519:18;;1506:32;;-1:-1:-1;1590:2:184;1575:18;;1562:32;1603:50;1562:32;1603:50;:::i;:::-;1672:7;-1:-1:-1;1726:3:184;1711:19;;1698:33;;-1:-1:-1;1782:3:184;1767:19;;1754:33;1806:18;1836:14;;;1833:34;;;1863:1;1860;1853:12;1833:34;1901:6;1890:9;1886:22;1876:32;;1946:7;1939:4;1935:2;1931:13;1927:27;1917:55;;1968:1;1965;1958:12;1917:55;2004:2;1991:16;2026:2;2022;2019:10;2016:36;;;2032:18;;:::i;:::-;2107:2;2101:9;2075:2;2161:13;;-1:-1:-1;;2157:22:184;;;2181:2;2153:31;2149:40;2137:53;;;2205:18;;;2225:22;;;2202:46;2199:72;;;2251:18;;:::i;:::-;2291:10;2287:2;2280:22;2326:2;2318:6;2311:18;2366:7;2361:2;2356;2352;2348:11;2344:20;2341:33;2338:53;;;2387:1;2384;2377:12;2338:53;2443:2;2438;2434;2430:11;2425:2;2417:6;2413:15;2400:46;2488:1;2483:2;2478;2470:6;2466:15;2462:24;2455:35;2509:6;2499:16;;;;;;;959:1562;;;;;;;;:::o;2941:118::-;3027:5;3020:13;3013:21;3006:5;3003:32;2993:60;;3049:1;3046;3039:12;3064:417;3147:6;3155;3208:2;3196:9;3187:7;3183:23;3179:32;3176:52;;;3224:1;3221;3214:12;3176:52;3263:9;3250:23;3282:48;3324:5;3282:48;:::i;:::-;3349:5;-1:-1:-1;3406:2:184;3391:18;;3378:32;3419:30;3378:32;3419:30;:::i;:::-;3468:7;3458:17;;;3064:417;;;;;:::o;3486:269::-;3543:6;3596:2;3584:9;3575:7;3571:23;3567:32;3564:52;;;3612:1;3609;3602:12;3564:52;3651:9;3638:23;3701:4;3694:5;3690:16;3683:5;3680:27;3670:55;;3721:1;3718;3711:12;4239:440;4325:6;4333;4386:2;4374:9;4365:7;4361:23;4357:32;4354:52;;;4402:1;4399;4392:12;4354:52;4441:9;4428:23;4460:48;4502:5;4460:48;:::i;:::-;4527:5;-1:-1:-1;4584:2:184;4569:18;;4556:32;4597:50;4556:32;4597:50;:::i;5185:508::-;5280:6;5288;5296;5349:2;5337:9;5328:7;5324:23;5320:32;5317:52;;;5365:1;5362;5355:12;5317:52;5404:9;5391:23;5423:48;5465:5;5423:48;:::i;:::-;5490:5;-1:-1:-1;5547:2:184;5532:18;;5519:32;5560:50;5519:32;5560:50;:::i;:::-;5185:508;;5629:7;;-1:-1:-1;;;5683:2:184;5668:18;;;;5655:32;;5185:508::o;5906:1196::-;6192:2;6204:21;;;6274:13;;6177:18;;;6296:22;;;6144:4;;6371;;6349:2;6334:18;;;6398:15;;;6144:4;6441:195;6455:6;6452:1;6449:13;6441:195;;;6520:13;;-1:-1:-1;;;;;6516:39:184;6504:52;;6576:12;;;;6611:15;;;;6552:1;6470:9;6441:195;;;-1:-1:-1;;;6672:19:184;;;6652:18;;;6645:47;6742:13;;6764:21;;;6840:15;;;;6803:12;;;6875:1;6885:189;6901:8;6896:3;6893:17;6885:189;;;6970:15;;6956:30;;7047:17;;;;7008:14;;;;6929:1;6920:11;6885:189;;;-1:-1:-1;7091:5:184;;5906:1196;-1:-1:-1;;;;;;;5906:1196:184:o;7332:378::-;7406:8;7416:6;7470:3;7463:4;7455:6;7451:17;7447:27;7437:55;;7488:1;7485;7478:12;7437:55;-1:-1:-1;7511:20:184;;7554:18;7543:30;;7540:50;;;7586:1;7583;7576:12;7540:50;7623:4;7615:6;7611:17;7599:29;;7683:3;7676:4;7666:6;7663:1;7659:14;7651:6;7647:27;7643:38;7640:47;7637:67;;;7700:1;7697;7690:12;7715:466;7819:6;7827;7880:2;7868:9;7859:7;7855:23;7851:32;7848:52;;;7896:1;7893;7886:12;7848:52;7936:9;7923:23;7969:18;7961:6;7958:30;7955:50;;;8001:1;7998;7991:12;7955:50;8040:81;8113:7;8104:6;8093:9;8089:22;8040:81;:::i;:::-;8140:8;;8014:107;;-1:-1:-1;7715:466:184;-1:-1:-1;;;;7715:466:184:o;8186:683::-;8306:6;8314;8322;8330;8383:3;8371:9;8362:7;8358:23;8354:33;8351:53;;;8400:1;8397;8390:12;8351:53;8439:9;8426:23;8458:48;8500:5;8458:48;:::i;:::-;8525:5;-1:-1:-1;8582:2:184;8567:18;;8554:32;8595:50;8554:32;8595:50;:::i;:::-;8664:7;-1:-1:-1;8723:2:184;8708:18;;8695:32;8736:50;8695:32;8736:50;:::i;:::-;8186:683;;;;-1:-1:-1;8805:7:184;;8859:2;8844:18;8831:32;;-1:-1:-1;;8186:683:184:o;8874:::-;8994:6;9002;9010;9018;9071:3;9059:9;9050:7;9046:23;9042:33;9039:53;;;9088:1;9085;9078:12;9039:53;9127:9;9114:23;9146:48;9188:5;9146:48;:::i;:::-;9213:5;-1:-1:-1;9270:2:184;9255:18;;9242:32;9283:50;9242:32;9283:50;:::i;:::-;9352:7;-1:-1:-1;9406:2:184;9391:18;;9378:32;;-1:-1:-1;9462:2:184;9447:18;;9434:32;9475:50;9434:32;9475:50;:::i;:::-;8874:683;;;;-1:-1:-1;8874:683:184;;-1:-1:-1;;8874:683:184:o;9562:332::-;9630:6;9638;9691:2;9679:9;9670:7;9666:23;9662:32;9659:52;;;9707:1;9704;9697:12;9659:52;9746:9;9733:23;9765:48;9807:5;9765:48;:::i;:::-;9832:5;9884:2;9869:18;;;;9856:32;;-1:-1:-1;;;9562:332:184:o;10803:810::-;10940:6;10948;10956;10964;11017:2;11005:9;10996:7;10992:23;10988:32;10985:52;;;11033:1;11030;11023:12;10985:52;11073:9;11060:23;11102:18;11143:2;11135:6;11132:14;11129:34;;;11159:1;11156;11149:12;11129:34;11198:81;11271:7;11262:6;11251:9;11247:22;11198:81;:::i;:::-;11298:8;;-1:-1:-1;11172:107:184;-1:-1:-1;11386:2:184;11371:18;;11358:32;;-1:-1:-1;11402:16:184;;;11399:36;;;11431:1;11428;11421:12;11399:36;;11470:83;11545:7;11534:8;11523:9;11519:24;11470:83;:::i;:::-;10803:810;;;;-1:-1:-1;11572:8:184;-1:-1:-1;;;;10803:810:184:o;12382:268::-;12452:6;12505:2;12493:9;12484:7;12480:23;12476:32;12473:52;;;12521:1;12518;12511:12;12473:52;12553:9;12547:16;12572:48;12614:5;12572:48;:::i;12655:406::-;12857:2;12839:21;;;12896:2;12876:18;;;12869:30;12935:34;12930:2;12915:18;;12908:62;-1:-1:-1;;;13001:2:184;12986:18;;12979:40;13051:3;13036:19;;12655:406::o;13066:245::-;13133:6;13186:2;13174:9;13165:7;13161:23;13157:32;13154:52;;;13202:1;13199;13192:12;13154:52;13234:9;13228:16;13253:28;13275:5;13253:28;:::i;13316:404::-;13518:2;13500:21;;;13557:2;13537:18;;;13530:30;13596:34;13591:2;13576:18;;13569:62;-1:-1:-1;;;13662:2:184;13647:18;;13640:38;13710:3;13695:19;;13316:404::o;16931:472::-;17133:2;17115:21;;;17172:2;17152:18;;;17145:30;17211:34;17206:2;17191:18;;17184:62;17282:34;17277:2;17262:18;;17255:62;-1:-1:-1;;;17348:3:184;17333:19;;17326:35;17393:3;17378:19;;16931:472::o;17408:428::-;17610:2;17592:21;;;17649:2;17629:18;;;17622:30;;;17688:34;17668:18;;;17661:62;17759:34;17754:2;17739:18;;17732:62;17826:3;17811:19;;17408:428::o;17841:127::-;17902:10;17897:3;17893:20;17890:1;17883:31;17933:4;17930:1;17923:15;17957:4;17954:1;17947:15;19467:241;19523:6;19576:2;19564:9;19555:7;19551:23;19547:32;19544:52;;;19592:1;19589;19582:12;19544:52;19631:9;19618:23;19650:28;19672:5;19650:28;:::i;21384:258::-;21456:1;21466:113;21480:6;21477:1;21474:13;21466:113;;;21556:11;;;21550:18;21537:11;;;21530:39;21502:2;21495:10;21466:113;;;21597:6;21594:1;21591:13;21588:48;;;-1:-1:-1;;21632:1:184;21614:16;;21607:27;21384:258::o;21647:257::-;21688:3;21726:5;21720:12;21753:6;21748:3;21741:19;21769:63;21825:6;21818:4;21813:3;21809:14;21802:4;21795:5;21791:16;21769:63;:::i;:::-;21886:2;21865:15;-1:-1:-1;;21861:29:184;21852:39;;;;21893:4;21848:50;;21647:257;-1:-1:-1;;21647:257:184:o;21909:288::-;22084:6;22073:9;22066:25;22127:2;22122;22111:9;22107:18;22100:30;22047:4;22147:44;22187:2;22176:9;22172:18;22164:6;22147:44;:::i;22202:290::-;22271:6;22324:2;22312:9;22303:7;22299:23;22295:32;22292:52;;;22340:1;22337;22330:12;22292:52;22366:16;;-1:-1:-1;;;;;;22411:32:184;;22401:43;;22391:71;;22458:1;22455;22448:12;24250:184;24320:6;24373:2;24361:9;24352:7;24348:23;24344:32;24341:52;;;24389:1;24386;24379:12;24341:52;-1:-1:-1;24412:16:184;;24250:184;-1:-1:-1;24250:184:184:o;27694:127::-;27755:10;27750:3;27746:20;27743:1;27736:31;27786:4;27783:1;27776:15;27810:4;27807:1;27800:15;27826:128;27866:3;27897:1;27893:6;27890:1;27887:13;27884:39;;;27903:18;;:::i;:::-;-1:-1:-1;27939:9:184;;27826:128::o;30045:125::-;30085:4;30113:1;30110;30107:8;30104:34;;;30118:18;;:::i;:::-;-1:-1:-1;30155:9:184;;30045:125::o;30657:127::-;30718:10;30713:3;30709:20;30706:1;30699:31;30749:4;30746:1;30739:15;30773:4;30770:1;30763:15;30789:127;30850:10;30845:3;30841:20;30838:1;30831:31;30881:4;30878:1;30871:15;30905:4;30902:1;30895:15;34019:274;34148:3;34186:6;34180:13;34202:53;34248:6;34243:3;34236:4;34228:6;34224:17;34202:53;:::i;:::-;34271:16;;;;;34019:274;-1:-1:-1;;34019:274:184:o;34298:219::-;34447:2;34436:9;34429:21;34410:4;34467:44;34507:2;34496:9;34492:18;34484:6;34467:44;:::i","linkReferences":{},"immutableReferences":{"4302":[{"start":5307,"length":32}],"5217":[{"start":1306,"length":32},{"start":2948,"length":32},{"start":3793,"length":32},{"start":3877,"length":32},{"start":6769,"length":32}],"5220":[{"start":645,"length":32}],"5223":[{"start":1134,"length":32}]}},"methodIdentifiers":{"DEPOSIT_TYPEHASH()":"48825e94","DOMAIN_TYPEHASH()":"20606b70","addShares(address,address,address,uint256)":"c4623ea1","addStrategiesToDepositWhitelist(address[],bool[])":"df5b3547","delegation()":"df5cf723","depositIntoStrategy(address,address,uint256)":"e7a050aa","depositIntoStrategyWithSignature(address,address,uint256,address,uint256,bytes)":"32e89ace","domainSeparator()":"f698da25","eigenPodManager()":"4665bcda","getDeposits(address)":"94f649dd","initialize(address,address,address,uint256)":"cf756fdf","nonces(address)":"7ecebe00","owner()":"8da5cb5b","pause(uint256)":"136439dd","pauseAll()":"595c6a67","paused()":"5c975abb","paused(uint8)":"5ac86ab7","pauserRegistry()":"886f1195","removeShares(address,address,uint256)":"8c80d4e5","removeStrategiesFromDepositWhitelist(address[])":"b5d8b5b8","renounceOwnership()":"715018a6","setPauserRegistry(address)":"10d67a2f","setStrategyWhitelister(address)":"c6656702","setThirdPartyTransfersForbidden(address,bool)":"4e5a4263","slasher()":"b1344271","stakerStrategyList(address,uint256)":"cbc2bd62","stakerStrategyListLength(address)":"8b8aac3c","stakerStrategyShares(address,address)":"7a7e0d92","strategyIsWhitelistedForDeposit(address)":"663c1de4","strategyWhitelister()":"967fc0d2","thirdPartyTransfersForbidden(address)":"9b4da03d","transferOwnership(address)":"f2fde38b","unpause(uint256)":"fabc1cbc","withdrawSharesAsTokens(address,address,uint256,address)":"c608c7f3"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.12+commit.f00d7308\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IDelegationManager\",\"name\":\"_delegation\",\"type\":\"address\"},{\"internalType\":\"contract IEigenPodManager\",\"name\":\"_eigenPodManager\",\"type\":\"address\"},{\"internalType\":\"contract ISlasher\",\"name\":\"_slasher\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IPauserRegistry\",\"name\":\"pauserRegistry\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contract IPauserRegistry\",\"name\":\"newPauserRegistry\",\"type\":\"address\"}],\"name\":\"PauserRegistrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"StrategyAddedToDepositWhitelist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"}],\"name\":\"StrategyRemovedFromDepositWhitelist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAddress\",\"type\":\"address\"}],\"name\":\"StrategyWhitelisterChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"}],\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEPOSIT_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_TYPEHASH\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"addShares\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStrategy[]\",\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\"},{\"internalType\":\"bool[]\",\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\"}],\"name\":\"addStrategiesToDepositWhitelist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"delegation\",\"outputs\":[{\"internalType\":\"contract IDelegationManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"depositIntoStrategy\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"depositIntoStrategyWithSignature\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"domainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eigenPodManager\",\"outputs\":[{\"internalType\":\"contract IEigenPodManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"getDeposits\",\"outputs\":[{\"internalType\":\"contract IStrategy[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"initialOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"initialStrategyWhitelister\",\"type\":\"address\"},{\"internalType\":\"contract IPauserRegistry\",\"name\":\"_pauserRegistry\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"initialPausedStatus\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pauseAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pauserRegistry\",\"outputs\":[{\"internalType\":\"contract IPauserRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"}],\"name\":\"removeShares\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStrategy[]\",\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\"}],\"name\":\"removeStrategiesFromDepositWhitelist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IPauserRegistry\",\"name\":\"newPauserRegistry\",\"type\":\"address\"}],\"name\":\"setPauserRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newStrategyWhitelister\",\"type\":\"address\"}],\"name\":\"setStrategyWhitelister\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"value\",\"type\":\"bool\"}],\"name\":\"setThirdPartyTransfersForbidden\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"slasher\",\"outputs\":[{\"internalType\":\"contract ISlasher\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stakerStrategyList\",\"outputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"stakerStrategyListLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"stakerStrategyShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"strategyIsWhitelistedForDeposit\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"strategyWhitelister\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IStrategy\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"thirdPartyTransfersForbidden\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPausedStatus\",\"type\":\"uint256\"}],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"contract IStrategy\",\"name\":\"strategy\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shares\",\"type\":\"uint256\"},{\"internalType\":\"contract IERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"withdrawSharesAsTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Layr Labs, Inc.\",\"kind\":\"dev\",\"methods\":{\"addStrategiesToDepositWhitelist(address[],bool[])\":{\"params\":{\"strategiesToWhitelist\":\"Strategies that will be added to the `strategyIsWhitelistedForDeposit` mapping (if they aren't in it already)\",\"thirdPartyTransfersForbiddenValues\":\"bool values to set `thirdPartyTransfersForbidden` to for each strategy\"}},\"constructor\":{\"params\":{\"_delegation\":\"The delegation contract of EigenLayer.\",\"_eigenPodManager\":\"The contract that keeps track of EigenPod stakes for restaking beacon chain ether.\",\"_slasher\":\"The primary slashing contract of EigenLayer.\"}},\"depositIntoStrategy(address,address,uint256)\":{\"details\":\"The `msg.sender` must have previously approved this contract to transfer at least `amount` of `token` on their behalf. WARNING: Depositing tokens that allow reentrancy (eg. ERC-777) into a strategy is not recommended. This can lead to attack vectors where the token balance and corresponding strategy shares are not in sync upon reentrancy.\",\"params\":{\"amount\":\"is the amount of token to be deposited in the strategy by the staker\",\"strategy\":\"is the specified strategy where deposit is to be made,\",\"token\":\"is the denomination in which the deposit is to be made,\"},\"returns\":{\"shares\":\"The amount of new shares in the `strategy` created as part of the action.\"}},\"depositIntoStrategyWithSignature(address,address,uint256,address,uint256,bytes)\":{\"details\":\"The `msg.sender` must have previously approved this contract to transfer at least `amount` of `token` on their behalf.A signature is required for this function to eliminate the possibility of griefing attacks, specifically those targeting stakers who may be attempting to undelegate.Cannot be called if thirdPartyTransfersForbidden is set to true for this strategy WARNING: Depositing tokens that allow reentrancy (eg. ERC-777) into a strategy is not recommended. This can lead to attack vectors where the token balance and corresponding strategy shares are not in sync upon reentrancy\",\"params\":{\"amount\":\"is the amount of token to be deposited in the strategy by the staker\",\"expiry\":\"the timestamp at which the signature expires\",\"signature\":\"is a valid signature from the `staker`. either an ECDSA signature if the `staker` is an EOA, or data to forward following EIP-1271 if the `staker` is a contract\",\"staker\":\"the staker that the deposited assets will be credited to\",\"strategy\":\"is the specified strategy where deposit is to be made,\",\"token\":\"is the denomination in which the deposit is to be made,\"},\"returns\":{\"shares\":\"The amount of new shares in the `strategy` created as part of the action.\"}},\"domainSeparator()\":{\"details\":\"The domain separator will change in the event of a fork that changes the ChainID.\"},\"getDeposits(address)\":{\"params\":{\"staker\":\"The staker of interest, whose deposits this function will fetch\"},\"returns\":{\"_0\":\"(staker's strategies, shares in these strategies)\"}},\"initialize(address,address,address,uint256)\":{\"params\":{\"_pauserRegistry\":\"Used for access control of pausing.\",\"initialOwner\":\"Ownership of this contract is transferred to this address.\",\"initialPausedStatus\":\"The initial value of `_paused` to set.\",\"initialStrategyWhitelister\":\"The initial value of `strategyWhitelister` to set.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pause(uint256)\":{\"details\":\"This function can only pause functionality, and thus cannot 'unflip' any bit in `_paused` from 1 to 0.\",\"params\":{\"newPausedStatus\":\"represents the new value for `_paused` to take, which means it may flip several bits at once.\"}},\"removeStrategiesFromDepositWhitelist(address[])\":{\"params\":{\"strategiesToRemoveFromWhitelist\":\"Strategies that will be removed to the `strategyIsWhitelistedForDeposit` mapping (if they are in it)\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setStrategyWhitelister(address)\":{\"params\":{\"newStrategyWhitelister\":\"new address for the `strategyWhitelister`.\"}},\"setThirdPartyTransfersForbidden(address,bool)\":{\"params\":{\"strategy\":\"The strategy to set `thirdPartyTransfersForbidden` value to\",\"value\":\"bool value to set `thirdPartyTransfersForbidden` to\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"unpause(uint256)\":{\"details\":\"This function can only unpause functionality, and thus cannot 'flip' any bit in `_paused` from 0 to 1.\",\"params\":{\"newPausedStatus\":\"represents the new value for `_paused` to take, which means it may flip several bits at once.\"}}},\"title\":\"The primary entry- and exit-point for funds into and out of EigenLayer.\",\"version\":1},\"userdoc\":{\"events\":{\"Deposit(address,address,address,uint256)\":{\"notice\":\"Emitted when a new deposit occurs on behalf of `staker`.\"},\"Paused(address,uint256)\":{\"notice\":\"Emitted when the pause is triggered by `account`, and changed to `newPausedStatus`.\"},\"PauserRegistrySet(address,address)\":{\"notice\":\"Emitted when the `pauserRegistry` is set to `newPauserRegistry`.\"},\"StrategyAddedToDepositWhitelist(address)\":{\"notice\":\"Emitted when a strategy is added to the approved list of strategies for deposit\"},\"StrategyRemovedFromDepositWhitelist(address)\":{\"notice\":\"Emitted when a strategy is removed from the approved list of strategies for deposit\"},\"StrategyWhitelisterChanged(address,address)\":{\"notice\":\"Emitted when the `strategyWhitelister` is changed\"},\"Unpaused(address,uint256)\":{\"notice\":\"Emitted when the pause is lifted by `account`, and changed to `newPausedStatus`.\"},\"UpdatedThirdPartyTransfersForbidden(address,bool)\":{\"notice\":\"Emitted when `thirdPartyTransfersForbidden` is updated for a strategy and value by the owner\"}},\"kind\":\"user\",\"methods\":{\"DEPOSIT_TYPEHASH()\":{\"notice\":\"The EIP-712 typehash for the deposit struct used by the contract\"},\"DOMAIN_TYPEHASH()\":{\"notice\":\"The EIP-712 typehash for the contract's domain\"},\"addShares(address,address,address,uint256)\":{\"notice\":\"Used by the DelegationManager to award a Staker some shares that have passed through the withdrawal queue\"},\"addStrategiesToDepositWhitelist(address[],bool[])\":{\"notice\":\"Owner-only function that adds the provided Strategies to the 'whitelist' of strategies that stakers can deposit into\"},\"delegation()\":{\"notice\":\"Returns the single, central Delegation contract of EigenLayer\"},\"depositIntoStrategy(address,address,uint256)\":{\"notice\":\"Deposits `amount` of `token` into the specified `strategy`, with the resultant shares credited to `msg.sender`\"},\"depositIntoStrategyWithSignature(address,address,uint256,address,uint256,bytes)\":{\"notice\":\"Used for depositing an asset into the specified strategy with the resultant shares credited to `staker`, who must sign off on the action. Note that the assets are transferred out/from the `msg.sender`, not from the `staker`; this function is explicitly designed purely to help one address deposit 'for' another.\"},\"domainSeparator()\":{\"notice\":\"Getter function for the current EIP-712 domain separator for this contract.\"},\"eigenPodManager()\":{\"notice\":\"Returns the EigenPodManager contract of EigenLayer\"},\"getDeposits(address)\":{\"notice\":\"Get all details on the staker's deposits and corresponding shares\"},\"initialize(address,address,address,uint256)\":{\"notice\":\"Initializes the strategy manager contract. Sets the `pauserRegistry` (currently **not** modifiable after being set), and transfers contract ownership to the specified `initialOwner`.\"},\"pause(uint256)\":{\"notice\":\"This function is used to pause an EigenLayer contract's functionality. It is permissioned to the `pauser` address, which is expected to be a low threshold multisig.\"},\"pauseAll()\":{\"notice\":\"Alias for `pause(type(uint256).max)`.\"},\"paused()\":{\"notice\":\"Returns the current paused status as a uint256.\"},\"paused(uint8)\":{\"notice\":\"Returns 'true' if the `indexed`th bit of `_paused` is 1, and 'false' otherwise\"},\"pauserRegistry()\":{\"notice\":\"Address of the `PauserRegistry` contract that this contract defers to for determining access control (for pausing).\"},\"removeShares(address,address,uint256)\":{\"notice\":\"Used by the DelegationManager to remove a Staker's shares from a particular strategy when entering the withdrawal queue\"},\"removeStrategiesFromDepositWhitelist(address[])\":{\"notice\":\"Owner-only function that removes the provided Strategies from the 'whitelist' of strategies that stakers can deposit into\"},\"setPauserRegistry(address)\":{\"notice\":\"Allows the unpauser to set a new pauser registry\"},\"setStrategyWhitelister(address)\":{\"notice\":\"Owner-only function to change the `strategyWhitelister` address.\"},\"setThirdPartyTransfersForbidden(address,bool)\":{\"notice\":\"If true for a strategy, a user cannot depositIntoStrategyWithSignature into that strategy for another staker and also when performing DelegationManager.queueWithdrawals, a staker can only withdraw to themselves. Defaulted to false for all existing strategies.\"},\"slasher()\":{\"notice\":\"Returns the single, central Slasher contract of EigenLayer\"},\"stakerStrategyList(address,uint256)\":{\"notice\":\"Mapping: staker => array of strategies in which they have nonzero shares\"},\"stakerStrategyListLength(address)\":{\"notice\":\"Simple getter function that returns `stakerStrategyList[staker].length`.\"},\"stakerStrategyShares(address,address)\":{\"notice\":\"Mapping: staker => Strategy => number of shares which they currently hold\"},\"strategyIsWhitelistedForDeposit(address)\":{\"notice\":\"Mapping: strategy => whether or not stakers are allowed to deposit into it\"},\"strategyWhitelister()\":{\"notice\":\"Permissioned role, which can be changed by the contract owner. Has the ability to edit the strategy whitelist\"},\"thirdPartyTransfersForbidden(address)\":{\"notice\":\"Mapping: strategy => whether or not stakers are allowed to transfer strategy shares to another address if true for a strategy, a user cannot depositIntoStrategyWithSignature into that strategy for another staker and also when performing queueWithdrawals, a staker can only withdraw to themselves\"},\"unpause(uint256)\":{\"notice\":\"This function is used to unpause an EigenLayer contract's functionality. It is permissioned to the `unpauser` address, which is expected to be a high threshold multisig or governance contract.\"},\"withdrawSharesAsTokens(address,address,uint256,address)\":{\"notice\":\"Used by the DelegationManager to convert withdrawn shares to tokens and send them to a recipient\"}},\"notice\":\"Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-serviceThis contract is for managing deposits in different strategies. The main functionalities are: - adding and removing strategies that any delegator can deposit into - enabling deposit of assets into specified strategy(s)\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/StrategyManager.sol\":\"StrategyManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/\",\":eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/\",\":eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/\",\":eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/\",\":eigenlayer-middleware/=lib/eigenlayer-middleware/src/\",\":eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/\",\":erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/\",\":openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/\",\":openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/\",\":openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/\"]},\"sources\":{\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/StrategyManager.sol\":{\"keccak256\":\"0xddd71d6fce276ea741d6781da43d022934ce6778fef0d11ab7319a0f52531236\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://9fc471386bbf4831fe668405efa37a5702161b4e7be8289778328da3887dd09a\",\"dweb:/ipfs/QmeEQYvJRDHkmFyc4Wf8iV12hiSYNyNGWZKASQYZTAErDq\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/StrategyManagerStorage.sol\":{\"keccak256\":\"0x2b495a50f5b31945e572997fa3dbb0f1b4bcb9d9f17cff51e2c730248407168c\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://a124af488ce3eb2b70a936a13f1e8922d4ea6071d9e5e801708d6bb8685b7d10\",\"dweb:/ipfs/QmPkGRKNu1LFMiZSbpTEY76kqFVfQSkwqioAmR4NVjW5vY\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol\":{\"keccak256\":\"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983\",\"dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol\":{\"keccak256\":\"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914\",\"dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol\":{\"keccak256\":\"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c\",\"license\":\"CC0-1.0\",\"urls\":[\"bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91\",\"dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol\":{\"keccak256\":\"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc\",\"dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol\":{\"keccak256\":\"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8\",\"dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol\":{\"keccak256\":\"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324\",\"dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol\":{\"keccak256\":\"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d\",\"dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol\":{\"keccak256\":\"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c\",\"dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol\":{\"keccak256\":\"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232\",\"dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol\":{\"keccak256\":\"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73\",\"dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol\":{\"keccak256\":\"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef\",\"dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol\":{\"keccak256\":\"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7\",\"dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/EIP1271SignatureUtils.sol\":{\"keccak256\":\"0xe92d584c47c5828e026a8082af3da38a853e3942c4da7deb705d6470a41afab3\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://1c436c578781fd7d3dffdb24e906819422819f5e9a71d39ee63166a3d5cb3373\",\"dweb:/ipfs/QmP7bJhYqLpwqk2Xq4tqDCUMi2nFAhxxW3Pz36ctE1sbdD\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol\":{\"keccak256\":\"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f\",\"dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol\":{\"keccak256\":\"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f\",\"dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5\"]},\"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/permissions/Pausable.sol\":{\"keccak256\":\"0xce8ee0ab28f2bce9e94aa19fffe55bebef080327632ac98ff3ab14994b369bc0\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://5c7e2be97a8840fa2a0434077a36136553a84efd9bff4b46712ce9fddb813a6a\",\"dweb:/ipfs/QmZKvgPxLAbGo1CqTA4AX6MCDPFLSSNt43ZKWRjvvzFp7S\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a\",\"dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497\",\"dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol\":{\"keccak256\":\"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://607818f1b44548c2d8268176f73cdb290e1faed971b1061930d92698366e2a11\",\"dweb:/ipfs/QmQibMe3r5no95b6q7isGT5R75V8xSofWEDLXzp95b7LgZ\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4\",\"dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol\":{\"keccak256\":\"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c45b821ef9e882e57c256697a152e108f0f2ad6997609af8904cae99c9bd422e\",\"dweb:/ipfs/QmRKCJW6jjzR5UYZcLpGnhEJ75UVbH6EHkEa49sWx2SKng\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354\",\"dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34\",\"dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol\":{\"keccak256\":\"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95\",\"dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6\",\"dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487\",\"dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/Strings.sol\":{\"keccak256\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6f2cf1c531122bc7ca96b8c8db6a60deae60441e5223065e792553d4849b5638\",\"dweb:/ipfs/QmPBdJmBBABMDCfyDjCbdxgiqRavgiSL88SYPGibgbPas9\"]},\"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x84ac2d2f343df1e683da7a12bbcf70db542a7a7a0cea90a5d70fcb5e5d035481\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://73ae8e0c6f975052973265113d762629002ce33987b1933c2a378667e2816f2f\",\"dweb:/ipfs/QmQAootkVfoe4PLaYbT4Xob2dJRm3bZfbCffEHRbCYXNPF\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.12+commit.f00d7308"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IDelegationManager","name":"_delegation","type":"address"},{"internalType":"contract IEigenPodManager","name":"_eigenPodManager","type":"address"},{"internalType":"contract ISlasher","name":"_slasher","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"staker","type":"address","indexed":false},{"internalType":"contract IERC20","name":"token","type":"address","indexed":false},{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false},{"internalType":"uint256","name":"shares","type":"uint256","indexed":false}],"type":"event","name":"Deposit","anonymous":false},{"inputs":[{"internalType":"uint8","name":"version","type":"uint8","indexed":false}],"type":"event","name":"Initialized","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"newPausedStatus","type":"uint256","indexed":false}],"type":"event","name":"Paused","anonymous":false},{"inputs":[{"internalType":"contract IPauserRegistry","name":"pauserRegistry","type":"address","indexed":false},{"internalType":"contract IPauserRegistry","name":"newPauserRegistry","type":"address","indexed":false}],"type":"event","name":"PauserRegistrySet","anonymous":false},{"inputs":[{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false}],"type":"event","name":"StrategyAddedToDepositWhitelist","anonymous":false},{"inputs":[{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false}],"type":"event","name":"StrategyRemovedFromDepositWhitelist","anonymous":false},{"inputs":[{"internalType":"address","name":"previousAddress","type":"address","indexed":false},{"internalType":"address","name":"newAddress","type":"address","indexed":false}],"type":"event","name":"StrategyWhitelisterChanged","anonymous":false},{"inputs":[{"internalType":"address","name":"account","type":"address","indexed":true},{"internalType":"uint256","name":"newPausedStatus","type":"uint256","indexed":false}],"type":"event","name":"Unpaused","anonymous":false},{"inputs":[{"internalType":"contract IStrategy","name":"strategy","type":"address","indexed":false},{"internalType":"bool","name":"value","type":"bool","indexed":false}],"type":"event","name":"UpdatedThirdPartyTransfersForbidden","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"DEPOSIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"addShares"},{"inputs":[{"internalType":"contract IStrategy[]","name":"strategiesToWhitelist","type":"address[]"},{"internalType":"bool[]","name":"thirdPartyTransfersForbiddenValues","type":"bool[]"}],"stateMutability":"nonpayable","type":"function","name":"addStrategiesToDepositWhitelist"},{"inputs":[],"stateMutability":"view","type":"function","name":"delegation","outputs":[{"internalType":"contract IDelegationManager","name":"","type":"address"}]},{"inputs":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"depositIntoStrategy","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}]},{"inputs":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"staker","type":"address"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"depositIntoStrategyWithSignature","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"eigenPodManager","outputs":[{"internalType":"contract IEigenPodManager","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"stateMutability":"view","type":"function","name":"getDeposits","outputs":[{"internalType":"contract IStrategy[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}]},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"initialStrategyWhitelister","type":"address"},{"internalType":"contract IPauserRegistry","name":"_pauserRegistry","type":"address"},{"internalType":"uint256","name":"initialPausedStatus","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"initialize"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"newPausedStatus","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"pause"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"pauseAll"},{"inputs":[{"internalType":"uint8","name":"index","type":"uint8"}],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"paused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"pauserRegistry","outputs":[{"internalType":"contract IPauserRegistry","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"staker","type":"address"},{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"removeShares"},{"inputs":[{"internalType":"contract IStrategy[]","name":"strategiesToRemoveFromWhitelist","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"removeStrategiesFromDepositWhitelist"},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"contract IPauserRegistry","name":"newPauserRegistry","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setPauserRegistry"},{"inputs":[{"internalType":"address","name":"newStrategyWhitelister","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"setStrategyWhitelister"},{"inputs":[{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setThirdPartyTransfersForbidden"},{"inputs":[],"stateMutability":"view","type":"function","name":"slasher","outputs":[{"internalType":"contract ISlasher","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"stakerStrategyList","outputs":[{"internalType":"contract IStrategy","name":"","type":"address"}]},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"stateMutability":"view","type":"function","name":"stakerStrategyListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"contract IStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"stakerStrategyShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"contract IStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"strategyIsWhitelistedForDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"strategyWhitelister","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[{"internalType":"contract IStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"thirdPartyTransfersForbidden","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"},{"inputs":[{"internalType":"uint256","name":"newPausedStatus","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"unpause"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"contract IStrategy","name":"strategy","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"contract IERC20","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"withdrawSharesAsTokens"}],"devdoc":{"kind":"dev","methods":{"addStrategiesToDepositWhitelist(address[],bool[])":{"params":{"strategiesToWhitelist":"Strategies that will be added to the `strategyIsWhitelistedForDeposit` mapping (if they aren't in it already)","thirdPartyTransfersForbiddenValues":"bool values to set `thirdPartyTransfersForbidden` to for each strategy"}},"constructor":{"params":{"_delegation":"The delegation contract of EigenLayer.","_eigenPodManager":"The contract that keeps track of EigenPod stakes for restaking beacon chain ether.","_slasher":"The primary slashing contract of EigenLayer."}},"depositIntoStrategy(address,address,uint256)":{"details":"The `msg.sender` must have previously approved this contract to transfer at least `amount` of `token` on their behalf. WARNING: Depositing tokens that allow reentrancy (eg. ERC-777) into a strategy is not recommended. This can lead to attack vectors where the token balance and corresponding strategy shares are not in sync upon reentrancy.","params":{"amount":"is the amount of token to be deposited in the strategy by the staker","strategy":"is the specified strategy where deposit is to be made,","token":"is the denomination in which the deposit is to be made,"},"returns":{"shares":"The amount of new shares in the `strategy` created as part of the action."}},"depositIntoStrategyWithSignature(address,address,uint256,address,uint256,bytes)":{"details":"The `msg.sender` must have previously approved this contract to transfer at least `amount` of `token` on their behalf.A signature is required for this function to eliminate the possibility of griefing attacks, specifically those targeting stakers who may be attempting to undelegate.Cannot be called if thirdPartyTransfersForbidden is set to true for this strategy WARNING: Depositing tokens that allow reentrancy (eg. ERC-777) into a strategy is not recommended. This can lead to attack vectors where the token balance and corresponding strategy shares are not in sync upon reentrancy","params":{"amount":"is the amount of token to be deposited in the strategy by the staker","expiry":"the timestamp at which the signature expires","signature":"is a valid signature from the `staker`. either an ECDSA signature if the `staker` is an EOA, or data to forward following EIP-1271 if the `staker` is a contract","staker":"the staker that the deposited assets will be credited to","strategy":"is the specified strategy where deposit is to be made,","token":"is the denomination in which the deposit is to be made,"},"returns":{"shares":"The amount of new shares in the `strategy` created as part of the action."}},"domainSeparator()":{"details":"The domain separator will change in the event of a fork that changes the ChainID."},"getDeposits(address)":{"params":{"staker":"The staker of interest, whose deposits this function will fetch"},"returns":{"_0":"(staker's strategies, shares in these strategies)"}},"initialize(address,address,address,uint256)":{"params":{"_pauserRegistry":"Used for access control of pausing.","initialOwner":"Ownership of this contract is transferred to this address.","initialPausedStatus":"The initial value of `_paused` to set.","initialStrategyWhitelister":"The initial value of `strategyWhitelister` to set."}},"owner()":{"details":"Returns the address of the current owner."},"pause(uint256)":{"details":"This function can only pause functionality, and thus cannot 'unflip' any bit in `_paused` from 1 to 0.","params":{"newPausedStatus":"represents the new value for `_paused` to take, which means it may flip several bits at once."}},"removeStrategiesFromDepositWhitelist(address[])":{"params":{"strategiesToRemoveFromWhitelist":"Strategies that will be removed to the `strategyIsWhitelistedForDeposit` mapping (if they are in it)"}},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."},"setStrategyWhitelister(address)":{"params":{"newStrategyWhitelister":"new address for the `strategyWhitelister`."}},"setThirdPartyTransfersForbidden(address,bool)":{"params":{"strategy":"The strategy to set `thirdPartyTransfersForbidden` value to","value":"bool value to set `thirdPartyTransfersForbidden` to"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"unpause(uint256)":{"details":"This function can only unpause functionality, and thus cannot 'flip' any bit in `_paused` from 0 to 1.","params":{"newPausedStatus":"represents the new value for `_paused` to take, which means it may flip several bits at once."}}},"version":1},"userdoc":{"kind":"user","methods":{"DEPOSIT_TYPEHASH()":{"notice":"The EIP-712 typehash for the deposit struct used by the contract"},"DOMAIN_TYPEHASH()":{"notice":"The EIP-712 typehash for the contract's domain"},"addShares(address,address,address,uint256)":{"notice":"Used by the DelegationManager to award a Staker some shares that have passed through the withdrawal queue"},"addStrategiesToDepositWhitelist(address[],bool[])":{"notice":"Owner-only function that adds the provided Strategies to the 'whitelist' of strategies that stakers can deposit into"},"delegation()":{"notice":"Returns the single, central Delegation contract of EigenLayer"},"depositIntoStrategy(address,address,uint256)":{"notice":"Deposits `amount` of `token` into the specified `strategy`, with the resultant shares credited to `msg.sender`"},"depositIntoStrategyWithSignature(address,address,uint256,address,uint256,bytes)":{"notice":"Used for depositing an asset into the specified strategy with the resultant shares credited to `staker`, who must sign off on the action. Note that the assets are transferred out/from the `msg.sender`, not from the `staker`; this function is explicitly designed purely to help one address deposit 'for' another."},"domainSeparator()":{"notice":"Getter function for the current EIP-712 domain separator for this contract."},"eigenPodManager()":{"notice":"Returns the EigenPodManager contract of EigenLayer"},"getDeposits(address)":{"notice":"Get all details on the staker's deposits and corresponding shares"},"initialize(address,address,address,uint256)":{"notice":"Initializes the strategy manager contract. Sets the `pauserRegistry` (currently **not** modifiable after being set), and transfers contract ownership to the specified `initialOwner`."},"pause(uint256)":{"notice":"This function is used to pause an EigenLayer contract's functionality. It is permissioned to the `pauser` address, which is expected to be a low threshold multisig."},"pauseAll()":{"notice":"Alias for `pause(type(uint256).max)`."},"paused()":{"notice":"Returns the current paused status as a uint256."},"paused(uint8)":{"notice":"Returns 'true' if the `indexed`th bit of `_paused` is 1, and 'false' otherwise"},"pauserRegistry()":{"notice":"Address of the `PauserRegistry` contract that this contract defers to for determining access control (for pausing)."},"removeShares(address,address,uint256)":{"notice":"Used by the DelegationManager to remove a Staker's shares from a particular strategy when entering the withdrawal queue"},"removeStrategiesFromDepositWhitelist(address[])":{"notice":"Owner-only function that removes the provided Strategies from the 'whitelist' of strategies that stakers can deposit into"},"setPauserRegistry(address)":{"notice":"Allows the unpauser to set a new pauser registry"},"setStrategyWhitelister(address)":{"notice":"Owner-only function to change the `strategyWhitelister` address."},"setThirdPartyTransfersForbidden(address,bool)":{"notice":"If true for a strategy, a user cannot depositIntoStrategyWithSignature into that strategy for another staker and also when performing DelegationManager.queueWithdrawals, a staker can only withdraw to themselves. Defaulted to false for all existing strategies."},"slasher()":{"notice":"Returns the single, central Slasher contract of EigenLayer"},"stakerStrategyList(address,uint256)":{"notice":"Mapping: staker => array of strategies in which they have nonzero shares"},"stakerStrategyListLength(address)":{"notice":"Simple getter function that returns `stakerStrategyList[staker].length`."},"stakerStrategyShares(address,address)":{"notice":"Mapping: staker => Strategy => number of shares which they currently hold"},"strategyIsWhitelistedForDeposit(address)":{"notice":"Mapping: strategy => whether or not stakers are allowed to deposit into it"},"strategyWhitelister()":{"notice":"Permissioned role, which can be changed by the contract owner. Has the ability to edit the strategy whitelist"},"thirdPartyTransfersForbidden(address)":{"notice":"Mapping: strategy => whether or not stakers are allowed to transfer strategy shares to another address if true for a strategy, a user cannot depositIntoStrategyWithSignature into that strategy for another staker and also when performing queueWithdrawals, a staker can only withdraw to themselves"},"unpause(uint256)":{"notice":"This function is used to unpause an EigenLayer contract's functionality. It is permissioned to the `unpauser` address, which is expected to be a high threshold multisig or governance contract."},"withdrawSharesAsTokens(address,address,uint256,address)":{"notice":"Used by the DelegationManager to convert withdrawn shares to tokens and send them to a recipient"}},"version":1}},"settings":{"remappings":["@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","@openzeppelin-upgrades/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","@openzeppelin-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","@openzeppelin/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","ds-test/=lib/eigenlayer-middleware/lib/ds-test/src/","eigenlayer-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/","eigenlayer-core-contracts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/","eigenlayer-core/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/","eigenlayer-middleware/=lib/eigenlayer-middleware/src/","eigenlayer-scripts/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/script/","erc4626-tests/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/","openzeppelin-contracts-upgradeable/=lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v4.9.0/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/","openzeppelin-contracts/=lib/eigenlayer-middleware/lib/openzeppelin-contracts/","openzeppelin/=lib/eigenlayer-middleware/lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/StrategyManager.sol":"StrategyManager"},"evmVersion":"london","libraries":{}},"sources":{"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/StrategyManager.sol":{"keccak256":"0xddd71d6fce276ea741d6781da43d022934ce6778fef0d11ab7319a0f52531236","urls":["bzz-raw://9fc471386bbf4831fe668405efa37a5702161b4e7be8289778328da3887dd09a","dweb:/ipfs/QmeEQYvJRDHkmFyc4Wf8iV12hiSYNyNGWZKASQYZTAErDq"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/core/StrategyManagerStorage.sol":{"keccak256":"0x2b495a50f5b31945e572997fa3dbb0f1b4bcb9d9f17cff51e2c730248407168c","urls":["bzz-raw://a124af488ce3eb2b70a936a13f1e8922d4ea6071d9e5e801708d6bb8685b7d10","dweb:/ipfs/QmPkGRKNu1LFMiZSbpTEY76kqFVfQSkwqioAmR4NVjW5vY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol":{"keccak256":"0x0fef07aa6179c77198f1514e12e628aa1c876e04f9c181ec853a322179e5be00","urls":["bzz-raw://51438325876cc2d4c77f58488a7e27b488015d1b663c50be6a5cafbd73b9c983","dweb:/ipfs/QmViCuGoYZzi6wtXA8PPKigqVv3KMuNxEVQ1Td9dGqjL18"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol":{"keccak256":"0xab76a9f4eff865cbb689f627cf98263488765519d7a4ec5ffbcb0ca4972842f9","urls":["bzz-raw://ff57ce18e8350bf39f190645db0988bc0f1279f1872150a114a1b520c38a2914","dweb:/ipfs/QmSsUXkNUqYuJgGRumHTSs9rAaboGjecotcM4xHrdBYWaZ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol":{"keccak256":"0x2e60e5f4b0da0a0a4e2a07c63141120998559970c21deac743ea0c64a60a880c","urls":["bzz-raw://e635c346bde5b7ade9bcf35bc733081520cb86015be4fbc6e761e6e9482c4c91","dweb:/ipfs/QmRoeazEnbFn5SPSWAkoFK2gSN9DMp3hJAnrLWuL2sKutz"],"license":"CC0-1.0"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol":{"keccak256":"0xb50c36ad96b6679bb80fd8331f949cbfbcba0f529026e1421a4d2bae64396eba","urls":["bzz-raw://5719181d780120f1e688c0da276992a8caf185815917f453b3550537c31ed4cc","dweb:/ipfs/QmYprRC5ZEXhz3zAUND5E8Xjn6s5TL8ZF8QbnndVq7aVPR"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol":{"keccak256":"0xd8a64dbed03d3a5cdbefe1af75968f2dde07f973749c2ef5197bf7187c3e448c","urls":["bzz-raw://27ccc7c1fd9352e9f9b357c9063d255dc0ed9583f43db09f786ac7497d7846b8","dweb:/ipfs/QmeJzuJkE9m2NUNwZSp4tGZEZmih1LeucePup8hzMVDRbG"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPausable.sol":{"keccak256":"0x98cffc894842947377e24c1d375813a1120dd73a84c29782ab68404e109cb34f","urls":["bzz-raw://b3474f6c350ceaee57cbdfb08fb48835d0c6e81ae8ebfbb9667899584a139324","dweb:/ipfs/QmWELKtksdtWxQbqAccd8yGyhKqrgPZXTADKR7BuT27Zg5"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol":{"keccak256":"0x9de8dd682bc0d812bbd6583c0231cbf35448d5eff58b74a93efa64cb9a768c49","urls":["bzz-raw://c00d6c675b9c72b092d287fe85fd37782588df32b8eb59ab4c7db7a86be25e7d","dweb:/ipfs/QmeYokY3HhAdbBaCPdHg3PgQEdRCDFEJy3Wf7VtgHBkQSx"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol":{"keccak256":"0x5e52482a31d94401a8502f3014c4aada1142b4450fc0596dff8e1866a85fe092","urls":["bzz-raw://17dc326c9361bc1453379f26545963557b2883b0c88bc07d4477e04dbcc0cc8c","dweb:/ipfs/QmZXT7A816W5JH2ymirE2ETaJttqztFCsEL22AV8oEfCK9"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol":{"keccak256":"0x45dfaa2cfdde87f48a6ee38bb6fb739847aef7cf3f6137bdcd8c8a330559ec79","urls":["bzz-raw://1b7f6bd75b42fcaa91ceb7140cb2c41926a1fe6ee2d3161e4fe6186b181ba232","dweb:/ipfs/QmZjbdKiSs33C9i3GDc3sdD39Pz4YPkDoKftowoUF4kHmY"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol":{"keccak256":"0xc530c6a944b70051fd0dac0222de9a4b5baadeaf94ad194daac6ad8d2ace7420","urls":["bzz-raw://3767df0364ce835b52e786d2851431eb9223fe4747602107505477e162231d73","dweb:/ipfs/QmZkH5bKUygQrJomndNaQqkefVRW4rRefCa8HPJ5HMczxJ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol":{"keccak256":"0x68bf02a443fc8b2f612eba3d39bfefa5f61f78b549f111cdecec5f2c58236a52","urls":["bzz-raw://76bc6875ce74128b861fdac5fd1c0c72f3cc9bacf67fa4a73721b95fb23959ef","dweb:/ipfs/QmPix4WJmf9fXyMZxfgwXEHBcg7V4NAbRqs4HUf5YrSJcM"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/BeaconChainProofs.sol":{"keccak256":"0x70d89b05c1c5f47b74a07fbb5a2c05e606fed494e749ea98a9915b7be73df377","urls":["bzz-raw://db1d3bfaee69aef53c8b12b492a17584e6d1ac94610cb8b38aad33e1cdd81af7","dweb:/ipfs/QmfVsMTj1hcf9fMEm5RzvtcBN4dMcAKFBgUUDsNDr5XFpq"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/EIP1271SignatureUtils.sol":{"keccak256":"0xe92d584c47c5828e026a8082af3da38a853e3942c4da7deb705d6470a41afab3","urls":["bzz-raw://1c436c578781fd7d3dffdb24e906819422819f5e9a71d39ee63166a3d5cb3373","dweb:/ipfs/QmP7bJhYqLpwqk2Xq4tqDCUMi2nFAhxxW3Pz36ctE1sbdD"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Endian.sol":{"keccak256":"0xf3b72653ba2567a978d4612703fa5f71c5fcd015d8dac7818468f22772d90a9d","urls":["bzz-raw://cee9d09370d968138d775c39525db4cd0768d60d17be7685519de12444e7dd2f","dweb:/ipfs/QmUdGh8wpMei3edKiEWA6S96s9dRt4ekZKJ4nau356X8xQ"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/libraries/Merkle.sol":{"keccak256":"0x9095fc29b96d102b10c02d44b3a6fbfa25593ef6ae4a810363ab885b9e6b0f71","urls":["bzz-raw://0945132d482d56278edddb1d32209903c4d3839c87ba4317aadd97dc23610d0f","dweb:/ipfs/QmVuM2aLRHxitx4rPx3GTYTBCVNcjYn6sHBRr1biUjLBP5"],"license":"MIT"},"lib/eigenlayer-middleware/lib/eigenlayer-contracts/src/contracts/permissions/Pausable.sol":{"keccak256":"0xce8ee0ab28f2bce9e94aa19fffe55bebef080327632ac98ff3ab14994b369bc0","urls":["bzz-raw://5c7e2be97a8840fa2a0434077a36136553a84efd9bff4b46712ce9fddb813a6a","dweb:/ipfs/QmZKvgPxLAbGo1CqTA4AX6MCDPFLSSNt43ZKWRjvvzFp7S"],"license":"BUSL-1.1"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol":{"keccak256":"0x247c62047745915c0af6b955470a72d1696ebad4352d7d3011aef1a2463cd888","urls":["bzz-raw://d7fc8396619de513c96b6e00301b88dd790e83542aab918425633a5f7297a15a","dweb:/ipfs/QmXbP4kiZyp7guuS7xe8KaybnwkRPGrBc2Kbi3vhcTfpxb"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol":{"keccak256":"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e","urls":["bzz-raw://6eb2fd1e9894dbe778f4b8131adecebe570689e63cf892f4e21257bfe1252497","dweb:/ipfs/QmXgUGNfZvrn6N2miv3nooSs7Jm34A41qz94fu2GtDFcx8"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/security/ReentrancyGuardUpgradeable.sol":{"keccak256":"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167","urls":["bzz-raw://607818f1b44548c2d8268176f73cdb290e1faed971b1061930d92698366e2a11","dweb:/ipfs/QmQibMe3r5no95b6q7isGT5R75V8xSofWEDLXzp95b7LgZ"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/AddressUpgradeable.sol":{"keccak256":"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3","urls":["bzz-raw://9b4b2110b7f2b3eb32951bc08046fa90feccffa594e1176cb91cdfb0e94726b4","dweb:/ipfs/QmSxLwYjicf9zWFuieRc8WQwE4FisA1Um5jp1iSa731TGt"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol":{"keccak256":"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149","urls":["bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c","dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/interfaces/IERC1271.sol":{"keccak256":"0x0705a4b1b86d7b0bd8432118f226ba139c44b9dcaba0a6eafba2dd7d0639c544","urls":["bzz-raw://c45b821ef9e882e57c256697a152e108f0f2ad6997609af8904cae99c9bd422e","dweb:/ipfs/QmRKCJW6jjzR5UYZcLpGnhEJ75UVbH6EHkEa49sWx2SKng"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol":{"keccak256":"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61","urls":["bzz-raw://ada1e030c0231db8d143b44ce92b4d1158eedb087880cad6d8cc7bd7ebe7b354","dweb:/ipfs/QmWZ2NHZweRpz1U9GF6R1h65ri76dnX7fNxLBeM2t5N5Ce"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol":{"keccak256":"0x9750c6b834f7b43000631af5cc30001c5f547b3ceb3635488f140f60e897ea6b","urls":["bzz-raw://5a7d5b1ef5d8d5889ad2ed89d8619c09383b80b72ab226e0fe7bde1636481e34","dweb:/ipfs/QmebXWgtEfumQGBdVeM6c71McLixYXQP5Bk6kKXuoY4Bmr"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"keccak256":"0xf41ca991f30855bf80ffd11e9347856a517b977f0a6c2d52e6421a99b7840329","urls":["bzz-raw://b2717fd2bdac99daa960a6de500754ea1b932093c946388c381da48658234b95","dweb:/ipfs/QmP6QVMn6UeA3ByahyJbYQr5M6coHKBKsf3ySZSfbyA8R7"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol":{"keccak256":"0x032807210d1d7d218963d7355d62e021a84bf1b3339f4f50be2f63b53cccaf29","urls":["bzz-raw://11756f42121f6541a35a8339ea899ee7514cfaa2e6d740625fcc844419296aa6","dweb:/ipfs/QmekMuk6BY4DAjzeXr4MSbKdgoqqsZnA8JPtuyWc6CwXHf"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10","urls":["bzz-raw://35c47bece3c03caaa07fab37dd2bb3413bfbca20db7bd9895024390e0a469487","dweb:/ipfs/QmPGWT2x3QHcKxqe6gRmAkdakhbaRgx3DLzcakHz5M4eXG"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/Strings.sol":{"keccak256":"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3","urls":["bzz-raw://6f2cf1c531122bc7ca96b8c8db6a60deae60441e5223065e792553d4849b5638","dweb:/ipfs/QmPBdJmBBABMDCfyDjCbdxgiqRavgiSL88SYPGibgbPas9"],"license":"MIT"},"lib/eigenlayer-middleware/lib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sol":{"keccak256":"0x84ac2d2f343df1e683da7a12bbcf70db542a7a7a0cea90a5d70fcb5e5d035481","urls":["bzz-raw://73ae8e0c6f975052973265113d762629002ce33987b1933c2a378667e2816f2f","dweb:/ipfs/QmQAootkVfoe4PLaYbT4Xob2dJRm3bZfbCffEHRbCYXNPF"],"license":"MIT"}},"version":1},"id":7}
\ No newline at end of file
diff --git a/explorer/lib/explorer/contract_managers/avs_directory_manager.ex b/explorer/lib/explorer/contract_managers/avs_directory_manager.ex
index ca0f23ed06..63776ee3d4 100644
--- a/explorer/lib/explorer/contract_managers/avs_directory_manager.ex
+++ b/explorer/lib/explorer/contract_managers/avs_directory_manager.ex
@@ -37,7 +37,7 @@ defmodule AVSDirectoryManager do
@avs_directory_address
end
- def process_operator_data(%{fromBlock: fromBlock}) do
+ def process_and_store_operator_data(%{fromBlock: fromBlock}) do
AVSDirectoryManager.get_operator_registration_status_updated_events(%{fromBlock: fromBlock})
|> case do
{:ok, events} ->
@@ -66,18 +66,17 @@ defmodule AVSDirectoryManager do
"Operator already being processed: #{event.topics |> Enum.at(1)}" |> IO.inspect()
:empty
- # TODO also extract operator ID from this event
{:ok, lock} ->
case event.topics |> hd do
"OperatorAVSRegistrationStatusUpdated(address,address,uint8)" ->
case event.data |> hd do
1 ->
IO.inspect("Operator registered")
- AVSDirectoryManager.handle_operator_registration(event)
+ Operators.handle_operator_registration(event)
0 ->
IO.inspect("Operator unregistered")
- AVSDirectoryManager.handle_operator_unregistration(event)
+ Operators.handle_operator_unregistration(event)
_other ->
IO.inspect("Unexpected event data", event.data)
@@ -89,30 +88,4 @@ defmodule AVSDirectoryManager do
Mutex.release(OperatorMutex, lock)
end
end
-
- def handle_operator_registration(event) do
- operator_address = Enum.at(event.topics, 1)
- # TODO also extract operator ID from this event
- operator_id = RegistryCoordinatorManager.get_operator_id_from_chain(operator_address)
- operator_url = DelegationManager.get_operator_url(operator_address)
- operator_metadata = case Utils.fetch_eigen_operator_metadata(operator_url) do
- {:ok, operator_metadata} ->
- operator_metadata
-
- {:error, reason} ->
- case reason do
- %Jason.DecodeError{} ->
- dbg("Error decoding operator metadata: operator link does not contain a JSON")
- _ ->
- dbg("Error fetching operator metadata:", reason)
- end
- %EigenOperatorMetadataStruct{name: nil, website: nil, description: nil, logo: nil, twitter: nil}
- end
- Operators.register_or_update_operator(%Operators{id: operator_id, name: operator_metadata.name, address: operator_address, url: operator_url, website: operator_metadata.website, description: operator_metadata.description, logo_link: operator_metadata.logo, twitter: operator_metadata.twitter, is_active: true})
- # TODO read its first stake
- end
-
- def handle_operator_unregistration(event) do
- Operators.unregister_operator(%Operators{address: Enum.at(event.topics, 1)})
- end
end
diff --git a/explorer/lib/explorer/contract_managers/delegation_manager.ex b/explorer/lib/explorer/contract_managers/delegation_manager.ex
index f700f3610f..e773b52aa7 100644
--- a/explorer/lib/explorer/contract_managers/delegation_manager.ex
+++ b/explorer/lib/explorer/contract_managers/delegation_manager.ex
@@ -1,19 +1,24 @@
defmodule DelegationManager do
require Logger
- @aligned_config_file System.get_env("ALIGNED_CONFIG_FILE")
+ # @aligned_config_file System.get_env("ALIGNED_CONFIG_FILE")
- config_file_path =
- case @aligned_config_file do
- nil -> raise("ALIGNED_CONFIG_FILE not set in .env")
- file -> file
- end
+ # config_file_path =
+ # case @aligned_config_file do
+ # nil -> raise("ALIGNED_CONFIG_FILE not set in .env")
+ # file -> file
+ # end
+
+ @environment System.get_env("ENVIRONMENT")
- {status, config_json_string} = File.read(config_file_path)
+ eigenlayer_output_file_path =
+ "../contracts/script/output/#{@environment}/eigenlayer_deployment_output.json"
+
+ {status, config_json_string} = File.read(eigenlayer_output_file_path)
case status do
:ok ->
- Logger.debug("Aligned deployment file read successfully")
+ Logger.debug("Eigenlayer deployment file read successfully")
:error ->
raise(
@@ -25,13 +30,6 @@ defmodule DelegationManager do
|> Map.get("addresses")
|> Map.get("delegationManager")
- # @first_block (case @environment do
- # "devnet" -> 0
- # "holesky" -> 1_600_000
- # "mainnet" -> 20_020_000
- # _ -> raise("Invalid environment")
- # end)
-
use Ethers.Contract,
abi_file: "lib/abi/DelegationManager.json",
default_address: @delegation_manager_address
@@ -56,5 +54,28 @@ defmodule DelegationManager do
end
end
+ # this gets of all eigenlayer, not avs. sad
+ # This function makes use of Eigenlayer's Operator delegation structure and process:
+ # When Stakers want to stake to external Operators, they stake to an Operator address which was subscribed to Aligned's Slasher, not to any Operator that can be running any AVS.
+ # This is how Eigenlayer maintains Staker's autonomy in choosing which AVS they want to restake to.
+ # This way, even though we are querying Eigenlayer's DelegationManager, we are able to get the Operator's shares specifically in Aligned.
+ def get_operator_all_strategies_shares(%Operators{id: operator_id, address: operator_address}) do
+ all_strategies = Strategies.get_all_strategies_addresses()
+ case DelegationManager.get_operator_shares(operator_address, all_strategies) |> Ethers.call do
+ {:ok, shares} ->
+ Enum.zip(all_strategies, shares)
+ |> Enum.map(fn {strategy_address, share} ->
+ %Restakings{operator_id: operator_id, operator_address: operator_address, stake: share, quorum_number: 0, strategy_address: strategy_address}
+ end) |> Enum.at(0)
+ {:error, error} ->
+ IO.inspect("Error fetching operator's strategies shares")
+ IO.inspect(error)
+ error
+ other ->
+ dbg other
+ other
+ end
+ end
+
end
diff --git a/explorer/lib/explorer/contract_managers/stake_registry_manager.ex b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex
index 7b501470fb..e86f5d2e59 100644
--- a/explorer/lib/explorer/contract_managers/stake_registry_manager.ex
+++ b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex
@@ -33,21 +33,21 @@ defmodule StakeRegistryManager do
@stake_registry_manager
end
- def get_latest_stake_update(%{fromBlock: fromBlock, operator_id: operator_id}) do
- StakeRegistryManager.EventFilters.operator_stake_update(operator_id)
- |> Ethers.get_logs(fromBlock: fromBlock)
- |> case do
- {:ok, data} ->
- List.last(data) # most recent entry
-
- {:error, reason} ->
- dbg("Error getting latest operator stake update")
- dbg(reason)
-
- other ->
- dbg("Unexpected response:")
- dbg(other)
- end
+ def has_operator_changed_staking(%{fromBlock: fromBlock, operator_id: operator_id, operator_address: operator_address}) do
+ StakeRegistryManager.EventFilters.operator_stake_update(operator_id)
+ |> Ethers.get_logs(fromBlock: fromBlock)
+ |> case do
+ {:ok, data} ->
+ {operator_id, operator_address, Enum.count(data) > 1}
+
+ {:error, reason} ->
+ dbg("Error getting latest operator stake update")
+ dbg(reason)
+
+ other ->
+ dbg("Unexpected response:")
+ dbg(other)
+ end
end
def get_strategies_of_quorum(quorum_number) do
@@ -74,47 +74,18 @@ defmodule StakeRegistryManager do
strategies |> Enum.reverse()
end
+ def get_stake_of_quorum_for_operator(%Restakings{operator_address: operator_address, quorum_number: nil}) do # AT THE MOMENT, ONLY USING QUORUM 0
+ get_stake_of_quorum_for_operator(%Restakings{operator_address: operator_address, quorum_number: 0})
+ end
+ def get_stake_of_quorum_for_operator(%Restakings{operator_address: operator_address, quorum_number: quorum_number}) do
+ case StakeRegistryManager.weight_of_operator_for_quorum(quorum_number, operator_address) |> Ethers.call() do
+ {:ok, stake_of_operator} ->
+ stake_of_operator
+ {:error, error} ->
+ dbg("Error fetching stake of operator: #{error}")
+ raise("Error fetching stake of operator: #{error}")
+ end
+ end
+
end
- # relevant structs:
- # /// @ struct used to store the stakes of an individual operator or the sum of all operators' stakes, for storage
- # struct StakeUpdate {
- # // the block number at which the stake amounts were updated and stored
- # uint32 updateBlockNumber;
- # // the block number at which the *next update* occurred.
- # /// @notice This entry has the value **0** until another update takes place.
- # uint32 nextUpdateBlockNumber;
- # // stake weight for the quorum
- # uint96 stake;
- # }
-
- # relevant events:
-
- # /// @ emitted whenever the stake of `operator` is updated
- # event OperatorStakeUpdate(
- # bytes32 indexed operatorId,
- # uint8 quorumNumber,
- # uint96 stake
- # );
-
- # relevant views:
-# /**
-# * @ This function computes the total weight of the @param operator in the quorum @param quorumNumber.
-# */
-# function weightOfOperatorForQuorum(uint8 quorumNumber, address operator) external view returns (uint96);
-
-# /**
-# * @ Returns the most recent stake weight for the `operatorId` for a certain quorum
-# * @dev Function returns an StakeUpdate struct with **every entry equal to 0** in the event that the operator has no stake history
-# */
-# function getLatestStakeUpdate(bytes32 operatorId, uint8 quorumNumber) external view returns (StakeUpdate memory);
-
-# /**
-# * @ Returns the stake weight from the latest entry in `_totalStakeHistory` for quorum `quorumNumber`.
-# */
-# function getCurrentTotalStake(uint8 quorumNumber) external view returns (uint96);
-
-# /**
-# * @ Returns the most recent stake weight for the `operatorId` for quorum `quorumNumber`
-# */
-# function getCurrentStake(bytes32 operatorId, uint8 quorumNumber) external view returns (uint96);
diff --git a/explorer/lib/explorer/contract_managers/strategy.ex b/explorer/lib/explorer/contract_managers/strategy.ex
new file mode 100644
index 0000000000..3a923897d5
--- /dev/null
+++ b/explorer/lib/explorer/contract_managers/strategy.ex
@@ -0,0 +1,50 @@
+defmodule Strategy do
+ require Logger
+
+ use Ethers.Contract,
+ abi_file: "lib/abi/IStrategy.json"
+
+ def fetch_token_address(%Strategies{strategy_address: strategy_address} = strategy) do
+ case Strategy.underlying_token() |> Ethers.call(to: strategy_address) do
+ {:ok, "0x"} -> # Strategy is native ETH
+ %{strategy | token_address: "0x"} #storing "0x" as its token address, and handling its cases in ERC20Manager
+
+ {:ok, token_address} -> %{strategy | token_address: token_address}
+
+ {:error, %{"code" => -32015}} ->
+ dbg("Strategy has no underlying token: #{strategy_address}") # thus, its not a strategy contract
+ {:error, :not_strategy}
+
+ other_error ->
+ dbg("Error fetching token address for #{strategy_address}")
+ dbg(other_error)
+ other_error
+ end
+ end
+
+ def fetch_token_name(%Strategies{token_address: token_address} = strategy) do
+ case ERC20Manager.name(token_address) do
+ {:ok, name} -> %{strategy | name: name}
+ error ->
+ dbg("Error fetching token name")
+ dbg(error)
+ error
+ end
+ end
+ def fetch_token_name({:error, error}) do
+ {:error, error}
+ end
+
+ def fetch_token_symbol(%Strategies{token_address: token_address} = strategy) do
+ case ERC20Manager.symbol(token_address) do
+ {:ok, symbol} -> %{strategy | symbol: symbol}
+ error ->
+ dbg("Error fetching token symbol")
+ dbg(error)
+ error
+ end
+ end
+ def fetch_token_symbol({:error, error}) do
+ {:error, error}
+ end
+end
diff --git a/explorer/lib/explorer/contract_managers/strategy_manager.ex b/explorer/lib/explorer/contract_managers/strategy_manager.ex
index 4190e0e62a..737a62fd55 100644
--- a/explorer/lib/explorer/contract_managers/strategy_manager.ex
+++ b/explorer/lib/explorer/contract_managers/strategy_manager.ex
@@ -1,50 +1,45 @@
defmodule StrategyManager do
require Logger
- use Ethers.Contract,
- abi_file: "lib/abi/IStrategy.json"
+ @environment System.get_env("ENVIRONMENT")
- def fetch_token_address(%Strategies{strategy_address: strategy_address} = strategy) do
- case StrategyManager.underlying_token() |> Ethers.call(to: strategy_address) do
- {:ok, "0x"} -> # Strategy is native ETH
- %{strategy | token_address: "0x"} #storing "0x" as its token address, and handling its cases in ERC20Manager
+ file_path =
+ "../contracts/script/output/#{@environment}/eigenlayer_deployment_output.json"
- {:ok, token_address} -> %{strategy | token_address: token_address}
+ {status, config_json_string} = File.read(file_path)
- {:error, %{"code" => -32015}} ->
- dbg("Strategy has no underlying token: #{strategy_address}") # thus, its not a strategy contract
- {:error, :not_strategy}
+ case status do
+ :ok ->
+ Logger.debug("Eigenlayer deployment file read successfully")
- other_error ->
- dbg("Error fetching token address for #{strategy_address}")
- dbg(other_error)
- other_error
- end
+ :error ->
+ raise(
+ "Config file not read successfully, did you run make create-env? If you did,\n make sure Eigenlayer config file is correctly stored"
+ )
end
+
+ @strategy_manager Jason.decode!(config_json_string)
+ |> Map.get("addresses")
+ |> Map.get("strategyManager")
- def fetch_token_name(%Strategies{token_address: token_address} = strategy) do
- case ERC20Manager.name(token_address) do
- {:ok, name} -> %{strategy | name: name}
- error ->
- dbg("Error fetching token name")
- dbg(error)
- error
- end
- end
- def fetch_token_name({:error, error}) do
- {:error, error}
+ def get_strategy_manager() do
+ @strategy_manager
end
- def fetch_token_symbol(%Strategies{token_address: token_address} = strategy) do
- case ERC20Manager.symbol(token_address) do
- {:ok, symbol} -> %{strategy | symbol: symbol}
+ use Ethers.Contract,
+ abi_file: "lib/abi/StrategyManager.json",
+ default_address: @strategy_manager
+
+ def get_staker_deposits(%Operators{id: operator_id}) do
+ operator_address = Operators.get_operator_by_id(operator_id).address
+ case StrategyManager.get_deposits(operator_address) |> Ethers.call do
+ {:ok, deposits} ->
+ dbg deposits
+ deposits
error ->
- dbg("Error fetching token symbol")
+ dbg("Error fetching deposits")
dbg(error)
error
end
end
- def fetch_token_symbol({:error, error}) do
- {:error, error}
- end
end
diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex
index fdc13dcb41..e2a05ccf93 100644
--- a/explorer/lib/explorer/models/operators.ex
+++ b/explorer/lib/explorer/models/operators.ex
@@ -13,6 +13,7 @@ defmodule Operators do
field :logo_link, :string
field :twitter, :string
field :is_active, :boolean
+ field :total_stake, :decimal
timestamps()
end
@@ -20,8 +21,8 @@ defmodule Operators do
@doc false
def changeset(operator, attrs) do
operator
- |> cast(attrs, [:address, :id, :name, :url, :website, :description, :logo_link, :twitter, :is_active])
- |> validate_required([:address, :id, :url, :is_active])
+ |> cast(attrs, [:address, :id, :name, :url, :website, :description, :logo_link, :twitter, :is_active, :total_stake])
+ |> validate_required([:address, :id, :url, :is_active, :total_stake])
|> unique_constraint(:address)
|> unique_constraint(:id)
end
@@ -35,6 +36,11 @@ defmodule Operators do
Explorer.Repo.one(query)
end
+ def get_operator_by_id(id) do
+ query = from(o in Operators, where: o.id == ^id, select: o)
+ Explorer.Repo.one(query)
+ end
+
# TODO: add pagination
def get_operators() do
query = from(o in Operators, select: o)
@@ -70,9 +76,40 @@ defmodule Operators do
end
end
+ def handle_operator_registration(event) do
+ operator_address = Enum.at(event.topics, 1)
+ operator_id = RegistryCoordinatorManager.get_operator_id_from_chain(operator_address)
+ operator_url = DelegationManager.get_operator_url(operator_address)
+ dbg operator_url
+ operator_metadata = case Utils.fetch_eigen_operator_metadata(operator_url) do
+ {:ok, operator_metadata} ->
+ operator_metadata
+
+ {:error, reason} ->
+ case reason do
+ %Jason.DecodeError{} ->
+ dbg("Error decoding operator metadata: operator link does not contain a JSON")
+ _ ->
+ dbg("Error fetching operator metadata:", reason)
+ end
+ %EigenOperatorMetadataStruct{name: nil, website: nil, description: nil, logo: nil, twitter: nil}
+ end
+ total_stake = StakeRegistryManager.get_stake_of_quorum_for_operator(%Restakings{operator_address: operator_address})
+ register_or_update_operator(%Operators{id: operator_id, name: operator_metadata.name, address: operator_address, url: operator_url, website: operator_metadata.website, description: operator_metadata.description, logo_link: operator_metadata.logo, twitter: operator_metadata.twitter, is_active: true, total_stake: total_stake})
+ end
+
+ def handle_operator_unregistration(event) do
+ unregister_operator(%Operators{address: Enum.at(event.topics, 1)})
+ end
+
def unregister_operator(%Operators{address: address}) do
query = from(o in Operators, where: o.address == ^address)
Explorer.Repo.update_all(query, set: [is_active: false])
end
+ def get_total_stake(%Operators{} = operator) do
+ query = from(o in Operators, where: o.address == ^operator.address, select: o.total_stake)
+ Explorer.Repo.one(query)
+ end
+
end
diff --git a/explorer/lib/explorer/models/quorums.ex b/explorer/lib/explorer/models/quorums.ex
index 0199439fc1..696863225f 100644
--- a/explorer/lib/explorer/models/quorums.ex
+++ b/explorer/lib/explorer/models/quorums.ex
@@ -8,16 +8,6 @@ defmodule Quorums do
timestamps()
end
-
- @doc false
- # def changeset(x, attrs) do
- # x
- # |> cast(attrs, [])
- # end
-
- # def generate_changeset(%Quorums{} = quorum) do
- # end
-
def process_quorum_changes() do
our_quorums = get_all_quorums()
@@ -41,10 +31,9 @@ defmodule Quorums do
end
def insert_quorum_if_not_present(%Quorums{} = quorum) do
- dbg "inserting quorum?"
case get_quorum_by_id(quorum.id) do
nil ->
- dbg "inserted quorum"
+ dbg "inserting quorum"
Explorer.Repo.insert(quorum)
_ ->
nil
@@ -89,8 +78,6 @@ defmodule QuorumStrategies do
def get_quorum_strategy_associations(%Quorums{} = quorum) do
- dbg "get_quorum_strategy_associations"
- dbg quorum
query = from(qs in "quorum_strategies",
where: qs.quorum_id == ^quorum.id,
select: qs.strategy_id)
@@ -98,16 +85,10 @@ defmodule QuorumStrategies do
end
def insert_quorum_strategy(%Quorums{} = quorum, %Strategies{} = strategy) do
- dbg "pre inserting quorum-strategy"
-
existing_strategies = QuorumStrategies.get_quorum_strategy_associations(quorum)
- dbg "existing_strategies: #{inspect(existing_strategies)}"
- dbg "strategy: #{inspect(strategy)}"
unless strategy.id in existing_strategies do
- dbg "inserting quorum-strategy"
QuorumStrategies.generate_changeset(quorum.id, strategy.id) |> Explorer.Repo.insert() |> dbg
- dbg "done"
end
end
def insert_quorum_strategy(_any, nil) do
diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex
index 69ce67a430..c5e497d57a 100644
--- a/explorer/lib/explorer/models/restakings.ex
+++ b/explorer/lib/explorer/models/restakings.ex
@@ -5,8 +5,10 @@ defmodule Restakings do
schema "restakings" do
field :operator_id, :binary
+ field :operator_address, :binary
field :stake, :decimal
field :quorum_number, :integer
+ field :strategy_address, :binary
timestamps()
end
@@ -14,8 +16,8 @@ defmodule Restakings do
@doc false
def changeset(restaking, attrs) do
restaking
- |> cast(attrs, [:operator_id, :stake, :quorum_number])
- |> validate_required([:operator_id, :stake, :quorum_number])
+ |> cast(attrs, [:operator_id, :operator_address, :stake, :quorum_number, :strategy_address])
+ |> validate_required([:operator_id, :stake, :quorum_number, :strategy_address])
end
def generate_changeset(%Restakings{} = restaking) do
@@ -24,31 +26,25 @@ defmodule Restakings do
def process_restaking_changes(%{fromBlock: from_block}) do
Operators.get_operators()
- |> Enum.map(fn operator -> StakeRegistryManager.get_latest_stake_update(%{fromBlock: from_block, operator_id: operator.id}) end)
- |> Enum.map(&parse_stake_update_event/1)
+ |> Enum.map(fn operator -> StakeRegistryManager.has_operator_changed_staking(%{fromBlock: from_block, operator_id: operator.id, operator_address: operator.address}) end)
+ |> Enum.reject(fn {_operator_id, _operator_address, has_changed_stake} -> not has_changed_stake end)
+ |> Enum.map(fn {operator_id, operator_address, _has_changed_stake} -> DelegationManager.get_operator_all_strategies_shares(%Operators{id: operator_id, address: operator_address}) end)
|> Enum.map(&insert_or_update_restakings/1)
end
- def parse_stake_update_event(%Ethers.Event{} = event) do
- %Restakings{
- operator_id: Enum.at(event.topics, 1),
- quorum_number: Enum.at(event.data, 0),
- stake: Enum.at(event.data, 1)
- }
- end
-
def insert_or_update_restakings(%Restakings{} = restaking) do
- dbg restaking
changeset = restaking |> generate_changeset()
+
+ # Temporal solution to handle new quorums, until Eigenlayer implements emition of QuorumCreated event
Quorums.handle_quorum(%Quorums{id: restaking.quorum_number})
- case Restakings.get_by_quorum_and_operator_id(restaking.quorum_number, restaking.operator_id) do
+ case Restakings.get_by_operator_and_strategy(%Restakings{operator_address: restaking.operator_address, strategy_address: restaking.strategy_address}) do
nil ->
- "inserting restaking" |> dbg
+ "nil, inserting restaking" |> dbg
Explorer.Repo.insert(changeset)
[] ->
- "inserting restaking" |> dbg
+ "[], inserting restaking" |> dbg
Explorer.Repo.insert(changeset)
existing_restaking ->
@@ -58,15 +54,13 @@ defmodule Restakings do
end
end
- def get_by_quorum_and_operator_id(quorum_number, operator_id) do
+ def get_by_operator_and_strategy(%Restakings{operator_address: operator_address, strategy_address: strategy_address}) do
query = from(
r in Restakings,
- where: r.quorum_number == ^quorum_number
- and r.operator_id == ^operator_id,
+ where: r.operator_address == ^operator_address and r.strategy_address == ^strategy_address,
select: r
)
-
- Explorer.Repo.one(query)
+ Explorer.Repo.all(query)
end
def get_aggregated_restakings() do
@@ -74,7 +68,6 @@ defmodule Restakings do
r in Restakings,
select: %{total_stake: sum(r.stake)}
)
-
Explorer.Repo.one(query)
end
@@ -84,7 +77,6 @@ defmodule Restakings do
where: r.operator_id == ^operator_id,
select: r
)
-
Explorer.Repo.all(query)
end
@@ -94,7 +86,6 @@ defmodule Restakings do
where: r.operator_id == ^operator_id,
select: %{total_stake: sum(r.stake)}
)
-
Explorer.Repo.one(query)
end
diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex
index 9874a3bf3a..e6ec47682d 100644
--- a/explorer/lib/explorer/models/strategies.ex
+++ b/explorer/lib/explorer/models/strategies.ex
@@ -45,10 +45,10 @@ defmodule Strategies do
def extract_info(strategy_address) do
%Strategies{strategy_address: strategy_address}
- |> StrategyManager.fetch_token_address()
- |> StrategyManager.fetch_token_name()
- |> StrategyManager.fetch_token_symbol()
- # Total stake is set when inserting rows to `Restakings` table
+ |> Strategy.fetch_token_address()
+ |> Strategy.fetch_token_name()
+ |> Strategy.fetch_token_symbol()
+ # Total stake is set when inserting rows to `Restakings` table (?)
end
def add_strategy(%Strategies{} = new_strategy) do
@@ -65,4 +65,11 @@ defmodule Strategies do
Explorer.Repo.all(query)
end
+ def get_all_strategies_addresses() do
+ query = from(s in Strategies,
+ order_by: [asc: s.id],
+ select: s.strategy_address)
+ Explorer.Repo.all(query)
+ end
+
end
diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex
index 13204f6bb4..3df2e63c66 100644
--- a/explorer/lib/explorer/periodically.ex
+++ b/explorer/lib/explorer/periodically.ex
@@ -30,8 +30,8 @@ defmodule Explorer.Periodically do
new_count = rem(count + 1, run_every_n_iterations)
if new_count == 0 do
Task.start(&process_unverified_batches/0)
- Task.start(fn -> process_operators(read_from_block) end)
Task.start(fn -> process_quorum_strategy_changes() end)
+ Task.start(fn -> process_operators(read_from_block) end)
Task.start(fn -> process_restaking_changes(read_from_block) end)
end
# process_operators(0)
@@ -117,17 +117,17 @@ defmodule Explorer.Periodically do
)
end
- def process_operators(fromBlock) do
- "Processing operators..." |> IO.inspect()
- AVSDirectoryManager.process_operator_data(%{fromBlock: fromBlock})
- end
-
def process_quorum_strategy_changes() do
"Processing strategy changes..." |> IO.inspect()
AlignedLayerServiceManager.update_restakeable_strategies()
Quorums.process_quorum_changes()
end
+ def process_operators(fromBlock) do
+ "Processing operators..." |> IO.inspect()
+ AVSDirectoryManager.process_and_store_operator_data(%{fromBlock: fromBlock})
+ end
+
def process_restaking_changes(read_from_block) do
"Processing restaking changes..." |> IO.inspect()
Restakings.process_restaking_changes(%{fromBlock: read_from_block})
diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex
index afdc1edf21..0aaae6f2a5 100644
--- a/explorer/lib/explorer_web/live/utils.ex
+++ b/explorer/lib/explorer_web/live/utils.ex
@@ -138,6 +138,11 @@ defmodule Utils do
hex_string |> String.replace_prefix("0x", "") |> String.to_integer(16)
end
+ def binary_to_hex_string(binary) do
+ hex_string = binary |> Base.encode16(case: :lower)
+ "0x" <> hex_string
+ end
+
def get_last_n_items(events, n) when is_list(events) and is_integer(n) and n >= 0 do
events
|> Enum.reverse()
@@ -148,10 +153,7 @@ defmodule Utils do
def calculate_proof_hashes({:ok, batch_json}) do
batch_json
|> Enum.map(fn s3_object ->
- # TODO this is current prod version
:crypto.hash(:sha3_256, s3_object["proof"])
- # TODO this is current stage version
- # :crypto.hash(:sha3_256, s3_object["verification_data"]["proof"])
end)
end
diff --git a/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex b/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex
index 6f06aa7338..d72aea0172 100644
--- a/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex
+++ b/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex
@@ -4,16 +4,12 @@ defmodule Scripts.FetchOldOperatorsStrategiesRestakes do
# and insert them into the Ecto database
def run(fromBlock) do
- # "running fetch_old_operators" |> IO.inspect()
- # AVSDirectoryManager.process_operator_data(%{fromBlock: fromBlock})
- # "done running fetch_old_operators" |> IO.inspect()
+ dbg "fetching old quorum and strategy changes"
+ Explorer.Periodically.process_quorum_strategy_changes()
- dbg "fetching old operators"
+ dbg "fetching old operators changes"
Explorer.Periodically.process_operators(fromBlock)
- dbg "fetching old quorum strategy changes"
- Explorer.Periodically.process_quorum_strategy_changes()
-
dbg "fetching old restaking changes"
Explorer.Periodically.process_restaking_changes(fromBlock)
diff --git a/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs b/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
index a3b03ddbef..ebf1e5139c 100644
--- a/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
+++ b/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs
@@ -12,6 +12,7 @@ defmodule Explorer.Repo.Migrations.AddOperatorsTable do
add :logo_link, :string
add :twitter, :string
add :is_active, :boolean, default: false
+ add :total_stake, :decimal, precision: 30, scale: 0, null: false, default: 0
timestamps()
end
diff --git a/explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs b/explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs
index 3ee37f6e12..4d2305ffe6 100644
--- a/explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs
+++ b/explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs
@@ -5,8 +5,10 @@ defmodule Explorer.Repo.Migrations.AddRestakingsTable do
create table("restakings", primary_key: false) do
add :id, :bigserial, primary_key: true
add :operator_id, references(:operators, column: :id, type: :binary), null: false
+ add :operator_address, references(:operators, column: :address, type: :binary)
add :stake, :decimal, precision: 30, scale: 0, null: false
add :quorum_number, references(:quorums, column: :id, type: :integer), null: false
+ add :strategy_address, references(:strategies, column: :strategy_address, type: :binary), null: false
timestamps()
end
From 5c6fe86928aa30ac7908251775bbd6bc17a20601 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Mon, 12 Aug 2024 14:47:55 -0300
Subject: [PATCH 115/201] refactor: switch from npm to pnpm
---
Makefile | 2 +-
explorer/assets/package-lock.json | 1534 -----------------------------
explorer/assets/package.json | 3 +-
explorer/assets/pnpm-lock.yaml | 48 +
4 files changed, 51 insertions(+), 1536 deletions(-)
delete mode 100644 explorer/assets/package-lock.json
create mode 100644 explorer/assets/pnpm-lock.yaml
diff --git a/Makefile b/Makefile
index 055b75eb17..fca03653cb 100644
--- a/Makefile
+++ b/Makefile
@@ -619,7 +619,7 @@ build_all_ffi_linux: ## Build all FFIs for Linux
__EXPLORER__:
run_explorer: run_db ecto_setup_db
@cd explorer/ && \
- npm install --prefix assets && \
+ pnpm install --prefix assets && \
mix setup && \
./start.sh
diff --git a/explorer/assets/package-lock.json b/explorer/assets/package-lock.json
deleted file mode 100644
index bc2db253c4..0000000000
--- a/explorer/assets/package-lock.json
+++ /dev/null
@@ -1,1534 +0,0 @@
-{
- "name": "assets",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "dependencies": {
- "@floating-ui/dom": "^1.6.8"
- },
- "devDependencies": {
- "tailwindcss-animate": "^1.0.7"
- }
- },
- "node_modules/@alloc/quick-lru": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
- "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@floating-ui/core": {
- "version": "1.6.5",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.5.tgz",
- "integrity": "sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==",
- "dependencies": {
- "@floating-ui/utils": "^0.2.5"
- }
- },
- "node_modules/@floating-ui/dom": {
- "version": "1.6.8",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.8.tgz",
- "integrity": "sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q==",
- "dependencies": {
- "@floating-ui/core": "^1.6.0",
- "@floating-ui/utils": "^0.2.5"
- }
- },
- "node_modules/@floating-ui/utils": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.5.tgz",
- "integrity": "sha512-sTcG+QZ6fdEUObICavU+aB3Mp8HY4n14wYHdxK4fXjPmv3PXZZeY5RaguJmGyeH/CJQhX3fqKUtS4qc1LoHwhQ=="
- },
- "node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "string-width": "^5.1.2",
- "string-width-cjs": "npm:string-width@^4.2.0",
- "strip-ansi": "^7.0.1",
- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
- "wrap-ansi": "^8.1.0",
- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
- "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
- "dev": true,
- "peer": true
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/arg": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
- "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
- "dev": true,
- "peer": true
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "peer": true
- },
- "node_modules/binary-extensions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
- "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/camelcase-css": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
- "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "peer": true
- },
- "node_modules/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
- "peer": true,
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/didyoumean": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
- "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
- "dev": true,
- "peer": true
- },
- "node_modules/dlv": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
- "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
- "dev": true,
- "peer": true
- },
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true,
- "peer": true
- },
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true,
- "peer": true
- },
- "node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/foreground-child": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
- "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "peer": true,
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "peer": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/glob": {
- "version": "10.4.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz",
- "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
- "peer": true
- },
- "node_modules/jackspeak": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
- "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@isaacs/cliui": "^8.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- },
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
- }
- },
- "node_modules/jiti": {
- "version": "1.21.6",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
- "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
- "dev": true,
- "peer": true,
- "bin": {
- "jiti": "bin/jiti.js"
- }
- },
- "node_modules/lilconfig": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
- "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true,
- "peer": true
- },
- "node_modules/lru-cache": {
- "version": "10.4.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
- "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
- "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "peer": true,
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-hash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
- "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/package-json-from-dist": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
- "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
- "dev": true,
- "peer": true
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true,
- "peer": true
- },
- "node_modules/path-scurry": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
- "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "lru-cache": "^10.2.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
- },
- "engines": {
- "node": ">=16 || 14 >=14.18"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
- "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
- "dev": true,
- "peer": true
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pirates": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
- "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.40",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz",
- "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "peer": true,
- "dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.1",
- "source-map-js": "^1.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-import": {
- "version": "15.1.0",
- "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
- "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "postcss-value-parser": "^4.0.0",
- "read-cache": "^1.0.0",
- "resolve": "^1.1.7"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
- "node_modules/postcss-js": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
- "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "camelcase-css": "^2.0.1"
- },
- "engines": {
- "node": "^12 || ^14 || >= 16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": "^8.4.21"
- }
- },
- "node_modules/postcss-load-config": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
- "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "peer": true,
- "dependencies": {
- "lilconfig": "^3.0.0",
- "yaml": "^2.3.4"
- },
- "engines": {
- "node": ">= 14"
- },
- "peerDependencies": {
- "postcss": ">=8.0.9",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "postcss": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
- }
- },
- "node_modules/postcss-load-config/node_modules/lilconfig": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
- "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
- "node_modules/postcss-nested": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
- "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "peer": true,
- "dependencies": {
- "postcss-selector-parser": "^6.1.1"
- },
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.14"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz",
- "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "peer": true
- },
- "node_modules/read-cache": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "pify": "^2.3.0"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "peer": true,
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "peer": true,
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/string-width-cjs": {
- "name": "string-width",
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width-cjs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string-width-cjs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "peer": true
- },
- "node_modules/string-width-cjs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/strip-ansi-cjs": {
- "name": "strip-ansi",
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/sucrase": {
- "version": "3.35.0",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
- "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.2",
- "commander": "^4.0.0",
- "glob": "^10.3.10",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/tailwindcss": {
- "version": "3.4.7",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.7.tgz",
- "integrity": "sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "@alloc/quick-lru": "^5.2.0",
- "arg": "^5.0.2",
- "chokidar": "^3.5.3",
- "didyoumean": "^1.2.2",
- "dlv": "^1.1.3",
- "fast-glob": "^3.3.0",
- "glob-parent": "^6.0.2",
- "is-glob": "^4.0.3",
- "jiti": "^1.21.0",
- "lilconfig": "^2.1.0",
- "micromatch": "^4.0.5",
- "normalize-path": "^3.0.0",
- "object-hash": "^3.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.23",
- "postcss-import": "^15.1.0",
- "postcss-js": "^4.0.1",
- "postcss-load-config": "^4.0.1",
- "postcss-nested": "^6.0.1",
- "postcss-selector-parser": "^6.0.11",
- "resolve": "^1.22.2",
- "sucrase": "^3.32.0"
- },
- "bin": {
- "tailwind": "lib/cli.js",
- "tailwindcss": "lib/cli.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/tailwindcss-animate": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz",
- "integrity": "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==",
- "dev": true,
- "peerDependencies": {
- "tailwindcss": ">=3.0.0 || insiders"
- }
- },
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
- "dev": true,
- "peer": true
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true,
- "peer": true
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/wrap-ansi": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs": {
- "name": "wrap-ansi",
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "peer": true
- },
- "node_modules/wrap-ansi-cjs/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/yaml": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz",
- "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==",
- "dev": true,
- "peer": true,
- "bin": {
- "yaml": "bin.mjs"
- },
- "engines": {
- "node": ">= 14"
- }
- }
- }
-}
diff --git a/explorer/assets/package.json b/explorer/assets/package.json
index 6be6e22a5f..cf5e3b9b8e 100644
--- a/explorer/assets/package.json
+++ b/explorer/assets/package.json
@@ -4,5 +4,6 @@
},
"devDependencies": {
"tailwindcss-animate": "^1.0.7"
- }
+ },
+ "packageManager": "pnpm@9.1.1"
}
diff --git a/explorer/assets/pnpm-lock.yaml b/explorer/assets/pnpm-lock.yaml
new file mode 100644
index 0000000000..8ffd4aa9c5
--- /dev/null
+++ b/explorer/assets/pnpm-lock.yaml
@@ -0,0 +1,48 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@floating-ui/dom':
+ specifier: ^1.6.8
+ version: 1.6.10
+ devDependencies:
+ tailwindcss-animate:
+ specifier: ^1.0.7
+ version: 1.0.7
+
+packages:
+
+ '@floating-ui/core@1.6.7':
+ resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==}
+
+ '@floating-ui/dom@1.6.10':
+ resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==}
+
+ '@floating-ui/utils@0.2.7':
+ resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==}
+
+ tailwindcss-animate@1.0.7:
+ resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders'
+
+snapshots:
+
+ '@floating-ui/core@1.6.7':
+ dependencies:
+ '@floating-ui/utils': 0.2.7
+
+ '@floating-ui/dom@1.6.10':
+ dependencies:
+ '@floating-ui/core': 1.6.7
+ '@floating-ui/utils': 0.2.7
+
+ '@floating-ui/utils@0.2.7': {}
+
+ tailwindcss-animate@1.0.7: {}
From 758ab48f87ebdafaab5aa2d3be54f66e844b5c7b Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Mon, 12 Aug 2024 15:54:03 -0300
Subject: [PATCH 116/201] refactor: using operators.get total stake, and better
prints
---
explorer/lib/explorer/models/quorums.ex | 7 ++++---
explorer/lib/explorer/models/restakings.ex | 9 ---------
explorer/lib/explorer_web/live/pages/operator/index.ex | 3 +--
3 files changed, 5 insertions(+), 14 deletions(-)
diff --git a/explorer/lib/explorer/models/quorums.ex b/explorer/lib/explorer/models/quorums.ex
index 696863225f..dc79c18330 100644
--- a/explorer/lib/explorer/models/quorums.ex
+++ b/explorer/lib/explorer/models/quorums.ex
@@ -73,7 +73,7 @@ defmodule QuorumStrategies do
end
def generate_changeset(quorum_id, strategy_id) do
- QuorumStrategies.changeset(%QuorumStrategies{}, Map.from_struct(%QuorumStrategies{quorum_id: quorum_id, strategy_id: strategy_id})) |> tap(&dbg/1)
+ QuorumStrategies.changeset(%QuorumStrategies{}, Map.from_struct(%QuorumStrategies{quorum_id: quorum_id, strategy_id: strategy_id}))
end
@@ -88,11 +88,12 @@ defmodule QuorumStrategies do
existing_strategies = QuorumStrategies.get_quorum_strategy_associations(quorum)
unless strategy.id in existing_strategies do
- QuorumStrategies.generate_changeset(quorum.id, strategy.id) |> Explorer.Repo.insert() |> dbg
+ QuorumStrategies.generate_changeset(quorum.id, strategy.id) |> Explorer.Repo.insert()
end
end
- def insert_quorum_strategy(_any, nil) do
+ def insert_quorum_strategy(_any_quorum, nil) do
dbg "trying to insert a nil or errored strategy, skipping"
+ dbg {_any_quorum, nil}
nil
end
end
diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex
index c5e497d57a..2f359e48b1 100644
--- a/explorer/lib/explorer/models/restakings.ex
+++ b/explorer/lib/explorer/models/restakings.ex
@@ -80,13 +80,4 @@ defmodule Restakings do
Explorer.Repo.all(query)
end
- def get_aggregated_restake_by_operator(operator_id) do
- query = from(
- r in Restakings,
- where: r.operator_id == ^operator_id,
- select: %{total_stake: sum(r.stake)}
- )
- Explorer.Repo.one(query)
- end
-
end
diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex
index eb33e4257b..f525f78ecb 100644
--- a/explorer/lib/explorer_web/live/pages/operator/index.ex
+++ b/explorer/lib/explorer_web/live/pages/operator/index.ex
@@ -6,8 +6,7 @@ defmodule ExplorerWeb.Operator.Index do
operator = Operators.get_operator_by_address(address)
restaked_amount_eth =
- Restakings.get_aggregated_restake_by_operator(operator.id)
- |> Map.get(:total_stake)
+ Operators.get_total_stake(operator)
|> Decimal.to_integer()
|> EthConverter.wei_to_eth(2)
From 373ad77e07fac169386baf2cdb61fc7a1485b5a2 Mon Sep 17 00:00:00 2001
From: Urix <43704209+uri-99@users.noreply.github.com>
Date: Mon, 12 Aug 2024 16:21:53 -0300
Subject: [PATCH 117/201] refactor: more info on get_restakes_by_operator_id
---
explorer/lib/explorer/models/restakings.ex | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex
index 2f359e48b1..18fea719db 100644
--- a/explorer/lib/explorer/models/restakings.ex
+++ b/explorer/lib/explorer/models/restakings.ex
@@ -71,12 +71,20 @@ defmodule Restakings do
Explorer.Repo.one(query)
end
- def get_restakes_by_operator(operator_id) do
- query = from(
- r in Restakings,
+ def get_restakes_by_operator_id(%{operator_id: operator_id}) do
+ query = from r in Restakings,
+ join: s in Strategies, on: r.strategy_address == s.strategy_address,
where: r.operator_id == ^operator_id,
- select: r
- )
+ select: %{
+ restaking: r,
+ strategy: %{
+ name: s.name,
+ symbol: s.symbol,
+ token_address: s.token_address,
+ total_staked: s.total_staked
+ }
+ }
+
Explorer.Repo.all(query)
end
From 7d8c30db7500a3322cec21fe0cd8007c3fc59f98 Mon Sep 17 00:00:00 2001
From: Gian <58370608+glpecile@users.noreply.github.com>
Date: Mon, 12 Aug 2024 16:34:55 -0300
Subject: [PATCH 118/201] fix: eth restaked
---
.../components/core_components.ex | 11 +++--
.../lib/explorer_web/live/pages/home/index.ex | 22 +++++++---
.../explorer_web/live/pages/operator/index.ex | 40 ++++++++++---------
.../live/pages/operators/index.html.heex | 9 ++---
4 files changed, 49 insertions(+), 33 deletions(-)
diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex
index 11b4b94f9a..8d2fc769f4 100644
--- a/explorer/lib/explorer_web/components/core_components.ex
+++ b/explorer/lib/explorer_web/components/core_components.ex
@@ -632,6 +632,7 @@ defmodule ExplorerWeb.CoreComponents do
slot :col, required: true do
attr :label, :string
+ attr :class, :string
end
slot :action, doc: "the slot for showing user actions in the last table column"
@@ -659,7 +660,11 @@ defmodule ExplorerWeb.CoreComponents do
|