parent
240ad0a33c
commit
2be2577e82
@ -0,0 +1,84 @@ |
||||
defmodule Explorer.Staking.PoolsReader do |
||||
@moduledoc """ |
||||
Reads staking pools using Smart Contract functions from the blockchain. |
||||
""" |
||||
alias Explorer.SmartContract.Reader |
||||
|
||||
@spec get_pools() :: [String.t()] |
||||
def get_pools do |
||||
get_active_pools() ++ get_inactive_pools() |
||||
end |
||||
|
||||
@spec get_active_pools() :: [String.t()] |
||||
def get_active_pools do |
||||
{:ok, [active_pools]} = call_staking_method("getPools", []) |
||||
active_pools |
||||
end |
||||
|
||||
@spec get_inactive_pools() :: [String.t()] |
||||
def get_inactive_pools do |
||||
{:ok, [inactive_pools]} = call_staking_method("getPoolsInactive", []) |
||||
inactive_pools |
||||
end |
||||
|
||||
@spec pool_data(String.t()) :: {:ok, map()} | :error |
||||
def pool_data(staking_address) do |
||||
with {:ok, [mining_address]} <- call_validators_method("miningByStakingAddress", [staking_address]), |
||||
{:ok, [is_active]} <- call_staking_method("isPoolActive", [staking_address]), |
||||
{:ok, [delegator_addresses]} <- call_staking_method("poolDelegators", [staking_address]), |
||||
{:ok, [staked_amount]} <- call_staking_method("stakeAmountTotalMinusOrderedWithdraw", [staking_address]), |
||||
{:ok, [is_validator]} <- call_validators_method("isValidator", [mining_address]), |
||||
{:ok, [was_validator_count]} <- call_validators_method("validatorCounter", [mining_address]), |
||||
{:ok, [is_banned]} <- call_validators_method("isValidatorBanned", [mining_address]), |
||||
{:ok, [banned_unitil]} <- call_validators_method("bannedUntil", [mining_address]), |
||||
{:ok, [was_banned_count]} <- call_validators_method("banCounter", [mining_address]) do |
||||
{ |
||||
:ok, |
||||
%{ |
||||
staking_address: staking_address, |
||||
mining_address: mining_address, |
||||
is_active: is_active, |
||||
delegator_addresses: delegator_addresses, |
||||
staked_amount: staked_amount, |
||||
is_validator: is_validator, |
||||
was_validator_count: was_validator_count, |
||||
is_banned: is_banned, |
||||
banned_unitil: banned_unitil, |
||||
was_banned_count: was_banned_count |
||||
} |
||||
} |
||||
else |
||||
_ -> |
||||
:error |
||||
end |
||||
end |
||||
|
||||
defp call_staking_method(method, params) do |
||||
%{^method => resp} = |
||||
Reader.query_contract(config(:staking_contract_address), abi("staking.json"), %{ |
||||
method => params |
||||
}) |
||||
|
||||
resp |
||||
end |
||||
|
||||
defp call_validators_method(method, params) do |
||||
%{^method => resp} = |
||||
Reader.query_contract(config(:validators_contract_address), abi("validators.json"), %{ |
||||
method => params |
||||
}) |
||||
|
||||
resp |
||||
end |
||||
|
||||
defp config(key) do |
||||
Application.get_env(:explorer, __MODULE__, [])[key] |
||||
end |
||||
|
||||
defp abi(file_name) do |
||||
:explorer |
||||
|> Application.app_dir("priv/contracts_abi/pos/#{file_name}") |
||||
|> File.read!() |
||||
|> Jason.decode!() |
||||
end |
||||
end |
Loading…
Reference in new issue