UniswapV2SimpleRoutingModel#

tradeexecutor.ethereum.uniswap_v2_routing.UniswapV2SimpleRoutingModel Python class in Trading Strategy framework.

class UniswapV2SimpleRoutingModel[source]#

Bases: EthereumRoutingModel

A simple router that does not optimise the trade execution cost.

  • Able to trade on multiple exchanges

  • Able to three-way trades through predefined intermediary hops, either on the exchange itself or some outside exchange

__init__(factory_router_map, allowed_intermediary_pairs, reserve_token_address, chain_id=None, trading_fee=None)[source]#
Parameters:
  • factory_router_map (Dict[str, Tuple[str, Optional[str]]]) – Defines router smart contracts to be used with each DEX. Each Uniswap v2 is uniquely identified by its factory contract. Addresses always lowercase.

  • allowed_intermediary_pairs (Dict[str, str]) –

    Quote token address -> pair smart contract address mapping.

    Because we hold our reserves only in one currecy e.g. BUSD and we want to trade e.g. Cake/BNB pairs, we need to whitelist BNB as an allowed intermediary token. This makes it possible to do BUSD -> BNB -> Cake trade. This set is the list of pair smart contract addresses that are allowed to be used as a hop.

  • trading_fee (Optional[float]) –

    Trading fee express as float bps.

    This is the LP fee applied to all swaps.

  • chain_id (Optional[ChainId]) – Store the chain id for which these routes were generated for.

  • reserve_token_address (str) – Token address of our reserve currency. Relevent for buy/sell routing. Lowercase.

Methods

__init__(factory_router_map, ...[, ...])

param factory_router_map:

convert_address_dict_to_lower(address_dict)

Convert all key addresses to lowercase to avoid mix up with Ethereum address checksums

create_routing_state(universe, execution_details)

Create a new routing state for this cycle.

execute_trades_internal(pair_universe, ...)

Split for testability.

get_default_trading_fee()

Get the trading/LP fee applied to all trading pairs.

get_reserve_asset(pair_universe)

Translate our reserve token address tok an asset description.

intermediary_pair_assertion(intermediary_pair)

make_direct_trade(routing_state, ...[, ...])

Prepare a trade where target pair has out reserve asset as a quote token.

make_multihop_trade(routing_state, ...[, ...])

Prepare a trade where target pair has out reserve asset as a quote token.

perform_preflight_checks_and_logging(...)

"Checks the integrity of the routing.

pre_trade_assertions(reserve_asset_amount, ...)

Some basic assertions made at the beginning of the trade() method on child class.

reserve_asset_logging(pair_universe)

route_pair(pair_universe, trading_pair)

Return Uniswap routing information (path components) for a trading pair.

route_pair_assertions(trading_pair, ...)

route_trade(pair_universe, trade)

Figure out how to map an abstract trade to smart contracts.

setup_trades(routing_state, trades[, ...])

Strategy and live execution connection.

trade(routing_state, target_pair, ...[, ...])

param routing_state:

__init__(factory_router_map, allowed_intermediary_pairs, reserve_token_address, chain_id=None, trading_fee=None)[source]#
Parameters:
  • factory_router_map (Dict[str, Tuple[str, Optional[str]]]) – Defines router smart contracts to be used with each DEX. Each Uniswap v2 is uniquely identified by its factory contract. Addresses always lowercase.

  • allowed_intermediary_pairs (Dict[str, str]) –

    Quote token address -> pair smart contract address mapping.

    Because we hold our reserves only in one currecy e.g. BUSD and we want to trade e.g. Cake/BNB pairs, we need to whitelist BNB as an allowed intermediary token. This makes it possible to do BUSD -> BNB -> Cake trade. This set is the list of pair smart contract addresses that are allowed to be used as a hop.

  • trading_fee (Optional[float]) –

    Trading fee express as float bps.

    This is the LP fee applied to all swaps.

  • chain_id (Optional[ChainId]) – Store the chain id for which these routes were generated for.

  • reserve_token_address (str) – Token address of our reserve currency. Relevent for buy/sell routing. Lowercase.

get_default_trading_fee()[source]#

Get the trading/LP fee applied to all trading pairs.

This is Uni v2 style fee.

Returns:

Trading fee, BPS * 10000 as a float.

If information not available return None.

Return type:

Optional[float]

create_routing_state(universe, execution_details)[source]#

Create a new routing state for this cycle.

  • Connect routing to web3 and hot wallet

  • Read on-chain data on what gas fee we are going to use

  • Setup transaction builder based on this information

Parameters:
Return type:

UniswapV2RoutingState

perform_preflight_checks_and_logging(pair_universe)[source]#

“Checks the integrity of the routing.

  • Called from check-wallet to see our routing and balances are good

Parameters:

pair_universe (PandasPairUniverse) –

make_direct_trade(routing_state, target_pair, reserve_asset, reserve_amount, max_slippage, check_balances=False)[source]#

Prepare a trade where target pair has out reserve asset as a quote token.

Returns:

List of approval transactions (if any needed)

Parameters:
Return type:

List[BlockchainTransaction]

make_multihop_trade(routing_state, target_pair, intermediary_pair, reserve_asset, reserve_amount, max_slippage, check_balances=False)[source]#

Prepare a trade where target pair has out reserve asset as a quote token.

Returns:

List of approval transactions (if any needed)

Parameters:
Return type:

List[BlockchainTransaction]