# In --strict mode, mypy complains about imports unless they're done this way.
#
# It complains 'Module has no attribute ABC' or 'Module "mango" does not explicitly export
# attribute "XYZ"; implicit reexport disabled'. We could dial that back by using the
# --implicit-reexport parameter, but let's keep things strict.
#
# Each import then *must* be of the form `from .file import X as X`. (Until/unless there's
# a better way.)
#
from .account import Account as Account
from .account import AccountSlot as AccountSlot
from .account import ReferrerMemory as ReferrerMemory
from .account import Valuation as Valuation
from .accountflags import AccountFlags as AccountFlags
from .accountinfo import AccountInfo as AccountInfo
from .accountinfoconverter import (
    build_account_info_converter as build_account_info_converter,
)
from .accountscout import AccountScout as AccountScout
from .accountscout import ScoutReport as ScoutReport
from .addressableaccount import AddressableAccount as AddressableAccount
from .arguments import parse_args as parse_args
from .arguments import setup_logging as setup_logging
from .cache import Cache as Cache
from .cache import MarketCache as MarketCache
from .cache import PerpMarketCache as PerpMarketCache
from .cache import PriceCache as PriceCache
from .cache import RootBankCache as RootBankCache
from .client import AbstractSlotHolder as AbstractSlotHolder
from .client import BetterClient as BetterClient
from .client import BlockhashNotFoundException as BlockhashNotFoundException
from .client import CheckingSlotHolder as CheckingSlotHolder
from .client import ClientException as ClientException
from .client import ClusterUrlData as ClusterUrlData
from .client import CompoundException as CompoundException
from .client import CompoundRPCCaller as CompoundRPCCaller
from .client import FailedToFetchBlockhashException as FailedToFetchBlockhashException
from .client import NodeIsBehindException as NodeIsBehindException
from .client import NullSlotHolder as NullSlotHolder
from .client import NullTransactionMonitor as NullTransactionMonitor
from .client import RateLimitException as RateLimitException
from .client import RPCCaller as RPCCaller
from .client import StaleSlotException as StaleSlotException
from .client import (
    TooManyRequestsRateLimitException as TooManyRequestsRateLimitException,
)
from .client import (
    TooMuchBandwidthRateLimitException as TooMuchBandwidthRateLimitException,
)
from .client import (
    TransactionAlreadyProcessedException as TransactionAlreadyProcessedException,
)
from .client import TransactionException as TransactionException
from .client import TransactionMonitor as TransactionMonitor
from .combinableinstructions import CombinableInstructions as CombinableInstructions
from .constants import MangoConstants as MangoConstants
from .constants import PackageVersion as PackageVersion
from .constants import DATA_PATH as DATA_PATH
from .constants import I64_MAX as I64_MAX
from .constants import SOL_DECIMAL_DIVISOR as SOL_DECIMAL_DIVISOR
from .constants import SOL_DECIMALS as SOL_DECIMALS
from .constants import SOL_MINT_ADDRESS as SOL_MINT_ADDRESS
from .constants import SYSTEM_PROGRAM_ADDRESS as SYSTEM_PROGRAM_ADDRESS
from .constants import WARNING_DISCLAIMER_TEXT as WARNING_DISCLAIMER_TEXT
from .constants import version as version
from .context import Context as Context
from .contextbuilder import ContextBuilder as ContextBuilder
from .datetimes import datetime_from_chain as datetime_from_chain
from .datetimes import datetime_from_timestamp as datetime_from_timestamp
from .datetimes import local_now as local_now
from .datetimes import utc_now as utc_now
from .encoding import decode_binary as decode_binary
from .encoding import encode_binary as encode_binary
from .encoding import encode_key as encode_key
from .encoding import encode_int as encode_int
from .group import Group as Group
from .group import GroupSlot as GroupSlot
from .group import GroupSlotPerpMarket as GroupSlotPerpMarket
from .group import GroupSlotSpotMarket as GroupSlotSpotMarket
from .healthcheck import HealthCheck as HealthCheck
from .idgenerator import IdGenerator as IdGenerator
from .idgenerator import MonotonicIdGenerator as MonotonicIdGenerator
from .idgenerator import RandomIdGenerator as RandomIdGenerator
from .idl import IdlParser as IdlParser
from .idl import IdlType as IdlType
from .idl import lazy_load_cached_idl_parser as lazy_load_cached_idl_parser
from .idsjsonmarketlookup import IdsJsonMarketLookup as IdsJsonMarketLookup
from .idsjsonmarketlookup import IdsJsonMarketType as IdsJsonMarketType
from .instructionreporter import (
    CompoundInstructionReporter as CompoundInstructionReporter,
)
from .instructionreporter import InstructionReporter as InstructionReporter
from .instructionreporter import MangoInstructionReporter as MangoInstructionReporter
from .instructionreporter import SerumInstructionReporter as SerumInstructionReporter
from .instructions import (
    build_mango_cache_perp_markets_instructions as build_mango_cache_perp_markets_instructions,
)
from .instructions import (
    build_mango_cache_prices_instructions as build_mango_cache_prices_instructions,
)
from .instructions import (
    build_mango_cache_root_banks_instructions as build_mango_cache_root_banks_instructions,
)
from .instructions import (
    build_mango_create_account_instructions as build_mango_create_account_instructions,
)
from .instructions import (
    build_mango_deposit_instructions as build_mango_deposit_instructions,
)
from .instructions import (
    build_mango_redeem_accrued_instructions as build_mango_redeem_accrued_instructions,
)
from .instructions import (
    build_mango_register_referrer_id_instructions as build_mango_register_referrer_id_instructions,
)
from .instructions import (
    build_mango_set_account_delegate_instructions as build_mango_set_account_delegate_instructions,
)
from .instructions import (
    build_mango_set_referrer_memory_instructions as build_mango_set_referrer_memory_instructions,
)
from .instructions import (
    build_mango_settle_fees_instructions as build_mango_settle_fees_instructions,
)
from .instructions import (
    build_mango_settle_pnl_instructions as build_mango_settle_pnl_instructions,
)
from .instructions import (
    build_mango_update_funding_instructions as build_mango_update_funding_instructions,
)
from .instructions import (
    build_mango_update_root_bank_instructions as build_mango_update_root_bank_instructions,
)
from .instructions import (
    build_mango_unset_account_delegate_instructions as build_mango_unset_account_delegate_instructions,
)
from .instructions import (
    build_mango_withdraw_instructions as build_mango_withdraw_instructions,
)
from .instructions import (
    build_perp_cancel_all_orders_instructions as build_perp_cancel_all_orders_instructions,
)
from .instructions import (
    build_perp_cancel_order_instructions as build_perp_cancel_order_instructions,
)
from .instructions import (
    build_perp_consume_events_instructions as build_perp_consume_events_instructions,
)
from .instructions import (
    build_perp_place_order_instructions as build_perp_place_order_instructions,
)
from .instructions import (
    build_serum_consume_events_instructions as build_serum_consume_events_instructions,
)
from .instructions import (
    build_serum_create_openorders_instructions as build_serum_create_openorders_instructions,
)
from .instructions import (
    build_serum_place_order_instructions as build_serum_place_order_instructions,
)
from .instructions import (
    build_serum_settle_instructions as build_serum_settle_instructions,
)
from .instructions import (
    build_solana_create_account_instructions as build_solana_create_account_instructions,
)
from .instructions import (
    build_spl_close_account_instructions as build_spl_close_account_instructions,
)
from .instructions import (
    build_spl_create_associated_account_instructions as build_spl_create_associated_account_instructions,
)
from .instructions import (
    build_spl_create_account_instructions as build_spl_create_account_instructions,
)
from .instructions import (
    build_spl_faucet_airdrop_instructions as build_spl_faucet_airdrop_instructions,
)
from .instructions import (
    build_spl_transfer_tokens_instructions as build_spl_transfer_tokens_instructions,
)
from .instructions import (
    build_spot_cancel_order_instructions as build_spot_cancel_order_instructions,
)
from .instructions import (
    build_spot_create_openorders_instructions as build_spot_create_openorders_instructions,
)
from .instructions import (
    build_spot_place_order_instructions as build_spot_place_order_instructions,
)
from .instructions import (
    build_spot_settle_instructions as build_spot_settle_instructions,
)
from .instructiontype import InstructionType as InstructionType
from .instrumentlookup import CompoundInstrumentLookup as CompoundInstrumentLookup
from .instrumentlookup import IdsJsonTokenLookup as IdsJsonTokenLookup
from .instrumentlookup import InstrumentLookup as InstrumentLookup
from .instrumentlookup import NonSPLInstrumentLookup as NonSPLInstrumentLookup
from .instrumentlookup import NullInstrumentLookup as NullInstrumentLookup
from .instrumentlookup import SPLTokenLookup as SPLTokenLookup
from .instrumentvalue import InstrumentValue as InstrumentValue
from .inventory import Inventory as Inventory
from .inventory import InventoryAccountWatcher as InventoryAccountWatcher
from .loadedmarket import Event as Event
from .loadedmarket import FillEvent as FillEvent
from .loadedmarket import LoadedMarket as LoadedMarket
from .logmessages import expand_log_messages as expand_log_messages
from .lotsizeconverter import LotSizeConverter as LotSizeConverter
from .lotsizeconverter import NullLotSizeConverter as NullLotSizeConverter
from .lotsizeconverter import RaisingLotSizeConverter as RaisingLotSizeConverter
from .mangoinstruction import MangoInstruction as MangoInstruction
from .marketlookup import CompoundMarketLookup as CompoundMarketLookup
from .marketlookup import MarketLookup as MarketLookup
from .marketlookup import NullMarketLookup as NullMarketLookup
from .marketoperations import MarketInstructionBuilder as MarketInstructionBuilder
from .marketoperations import MarketOperations as MarketOperations
from .marketoperations import (
    NullMarketInstructionBuilder as NullMarketInstructionBuilder,
)
from .marketoperations import NullMarketOperations as NullMarketOperations
from .markets import InventorySource as InventorySource
from .markets import MarketType as MarketType
from .markets import Market as Market
from .metadata import Metadata as Metadata
from .modelstate import EventQueue as EventQueue
from .modelstate import NullEventQueue as NullEventQueue
from .modelstate import ModelState as ModelState
from .notification import CompoundNotificationTarget as CompoundNotificationTarget
from .notification import ConsoleNotificationTarget as ConsoleNotificationTarget
from .notification import DiscordNotificationTarget as DiscordNotificationTarget
from .notification import FilteringNotificationTarget as FilteringNotificationTarget
from .notification import MailjetNotificationTarget as MailjetNotificationTarget
from .notification import NotificationHandler as NotificationHandler
from .notification import NotificationTarget as NotificationTarget
from .notification import TelegramNotificationTarget as TelegramNotificationTarget
from .notification import parse_notification_target as parse_notification_target
from .observables import CaptureFirstItem as CaptureFirstItem
from .observables import CollectingObserverSubscriber as CollectingObserverSubscriber
from .observables import Disposable as Disposable
from .observables import DisposeWrapper as DisposeWrapper
from .observables import DisposingSubject as DisposingSubject
from .observables import EventSource as EventSource
from .observables import FunctionObserver as FunctionObserver
from .observables import LatestItemObserverSubscriber as LatestItemObserverSubscriber
from .observables import NullObserverSubscriber as NullObserverSubscriber
from .observables import PrintingObserverSubscriber as PrintingObserverSubscriber
from .observables import (
    TimestampedPrintingObserverSubscriber as TimestampedPrintingObserverSubscriber,
)
from .observables import (
    create_backpressure_skipping_observer as create_backpressure_skipping_observer,
)
from .observables import debug_print_item as debug_print_item
from .observables import log_subscription_error as log_subscription_error
from .observables import (
    observable_pipeline_error_reporter as observable_pipeline_error_reporter,
)
from .openorders import OpenOrders as OpenOrders
from .oracle import Oracle as Oracle
from .oracle import OracleProvider as OracleProvider
from .oracle import OracleSource as OracleSource
from .oracle import Price as Price
from .oracle import SupportedOracleFeature as SupportedOracleFeature
from .orders import Order as Order
from .orders import OrderType as OrderType
from .orders import OrderBook as OrderBook
from .orders import Side as Side
from .oraclefactory import create_oracle_provider as create_oracle_provider
from .output import output as output
from .output import output_formatter as output_formatter
from .output import OutputFormat as OutputFormat
from .output import OutputFormatter as OutputFormatter
from .output import to_json as to_json
from .ownedinstrumentvalue import OwnedInstrumentValue as OwnedInstrumentValue
from .perpaccount import PerpAccount as PerpAccount
from .perpeventqueue import PerpEvent as PerpEvent
from .perpeventqueue import PerpEventQueue as PerpEventQueue
from .perpeventqueue import PerpFillEvent as PerpFillEvent
from .perpeventqueue import PerpOutEvent as PerpOutEvent
from .perpeventqueue import PerpLiquidateEvent as PerpLiquidateEvent
from .perpeventqueue import PerpUnknownEvent as PerpUnknownEvent
from .perpeventqueue import (
    UnseenAccountFillEventTracker as UnseenAccountFillEventTracker,
)
from .perpeventqueue import (
    UnseenPerpEventChangesTracker as UnseenPerpEventChangesTracker,
)
from .perpmarket import FundingRate as FundingRate
from .perpmarket import PerpMarket as PerpMarket
from .perpmarket import PerpMarketInstructionBuilder as PerpMarketInstructionBuilder
from .perpmarket import PerpMarketOperations as PerpMarketOperations
from .perpmarket import PerpMarketStub as PerpMarketStub
from .perpmarket import PerpOrderBookSide as PerpOrderBookSide
from .perpmarketdetails import LiquidityMiningInfo as LiquidityMiningInfo
from .perpmarketdetails import PerpMarketDetails as PerpMarketDetails
from .perpopenorders import PerpOpenOrders as PerpOpenOrders
from .placedorder import PlacedOrder as PlacedOrder
from .placedorder import PlacedOrdersContainer as PlacedOrdersContainer
from .porcelain import instruction_builder as instruction_builder
from .porcelain import instrument as instrument
from .porcelain import instrument_value as instrument_value
from .porcelain import market as market
from .porcelain import operations as operations
from .porcelain import token as token
from .publickey import encode_public_key_for_sorting as encode_public_key_for_sorting
from .reconnectingwebsocket import ReconnectingWebsocket as ReconnectingWebsocket
from .retrier import RetryWithPauses as RetryWithPauses
from .retrier import retry_context as retry_context
from .serumeventqueue import SerumEvent as SerumEvent
from .serumeventqueue import SerumEventFlags as SerumEventFlags
from .serumeventqueue import SerumEventQueue as SerumEventQueue
from .serumeventqueue import (
    UnseenSerumEventChangesTracker as UnseenSerumEventChangesTracker,
)
from .serummarket import SerumMarket as SerumMarket
from .serummarket import SerumMarketInstructionBuilder as SerumMarketInstructionBuilder
from .serummarket import SerumMarketOperations as SerumMarketOperations
from .serummarket import SerumMarketStub as SerumMarketStub
from .serummarketlookup import SerumMarketLookup as SerumMarketLookup
from .spotmarket import SpotMarket as SpotMarket
from .spotmarket import SpotMarketInstructionBuilder as SpotMarketInstructionBuilder
from .spotmarket import SpotMarketOperations as SpotMarketOperations
from .spotmarket import SpotMarketStub as SpotMarketStub
from .text import indent_collection_as_str as indent_collection_as_str
from .text import indent_item_by as indent_item_by
from .tokenaccount import TokenAccount as TokenAccount
from .tokenbank import BankBalances as BankBalances
from .tokenbank import InterestRates as InterestRates
from .tokenbank import NodeBank as NodeBank
from .tokenbank import RootBank as RootBank
from .tokenbank import TokenBank as TokenBank
from .tokenoperations import (
    build_create_associated_instructions_and_account as build_create_associated_instructions_and_account,
)
from .tokens import Instrument as Instrument
from .tokens import RoundDirection as RoundDirection
from .tokens import SolToken as SolToken
from .tokens import Token as Token
from .tradehistory import TradeHistory as TradeHistory
from .transactionmonitoring import (
    DequeTransactionStatusCollector as DequeTransactionStatusCollector,
)
from .transactionmonitoring import (
    NullTransactionStatusCollector as NullTransactionStatusCollector,
)
from .transactionmonitoring import (
    SignatureSubscription as SignatureSubscription,
)
from .transactionmonitoring import (
    TransactionOutcome as TransactionOutcome,
)
from .transactionmonitoring import (
    TransactionStatus as TransactionStatus,
)
from .transactionmonitoring import (
    TransactionStatusCollector as TransactionStatusCollector,
)
from .transactionmonitoring import (
    WebSocketTransactionMonitor as WebSocketTransactionMonitor,
)
from .transactionscout import TransactionScout as TransactionScout
from .transactionscout import (
    fetch_all_recent_transaction_signatures as fetch_all_recent_transaction_signatures,
)
from .transactionscout import (
    mango_instruction_from_response as mango_instruction_from_response,
)
from .version import Version as Version
from .wallet import Wallet as Wallet
from .walletbalancer import FilterSmallChanges as FilterSmallChanges
from .walletbalancer import FixedTargetBalance as FixedTargetBalance
from .walletbalancer import LiveAccountBalancer as LiveAccountBalancer
from .walletbalancer import LiveWalletBalancer as LiveWalletBalancer
from .walletbalancer import NullWalletBalancer as NullWalletBalancer
from .walletbalancer import PercentageTargetBalance as PercentageTargetBalance
from .walletbalancer import TargetBalance as TargetBalance
from .walletbalancer import WalletBalancer as WalletBalancer
from .walletbalancer import (
    calculate_required_balance_changes as calculate_required_balance_changes,
)
from .walletbalancer import parse_fixed_target_balance as parse_fixed_target_balance
from .walletbalancer import parse_target_balance as parse_target_balance
from .walletbalancer import sort_changes_for_trades as sort_changes_for_trades
from .watcher import LamdaUpdateWatcher as LamdaUpdateWatcher
from .watcher import ManualUpdateWatcher as ManualUpdateWatcher
from .watcher import Watcher as Watcher
from .watchers import build_group_watcher as build_group_watcher
from .watchers import build_account_watcher as build_account_watcher
from .watchers import build_cache_watcher as build_cache_watcher
from .watchers import build_spot_open_orders_watcher as build_spot_open_orders_watcher
from .watchers import build_serum_open_orders_watcher as build_serum_open_orders_watcher
from .watchers import build_perp_open_orders_watcher as build_perp_open_orders_watcher
from .watchers import build_price_watcher as build_price_watcher
from .watchers import build_serum_inventory_watcher as build_serum_inventory_watcher
from .watchers import build_orderbook_watcher as build_orderbook_watcher
from .watchers import build_serum_event_queue_watcher as build_serum_event_queue_watcher
from .watchers import build_spot_event_queue_watcher as build_spot_event_queue_watcher
from .watchers import build_perp_event_queue_watcher as build_perp_event_queue_watcher
from .websocketsubscription import ActiveWebSocket as ActiveWebSocket

from .websocketsubscription import (
    AddressWebSocketSubscription as AddressWebSocketSubscription,
)
from .websocketsubscription import (
    IndividualWebSocketSubscriptionManager as IndividualWebSocketSubscriptionManager,
)
from .websocketsubscription import (
    LogEvent as LogEvent,
)
from .websocketsubscription import (
    SharedWebSocketSubscriptionManager as SharedWebSocketSubscriptionManager,
)
from .websocketsubscription import (
    WebSocketAccountSubscription as WebSocketAccountSubscription,
)
from .websocketsubscription import WebSocketLogSubscription as WebSocketLogSubscription
from .websocketsubscription import (
    WebSocketProgramSubscription as WebSocketProgramSubscription,
)
from .websocketsubscription import WebSocketSubscription as WebSocketSubscription
from .websocketsubscription import (
    WebSocketSignatureSubscription as WebSocketSignatureSubscription,
)
from .websocketsubscription import (
    WebSocketSubscriptionManager as WebSocketSubscriptionManager,
)

from .layouts import layouts

import decimal

# Increased precision from 18 to 36 because for a decimal like:
# val = Decimal("17436036573.2030800")
#
# The following rounding operations would both throw decimal.InvalidOperation:
# val.quantize(Decimal('.000000001'))
# round(val, 9)
decimal.getcontext().prec = 36
