Пример #1
0
def test_pagination(mock_ftx: Ftx):
    """Test pagination in the eth/eur market (public endpoint)"""
    # Try pagination good path
    response = mock_ftx._api_query(
        endpoint='markets/eth/eur/trades',
        limit=3,
        start_time=Timestamp(1617716695),
        end_time=Timestamp(1617724135),
    )

    assert len(response) == 24

    # Try with a page size divisor of the total orders
    response = mock_ftx._api_query(
        endpoint='markets/eth/eur/trades',
        limit=3,
        start_time=Timestamp(1617716695),
        end_time=Timestamp(1617724135),
    )

    assert len(response) == 24

    # Try pagination with same dates. Should return empty list
    response = mock_ftx._api_query(
        endpoint='markets/eth/eur/trades',
        limit=3,
        start_time=Timestamp(1617716695),
        end_time=Timestamp(1617716695),
    )

    assert len(response) == 0
Пример #2
0
def test_exchanges_filtering(database, exchange_manager,
                             function_scope_messages_aggregator):
    kraken1 = MockKraken(
        name='mockkraken_1',
        api_key=make_api_key(),
        secret=make_api_secret(),
        database=database,
        msg_aggregator=function_scope_messages_aggregator,
    )
    kraken2 = MockKraken(
        name='mockkraken_2',
        api_key=make_api_key(),
        secret=make_api_secret(),
        database=database,
        msg_aggregator=function_scope_messages_aggregator,
    )
    ftx1 = Ftx(
        name='mockftx_1',
        api_key=make_api_key(),
        secret=make_api_secret(),
        database=database,
        msg_aggregator=function_scope_messages_aggregator,
        ftx_subaccount=None,
    )
    ftx2 = Ftx(
        name='mockftx_2',
        api_key=make_api_key(),
        secret=make_api_secret(),
        database=database,
        msg_aggregator=function_scope_messages_aggregator,
        ftx_subaccount=None,
    )

    exchange_manager.initialize_exchanges({}, database)
    exchange_manager.connected_exchanges[Location.KRAKEN].append(kraken1)
    exchange_manager.connected_exchanges[Location.KRAKEN].append(kraken2)
    exchange_manager.connected_exchanges[Location.FTX].append(ftx1)
    exchange_manager.connected_exchanges[Location.FTX].append(ftx2)
    assert set(exchange_manager.iterate_exchanges()) == {
        kraken1, kraken2, ftx1, ftx2
    }

    database.set_settings(
        ModifiableDBSettings(non_syncing_exchanges=[
            kraken1.location_id(),
            kraken2.location_id()
        ], ))
    assert set(exchange_manager.iterate_exchanges()) == {ftx1, ftx2}

    database.set_settings(
        ModifiableDBSettings(non_syncing_exchanges=[ftx1.location_id()], ))
    assert set(
        exchange_manager.iterate_exchanges()) == {ftx2, kraken1, kraken2}
Пример #3
0
def test_ftx_exchange_assets_are_known(mock_ftx: Ftx):

    unknown_assets: Set[str] = set()
    unsupported_assets = set(UNSUPPORTED_FTX_ASSETS)

    def process_currency(currency: Optional[str]):
        """Check if a currency is known for the FTX exchange"""
        if currency is None:
            return
        try:
            if currency not in unknown_assets:
                asset_from_ftx(base_currency)
        except UnsupportedAsset:
            assert base_currency in unsupported_assets
        except UnknownAsset as e:
            test_warnings.warn(
                UserWarning(
                    f'Found unknown asset {e.asset_name} in FTX. '
                    f'Support for it has to be added', ))
            unknown_assets.add(base_currency)

    response = mock_ftx._api_query(endpoint='markets', paginate=False)

    # Extract the unique symbols from the exchange pairs
    for entry in response:
        if entry['type'] == 'future':
            continue

        base_currency = entry.get('baseCurrency', None)
        quote_currency = entry.get('quoteCurrency', None)
        process_currency(base_currency)
        process_currency(quote_currency)
Пример #4
0
def test_query_deposits_withdrawals(mock_ftx: Ftx):
    """Test happy path of deposits/withdrawls"""
    with patch.object(mock_ftx.session,
                      'get',
                      side_effect=mock_normal_ftx_query):
        movements = mock_ftx.query_online_deposits_withdrawals(
            start_ts=Timestamp(0),
            end_ts=TEST_END_TS,
        )
    warnings = mock_ftx.msg_aggregator.consume_warnings()
    errors = mock_ftx.msg_aggregator.consume_errors()
    assert len(warnings) == 0
    assert len(errors) == 0

    expected_movements = [
        AssetMovement(
            location=Location.FTX,
            category=AssetMovementCategory.DEPOSIT,
            address='0x541163adf0a2e830d9f940763e912807d1a359f5',
            transaction_id=
            '0xf787fa6b62edf1c97fb3f73f80a5eb7550bbf3dcf4269b9bfb9e8c1c0a3bc1a9',
            timestamp=Timestamp(1612159566),
            asset=A_ETH,
            amount=FVal('20'),
            fee_asset=A_ETH,
            fee=Fee(ZERO),
            link='3',
        ),
        AssetMovement(
            location=Location.FTX,
            category=AssetMovementCategory.WITHDRAWAL,
            timestamp=Timestamp(1612159566),
            address='0x903d12bf2c57a29f32365917c706ce0e1a84cce3',
            transaction_id=
            '0xbb27f24c2a348526fc23767d3d8bb303099e90f253ef9fdbb28ce38c1635d116',
            asset=A_ETH,
            amount=FVal('11.0'),
            fee_asset=A_ETH,
            fee=Fee(ZERO),
            link='1',
        ),
        AssetMovement(
            location=Location.FTX,
            category=AssetMovementCategory.WITHDRAWAL,
            address=None,
            transaction_id=None,
            timestamp=Timestamp(1612159566),
            asset=A_USD,
            amount=FVal('21.0'),
            fee_asset=A_USD,
            fee=Fee(ZERO),
            link='2',
        )
    ]

    assert len(movements) == 3
    assert movements == expected_movements
Пример #5
0
def create_test_ftx(
        database: DBHandler,
        msg_aggregator: MessagesAggregator,
) -> Ftx:
    mock = Ftx(
        api_key=make_api_key(),
        secret=make_api_secret(),
        database=database,
        msg_aggregator=msg_aggregator,
    )
    return mock
Пример #6
0
def create_test_ftx(
    database: DBHandler,
    msg_aggregator: MessagesAggregator,
) -> Ftx:
    mock = Ftx(
        name='ftx',
        api_key=make_api_key(),
        secret=make_api_secret(),
        database=database,
        msg_aggregator=msg_aggregator,
        ftx_subaccount=None,
    )
    return mock
Пример #7
0
def test_balances(mock_ftx: Ftx):
    """Test that balances are correctly extracted"""

    with patch.object(mock_ftx.session, 'get', side_effect=mock_normal_ftx_query):
        balances, msg = mock_ftx.query_balances()

    warnings = mock_ftx.msg_aggregator.consume_warnings()
    errors = mock_ftx.msg_aggregator.consume_errors()
    assert len(warnings) == 0
    assert len(errors) == 0

    assert msg == ''
    assert len(balances) == 2
    assert balances[A_USDC].amount == FVal('10000.0')
    assert balances[A_ETH].amount == FVal('10010.0')
    assert balances[A_USDC].usd_value == FVal('10000.0')
    assert balances[A_ETH].usd_value == FVal('20020000.0')
Пример #8
0
def test_name():
    exchange = Ftx('ftx1', 'a', b'a', object(), object())
    assert exchange.location == Location.FTX
    assert exchange.name == 'ftx1'
Пример #9
0
def test_name(database):
    exchange = Ftx('ftx1', 'a', b'a', database, object(), None)
    assert exchange.location == Location.FTX
    assert exchange.name == 'ftx1'
Пример #10
0
def test_name():
    exchange = Ftx('a', b'a', object(), object())
    assert exchange.name == 'ftx'