Packages
kujira
0.1.7
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.74
0.1.73
0.1.72
0.1.71
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Elixir interfaces to Kujira dApps, for building indexers, APIs and bots
Current section
Files
Jump to
Current section
Files
lib/kujira/orca/queue.ex
defmodule Kujira.Orca.Queue do
@moduledoc """
An individual Orca Liquidation Queue
## Fields
* `:address` - The contract address
* `:owner` - The account authorized to make changes to contract config
* `:collateral_token` - The token that is being liquidated
* `:bid_token` - The token that is used to buy the collateral
* `:bid_pools` - The aggregate amounts of bids at each supported discount amount. The contract confug contains `max_slot` and `premium_rate_per_slot`, which define these pools
* `:activation_threshold` - The total amount of bids, above which the activation_delay must pass before a bid can be activated. This is `bid_threshold` on the contract interfaace
* `:activation_delay` - The time in seconds that must pass before a bid can be activated. This is `waiting_period` on the contract interface
"""
alias Kujira.Token
alias Kujira.Orca.Pool
defstruct [
:address,
:owner,
:collateral_token,
:bid_token,
:bid_pools,
:activation_threshold,
:activation_delay,
:liquidation_fee,
:withdrawal_fee
]
@type t :: %__MODULE__{
address: String.t(),
owner: String.t(),
bid_token: Token.t(),
bid_pools: list(Pool.t()),
collateral_token: Token.t(),
activation_threshold: integer(),
activation_delay: integer(),
liquidation_fee: Decimal.t(),
withdrawal_fee: Decimal.t()
}
@spec from_config(String.t(), map()) :: {:ok, __MODULE__.t()} | :error
def from_config(address, %{
"bid_denom" => bid_denom,
"bid_threshold" => bid_threshold,
"closed_slots" => _closed_slots,
"collateral_denom" => collateral_denom,
"fee_address" => _fee_address,
"liquidation_fee" => liquidation_fee,
"markets" => _markets,
"max_slot" => max_slot,
"owner" => owner,
"premium_rate_per_slot" => premium_rate_per_slot,
"waiting_period" => waiting_period,
"withdrawal_fee" => withdrawal_fee
}) do
with {activation_threshold, ""} <- Integer.parse(bid_threshold),
{liquidation_fee, ""} <- Decimal.parse(liquidation_fee),
{premium_rate_per_slot, ""} <- Decimal.parse(premium_rate_per_slot),
{withdrawal_fee, ""} <- Decimal.parse(withdrawal_fee) do
{:ok,
%__MODULE__{
address: address,
owner: owner,
collateral_token: Token.from_denom(collateral_denom),
bid_token: Token.from_denom(bid_denom),
bid_pools: [],
activation_threshold: activation_threshold,
activation_delay: waiting_period,
liquidation_fee: liquidation_fee,
withdrawal_fee: withdrawal_fee
}
|> populate_pools(max_slot, premium_rate_per_slot)}
else
_ ->
:error
end
end
@doc """
Enumerates all bid pools based on contract config
"""
@spec populate_pools(__MODULE__.t(), integer(), Decimal.t()) :: __MODULE__.t()
def populate_pools(queue, max_slot, premium_rate_per_slot) do
%{
queue
| bid_pools:
0..max_slot
|> Enum.to_list()
|> Enum.map(&Pool.calculate(premium_rate_per_slot, &1))
}
end
@doc """
Assigns the current state to the bd_pools from a direct contract query response
"""
@spec load_pools(list(map()), __MODULE__.t()) :: __MODULE__.t()
def load_pools(pools, queue) do
%{
queue
| bid_pools:
Enum.map(queue.bid_pools, fn pool ->
pools
|> Enum.find(
&(&1["premium_rate"]
|> Decimal.parse()
|> elem(0)
|> Decimal.eq?(pool.premium))
)
|> Pool.load(pool)
end)
}
end
end