commit
8e66349ace
@ -0,0 +1,89 @@ |
|||||||
|
defmodule Explorer.ChainSpec.POA.Importer do |
||||||
|
@moduledoc """ |
||||||
|
Imports emission reward range for POA chain. |
||||||
|
""" |
||||||
|
|
||||||
|
require Logger |
||||||
|
|
||||||
|
alias Explorer.Chain.Wei |
||||||
|
alias Explorer.Repo |
||||||
|
alias Explorer.SmartContract.Reader |
||||||
|
alias Explorer.Chain.Block.{EmissionReward, Range} |
||||||
|
alias Explorer.ChainSpec.GenesisData |
||||||
|
|
||||||
|
@block_reward_amount_abi %{ |
||||||
|
"type" => "function", |
||||||
|
"stateMutability" => "view", |
||||||
|
"payable" => false, |
||||||
|
"outputs" => [%{"type" => "uint256", "name" => ""}], |
||||||
|
"name" => "blockRewardAmount", |
||||||
|
"inputs" => [], |
||||||
|
"constant" => true |
||||||
|
} |
||||||
|
@block_reward_amount_params %{"blockRewardAmount" => []} |
||||||
|
@emission_funds_amount_abi %{ |
||||||
|
"type" => "function", |
||||||
|
"stateMutability" => "view", |
||||||
|
"payable" => false, |
||||||
|
"outputs" => [%{"type" => "uint256", "name" => ""}], |
||||||
|
"name" => "emissionFundsAmount", |
||||||
|
"inputs" => [], |
||||||
|
"constant" => true |
||||||
|
} |
||||||
|
@emission_funds_amount_params %{"emissionFundsAmount" => []} |
||||||
|
@emission_funds_block_start 5_098_087 |
||||||
|
|
||||||
|
def import_emission_rewards do |
||||||
|
if is_nil(rewards_contract_address()) do |
||||||
|
Logger.warn(fn -> "No rewards contract address is defined" end) |
||||||
|
else |
||||||
|
block_reward = block_reward_amount() |
||||||
|
emission_funds = emission_funds_amount() |
||||||
|
|
||||||
|
rewards = [ |
||||||
|
%{ |
||||||
|
block_range: %Range{from: 0, to: @emission_funds_block_start}, |
||||||
|
reward: %Wei{value: block_reward} |
||||||
|
}, |
||||||
|
%{ |
||||||
|
block_range: %Range{from: @emission_funds_block_start + 1, to: :infinity}, |
||||||
|
reward: %Wei{value: Decimal.add(block_reward, emission_funds)} |
||||||
|
} |
||||||
|
] |
||||||
|
|
||||||
|
{_, nil} = Repo.delete_all(EmissionReward) |
||||||
|
{_, nil} = Repo.insert_all(EmissionReward, rewards) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
def block_reward_amount do |
||||||
|
call_contract(rewards_contract_address(), @block_reward_amount_abi, @block_reward_amount_params) |
||||||
|
end |
||||||
|
|
||||||
|
def emission_funds_amount do |
||||||
|
call_contract(rewards_contract_address(), @emission_funds_amount_abi, @emission_funds_amount_params) |
||||||
|
end |
||||||
|
|
||||||
|
defp rewards_contract_address do |
||||||
|
Application.get_env(:explorer, GenesisData)[:rewards_contract_address] |
||||||
|
end |
||||||
|
|
||||||
|
defp call_contract(address, abi, params) do |
||||||
|
abi = [abi] |
||||||
|
|
||||||
|
method_name = |
||||||
|
params |
||||||
|
|> Enum.map(fn {key, _value} -> key end) |
||||||
|
|> List.first() |
||||||
|
|
||||||
|
Reader.query_contract(address, abi, params) |
||||||
|
|
||||||
|
value = |
||||||
|
case Reader.query_contract(address, abi, params) do |
||||||
|
%{^method_name => {:ok, [result]}} -> result |
||||||
|
_ -> 0 |
||||||
|
end |
||||||
|
|
||||||
|
Decimal.new(value) |
||||||
|
end |
||||||
|
end |
Loading…
Reference in new issue