mango-explorer/mango/createmarketoperations.py

118 lines
4.4 KiB
Python
Raw Normal View History

2021-06-25 02:33:40 -07:00
# # ⚠ Warning
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
# LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# [🥭 Mango Markets](https://mango.markets/) support is available at:
# [Docs](https://docs.mango.markets/)
# [Discord](https://discord.gg/67jySBhxrg)
# [Twitter](https://twitter.com/mangomarkets)
# [Github](https://github.com/blockworks-foundation)
# [Email](mailto:hello@blockworks.foundation)
import typing
2021-06-25 02:33:40 -07:00
from .account import Account
2021-06-25 02:33:40 -07:00
from .context import Context
from .ensuremarketloaded import ensure_market_loaded
2021-06-25 02:33:40 -07:00
from .market import Market
from .marketoperations import (
MarketInstructionBuilder,
MarketOperations,
NullMarketInstructionBuilder,
NullMarketOperations,
)
from .perpmarketoperations import PerpMarketInstructionBuilder, PerpMarketOperations
from .perpmarket import PerpMarket
from .serummarket import SerumMarket
from .serummarketoperations import SerumMarketInstructionBuilder, SerumMarketOperations
from .spotmarket import SpotMarket
from .spotmarketoperations import SpotMarketInstructionBuilder, SpotMarketOperations
2021-06-25 02:33:40 -07:00
from .wallet import Wallet
# # 🥭 create_market_instruction_builder
2021-06-25 02:33:40 -07:00
#
# This function deals with the creation of a `MarketInstructionBuilder` object for a given `Market`.
#
def create_market_instruction_builder(
context: Context,
wallet: Wallet,
account: Account,
market: Market,
dry_run: bool = False,
) -> MarketInstructionBuilder:
if dry_run:
return NullMarketInstructionBuilder(market.symbol)
loaded_market: Market = ensure_market_loaded(context, market)
if isinstance(loaded_market, SerumMarket):
return SerumMarketInstructionBuilder.load(context, wallet, loaded_market)
elif isinstance(loaded_market, SpotMarket):
return SpotMarketInstructionBuilder.load(
context, wallet, loaded_market, loaded_market.group, account
)
elif isinstance(loaded_market, PerpMarket):
return PerpMarketInstructionBuilder.load(
context, wallet, loaded_market, loaded_market.group, account
)
else:
raise Exception(
f"Could not find market instructions builder for market {market.symbol}"
)
2021-06-25 02:33:40 -07:00
# # 🥭 create_market_operations
#
# This function deals with the creation of a `MarketOperations` object for a given `Market`.
#
def create_market_operations(
context: Context,
wallet: Wallet,
account: typing.Optional[Account],
market: Market,
dry_run: bool = False,
) -> MarketOperations:
2021-06-25 02:33:40 -07:00
if dry_run:
2022-02-22 06:25:53 -08:00
return NullMarketOperations(market)
loaded_market: Market = ensure_market_loaded(context, market)
if isinstance(loaded_market, SerumMarket):
serum_market_instruction_builder: SerumMarketInstructionBuilder = (
SerumMarketInstructionBuilder.load(context, wallet, loaded_market)
)
return SerumMarketOperations(context, wallet, serum_market_instruction_builder)
elif isinstance(loaded_market, SpotMarket):
if account is None:
raise Exception("Account is required for SpotMarket operations.")
spot_market_instruction_builder: SpotMarketInstructionBuilder = (
SpotMarketInstructionBuilder.load(
context, wallet, loaded_market, loaded_market.group, account
)
)
return SpotMarketOperations(
context, wallet, account, spot_market_instruction_builder
)
elif isinstance(loaded_market, PerpMarket):
if account is None:
raise Exception("Account is required for PerpMarket operations.")
perp_market_instruction_builder: PerpMarketInstructionBuilder = (
PerpMarketInstructionBuilder.load(
context,
wallet,
loaded_market,
loaded_market.underlying_perp_market.group,
account,
)
)
return PerpMarketOperations(
context, wallet, account, perp_market_instruction_builder
)
2021-06-25 02:33:40 -07:00
else:
raise Exception(
f"Could not find market operations handler for market {market.symbol}"
)