Packages
tai
0.0.13
0.0.75
0.0.74
0.0.73
0.0.72
0.0.71
0.0.70
0.0.69
0.0.68
0.0.67
0.0.66
0.0.65
0.0.64
0.0.63
0.0.62
0.0.61
0.0.60
0.0.59
0.0.58
0.0.57
0.0.56
0.0.55
0.0.54
0.0.53
0.0.52
0.0.51
0.0.50
0.0.49
0.0.48
0.0.47
0.0.46
0.0.45
0.0.44
0.0.43
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.29
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
A composable, real time, market data and trade execution toolkit
Current section
Files
Jump to
Current section
Files
lib/tai/venues/boot/fees.ex
defmodule Tai.Venues.Boot.Fees do
@type adapter :: Tai.Venues.Adapter.t()
@type product :: Tai.Venues.Product.t()
@spec hydrate(adapter :: adapter, products :: [product]) :: :ok | {:error, reason :: term}
def hydrate(adapter, products) do
adapter.accounts
|> Enum.map(&fee_schedules(&1, adapter))
|> Enum.reduce(:ok, &upsert_for_account(&1, &2, adapter.id, products))
end
defp fee_schedules({account_id, _}, adapter) do
schedule_result = Tai.Venue.maker_taker_fees(adapter, account_id)
{schedule_result, account_id}
end
defp upsert_for_account({{:ok, schedule}, account_id}, :ok, adapter_id, products) do
Enum.each(
products,
&upsert_product(&1, adapter_id, account_id, schedule)
)
:ok
end
defp upsert_for_account({{:error, _} = error, _}, _, _, _), do: error
defp upsert_product(product, adapter_id, account_id, {maker, taker}) do
lowest_maker = lowest_fee(product.maker_fee, maker)
lowest_taker = lowest_fee(product.taker_fee, taker)
upsert_product(product, adapter_id, account_id, lowest_maker, lowest_taker)
end
defp upsert_product(product, adapter_id, account_id, nil) do
upsert_product(product, adapter_id, account_id, product.maker_fee, product.taker_fee)
end
defp upsert_product(product, adapter_id, account_id, maker, taker) do
%Tai.Venues.FeeInfo{
exchange_id: adapter_id,
account_id: account_id,
symbol: product.symbol,
maker: maker,
maker_type: :percent,
taker: taker,
taker_type: :percent
}
|> Tai.Venues.FeeStore.upsert()
end
defp lowest_fee(%Decimal{} = product, %Decimal{} = schedule), do: Decimal.min(product, schedule)
defp lowest_fee(nil, %Decimal{} = schedule), do: schedule
end