Source code for curvesim.templates.sim_pool

from abc import ABC, abstractmethod

from curvesim.logging import get_logger

logger = get_logger(__name__)


[docs]class SimPool(ABC): """ The interface that must be implemented by pools used in simulations. See curvesim.pool.sim_interface for implementations. """
[docs] def prepare_for_trades(self, timestamp): """ Does any necessary preparation before computing and doing trades. The input timestamp can be used to fetch any auxiliary data needed to prep the state. Base implementation is a no-op. Parameters ---------- timestamp : datetime.datetime the time to sample from """
[docs] def prepare_for_run(self, prices): """ Does any necessary preparation before beginning a simulation run. Base implementation is a no-op. Parameters ---------- timestamp : pandas.DataFrame The price time_series, price_sampler.prices. """
[docs] @abstractmethod def price(self, coin_in, coin_out, use_fee=True): """ Returns the spot price of `coin_in` quoted in terms of `coin_out`, i.e. the ratio of output coin amount to input coin amount for an "infinitesimally" small trade. Coin IDs should be strings but as a legacy feature integer indices corresponding to the pool implementation are allowed (caveat lector). The indices are assumed to include base pool underlyer indices. Parameters ---------- coin_in : str, int ID of coin to be priced; in a swapping context, this is the "in"-token. coin_out : str, int ID of quote currency; in a swapping context, this is the "out"-token. use_fee: bool, default=True Deduct fees. Returns ------- float Price of `coin_in` quoted in `coin_out` """ raise NotImplementedError
[docs] @abstractmethod def trade(self, coin_in, coin_out, size): """ Perform an exchange between two coins. Coin IDs should be strings but as a legacy feature integer indices corresponding to the pool implementation are allowed (caveat lector). Note that all amounts are normalized to be in the same units as pool value, e.g. for Curve Stableswap pools, the same units as `D`. This simplifies cross-token comparisons and creation of metrics. Parameters ---------- coin_in : str, int ID of "in" coin. coin_out : str, int ID of "out" coin. size : int Amount of coin `i` being exchanged. Returns ------- (int, int) (amount of coin `j` received, trading fee) """ raise NotImplementedError
[docs] @abstractmethod def get_max_trade_size(self, coin_in, coin_out, out_balance_perc): """ Calculate the swap amount of the "in" coin needed to leave the specified percentage of the "out" coin. Parameters ---------- coin_in : str, int ID of "in" coin. coin_out : str, int ID of "out" coin. out_balance_perc : float Percentage of the "out" coin balance that should remain after doing the swap. Returns ------- int The amount of "in" coin needed. """ raise NotImplementedError
[docs] def get_min_trade_size(self, coin_in): """ Return the minimal trade size allowed for the pool. Parameters ---------- coin_in : str, int ID of "in" coin. Returns ------- int The minimal trade size """ raise NotImplementedError