From 9a151f5a61eb3cb5a3e216c14e4b0bede8ea9589 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 8 Jul 2024 18:36:18 -0300 Subject: [PATCH 001/201] feat: ecto migrate + show mocked data --- Makefile | 10 ++--- .../explorer/aligned_layer_service_manager.ex | 2 + explorer/lib/explorer/models/batch_structs.ex | 4 +- explorer/lib/explorer/models/batches.ex | 12 +++--- explorer/lib/explorer/periodically.ex | 2 +- explorer/lib/explorer_web/live/utils.ex | 37 +++++++++++++++---- ...20240708192338_add_proof_hashes_column.exs | 9 +++++ 7 files changed, 56 insertions(+), 20 deletions(-) create mode 100644 explorer/priv/repo/migrations/20240708192338_add_proof_hashes_column.exs diff --git a/Makefile b/Makefile index 32f389810b..9f35d32e81 100644 --- a/Makefile +++ b/Makefile @@ -217,7 +217,7 @@ batcher_send_sp1_burst: --proving_system SP1 \ --proof ../../scripts/test_files/sp1/sp1_fibonacci.proof \ --vm_program ../../scripts/test_files/sp1/sp1_fibonacci.elf \ - --repetitions 15 \ + --repetitions 3 \ --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 batcher_send_infinite_sp1: @@ -238,7 +238,7 @@ batcher_send_risc0_burst: --proving_system Risc0 \ --proof ../../scripts/test_files/risc_zero/fibonacci_proof_generator/risc_zero_fibonacci.proof \ --vm_program ../../scripts/test_files/risc_zero/fibonacci_proof_generator/fibonacci_id.bin \ - --repetitions 15 \ + --repetitions 3 \ --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 batcher_send_plonk_bn254_task: batcher/target/release/aligned @@ -258,7 +258,7 @@ batcher_send_plonk_bn254_burst: batcher/target/release/aligned --public_input ../../scripts/test_files/gnark_plonk_bn254_script/plonk_pub_input.pub \ --vk ../../scripts/test_files/gnark_plonk_bn254_script/plonk.vk \ --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \ - --repetitions 15 + --repetitions 3 batcher_send_plonk_bls12_381_task: batcher/target/release/aligned @echo "Sending Groth16 BLS12-381 1!=0 task to Batcher..." @@ -277,7 +277,7 @@ batcher_send_plonk_bls12_381_burst: batcher/target/release/aligned --public_input ../../scripts/test_files/gnark_plonk_bls12_381_script/plonk_pub_input.pub \ --vk ../../scripts/test_files/gnark_plonk_bls12_381_script/plonk.vk \ --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \ - --repetitions 15 + --repetitions 3 batcher_send_groth16_bn254_task: batcher/target/release/aligned @@ -296,7 +296,7 @@ batcher_send_groth16_burst: batcher/target/release/aligned --proof ../../scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs/ineq_1_groth16.proof \ --public_input ../../scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs/ineq_1_groth16.pub \ --vk ../../scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs/ineq_1_groth16.vk \ - --repetitions 15 \ + --repetitions 3 \ --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 batcher_send_infinite_groth16: batcher/target/release/aligned ## Send a different Groth16 BN254 proof using the client every 3 seconds diff --git a/explorer/lib/explorer/aligned_layer_service_manager.ex b/explorer/lib/explorer/aligned_layer_service_manager.ex index b982cc5b55..01972464b1 100644 --- a/explorer/lib/explorer/aligned_layer_service_manager.ex +++ b/explorer/lib/explorer/aligned_layer_service_manager.ex @@ -112,6 +112,7 @@ defmodule AlignedLayerServiceManager do response_transaction_hash: batch_response.transaction_hash, response_timestamp: batch_response.block_timestamp, amount_of_proofs: nil, + proof_hashes: nil } end @@ -133,6 +134,7 @@ defmodule AlignedLayerServiceManager do response_transaction_hash: batch_response.transaction_hash, response_timestamp: batch_response.block_timestamp, amount_of_proofs: unverified_batch.amount_of_proofs, + proof_hashes: unverified_batch.proof_hashes } end end diff --git a/explorer/lib/explorer/models/batch_structs.ex b/explorer/lib/explorer/models/batch_structs.ex index a93cdbea8c..3d9babbf44 100644 --- a/explorer/lib/explorer/models/batch_structs.ex +++ b/explorer/lib/explorer/models/batch_structs.ex @@ -29,6 +29,7 @@ defmodule BatchDB do :submission_block_number, :submission_transaction_hash, :submission_timestamp, + :proof_hashes ] defstruct [ :merkle_root, @@ -40,6 +41,7 @@ defmodule BatchDB do :response_block_number, :response_transaction_hash, :response_timestamp, - :data_pointer + :data_pointer, + :proof_hashes ] end diff --git a/explorer/lib/explorer/models/batches.ex b/explorer/lib/explorer/models/batches.ex index 89e92c9604..ca0cc7b10b 100644 --- a/explorer/lib/explorer/models/batches.ex +++ b/explorer/lib/explorer/models/batches.ex @@ -14,6 +14,7 @@ defmodule Batches do field :response_transaction_hash, :string field :response_timestamp, :utc_datetime field :data_pointer, :string + field :proof_hashes, {:array, :string} timestamps() end @@ -21,8 +22,8 @@ defmodule Batches do @doc false def changeset(new_batch, updates) do new_batch - |> cast(updates, [:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash, :submission_timestamp, :response_block_number, :response_transaction_hash, :response_timestamp, :data_pointer]) - |> validate_required([:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash]) + |> cast(updates, [:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash, :submission_timestamp, :response_block_number, :response_transaction_hash, :response_timestamp, :data_pointer, :proof_hashes]) + |> validate_required([:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash, :proof_hashes]) |> validate_format(:merkle_root, ~r/0x[a-fA-F0-9]{64}/) |> unique_constraint(:merkle_root) |> validate_number(:amount_of_proofs, greater_than: 0) @@ -44,7 +45,8 @@ defmodule Batches do response_block_number: batch_db.response_block_number, response_transaction_hash: batch_db.response_transaction_hash, response_timestamp: batch_db.response_timestamp, - data_pointer: batch_db.data_pointer + data_pointer: batch_db.data_pointer, + proof_hashes: batch_db.proof_hashes } end @@ -118,10 +120,10 @@ defmodule Batches do end end - def get_amount_of_proofs(%{merkle_root: merkle_root}) do + def get_proof_info(%{merkle_root: merkle_root}) do query = from(b in Batches, where: b.merkle_root == ^merkle_root, - select: b.amount_of_proofs) + select: [b.amount_of_proofs, b.proof_hashes]) case Explorer.Repo.one(query) do nil -> nil diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index af99dfcfd4..767b7a28cd 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -61,7 +61,7 @@ defmodule Explorer.Periodically do {:ok, lock} -> "Processing batch: #{batch.merkle_root}" |> IO.inspect batch - |> Utils.extract_amount_of_proofs + |> Utils.extract_info_from_data_pointer |> Batches.generate_changeset |> Batches.insert_or_update |> case do diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex index 0bf0082274..2ccf050511 100644 --- a/explorer/lib/explorer_web/live/utils.ex +++ b/explorer/lib/explorer_web/live/utils.ex @@ -141,6 +141,25 @@ defmodule Utils do 300 end + def calculate_proof_hashes({:ok, batch_json}) do + # TODO calculate hash + IO.inspect("Calculating proof hashes") + ["0x1234567890", "0x1234567890", "0x1234567890"] + end + + def calculate_proof_hashes({:error, _}) do + [] + end + + def extract_info_from_json(json) do + IO.inspect("Extracting info from JSON") + amount_of_proofs = json |> extract_amount_of_proofs_from_json() + proof_hashes = json |> calculate_proof_hashes() + IO.inspect("Amount of proofs: #{amount_of_proofs}") + IO.inspect("Proof hashes: #{proof_hashes}") + [amount_of_proofs, proof_hashes] + end + def fetch_batch_data_pointer(batch_data_pointer) do case Finch.build(:get, batch_data_pointer) |> Finch.request(Explorer.Finch) do {:ok, %Finch.Response{status: 200, body: body}} -> @@ -157,23 +176,25 @@ defmodule Utils do end end - def extract_amount_of_proofs(%BatchDB{} = batch) do + def extract_info_from_data_pointer(%BatchDB{} = batch) do IO.inspect("Extracting amount of proofs for batch: #{batch.merkle_root}") # only get from s3 if not already in DB - amount_of_proofs = - case Batches.get_amount_of_proofs(%{merkle_root: batch.merkle_root}) do + [amount_of_proofs, proof_hashes] = + case Batches.get_proof_info(%{merkle_root: batch.merkle_root}) do nil -> IO.inspect("Fetching from S3") batch.data_pointer |> Utils.fetch_batch_data_pointer() - |> Utils.extract_amount_of_proofs_from_json() + |> Utils.extract_info_from_json() - proofs -> - IO.inspect("Fetching from DB") - proofs + [amount_of_proofs, proof_hashes] -> + IO.inspect("Fetching from DB") #already processed and stored the S3 data + [amount_of_proofs, proof_hashes] end - Map.put(batch, :amount_of_proofs, amount_of_proofs) + batch + |> Map.put(:amount_of_proofs, amount_of_proofs) + |> Map.put(:proof_hashes, proof_hashes) end end diff --git a/explorer/priv/repo/migrations/20240708192338_add_proof_hashes_column.exs b/explorer/priv/repo/migrations/20240708192338_add_proof_hashes_column.exs new file mode 100644 index 0000000000..fffe3ad501 --- /dev/null +++ b/explorer/priv/repo/migrations/20240708192338_add_proof_hashes_column.exs @@ -0,0 +1,9 @@ +defmodule Explorer.Repo.Migrations.AddProofHashesColumn do + use Ecto.Migration + + def change do + alter table("batches") do # add new columns + add :proof_hashes, {:array, :string} + end + end +end From 32751cd5a5002d8761c9b1a32f157807534beb1b Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 8 Jul 2024 18:36:33 -0300 Subject: [PATCH 002/201] feat: show mocked data in frontend --- explorer/lib/explorer_web/live/pages/batch/index.html.heex | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index 77cb798cb7..ba25605a17 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -11,6 +11,11 @@

<%= @merkle_root %>

Amount of Proofs in this Batch:

<%= @current_batch.amount_of_proofs %>

+ Proofs in this batch: + <%= for proof_hash <- @current_batch.proof_hashes do %> +

<%= proof_hash %>

+ <% end %> + Submission Block Number: <.a target="_blank" From 657bf999438e0d285fbc16ba1839589832188646 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 8 Jul 2024 18:38:18 -0300 Subject: [PATCH 003/201] chore: \n in front --- explorer/lib/explorer_web/live/pages/batch/index.html.heex | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index ba25605a17..dca18e30f8 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -9,8 +9,10 @@ > Merkle Root Hash:

<%= @merkle_root %>

+ Amount of Proofs in this Batch:

<%= @current_batch.amount_of_proofs %>

+ Proofs in this batch: <%= for proof_hash <- @current_batch.proof_hashes do %>

<%= proof_hash %>

@@ -27,6 +29,7 @@ > <%= @current_batch.submission_block_number |> Utils.format_number() %> + Submission Transaction Hash: <.a target="_blank" @@ -36,10 +39,12 @@ > <%= @current_batch.submission_transaction_hash %> + Submission Timestamp:

<%= @current_batch.submission_timestamp |> Utils.parse_timestamp() %>

+ Status: <.dynamic_badge class="w-fit" status={@current_batch.is_verified} /> <%= if @current_batch.is_verified do %> Response Block Number: @@ -51,6 +56,7 @@ > <%= @current_batch.response_block_number |> Utils.format_number() %> + Response Transaction Hash: <.a target="_blank" @@ -60,6 +66,7 @@ > <%= @current_batch.response_transaction_hash %> + Response Timestamp:

<%= @current_batch.response_timestamp |> Utils.parse_timestamp() %> From 2cb3f70269a9036285b223e5b1cc88cefc3cee04 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 8 Jul 2024 19:48:46 -0300 Subject: [PATCH 004/201] feat: calculation of keccak of proof --- explorer/lib/explorer_web/live/utils.ex | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex index 2ccf050511..188f0855aa 100644 --- a/explorer/lib/explorer_web/live/utils.ex +++ b/explorer/lib/explorer_web/live/utils.ex @@ -142,21 +142,19 @@ defmodule Utils do end def calculate_proof_hashes({:ok, batch_json}) do - # TODO calculate hash - IO.inspect("Calculating proof hashes") - ["0x1234567890", "0x1234567890", "0x1234567890"] - end - - def calculate_proof_hashes({:error, _}) do - [] + batch_json + |> Enum.map( + fn proof -> + :crypto.hash(:sha3_256, proof["proof"]) + |> Base.encode16(case: :lower) + |> (&("0x" <> &1)).() + end) end def extract_info_from_json(json) do IO.inspect("Extracting info from JSON") amount_of_proofs = json |> extract_amount_of_proofs_from_json() proof_hashes = json |> calculate_proof_hashes() - IO.inspect("Amount of proofs: #{amount_of_proofs}") - IO.inspect("Proof hashes: #{proof_hashes}") [amount_of_proofs, proof_hashes] end From dc21025c7d46b31231d25a537f9345c1db70d567 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:58:42 -0300 Subject: [PATCH 005/201] style: show proofs in batch with scroll --- .../live/pages/batch/index.html.heex | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index dca18e30f8..3c2845d1a8 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -9,15 +9,8 @@ > Merkle Root Hash:

<%= @merkle_root %>

- Amount of Proofs in this Batch:

<%= @current_batch.amount_of_proofs %>

- - Proofs in this batch: - <%= for proof_hash <- @current_batch.proof_hashes do %> -

<%= proof_hash %>

- <% end %> - Submission Block Number: <.a target="_blank" @@ -29,7 +22,6 @@ > <%= @current_batch.submission_block_number |> Utils.format_number() %> - Submission Transaction Hash: <.a target="_blank" @@ -39,12 +31,10 @@ > <%= @current_batch.submission_transaction_hash %> - Submission Timestamp:

<%= @current_batch.submission_timestamp |> Utils.parse_timestamp() %>

- Status: <.dynamic_badge class="w-fit" status={@current_batch.is_verified} /> <%= if @current_batch.is_verified do %> Response Block Number: @@ -56,7 +46,6 @@ > <%= @current_batch.response_block_number |> Utils.format_number() %> - Response Transaction Hash: <.a target="_blank" @@ -66,12 +55,15 @@ > <%= @current_batch.response_transaction_hash %> - Response Timestamp:

<%= @current_batch.response_timestamp |> Utils.parse_timestamp() %>

<% end %> + Proofs in this batch: +
+

<%= proof_hash %>

+
<% else %>
From a70bc2d8be8fa340c8c65de7a8aaa71c0a403b99 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Wed, 10 Jul 2024 20:01:23 -0300 Subject: [PATCH 006/201] feat(wip): new table of proofs --- .../explorer/aligned_layer_service_manager.ex | 2 +- explorer/lib/explorer/models/batches.ex | 77 +++++++++---------- explorer/lib/explorer/models/proofs.ex | 59 ++++++++++++++ explorer/lib/explorer/periodically.ex | 28 ++++--- .../explorer_web/live/pages/batch/index.ex | 5 +- explorer/lib/explorer_web/live/utils.ex | 38 ++++----- ...20240708192338_add_proof_hashes_column.exs | 11 ++- 7 files changed, 143 insertions(+), 77 deletions(-) create mode 100644 explorer/lib/explorer/models/proofs.ex diff --git a/explorer/lib/explorer/aligned_layer_service_manager.ex b/explorer/lib/explorer/aligned_layer_service_manager.ex index 01972464b1..a9ee885e46 100644 --- a/explorer/lib/explorer/aligned_layer_service_manager.ex +++ b/explorer/lib/explorer/aligned_layer_service_manager.ex @@ -134,7 +134,7 @@ defmodule AlignedLayerServiceManager do response_transaction_hash: batch_response.transaction_hash, response_timestamp: batch_response.block_timestamp, amount_of_proofs: unverified_batch.amount_of_proofs, - proof_hashes: unverified_batch.proof_hashes + proof_hashes: nil #don't need this value to update an existing but enverified batch, it is on another table } end end diff --git a/explorer/lib/explorer/models/batches.ex b/explorer/lib/explorer/models/batches.ex index ca0cc7b10b..91e65b472e 100644 --- a/explorer/lib/explorer/models/batches.ex +++ b/explorer/lib/explorer/models/batches.ex @@ -14,7 +14,7 @@ defmodule Batches do field :response_transaction_hash, :string field :response_timestamp, :utc_datetime field :data_pointer, :string - field :proof_hashes, {:array, :string} + has_many :proofs, Proofs, foreign_key: :batch_merkle_root timestamps() end @@ -22,8 +22,8 @@ defmodule Batches do @doc false def changeset(new_batch, updates) do new_batch - |> cast(updates, [:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash, :submission_timestamp, :response_block_number, :response_transaction_hash, :response_timestamp, :data_pointer, :proof_hashes]) - |> validate_required([:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash, :proof_hashes]) + |> cast(updates, [:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash, :submission_timestamp, :response_block_number, :response_transaction_hash, :response_timestamp, :data_pointer]) + |> validate_required([:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash]) |> validate_format(:merkle_root, ~r/0x[a-fA-F0-9]{64}/) |> unique_constraint(:merkle_root) |> validate_number(:amount_of_proofs, greater_than: 0) @@ -46,12 +46,15 @@ defmodule Batches do response_transaction_hash: batch_db.response_transaction_hash, response_timestamp: batch_db.response_timestamp, data_pointer: batch_db.data_pointer, - proof_hashes: batch_db.proof_hashes } end - def generate_changeset(%BatchDB{} = batch_db) do - Batches.changeset(%Batches{}, Map.from_struct(Batches.cast_to_batches(batch_db))) + # returns changeset for both Batches and Proofs table + def generate_changesets(%BatchDB{} = batch_db) do + batches_changeset = Batches.changeset(%Batches{}, Map.from_struct(Batches.cast_to_batches(batch_db))) + proofs = Proofs.cast_to_proofs(batch_db) + + {batches_changeset, proofs} end def get_batch(%{merkle_root: merkle_root}) do @@ -59,7 +62,7 @@ defmodule Batches do where: b.merkle_root == ^merkle_root, select: b) - Explorer.Repo.one(query) + Explorer.Repo.one(query) |> Explorer.Repo.preload(:proofs) # TODO remove preload, and has_many from schema. make it a separate call, a "load batch proofs" in frontend, to reduce network load end def get_latest_batches(%{amount: amount}) do @@ -120,45 +123,39 @@ defmodule Batches do end end - def get_proof_info(%{merkle_root: merkle_root}) do - query = from(b in Batches, - where: b.merkle_root == ^merkle_root, - select: [b.amount_of_proofs, b.proof_hashes]) - - case Explorer.Repo.one(query) do - nil -> nil - result -> result - end - end - - def insert_or_update(changeset) do - merkle_root = changeset.changes.merkle_root + def insert_or_update(batch_changeset, proofs) do + merkle_root = batch_changeset.changes.merkle_root case Explorer.Repo.get(Batches, merkle_root) do nil -> - "New Batch, inserting to DB:" |> IO.puts() - case Explorer.Repo.insert(changeset) do - {:ok, _} -> - "Batch inserted successfully" |> IO.puts() - {:ok, :empty} - - {:error, changeset} -> - "Batch insert failed #{changeset}" |> IO.puts() - {:error, changeset} - end + multi = Ecto.Multi.new() + |> Ecto.Multi.insert(:insert_batch, batch_changeset) + |> Ecto.Multi.insert_all(:insert_all, Proofs, proofs) + + case Explorer.Repo.transaction(multi) do + {:ok, %{insert_batch: _batch, insert_proofs: _proofs}} -> + IO.puts("Batch inserted successfully") + {:ok, :success} + + {:error, _failed_operation, failed_changeset, _reason} -> + IO.puts("Batch insert failed:") + IO.inspect(failed_changeset) + {:error, failed_changeset} + end + existing_batch -> try do - if existing_batch.is_verified != changeset.changes.is_verified - or existing_batch.amount_of_proofs != changeset.changes.amount_of_proofs # rewrites if it was writen with DB's default - or existing_batch.data_pointer != changeset.changes.data_pointer # rewrites if it was writen with DB's default - or existing_batch.submission_block_number != changeset.changes.submission_block_number # reorg may change submission_block_number - or existing_batch.submission_transaction_hash != changeset.changes.submission_transaction_hash # reorg may change submission_tx_hash - or (Map.has_key?(changeset.changes, :block_number) - and existing_batch.response_block_number != changeset.changes.response_block_number) # reorg may change response_block_number - or (Map.has_key?(changeset.changes, :response_transaction_hash) - and existing_batch.response_transaction_hash != changeset.changes.response_transaction_hash) # reorg may change response_tx_hash + if existing_batch.is_verified != batch_changeset.changes.is_verified + or existing_batch.amount_of_proofs != batch_changeset.changes.amount_of_proofs # rewrites if it was writen with DB's default + or existing_batch.data_pointer != batch_changeset.changes.data_pointer # rewrites if it was writen with DB's default + or existing_batch.submission_block_number != batch_changeset.changes.submission_block_number # reorg may change submission_block_number + or existing_batch.submission_transaction_hash != batch_changeset.changes.submission_transaction_hash # reorg may change submission_tx_hash + or (Map.has_key?(batch_changeset.changes, :block_number) + and existing_batch.response_block_number != batch_changeset.changes.response_block_number) # reorg may change response_block_number + or (Map.has_key?(batch_changeset.changes, :response_transaction_hash) + and existing_batch.response_transaction_hash != batch_changeset.changes.response_transaction_hash) # reorg may change response_tx_hash do "Batch values have changed, updating in DB" |> IO.puts() - updated_changeset = Ecto.Changeset.change(existing_batch, changeset.changes) + updated_changeset = Ecto.Changeset.change(existing_batch, batch_changeset.changes) # no changes in proofs table case Explorer.Repo.update(updated_changeset) do {:ok, _} -> "Batch updated successfully" |> IO.puts() diff --git a/explorer/lib/explorer/models/proofs.ex b/explorer/lib/explorer/models/proofs.ex new file mode 100644 index 0000000000..3b665588d9 --- /dev/null +++ b/explorer/lib/explorer/models/proofs.ex @@ -0,0 +1,59 @@ +defmodule Proofs do + use Ecto.Schema + import Ecto.Changeset + import Ecto.Query + + schema "proofs" do + field :batch_merkle_root, :string + field :proof_hash, :binary + # belongs_to :batch, Batches + + timestamps() + end + + @doc false + def changeset(new_proof, updates) do + new_proof + |> 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 + case batch.proof_hashes do + nil -> nil # TODO or %{} + proof_hashes -> Enum.map(proof_hashes, fn proof_hash -> + %{batch_merkle_root: batch.merkle_root, proof_hash: proof_hash, inserted_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second), updated_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)} + end) + end + end + + def get_proofs_from_batch(%{merkle_root: batch_merkle_root}) do + query = from(p in Proofs, + where: p.batch_merkle_root == ^batch_merkle_root, + select: p) + + case Explorer.Repo.all(query) do + nil -> + nil + [] -> + nil + result -> + [result, result |> Enum.count()] + end + end + + # for when we implement the proof search bar + # def get_proof(%{proof_hash: proof_hash}) do + # query = from(p in Proofs, + # where: p.proof_hash == ^proof_hash, + # select: p) + + # case Explorer.Repo.all(query) do + # nil -> nil + # result -> [result, result |> Enum.count()] + # end + # end + +end diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index 767b7a28cd..b5a4403fb6 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -60,10 +60,12 @@ defmodule Explorer.Periodically do {:ok, lock} -> "Processing batch: #{batch.merkle_root}" |> IO.inspect - batch - |> Utils.extract_info_from_data_pointer - |> Batches.generate_changeset - |> Batches.insert_or_update + {batch_changeset, proofs} = + batch + |> Utils.extract_info_from_data_pointer + |> Batches.generate_changesets + + Batches.insert_or_update(batch_changeset, proofs) #handles it atomically |> case do {:ok, _} -> IO.puts("Broadcasting update_views") @@ -72,7 +74,6 @@ defmodule Explorer.Periodically do IO.puts("Some error in DB operation, not broadcasting update_views") IO.inspect(error) nil -> nil #no changes in DB - end "Done processing batch: #{batch.merkle_root}" |> IO.inspect @@ -83,11 +84,18 @@ defmodule Explorer.Periodically do defp process_unverified_batches() do "verifying previous unverified batches..." |> IO.inspect() unverified_batches = Batches.get_unverified_batches() - unverified_batches - |> Enum.map(&AlignedLayerServiceManager.extract_batch_response/1) - |> Enum.reject(&is_nil/1) - |> Enum.map(&Batches.generate_changeset/1) - |> Enum.map(&Batches.insert_or_update/1) + + array_of_changest_tuples = + unverified_batches + |> Enum.map(&AlignedLayerServiceManager.extract_batch_response/1) + |> Enum.reject(&is_nil/1) + |> Enum.map(&Batches.generate_changesets/1) + + Enum.map( + array_of_changest_tuples, + fn [batch_changeset, proofs] -> + Batches.insert_or_update(batch_changeset, proofs) + end) end end diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index 7009acd184..fec1c9a506 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -20,6 +20,9 @@ defmodule ExplorerWeb.Batch.Index do batch -> batch end + IO.inspect("current_batch") + IO.inspect(current_batch) + { :ok, assign(socket, @@ -30,7 +33,7 @@ defmodule ExplorerWeb.Batch.Index do } rescue _ -> - {:ok, assign(socket, merkle_root: :empty, newBatchInfo: :empty, batchWasResponded: :empty)} + {:ok, assign(socket, merkle_root: :empty, newBatchInfo: :empty, batchWasResponded: :empty, current_batch: :empty)} end def handle_info(_, socket) do diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex index 188f0855aa..ff1c139731 100644 --- a/explorer/lib/explorer_web/live/utils.ex +++ b/explorer/lib/explorer_web/live/utils.ex @@ -133,29 +133,21 @@ defmodule Utils do |> Enum.reverse() end - def extract_amount_of_proofs_from_json({:ok, batch_json}) do - batch_json |> Enum.count() - end - - def extract_amount_of_proofs_from_json({:error, _}) do - 300 - end - def calculate_proof_hashes({:ok, batch_json}) do + IO.inspect("Calculating proof hashes") batch_json |> Enum.map( fn proof -> :crypto.hash(:sha3_256, proof["proof"]) - |> Base.encode16(case: :lower) - |> (&("0x" <> &1)).() + # TODO removed this because i want to store as bytea, not a string. + # |> Base.encode16(case: :lower) + # |> (&("0x" <> &1)).() end) end - def extract_info_from_json(json) do - IO.inspect("Extracting info from JSON") - amount_of_proofs = json |> extract_amount_of_proofs_from_json() - proof_hashes = json |> calculate_proof_hashes() - [amount_of_proofs, proof_hashes] + def calculate_proof_hashes({:error, reason}) do + IO.inspect("Error calculating proof hashes: #{inspect(reason)}") + [] end def fetch_batch_data_pointer(batch_data_pointer) do @@ -175,24 +167,24 @@ defmodule Utils do end def extract_info_from_data_pointer(%BatchDB{} = batch) do - IO.inspect("Extracting amount of proofs for batch: #{batch.merkle_root}") + IO.inspect("Extracting batch's proofs info: #{batch.merkle_root}") # only get from s3 if not already in DB - [amount_of_proofs, proof_hashes] = - case Batches.get_proof_info(%{merkle_root: batch.merkle_root}) do + proof_hashes = + case Proofs.get_proofs_from_batch(%{merkle_root: batch.merkle_root}) do nil -> IO.inspect("Fetching from S3") batch.data_pointer - |> Utils.fetch_batch_data_pointer() - |> Utils.extract_info_from_json() + |> Utils.fetch_batch_data_pointer() + |> Utils.calculate_proof_hashes() - [amount_of_proofs, proof_hashes] -> + proof_hashes -> IO.inspect("Fetching from DB") #already processed and stored the S3 data - [amount_of_proofs, proof_hashes] + proof_hashes end batch - |> Map.put(:amount_of_proofs, amount_of_proofs) |> Map.put(:proof_hashes, proof_hashes) + |> Map.put(:amount_of_proofs, proof_hashes |> Enum.count()) end end diff --git a/explorer/priv/repo/migrations/20240708192338_add_proof_hashes_column.exs b/explorer/priv/repo/migrations/20240708192338_add_proof_hashes_column.exs index fffe3ad501..ef65e8eb4f 100644 --- a/explorer/priv/repo/migrations/20240708192338_add_proof_hashes_column.exs +++ b/explorer/priv/repo/migrations/20240708192338_add_proof_hashes_column.exs @@ -2,8 +2,15 @@ defmodule Explorer.Repo.Migrations.AddProofHashesColumn do use Ecto.Migration def change do - alter table("batches") do # add new columns - add :proof_hashes, {:array, :string} + # alter table("batches") do # add new columns + # add :proof_hashes, {:array, :string} + # end + create table("proofs", primary_key: false) do + add :id, :bigserial, primary_key: true + add :batch_merkle_root, references(:batches, column: :merkle_root, type: :string, size: 66), null: false + add :proof_hash, :binary + + timestamps() end end end From c40b573145af55b620fdba5007d751f7e3138bdd Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Thu, 11 Jul 2024 11:14:40 -0300 Subject: [PATCH 007/201] feat(WIP): add gas per proof, missing gas price --- .../explorer/aligned_layer_service_manager.ex | 90 ++++++++++++++----- explorer/lib/explorer/avs_directory.ex | 2 +- .../explorer_web/live/pages/batch/index.ex | 1 + .../live/pages/batch/index.html.heex | 4 + 4 files changed, 73 insertions(+), 24 deletions(-) diff --git a/explorer/lib/explorer/aligned_layer_service_manager.ex b/explorer/lib/explorer/aligned_layer_service_manager.ex index 01972464b1..5f7df7b535 100644 --- a/explorer/lib/explorer/aligned_layer_service_manager.ex +++ b/explorer/lib/explorer/aligned_layer_service_manager.ex @@ -12,30 +12,52 @@ defmodule AlignedLayerServiceManager do nil -> raise("Invalid ENVIRONMENT var in .env") end - config_file_path = case @aligned_config_file do - nil -> raise("ALIGNED_CONFIG_FILE not set in .env") - file -> file + config_file_path = + case @aligned_config_file do + nil -> raise("ALIGNED_CONFIG_FILE not set in .env") + file -> file + end + + payment_service_path = + "../contracts/script/deploy/config/#{@environment}/batcher-payment-service.#{@environment}.config.json" + + {status_aligned_config, config_json_string} = File.read(config_file_path) + {status_payment_service, payment_service_json_string} = File.read(payment_service_path) + + case status_aligned_config do + :ok -> + Logger.debug("Aligned config file read successfully") + + :error -> + raise( + "Config file not read successfully, did you run make create-env? If you did,\n make sure Alignedlayer config file is correctly stored" + ) end - {status, config_json_string} = File.read(config_file_path) + case status_payment_service do + :ok -> + Logger.debug("Payment service file read successfully") - case status do - :ok -> Logger.debug("File read successfully") - :error -> raise("Config file not read successfully, did you run make create-env? If you did,\n make sure Alignedlayer config file is correctly stored") + :error -> + raise( + "Payment service file not read successfully, did you run make create-env? If you did,\n make sure Alignedlayer config file is correctly stored" + ) end @aligned_layer_service_manager_address Jason.decode!(config_json_string) |> Map.get("addresses") |> Map.get("alignedLayerServiceManager") - @first_block ( - case @environment do - "devnet" -> 0 - "holesky" -> 1728056 - "mainnet" -> 20020000 - _ -> raise("Invalid environment") - end - ) + @gas_per_proof Jason.decode!(payment_service_json_string) + |> Map.get("amounts") + |> Map.get("gasPerProof") + + @first_block (case @environment do + "devnet" -> 0 + "holesky" -> 1_728_056 + "mainnet" -> 20_020_000 + _ -> raise("Invalid environment") + end) use Ethers.Contract, abi_file: "lib/abi/AlignedLayerServiceManager.json", @@ -58,12 +80,15 @@ defmodule AlignedLayerServiceManager do case events do {:ok, []} -> [] {:ok, list} -> Enum.map(list, &extract_new_batch_event_info/1) - {:error, reason } -> raise("Error fetching events: #{Map.get(reason, "message")}") + {:error, reason} -> raise("Error fetching events: #{Map.get(reason, "message")}") end end def extract_new_batch_event_info(event) do new_batch = parse_new_batch_event(event) + + IO.inspect(event) + {:ok, %NewBatchInfo{ address: event |> Map.get(:address), @@ -97,10 +122,14 @@ defmodule AlignedLayerServiceManager do def extract_batch_response({_status, %NewBatchInfo{} = batch_creation}) do created_batch = batch_creation.new_batch was_batch_responded = is_batch_responded(created_batch.batchMerkleRoot) - batch_response = case was_batch_responded do - true -> fetch_batch_response(created_batch.batchMerkleRoot) - false -> %{block_number: nil, transaction_hash: nil, block_timestamp: nil} #was not verified, fill with nils - end + + batch_response = + case was_batch_responded do + true -> fetch_batch_response(created_batch.batchMerkleRoot) + # was not verified, fill with nils + false -> %{block_number: nil, transaction_hash: nil, block_timestamp: nil} + end + %BatchDB{ merkle_root: created_batch.batchMerkleRoot, data_pointer: created_batch.batchDataPointer, @@ -116,13 +145,18 @@ defmodule AlignedLayerServiceManager do } end - #for existing but unverified batches + # for existing but unverified batches def extract_batch_response(%Batches{} = unverified_batch) do was_batch_responded = is_batch_responded(unverified_batch.merkle_root) + case was_batch_responded do - false -> nil # Do nothing since unverified batch was not yet verified + # Do nothing since unverified batch was not yet verified + false -> + nil + true -> batch_response = fetch_batch_response(unverified_batch.merkle_root) + %BatchDB{ merkle_root: unverified_batch.merkle_root, data_pointer: unverified_batch.data_pointer, @@ -150,7 +184,7 @@ defmodule AlignedLayerServiceManager do def get_batch_verified_events(%{merkle_root: merkle_root}) do event = AlignedLayerServiceManager.EventFilters.batch_verified(Utils.string_to_bytes32(merkle_root)) - |> Ethers.get_logs(fromBlock: @first_block) + |> Ethers.get_logs(fromBlock: @first_block) case event do {:error, reason} -> {:error, reason} @@ -179,4 +213,14 @@ defmodule AlignedLayerServiceManager do end end + def get_cost_per_proof() do + @gas_per_proof + end + + def get_current_gas_price() do + case Ethers.current_gas_price() do + {:ok, gas_price} -> gas_price + {:error, error} -> raise("Error fetching gas price: #{error}") + end + end end diff --git a/explorer/lib/explorer/avs_directory.ex b/explorer/lib/explorer/avs_directory.ex index eebfa3b4f0..075a099f42 100644 --- a/explorer/lib/explorer/avs_directory.ex +++ b/explorer/lib/explorer/avs_directory.ex @@ -9,7 +9,7 @@ defmodule AVSDirectory do {status, config_json_string} = File.read(file_path) case status do - :ok -> Logger.debug("File read successfully") + :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 diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index 10de6c40d4..b2f67c1d1e 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -26,6 +26,7 @@ defmodule ExplorerWeb.Batch.Index do assign(socket, merkle_root: merkle_root, current_batch: current_batch, + cost_per_proof: AlignedLayerServiceManager.get_cost_per_proof(), network: System.get_env("ENVIRONMENT"), site_url: System.get_env("PHX_HOST"), page_title: Utils.shorten_hash(merkle_root) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index 6969f22c73..c71ecbab97 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -11,6 +11,10 @@

<%= @merkle_root %>

Amount of Proofs in this Batch:

<%= @current_batch.amount_of_proofs %>

+ Cost per Proof: +

+ <%= @cost_per_proof %> Gas +

Submission Block Number: <.a target="_blank" From ec16b215d277f35172bf82b50a45ff285c5f6ffb Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Thu, 11 Jul 2024 11:28:57 -0300 Subject: [PATCH 008/201] feat(wip): show batch proofs only when 'load proofs' is clicked --- explorer/lib/explorer/models/batches.ex | 3 +-- explorer/lib/explorer_web/live/pages/batch/index.ex | 11 ++++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/explorer/lib/explorer/models/batches.ex b/explorer/lib/explorer/models/batches.ex index 91e65b472e..fdf5760d9e 100644 --- a/explorer/lib/explorer/models/batches.ex +++ b/explorer/lib/explorer/models/batches.ex @@ -14,7 +14,6 @@ defmodule Batches do field :response_transaction_hash, :string field :response_timestamp, :utc_datetime field :data_pointer, :string - has_many :proofs, Proofs, foreign_key: :batch_merkle_root timestamps() end @@ -62,7 +61,7 @@ defmodule Batches do where: b.merkle_root == ^merkle_root, select: b) - Explorer.Repo.one(query) |> Explorer.Repo.preload(:proofs) # TODO remove preload, and has_many from schema. make it a separate call, a "load batch proofs" in frontend, to reduce network load + Explorer.Repo.one(query) end def get_latest_batches(%{amount: amount}) do diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index acee174c65..afb2e58940 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -29,6 +29,7 @@ defmodule ExplorerWeb.Batch.Index do assign(socket, merkle_root: merkle_root, current_batch: current_batch, + proofs: :empty, network: System.get_env("ENVIRONMENT"), site_url: System.get_env("PHX_HOST"), page_title: Utils.shorten_hash(merkle_root) @@ -36,7 +37,7 @@ defmodule ExplorerWeb.Batch.Index do } rescue _ -> - {:ok, assign(socket, merkle_root: :empty, newBatchInfo: :empty, batchWasResponded: :empty, current_batch: :empty)} + {:ok, assign(socket, merkle_root: :empty, newBatchInfo: :empty, batchWasResponded: :empty, current_batch: :empty, proofs: :empty)} end @impl true @@ -52,5 +53,13 @@ defmodule ExplorerWeb.Batch.Index do } end + # @Gian the load button should do something like the following: + # def load_proofs() do + # proofs = Proofs.get_proofs_from_batch(%{merkle_root: @merkle_root}) + # assign(socket, + # proofs: proofs + # ) + # end + embed_templates "*" end From 27c30f17f5796a08fbfe5ed89e57cb27f4eadfd7 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Thu, 11 Jul 2024 11:30:47 -0300 Subject: [PATCH 009/201] fix: get_proofs_from_batch return value --- explorer/lib/explorer/models/proofs.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer/lib/explorer/models/proofs.ex b/explorer/lib/explorer/models/proofs.ex index 3b665588d9..7d9d01fb40 100644 --- a/explorer/lib/explorer/models/proofs.ex +++ b/explorer/lib/explorer/models/proofs.ex @@ -40,7 +40,7 @@ defmodule Proofs do [] -> nil result -> - [result, result |> Enum.count()] + result end end From 78d588e0204dbb68216d7476b3aa713c205f09da Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Thu, 11 Jul 2024 11:41:15 -0300 Subject: [PATCH 010/201] feat(wip): load proofs separately --- explorer/lib/explorer/aligned_layer_service_manager.ex | 2 +- explorer/lib/explorer/models/proofs.ex | 1 - explorer/lib/explorer_web/live/pages/batch/index.ex | 6 ++++-- explorer/lib/explorer_web/live/pages/batch/index.html.heex | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/explorer/lib/explorer/aligned_layer_service_manager.ex b/explorer/lib/explorer/aligned_layer_service_manager.ex index a9ee885e46..4e92b8f091 100644 --- a/explorer/lib/explorer/aligned_layer_service_manager.ex +++ b/explorer/lib/explorer/aligned_layer_service_manager.ex @@ -134,7 +134,7 @@ defmodule AlignedLayerServiceManager do response_transaction_hash: batch_response.transaction_hash, response_timestamp: batch_response.block_timestamp, amount_of_proofs: unverified_batch.amount_of_proofs, - proof_hashes: nil #don't need this value to update an existing but enverified batch, it is on another table + proof_hashes: nil #don't need this value to update an existing but unverified batch, it is on another table } end end diff --git a/explorer/lib/explorer/models/proofs.ex b/explorer/lib/explorer/models/proofs.ex index 7d9d01fb40..54f54b6897 100644 --- a/explorer/lib/explorer/models/proofs.ex +++ b/explorer/lib/explorer/models/proofs.ex @@ -6,7 +6,6 @@ defmodule Proofs do schema "proofs" do field :batch_merkle_root, :string field :proof_hash, :binary - # belongs_to :batch, Batches timestamps() end diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index afb2e58940..fda66ced45 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -24,12 +24,14 @@ defmodule ExplorerWeb.Batch.Index do IO.inspect("current_batch") IO.inspect(current_batch) + proofs = Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) + { :ok, assign(socket, merkle_root: merkle_root, current_batch: current_batch, - proofs: :empty, + proof_hashes: proofs, network: System.get_env("ENVIRONMENT"), site_url: System.get_env("PHX_HOST"), page_title: Utils.shorten_hash(merkle_root) @@ -55,7 +57,7 @@ defmodule ExplorerWeb.Batch.Index do # @Gian the load button should do something like the following: # def load_proofs() do - # proofs = Proofs.get_proofs_from_batch(%{merkle_root: @merkle_root}) + # proofs = Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) # assign(socket, # proofs: proofs # ) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index 6969f22c73..b857d0b783 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -73,7 +73,7 @@ <% end %> Proofs in this batch:
-

<%= proof_hash %>

+

<%= proof.proof_hash %>

<% else %> From 0e31b85bb390848f27f9ae18d0910bdfc22fd480 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Thu, 11 Jul 2024 13:30:55 -0300 Subject: [PATCH 011/201] feat(wip): start batch.cost_per_proof --- explorer/lib/explorer_web/live/pages/batch/index.ex | 1 - explorer/lib/explorer_web/live/pages/batch/index.html.heex | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index b2f67c1d1e..10de6c40d4 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -26,7 +26,6 @@ defmodule ExplorerWeb.Batch.Index do assign(socket, merkle_root: merkle_root, current_batch: current_batch, - cost_per_proof: AlignedLayerServiceManager.get_cost_per_proof(), network: System.get_env("ENVIRONMENT"), site_url: System.get_env("PHX_HOST"), page_title: Utils.shorten_hash(merkle_root) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index c71ecbab97..977814e8d7 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -13,7 +13,7 @@

<%= @current_batch.amount_of_proofs %>

Cost per Proof:

- <%= @cost_per_proof %> Gas + <%= @current_batch.cost_per_proof %> wei

Submission Block Number: <.a From 129cbed69ad0adbe1d4c3876a1bc5be27923e03c Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Thu, 11 Jul 2024 16:30:43 -0300 Subject: [PATCH 012/201] fix(wip): add proofs in batch --- .../lib/explorer_web/live/pages/batch/index.ex | 17 ++++++++++++----- .../live/pages/batch/index.html.heex | 4 ++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index fda66ced45..6ba71fcd7d 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -21,10 +21,9 @@ defmodule ExplorerWeb.Batch.Index do batch -> batch end - IO.inspect("current_batch") - IO.inspect(current_batch) - - proofs = Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) + proofs_struct = Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) + proofs = proofs_struct + |> Enum.map(fn proof -> "0x" <> Base.encode16(proof.proof_hash, case: :lower) end) { :ok, @@ -39,7 +38,15 @@ defmodule ExplorerWeb.Batch.Index do } rescue _ -> - {:ok, assign(socket, merkle_root: :empty, newBatchInfo: :empty, batchWasResponded: :empty, current_batch: :empty, proofs: :empty)} + {:ok, + socket + |> assign( + merkle_root: :empty, + current_batch: :empty, + newBatchInfo: :empty, + batchWasResponded: :empty, + proofs: :empty + )} end @impl true diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index b857d0b783..250b75f850 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -72,8 +72,8 @@ /> <% end %> Proofs in this batch: -
-

<%= proof.proof_hash %>

+
+

<%= proof %>

<% else %> From 38713cfaa4cf8c3f95897f962511ac1be65b6b67 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Thu, 11 Jul 2024 16:35:42 -0300 Subject: [PATCH 013/201] refactor: move map to function --- .../explorer_web/live/pages/batch/index.ex | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index 6ba71fcd7d..c269b0a553 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -8,29 +8,18 @@ defmodule ExplorerWeb.Batch.Index do Phoenix.PubSub.subscribe(Explorer.PubSub, "update_views") - if merkle_root == nil do - { - :empty, - assign(socket, newBatchEvent: :empty, batchWasResponded: :empty) - } - end - current_batch = case Batches.get_batch(%{merkle_root: merkle_root}) do nil -> :empty batch -> batch end - proofs_struct = Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) - proofs = proofs_struct - |> Enum.map(fn proof -> "0x" <> Base.encode16(proof.proof_hash, case: :lower) end) - { :ok, assign(socket, merkle_root: merkle_root, current_batch: current_batch, - proof_hashes: proofs, + proof_hashes: get_proofs(merkle_root), network: System.get_env("ENVIRONMENT"), site_url: System.get_env("PHX_HOST"), page_title: Utils.shorten_hash(merkle_root) @@ -45,6 +34,7 @@ defmodule ExplorerWeb.Batch.Index do current_batch: :empty, newBatchInfo: :empty, batchWasResponded: :empty, + proof_hashes: :empty, proofs: :empty )} end @@ -62,6 +52,11 @@ defmodule ExplorerWeb.Batch.Index do } end + defp get_proofs(merkle_root) do + Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) + |> Enum.map(fn proof -> "0x" <> Base.encode16(proof.proof_hash, case: :lower) end) + end + # @Gian the load button should do something like the following: # def load_proofs() do # proofs = Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) From 946164d00e6407e372d15a6ce10b791c39b2ab9f Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Thu, 11 Jul 2024 17:08:52 -0300 Subject: [PATCH 014/201] feat: make proofs hidden behind load proofs button --- .../lib/explorer_web/live/pages/batch/index.ex | 15 ++++++--------- .../explorer_web/live/pages/batch/index.html.heex | 14 ++++++++++---- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index c269b0a553..c781950ef1 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -19,7 +19,7 @@ defmodule ExplorerWeb.Batch.Index do assign(socket, merkle_root: merkle_root, current_batch: current_batch, - proof_hashes: get_proofs(merkle_root), + proof_hashes: :empty, network: System.get_env("ENVIRONMENT"), site_url: System.get_env("PHX_HOST"), page_title: Utils.shorten_hash(merkle_root) @@ -52,18 +52,15 @@ defmodule ExplorerWeb.Batch.Index do } end + @impl true + def handle_event("load_proofs", _value, socket) do + {:noreply, assign(socket, proof_hashes: get_proofs(socket.assigns.merkle_root))} + end + defp get_proofs(merkle_root) do Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) |> Enum.map(fn proof -> "0x" <> Base.encode16(proof.proof_hash, case: :lower) end) end - # @Gian the load button should do something like the following: - # def load_proofs() do - # proofs = Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) - # assign(socket, - # proofs: proofs - # ) - # end - embed_templates "*" end diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index 250b75f850..f72bd1291c 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -71,10 +71,16 @@ text={"Just%20submitted%20a%20proof%20via%20@alignedlayer%0AI%20am%20now%20%23aligned%20✅%0A#{@site_url}/batches/#{@merkle_root}"} /> <% end %> - Proofs in this batch: -
-

<%= proof %>

-
+ <%= if @proof_hashes != :empty do %> + Proofs in this batch: +
+

<%= proof %>

+
+ <% else %> + <.button class="w-fit text-foreground" phx-click="load_proofs"> + Load Proofs + + <% end %> <% else %>
From 6904c827cf5f27ac68533130153338a1052a4336 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Thu, 11 Jul 2024 17:23:58 -0300 Subject: [PATCH 015/201] feat: add icon button and option to hide --- explorer/lib/explorer_web/live/pages/batch/index.ex | 7 ++++++- .../lib/explorer_web/live/pages/batch/index.html.heex | 11 +++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index c781950ef1..63ea529b1f 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -53,10 +53,15 @@ defmodule ExplorerWeb.Batch.Index do end @impl true - def handle_event("load_proofs", _value, socket) do + def handle_event("show_proofs", _value, socket) do {:noreply, assign(socket, proof_hashes: get_proofs(socket.assigns.merkle_root))} end + @impl true + def handle_event("hide_proofs", _value, socket) do + {:noreply, assign(socket, proof_hashes: :empty)} + end + defp get_proofs(merkle_root) do Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) |> Enum.map(fn proof -> "0x" <> Base.encode16(proof.proof_hash, case: :lower) end) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index f72bd1291c..68ada489f1 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -71,14 +71,17 @@ text={"Just%20submitted%20a%20proof%20via%20@alignedlayer%0AI%20am%20now%20%23aligned%20✅%0A#{@site_url}/batches/#{@merkle_root}"} /> <% end %> + Proofs in this batch: <%= if @proof_hashes != :empty do %> - Proofs in this batch: -
+

<%= proof %>

+ <.button class="w-fit text-foreground inline-flex items-center gap-1.5" phx-click="hide_proofs"> + <.icon name="hero-eye-slash" class="size-3" /> Hide Proofs +
<% else %> - <.button class="w-fit text-foreground" phx-click="load_proofs"> - Load Proofs + <.button class="w-fit text-foreground inline-flex items-center gap-1.5" phx-click="show_proofs"> + <.icon name="hero-eye" class="size-3" /> Show Proofs <% end %> From 497ee0e4c2be682adf5090c24a88d49238e413ca Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Thu, 11 Jul 2024 17:50:32 -0300 Subject: [PATCH 016/201] refactor: add icon option on button core component --- .../components/core_components.ex | 7 +++++-- .../lib/explorer_web/components/search.ex | 4 ++-- .../live/pages/batch/index.html.heex | 16 +++++++++++---- .../live/pages/batches/index.html.heex | 20 +++++++++---------- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex index ce662079ca..2c3dded866 100644 --- a/explorer/lib/explorer_web/components/core_components.ex +++ b/explorer/lib/explorer_web/components/core_components.ex @@ -214,7 +214,7 @@ defmodule ExplorerWeb.CoreComponents do end @doc """ - Renders a button. + Renders a button. To add an icon just search for the icon name in the https://heroicons.com/ and pass it as the icon attribute. ## Examples @@ -224,6 +224,8 @@ defmodule ExplorerWeb.CoreComponents do attr :type, :string, default: nil attr :class, :string, default: nil attr :rest, :global, include: ~w(disabled form name value) + attr :icon, :string, default: nil + attr :icon_class, :string, default: nil slot :inner_block, required: true @@ -234,11 +236,12 @@ defmodule ExplorerWeb.CoreComponents do class={[ "phx-submit-loading:opacity-75 rounded-lg bg-card hover:bg-muted py-2 px-3", "text-sm font-semibold leading-6 text-foregound active:text-foregound/80", - "border border-foreground/20", + "border border-foreground/20 inline-flex items-center gap-1.5", @class ]} {@rest} > + <.icon :if={@icon != nil} name={"hero-#{@icon}"} class={"size-4 #{@icon_class}"} /> <%= render_slot(@inner_block) %> """ diff --git a/explorer/lib/explorer_web/components/search.ex b/explorer/lib/explorer_web/components/search.ex index 9068481165..13ee4e932f 100644 --- a/explorer/lib/explorer_web/components/search.ex +++ b/explorer/lib/explorer_web/components/search.ex @@ -41,10 +41,10 @@ defmodule SearchComponent do name="batch[merkle_root]" /> <.button + icon="magnifying-glass-solid" type="submit" - class="absolute right-5 sm:right-1 -top-0.5 whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-transparent border-none text-muted-foreground hover:text-foreground size-10 rounded-full shadow-none hover:bg-transparent" + class="absolute right-5 sm:right-1 top-0 whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-transparent border-none text-muted-foreground hover:text-foreground size-10 rounded-full shadow-none hover:bg-transparent" > - <.icon name="hero-magnifying-glass-solid" class="size-4" /> Search diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index 68ada489f1..fd3dd862ff 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -75,13 +75,21 @@ <%= if @proof_hashes != :empty do %>

<%= proof %>

- <.button class="w-fit text-foreground inline-flex items-center gap-1.5" phx-click="hide_proofs"> - <.icon name="hero-eye-slash" class="size-3" /> Hide Proofs + <.button + icon="eye-slash" + class="w-fit text-foreground inline-flex items-center gap-1.5" + phx-click="hide_proofs" + > + Hide Proofs
<% else %> - <.button class="w-fit text-foreground inline-flex items-center gap-1.5" phx-click="show_proofs"> - <.icon name="hero-eye" class="size-3" /> Show Proofs + <.button + icon="eye" + class="w-fit text-foreground inline-flex items-center gap-1.5" + phx-click="show_proofs" + > + Show Proofs <% end %> 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 ca9ee7b9c3..b7811aa894 100644 --- a/explorer/lib/explorer_web/live/pages/batches/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batches/index.html.heex @@ -52,11 +52,11 @@
<%= if @current_page > 1 do %> <.link navigate={~p"/batches?page=#{@current_page - 1}"}> - <.button class="text-muted-foreground flex size-10 items-center group"> - <.icon - name="hero-arrow-left-solid" - class="group-hover:-translate-x-1 transition-all duration-150 size-4" - /> + <.button + icon="arrow-left-solid" + icon_class="group-hover:-translate-x-1 transition-all duration-150" + class="text-muted-foreground flex size-10 items-center group" + > Previous Page @@ -78,11 +78,11 @@ /> <.link navigate={~p"/batches?page=#{@current_page + 1}"}> - <.button class="text-muted-foreground flex size-10 items-center group"> - <.icon - name="hero-arrow-right-solid" - class="group-hover:translate-x-1 transition-all duration-150 size-4" - /> + <.button + icon="arrow-right-solid" + icon_class="group-hover:translate-x-1 transition-all duration-150" + class="text-muted-foreground flex size-10 items-center group" + > Next Page From 68114d980e5e8c1117f1fe9bd092aeb4098d0b20 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Thu, 11 Jul 2024 18:03:20 -0300 Subject: [PATCH 017/201] feat(wip): cost_per_proof column --- explorer/lib/explorer/aligned_layer_service_manager.ex | 1 + explorer/lib/explorer/models/batch_structs.ex | 6 ++++-- explorer/lib/explorer/models/batches.ex | 6 ++++-- explorer/lib/explorer/periodically.ex | 2 +- ...240711163410_add_cost_per_proof_column_in_batches.exs | 9 +++++++++ 5 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 explorer/priv/repo/migrations/20240711163410_add_cost_per_proof_column_in_batches.exs diff --git a/explorer/lib/explorer/aligned_layer_service_manager.ex b/explorer/lib/explorer/aligned_layer_service_manager.ex index 5f7df7b535..60460ac24a 100644 --- a/explorer/lib/explorer/aligned_layer_service_manager.ex +++ b/explorer/lib/explorer/aligned_layer_service_manager.ex @@ -87,6 +87,7 @@ defmodule AlignedLayerServiceManager do def extract_new_batch_event_info(event) do new_batch = parse_new_batch_event(event) + IO.inspect("New batch event:") IO.inspect(event) {:ok, diff --git a/explorer/lib/explorer/models/batch_structs.ex b/explorer/lib/explorer/models/batch_structs.ex index 3d9babbf44..17c9fad3ea 100644 --- a/explorer/lib/explorer/models/batch_structs.ex +++ b/explorer/lib/explorer/models/batch_structs.ex @@ -29,7 +29,8 @@ defmodule BatchDB do :submission_block_number, :submission_transaction_hash, :submission_timestamp, - :proof_hashes + :proof_hashes, + :cost_per_proof ] defstruct [ :merkle_root, @@ -42,6 +43,7 @@ defmodule BatchDB do :response_transaction_hash, :response_timestamp, :data_pointer, - :proof_hashes + :proof_hashes, + :cost_per_proof ] end diff --git a/explorer/lib/explorer/models/batches.ex b/explorer/lib/explorer/models/batches.ex index ca0cc7b10b..300365348d 100644 --- a/explorer/lib/explorer/models/batches.ex +++ b/explorer/lib/explorer/models/batches.ex @@ -15,6 +15,7 @@ defmodule Batches do field :response_timestamp, :utc_datetime field :data_pointer, :string field :proof_hashes, {:array, :string} + field :cost_per_proof, :integer timestamps() end @@ -22,8 +23,8 @@ defmodule Batches do @doc false def changeset(new_batch, updates) do new_batch - |> cast(updates, [:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash, :submission_timestamp, :response_block_number, :response_transaction_hash, :response_timestamp, :data_pointer, :proof_hashes]) - |> validate_required([:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash, :proof_hashes]) + |> cast(updates, [:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash, :submission_timestamp, :response_block_number, :response_transaction_hash, :response_timestamp, :data_pointer, :proof_hashes, :cost_per_proof]) + |> validate_required([:merkle_root, :amount_of_proofs, :is_verified, :submission_block_number, :submission_transaction_hash, :proof_hashes, :cost_per_proof]) |> validate_format(:merkle_root, ~r/0x[a-fA-F0-9]{64}/) |> unique_constraint(:merkle_root) |> validate_number(:amount_of_proofs, greater_than: 0) @@ -32,6 +33,7 @@ defmodule Batches do |> validate_format(:submission_transaction_hash, ~r/0x[a-fA-F0-9]{64}/) |> validate_number(:response_block_number, greater_than: 0) |> validate_format(:response_transaction_hash, ~r/0x[a-fA-F0-9]{64}/) + |> validate_number(:cost_per_proof, greater_than: 0) end def cast_to_batches(%BatchDB{} = batch_db) do diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index 767b7a28cd..f570e87439 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -18,7 +18,7 @@ defmodule Explorer.Periodically do def handle_info(:work, count) do # Reads and process last n blocks for new batches or batch changes - read_block_qty = 8 + read_block_qty = 800 #TODO rollback to 8 latest_block_number = AlignedLayerServiceManager.get_latest_block_number() read_from_block = max(0, latest_block_number - read_block_qty) diff --git a/explorer/priv/repo/migrations/20240711163410_add_cost_per_proof_column_in_batches.exs b/explorer/priv/repo/migrations/20240711163410_add_cost_per_proof_column_in_batches.exs new file mode 100644 index 0000000000..94c81cdf25 --- /dev/null +++ b/explorer/priv/repo/migrations/20240711163410_add_cost_per_proof_column_in_batches.exs @@ -0,0 +1,9 @@ +defmodule Explorer.Repo.Migrations.AddCostPerProofColumnInBatches do + use Ecto.Migration + + def change do + alter table("batches") do # add new columns + add :cost_per_proof, :integer + end + end +end From 48a3ce1e56411f8b5b40f26c3e7b811802b3af6b Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Thu, 11 Jul 2024 18:47:58 -0300 Subject: [PATCH 018/201] feat: cost per proof done, in wei --- .../explorer/aligned_layer_service_manager.ex | 21 +++++++++++-------- explorer/lib/explorer/models/batches.ex | 3 ++- ...0_add_cost_per_proof_column_in_batches.exs | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/explorer/lib/explorer/aligned_layer_service_manager.ex b/explorer/lib/explorer/aligned_layer_service_manager.ex index c801be8ab6..82be8dd43e 100644 --- a/explorer/lib/explorer/aligned_layer_service_manager.ex +++ b/explorer/lib/explorer/aligned_layer_service_manager.ex @@ -87,9 +87,6 @@ defmodule AlignedLayerServiceManager do def extract_new_batch_event_info(event) do new_batch = parse_new_batch_event(event) - IO.inspect("New batch event:") - IO.inspect(event) - {:ok, %NewBatchInfo{ address: event |> Map.get(:address), @@ -142,7 +139,8 @@ defmodule AlignedLayerServiceManager do response_transaction_hash: batch_response.transaction_hash, response_timestamp: batch_response.block_timestamp, amount_of_proofs: nil, - proof_hashes: nil + proof_hashes: nil, + cost_per_proof: get_cost_per_proof(), #TODO i HERE IS THE COST PER PROOF } end @@ -169,6 +167,7 @@ defmodule AlignedLayerServiceManager do response_transaction_hash: batch_response.transaction_hash, response_timestamp: batch_response.block_timestamp, amount_of_proofs: unverified_batch.amount_of_proofs, + cost_per_proof: unverified_batch.cost_per_proof, proof_hashes: nil #don't need this value to update an existing but unverified batch, it is on another table } end @@ -214,14 +213,18 @@ defmodule AlignedLayerServiceManager do end end - def get_cost_per_proof() do - @gas_per_proof - end - def get_current_gas_price() do case Ethers.current_gas_price() do - {:ok, gas_price} -> gas_price + {:ok, gas_price} -> + gas_price {:error, error} -> raise("Error fetching gas price: #{error}") end end + + def get_cost_per_proof() do + case Integer.parse(@gas_per_proof) do + {value, _} -> value * get_current_gas_price() + :error -> raise("Error parsing @gas_per_proof") + end + end end diff --git a/explorer/lib/explorer/models/batches.ex b/explorer/lib/explorer/models/batches.ex index 1bef8756e2..6cefdde0b1 100644 --- a/explorer/lib/explorer/models/batches.ex +++ b/explorer/lib/explorer/models/batches.ex @@ -47,6 +47,7 @@ defmodule Batches do response_transaction_hash: batch_db.response_transaction_hash, response_timestamp: batch_db.response_timestamp, data_pointer: batch_db.data_pointer, + cost_per_proof: batch_db.cost_per_proof } end @@ -133,7 +134,7 @@ defmodule Batches do |> Ecto.Multi.insert_all(:insert_all, Proofs, proofs) case Explorer.Repo.transaction(multi) do - {:ok, %{insert_batch: _batch, insert_proofs: _proofs}} -> + {:ok, _} -> IO.puts("Batch inserted successfully") {:ok, :success} diff --git a/explorer/priv/repo/migrations/20240711163410_add_cost_per_proof_column_in_batches.exs b/explorer/priv/repo/migrations/20240711163410_add_cost_per_proof_column_in_batches.exs index 94c81cdf25..eeecfcd6c6 100644 --- a/explorer/priv/repo/migrations/20240711163410_add_cost_per_proof_column_in_batches.exs +++ b/explorer/priv/repo/migrations/20240711163410_add_cost_per_proof_column_in_batches.exs @@ -3,7 +3,7 @@ defmodule Explorer.Repo.Migrations.AddCostPerProofColumnInBatches do def change do alter table("batches") do # add new columns - add :cost_per_proof, :integer + add :cost_per_proof, :bigint end end end From 4ab32dc1f3967ae22a9b8b10dbff36a76ee8b623 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Thu, 11 Jul 2024 20:59:16 -0300 Subject: [PATCH 019/201] fix: icon not being displayed style: update seachbar color on hover --- .../explorer_web/components/core_components.ex | 2 +- explorer/lib/explorer_web/components/search.ex | 6 +++--- .../live/pages/batch/index.html.heex | 16 ++++------------ .../live/pages/batches/index.html.heex | 4 ++-- 4 files changed, 10 insertions(+), 18 deletions(-) diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex index 2c3dded866..0273a6cc87 100644 --- a/explorer/lib/explorer_web/components/core_components.ex +++ b/explorer/lib/explorer_web/components/core_components.ex @@ -241,7 +241,7 @@ defmodule ExplorerWeb.CoreComponents do ]} {@rest} > - <.icon :if={@icon != nil} name={"hero-#{@icon}"} class={"size-4 #{@icon_class}"} /> + <.icon :if={@icon != nil} name={"hero-#{@icon}"} class={"size-4 stroke-inherit #{@icon_class}"} /> <%= render_slot(@inner_block) %> """ diff --git a/explorer/lib/explorer_web/components/search.ex b/explorer/lib/explorer_web/components/search.ex index 13ee4e932f..2cc322c703 100644 --- a/explorer/lib/explorer_web/components/search.ex +++ b/explorer/lib/explorer_web/components/search.ex @@ -35,16 +35,16 @@ defmodule SearchComponent do <.button - icon="magnifying-glass-solid" type="submit" - class="absolute right-5 sm:right-1 top-0 whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-transparent border-none text-muted-foreground hover:text-foreground size-10 rounded-full shadow-none hover:bg-transparent" + class="absolute right-5 sm:right-1 top-0.5 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-transparent border-none size-10 shadow-none hover:bg-transparent text-muted-foreground" > + <.icon name="hero-magnifying-glass-solid" class="size-5 hover:text-foreground" /> Search diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index fd3dd862ff..7ec59e6102 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -75,21 +75,13 @@ <%= if @proof_hashes != :empty do %>

<%= proof %>

- <.button - icon="eye-slash" - class="w-fit text-foreground inline-flex items-center gap-1.5" - phx-click="hide_proofs" - > - Hide Proofs + <.button class="w-fit text-foreground" phx-click="hide_proofs"> + <.icon name="hero-eye-slash" class="size-4" /> Hide Proofs
<% else %> - <.button - icon="eye" - class="w-fit text-foreground inline-flex items-center gap-1.5" - phx-click="show_proofs" - > - Show Proofs + <.button class="w-fit text-foreground font-semibold" phx-click="show_proofs"> + <.icon name="hero-eye" class="size-4" /> Show Proofs <% end %> 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 b7811aa894..4c8176ed1e 100644 --- a/explorer/lib/explorer_web/live/pages/batches/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batches/index.html.heex @@ -55,7 +55,7 @@ <.button icon="arrow-left-solid" icon_class="group-hover:-translate-x-1 transition-all duration-150" - class="text-muted-foreground flex size-10 items-center group" + class="text-muted-foreground size-10 group" > Previous Page @@ -81,7 +81,7 @@ <.button icon="arrow-right-solid" icon_class="group-hover:translate-x-1 transition-all duration-150" - class="text-muted-foreground flex size-10 items-center group" + class="text-muted-foreground size-10 group" > Next Page From b27a2af37d3a5e5f6d2e2a6e769b631b53e6864a Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:09:53 -0300 Subject: [PATCH 020/201] chore: rolled back --repetitions change --- Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 9b08e2051a..d03a514638 100644 --- a/Makefile +++ b/Makefile @@ -217,7 +217,7 @@ batcher_send_sp1_burst: --proving_system SP1 \ --proof ../../scripts/test_files/sp1/sp1_fibonacci.proof \ --vm_program ../../scripts/test_files/sp1/sp1_fibonacci.elf \ - --repetitions 3 \ + --repetitions 15 \ --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 batcher_send_infinite_sp1: @@ -260,7 +260,7 @@ batcher_send_plonk_bn254_burst: batcher/target/release/aligned --public_input ../../scripts/test_files/gnark_plonk_bn254_script/plonk_pub_input.pub \ --vk ../../scripts/test_files/gnark_plonk_bn254_script/plonk.vk \ --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \ - --repetitions 3 + --repetitions 15 batcher_send_plonk_bls12_381_task: batcher/target/release/aligned @echo "Sending Groth16 BLS12-381 1!=0 task to Batcher..." @@ -279,7 +279,7 @@ batcher_send_plonk_bls12_381_burst: batcher/target/release/aligned --public_input ../../scripts/test_files/gnark_plonk_bls12_381_script/plonk_pub_input.pub \ --vk ../../scripts/test_files/gnark_plonk_bls12_381_script/plonk.vk \ --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 \ - --repetitions 3 + --repetitions 15 batcher_send_groth16_bn254_task: batcher/target/release/aligned @@ -298,7 +298,7 @@ batcher_send_groth16_burst: batcher/target/release/aligned --proof ../../scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs/ineq_1_groth16.proof \ --public_input ../../scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs/ineq_1_groth16.pub \ --vk ../../scripts/test_files/gnark_groth16_bn254_infinite_script/infinite_proofs/ineq_1_groth16.vk \ - --repetitions 3 \ + --repetitions 15 \ --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 batcher_send_infinite_groth16: batcher/target/release/aligned ## Send a different Groth16 BN254 proof using the client every 3 seconds @@ -326,7 +326,7 @@ batcher_send_halo2_ipa_task_burst_5: batcher/target/release/aligned --proof ../../scripts/test_files/halo2_ipa/proof.bin \ --public_input ../../scripts/test_files/halo2_ipa/pub_input.bin \ --vk ../../scripts/test_files/halo2_ipa/params.bin \ - --repetitions 5 + --repetitions 15 batcher_send_halo2_kzg_task: batcher/target/release/aligned @echo "Sending Halo2 KZG 1!=0 task to Batcher..." @@ -344,7 +344,7 @@ batcher_send_halo2_kzg_task_burst_5: batcher/target/release/aligned --proof ../../scripts/test_files/halo2_kzg/proof.bin \ --public_input ../../scripts/test_files/halo2_kzg/pub_input.bin \ --vk ../../scripts/test_files/halo2_kzg/params.bin \ - --repetitions 5 \ + --repetitions 15 \ --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 __GENERATE_PROOFS__: From 20a379ed62542bd4cb96b7ca8a5453e4660fdf2b Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:10:51 -0300 Subject: [PATCH 021/201] chore: rolled back --repetitions change --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index d03a514638..608d76d095 100644 --- a/Makefile +++ b/Makefile @@ -326,7 +326,7 @@ batcher_send_halo2_ipa_task_burst_5: batcher/target/release/aligned --proof ../../scripts/test_files/halo2_ipa/proof.bin \ --public_input ../../scripts/test_files/halo2_ipa/pub_input.bin \ --vk ../../scripts/test_files/halo2_ipa/params.bin \ - --repetitions 15 + --repetitions 5 batcher_send_halo2_kzg_task: batcher/target/release/aligned @echo "Sending Halo2 KZG 1!=0 task to Batcher..." @@ -344,7 +344,7 @@ batcher_send_halo2_kzg_task_burst_5: batcher/target/release/aligned --proof ../../scripts/test_files/halo2_kzg/proof.bin \ --public_input ../../scripts/test_files/halo2_kzg/pub_input.bin \ --vk ../../scripts/test_files/halo2_kzg/params.bin \ - --repetitions 15 \ + --repetitions 5 \ --proof_generator_addr 0x66f9664f97F2b50F62D13eA064982f936dE76657 __GENERATE_PROOFS__: From 2e62d410d8e94467a52d365dff621b6e25ce514a Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:17:45 -0300 Subject: [PATCH 022/201] fix: unverified batches function arity error Co-authored-by: Urix <43704209+uri-99@users.noreply.github.com> --- explorer/lib/explorer/models/batches.ex | 1 + explorer/lib/explorer/models/proofs.ex | 2 +- explorer/lib/explorer/periodically.ex | 12 ++++++------ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/explorer/lib/explorer/models/batches.ex b/explorer/lib/explorer/models/batches.ex index 6cefdde0b1..bcdba8a691 100644 --- a/explorer/lib/explorer/models/batches.ex +++ b/explorer/lib/explorer/models/batches.ex @@ -14,6 +14,7 @@ defmodule Batches do field :response_transaction_hash, :string field :response_timestamp, :utc_datetime field :data_pointer, :string + # Elixir's default integer type effectively serves the same purpose as bigint, handling arbitrarily large integers out of the box. field :cost_per_proof, :integer timestamps() diff --git a/explorer/lib/explorer/models/proofs.ex b/explorer/lib/explorer/models/proofs.ex index 54f54b6897..d6da42277a 100644 --- a/explorer/lib/explorer/models/proofs.ex +++ b/explorer/lib/explorer/models/proofs.ex @@ -21,7 +21,7 @@ defmodule Proofs do def cast_to_proofs(%BatchDB{} = batch) do case batch.proof_hashes do - nil -> nil # TODO or %{} + nil -> %{} # not working with nil proof_hashes -> Enum.map(proof_hashes, fn proof_hash -> %{batch_merkle_root: batch.merkle_root, proof_hash: proof_hash, inserted_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second), updated_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)} end) diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index 70de639e2e..6a6bebf66c 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -18,7 +18,7 @@ defmodule Explorer.Periodically do def handle_info(:work, count) do # Reads and process last n blocks for new batches or batch changes - read_block_qty = 800 #TODO rollback to 8 + read_block_qty = 8 # rollback to 800 if needed latest_block_number = AlignedLayerServiceManager.get_latest_block_number() read_from_block = max(0, latest_block_number - read_block_qty) @@ -27,9 +27,9 @@ defmodule Explorer.Periodically do # 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 + # if new_count == 0 do Task.start(&process_unverified_batches/0) - end + # end {:noreply, new_count} end @@ -85,15 +85,15 @@ defmodule Explorer.Periodically do "verifying previous unverified batches..." |> IO.inspect() unverified_batches = Batches.get_unverified_batches() - array_of_changest_tuples = + array_of_changeset_tuples = unverified_batches |> Enum.map(&AlignedLayerServiceManager.extract_batch_response/1) |> Enum.reject(&is_nil/1) |> Enum.map(&Batches.generate_changesets/1) Enum.map( - array_of_changest_tuples, - fn [batch_changeset, proofs] -> + array_of_changeset_tuples, + fn {batch_changeset, proofs} -> Batches.insert_or_update(batch_changeset, proofs) end) end From 140556d245da893f063564d9754b7ee0cd397721 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Fri, 12 Jul 2024 16:32:08 -0300 Subject: [PATCH 023/201] feat: add eth to cost per proof --- .../live/pages/batch/index.html.heex | 20 ++++++--- explorer/lib/explorer_web/live/utils.ex | 43 +++++++++++++------ 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index 7a6f254f2b..ea9e285dec 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -11,10 +11,12 @@

<%= @merkle_root %>

Amount of Proofs in this Batch:

<%= @current_batch.amount_of_proofs %>

- Cost per Proof: -

- <%= @current_batch.cost_per_proof %> wei -

+ <%= if @current_batch.cost_per_proof != nil do %> + Cost per Proof: +

+ <%= @current_batch.cost_per_proof |> Utils.wei_to_eth() %> ETH +

+ <% end %> Submission Block Number: <.a target="_blank" @@ -79,12 +81,18 @@ <%= if @proof_hashes != :empty do %>

<%= proof %>

- <.button class="w-fit text-foreground inline-flex items-center gap-1.5" phx-click="hide_proofs"> + <.button + class="w-fit text-foreground inline-flex items-center gap-1.5" + phx-click="hide_proofs" + > <.icon name="hero-eye-slash" class="size-3" /> Hide Proofs
<% else %> - <.button class="w-fit text-foreground inline-flex items-center gap-1.5" phx-click="show_proofs"> + <.button + class="w-fit text-foreground inline-flex items-center gap-1.5" + phx-click="show_proofs" + > <.icon name="hero-eye" class="size-3" /> Show Proofs <% end %> diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex index 4c606fc069..4d975c22c7 100644 --- a/explorer/lib/explorer_web/live/utils.ex +++ b/explorer/lib/explorer_web/live/utils.ex @@ -96,6 +96,24 @@ defmodule ExplorerWeb.Utils do defp pad_leading_zero(value) do Integer.to_string(value) |> String.pad_leading(2, "0") end + + @wei_per_eth 1_000_000_000_000_000_000 + + def wei_to_eth(wei, decimal_places \\ 18) + + def wei_to_eth(wei, decimal_places) when is_integer(wei) do + wei + |> Decimal.new() + |> Decimal.div(Decimal.new(@wei_per_eth)) + |> Decimal.round(decimal_places) + |> Decimal.to_string(:normal) + end + + def wei_to_eth(wei, decimal_places) when is_binary(wei) do + wei + |> String.to_integer() + |> wei_to_eth(decimal_places) + end end defmodule Utils do @@ -125,14 +143,14 @@ defmodule Utils do def calculate_proof_hashes({:ok, batch_json}) do IO.inspect("Calculating proof hashes") + batch_json - |> Enum.map( - fn proof -> - :crypto.hash(:sha3_256, proof["proof"]) - # TODO removed this because i want to store as bytea, not a string. - # |> Base.encode16(case: :lower) - # |> (&("0x" <> &1)).() - end) + |> Enum.map(fn proof -> + :crypto.hash(:sha3_256, proof["proof"]) + # TODO removed this because i want to store as bytea, not a string. + # |> Base.encode16(case: :lower) + # |> (&("0x" <> &1)).() + end) end def calculate_proof_hashes({:error, reason}) do @@ -165,16 +183,17 @@ defmodule Utils do IO.inspect("Fetching from S3") batch.data_pointer - |> Utils.fetch_batch_data_pointer() - |> Utils.calculate_proof_hashes() + |> Utils.fetch_batch_data_pointer() + |> Utils.calculate_proof_hashes() proof_hashes -> - IO.inspect("Fetching from DB") #already processed and stored the S3 data + # already processed and stored the S3 data + IO.inspect("Fetching from DB") proof_hashes end batch - |> Map.put(:proof_hashes, proof_hashes) - |> Map.put(:amount_of_proofs, proof_hashes |> Enum.count()) + |> Map.put(:proof_hashes, proof_hashes) + |> Map.put(:amount_of_proofs, proof_hashes |> Enum.count()) end end From 30ebda7d32a334800d5eab09265f84833380e1ab Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:51:11 -0300 Subject: [PATCH 024/201] chore: rename add column to add table in ecto migrate --- ..._column.exs => 20240708192338_add_proof_hashes_table.exs} | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) rename explorer/priv/repo/migrations/{20240708192338_add_proof_hashes_column.exs => 20240708192338_add_proof_hashes_table.exs} (65%) diff --git a/explorer/priv/repo/migrations/20240708192338_add_proof_hashes_column.exs b/explorer/priv/repo/migrations/20240708192338_add_proof_hashes_table.exs similarity index 65% rename from explorer/priv/repo/migrations/20240708192338_add_proof_hashes_column.exs rename to explorer/priv/repo/migrations/20240708192338_add_proof_hashes_table.exs index ef65e8eb4f..f0f203f63d 100644 --- a/explorer/priv/repo/migrations/20240708192338_add_proof_hashes_column.exs +++ b/explorer/priv/repo/migrations/20240708192338_add_proof_hashes_table.exs @@ -1,10 +1,7 @@ -defmodule Explorer.Repo.Migrations.AddProofHashesColumn do +defmodule Explorer.Repo.Migrations.AddProofHashesTable do use Ecto.Migration def change do - # alter table("batches") do # add new columns - # add :proof_hashes, {:array, :string} - # end create table("proofs", primary_key: false) do add :id, :bigserial, primary_key: true add :batch_merkle_root, references(:batches, column: :merkle_root, type: :string, size: 66), null: false From eb15c63b488c480468255f310de93449edfd4ed0 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:56:26 -0300 Subject: [PATCH 025/201] fix: unmatched clause error --- explorer/lib/explorer/models/batches.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer/lib/explorer/models/batches.ex b/explorer/lib/explorer/models/batches.ex index fdf5760d9e..1032a64e9f 100644 --- a/explorer/lib/explorer/models/batches.ex +++ b/explorer/lib/explorer/models/batches.ex @@ -131,7 +131,7 @@ defmodule Batches do |> Ecto.Multi.insert_all(:insert_all, Proofs, proofs) case Explorer.Repo.transaction(multi) do - {:ok, %{insert_batch: _batch, insert_proofs: _proofs}} -> + {:ok, _} -> IO.puts("Batch inserted successfully") {:ok, :success} From 47950f7896e17c0cd15f3d482fa4e5b83ea2ddf9 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 15 Jul 2024 14:36:47 -0300 Subject: [PATCH 026/201] fix: handle get_proofs when none --- explorer/lib/explorer_web/live/pages/batch/index.ex | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index 63ea529b1f..37f84a13ad 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -63,8 +63,12 @@ defmodule ExplorerWeb.Batch.Index do end defp get_proofs(merkle_root) do - Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) - |> Enum.map(fn proof -> "0x" <> Base.encode16(proof.proof_hash, case: :lower) end) + case Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) do + proofs when is_list(proofs) -> + Enum.map(proofs, fn proof -> "0x" <> Base.encode16(proof.proof_hash, case: :lower) end) + _ -> + [] + end end embed_templates "*" From 11240d365e5e59f71317c6496558774728ce7be3 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 15 Jul 2024 14:47:38 -0300 Subject: [PATCH 027/201] fix: front for no proofs for batch --- .../lib/explorer_web/live/pages/batch/index.ex | 2 +- .../explorer_web/live/pages/batch/index.html.heex | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index 37f84a13ad..0d299befca 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -67,7 +67,7 @@ defmodule ExplorerWeb.Batch.Index do proofs when is_list(proofs) -> Enum.map(proofs, fn proof -> "0x" <> Base.encode16(proof.proof_hash, case: :lower) end) _ -> - [] + :nil end end diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index 7ec59e6102..7bc7b1971e 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -73,12 +73,18 @@ <% end %> Proofs in this batch: <%= if @proof_hashes != :empty do %> -
-

<%= proof %>

+ <%= if @proof_hashes == :nil do %> <.button class="w-fit text-foreground" phx-click="hide_proofs"> - <.icon name="hero-eye-slash" class="size-4" /> Hide Proofs + <.icon name="hero-eye-slash" class="size-4" /> Explorer couldn't fetch proofs for this batch -
+ <% else %> +
+

<%= proof %>

+ <.button class="w-fit text-foreground" phx-click="hide_proofs"> + <.icon name="hero-eye-slash" class="size-4" /> Hide Proofs + +
+ <% end %> <% else %> <.button class="w-fit text-foreground font-semibold" phx-click="show_proofs"> <.icon name="hero-eye" class="size-4" /> Show Proofs From 724cef2bcba5b7386eb2e4ce3da6f6af1ca9dbac Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 15 Jul 2024 15:13:30 -0300 Subject: [PATCH 028/201] fix: border case of updating proofs in db --- explorer/lib/explorer/models/batches.ex | 27 ++++++++++++++++++++----- explorer/lib/explorer/models/proofs.ex | 2 +- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/explorer/lib/explorer/models/batches.ex b/explorer/lib/explorer/models/batches.ex index 1032a64e9f..019fa04c3c 100644 --- a/explorer/lib/explorer/models/batches.ex +++ b/explorer/lib/explorer/models/batches.ex @@ -124,6 +124,7 @@ defmodule Batches do def insert_or_update(batch_changeset, proofs) do merkle_root = batch_changeset.changes.merkle_root + stored_proofs = Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) case Explorer.Repo.get(Batches, merkle_root) do nil -> multi = Ecto.Multi.new() @@ -152,18 +153,34 @@ defmodule Batches do and existing_batch.response_block_number != batch_changeset.changes.response_block_number) # reorg may change response_block_number or (Map.has_key?(batch_changeset.changes, :response_transaction_hash) and existing_batch.response_transaction_hash != batch_changeset.changes.response_transaction_hash) # reorg may change response_tx_hash + or stored_proofs == nil and proofs != %{} # no proofs registered in DB, but some received do "Batch values have changed, updating in DB" |> IO.puts() updated_changeset = Ecto.Changeset.change(existing_batch, batch_changeset.changes) # no changes in proofs table - case Explorer.Repo.update(updated_changeset) do + + multi = Ecto.Multi.new() + |> Ecto.Multi.update(:update_batch, updated_changeset) + |> Ecto.Multi.insert_all(:insert_proofs, Proofs, proofs) + + case Explorer.Repo.transaction(multi) do {:ok, _} -> - "Batch updated successfully" |> IO.puts() + "Batch updated and new proofs inserted successfully" |> IO.puts() {:ok, :empty} - - {:error, changeset} -> - "Batch update failed #{changeset}" |> IO.puts() + {:error, _, changeset, _} -> + "Error: #{inspect(changeset.errors)}" |> IO.puts() {:error, changeset} end + + # case Explorer.Repo.update(updated_changeset) do + # {:ok, _} -> + # "Batch updated successfully" |> IO.puts() + # {:ok, :empty} + + # {:error, changeset} -> + # "Batch update failed #{changeset}" |> IO.puts() + # {:error, changeset} + # end + end rescue error -> diff --git a/explorer/lib/explorer/models/proofs.ex b/explorer/lib/explorer/models/proofs.ex index 54f54b6897..235fe5b37c 100644 --- a/explorer/lib/explorer/models/proofs.ex +++ b/explorer/lib/explorer/models/proofs.ex @@ -21,7 +21,7 @@ defmodule Proofs do def cast_to_proofs(%BatchDB{} = batch) do case batch.proof_hashes do - nil -> nil # TODO or %{} + nil -> %{} proof_hashes -> Enum.map(proof_hashes, fn proof_hash -> %{batch_merkle_root: batch.merkle_root, proof_hash: proof_hash, inserted_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second), updated_at: NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second)} end) From aa6bc3dd6a952962e47d868d53455d8c70495a6b Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 15 Jul 2024 15:59:49 -0300 Subject: [PATCH 029/201] feat: fix update of batches --- explorer/lib/explorer/models/batches.ex | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/explorer/lib/explorer/models/batches.ex b/explorer/lib/explorer/models/batches.ex index 019fa04c3c..6d026a8577 100644 --- a/explorer/lib/explorer/models/batches.ex +++ b/explorer/lib/explorer/models/batches.ex @@ -158,9 +158,10 @@ defmodule Batches do "Batch values have changed, updating in DB" |> IO.puts() updated_changeset = Ecto.Changeset.change(existing_batch, batch_changeset.changes) # no changes in proofs table - multi = Ecto.Multi.new() - |> Ecto.Multi.update(:update_batch, updated_changeset) - |> Ecto.Multi.insert_all(:insert_proofs, Proofs, proofs) + multi = + Ecto.Multi.new() + |> Ecto.Multi.update(:update_batch, updated_changeset) + |> (fn m -> if stored_proofs == nil and proofs != %{}, do: Ecto.Multi.insert_all(m, :insert_proofs, Proofs, proofs), else: m end).() case Explorer.Repo.transaction(multi) do {:ok, _} -> @@ -171,16 +172,6 @@ defmodule Batches do {:error, changeset} end - # case Explorer.Repo.update(updated_changeset) do - # {:ok, _} -> - # "Batch updated successfully" |> IO.puts() - # {:ok, :empty} - - # {:error, changeset} -> - # "Batch update failed #{changeset}" |> IO.puts() - # {:error, changeset} - # end - end rescue error -> From 28fcd6c35f1fdf9d2ec8121a51846bb97bfcfcab Mon Sep 17 00:00:00 2001 From: Uriel Mihura <43704209+uri-99@users.noreply.github.com> Date: Mon, 15 Jul 2024 16:04:13 -0300 Subject: [PATCH 030/201] Update explorer/lib/explorer_web/live/pages/batch/index.html.heex Co-authored-by: Gian <58370608+glpecile@users.noreply.github.com> --- explorer/lib/explorer_web/live/pages/batch/index.html.heex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index 7bc7b1971e..0c55e45996 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -74,9 +74,9 @@ Proofs in this batch: <%= if @proof_hashes != :empty do %> <%= if @proof_hashes == :nil do %> - <.button class="w-fit text-foreground" phx-click="hide_proofs"> - <.icon name="hero-eye-slash" class="size-4" /> Explorer couldn't fetch proofs for this batch - +

+ There are no proofs available for this batch. +

<% else %>

<%= proof %>

From ba2d5cd80705371157bee9c69b5e27b5e6728c13 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 15 Jul 2024 16:08:52 -0300 Subject: [PATCH 031/201] chore: detail on front --- explorer/lib/explorer_web/live/pages/batch/index.html.heex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index 0c55e45996..4c3218b8da 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -74,8 +74,8 @@ Proofs in this batch: <%= if @proof_hashes != :empty do %> <%= if @proof_hashes == :nil do %> -

- There are no proofs available for this batch. +

+ Proofs couldn't be shown for this Batch

<% else %>
From 88eb429ec5c34b8c70b60c2cb8aca3df1c1a6c0f Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 15 Jul 2024 16:54:01 -0300 Subject: [PATCH 032/201] fix: {,} on process_unverified_batches --- explorer/lib/explorer/periodically.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index b5a4403fb6..58873003ed 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -93,7 +93,7 @@ defmodule Explorer.Periodically do Enum.map( array_of_changest_tuples, - fn [batch_changeset, proofs] -> + fn {batch_changeset, proofs} -> Batches.insert_or_update(batch_changeset, proofs) end) end From f90fc305c56e2c9c80007c78fce8a8c4b7b1e251 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 15 Jul 2024 17:20:09 -0300 Subject: [PATCH 033/201] chore: remove commented code --- explorer/lib/explorer/models/proofs.ex | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/explorer/lib/explorer/models/proofs.ex b/explorer/lib/explorer/models/proofs.ex index 235fe5b37c..c73467b49e 100644 --- a/explorer/lib/explorer/models/proofs.ex +++ b/explorer/lib/explorer/models/proofs.ex @@ -43,16 +43,4 @@ defmodule Proofs do end end - # for when we implement the proof search bar - # def get_proof(%{proof_hash: proof_hash}) do - # query = from(p in Proofs, - # where: p.proof_hash == ^proof_hash, - # select: p) - - # case Explorer.Repo.all(query) do - # nil -> nil - # result -> [result, result |> Enum.count()] - # end - # end - end From f3b0db912028cb604fe984d486b9a940d41e2841 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 15 Jul 2024 17:21:26 -0300 Subject: [PATCH 034/201] chore: delete comment --- explorer/lib/explorer/periodically.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index 58873003ed..8335338931 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -65,7 +65,7 @@ defmodule Explorer.Periodically do |> Utils.extract_info_from_data_pointer |> Batches.generate_changesets - Batches.insert_or_update(batch_changeset, proofs) #handles it atomically + Batches.insert_or_update(batch_changeset, proofs) |> case do {:ok, _} -> IO.puts("Broadcasting update_views") From 62e0c077744177053e32025711890582207c607e Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Wed, 17 Jul 2024 15:33:19 -0300 Subject: [PATCH 035/201] fix: merge error --- explorer/lib/explorer/periodically.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index 1a37d5104e..f143c1c668 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -85,7 +85,7 @@ defmodule Explorer.Periodically do "verifying previous unverified batches..." |> IO.inspect() unverified_batches = Batches.get_unverified_batches() - array_of_changeset_tuples = + array_of_changest_tuples = unverified_batches |> Enum.map(&AlignedLayerServiceManager.extract_batch_response/1) |> Enum.reject(&is_nil/1) From 1d0a95c4b11d920e0464bc34ebf8de087f3fb57a Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Wed, 17 Jul 2024 18:26:45 -0300 Subject: [PATCH 036/201] feat: add usd prices --- explorer/lib/explorer/periodically.ex | 80 +++++++++-------- .../lib/explorer_web/live/eth_converter.ex | 86 +++++++++++++++++++ .../explorer_web/live/pages/batch/index.ex | 36 +++++--- .../live/pages/batch/index.html.heex | 5 +- explorer/lib/explorer_web/live/utils.ex | 21 ----- explorer/mix.exs | 1 + explorer/mix.lock | 7 ++ 7 files changed, 168 insertions(+), 68 deletions(-) create mode 100644 explorer/lib/explorer_web/live/eth_converter.ex diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index f143c1c668..23869a9ffb 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -12,36 +12,38 @@ defmodule Explorer.Periodically do end def send_work() do - seconds = 12 # once per block - :timer.send_interval(seconds * 1000, :work) # send every n seconds + # once per block + seconds = 12 + # send every n seconds + :timer.send_interval(seconds * 1000, :work) end def handle_info(:work, count) do # Reads and process last n blocks for new batches or batch changes - read_block_qty = 8 # rollback to 800 if needed - latest_block_number = AlignedLayerServiceManager.get_latest_block_number() - read_from_block = max(0, latest_block_number - read_block_qty) + read_block_qty = 8 + 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) # 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) - # end + 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) + # end {:noreply, new_count} end def process_blocks_from_to(fromBlock, toBlock) do "Processing from block #{fromBlock} to block #{toBlock}..." |> IO.inspect() + try do AlignedLayerServiceManager.get_new_batch_events(%{fromBlock: fromBlock, toBlock: toBlock}) - |> Enum.map(&AlignedLayerServiceManager.extract_batch_response/1) - # This function will avoid processing a batch taken by another process - |> Enum.map(&process_batch_if_not_in_other_process/1) - + |> Enum.map(&AlignedLayerServiceManager.extract_batch_response/1) + # This function will avoid processing a batch taken by another process + |> Enum.map(&process_batch_if_not_in_other_process/1) rescue error -> IO.puts("An error occurred during batch processing:\n#{inspect(error)}") end @@ -55,28 +57,38 @@ defmodule Explorer.Periodically do # one lock for each batch case Mutex.lock(BatchMutex, {batch.merkle_root}) do {:error, :busy} -> - "Batch already being processed: #{batch.merkle_root}" |> IO.inspect + "Batch already being processed: #{batch.merkle_root}" |> IO.inspect() nil {:ok, lock} -> - "Processing batch: #{batch.merkle_root}" |> IO.inspect + "Processing batch: #{batch.merkle_root}" |> IO.inspect() + {batch_changeset, proofs} = batch - |> Utils.extract_info_from_data_pointer - |> Batches.generate_changesets + |> Utils.extract_info_from_data_pointer() + |> Batches.generate_changesets() Batches.insert_or_update(batch_changeset, proofs) - |> case do - {:ok, _} -> - IO.puts("Broadcasting update_views") - PubSub.broadcast(Explorer.PubSub, "update_views", %{}) - {:error, error} -> - IO.puts("Some error in DB operation, not broadcasting update_views") - IO.inspect(error) - nil -> nil #no changes in DB - end - - "Done processing batch: #{batch.merkle_root}" |> IO.inspect + |> case do + {:ok, _} -> + PubSub.broadcast(Explorer.PubSub, "update_views", %{ + eth_usd: + case EthConverter.get_eth_price_usd() do + {:ok, eth_usd_price} -> eth_usd_price + {:error, error} -> :empty + end + }) + + {:error, error} -> + IO.puts("Some error in DB operation, not broadcasting update_views") + IO.inspect(error) + + # no changes in DB + nil -> + nil + end + + "Done processing batch: #{batch.merkle_root}" |> IO.inspect() Mutex.release(BatchMutex, lock) end end @@ -87,15 +99,15 @@ defmodule Explorer.Periodically do array_of_changest_tuples = unverified_batches - |> Enum.map(&AlignedLayerServiceManager.extract_batch_response/1) - |> Enum.reject(&is_nil/1) - |> Enum.map(&Batches.generate_changesets/1) + |> Enum.map(&AlignedLayerServiceManager.extract_batch_response/1) + |> Enum.reject(&is_nil/1) + |> Enum.map(&Batches.generate_changesets/1) Enum.map( array_of_changest_tuples, fn {batch_changeset, proofs} -> Batches.insert_or_update(batch_changeset, proofs) - end) + end + ) end - end diff --git a/explorer/lib/explorer_web/live/eth_converter.ex b/explorer/lib/explorer_web/live/eth_converter.ex new file mode 100644 index 0000000000..967ac4c116 --- /dev/null +++ b/explorer/lib/explorer_web/live/eth_converter.ex @@ -0,0 +1,86 @@ +defmodule EthConverter do + use HTTPoison.Base + + @wei_per_eth 1_000_000_000_000_000_000 + + def wei_to_eth(wei, decimal_places \\ 18) + + def wei_to_eth(wei, decimal_places) when is_integer(wei) do + wei + |> Decimal.new() + |> Decimal.div(Decimal.new(@wei_per_eth)) + |> Decimal.round(decimal_places) + |> Decimal.to_string(:normal) + end + + def wei_to_eth(wei, decimal_places) when is_binary(wei) do + wei + |> String.to_integer() + |> wei_to_eth(decimal_places) + end + + def wei_to_usd(wei, decimal_places \\ 2) do + with eth_amount <- wei_to_eth(wei, 18), + {:ok, eth_price} <- get_eth_price_usd() do + usd_value = Decimal.mult(Decimal.new(eth_amount), Decimal.new(eth_price)) + {:ok, Decimal.round(usd_value, decimal_places) |> Decimal.to_string(:normal)} + else + {:error, reason} -> {:error, reason} + _ -> {:error, "Failed to convert wei to USD"} + end + end + + def multiply_eth_by_usd(eth, usd_price) do + eth_float = String.to_float(eth) + usd_float = to_float(usd_price) + + result = eth_float * usd_float + + :erlang.float_to_binary(result, decimals: 2) + end + + defp to_float(value) when is_binary(value), do: String.to_float(value) + defp to_float(value) when is_float(value), do: value + defp to_float(value) when is_integer(value), do: value / 1 + + def wei_to_eth_decimal(wei) when is_integer(wei) do + wei_to_eth_decimal(Integer.to_string(wei)) + end + + def wei_to_eth_decimal(wei) when is_binary(wei) do + {:ok, Decimal.div(Decimal.new(wei), Decimal.new(@wei_per_eth))} + end + + @base_url "https://api.coingecko.com/api/v3" + + def get_eth_price_usd do + case get("/simple/price?ids=ethereum&vs_currencies=usd") do + {:ok, %HTTPoison.Response{status_code: 200, body: body}} -> + parse_response(body) + + {:ok, %HTTPoison.Response{status_code: status_code}} -> + {:error, "Request failed with status code: #{status_code}"} + + {:error, %HTTPoison.Error{reason: reason}} -> + {:error, "HTTP request failed: #{reason}"} + end + end + + def parse_response(body) do + case Jason.decode(body) do + {:ok, %{"ethereum" => %{"usd" => price}}} -> + {:ok, price} + + _ -> + {:error, "Failed to parse response"} + end + end + + def process_url(url) do + @base_url <> url + end + + def process_response_body(body) do + body + end +end diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index 0d299befca..538c4b12c8 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -22,7 +22,8 @@ defmodule ExplorerWeb.Batch.Index do proof_hashes: :empty, network: System.get_env("ENVIRONMENT"), site_url: System.get_env("PHX_HOST"), - page_title: Utils.shorten_hash(merkle_root) + page_title: Utils.shorten_hash(merkle_root), + eth_usd_price: :empty ) } rescue @@ -35,21 +36,31 @@ defmodule ExplorerWeb.Batch.Index do newBatchInfo: :empty, batchWasResponded: :empty, proof_hashes: :empty, - proofs: :empty + proofs: :empty, + eth_usd_price: :empty )} end @impl true - def handle_info(_, socket) do - IO.puts("Received batch update for #{socket.assigns.merkle_root} from PubSub") + def handle_info(%{eth_usd: eth_usd_price} = _params, socket) do + eth_price = EthConverter.wei_to_eth(socket.assigns.current_batch.cost_per_proof) - { - :noreply, - assign( - socket, - current_batch: Batches.get_batch(%{merkle_root: socket.assigns.merkle_root}) - ) - } + updated_socket = + socket + |> assign(current_batch: Batches.get_batch(%{merkle_root: socket.assigns.merkle_root})) + |> then(fn updated_socket -> + case eth_usd_price do + :empty -> + updated_socket + + _ -> + assign(updated_socket, + eth_usd_price: EthConverter.multiply_eth_by_usd(eth_price, eth_usd_price) + ) + end + end) + + {:noreply, updated_socket} end @impl true @@ -66,8 +77,9 @@ defmodule ExplorerWeb.Batch.Index do case Proofs.get_proofs_from_batch(%{merkle_root: merkle_root}) do proofs when is_list(proofs) -> Enum.map(proofs, fn proof -> "0x" <> Base.encode16(proof.proof_hash, case: :lower) end) + _ -> - :nil + nil end end diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index f33c3ff4c9..4569d23b7e 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -14,7 +14,10 @@ <%= if @current_batch.cost_per_proof != nil do %> Cost per Proof:

- <%= @current_batch.cost_per_proof |> Utils.wei_to_eth() %> ETH + <%= @current_batch.cost_per_proof |> EthConverter.wei_to_eth() %> ETH + <%= if @eth_usd_price != :empty do %> + (<%= @eth_usd_price %> USD) + <% end %>

<% end %> Submission Block Number: diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex index 4d975c22c7..79682eb586 100644 --- a/explorer/lib/explorer_web/live/utils.ex +++ b/explorer/lib/explorer_web/live/utils.ex @@ -96,24 +96,6 @@ defmodule ExplorerWeb.Utils do defp pad_leading_zero(value) do Integer.to_string(value) |> String.pad_leading(2, "0") end - - @wei_per_eth 1_000_000_000_000_000_000 - - def wei_to_eth(wei, decimal_places \\ 18) - - def wei_to_eth(wei, decimal_places) when is_integer(wei) do - wei - |> Decimal.new() - |> Decimal.div(Decimal.new(@wei_per_eth)) - |> Decimal.round(decimal_places) - |> Decimal.to_string(:normal) - end - - def wei_to_eth(wei, decimal_places) when is_binary(wei) do - wei - |> String.to_integer() - |> wei_to_eth(decimal_places) - end end defmodule Utils do @@ -147,9 +129,6 @@ defmodule Utils do batch_json |> Enum.map(fn proof -> :crypto.hash(:sha3_256, proof["proof"]) - # TODO removed this because i want to store as bytea, not a string. - # |> Base.encode16(case: :lower) - # |> (&("0x" <> &1)).() end) end diff --git a/explorer/mix.exs b/explorer/mix.exs index 4db088e59f..96d41a8041 100644 --- a/explorer/mix.exs +++ b/explorer/mix.exs @@ -51,6 +51,7 @@ defmodule Explorer.MixProject do {:telemetry_metrics, "~> 1.0"}, {:telemetry_poller, "~> 1.0"}, {:gettext, "~> 0.20"}, + {:httpoison, "~> 2.0"}, {:jason, "~> 1.2"}, {:dns_cluster, "~> 0.1.1"}, {:bandit, "~> 1.2"}, diff --git a/explorer/mix.lock b/explorer/mix.lock index f821ec4f0c..76a80416f8 100644 --- a/explorer/mix.lock +++ b/explorer/mix.lock @@ -1,6 +1,7 @@ %{ "bandit": {:hex, :bandit, "1.5.0", "3bc864a0da7f013ad3713a7f550c6a6ec0e19b8d8715ec678256a0dc197d5539", [:mix], [{:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "92d18d9a7228a597e0d4661ef69a874ea82d63ff49c7d801a5c68cb18ebbbd72"}, "castore": {:hex, :castore, "1.0.7", "b651241514e5f6956028147fe6637f7ac13802537e895a724f90bf3e36ddd1dd", [:mix], [], "hexpm", "da7785a4b0d2a021cd1292a60875a784b6caef71e76bf4917bdee1f390455cf5"}, + "certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"}, "db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, "dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"}, @@ -17,15 +18,20 @@ "finch": {:hex, :finch, "0.18.0", "944ac7d34d0bd2ac8998f79f7a811b21d87d911e77a786bc5810adb75632ada4", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "69f5045b042e531e53edc2574f15e25e735b522c37e2ddb766e15b979e03aa65"}, "floki": {:hex, :floki, "0.36.1", "712b7f2ba19a4d5a47dfe3e74d81876c95bbcbee44fe551f0af3d2a388abb3da", [:mix], [], "hexpm", "21ba57abb8204bcc70c439b423fc0dd9f0286de67dc82773a14b0200ada0995f"}, "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"]}, "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, + "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"}, "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, + "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, + "mimerl": {:hex, :mimerl, "1.3.0", "d0cd9fc04b9061f82490f6581e0128379830e78535e017f7780f37fea7545726", [:rebar3], [], "hexpm", "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"}, "mint": {:hex, :mint, "1.6.0", "88a4f91cd690508a04ff1c3e28952f322528934be541844d54e0ceb765f01d5e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "3c5ae85d90a5aca0a49c0d8b67360bbe407f3b54f1030a111047ff988e8fefaa"}, "mutex": {:hex, :mutex, "2.0.0", "141b612ed58ed506927133ec5db9606f3dc7210a9b10601ab78f42df9f4f0407", [:mix], [], "hexpm", "5d066430954dfedfb9cce0c965a307d70c543a8df972ede905e155ee2f1c7050"}, "nimble_options": {:hex, :nimble_options, "1.1.0", "3b31a57ede9cb1502071fade751ab0c7b8dbe75a9a4c2b5bbb0943a690b63172", [:mix], [], "hexpm", "8bbbb3941af3ca9acc7835f5655ea062111c9c27bcac53e004460dfd19008a99"}, "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, + "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, "phoenix": {:hex, :phoenix, "1.7.12", "1cc589e0eab99f593a8aa38ec45f15d25297dd6187ee801c8de8947090b5a9d3", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "d646192fbade9f485b01bc9920c139bfdd19d0f8df3d73fd8eaf2dfbe0d2837c"}, "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"}, "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.3", "7ff51c9b6609470f681fbea20578dede0e548302b0c8bdf338b5a753a4f045bf", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "f9470a0a8bae4f56430a23d42f977b5a6205fdba6559d76f932b876bfaec652d"}, @@ -38,6 +44,7 @@ "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, "postgrex": {:hex, :postgrex, "0.18.0", "f34664101eaca11ff24481ed4c378492fed2ff416cd9b06c399e90f321867d7e", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "a042989ba1bc1cca7383ebb9e461398e3f89f868c92ce6671feb7ef132a252d1"}, "rustler_precompiled": {:hex, :rustler_precompiled, "0.7.1", "ecadf02cc59a0eccbaed6c1937303a5827fbcf60010c541595e6d3747d3d0f9f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "b9e4657b99a1483ea31502e1d58c464bedebe9028808eda45c3a429af4550c66"}, + "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "swoosh": {:hex, :swoosh, "1.16.4", "d407768b3b68e3d1ff8d43b575a20c13bea338647143e241a324894cdb5af0b2", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.1.0", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.4 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a38798368c09b09d7108803c42f24bb051d3e87bc1b81e6f09b20bf5a31c6676"}, "tailwind": {:hex, :tailwind, "0.2.2", "9e27288b568ede1d88517e8c61259bc214a12d7eed271e102db4c93fcca9b2cd", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "ccfb5025179ea307f7f899d1bb3905cd0ac9f687ed77feebc8f67bdca78565c4"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, From 1419198d272dd715e19d47995c33805b24f006e8 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Wed, 17 Jul 2024 18:55:26 -0300 Subject: [PATCH 037/201] build(deps): bump with mix deps.update --all --- explorer/mix.lock | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/explorer/mix.lock b/explorer/mix.lock index 76a80416f8..d919aeb9ac 100644 --- a/explorer/mix.lock +++ b/explorer/mix.lock @@ -1,52 +1,52 @@ %{ - "bandit": {:hex, :bandit, "1.5.0", "3bc864a0da7f013ad3713a7f550c6a6ec0e19b8d8715ec678256a0dc197d5539", [:mix], [{:hpax, "~> 0.1.1", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "92d18d9a7228a597e0d4661ef69a874ea82d63ff49c7d801a5c68cb18ebbbd72"}, - "castore": {:hex, :castore, "1.0.7", "b651241514e5f6956028147fe6637f7ac13802537e895a724f90bf3e36ddd1dd", [:mix], [], "hexpm", "da7785a4b0d2a021cd1292a60875a784b6caef71e76bf4917bdee1f390455cf5"}, + "bandit": {:hex, :bandit, "1.5.5", "df28f1c41f745401fe9e85a6882033f5f3442ab6d30c8a2948554062a4ab56e0", [:mix], [{:hpax, "~> 0.2.0", [hex: :hpax, repo: "hexpm", optional: false]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:thousand_island, "~> 1.0", [hex: :thousand_island, repo: "hexpm", optional: false]}, {:websock, "~> 0.5", [hex: :websock, repo: "hexpm", optional: false]}], "hexpm", "f21579a29ea4bc08440343b2b5f16f7cddf2fea5725d31b72cf973ec729079e1"}, + "castore": {:hex, :castore, "1.0.8", "dedcf20ea746694647f883590b82d9e96014057aff1d44d03ec90f36a5c0dc6e", [:mix], [], "hexpm", "0b2b66d2ee742cb1d9cb8c8be3b43c3a70ee8651f37b75a8b982e036752983f1"}, "certifi": {:hex, :certifi, "2.12.0", "2d1cca2ec95f59643862af91f001478c9863c2ac9cb6e2f89780bfd8de987329", [:rebar3], [], "hexpm", "ee68d85df22e554040cdb4be100f33873ac6051387baf6a8f6ce82272340ff1c"}, - "db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"}, + "db_connection": {:hex, :db_connection, "2.7.0", "b99faa9291bb09892c7da373bb82cba59aefa9b36300f6145c5f201c7adf48ec", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "dcf08f31b2701f857dfc787fbad78223d61a32204f217f15e881dd93e4bdd3ff"}, "decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"}, "dns_cluster": {:hex, :dns_cluster, "0.1.3", "0bc20a2c88ed6cc494f2964075c359f8c2d00e1bf25518a6a6c7fd277c9b0c66", [:mix], [], "hexpm", "46cb7c4a1b3e52c7ad4cbe33ca5079fbde4840dedeafca2baf77996c2da1bc33"}, "ecto": {:hex, :ecto, "3.11.2", "e1d26be989db350a633667c5cda9c3d115ae779b66da567c68c80cfb26a8c9ee", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3c38bca2c6f8d8023f2145326cc8a80100c3ffe4dcbd9842ff867f7fc6156c65"}, - "ecto_sql": {:hex, :ecto_sql, "3.11.2", "c7cc7f812af571e50b80294dc2e535821b3b795ce8008d07aa5f336591a185a8", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "73c07f995ac17dbf89d3cfaaf688fcefabcd18b7b004ac63b0dc4ef39499ed6b"}, + "ecto_sql": {:hex, :ecto_sql, "3.11.3", "4eb7348ff8101fbc4e6bbc5a4404a24fecbe73a3372d16569526b0cf34ebc195", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "e5f36e3d736b99c7fee3e631333b8394ade4bafe9d96d35669fca2d81c2be928"}, "esbuild": {:hex, :esbuild, "0.8.1", "0cbf919f0eccb136d2eeef0df49c4acf55336de864e63594adcea3814f3edf41", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "25fc876a67c13cb0a776e7b5d7974851556baeda2085296c14ab48555ea7560f"}, "ethereumex": {:hex, :ethereumex, "0.10.6", "6d75cac39b5b7a720b064fe48563f205d3d9784e5bde25f983dd07cf306c2a6d", [:make, :mix], [{:finch, "~> 0.16", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "58cf926239dabf8bd1fc6cf50a37b926274240b7f58ba5b235a20b5500a9a7e1"}, - "ethers": {:hex, :ethers, "0.4.4", "697693ba6b99d4dcff9db5e51c4b0efc29b5c8ed2a6844f8b2412e8f3fd8ba60", [:mix], [{:ethereumex, "~> 0.10.6", [hex: :ethereumex, repo: "hexpm", optional: false]}, {:ex_abi, "~> 0.7.0", [hex: :ex_abi, repo: "hexpm", optional: false]}, {:ex_rlp, "~> 0.6.0", [hex: :ex_rlp, repo: "hexpm", optional: false]}, {:ex_secp256k1, "~> 0.7.2", [hex: :ex_secp256k1, repo: "hexpm", optional: true]}, {:idna, "~> 6.1", [hex: :idna, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "3d2b8ccf89b39925738e4576218940dd7a642b2614ffa406904e1c1001ca5c04"}, - "ex_abi": {:hex, :ex_abi, "0.7.2", "9950d8aa764c74b8c89cc279c72ac786675aca315c08bc06b4a387407fe67873", [:mix], [{:ex_keccak, "~> 0.7.5", [hex: :ex_keccak, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "1ca991d6eb497959aab4b3aaeb7d0f71b67d4b617d5689113da82d6e4cedc408"}, + "ethers": {:hex, :ethers, "0.4.5", "5af10678317ff183617072fc5970ee25d7145846e600db769f2e7a53641e6131", [:mix], [{:ethereumex, "~> 0.10.6", [hex: :ethereumex, repo: "hexpm", optional: false]}, {:ex_abi, "~> 0.7.0", [hex: :ex_abi, repo: "hexpm", optional: false]}, {:ex_rlp, "~> 0.6.0", [hex: :ex_rlp, repo: "hexpm", optional: false]}, {:ex_secp256k1, "~> 0.7.2", [hex: :ex_secp256k1, repo: "hexpm", optional: true]}, {:idna, "~> 6.1", [hex: :idna, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "885de526ae5a37bb0cefc882caac2e3b5dd06eff35a9fee43a58523556dda009"}, + "ex_abi": {:hex, :ex_abi, "0.7.3", "5c30551af740d11a10817cb253a7b1d0315f9c02f7bc95f7434885bcff5d9dc5", [:mix], [{:ex_keccak, "~> 0.7.5", [hex: :ex_keccak, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "756e3d2211053ca7e4217eae4193c588f3a310066b86171f03131e2400827bae"}, "ex_keccak": {:hex, :ex_keccak, "0.7.5", "f3b733173510d48ae9a1ea1de415e694b2651f35c787e63f33b5ed0013fbfd35", [:mix], [{:rustler, ">= 0.0.0", [hex: :rustler, repo: "hexpm", optional: true]}, {:rustler_precompiled, "~> 0.7", [hex: :rustler_precompiled, repo: "hexpm", optional: false]}], "hexpm", "8a5e1cb7f96fff5e480ff6a121477b90c4fd8c150984086dffd98819f5d83763"}, "ex_rlp": {:hex, :ex_rlp, "0.6.0", "985391d2356a7cb8712a4a9a2deb93f19f2fbca0323f5c1203fcaf64d077e31e", [:mix], [], "hexpm", "7135db93b861d9e76821039b60b00a6a22d2c4e751bf8c444bffe7a042f1abaf"}, "expo": {:hex, :expo, "0.5.2", "beba786aab8e3c5431813d7a44b828e7b922bfa431d6bfbada0904535342efe2", [:mix], [], "hexpm", "8c9bfa06ca017c9cb4020fabe980bc7fdb1aaec059fd004c2ab3bff03b1c599c"}, "file_system": {:hex, :file_system, "1.0.0", "b689cc7dcee665f774de94b5a832e578bd7963c8e637ef940cd44327db7de2cd", [:mix], [], "hexpm", "6752092d66aec5a10e662aefeed8ddb9531d79db0bc145bb8c40325ca1d8536d"}, "finch": {:hex, :finch, "0.18.0", "944ac7d34d0bd2ac8998f79f7a811b21d87d911e77a786bc5810adb75632ada4", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.3", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2.6 or ~> 1.0", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "69f5045b042e531e53edc2574f15e25e735b522c37e2ddb766e15b979e03aa65"}, - "floki": {:hex, :floki, "0.36.1", "712b7f2ba19a4d5a47dfe3e74d81876c95bbcbee44fe551f0af3d2a388abb3da", [:mix], [], "hexpm", "21ba57abb8204bcc70c439b423fc0dd9f0286de67dc82773a14b0200ada0995f"}, + "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"]}, - "hpax": {:hex, :hpax, "0.1.2", "09a75600d9d8bbd064cdd741f21fc06fc1f4cf3d0fcc335e5aa19be1a7235c84", [:mix], [], "hexpm", "2c87843d5a23f5f16748ebe77969880e29809580efdaccd615cd3bed628a8c13"}, + "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"}, - "jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"}, + "jason": {:hex, :jason, "1.4.3", "d3f984eeb96fe53b85d20e0b049f03e57d075b5acda3ac8d465c969a2536c17b", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "9a90e868927f7c777689baa16d86f4d0e086d968db5c05d917ccff6d443e58a3"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "2.0.5", "dc34c8efd439abe6ae0343edbb8556f4d63f178594894720607772a041b04b02", [:mix], [], "hexpm", "da0d64a365c45bc9935cc5c8a7fc5e49a0e0f9932a761c55d6c52b142780a05c"}, + "mime": {:hex, :mime, "2.0.6", "8f18486773d9b15f95f4f4f1e39b710045fa1de891fada4516559967276e4dc2", [:mix], [], "hexpm", "c9945363a6b26d747389aac3643f8e0e09d30499a138ad64fe8fd1d13d9b153e"}, "mimerl": {:hex, :mimerl, "1.3.0", "d0cd9fc04b9061f82490f6581e0128379830e78535e017f7780f37fea7545726", [:rebar3], [], "hexpm", "a1e15a50d1887217de95f0b9b0793e32853f7c258a5cd227650889b38839fe9d"}, - "mint": {:hex, :mint, "1.6.0", "88a4f91cd690508a04ff1c3e28952f322528934be541844d54e0ceb765f01d5e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "3c5ae85d90a5aca0a49c0d8b67360bbe407f3b54f1030a111047ff988e8fefaa"}, + "mint": {:hex, :mint, "1.6.2", "af6d97a4051eee4f05b5500671d47c3a67dac7386045d87a904126fd4bbcea2e", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "5ee441dffc1892f1ae59127f74afe8fd82fda6587794278d924e4d90ea3d63f9"}, "mutex": {:hex, :mutex, "2.0.0", "141b612ed58ed506927133ec5db9606f3dc7210a9b10601ab78f42df9f4f0407", [:mix], [], "hexpm", "5d066430954dfedfb9cce0c965a307d70c543a8df972ede905e155ee2f1c7050"}, - "nimble_options": {:hex, :nimble_options, "1.1.0", "3b31a57ede9cb1502071fade751ab0c7b8dbe75a9a4c2b5bbb0943a690b63172", [:mix], [], "hexpm", "8bbbb3941af3ca9acc7835f5655ea062111c9c27bcac53e004460dfd19008a99"}, + "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, "parse_trans": {:hex, :parse_trans, "3.4.1", "6e6aa8167cb44cc8f39441d05193be6e6f4e7c2946cb2759f015f8c56b76e5ff", [:rebar3], [], "hexpm", "620a406ce75dada827b82e453c19cf06776be266f5a67cff34e1ef2cbb60e49a"}, - "phoenix": {:hex, :phoenix, "1.7.12", "1cc589e0eab99f593a8aa38ec45f15d25297dd6187ee801c8de8947090b5a9d3", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "d646192fbade9f485b01bc9920c139bfdd19d0f8df3d73fd8eaf2dfbe0d2837c"}, + "phoenix": {:hex, :phoenix, "1.7.14", "a7d0b3f1bc95987044ddada111e77bd7f75646a08518942c72a8440278ae7825", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.14", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 2.7", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:websock_adapter, "~> 0.5.3", [hex: :websock_adapter, repo: "hexpm", optional: false]}], "hexpm", "c7859bc56cc5dfef19ecfc240775dae358cbaa530231118a9e014df392ace61a"}, "phoenix_html": {:hex, :phoenix_html, "4.1.1", "4c064fd3873d12ebb1388425a8f2a19348cef56e7289e1998e2d2fa758aa982e", [:mix], [], "hexpm", "f2f2df5a72bc9a2f510b21497fd7d2b86d932ec0598f0210fed4114adc546c6f"}, "phoenix_live_dashboard": {:hex, :phoenix_live_dashboard, "0.8.3", "7ff51c9b6609470f681fbea20578dede0e548302b0c8bdf338b5a753a4f045bf", [:mix], [{:ecto, "~> 3.6.2 or ~> 3.7", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_mysql_extras, "~> 0.5", [hex: :ecto_mysql_extras, repo: "hexpm", optional: true]}, {:ecto_psql_extras, "~> 0.7", [hex: :ecto_psql_extras, repo: "hexpm", optional: true]}, {:ecto_sqlite3_extras, "~> 1.1.7 or ~> 1.2.0", [hex: :ecto_sqlite3_extras, repo: "hexpm", optional: true]}, {:mime, "~> 1.6 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:phoenix_live_view, "~> 0.19 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 0.6 or ~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "f9470a0a8bae4f56430a23d42f977b5a6205fdba6559d76f932b876bfaec652d"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.5.3", "f2161c207fda0e4fb55165f650f7f8db23f02b29e3bff00ff7ef161d6ac1f09d", [:mix], [{:file_system, "~> 0.3 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "b4ec9cd73cb01ff1bd1cac92e045d13e7030330b74164297d1aee3907b54803c"}, - "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.14", "70fa101aa0539e81bed4238777498f6215e9dda3461bdaa067cad6908110c364", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "82f6d006c5264f979ed5eb75593d808bbe39020f20df2e78426f4f2d570e2402"}, + "phoenix_live_view": {:hex, :phoenix_live_view, "0.20.17", "f396bbdaf4ba227b82251eb75ac0afa6b3da5e509bc0d030206374237dfc9450", [:mix], [{:floki, "~> 0.36", [hex: :floki, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix, "~> 1.6.15 or ~> 1.7.0", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 3.3 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:phoenix_template, "~> 1.0", [hex: :phoenix_template, repo: "hexpm", optional: false]}, {:phoenix_view, "~> 2.0", [hex: :phoenix_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.15", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a61d741ffb78c85fdbca0de084da6a48f8ceb5261a79165b5a0b59e5f65ce98b"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.1.3", "3168d78ba41835aecad272d5e8cd51aa87a7ac9eb836eabc42f6e57538e3731d", [:mix], [], "hexpm", "bba06bc1dcfd8cb086759f0edc94a8ba2bc8896d5331a1e2c2902bf8e36ee502"}, "phoenix_template": {:hex, :phoenix_template, "1.0.4", "e2092c132f3b5e5b2d49c96695342eb36d0ed514c5b252a77048d5969330d639", [:mix], [{:phoenix_html, "~> 2.14.2 or ~> 3.0 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}], "hexpm", "2c0c81f0e5c6753faf5cca2f229c9709919aba34fab866d3bc05060c9c444206"}, - "plug": {:hex, :plug, "1.15.3", "712976f504418f6dff0a3e554c40d705a9bcf89a7ccef92fc6a5ef8f16a30a97", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "cc4365a3c010a56af402e0809208873d113e9c38c401cabd88027ef4f5c01fd2"}, - "plug_crypto": {:hex, :plug_crypto, "2.0.0", "77515cc10af06645abbfb5e6ad7a3e9714f805ae118fa1a70205f80d2d70fe73", [:mix], [], "hexpm", "53695bae57cc4e54566d993eb01074e4d894b65a3766f1c43e2c61a1b0f45ea9"}, + "plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"}, + "plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"}, "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"}, "postgrex": {:hex, :postgrex, "0.18.0", "f34664101eaca11ff24481ed4c378492fed2ff416cd9b06c399e90f321867d7e", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "a042989ba1bc1cca7383ebb9e461398e3f89f868c92ce6671feb7ef132a252d1"}, - "rustler_precompiled": {:hex, :rustler_precompiled, "0.7.1", "ecadf02cc59a0eccbaed6c1937303a5827fbcf60010c541595e6d3747d3d0f9f", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "b9e4657b99a1483ea31502e1d58c464bedebe9028808eda45c3a429af4550c66"}, + "rustler_precompiled": {:hex, :rustler_precompiled, "0.7.2", "097f657e401f02e7bc1cab808cfc6abdc1f7b9dc5e5adee46bf2fd8fdcce9ecf", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "7663faaeadc9e93e605164dcf9e69168e35f2f8b7f2b9eb4e400d1a8e0fe2999"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "swoosh": {:hex, :swoosh, "1.16.4", "d407768b3b68e3d1ff8d43b575a20c13bea338647143e241a324894cdb5af0b2", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.1.0", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.4 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a38798368c09b09d7108803c42f24bb051d3e87bc1b81e6f09b20bf5a31c6676"}, - "tailwind": {:hex, :tailwind, "0.2.2", "9e27288b568ede1d88517e8c61259bc214a12d7eed271e102db4c93fcca9b2cd", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "ccfb5025179ea307f7f899d1bb3905cd0ac9f687ed77feebc8f67bdca78565c4"}, + "tailwind": {:hex, :tailwind, "0.2.3", "277f08145d407de49650d0a4685dc062174bdd1ae7731c5f1da86163a24dfcdb", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "8e45e7a34a676a7747d04f7913a96c770c85e6be810a1d7f91e713d3a3655b5d"}, "telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"}, "telemetry_metrics": {:hex, :telemetry_metrics, "1.0.0", "29f5f84991ca98b8eb02fc208b2e6de7c95f8bb2294ef244a176675adc7775df", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f23713b3847286a534e005126d4c959ebcca68ae9582118ce436b521d1d47d5d"}, "telemetry_poller": {:hex, :telemetry_poller, "1.1.0", "58fa7c216257291caaf8d05678c8d01bd45f4bdbc1286838a28c4bb62ef32999", [:rebar3], [{:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9eb9d9cbfd81cbd7cdd24682f8711b6e2b691289a0de6826e58452f28c103c8f"}, From 0f9f6e8a0e3c0d337751cf8fdbf3461c8f8a2cd9 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Wed, 17 Jul 2024 18:57:47 -0300 Subject: [PATCH 038/201] fix: add missing _ to variable --- explorer/lib/explorer/periodically.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index 23869a9ffb..e36bccfd33 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -75,7 +75,7 @@ defmodule Explorer.Periodically do eth_usd: case EthConverter.get_eth_price_usd() do {:ok, eth_usd_price} -> eth_usd_price - {:error, error} -> :empty + {:error, _error} -> :empty end }) From 90f312a775cb4db4addd21bcbfae64ecd772a92f Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Thu, 18 Jul 2024 17:32:55 -0300 Subject: [PATCH 039/201] Update explorer/lib/explorer_web/live/utils.ex --- explorer/lib/explorer_web/live/utils.ex | 3 --- 1 file changed, 3 deletions(-) diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex index 4c606fc069..3ea55f225f 100644 --- a/explorer/lib/explorer_web/live/utils.ex +++ b/explorer/lib/explorer_web/live/utils.ex @@ -129,9 +129,6 @@ defmodule Utils do |> Enum.map( fn proof -> :crypto.hash(:sha3_256, proof["proof"]) - # TODO removed this because i want to store as bytea, not a string. - # |> Base.encode16(case: :lower) - # |> (&("0x" <> &1)).() end) end From 5d6eb5a01afb8a74a1caba2b0e349b8fb14c491d Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:07:57 -0300 Subject: [PATCH 040/201] refactor: move count operators to avs_directory instead of index --- explorer/lib/explorer/avs_directory.ex | 50 ++++++++++++++----- .../lib/explorer_web/live/pages/home/index.ex | 24 +-------- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/explorer/lib/explorer/avs_directory.ex b/explorer/lib/explorer/avs_directory.ex index 075a099f42..d31759099d 100644 --- a/explorer/lib/explorer/avs_directory.ex +++ b/explorer/lib/explorer/avs_directory.ex @@ -9,25 +9,29 @@ defmodule AVSDirectory do {status, config_json_string} = File.read(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") + :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 - @avs_directory_address Jason.decode!(config_json_string) |> Map.get("addresses") |> Map.get("avsDirectory") + @avs_directory_address Jason.decode!(config_json_string) + |> Map.get("addresses") + |> Map.get("avsDirectory") - @first_block ( - case @environment do - "devnet" -> 0 - "holesky" -> 1600000 - "mainnet" -> 20020000 - _ -> 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", - default_address: - @avs_directory_address + default_address: @avs_directory_address def get_avs_directory_address() do @avs_directory_address @@ -40,4 +44,24 @@ defmodule AVSDirectory do ) |> 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_operators_registered() do + AVSDirectory.get_operator_status_updated_events() + |> (fn {status, data} when status == :ok -> count_operators_registered(data) end).() + end end diff --git a/explorer/lib/explorer_web/live/pages/home/index.ex b/explorer/lib/explorer_web/live/pages/home/index.ex index a7cd496659..7361ffaeb3 100644 --- a/explorer/lib/explorer_web/live/pages/home/index.ex +++ b/explorer/lib/explorer_web/live/pages/home/index.ex @@ -6,7 +6,7 @@ defmodule ExplorerWeb.Home.Index do def handle_info(_, socket) do verified_batches = Batches.get_amount_of_verified_batches() - operators_registered = get_operators_registered() + operators_registered = AVSDirectory.get_operators_registered() latest_batches = Batches.get_latest_batches(%{amount: 5}) @@ -29,7 +29,7 @@ defmodule ExplorerWeb.Home.Index do def mount(_, _, socket) do verified_batches = Batches.get_amount_of_verified_batches() - operators_registered = get_operators_registered() + operators_registered = AVSDirectory.get_operators_registered() latest_batches = Batches.get_latest_batches(%{amount: 5}) @@ -92,25 +92,5 @@ defmodule ExplorerWeb.Home.Index do {:ok, socket |> put_flash(:error, "Something went wrong, please try again later.")} 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 - - defp get_operators_registered() do - AVSDirectory.get_operator_status_updated_events() - |> (fn {status, data} when status == :ok -> count_operators_registered(data) end).() - end - embed_templates "*" end From 4b4201d42a3f7062ea362c0223cd6728611afa36 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Fri, 19 Jul 2024 18:38:38 -0300 Subject: [PATCH 041/201] feat(wip): creating tables --- .../20240719193311_add_operators_table.exs | 13 +++++++++++++ .../20240719202751_add_tokens_table.exs | 16 ++++++++++++++++ .../20240719202825_add_restakings_table.exs | 14 ++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 explorer/priv/repo/migrations/20240719193311_add_operators_table.exs create mode 100644 explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs create mode 100644 explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs diff --git a/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs b/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs new file mode 100644 index 0000000000..9baa55ff83 --- /dev/null +++ b/explorer/priv/repo/migrations/20240719193311_add_operators_table.exs @@ -0,0 +1,13 @@ +defmodule Explorer.Repo.Migrations.AddOperatorsTable do + use Ecto.Migration + + def change do + create table("operators", primary_key: false) do + add :id, :bigserial, primary_key: true + add :name, :string, null: false + add :address, :binary, null: false + + timestamps() + end + end +end diff --git a/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs b/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs new file mode 100644 index 0000000000..153066883c --- /dev/null +++ b/explorer/priv/repo/migrations/20240719202751_add_tokens_table.exs @@ -0,0 +1,16 @@ +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 :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 + + 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.exs new file mode 100644 index 0000000000..aba185b01e --- /dev/null +++ b/explorer/priv/repo/migrations/20240719202825_add_restakings_table.exs @@ -0,0 +1,14 @@ +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 :staker_id, references(:stakers, column: :id, type: :bigint), null: false + add :amount, :decimal, precision: 22, scale: 0, null: false + add :tx_id, references(:transactions, column: :id, type: :bigint), null: false + + timestamps() + end + end +end From 76ed35ffd464e9f6c2d3c4885a994be2e33c124e Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Fri, 19 Jul 2024 21:49:16 -0300 Subject: [PATCH 042/201] feat(wip): add views for operator and assets --- .../components/core_components.ex | 4 +-- explorer/lib/explorer_web/components/nav.ex | 34 ++++++++++++++----- .../explorer_web/live/pages/assets/index.ex | 10 ++++++ .../live/pages/assets/index.html.heex | 3 ++ .../live/pages/home/index.html.heex | 19 ++++++----- .../live/pages/operators/index.ex | 10 ++++++ .../live/pages/operators/index.html.heex | 3 ++ explorer/lib/explorer_web/router.ex | 2 ++ 8 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 explorer/lib/explorer_web/live/pages/assets/index.ex create mode 100644 explorer/lib/explorer_web/live/pages/assets/index.html.heex create mode 100644 explorer/lib/explorer_web/live/pages/operators/index.ex create mode 100644 explorer/lib/explorer_web/live/pages/operators/index.html.heex diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex index 0273a6cc87..cc577846d6 100644 --- a/explorer/lib/explorer_web/components/core_components.ex +++ b/explorer/lib/explorer_web/components/core_components.ex @@ -318,7 +318,7 @@ defmodule ExplorerWeb.CoreComponents do attr :class, :string, default: nil attr :inner_class, :string, default: nil attr :title, :string, default: nil - attr :href, :string, required: true + attr :href, :string, default: nil attr :rest, :global, include: ~w(href target) slot :inner_block, default: nil @@ -328,7 +328,7 @@ defmodule ExplorerWeb.CoreComponents do <.link target="_blank" href={@href} - class="group hover:scale-[102%] transition-all duration-150 ease-in-out active:scale-95" + class="group" {@rest} > <.card_background class={@class}> diff --git a/explorer/lib/explorer_web/components/nav.ex b/explorer/lib/explorer_web/components/nav.ex index b198297731..3963553702 100644 --- a/explorer/lib/explorer_web/components/nav.ex +++ b/explorer/lib/explorer_web/components/nav.ex @@ -4,20 +4,38 @@ defmodule NavComponent do @impl true def render(assigns) do ~H""" -
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.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.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} - <%= operator.name %> - <.tooltip> - <%= operator.address %> - + + {operator.name} + <%= 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 - +
<%= render_slot(col, @row_item.(row)) %>
diff --git a/explorer/lib/explorer_web/live/pages/home/index.ex b/explorer/lib/explorer_web/live/pages/home/index.ex index 4702b2541d..3093869142 100644 --- a/explorer/lib/explorer_web/live/pages/home/index.ex +++ b/explorer/lib/explorer_web/live/pages/home/index.ex @@ -15,11 +15,16 @@ defmodule ExplorerWeb.Home.Index do verified_proofs = Batches.get_amount_of_verified_proofs() - restaked_amount_eth = + restaked_amount_eth = nil + + restaked_amount_wei = Restakings.get_aggregated_restakings() |> Map.get(:total_stake) - |> Decimal.to_integer() - |> EthConverter.wei_to_eth(2) + + if restaked_amount_wei != nil do + restaked_amount_eth = + Decimal.to_integer(restaked_amount_wei) |> EthConverter.wei_to_eth(2) + end {:noreply, assign( @@ -45,11 +50,16 @@ defmodule ExplorerWeb.Home.Index do verified_proofs = Batches.get_amount_of_verified_proofs() - restaked_amount_eth = + restaked_amount_eth = nil + + restaked_amount_wei = Restakings.get_aggregated_restakings() |> Map.get(:total_stake) - |> Decimal.to_integer() - |> EthConverter.wei_to_eth(2) + + if restaked_amount_wei != nil do + restaked_amount_eth = + Decimal.to_integer(restaked_amount_wei) |> EthConverter.wei_to_eth(2) + end if connected?(socket), do: Phoenix.PubSub.subscribe(Explorer.PubSub, "update_views") diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex index f525f78ecb..f3e94391ac 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -6,7 +6,7 @@ defmodule ExplorerWeb.Operator.Index do operator = Operators.get_operator_by_address(address) restaked_amount_eth = - Operators.get_total_stake(operator) + operator.total_stake |> Decimal.to_integer() |> EthConverter.wei_to_eth(2) @@ -22,41 +22,43 @@ defmodule ExplorerWeb.Operator.Index do def render(assigns) do ~H"""
- <.card_preheding class="text-4xl sm:text-5xl font-bold font-foreground"> + <.card_preheding> 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" + 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 [&>p]:break-all [&>*]:font-normal" > -
+
{@operator.name} -
+

<%= @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={ +
+ <.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 - + target="_blank" + rel="noopener" + > + EigenLayer Profile + +
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 61ddb232a7..ea05b0c416 100644 --- a/explorer/lib/explorer_web/live/pages/operators/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/operators/index.html.heex @@ -17,11 +17,10 @@ - <:col :let={_operator} label="Restake Concentration"> - TODO - - <:col :let={_operator} label="Total ETH Restaked"> - TODO + <:col :let={operator} label="Total ETH Restaked"> + <%= operator.total_stake + |> Decimal.to_integer() + |> EthConverter.wei_to_eth(2) %> ETH <:col :let={operator} label="Status"> <.dynamic_badge status={operator.is_active} truthy_text="Active" falsy_text="Inactive" /> From 554cd26f19ff5af4f0b6a34cdd9c0f9e3c895080 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Mon, 12 Aug 2024 17:19:15 -0300 Subject: [PATCH 119/201] build(deps): bump tailwind version --- explorer/config/config.exs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer/config/config.exs b/explorer/config/config.exs index 237a62943d..9cb5577dc7 100644 --- a/explorer/config/config.exs +++ b/explorer/config/config.exs @@ -38,7 +38,7 @@ config :esbuild, # Configure tailwind (the version is required) config :tailwind, - version: "3.4.0", + version: "3.4.9", explorer: [ args: ~w( --config=tailwind.config.js From 50a16ccb2402e1ffe61c54440eb65dbefddd2583 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Mon, 12 Aug 2024 17:19:56 -0300 Subject: [PATCH 120/201] fix: semantic html --- .../components/core_components.ex | 4 +- .../live/pages/home/index.html.heex | 116 +++++++++--------- 2 files changed, 61 insertions(+), 59 deletions(-) diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex index 8d2fc769f4..7a69351c58 100644 --- a/explorer/lib/explorer_web/components/core_components.ex +++ b/explorer/lib/explorer_web/components/core_components.ex @@ -257,11 +257,9 @@ defmodule ExplorerWeb.CoreComponents do def root_background(assigns) do ~H""" -
-
+
<%= render_slot(@inner_block) %>
-
""" end 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 9281b5ba48..8deb037ae1 100644 --- a/explorer/lib/explorer_web/live/pages/home/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/home/index.html.heex @@ -1,61 +1,65 @@ -
-

+
+

Aligned Explorer

-

-
- <.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 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 %> - 0 - <% end %> - - <.card title="verified batches"> - <%= if @verified_batches != :empty do %> - <%= @verified_batches |> Utils.format_number() %> - <% else %> - 0 - <% end %> - - <.card title="Verified Proofs" class="-mt-0.5 md:mt-0"> - <%= if @verified_proofs != :empty do %> - <%= @verified_proofs |> Utils.format_number() %> - <% else %> - 0 - <% end %> - - <.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" - inner_class="text-ellipsis overflow-hidden text-lg flex flex-col space-y-1" - title="Recent Batches" +
+ <.card_link + icon="hero-arrow-right-solid" + navigate={~p"/operators"} + title="Registered Operators" > - <.link - navigate={~p"/batches"} - class="absolute top-4 right-5 hover:underline font-medium text-muted-foreground capitalize text-sm" - > - View All - - <%= for batch <- @latest_batches do %> - <.link class="flex justify-between group" navigate={~p"/batches/#{batch}"}> - - <%= Utils.shorten_hash(batch) %> - - <.right_arrow /> - <.tooltip> - <%= batch %> - - + <%= if @operators_registered != :empty do %> + <%= @operators_registered %> + <% else %> + 0 + <% end %> + + <.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 %> + 0 + <% end %> + + <.card title="verified batches"> + <%= if @verified_batches != :empty do %> + <%= @verified_batches |> Utils.format_number() %> + <% else %> + 0 + <% end %> + + <.card title="Verified Proofs" class="-mt-0.5 md:mt-0"> + <%= if @verified_proofs != :empty do %> + <%= @verified_proofs |> Utils.format_number() %> + <% else %> + 0 <% end %> - <% end %> -
+ <.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" + inner_class="text-ellipsis overflow-hidden text-lg flex flex-col space-y-1" + title="Recent Batches" + > + <.link + navigate={~p"/batches"} + class="absolute top-4 right-5 hover:underline font-medium text-muted-foreground capitalize text-sm" + > + View All + + <%= for batch <- @latest_batches do %> + <.link class="flex justify-between group" navigate={~p"/batches/#{batch}"}> + + <%= Utils.shorten_hash(batch) %> + + <.right_arrow /> + <.tooltip> + <%= batch %> + + + <% end %> + + <% end %> +
+ From 8498868ad9eef9947c2f540d87c3f40a12e95503 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 12 Aug 2024 17:53:52 -0300 Subject: [PATCH 121/201] feat: update strategies.total_stake on restaking update --- explorer/lib/explorer/models/quorums.ex | 4 +-- explorer/lib/explorer/models/restakings.ex | 29 ++++++++++++------- explorer/lib/explorer/models/strategies.ex | 20 +++++++++++++ .../20240719202751_add_strategies_table.exs | 2 +- 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/explorer/lib/explorer/models/quorums.ex b/explorer/lib/explorer/models/quorums.ex index dc79c18330..52c8ef5473 100644 --- a/explorer/lib/explorer/models/quorums.ex +++ b/explorer/lib/explorer/models/quorums.ex @@ -91,9 +91,9 @@ defmodule QuorumStrategies do QuorumStrategies.generate_changeset(quorum.id, strategy.id) |> Explorer.Repo.insert() end end - def insert_quorum_strategy(_any_quorum, nil) do + def insert_quorum_strategy(any_quorum, nil) do dbg "trying to insert a nil or errored strategy, skipping" - dbg {_any_quorum, nil} + dbg {any_quorum, nil} nil end end diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex index 18fea719db..4be6c5bd98 100644 --- a/explorer/lib/explorer/models/restakings.ex +++ b/explorer/lib/explorer/models/restakings.ex @@ -38,19 +38,28 @@ defmodule Restakings do # 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_operator_and_strategy(%Restakings{operator_address: restaking.operator_address, strategy_address: restaking.strategy_address}) do + multi = + case Restakings.get_by_operator_and_strategy(%Restakings{operator_address: restaking.operator_address, strategy_address: restaking.strategy_address}) do nil -> - "nil, inserting restaking" |> dbg - Explorer.Repo.insert(changeset) - - [] -> - "[], inserting restaking" |> dbg - Explorer.Repo.insert(changeset) + "inserting restaking" |> dbg + Ecto.Multi.new() + |> Ecto.Multi.insert(:insert_restaking, changeset) + |> Ecto.Multi.update(:update_strategy_total_staked, Strategies.generate_update_total_staked_changeset(%{new_restaking: restaking})) existing_restaking -> "updating restaking" |> dbg - Explorer.Repo.update(Ecto.Changeset.change(existing_restaking, changeset.changes)) - + Ecto.Multi.new() + |> Ecto.Multi.update(:update_restaking, Ecto.Changeset.change(existing_restaking, changeset.changes)) + |> Ecto.Multi.update(:update_strategy_total_staked, Strategies.generate_update_total_staked_changeset(%{new_restaking: restaking})) + end + + case Explorer.Repo.transaction(multi) do + {:ok, _} -> + "Restaking and total_stake inserted/updated" |> IO.puts() + {:ok, :empty} + {:error, _, changeset, _} -> + "Error: #{inspect(changeset.errors)}" |> IO.puts() + {:error, changeset} end end @@ -60,7 +69,7 @@ defmodule Restakings do where: r.operator_address == ^operator_address and r.strategy_address == ^strategy_address, select: r ) - Explorer.Repo.all(query) + Explorer.Repo.one(query) end def get_aggregated_restakings() do diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex index e6ec47682d..1105e3a669 100644 --- a/explorer/lib/explorer/models/strategies.ex +++ b/explorer/lib/explorer/models/strategies.ex @@ -72,4 +72,24 @@ defmodule Strategies do Explorer.Repo.all(query) end + def generate_update_total_staked_changeset(%{new_restaking: new_restaking}) do + query = from(s in Strategies, + where: s.strategy_address == ^new_restaking.strategy_address, + select: s) + strategy = Explorer.Repo.one(query) + dbg strategy + + query = from(r in Restakings, + where: r.strategy_address == ^new_restaking.strategy_address and r.operator_address == ^new_restaking.operator_address, + select: r) + old_restaking = case Explorer.Repo.one(query) do + nil -> %Restakings{stake: 0} + restaking -> restaking + end + + restaking_amount_diff = Decimal.sub(new_restaking.stake, old_restaking.stake) + new_stake = Decimal.add(strategy.total_staked, (restaking_amount_diff)) + Strategies.changeset(strategy, %{total_staked: new_stake}) + 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 4fdd559b3a..29f5da90a5 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: 30, scale: 0 + add :total_staked, :decimal, precision: 30, scale: 0, default: 0 #TODO check if it is being updated on inserting new restake timestamps() end From e62aac859a48b05def03b34fae5174a5e744e1db Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Mon, 12 Aug 2024 18:00:36 -0300 Subject: [PATCH 122/201] fix: order operator by stake --- explorer/lib/explorer/models/operators.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex index e2a05ccf93..0ae565a4b0 100644 --- a/explorer/lib/explorer/models/operators.ex +++ b/explorer/lib/explorer/models/operators.ex @@ -43,7 +43,8 @@ defmodule Operators do # TODO: add pagination def get_operators() do - query = from(o in Operators, select: o) + # add sort + query = from(o in Operators, select: o, order_by: [desc: o.total_stake]) Explorer.Repo.all(query) end From aa61e52b217beb63ca41518d26edbafd8da0b183 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Mon, 12 Aug 2024 18:01:02 -0300 Subject: [PATCH 123/201] fix: use param instead of map --- 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 4be6c5bd98..427c262f3a 100644 --- a/explorer/lib/explorer/models/restakings.ex +++ b/explorer/lib/explorer/models/restakings.ex @@ -80,7 +80,7 @@ defmodule Restakings do Explorer.Repo.one(query) end - def get_restakes_by_operator_id(%{operator_id: operator_id}) do + def get_restakes_by_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, From 5272f055283c1c3207dc88ca6ad9f27b852e0df7 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Mon, 12 Aug 2024 18:42:18 -0300 Subject: [PATCH 124/201] feat(operators): add restaked details --- explorer/lib/explorer_web/components/nav.ex | 2 +- .../explorer_web/live/pages/assets/index.ex | 30 ++++++++++++- .../live/pages/assets/index.html.heex | 14 ------ .../live/pages/batches/index.html.heex | 2 +- .../explorer_web/live/pages/operator/index.ex | 45 ++++++++++++++++--- .../live/pages/operators/index.ex | 35 ++++++++++++++- .../live/pages/operators/index.html.heex | 29 ------------ 7 files changed, 103 insertions(+), 54 deletions(-) delete mode 100644 explorer/lib/explorer_web/live/pages/assets/index.html.heex delete mode 100644 explorer/lib/explorer_web/live/pages/operators/index.html.heex diff --git a/explorer/lib/explorer_web/components/nav.ex b/explorer/lib/explorer_web/components/nav.ex index 7e3856056c..26036fb772 100644 --- a/explorer/lib/explorer_web/components/nav.ex +++ b/explorer/lib/explorer_web/components/nav.ex @@ -30,8 +30,8 @@ defmodule NavComponent do Operators
+ <.live_component module={SearchComponent} id="nav_search" />
- <.live_component module={SearchComponent} id="nav_search" />
<.link class="hover:text-foreground" target="_blank" href="https://docs.alignedlayer.com"> Docs diff --git a/explorer/lib/explorer_web/live/pages/assets/index.ex b/explorer/lib/explorer_web/live/pages/assets/index.ex index ad1c2289da..fa2ca9b7d7 100644 --- a/explorer/lib/explorer_web/live/pages/assets/index.ex +++ b/explorer/lib/explorer_web/live/pages/assets/index.ex @@ -6,5 +6,33 @@ defmodule ExplorerWeb.Assets.Index do {:ok, assign(socket, page_title: "Restaked Assets")} end - embed_templates "*" + @impl true + def handle_params(_params, _url, socket) do + assets = Strategies.get_all_strategies() + + dbg(assets) + + {:noreply, assign(socket, assets: assets)} + end + + @impl true + def render(assigns) do + ~H""" +
+ <.card_preheding>Assets + <.table id="assets" rows={@assets}> + <:col :let={asset} label="Token" class="text-left"> + <%= asset.name %> + + <:col :let={asset} label="Total ETH Restaked"> + <%= if asset.total_staked != nil do %> + <%= asset.total_staked %> + <% else %> + N/A + <% end %> + + +
+ """ + end end diff --git a/explorer/lib/explorer_web/live/pages/assets/index.html.heex b/explorer/lib/explorer_web/live/pages/assets/index.html.heex deleted file mode 100644 index 4919e95b06..0000000000 --- a/explorer/lib/explorer_web/live/pages/assets/index.html.heex +++ /dev/null @@ -1,14 +0,0 @@ -
- <.card_preheding>Assets - <.table id="assets" rows={[1, 2, 3, 4, 5, 6, 7, 8, 9]}> - <:col :let={_asset} label="Token"> - TODO - - <:col :let={_asset} label="Restake Concentration"> - TODO - - <:col :let={_asset} label="Total ETH Restaked"> - TODO - - -
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 3052a8a1e5..a35b703471 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="Batch Hash"> + <:col :let={batch} label="Batch Hash" class="text-left"> <.link navigate={~p"/batches/#{batch.merkle_root}"}> Decimal.to_integer() |> EthConverter.wei_to_eth(2) + restakes_by_operator = Restakings.get_restakes_by_operator_id(operator.id) + {:ok, assign(socket, operator: operator, restaked_amount_eth: restaked_amount_eth, + restakes_by_operator: restakes_by_operator, page_title: operator.name )} end @@ -27,9 +30,9 @@ defmodule ExplorerWeb.Operator.Index do <.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 [&>p]:break-all [&>*]:font-normal" + 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 [&>p]:break-all [&>*]:font-normal [&>div]:flex [&>div]:flex-col [&>div]:lg:flex-row [&>div>h3]:basis-1/4" > -
+
{@operator.name}
- Address: -

- <%= @operator.address %> -

-
+ <.divider class="my-2 sm:mt-5 sm:mb-3" /> +
+

+ Address: +

+

+ <%= @operator.address %> +

+
+

Total Restaked:

@@ -73,6 +81,29 @@ defmodule ExplorerWeb.Operator.Index do <%= @restaked_amount_eth %> ETH

+
+

+ Restakes: +

+ <%= if @restakes_by_operator != [] do %> +
+ <%= for {restake, strategy} <- @restakes_by_operator do %> +
+

+ <%= strategy.name %> +

+

+ <%= restake.stake %> ETH +

+
+ <% end %> +
+ <% else %> +

+ No restakes found. +

+ <% end %> +
""" diff --git a/explorer/lib/explorer_web/live/pages/operators/index.ex b/explorer/lib/explorer_web/live/pages/operators/index.ex index b07c0d6a25..3ed8332324 100644 --- a/explorer/lib/explorer_web/live/pages/operators/index.ex +++ b/explorer/lib/explorer_web/live/pages/operators/index.ex @@ -18,5 +18,38 @@ defmodule ExplorerWeb.Operators.Index do {:noreply, assign(socket, operators: operators)} end - embed_templates "*" + @impl true + def render(assigns) do + ~H""" +
+ <.card_preheding>Operators + <.table id="operators" rows={@operators}> + <:col :let={operator} label="Name" class={"[animation-delay: 3s]"}> + <.link navigate={~p"/operators/#{operator.address}"} class="flex gap-x-2"> + + {operator.name} + <%= operator.name %> + <.right_arrow /> + <.tooltip> + <%= operator.address %> + + + + + <:col :let={operator} label="Total ETH Restaked"> + <%= operator.total_stake + |> Decimal.to_integer() + |> EthConverter.wei_to_eth(2) %> ETH + + <:col :let={operator} label="Status"> + <.dynamic_badge status={operator.is_active} truthy_text="Active" falsy_text="Inactive" /> + + +
+ """ + 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 deleted file mode 100644 index ea05b0c416..0000000000 --- a/explorer/lib/explorer_web/live/pages/operators/index.html.heex +++ /dev/null @@ -1,29 +0,0 @@ -
- <.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} - <%= operator.name %> - <.right_arrow /> - <.tooltip> - <%= operator.address %> - - - - - <:col :let={operator} label="Total ETH Restaked"> - <%= operator.total_stake - |> Decimal.to_integer() - |> EthConverter.wei_to_eth(2) %> ETH - - <:col :let={operator} label="Status"> - <.dynamic_badge status={operator.is_active} truthy_text="Active" falsy_text="Inactive" /> - - -
From ad2dd194e3ce41b266392f021b63799e43d4b158 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Mon, 12 Aug 2024 18:45:31 -0300 Subject: [PATCH 125/201] feat: get operator wiright --- explorer/lib/explorer/models/operators.ex | 13 +++++++++++++ .../lib/explorer_web/live/pages/operator/index.ex | 2 ++ 2 files changed, 15 insertions(+) diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex index 0ae565a4b0..a90f0c4bd2 100644 --- a/explorer/lib/explorer/models/operators.ex +++ b/explorer/lib/explorer/models/operators.ex @@ -113,4 +113,17 @@ defmodule Operators do Explorer.Repo.one(query) end + def get_operator_weight(%Operators{} = operator) do + dbg operator + query = from(o in Operators, where: o.address == ^operator.address, select: o.total_stake) + operator_stake = Explorer.Repo.one(query) + dbg operator_stake + + query = from(o in Operators, select: sum(o.total_stake)) + total_stake = Explorer.Repo.one(query) + dbg total_stake + + Decimal.div(operator_stake, total_stake) + 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 f3e94391ac..c7a76cc66a 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -5,6 +5,8 @@ defmodule ExplorerWeb.Operator.Index do def mount(%{"address" => address}, _, socket) do operator = Operators.get_operator_by_address(address) + Operators.get_operator_weight(operator) |> dbg + restaked_amount_eth = operator.total_stake |> Decimal.to_integer() From 66ca1eb8b8d61b04ce641ca34e8739fa35ecb831 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Mon, 12 Aug 2024 18:58:39 -0300 Subject: [PATCH 126/201] fix: compiler warnings --- .../components/core_components.ex | 2 +- .../lib/explorer_web/live/pages/home/index.ex | 37 +++++++++---------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex index 7a69351c58..07e1214b3d 100644 --- a/explorer/lib/explorer_web/components/core_components.ex +++ b/explorer/lib/explorer_web/components/core_components.ex @@ -664,7 +664,7 @@ defmodule ExplorerWeb.CoreComponents do class="gap-y-2 [&>td]:pt-3 animate-in fade-in-0 duration-700 truncate" > diff --git a/explorer/lib/explorer_web/live/pages/home/index.ex b/explorer/lib/explorer_web/live/pages/home/index.ex index 3093869142..e084c3f4fb 100644 --- a/explorer/lib/explorer_web/live/pages/home/index.ex +++ b/explorer/lib/explorer_web/live/pages/home/index.ex @@ -15,16 +15,7 @@ defmodule ExplorerWeb.Home.Index do verified_proofs = Batches.get_amount_of_verified_proofs() - restaked_amount_eth = nil - - restaked_amount_wei = - Restakings.get_aggregated_restakings() - |> Map.get(:total_stake) - - if restaked_amount_wei != nil do - restaked_amount_eth = - Decimal.to_integer(restaked_amount_wei) |> EthConverter.wei_to_eth(2) - end + restaked_amount_eth = get_restaked_amount_eth() {:noreply, assign( @@ -50,16 +41,7 @@ defmodule ExplorerWeb.Home.Index do verified_proofs = Batches.get_amount_of_verified_proofs() - restaked_amount_eth = nil - - restaked_amount_wei = - Restakings.get_aggregated_restakings() - |> Map.get(:total_stake) - - if restaked_amount_wei != nil do - restaked_amount_eth = - Decimal.to_integer(restaked_amount_wei) |> EthConverter.wei_to_eth(2) - end + restaked_amount_eth = get_restaked_amount_eth() if connected?(socket), do: Phoenix.PubSub.subscribe(Explorer.PubSub, "update_views") @@ -115,5 +97,20 @@ defmodule ExplorerWeb.Home.Index do {:ok, socket |> put_flash(:error, "Something went wrong, please try again later.")} end + defp get_restaked_amount_eth() do + restaked_amount_wei = + Restakings.get_aggregated_restakings() + |> Map.get(:total_stake) + + case restaked_amount_wei do + nil -> + nil + + _ -> + Decimal.to_integer(restaked_amount_wei) + |> EthConverter.wei_to_eth(2) + end + end + embed_templates "*" end From d84709688754cffa14ecc781ae3899ff526c5057 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Mon, 12 Aug 2024 19:03:33 -0300 Subject: [PATCH 127/201] fix: table elements not showing --- 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 07e1214b3d..851d76bc7b 100644 --- a/explorer/lib/explorer_web/components/core_components.ex +++ b/explorer/lib/explorer_web/components/core_components.ex @@ -664,7 +664,7 @@ defmodule ExplorerWeb.CoreComponents do class="gap-y-2 [&>td]:pt-3 animate-in fade-in-0 duration-700 truncate" > From 3cc85bfbc1b3e26caf16a5b0ac1ad60890ace94e Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Mon, 12 Aug 2024 19:09:54 -0300 Subject: [PATCH 128/201] fix: assets eth restaked --- explorer/lib/explorer_web/live/pages/assets/index.ex | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/assets/index.ex b/explorer/lib/explorer_web/live/pages/assets/index.ex index fa2ca9b7d7..5baa2004ce 100644 --- a/explorer/lib/explorer_web/live/pages/assets/index.ex +++ b/explorer/lib/explorer_web/live/pages/assets/index.ex @@ -10,8 +10,6 @@ defmodule ExplorerWeb.Assets.Index do def handle_params(_params, _url, socket) do assets = Strategies.get_all_strategies() - dbg(assets) - {:noreply, assign(socket, assets: assets)} end @@ -26,7 +24,7 @@ defmodule ExplorerWeb.Assets.Index do <:col :let={asset} label="Total ETH Restaked"> <%= if asset.total_staked != nil do %> - <%= asset.total_staked %> + <%= asset.total_staked |> Decimal.to_integer() |> EthConverter.wei_to_eth(5) %> <% else %> N/A <% end %> From 7c22c3631c45edb65f5dcd2cddbf867ac40e9a0d Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 10:51:59 -0300 Subject: [PATCH 129/201] fix: comments, and call handle_quorum(0) on script --- .../lib/explorer/contract_managers/delegation_manager.ex | 1 + explorer/lib/explorer/models/restakings.ex | 5 +---- explorer/lib/scripts/fetch_old_batches.ex | 2 +- .../lib/scripts/fetch_old_operators_strategies_restakes.ex | 3 +++ 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/explorer/lib/explorer/contract_managers/delegation_manager.ex b/explorer/lib/explorer/contract_managers/delegation_manager.ex index e773b52aa7..46b15cb117 100644 --- a/explorer/lib/explorer/contract_managers/delegation_manager.ex +++ b/explorer/lib/explorer/contract_managers/delegation_manager.ex @@ -72,6 +72,7 @@ defmodule DelegationManager do IO.inspect(error) error other -> + IO.inspect("Unexpected response on get_operator_all_strategies_shares:") dbg other other end diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex index 427c262f3a..3d5234a615 100644 --- a/explorer/lib/explorer/models/restakings.ex +++ b/explorer/lib/explorer/models/restakings.ex @@ -35,8 +35,6 @@ defmodule Restakings do def insert_or_update_restakings(%Restakings{} = restaking) do 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}) multi = case Restakings.get_by_operator_and_strategy(%Restakings{operator_address: restaking.operator_address, strategy_address: restaking.strategy_address}) do @@ -55,10 +53,9 @@ defmodule Restakings do case Explorer.Repo.transaction(multi) do {:ok, _} -> - "Restaking and total_stake inserted/updated" |> IO.puts() {:ok, :empty} {:error, _, changeset, _} -> - "Error: #{inspect(changeset.errors)}" |> IO.puts() + "Error updating restakings table: #{inspect(changeset.errors)}" |> IO.puts() {:error, changeset} end end diff --git a/explorer/lib/scripts/fetch_old_batches.ex b/explorer/lib/scripts/fetch_old_batches.ex index 8851d69cc5..f1499324be 100644 --- a/explorer/lib/scripts/fetch_old_batches.ex +++ b/explorer/lib/scripts/fetch_old_batches.ex @@ -10,7 +10,7 @@ defmodule Scripts.FetchOldBatches do def fetch_old_events(fromBlock, toBlock) do "fetching old events, from #{fromBlock} to #{toBlock}" |> IO.inspect() - chunk_size = 16 #do in smaller chunks, if there are too many blocks to process + chunk_size = 32 #do in smaller chunks, if there are too many blocks to process chunkify(fromBlock, toBlock, chunk_size) |> Enum.each(&make_request/1) "done fetching old events" |> IO.inspect() end diff --git a/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex b/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex index d72aea0172..c0020e3177 100644 --- a/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex +++ b/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex @@ -7,6 +7,9 @@ defmodule Scripts.FetchOldOperatorsStrategiesRestakes do dbg "fetching old quorum and strategy changes" Explorer.Periodically.process_quorum_strategy_changes() + # Temporal solution to handle new quorums, until Eigenlayer implements emition of QuorumCreated event + Quorums.handle_quorum(%Quorums{id: 0}) + dbg "fetching old operators changes" Explorer.Periodically.process_operators(fromBlock) From 5a8d1045583b9a42e74ec4512d79960b704e80cd Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 11:24:28 -0300 Subject: [PATCH 130/201] fix: restakes in operator detail refactor: add decimal to eth converter --- .../lib/explorer_web/live/eth_converter.ex | 9 ++++++++- .../explorer_web/live/pages/assets/index.ex | 2 +- .../lib/explorer_web/live/pages/home/index.ex | 2 +- .../explorer_web/live/pages/operator/index.ex | 19 +++++++------------ .../live/pages/operators/index.ex | 3 +-- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/explorer/lib/explorer_web/live/eth_converter.ex b/explorer/lib/explorer_web/live/eth_converter.ex index 4ebc0b918b..6a68d0dbcc 100644 --- a/explorer/lib/explorer_web/live/eth_converter.ex +++ b/explorer/lib/explorer_web/live/eth_converter.ex @@ -7,7 +7,14 @@ defmodule EthConverter do def wei_to_eth(wei, decimal_places \\ 18) def wei_to_eth(wei, _decimal_places) when is_nil(wei) do - :nil + nil + end + + def wei_to_eth(%Decimal{} = wei, decimal_places) do + wei + |> Decimal.div(Decimal.new(@wei_per_eth)) + |> Decimal.round(decimal_places) + |> Decimal.to_string(:normal) end def wei_to_eth(wei, decimal_places) when is_integer(wei) do diff --git a/explorer/lib/explorer_web/live/pages/assets/index.ex b/explorer/lib/explorer_web/live/pages/assets/index.ex index 5baa2004ce..f12bb73250 100644 --- a/explorer/lib/explorer_web/live/pages/assets/index.ex +++ b/explorer/lib/explorer_web/live/pages/assets/index.ex @@ -24,7 +24,7 @@ defmodule ExplorerWeb.Assets.Index do <:col :let={asset} label="Total ETH Restaked"> <%= if asset.total_staked != nil do %> - <%= asset.total_staked |> Decimal.to_integer() |> EthConverter.wei_to_eth(5) %> + <%= asset.total_staked |> EthConverter.wei_to_eth(5) %> <% else %> N/A <% end %> diff --git a/explorer/lib/explorer_web/live/pages/home/index.ex b/explorer/lib/explorer_web/live/pages/home/index.ex index e084c3f4fb..38ab491f91 100644 --- a/explorer/lib/explorer_web/live/pages/home/index.ex +++ b/explorer/lib/explorer_web/live/pages/home/index.ex @@ -107,7 +107,7 @@ defmodule ExplorerWeb.Home.Index do nil _ -> - Decimal.to_integer(restaked_amount_wei) + restaked_amount_wei |> EthConverter.wei_to_eth(2) 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 3c37d87e2b..84e1dd77ed 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -7,10 +7,7 @@ defmodule ExplorerWeb.Operator.Index do Operators.get_operator_weight(operator) |> dbg - restaked_amount_eth = - operator.total_stake - |> Decimal.to_integer() - |> EthConverter.wei_to_eth(2) + restaked_amount_eth = operator.total_stake |> EthConverter.wei_to_eth(2) restakes_by_operator = Restakings.get_restakes_by_operator_id(operator.id) @@ -89,14 +86,12 @@ defmodule ExplorerWeb.Operator.Index do <%= if @restakes_by_operator != [] do %>
- <%= for {restake, strategy} <- @restakes_by_operator do %> -
-

- <%= strategy.name %> -

-

- <%= restake.stake %> ETH -

+ <%= for %{strategy: strategy, restaking: restaking} <- @restakes_by_operator do %> +
+ <%= strategy.name %> (<%= strategy.symbol %>) <%= EthConverter.wei_to_eth( + restaking.stake, + 3 + ) %> ETH
<% end %>
diff --git a/explorer/lib/explorer_web/live/pages/operators/index.ex b/explorer/lib/explorer_web/live/pages/operators/index.ex index 3ed8332324..caa05e359b 100644 --- a/explorer/lib/explorer_web/live/pages/operators/index.ex +++ b/explorer/lib/explorer_web/live/pages/operators/index.ex @@ -24,7 +24,7 @@ defmodule ExplorerWeb.Operators.Index do
<.card_preheding>Operators <.table id="operators" rows={@operators}> - <:col :let={operator} label="Name" class={"[animation-delay: 3s]"}> + <:col :let={operator} label="Name" class="[animation-delay: 3s]"> <.link navigate={~p"/operators/#{operator.address}"} class="flex gap-x-2"> <:col :let={operator} label="Total ETH Restaked"> <%= operator.total_stake - |> Decimal.to_integer() |> EthConverter.wei_to_eth(2) %> ETH <:col :let={operator} label="Status"> From 358eb00d2ae611ac4ea3a9384eceb11a2d9fdd24 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 11:31:40 -0300 Subject: [PATCH 131/201] fix: add order to strategies --- explorer/lib/explorer/models/strategies.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex index 1105e3a669..9d54c66f51 100644 --- a/explorer/lib/explorer/models/strategies.ex +++ b/explorer/lib/explorer/models/strategies.ex @@ -61,7 +61,8 @@ defmodule Strategies do def get_all_strategies() do query = from(s in Strategies, - select: s) + select: s, + order_by: [desc: s.total_staked]) Explorer.Repo.all(query) end From 3e6f47b2bc5bb938f8dc387de5fa7f72885f9c5e Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 11:40:10 -0300 Subject: [PATCH 132/201] fix: assets view --- explorer/lib/explorer_web/live/pages/assets/index.ex | 6 ++++++ explorer/lib/explorer_web/live/pages/operator/index.ex | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/explorer/lib/explorer_web/live/pages/assets/index.ex b/explorer/lib/explorer_web/live/pages/assets/index.ex index f12bb73250..871a6309c1 100644 --- a/explorer/lib/explorer_web/live/pages/assets/index.ex +++ b/explorer/lib/explorer_web/live/pages/assets/index.ex @@ -21,6 +21,12 @@ defmodule ExplorerWeb.Assets.Index do <.table id="assets" rows={@assets}> <:col :let={asset} label="Token" class="text-left"> <%= asset.name %> + <.tooltip> + <%= asset.token_address %> + + + <:col :let={asset} label="Symbol"> + <%= asset.symbol %> <:col :let={asset} label="Total ETH Restaked"> <%= if asset.total_staked != nil do %> diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex index 84e1dd77ed..5a04179f26 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -87,7 +87,7 @@ defmodule ExplorerWeb.Operator.Index do <%= if @restakes_by_operator != [] do %>
<%= for %{strategy: strategy, restaking: restaking} <- @restakes_by_operator do %> -
+
<%= strategy.name %> (<%= strategy.symbol %>) <%= EthConverter.wei_to_eth( restaking.stake, 3 From 89eae5d388e09a36120b019e2f8909285473a2fa Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 14:53:24 -0300 Subject: [PATCH 133/201] feat: add cta for operators and assets views --- .../lib/explorer_web/components/assets_cta.ex | 76 +++++++++++++++++++ .../explorer_web/live/pages/assets/index.ex | 16 ++-- .../live/pages/operators/index.ex | 1 + 3 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 explorer/lib/explorer_web/components/assets_cta.ex diff --git a/explorer/lib/explorer_web/components/assets_cta.ex b/explorer/lib/explorer_web/components/assets_cta.ex new file mode 100644 index 0000000000..3b9d7c6d29 --- /dev/null +++ b/explorer/lib/explorer_web/components/assets_cta.ex @@ -0,0 +1,76 @@ +defmodule AssetsCTAComponent do + use ExplorerWeb, :live_component + + @impl true + def mount(socket) do + total_staked = get_restaked_amount_eth() + operators_registered = Operators.get_amount_of_operators() + + {:ok, + assign(socket, + total_staked: total_staked, + operators_registered: operators_registered + )} + end + + defp get_restaked_amount_eth() do + restaked_amount_wei = + Restakings.get_aggregated_restakings() + |> Map.get(:total_stake) + + case restaked_amount_wei do + nil -> + nil + + _ -> + restaked_amount_wei + |> EthConverter.wei_to_eth(2) + end + end + + @impl true + def render(assigns) do + ~H""" +
+ <.card_background class="min-h-24 flex flex-col md:flex-row gap-y-1 justify-between p-4"> +
+ <.link + navigate="/operators" + class="text-muted-foreground font-semibold group flex gap-2 items-center" + > +

+ Total Operators +

+ <.right_arrow /> + <.tooltip> + View all operators + + + + <%= @operators_registered %> + +
+
+ <.link + navigate="/assets" + class="text-muted-foreground font-semibold group flex gap-2 items-center" + > +

+ Total Restaked +

+ <.right_arrow /> + <.tooltip> + View all restaked assets + + + + + <%= @total_staked %> ETH + +
+
+ +
+ """ + end +end diff --git a/explorer/lib/explorer_web/live/pages/assets/index.ex b/explorer/lib/explorer_web/live/pages/assets/index.ex index 871a6309c1..366fd97638 100644 --- a/explorer/lib/explorer_web/live/pages/assets/index.ex +++ b/explorer/lib/explorer_web/live/pages/assets/index.ex @@ -10,7 +10,10 @@ defmodule ExplorerWeb.Assets.Index do def handle_params(_params, _url, socket) do assets = Strategies.get_all_strategies() - {:noreply, assign(socket, assets: assets)} + {:noreply, + assign(socket, + assets: assets + )} end @impl true @@ -18,16 +21,19 @@ defmodule ExplorerWeb.Assets.Index do ~H"""
<.card_preheding>Assets + <.live_component module={AssetsCTAComponent} id="assets_cta" /> <.table id="assets" rows={@assets}> <:col :let={asset} label="Token" class="text-left"> - <%= asset.name %> +
+ <%= asset.name %> +

+ <%= asset.symbol %> +

+
<.tooltip> <%= asset.token_address %> - <:col :let={asset} label="Symbol"> - <%= asset.symbol %> - <:col :let={asset} label="Total ETH Restaked"> <%= if asset.total_staked != nil do %> <%= asset.total_staked |> EthConverter.wei_to_eth(5) %> diff --git a/explorer/lib/explorer_web/live/pages/operators/index.ex b/explorer/lib/explorer_web/live/pages/operators/index.ex index caa05e359b..e54c72da7a 100644 --- a/explorer/lib/explorer_web/live/pages/operators/index.ex +++ b/explorer/lib/explorer_web/live/pages/operators/index.ex @@ -23,6 +23,7 @@ defmodule ExplorerWeb.Operators.Index do ~H"""
<.card_preheding>Operators + <.live_component module={AssetsCTAComponent} id="operators_cta" /> <.table id="operators" rows={@operators}> <:col :let={operator} label="Name" class="[animation-delay: 3s]"> <.link navigate={~p"/operators/#{operator.address}"} class="flex gap-x-2"> From 247f3e1c2c13b90d94a641ef977201c1a40da04e Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 15:22:53 -0300 Subject: [PATCH 134/201] fix: improve cta tap target --- .../lib/explorer_web/components/assets_cta.ex | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/explorer/lib/explorer_web/components/assets_cta.ex b/explorer/lib/explorer_web/components/assets_cta.ex index 3b9d7c6d29..df951c4174 100644 --- a/explorer/lib/explorer_web/components/assets_cta.ex +++ b/explorer/lib/explorer_web/components/assets_cta.ex @@ -33,41 +33,34 @@ defmodule AssetsCTAComponent do ~H"""
<.card_background class="min-h-24 flex flex-col md:flex-row gap-y-1 justify-between p-4"> -
- <.link - navigate="/operators" - class="text-muted-foreground font-semibold group flex gap-2 items-center" - > + <.link navigate="/operators" class="flex flex-col justify-start gap-0.5 group"> +

Total Operators

<.right_arrow /> - <.tooltip> - View all operators - - +
<%= @operators_registered %> -
-
- <.link - navigate="/assets" - class="text-muted-foreground font-semibold group flex gap-2 items-center" - > + <.tooltip> + View all operators + + + <.link navigate="/assets" class="flex flex-col justify-start gap-0.5 group"> +

Total Restaked

<.right_arrow /> - <.tooltip> - View all restaked assets - - - +
<%= @total_staked %> ETH -
+ <.tooltip> + View all restaked assets + +
From 3e6939cfcfeac834fe16c908a7d40a97f0ce9a03 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 15:56:59 -0300 Subject: [PATCH 135/201] fix: restaking gathering bug --- .../lib/explorer/contract_managers/delegation_manager.ex | 2 +- explorer/lib/explorer/models/restakings.ex | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/explorer/lib/explorer/contract_managers/delegation_manager.ex b/explorer/lib/explorer/contract_managers/delegation_manager.ex index 46b15cb117..ca1b7d0ffe 100644 --- a/explorer/lib/explorer/contract_managers/delegation_manager.ex +++ b/explorer/lib/explorer/contract_managers/delegation_manager.ex @@ -66,7 +66,7 @@ defmodule DelegationManager do 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) + end) {:error, error} -> IO.inspect("Error fetching operator's strategies shares") IO.inspect(error) diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex index 3d5234a615..aa7bb1a53f 100644 --- a/explorer/lib/explorer/models/restakings.ex +++ b/explorer/lib/explorer/models/restakings.ex @@ -29,13 +29,15 @@ defmodule Restakings do |> 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) + |> Enum.each(&insert_or_update_restakings/1) end + def insert_or_update_restakings(restakings) when is_list(restakings) do + Enum.each(restakings, &insert_or_update_restakings/1) + end def insert_or_update_restakings(%Restakings{} = restaking) do changeset = restaking |> generate_changeset() - multi = case Restakings.get_by_operator_and_strategy(%Restakings{operator_address: restaking.operator_address, strategy_address: restaking.strategy_address}) do nil -> @@ -53,6 +55,7 @@ defmodule Restakings do case Explorer.Repo.transaction(multi) do {:ok, _} -> + dbg "Restaking inserted or updated" {:ok, :empty} {:error, _, changeset, _} -> "Error updating restakings table: #{inspect(changeset.errors)}" |> IO.puts() From 57125d4bfadce56024c2b81403998743891f40d1 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 15:57:43 -0300 Subject: [PATCH 136/201] fix: mix.lock --- explorer/mix.lock | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/explorer/mix.lock b/explorer/mix.lock index a6dce9df35..02ea1769ac 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"}, @@ -48,6 +48,7 @@ "postgrex": {:hex, :postgrex, "0.18.0", "f34664101eaca11ff24481ed4c378492fed2ff416cd9b06c399e90f321867d7e", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "a042989ba1bc1cca7383ebb9e461398e3f89f868c92ce6671feb7ef132a252d1"}, "rustler_precompiled": {:hex, :rustler_precompiled, "0.7.2", "097f657e401f02e7bc1cab808cfc6abdc1f7b9dc5e5adee46bf2fd8fdcce9ecf", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: false]}, {:rustler, "~> 0.23", [hex: :rustler, repo: "hexpm", optional: true]}], "hexpm", "7663faaeadc9e93e605164dcf9e69168e35f2f8b7f2b9eb4e400d1a8e0fe2999"}, "sleeplocks": {:hex, :sleeplocks, "1.1.3", "96a86460cc33b435c7310dbd27ec82ca2c1f24ae38e34f8edde97f756503441a", [:rebar3], [], "hexpm", "d3b3958552e6eb16f463921e70ae7c767519ef8f5be46d7696cc1ed649421321"}, + "sobelow": {:hex, :sobelow, "0.13.0", "218afe9075904793f5c64b8837cc356e493d88fddde126a463839351870b8d1e", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "cd6e9026b85fc35d7529da14f95e85a078d9dd1907a9097b3ba6ac7ebbe34a0d"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "swoosh": {:hex, :swoosh, "1.16.4", "d407768b3b68e3d1ff8d43b575a20c13bea338647143e241a324894cdb5af0b2", [:mix], [{:bandit, ">= 1.0.0", [hex: :bandit, repo: "hexpm", optional: true]}, {:cowboy, "~> 1.1 or ~> 2.4", [hex: :cowboy, repo: "hexpm", optional: true]}, {:ex_aws, "~> 2.1", [hex: :ex_aws, repo: "hexpm", optional: true]}, {:finch, "~> 0.6", [hex: :finch, repo: "hexpm", optional: true]}, {:gen_smtp, "~> 0.13 or ~> 1.0", [hex: :gen_smtp, repo: "hexpm", optional: true]}, {:hackney, "~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mail, "~> 0.2", [hex: :mail, repo: "hexpm", optional: true]}, {:mime, "~> 1.1 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mua, "~> 0.1.0", [hex: :mua, repo: "hexpm", optional: true]}, {:multipart, "~> 0.4", [hex: :multipart, repo: "hexpm", optional: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:plug_cowboy, ">= 1.0.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:req, "~> 0.4 or ~> 1.0", [hex: :req, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.2 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a38798368c09b09d7108803c42f24bb051d3e87bc1b81e6f09b20bf5a31c6676"}, "tailwind": {:hex, :tailwind, "0.2.3", "277f08145d407de49650d0a4685dc062174bdd1ae7731c5f1da86163a24dfcdb", [:mix], [{:castore, ">= 0.0.0", [hex: :castore, repo: "hexpm", optional: false]}], "hexpm", "8e45e7a34a676a7747d04f7913a96c770c85e6be810a1d7f91e713d3a3655b5d"}, From b10bd8cad1986e2574b11657ab277617d5e2969c Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 16:13:01 -0300 Subject: [PATCH 137/201] refactor: rename assets to restakes --- explorer/lib/explorer_web/components/assets_cta.ex | 4 ++-- explorer/lib/explorer_web/live/pages/home/index.html.heex | 2 +- .../lib/explorer_web/live/pages/{assets => restakes}/index.ex | 4 ++-- explorer/lib/explorer_web/router.ex | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename explorer/lib/explorer_web/live/pages/{assets => restakes}/index.ex (92%) diff --git a/explorer/lib/explorer_web/components/assets_cta.ex b/explorer/lib/explorer_web/components/assets_cta.ex index df951c4174..0579852107 100644 --- a/explorer/lib/explorer_web/components/assets_cta.ex +++ b/explorer/lib/explorer_web/components/assets_cta.ex @@ -33,7 +33,7 @@ defmodule AssetsCTAComponent do ~H"""
<.card_background class="min-h-24 flex flex-col md:flex-row gap-y-1 justify-between p-4"> - <.link navigate="/operators" class="flex flex-col justify-start gap-0.5 group"> + <.link navigate={~p"/operators"} class="flex flex-col justify-start gap-0.5 group">

Total Operators @@ -47,7 +47,7 @@ defmodule AssetsCTAComponent do View all operators - <.link navigate="/assets" class="flex flex-col justify-start gap-0.5 group"> + <.link navigate={~p"/restakes"} class="flex flex-col justify-start gap-0.5 group">

Total Restaked 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 8deb037ae1..00028c53b9 100644 --- a/explorer/lib/explorer_web/live/pages/home/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/home/index.html.heex @@ -14,7 +14,7 @@ 0 <% end %> - <.card_link icon="hero-arrow-right-solid" navigate={~p"/assets"} title="Total ETH Restaked"> + <.card_link icon="hero-arrow-right-solid" navigate={~p"/restakes"} 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/assets/index.ex b/explorer/lib/explorer_web/live/pages/restakes/index.ex similarity index 92% rename from explorer/lib/explorer_web/live/pages/assets/index.ex rename to explorer/lib/explorer_web/live/pages/restakes/index.ex index 366fd97638..abac77a76e 100644 --- a/explorer/lib/explorer_web/live/pages/assets/index.ex +++ b/explorer/lib/explorer_web/live/pages/restakes/index.ex @@ -1,4 +1,4 @@ -defmodule ExplorerWeb.Assets.Index do +defmodule ExplorerWeb.Restakes.Index do use ExplorerWeb, :live_view @impl true @@ -20,7 +20,7 @@ defmodule ExplorerWeb.Assets.Index do def render(assigns) do ~H"""
- <.card_preheding>Assets + <.card_preheding>Restaked Assets <.live_component module={AssetsCTAComponent} id="assets_cta" /> <.table id="assets" rows={@assets}> <:col :let={asset} label="Token" class="text-left"> diff --git a/explorer/lib/explorer_web/router.ex b/explorer/lib/explorer_web/router.ex index 946b51e435..7573c95e9c 100644 --- a/explorer/lib/explorer_web/router.ex +++ b/explorer/lib/explorer_web/router.ex @@ -22,7 +22,7 @@ defmodule ExplorerWeb.Router do live "/", Home.Index live "/batches/:merkle_root", Batch.Index live "/batches", Batches.Index - live "/assets", Assets.Index + live "/restakes", Restakes.Index live "/operators", Operators.Index live "/operators/:address", Operator.Index end From 6eb9292a41887aa4a81e52e9742edc417e0d17ed Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 17:16:46 -0300 Subject: [PATCH 138/201] refactor: add _interface_ to token contract managers --- Makefile | 2 +- .../contract_managers/avs_directory_manager.ex | 7 ------- .../{erc20_manager.ex => erc20_interface_manager.ex} | 6 +++--- .../{strategy.ex => strategy_interface_manager.ex} | 10 +++++----- explorer/lib/explorer/models/strategies.ex | 6 +++--- 5 files changed, 12 insertions(+), 19 deletions(-) rename explorer/lib/explorer/contract_managers/{erc20_manager.ex => erc20_interface_manager.ex} (58%) rename explorer/lib/explorer/contract_managers/{strategy.ex => strategy_interface_manager.ex} (81%) diff --git a/Makefile b/Makefile index fca03653cb..a59f58fc66 100644 --- a/Makefile +++ b/Makefile @@ -663,4 +663,4 @@ explorer_fetch_old_batches: explorer_fetch_old_operators_strategies_restakes: @cd explorer && \ ./scripts/fetch_old_operators_strategies_restakes.sh 1728056 -# ./scripts/fetch_old_operators.sh 0 or 1728056 +# ./scripts/fetch_old_operators.sh 0 (devnet) or 1728056 (testnet) diff --git a/explorer/lib/explorer/contract_managers/avs_directory_manager.ex b/explorer/lib/explorer/contract_managers/avs_directory_manager.ex index 63776ee3d4..6ee5259ff7 100644 --- a/explorer/lib/explorer/contract_managers/avs_directory_manager.ex +++ b/explorer/lib/explorer/contract_managers/avs_directory_manager.ex @@ -22,13 +22,6 @@ defmodule AVSDirectoryManager 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) - use Ethers.Contract, abi_file: "lib/abi/AVSDirectory.json", default_address: @avs_directory_address diff --git a/explorer/lib/explorer/contract_managers/erc20_manager.ex b/explorer/lib/explorer/contract_managers/erc20_interface_manager.ex similarity index 58% rename from explorer/lib/explorer/contract_managers/erc20_manager.ex rename to explorer/lib/explorer/contract_managers/erc20_interface_manager.ex index bc851b918f..735fc38901 100644 --- a/explorer/lib/explorer/contract_managers/erc20_manager.ex +++ b/explorer/lib/explorer/contract_managers/erc20_interface_manager.ex @@ -1,4 +1,4 @@ -defmodule ERC20Manager do +defmodule ERC20InterfaceManager do use Ethers.Contract, abi_file: "lib/abi/IERC20Metadata.json" @@ -6,13 +6,13 @@ defmodule ERC20Manager do {:ok, "ETH"} end def symbol(address) do - ERC20Manager.symbol() |> Ethers.call(to: address) + ERC20InterfaceManager.symbol() |> Ethers.call(to: address) end def name("0x") do {:ok, "Native ETH"} end def name(address) do - ERC20Manager.name() |> Ethers.call(to: address) + ERC20InterfaceManager.name() |> Ethers.call(to: address) end end diff --git a/explorer/lib/explorer/contract_managers/strategy.ex b/explorer/lib/explorer/contract_managers/strategy_interface_manager.ex similarity index 81% rename from explorer/lib/explorer/contract_managers/strategy.ex rename to explorer/lib/explorer/contract_managers/strategy_interface_manager.ex index 3a923897d5..c99cb4cea8 100644 --- a/explorer/lib/explorer/contract_managers/strategy.ex +++ b/explorer/lib/explorer/contract_managers/strategy_interface_manager.ex @@ -1,13 +1,13 @@ -defmodule Strategy do +defmodule StrategyInterfaceManager 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 + case StrategyInterfaceManager.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 + %{strategy | token_address: "0x"} #storing "0x" as its token address, and handling its cases in ERC20InterfaceManager {:ok, token_address} -> %{strategy | token_address: token_address} @@ -23,7 +23,7 @@ defmodule Strategy do end def fetch_token_name(%Strategies{token_address: token_address} = strategy) do - case ERC20Manager.name(token_address) do + case ERC20InterfaceManager.name(token_address) do {:ok, name} -> %{strategy | name: name} error -> dbg("Error fetching token name") @@ -36,7 +36,7 @@ defmodule Strategy do end def fetch_token_symbol(%Strategies{token_address: token_address} = strategy) do - case ERC20Manager.symbol(token_address) do + case ERC20InterfaceManager.symbol(token_address) do {:ok, symbol} -> %{strategy | symbol: symbol} error -> dbg("Error fetching token symbol") diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex index 9d54c66f51..1cda111f29 100644 --- a/explorer/lib/explorer/models/strategies.ex +++ b/explorer/lib/explorer/models/strategies.ex @@ -45,9 +45,9 @@ defmodule Strategies do def extract_info(strategy_address) do %Strategies{strategy_address: strategy_address} - |> Strategy.fetch_token_address() - |> Strategy.fetch_token_name() - |> Strategy.fetch_token_symbol() + |> StrategyInterfaceManager.fetch_token_address() + |> StrategyInterfaceManager.fetch_token_name() + |> StrategyInterfaceManager.fetch_token_symbol() # Total stake is set when inserting rows to `Restakings` table (?) end From ecd717d14d5e06d98e7d85278736efe8fd759261 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 17:33:58 -0300 Subject: [PATCH 139/201] feat: add operator id and copy to clipboard --- .../explorer_web/live/pages/operator/index.ex | 21 +++++++++++++++++++ explorer/lib/explorer_web/live/utils.ex | 5 +++++ 2 files changed, 26 insertions(+) diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex index 5a04179f26..86427a2506 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -14,6 +14,7 @@ defmodule ExplorerWeb.Operator.Index do {:ok, assign(socket, operator: operator, + operator_id: operator.id |> Utils.binary_to_hex_string(), restaked_amount_eth: restaked_amount_eth, restakes_by_operator: restakes_by_operator, page_title: operator.name @@ -64,12 +65,32 @@ defmodule ExplorerWeb.Operator.Index do

<.divider class="my-2 sm:mt-5 sm:mb-3" /> +
+

+ Id: +

+

+ <%= @operator_id %> + <.live_component + module={CopyToClipboardButtonComponent} + text_to_copy={@operator_id} + id={"copy_#{@operator_id}"} + class="inline-flex" + /> +

+

Address:

<%= @operator.address %> + <.live_component + module={CopyToClipboardButtonComponent} + text_to_copy={@operator.address} + id={"copy_#{@operator.address}"} + class="inline-flex" + />

diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex index 0aaae6f2a5..2c36bf3ce7 100644 --- a/explorer/lib/explorer_web/live/utils.ex +++ b/explorer/lib/explorer_web/live/utils.ex @@ -113,6 +113,11 @@ defmodule ExplorerWeb.Utils do _ -> "http://localhost:4000" end end + + def binary_to_hex_string(binary) do + hex_string = binary |> Base.encode16(case: :lower) + "0x" <> hex_string + end end # Backend utils From 796f3722bb875c216ca65c4e9783aeeea0280dd8 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 17:52:09 -0300 Subject: [PATCH 140/201] feat: periodically process info from this pr --- explorer/lib/explorer/periodically.ex | 34 ++++++++++++++++----------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index 3df2e63c66..a269185367 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -8,17 +8,30 @@ defmodule Explorer.Periodically do def init(_) do send_work() - {:ok, 0} + {:ok, %{batches_count: 0, restakings_last_read_block: 0}} end def send_work() do - # once per block - seconds = 12 - # send every n seconds - :timer.send_interval(seconds * 1000, :work) + seconds = 12 * 1000 # once per block + seconds_in_an_hour = 60 * 60 + + :timer.send_interval(seconds, :batches) # every 12 seconds + :timer.send_interval(seconds * seconds_in_an_hour, :restakings) #every 12 hours end - def handle_info(:work, count) do + def handle_info(:restakings, state) do + last_read_block = Map.get(state, :restakings_last_read_block) + latest_block_number = AlignedLayerServiceManager.get_latest_block_number() + + process_quorum_strategy_changes() + process_operators(last_read_block) + process_restaking_changes(last_read_block) + + {:noreply, %{state | restakings_last_read_block: latest_block_number}} + end + + def handle_info(:batches, state) do + count = Map.get(state, :batches_count) # Reads and process last n blocks for new batches or batch changes read_block_qty = 8 latest_block_number = AlignedLayerServiceManager.get_latest_block_number() @@ -30,16 +43,9 @@ 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_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) - # process_quorum_strategy_changes() - # process_restaking_changes(0) - - {:noreply, new_count} + {:noreply, %{state | batches_count: new_count}} end def process_batches(fromBlock, toBlock) do From 70c54a725b17ea6abcd8fba3662d26cf32745bf8 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:28:57 -0300 Subject: [PATCH 141/201] feat: add restake detail view --- .../explorer_web/live/pages/restake/index.ex | 75 +++++++++++++++++++ explorer/lib/explorer_web/router.ex | 1 + 2 files changed, 76 insertions(+) create mode 100644 explorer/lib/explorer_web/live/pages/restake/index.ex diff --git a/explorer/lib/explorer_web/live/pages/restake/index.ex b/explorer/lib/explorer_web/live/pages/restake/index.ex new file mode 100644 index 0000000000..7d2b0c0199 --- /dev/null +++ b/explorer/lib/explorer_web/live/pages/restake/index.ex @@ -0,0 +1,75 @@ +defmodule ExplorerWeb.Restake.Index do + use ExplorerWeb, :live_view + + @impl true + def mount(%{"address" => address}, _, socket) do + restake = Strategies.get_by_strategy_address(address) + + restaked_amount_eth = restake.total_staked |> EthConverter.wei_to_eth(2) + + dbg(restake) + + {:ok, + assign(socket, + restake: restake, + restaked_amount_eth: restaked_amount_eth, + page_title: "Restake #{address}" + )} + end + + @impl true + def render(assigns) do + ~H""" +
+ <.card_preheding> + Restaked Asset 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 [&>p]:break-all [&>*]:font-normal [&>div]:flex [&>div]:flex-col [&>div]:lg:flex-row [&>div>h3]:basis-1/4" + > +
+

+ Name: +

+

+ <%= @restake.name %> +

+
+
+

+ Symbol: +

+

+ <%= @restake.symbol %> +

+
+
+

+ Total Restaked: +

+

+ <%= @restaked_amount_eth %> ETH +

+
+
+

+ Strategy Address: +

+

+ <%= @restake.strategy_address %> +

+
+
+

+ Token Address: +

+

+ <%= @restake.token_address %> +

+
+ +
+ """ + end +end diff --git a/explorer/lib/explorer_web/router.ex b/explorer/lib/explorer_web/router.ex index 7573c95e9c..08dfcbf3f4 100644 --- a/explorer/lib/explorer_web/router.ex +++ b/explorer/lib/explorer_web/router.ex @@ -23,6 +23,7 @@ defmodule ExplorerWeb.Router do live "/batches/:merkle_root", Batch.Index live "/batches", Batches.Index live "/restakes", Restakes.Index + live "/restakes/:address", Restake.Index live "/operators", Operators.Index live "/operators/:address", Operator.Index end From f4da578d8b8e44e564aa257864e97fa824c15981 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:29:58 -0300 Subject: [PATCH 142/201] refactor: rename frontend utils to helpers avoiding confusion with backend utils --- explorer/lib/explorer/models/operators.ex | 2 +- explorer/lib/explorer_web.ex | 2 +- explorer/lib/explorer_web/live/pages/batch/index.ex | 2 +- .../lib/explorer_web/live/pages/batch/index.html.heex | 8 ++++---- .../lib/explorer_web/live/pages/batches/index.html.heex | 6 +++--- explorer/lib/explorer_web/live/pages/home/index.html.heex | 6 +++--- explorer/lib/explorer_web/live/pages/operator/index.ex | 4 ++-- explorer/lib/explorer_web/live/pages/restakes/index.ex | 8 +++----- explorer/lib/explorer_web/live/utils.ex | 5 ++--- 9 files changed, 20 insertions(+), 23 deletions(-) diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex index a90f0c4bd2..6be42a6427 100644 --- a/explorer/lib/explorer/models/operators.ex +++ b/explorer/lib/explorer/models/operators.ex @@ -82,7 +82,7 @@ defmodule Operators do 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 + operator_metadata = case Helpers.fetch_eigen_operator_metadata(operator_url) do {:ok, operator_metadata} -> operator_metadata diff --git a/explorer/lib/explorer_web.ex b/explorer/lib/explorer_web.ex index 73a172fe00..10e9d889ee 100644 --- a/explorer/lib/explorer_web.ex +++ b/explorer/lib/explorer_web.ex @@ -93,7 +93,7 @@ defmodule ExplorerWeb do # Shortcut for generating JS commands alias Phoenix.LiveView.JS - alias ExplorerWeb.Utils + alias ExplorerWeb.Helpers # Routes generation with the ~p sigil unquote(verified_routes()) diff --git a/explorer/lib/explorer_web/live/pages/batch/index.ex b/explorer/lib/explorer_web/live/pages/batch/index.ex index 45bb1499c5..388ddb7595 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.ex +++ b/explorer/lib/explorer_web/live/pages/batch/index.ex @@ -26,7 +26,7 @@ defmodule ExplorerWeb.Batch.Index do proof_hashes: :empty, network: System.get_env("ENVIRONMENT"), site_url: System.get_env("PHX_HOST"), - page_title: Utils.shorten_hash(merkle_root), + page_title: Helpers.shorten_hash(merkle_root), eth_usd_price: case Cachex.get(:eth_price_cache, :eth_price) do {:ok, eth_usd_price} -> diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index 2df2e21aa3..a5af1596fc 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -84,7 +84,7 @@ } class="hover:text-foreground/80" > - <%= @current_batch.submission_block_number |> Utils.format_number() %> + <%= @current_batch.submission_block_number |> Helpers.format_number() %>
@@ -105,7 +105,7 @@ Submission Timestamp:

- <%= @current_batch.submission_timestamp |> Utils.parse_timestamp() %> + <%= @current_batch.submission_timestamp |> Helpers.parse_timestamp() %>

<%= if @current_batch.is_verified do %> @@ -126,7 +126,7 @@ href={"https://#{@network |> String.replace(~r/holesky/, "holesky.") |> String.replace(~r/mainnet/, "")}etherscan.io/block/#{@current_batch.response_block_number}"} class="hover:text-foreground/80" > - <%= @current_batch.response_block_number |> Utils.format_number() %> + <%= @current_batch.response_block_number |> Helpers.format_number() %>
@@ -147,7 +147,7 @@ Response Timestamp:

- <%= @current_batch.response_timestamp |> Utils.parse_timestamp() %> + <%= @current_batch.response_timestamp |> Helpers.parse_timestamp() %>

<% end %> 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 a35b703471..7e0b7faa88 100644 --- a/explorer/lib/explorer_web/live/pages/batches/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batches/index.html.heex @@ -7,7 +7,7 @@ - <%= Utils.shorten_hash(batch.merkle_root, 6) %> + <%= Helpers.shorten_hash(batch.merkle_root, 6) %> <.right_arrow /> <.tooltip> <%= batch.merkle_root %> @@ -20,11 +20,11 @@ <:col :let={batch} label="Age"> - <%= batch.submission_timestamp |> Utils.parse_timeago() %> + <%= batch.submission_timestamp |> Helpers.parse_timeago() %> <:col :let={batch} label="Submission Block Number"> - <%= batch.submission_block_number |> Utils.format_number() %> + <%= batch.submission_block_number |> Helpers.format_number() %> <% else %> 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 00028c53b9..a1a296124f 100644 --- a/explorer/lib/explorer_web/live/pages/home/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/home/index.html.heex @@ -23,14 +23,14 @@ <.card title="verified batches"> <%= if @verified_batches != :empty do %> - <%= @verified_batches |> Utils.format_number() %> + <%= @verified_batches |> Helpers.format_number() %> <% else %> 0 <% end %> <.card title="Verified Proofs" class="-mt-0.5 md:mt-0"> <%= if @verified_proofs != :empty do %> - <%= @verified_proofs |> Utils.format_number() %> + <%= @verified_proofs |> Helpers.format_number() %> <% else %> 0 <% end %> @@ -51,7 +51,7 @@ <%= for batch <- @latest_batches do %> <.link class="flex justify-between group" navigate={~p"/batches/#{batch}"}> - <%= Utils.shorten_hash(batch) %> + <%= Helpers.shorten_hash(batch) %> <.right_arrow /> <.tooltip> diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex index 86427a2506..ba5a872391 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -14,7 +14,7 @@ defmodule ExplorerWeb.Operator.Index do {:ok, assign(socket, operator: operator, - operator_id: operator.id |> Utils.binary_to_hex_string(), + operator_id: operator.id |> Helpers.binary_to_hex_string(), restaked_amount_eth: restaked_amount_eth, restakes_by_operator: restakes_by_operator, page_title: operator.name @@ -54,7 +54,7 @@ defmodule ExplorerWeb.Operator.Index do <.a href={ - "#{Utils.get_eigenlayer_explorer_url()}/operator/#{@operator.address}" + "#{Helpers.get_eigenlayer_explorer_url()}/operator/#{@operator.address}" } target="_blank" rel="noopener" diff --git a/explorer/lib/explorer_web/live/pages/restakes/index.ex b/explorer/lib/explorer_web/live/pages/restakes/index.ex index abac77a76e..5c69ab1a3a 100644 --- a/explorer/lib/explorer_web/live/pages/restakes/index.ex +++ b/explorer/lib/explorer_web/live/pages/restakes/index.ex @@ -24,15 +24,13 @@ defmodule ExplorerWeb.Restakes.Index do <.live_component module={AssetsCTAComponent} id="assets_cta" /> <.table id="assets" rows={@assets}> <:col :let={asset} label="Token" class="text-left"> -
+ <.link navigate={~p"/restakes/#{asset.strategy_address}"} class="flex gap-x-2 items-center"> <%= asset.name %>

<%= asset.symbol %>

-
- <.tooltip> - <%= asset.token_address %> - + <.right_arrow /> + <:col :let={asset} label="Total ETH Restaked"> <%= if asset.total_staked != nil do %> diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex index 2c36bf3ce7..e2818059ac 100644 --- a/explorer/lib/explorer_web/live/utils.ex +++ b/explorer/lib/explorer_web/live/utils.ex @@ -1,5 +1,5 @@ # Frontend Utils -defmodule ExplorerWeb.Utils do +defmodule ExplorerWeb.Helpers do def shorten_hash(hash, decimals \\ 6) do case String.length(hash) do n when n < decimals -> hash @@ -115,8 +115,7 @@ defmodule ExplorerWeb.Utils do end def binary_to_hex_string(binary) do - hex_string = binary |> Base.encode16(case: :lower) - "0x" <> hex_string + Utils.binary_to_hex_string(binary) end end From ca861c1ddd048c5dd2dc6456dba409e6d8e3616e Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:45:11 -0300 Subject: [PATCH 143/201] fix: Utils.fetch_eigen_operator_metadata --- explorer/lib/explorer/models/operators.ex | 2 +- explorer/mix.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex index 6be42a6427..a90f0c4bd2 100644 --- a/explorer/lib/explorer/models/operators.ex +++ b/explorer/lib/explorer/models/operators.ex @@ -82,7 +82,7 @@ defmodule Operators do operator_id = RegistryCoordinatorManager.get_operator_id_from_chain(operator_address) operator_url = DelegationManager.get_operator_url(operator_address) dbg operator_url - operator_metadata = case Helpers.fetch_eigen_operator_metadata(operator_url) do + operator_metadata = case Utils.fetch_eigen_operator_metadata(operator_url) do {:ok, operator_metadata} -> operator_metadata diff --git a/explorer/mix.lock b/explorer/mix.lock index 02ea1769ac..fa946a0a53 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 28872408fd820a272dec800fec7f390b0834ae7f Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:54:10 -0300 Subject: [PATCH 144/201] feat: add links to etherscan and eigen site --- .../lib/explorer_web/components/contracts.ex | 4 +-- .../components/core_components.ex | 2 +- .../live/pages/batch/index.html.heex | 8 +++--- .../explorer_web/live/pages/restake/index.ex | 26 +++++++++++++------ explorer/lib/explorer_web/live/utils.ex | 16 ++++++++++++ 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/explorer/lib/explorer_web/components/contracts.ex b/explorer/lib/explorer_web/components/contracts.ex index 141f29d7eb..a783b1772f 100644 --- a/explorer/lib/explorer_web/components/contracts.ex +++ b/explorer/lib/explorer_web/components/contracts.ex @@ -35,7 +35,7 @@ defmodule ContractsComponent do <.icon name="hero-cpu-chip" class="size-4 mb-0.5" /> Service Manager: <.a - href={"https://#{@network |> String.replace(~r/holesky/, "holesky.") |> String.replace(~r/mainnet/, "")}etherscan.io/address/#{@service_manager_address}"} + href={"#{Helpers.get_etherescan_url()}/address/#{@service_manager_address}"} class="hover:text-foreground/80" target="_blank" rel="noopener noreferrer" @@ -46,7 +46,7 @@ defmodule ContractsComponent do <.icon name="hero-wallet" class="size-4 mb-0.5" /> Batcher Payment Service: <.a - href={"https://#{@network |> String.replace(~r/holesky/, "holesky.") |> String.replace(~r/mainnet/, "")}etherscan.io/address/#{@batcher_payment_service_address}"} + href={"#{Helpers.get_etherescan_url()}/address/#{@batcher_payment_service_address}"} class="hover:text-foreground/80" target="_blank" rel="noopener noreferrer" diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex index 851d76bc7b..42e5426b8c 100644 --- a/explorer/lib/explorer_web/components/core_components.ex +++ b/explorer/lib/explorer_web/components/core_components.ex @@ -369,7 +369,7 @@ defmodule ExplorerWeb.CoreComponents do ~H""" <.link class={[ - "underline underline-offset-4 font-medium flex items-center gap-1", + "underline underline-offset-4 font-medium flex items-center gap-1 hover:text-foreground/80", @class ]} {@rest} diff --git a/explorer/lib/explorer_web/live/pages/batch/index.html.heex b/explorer/lib/explorer_web/live/pages/batch/index.html.heex index a5af1596fc..5841e9587a 100644 --- a/explorer/lib/explorer_web/live/pages/batch/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/batch/index.html.heex @@ -80,7 +80,7 @@ target="_blank" rel="noopener" href={ - "https://#{@network |> String.replace(~r/holesky/, "holesky.") |> String.replace(~r/mainnet/, "")}etherscan.io/block/#{@current_batch.submission_block_number}" + "#{Helpers.get_etherescan_url()}/block/#{@current_batch.submission_block_number}" } class="hover:text-foreground/80" > @@ -94,7 +94,7 @@ <.a target="_blank" rel="noopener" - href={"https://#{@network |> String.replace(~r/holesky/, "holesky.") |> String.replace(~r/mainnet/, "")}etherscan.io/tx/#{@current_batch.submission_transaction_hash}"} + href={"#{Helpers.get_etherescan_url()}/tx/#{@current_batch.submission_transaction_hash}"} class="hover:text-foreground/80" > <%= @current_batch.submission_transaction_hash %> @@ -123,7 +123,7 @@ <.a target="_blank" rel="noopener" - href={"https://#{@network |> String.replace(~r/holesky/, "holesky.") |> String.replace(~r/mainnet/, "")}etherscan.io/block/#{@current_batch.response_block_number}"} + href={"#{Helpers.get_etherescan_url()}/block/#{@current_batch.response_block_number}"} class="hover:text-foreground/80" > <%= @current_batch.response_block_number |> Helpers.format_number() %> @@ -136,7 +136,7 @@ <.a target="_blank" rel="noopener" - href={"https://#{@network |> String.replace(~r/holesky/, "holesky.") |> String.replace(~r/mainnet/, "")}etherscan.io/tx/#{@current_batch.response_transaction_hash}"} + href={"#{Helpers.get_etherescan_url()}/tx/#{@current_batch.response_transaction_hash}"} class="hover:text-foreground/80" > <%= @current_batch.response_transaction_hash %> diff --git a/explorer/lib/explorer_web/live/pages/restake/index.ex b/explorer/lib/explorer_web/live/pages/restake/index.ex index 7d2b0c0199..d4d0c50580 100644 --- a/explorer/lib/explorer_web/live/pages/restake/index.ex +++ b/explorer/lib/explorer_web/live/pages/restake/index.ex @@ -28,7 +28,7 @@ defmodule ExplorerWeb.Restake.Index do 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 [&>p]:break-all [&>*]:font-normal [&>div]:flex [&>div]:flex-col [&>div]:lg:flex-row [&>div>h3]:basis-1/4" > -
+

Name:

@@ -36,7 +36,7 @@ defmodule ExplorerWeb.Restake.Index do <%= @restake.name %>

-
+

Symbol:

@@ -44,9 +44,9 @@ defmodule ExplorerWeb.Restake.Index do <%= @restake.symbol %>

-
+

- Total Restaked: + Total Restaked:

<%= @restaked_amount_eth %> ETH @@ -56,17 +56,27 @@ defmodule ExplorerWeb.Restake.Index do

Strategy Address:

-

+ <.a + href={"#{Helpers.get_eigenlayer_explorer_url()}/restake/#{@restake.symbol}"} + class="text-foreground" + target="_blank" + rel="noopener noreferrer" + > <%= @restake.strategy_address %> -

+

Token Address:

-

+ <.a + href={"#{Helpers.get_etherescan_url()}/address/#{@restake.token_address}"} + class="text-foreground" + target="_blank" + rel="noopener noreferrer" + > <%= @restake.token_address %> -

+
diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex index e2818059ac..66d289e596 100644 --- a/explorer/lib/explorer_web/live/utils.ex +++ b/explorer/lib/explorer_web/live/utils.ex @@ -114,6 +114,22 @@ defmodule ExplorerWeb.Helpers do end end + @doc """ + Get the Etherscan URL based on the environment. + - `holesky` -> https://holesky.etherscan.io + - `mainnet` -> https://etherscan.io + - `default` -> http://localhost:4000 + """ + def get_etherescan_url() do + prefix = System.get_env("ENVIRONMENT") + + case prefix do + "mainnet" -> "https://etherscan.io" + "holesky" -> "https://holesky.etherscan.io" + _ -> "http://localhost:4000" + end + end + def binary_to_hex_string(binary) do Utils.binary_to_hex_string(binary) end From 750295f72853f5f60ac630a608b8dade4f43dc96 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:56:50 -0300 Subject: [PATCH 145/201] delete: strategyManager --- explorer/lib/abi/StrategyManager.json | 1 - .../contract_managers/strategy_manager.ex | 45 ------------------- 2 files changed, 46 deletions(-) delete mode 100644 explorer/lib/abi/StrategyManager.json delete mode 100644 explorer/lib/explorer/contract_managers/strategy_manager.ex diff --git a/explorer/lib/abi/StrategyManager.json b/explorer/lib/abi/StrategyManager.json deleted file mode 100644 index 67179897e3..0000000000 --- a/explorer/lib/abi/StrategyManager.json +++ /dev/null @@ -1 +0,0 @@ -{"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/strategy_manager.ex b/explorer/lib/explorer/contract_managers/strategy_manager.ex deleted file mode 100644 index 737a62fd55..0000000000 --- a/explorer/lib/explorer/contract_managers/strategy_manager.ex +++ /dev/null @@ -1,45 +0,0 @@ -defmodule StrategyManager do - require Logger - - @environment System.get_env("ENVIRONMENT") - - file_path = - "../contracts/script/output/#{@environment}/eigenlayer_deployment_output.json" - - {status, config_json_string} = File.read(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 - - @strategy_manager Jason.decode!(config_json_string) - |> Map.get("addresses") - |> Map.get("strategyManager") - - def get_strategy_manager() do - @strategy_manager - end - - 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 deposits") - dbg(error) - error - end - end -end From ca2e05d56b2aa60c48ef528834a6c03631f2ebed Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 18:57:08 -0300 Subject: [PATCH 146/201] chore: remove comments --- .../contract_managers/delegation_manager.ex | 8 -------- .../registry_coordinator_manager.ex | 13 ------------- .../contract_managers/stake_registry_manager.ex | 3 --- explorer/lib/explorer/models/strategies.ex | 1 - 4 files changed, 25 deletions(-) diff --git a/explorer/lib/explorer/contract_managers/delegation_manager.ex b/explorer/lib/explorer/contract_managers/delegation_manager.ex index ca1b7d0ffe..09abcfb7b7 100644 --- a/explorer/lib/explorer/contract_managers/delegation_manager.ex +++ b/explorer/lib/explorer/contract_managers/delegation_manager.ex @@ -1,14 +1,6 @@ defmodule DelegationManager 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 - @environment System.get_env("ENVIRONMENT") eigenlayer_output_file_path = diff --git a/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex b/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex index 10c38a3df3..3ce5c6aa01 100644 --- a/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex +++ b/explorer/lib/explorer/contract_managers/registry_coordinator_manager.ex @@ -44,16 +44,3 @@ 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/contract_managers/stake_registry_manager.ex b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex index e86f5d2e59..8c83fdac2d 100644 --- a/explorer/lib/explorer/contract_managers/stake_registry_manager.ex +++ b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex @@ -51,8 +51,6 @@ defmodule StakeRegistryManager do 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 @@ -88,4 +86,3 @@ defmodule StakeRegistryManager do end end - diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex index 1cda111f29..e0006117d6 100644 --- a/explorer/lib/explorer/models/strategies.ex +++ b/explorer/lib/explorer/models/strategies.ex @@ -78,7 +78,6 @@ defmodule Strategies do where: s.strategy_address == ^new_restaking.strategy_address, select: s) strategy = Explorer.Repo.one(query) - dbg strategy query = from(r in Restakings, where: r.strategy_address == ^new_restaking.strategy_address and r.operator_address == ^new_restaking.operator_address, From 931aaa379e65fd6d179501e318c1f1f970e43a8d Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 19:09:28 -0300 Subject: [PATCH 147/201] feat: add numbers formatting for eth values --- .../lib/explorer_web/components/assets_cta.ex | 2 +- .../live/pages/home/index.html.heex | 2 +- .../explorer_web/live/pages/operator/index.ex | 2 +- .../live/pages/operators/index.ex | 2 +- .../explorer_web/live/pages/restake/index.ex | 2 +- .../explorer_web/live/pages/restakes/index.ex | 2 +- explorer/lib/explorer_web/live/utils.ex | 42 +++++++++++++++---- 7 files changed, 40 insertions(+), 14 deletions(-) diff --git a/explorer/lib/explorer_web/components/assets_cta.ex b/explorer/lib/explorer_web/components/assets_cta.ex index 0579852107..baccea4a2e 100644 --- a/explorer/lib/explorer_web/components/assets_cta.ex +++ b/explorer/lib/explorer_web/components/assets_cta.ex @@ -55,7 +55,7 @@ defmodule AssetsCTAComponent do <.right_arrow />
- <%= @total_staked %> ETH + <%= @total_staked |> Helpers.format_number() %> ETH <.tooltip> View all restaked assets 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 a1a296124f..1560538542 100644 --- a/explorer/lib/explorer_web/live/pages/home/index.html.heex +++ b/explorer/lib/explorer_web/live/pages/home/index.html.heex @@ -16,7 +16,7 @@ <.card_link icon="hero-arrow-right-solid" navigate={~p"/restakes"} title="Total ETH Restaked"> <%= if @restaked_amount_eth != :nil and @restaked_amount_eth != :nil do %> - <%= @restaked_amount_eth %> + <%= @restaked_amount_eth |> Helpers.format_number() %> <% 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 ba5a872391..4042041afb 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -98,7 +98,7 @@ defmodule ExplorerWeb.Operator.Index do Total Restaked:

- <%= @restaked_amount_eth %> ETH + <%= @restaked_amount_eth |> Helpers.format_number() %> ETH

diff --git a/explorer/lib/explorer_web/live/pages/operators/index.ex b/explorer/lib/explorer_web/live/pages/operators/index.ex index e54c72da7a..80d296221a 100644 --- a/explorer/lib/explorer_web/live/pages/operators/index.ex +++ b/explorer/lib/explorer_web/live/pages/operators/index.ex @@ -43,7 +43,7 @@ defmodule ExplorerWeb.Operators.Index do <:col :let={operator} label="Total ETH Restaked"> <%= operator.total_stake - |> EthConverter.wei_to_eth(2) %> ETH + |> EthConverter.wei_to_eth(2) |> Helpers.format_number() %> ETH <:col :let={operator} label="Status"> <.dynamic_badge status={operator.is_active} truthy_text="Active" falsy_text="Inactive" /> diff --git a/explorer/lib/explorer_web/live/pages/restake/index.ex b/explorer/lib/explorer_web/live/pages/restake/index.ex index d4d0c50580..c18c975189 100644 --- a/explorer/lib/explorer_web/live/pages/restake/index.ex +++ b/explorer/lib/explorer_web/live/pages/restake/index.ex @@ -49,7 +49,7 @@ defmodule ExplorerWeb.Restake.Index do Total Restaked:

- <%= @restaked_amount_eth %> ETH + <%= @restaked_amount_eth |> Helpers.format_number() %> ETH

diff --git a/explorer/lib/explorer_web/live/pages/restakes/index.ex b/explorer/lib/explorer_web/live/pages/restakes/index.ex index 5c69ab1a3a..b222f063f1 100644 --- a/explorer/lib/explorer_web/live/pages/restakes/index.ex +++ b/explorer/lib/explorer_web/live/pages/restakes/index.ex @@ -34,7 +34,7 @@ defmodule ExplorerWeb.Restakes.Index do <:col :let={asset} label="Total ETH Restaked"> <%= if asset.total_staked != nil do %> - <%= asset.total_staked |> EthConverter.wei_to_eth(5) %> + <%= asset.total_staked |> EthConverter.wei_to_eth(3) |> Helpers.format_number() %> <% else %> N/A <% end %> diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex index 66d289e596..4d494811a3 100644 --- a/explorer/lib/explorer_web/live/utils.ex +++ b/explorer/lib/explorer_web/live/utils.ex @@ -84,15 +84,41 @@ defmodule ExplorerWeb.Helpers do end end - def format_number(number) when is_integer(number) do - number - |> Integer.to_string() - |> String.reverse() - |> String.graphemes() - |> Enum.chunk_every(3) - |> Enum.join(",") - |> String.reverse() +def format_number(number) when is_integer(number) do + do_format_number(Integer.to_string(number)) +end + +def format_number(number) when is_float(number) do + number + |> Float.to_string() + |> format_number() +end + +def format_number(number) when is_binary(number) do + case String.split(number, ".") do + [integer_part] -> + case Integer.parse(integer_part) do + {_int, ""} -> do_format_number(integer_part) + _ -> raise ArgumentError, "Invalid number string: #{inspect(number)}" + end + [integer_part, decimal_part] -> + case Integer.parse(integer_part) do + {_int, ""} -> do_format_number(integer_part) <> "." <> decimal_part + _ -> raise ArgumentError, "Invalid number string: #{inspect(number)}" + end + _ -> + raise ArgumentError, "Invalid number string: #{inspect(number)}" end +end + +defp do_format_number(number_string) do + number_string + |> String.reverse() + |> String.graphemes() + |> Enum.chunk_every(3) + |> Enum.join(",") + |> String.reverse() +end defp pad_leading_zero(value) do Integer.to_string(value) |> String.pad_leading(2, "0") From 012e7368a2de45a82d6c0c8468154cd85d7eab45 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 19:19:30 -0300 Subject: [PATCH 148/201] chore: polishing PR --- explorer/lib/explorer/models/operators.ex | 6 ------ explorer/lib/explorer/models/quorums.ex | 6 ++---- explorer/lib/explorer/models/restakings.ex | 4 ++-- explorer/lib/explorer/models/strategies.ex | 15 +++++++-------- explorer/lib/explorer/periodically.ex | 5 +++-- 5 files changed, 14 insertions(+), 22 deletions(-) diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex index a90f0c4bd2..a21738147c 100644 --- a/explorer/lib/explorer/models/operators.ex +++ b/explorer/lib/explorer/models/operators.ex @@ -41,9 +41,7 @@ defmodule Operators do Explorer.Repo.one(query) end - # TODO: add pagination def get_operators() do - # add sort query = from(o in Operators, select: o, order_by: [desc: o.total_stake]) Explorer.Repo.all(query) end @@ -81,7 +79,6 @@ defmodule Operators 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 @@ -114,14 +111,11 @@ defmodule Operators do end def get_operator_weight(%Operators{} = operator) do - dbg operator query = from(o in Operators, where: o.address == ^operator.address, select: o.total_stake) operator_stake = Explorer.Repo.one(query) - dbg operator_stake query = from(o in Operators, select: sum(o.total_stake)) total_stake = Explorer.Repo.one(query) - dbg total_stake Decimal.div(operator_stake, total_stake) end diff --git a/explorer/lib/explorer/models/quorums.ex b/explorer/lib/explorer/models/quorums.ex index 52c8ef5473..c667a54daf 100644 --- a/explorer/lib/explorer/models/quorums.ex +++ b/explorer/lib/explorer/models/quorums.ex @@ -9,9 +9,7 @@ defmodule Quorums do end def process_quorum_changes() do - our_quorums = get_all_quorums() - - Enum.each(our_quorums, &handle_quorum/1) + Enum.each(get_all_quorums(), &handle_quorum/1) end def handle_quorum(%Quorums{} = quorum) do @@ -33,7 +31,7 @@ defmodule Quorums do def insert_quorum_if_not_present(%Quorums{} = quorum) do case get_quorum_by_id(quorum.id) do nil -> - dbg "inserting quorum" + dbg "inserting new quorum" Explorer.Repo.insert(quorum) _ -> nil diff --git a/explorer/lib/explorer/models/restakings.ex b/explorer/lib/explorer/models/restakings.ex index aa7bb1a53f..533846b55c 100644 --- a/explorer/lib/explorer/models/restakings.ex +++ b/explorer/lib/explorer/models/restakings.ex @@ -16,8 +16,8 @@ defmodule Restakings do @doc false def changeset(restaking, attrs) do restaking - |> cast(attrs, [:operator_id, :operator_address, :stake, :quorum_number, :strategy_address]) - |> validate_required([:operator_id, :stake, :quorum_number, :strategy_address]) + |> 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 diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex index e0006117d6..fc0b29d594 100644 --- a/explorer/lib/explorer/models/strategies.ex +++ b/explorer/lib/explorer/models/strategies.ex @@ -3,7 +3,6 @@ defmodule Strategies do import Ecto.Changeset import Ecto.Query - schema "strategies" do field :strategy_address, :binary field :token_address, :binary @@ -18,10 +17,10 @@ defmodule Strategies do @doc false def changeset(strategy, attrs) do strategy - |> 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) + |> 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 @@ -33,7 +32,7 @@ defmodule Strategies do |> Enum.reject(&Strategies.get_by_strategy_address/1) |> Enum.map(&extract_info/1) |> Enum.reject(&is_nil/1) - |> Enum.map(&add_strategy/1) + |> Enum.each(&add_strategy/1) end def get_by_strategy_address(strategy_address) do @@ -48,11 +47,11 @@ defmodule Strategies do |> StrategyInterfaceManager.fetch_token_address() |> StrategyInterfaceManager.fetch_token_name() |> StrategyInterfaceManager.fetch_token_symbol() - # Total stake is set when inserting rows to `Restakings` table (?) + # Total stake is set when inserting values to `Restakings` table end def add_strategy(%Strategies{} = new_strategy) do - dbg("adding strategy") + dbg "adding strategy" Strategies.generate_changeset(new_strategy) |> Explorer.Repo.insert() end def add_strategy({:error, _error}) do diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index a269185367..552d366381 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -14,11 +14,12 @@ defmodule Explorer.Periodically do def send_work() do seconds = 12 * 1000 # once per block seconds_in_an_hour = 60 * 60 - + :timer.send_interval(seconds, :batches) # every 12 seconds :timer.send_interval(seconds * seconds_in_an_hour, :restakings) #every 12 hours end + # Reads and process last blocks for operators and restaking changes def handle_info(:restakings, state) do last_read_block = Map.get(state, :restakings_last_read_block) latest_block_number = AlignedLayerServiceManager.get_latest_block_number() @@ -30,9 +31,9 @@ defmodule Explorer.Periodically do {:noreply, %{state | restakings_last_read_block: latest_block_number}} end + # Reads and process last n blocks for new batches or batch changes def handle_info(:batches, state) do count = Map.get(state, :batches_count) - # Reads and process last n blocks for new batches or batch changes read_block_qty = 8 latest_block_number = AlignedLayerServiceManager.get_latest_block_number() read_from_block = max(0, latest_block_number - read_block_qty) From 5b51512aa9a6b3411932f8b3264cda0dc7c25a3a Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 19:23:49 -0300 Subject: [PATCH 149/201] chore: change and remove old comments --- explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex | 2 +- .../repo/migrations/20240719202751_add_strategies_table.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex b/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex index c0020e3177..bd38701dfb 100644 --- a/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex +++ b/explorer/lib/scripts/fetch_old_operators_strategies_restakes.ex @@ -1,6 +1,6 @@ defmodule Scripts.FetchOldOperatorsStrategiesRestakes do - # This Script is to fetch old operators from the blockchain activity + # This Script is to fetch old operators, strategies and restakes from the blockchain activity # and insert them into the Ecto database def run(fromBlock) do diff --git a/explorer/priv/repo/migrations/20240719202751_add_strategies_table.exs b/explorer/priv/repo/migrations/20240719202751_add_strategies_table.exs index 29f5da90a5..4e2b693c37 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: 30, scale: 0, default: 0 #TODO check if it is being updated on inserting new restake + add :total_staked, :decimal, precision: 30, scale: 0, default: 0 timestamps() end From fcaa4c2a2324b2a58bf0b8e5988897ea6d1071f7 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 19:41:39 -0300 Subject: [PATCH 150/201] feat: get_operators_with_their_weights --- explorer/lib/explorer/models/operators.ex | 12 ++++++++++++ .../lib/explorer_web/live/pages/operators/index.ex | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/explorer/lib/explorer/models/operators.ex b/explorer/lib/explorer/models/operators.ex index a21738147c..d783e2b211 100644 --- a/explorer/lib/explorer/models/operators.ex +++ b/explorer/lib/explorer/models/operators.ex @@ -46,6 +46,18 @@ defmodule Operators do Explorer.Repo.all(query) end + def get_operators_with_their_weights() do + total_stake = Explorer.Repo.one(from(o in Operators, select: sum(o.total_stake))) + + get_operators() |> + Enum.map( + fn operator -> + weight = Decimal.div(operator.total_stake, total_stake) + Map.from_struct(operator) |> Map.put(:weight, weight) + end + ) + end + def get_amount_of_operators do query = from( o in Operators, diff --git a/explorer/lib/explorer_web/live/pages/operators/index.ex b/explorer/lib/explorer_web/live/pages/operators/index.ex index 80d296221a..51bedb132e 100644 --- a/explorer/lib/explorer_web/live/pages/operators/index.ex +++ b/explorer/lib/explorer_web/live/pages/operators/index.ex @@ -3,7 +3,7 @@ defmodule ExplorerWeb.Operators.Index do @impl true def handle_info(_, socket) do - operators = Operators.get_operators() + operators = Operators.get_operators_with_their_weights() {:noreply, assign(socket, operators: operators)} end @@ -14,7 +14,7 @@ defmodule ExplorerWeb.Operators.Index do @impl true def handle_params(_params, _url, socket) do - operators = Operators.get_operators() + operators = Operators.get_operators_with_their_weights() {:noreply, assign(socket, operators: operators)} end From f6cc509af8ed91728cb4ebae09f788fee9d534c6 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 19:48:54 -0300 Subject: [PATCH 151/201] fix: improve details ui --- .../explorer_web/live/pages/operator/index.ex | 15 ++++++++------ .../explorer_web/live/pages/restake/index.ex | 20 +++++++++++-------- .../explorer_web/live/pages/restakes/index.ex | 2 +- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex index 4042041afb..b06e6ec939 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -106,13 +106,16 @@ defmodule ExplorerWeb.Operator.Index do Restakes: <%= if @restakes_by_operator != [] do %> -
+
<%= for %{strategy: strategy, restaking: restaking} <- @restakes_by_operator do %> -
- <%= strategy.name %> (<%= strategy.symbol %>) <%= EthConverter.wei_to_eth( - restaking.stake, - 3 - ) %> ETH +
+

+ <%= strategy.name %> + <%= strategy.symbol %> +

+

+ <%= EthConverter.wei_to_eth(restaking.stake, 2) |> Helpers.format_number() %> ETH +

<% end %>
diff --git a/explorer/lib/explorer_web/live/pages/restake/index.ex b/explorer/lib/explorer_web/live/pages/restake/index.ex index c18c975189..57b46c4d80 100644 --- a/explorer/lib/explorer_web/live/pages/restake/index.ex +++ b/explorer/lib/explorer_web/live/pages/restake/index.ex @@ -69,14 +69,18 @@ defmodule ExplorerWeb.Restake.Index do

Token Address:

- <.a - href={"#{Helpers.get_etherescan_url()}/address/#{@restake.token_address}"} - class="text-foreground" - target="_blank" - rel="noopener noreferrer" - > - <%= @restake.token_address %> - + <%= if @restake.token_address != "0x" do %> + <.a + href={"#{Helpers.get_etherescan_url()}/address/#{@restake.token_address}"} + class="text-foreground" + target="_blank" + rel="noopener noreferrer" + > + <%= @restake.token_address %> + + <% else %> +

N/A

+ <% end %>
diff --git a/explorer/lib/explorer_web/live/pages/restakes/index.ex b/explorer/lib/explorer_web/live/pages/restakes/index.ex index b222f063f1..a453d455ef 100644 --- a/explorer/lib/explorer_web/live/pages/restakes/index.ex +++ b/explorer/lib/explorer_web/live/pages/restakes/index.ex @@ -24,7 +24,7 @@ defmodule ExplorerWeb.Restakes.Index do <.live_component module={AssetsCTAComponent} id="assets_cta" /> <.table id="assets" rows={@assets}> <:col :let={asset} label="Token" class="text-left"> - <.link navigate={~p"/restakes/#{asset.strategy_address}"} class="flex gap-x-2 items-center"> + <.link navigate={~p"/restakes/#{asset.strategy_address}"} class="flex gap-x-2 items-center group-hover:text-foreground/80"> <%= asset.name %>

<%= asset.symbol %> From 116a4a2e5afee69567ab1ed77490707737447012 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 19:56:59 -0300 Subject: [PATCH 152/201] chore: remove dbg --- explorer/lib/explorer_web/live/pages/operator/index.ex | 2 -- 1 file changed, 2 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex index 4042041afb..594d10ec6a 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -5,8 +5,6 @@ defmodule ExplorerWeb.Operator.Index do def mount(%{"address" => address}, _, socket) do operator = Operators.get_operator_by_address(address) - Operators.get_operator_weight(operator) |> dbg - restaked_amount_eth = operator.total_stake |> EthConverter.wei_to_eth(2) restakes_by_operator = Restakings.get_restakes_by_operator_id(operator.id) From 79213f70a338d0262b44e469faa9c07fe08c8292 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:18:11 -0300 Subject: [PATCH 153/201] fix: bug on has_operator_changed_staking, not taking into account operators who restaked only once --- .../lib/explorer/contract_managers/stake_registry_manager.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/explorer/lib/explorer/contract_managers/stake_registry_manager.ex b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex index 8c83fdac2d..f53d418a04 100644 --- a/explorer/lib/explorer/contract_managers/stake_registry_manager.ex +++ b/explorer/lib/explorer/contract_managers/stake_registry_manager.ex @@ -38,7 +38,7 @@ defmodule StakeRegistryManager do |> Ethers.get_logs(fromBlock: fromBlock) |> case do {:ok, data} -> - {operator_id, operator_address, Enum.count(data) > 1} + {operator_id, operator_address, Enum.count(data) > 0} {:error, reason} -> dbg("Error getting latest operator stake update") From da81029c1ba3942ee3d714b173017086df425cd6 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:24:16 -0300 Subject: [PATCH 154/201] feat: add concentration % --- contracts/lib/eigenlayer-middleware | 2 +- .../components/core_components.ex | 4 +- explorer/lib/explorer_web/live/numbers.ex | 65 +++++++++++++++++++ .../live/pages/operators/index.ex | 13 ++-- explorer/lib/explorer_web/live/utils.ex | 36 +--------- 5 files changed, 79 insertions(+), 41 deletions(-) create mode 100644 explorer/lib/explorer_web/live/numbers.ex diff --git a/contracts/lib/eigenlayer-middleware b/contracts/lib/eigenlayer-middleware index 5494282c7f..1273f59e42 160000 --- a/contracts/lib/eigenlayer-middleware +++ b/contracts/lib/eigenlayer-middleware @@ -1 +1 @@ -Subproject commit 5494282c7f6a194e70c56d2c9d912be498555a50 +Subproject commit 1273f59e42c9c4b9be1c33623c4ad6b0771d594a diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex index 42e5426b8c..70772a1b4e 100644 --- a/explorer/lib/explorer_web/components/core_components.ex +++ b/explorer/lib/explorer_web/components/core_components.ex @@ -395,7 +395,7 @@ defmodule ExplorerWeb.CoreComponents do "px-3 py-1 rounded-full", case @status do true -> "text-accent-foreground bg-accent group-hover:bg-primary/80" - false -> "text-background bg-foreground group-hover:bg-secondary/80" + false -> "text-background bg-foreground group-hover:bg-foreground/80" end, @class ]}> @@ -865,7 +865,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-popover border border-muted-foreground/30 rounded-full shadow-sm drop-shadow-sm", + "px-2.5 py-1 text-sm text-foreground bg-popover border border-muted-foreground/30 rounded-full shadow-sm drop-shadow-sm", @class ]} role="tooltip" diff --git a/explorer/lib/explorer_web/live/numbers.ex b/explorer/lib/explorer_web/live/numbers.ex new file mode 100644 index 0000000000..0521dc4216 --- /dev/null +++ b/explorer/lib/explorer_web/live/numbers.ex @@ -0,0 +1,65 @@ +defmodule Numbers do + def format_number(number) when is_integer(number) do + do_format_number(Integer.to_string(number)) + end + + def format_number(number) when is_float(number) do + number + |> Float.to_string() + |> format_number() + end + + def format_number(number) when is_binary(number) do + case String.split(number, ".") do + [integer_part] -> + case Integer.parse(integer_part) do + {_int, ""} -> do_format_number(integer_part) + _ -> raise ArgumentError, "Invalid number string: #{inspect(number)}" + end + + [integer_part, decimal_part] -> + case Integer.parse(integer_part) do + {_int, ""} -> do_format_number(integer_part) <> "." <> decimal_part + _ -> raise ArgumentError, "Invalid number string: #{inspect(number)}" + end + + _ -> + raise ArgumentError, "Invalid number string: #{inspect(number)}" + end + end + + defp do_format_number(number_string) do + number_string + |> String.reverse() + |> String.graphemes() + |> Enum.chunk_every(3) + |> Enum.join(",") + |> String.reverse() + end + + def show_percentage(%Decimal{} = weight) do + weight + |> Decimal.mult(100) + |> Decimal.round(2) + |> Decimal.to_string(:normal) + |> Kernel.<>("%") + end + + def show_percentage(weight) when is_float(weight) do + weight + |> Decimal.from_float() + |> show_percentage() + end + + def show_percentage(weight) when is_binary(weight) do + weight + |> Decimal.new() + |> show_percentage() + end + + def show_percentage(weight) when is_integer(weight) do + weight + |> Decimal.new() + |> show_percentage() + end +end diff --git a/explorer/lib/explorer_web/live/pages/operators/index.ex b/explorer/lib/explorer_web/live/pages/operators/index.ex index 51bedb132e..d69cc8425a 100644 --- a/explorer/lib/explorer_web/live/pages/operators/index.ex +++ b/explorer/lib/explorer_web/live/pages/operators/index.ex @@ -15,6 +15,7 @@ defmodule ExplorerWeb.Operators.Index do @impl true def handle_params(_params, _url, socket) do operators = Operators.get_operators_with_their_weights() + {:noreply, assign(socket, operators: operators)} end @@ -35,15 +36,19 @@ defmodule ExplorerWeb.Operators.Index do /> <%= operator.name %> <.right_arrow /> - <.tooltip> - <%= operator.address %> + <.tooltip class="rounded-3xl"> + Id: <%= operator.id |> Helpers.binary_to_hex_string() %> +
+ Addr: <%= operator.address %> + <:col :let={operator} label="Restake Concentration"> + <%= operator.weight |> Numbers.show_percentage() %> + <:col :let={operator} label="Total ETH Restaked"> - <%= operator.total_stake - |> EthConverter.wei_to_eth(2) |> Helpers.format_number() %> ETH + <%= operator.total_stake |> EthConverter.wei_to_eth(2) |> Helpers.format_number() %> ETH <:col :let={operator} label="Status"> <.dynamic_badge status={operator.is_active} truthy_text="Active" falsy_text="Inactive" /> diff --git a/explorer/lib/explorer_web/live/utils.ex b/explorer/lib/explorer_web/live/utils.ex index 4d494811a3..e666370ed2 100644 --- a/explorer/lib/explorer_web/live/utils.ex +++ b/explorer/lib/explorer_web/live/utils.ex @@ -84,41 +84,9 @@ defmodule ExplorerWeb.Helpers do end end -def format_number(number) when is_integer(number) do - do_format_number(Integer.to_string(number)) -end - -def format_number(number) when is_float(number) do - number - |> Float.to_string() - |> format_number() -end - -def format_number(number) when is_binary(number) do - case String.split(number, ".") do - [integer_part] -> - case Integer.parse(integer_part) do - {_int, ""} -> do_format_number(integer_part) - _ -> raise ArgumentError, "Invalid number string: #{inspect(number)}" - end - [integer_part, decimal_part] -> - case Integer.parse(integer_part) do - {_int, ""} -> do_format_number(integer_part) <> "." <> decimal_part - _ -> raise ArgumentError, "Invalid number string: #{inspect(number)}" - end - _ -> - raise ArgumentError, "Invalid number string: #{inspect(number)}" + def format_number(number) do + Numbers.format_number(number) end -end - -defp do_format_number(number_string) do - number_string - |> String.reverse() - |> String.graphemes() - |> Enum.chunk_every(3) - |> Enum.join(",") - |> String.reverse() -end defp pad_leading_zero(value) do Integer.to_string(value) |> String.pad_leading(2, "0") From 43f43da55738a75cc5719a28e0065aeb8650654c Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:31:58 -0300 Subject: [PATCH 155/201] feat: add concentration in detail view --- .../lib/explorer_web/live/pages/operator/index.ex | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex index 631095ac72..2972bc70df 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -9,12 +9,15 @@ defmodule ExplorerWeb.Operator.Index do restakes_by_operator = Restakings.get_restakes_by_operator_id(operator.id) + weight = Operators.get_operator_weight(operator) |> Numbers.show_percentage() + {:ok, assign(socket, operator: operator, operator_id: operator.id |> Helpers.binary_to_hex_string(), restaked_amount_eth: restaked_amount_eth, restakes_by_operator: restakes_by_operator, + weight: weight, page_title: operator.name )} end @@ -99,6 +102,14 @@ defmodule ExplorerWeb.Operator.Index do <%= @restaked_amount_eth |> Helpers.format_number() %> ETH

+
+

+ Concentration Restaked: +

+

+ <%= @weight %> +

+

Restakes: From 8a3eb1932042706f1f219a8a51e3be74995adb93 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:48:35 -0300 Subject: [PATCH 156/201] feat: add live action updates --- explorer/lib/explorer/models/strategies.ex | 7 +++++++ explorer/lib/explorer/periodically.ex | 2 ++ .../explorer_web/live/pages/operator/index.ex | 18 ++++++++++++++++++ .../explorer_web/live/pages/operators/index.ex | 1 + .../explorer_web/live/pages/restake/index.ex | 12 +++++++++++- .../explorer_web/live/pages/restakes/index.ex | 14 +++++++++++++- 6 files changed, 52 insertions(+), 2 deletions(-) diff --git a/explorer/lib/explorer/models/strategies.ex b/explorer/lib/explorer/models/strategies.ex index fc0b29d594..74bbb342ab 100644 --- a/explorer/lib/explorer/models/strategies.ex +++ b/explorer/lib/explorer/models/strategies.ex @@ -42,6 +42,13 @@ defmodule Strategies do Explorer.Repo.one(query) end + def get_total_staked(strategy_address) do + query = from(s in Strategies, + where: s.strategy_address == ^strategy_address, + select: s.total_staked) + Explorer.Repo.one(query) + end + def extract_info(strategy_address) do %Strategies{strategy_address: strategy_address} |> StrategyInterfaceManager.fetch_token_address() diff --git a/explorer/lib/explorer/periodically.ex b/explorer/lib/explorer/periodically.ex index 552d366381..235f9f1b5b 100644 --- a/explorer/lib/explorer/periodically.ex +++ b/explorer/lib/explorer/periodically.ex @@ -27,6 +27,8 @@ defmodule Explorer.Periodically do process_quorum_strategy_changes() process_operators(last_read_block) process_restaking_changes(last_read_block) + PubSub.broadcast(Explorer.PubSub, "update_restakings", %{}) + {:noreply, %{state | restakings_last_read_block: latest_block_number}} end diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex index 2972bc70df..9e5abfb3d0 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -1,6 +1,22 @@ defmodule ExplorerWeb.Operator.Index do use ExplorerWeb, :live_view + @impl true + def handle_info(_, socket) do + restaked_amount_eth = socket.assigns.operator.total_stake |> EthConverter.wei_to_eth(2) + + restakes_by_operator = Restakings.get_restakes_by_operator_id(socket.assigns.operator.id) + + weight = Operators.get_operator_weight(socket.assigns.operator) |> Numbers.show_percentage() + + {:ok, + assign(socket, + restaked_amount_eth: restaked_amount_eth, + restakes_by_operator: restakes_by_operator, + weight: weight + )} + end + @impl true def mount(%{"address" => address}, _, socket) do operator = Operators.get_operator_by_address(address) @@ -11,6 +27,8 @@ defmodule ExplorerWeb.Operator.Index do weight = Operators.get_operator_weight(operator) |> Numbers.show_percentage() + if connected?(socket), do: Phoenix.PubSub.subscribe(Explorer.PubSub, "update_restakings") + {:ok, assign(socket, operator: operator, diff --git a/explorer/lib/explorer_web/live/pages/operators/index.ex b/explorer/lib/explorer_web/live/pages/operators/index.ex index d69cc8425a..aa086451ff 100644 --- a/explorer/lib/explorer_web/live/pages/operators/index.ex +++ b/explorer/lib/explorer_web/live/pages/operators/index.ex @@ -9,6 +9,7 @@ defmodule ExplorerWeb.Operators.Index do @impl true def mount(_, _, socket) do + if connected?(socket), do: Phoenix.PubSub.subscribe(Explorer.PubSub, "update_restakings") {:ok, assign(socket, page_title: "Operators")} end diff --git a/explorer/lib/explorer_web/live/pages/restake/index.ex b/explorer/lib/explorer_web/live/pages/restake/index.ex index 57b46c4d80..fab848b013 100644 --- a/explorer/lib/explorer_web/live/pages/restake/index.ex +++ b/explorer/lib/explorer_web/live/pages/restake/index.ex @@ -1,13 +1,23 @@ defmodule ExplorerWeb.Restake.Index do use ExplorerWeb, :live_view + @impl true + def handle_info(_, socket) do + restaked_amount_eth = socket.assigns.restake.strategy_address |> Strategies.get_total_staked() + + {:ok, + assign(socket, + restaked_amount_eth: restaked_amount_eth + )} + end + @impl true def mount(%{"address" => address}, _, socket) do restake = Strategies.get_by_strategy_address(address) restaked_amount_eth = restake.total_staked |> EthConverter.wei_to_eth(2) - dbg(restake) + if connected?(socket), do: Phoenix.PubSub.subscribe(Explorer.PubSub, "update_restakings") {:ok, assign(socket, diff --git a/explorer/lib/explorer_web/live/pages/restakes/index.ex b/explorer/lib/explorer_web/live/pages/restakes/index.ex index a453d455ef..ed026ed467 100644 --- a/explorer/lib/explorer_web/live/pages/restakes/index.ex +++ b/explorer/lib/explorer_web/live/pages/restakes/index.ex @@ -1,8 +1,17 @@ defmodule ExplorerWeb.Restakes.Index do use ExplorerWeb, :live_view + @impl true + def handle_info(_, socket) do + assets = Strategies.get_all_strategies() + + {:noreply, assign(socket, assets: assets)} + end + @impl true def mount(_, _, socket) do + if connected?(socket), do: Phoenix.PubSub.subscribe(Explorer.PubSub, "update_restakings") + {:ok, assign(socket, page_title: "Restaked Assets")} end @@ -24,7 +33,10 @@ defmodule ExplorerWeb.Restakes.Index do <.live_component module={AssetsCTAComponent} id="assets_cta" /> <.table id="assets" rows={@assets}> <:col :let={asset} label="Token" class="text-left"> - <.link navigate={~p"/restakes/#{asset.strategy_address}"} class="flex gap-x-2 items-center group-hover:text-foreground/80"> + <.link + navigate={~p"/restakes/#{asset.strategy_address}"} + class="flex gap-x-2 items-center group-hover:text-foreground/80" + > <%= asset.name %>

<%= asset.symbol %> From c96d3c5d5704d5d442ae3fdb59aebe6fda332b33 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:53:55 -0300 Subject: [PATCH 157/201] fix: replace :ok for :no_reply in handle_info --- explorer/lib/explorer_web/live/pages/operator/index.ex | 2 +- explorer/lib/explorer_web/live/pages/restake/index.ex | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex index 9e5abfb3d0..c10a9554bb 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -9,7 +9,7 @@ defmodule ExplorerWeb.Operator.Index do weight = Operators.get_operator_weight(socket.assigns.operator) |> Numbers.show_percentage() - {:ok, + {:noreply, assign(socket, restaked_amount_eth: restaked_amount_eth, restakes_by_operator: restakes_by_operator, diff --git a/explorer/lib/explorer_web/live/pages/restake/index.ex b/explorer/lib/explorer_web/live/pages/restake/index.ex index fab848b013..a1c8accaae 100644 --- a/explorer/lib/explorer_web/live/pages/restake/index.ex +++ b/explorer/lib/explorer_web/live/pages/restake/index.ex @@ -3,9 +3,9 @@ defmodule ExplorerWeb.Restake.Index do @impl true def handle_info(_, socket) do - restaked_amount_eth = socket.assigns.restake.strategy_address |> Strategies.get_total_staked() + restaked_amount_eth = socket.assigns.restake.strategy_address |> Strategies.get_total_staked() |> EthConverter.wei_to_eth(2) - {:ok, + {:noreply, assign(socket, restaked_amount_eth: restaked_amount_eth )} From 9e4c9ae2f30dc71767049685c3fa1f417c4c8281 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Tue, 13 Aug 2024 21:04:59 -0300 Subject: [PATCH 158/201] fix: remove clipboard warn --- explorer/lib/explorer_web/components/clipboard.ex | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/explorer/lib/explorer_web/components/clipboard.ex b/explorer/lib/explorer_web/components/clipboard.ex index 76be8dd419..f871a183a4 100644 --- a/explorer/lib/explorer_web/components/clipboard.ex +++ b/explorer/lib/explorer_web/components/clipboard.ex @@ -1,12 +1,9 @@ defmodule CopyToClipboardButtonComponent do use ExplorerWeb, :live_component - attr :text_to_copy, :string, required: true - attr :class, :string, default: nil - @impl true - def mount(socket) do - {:ok, assign(socket, text_to_copy: @text_to_copy)} + def update(assigns, socket) do + {:ok, assign(socket, text_to_copy: assigns.text_to_copy, class: assigns.class)} end @impl true @@ -25,7 +22,9 @@ defmodule CopyToClipboardButtonComponent do ]} phx-hook="CopyToClipboard" data-clipboard-text={@text_to_copy} - id="copy-to-clipboard" + id={"copy-to-clipboard-" <> @text_to_copy} + phx-target={@myself} + phx-click="copied" > <.icon name="hero-clipboard" class="size-3" /> Copy to clipboard From 408985ce093befda081c24856de5a41ea76318d7 Mon Sep 17 00:00:00 2001 From: Urix <43704209+uri-99@users.noreply.github.com> Date: Thu, 15 Aug 2024 14:30:30 -0300 Subject: [PATCH 159/201] fix: add nil handling in format_number --- explorer/lib/explorer_web/live/numbers.ex | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/explorer/lib/explorer_web/live/numbers.ex b/explorer/lib/explorer_web/live/numbers.ex index 0521dc4216..a9da97fe56 100644 --- a/explorer/lib/explorer_web/live/numbers.ex +++ b/explorer/lib/explorer_web/live/numbers.ex @@ -1,4 +1,8 @@ defmodule Numbers do + def format_number(number) when is_nil(number) do + nil + end + def format_number(number) when is_integer(number) do do_format_number(Integer.to_string(number)) end From 4558377bad40a0b440ec0fe077682af20894bd6d Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Thu, 15 Aug 2024 17:20:50 -0300 Subject: [PATCH 160/201] fix(operator-detail): address mobile overflow --- explorer/lib/explorer_web/live/pages/operator/index.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/explorer/lib/explorer_web/live/pages/operator/index.ex b/explorer/lib/explorer_web/live/pages/operator/index.ex index c10a9554bb..16e9134031 100644 --- a/explorer/lib/explorer_web/live/pages/operator/index.ex +++ b/explorer/lib/explorer_web/live/pages/operator/index.ex @@ -98,7 +98,7 @@ defmodule ExplorerWeb.Operator.Index do />

-
+

Address:

@@ -135,7 +135,7 @@ defmodule ExplorerWeb.Operator.Index do <%= if @restakes_by_operator != [] do %>
<%= for %{strategy: strategy, restaking: restaking} <- @restakes_by_operator do %> -
+

<%= strategy.name %> <%= strategy.symbol %> From aaacfcc36a738f54a9beff6926689905f3df9c84 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Thu, 15 Aug 2024 18:31:33 -0300 Subject: [PATCH 161/201] feat: add hamburger menu for mobile --- .../components/core_components.ex | 2 +- explorer/lib/explorer_web/components/nav.ex | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/explorer/lib/explorer_web/components/core_components.ex b/explorer/lib/explorer_web/components/core_components.ex index 70772a1b4e..07c3a6b085 100644 --- a/explorer/lib/explorer_web/components/core_components.ex +++ b/explorer/lib/explorer_web/components/core_components.ex @@ -257,7 +257,7 @@ defmodule ExplorerWeb.CoreComponents do def root_background(assigns) do ~H""" -

+
<%= render_slot(@inner_block) %>
""" diff --git a/explorer/lib/explorer_web/components/nav.ex b/explorer/lib/explorer_web/components/nav.ex index 26036fb772..828590af26 100644 --- a/explorer/lib/explorer_web/components/nav.ex +++ b/explorer/lib/explorer_web/components/nav.ex @@ -44,8 +44,49 @@ defmodule NavComponent do GitHub + +
""" end + + def toggle_menu() do + JS.toggle(to: "#menu-overlay") + |> JS.toggle(to: ".toggle-open") + |> JS.toggle(to: ".toggle-close") + end end From a41fce0d66e6cfdbf1ba9adc4ccf983022531d69 Mon Sep 17 00:00:00 2001 From: Gian <58370608+glpecile@users.noreply.github.com> Date: Thu, 15 Aug 2024 18:39:38 -0300 Subject: [PATCH 162/201] style: add animation to hamburger menu --- explorer/lib/explorer_web/components/nav.ex | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/explorer/lib/explorer_web/components/nav.ex b/explorer/lib/explorer_web/components/nav.ex index 828590af26..de7bc7d3be 100644 --- a/explorer/lib/explorer_web/components/nav.ex +++ b/explorer/lib/explorer_web/components/nav.ex @@ -45,15 +45,19 @@ defmodule NavComponent do -