예제 #1
0
def test_serialize_as_dict_wo_keys():
    ue_token = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL,
    )
    ue_token_as_dict = ue_token.serialize_as_dict()

    assert ue_token_as_dict == asdict(ue_token)
예제 #2
0
def test_ne():
    ue_token_1 = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL,
    )
    ue_token_2 = UnknownEthereumToken(
        ethereum_address=str(SHUF_ETHEREUM_ADDRESS).lower(),
        symbol=SHUF_SYMBOL,
    )
    assert ue_token_1 != ue_token_2
예제 #3
0
def test_eq():
    ue_token_1 = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL,
    )
    ue_token_2 = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL + 'does not matter',
        name=SHUF_NAME + 'name does no matter',
        decimals=SHUF_DECIMALS - 10,
    )
    assert ue_token_1 == ue_token_2
예제 #4
0
def test_serialize_as_dict_with_keys():
    ue_token = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL,
        name=SHUF_NAME,
        decimals=SHUF_DECIMALS,
    )
    sz_keys = ('decimals', 'ethereum_address', 'NOT_EXISTING_KEY')
    ue_token_as_dict = ue_token.serialize_as_dict(keys=sz_keys)

    assert len(ue_token_as_dict.keys()) == 2
    assert ue_token_as_dict['ethereum_address'] == ue_token.ethereum_address
    assert ue_token_as_dict['decimals'] == ue_token.decimals
예제 #5
0
    def _get_known_asset_price(
            known_assets: Set[EthereumToken],
            unknown_assets: Set[UnknownEthereumToken],
    ) -> AssetPrice:
        """Get the tokens prices via Inquirer

        Given an asset, if `find_usd_price()` returns zero, it will be added
        into `unknown_assets`.
        """
        asset_price: AssetPrice = {}

        for known_asset in known_assets:
            asset_usd_price = Inquirer().find_usd_price(known_asset)

            if asset_usd_price != Price(ZERO):
                asset_price[known_asset.ethereum_address] = asset_usd_price
            else:
                unknown_asset = UnknownEthereumToken(
                    ethereum_address=known_asset.ethereum_address,
                    symbol=known_asset.identifier,
                    name=known_asset.name,
                    decimals=known_asset.decimals,
                )
                unknown_assets.add(unknown_asset)

        return asset_price
예제 #6
0
def test_eq_str():
    ue_token_1 = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL,
    )
    ue_token_2 = SHUF_ETHEREUM_ADDRESS
    assert ue_token_1 == ue_token_2
예제 #7
0
def test_eq_invalid_type():
    ue_token = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL,
    )
    token = EthereumToken('WETH')
    assert ue_token != token
예제 #8
0
def test_str_eq_symbol_ethereum_address():
    ue_token = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL,
        decimals=SHUF_DECIMALS,
    )
    assert str(ue_token) == f'{ue_token.symbol} {ue_token.ethereum_address}'
예제 #9
0
def test_known_asset_has_zero_usd_price(uniswap_module):
    """Test `known_asset_price` is empty and that an <UnknownEthereumToken>
    has been added in `unknown_assets` when Inquirer returns a price eq
    ZERO.
    """
    def fake_price_query(
            *args,  # pylint: disable=unused-argument
            **kwargs,  # pylint: disable=unused-argument
    ):
        return Price(ZERO)

    known_assets = {ASSET_WETH}
    unknown_assets = set()

    # Main call
    known_asset_price = uniswap_module._get_known_asset_price(
        known_assets=known_assets,
        unknown_assets=unknown_assets,
        price_query=fake_price_query,
    )

    assert known_asset_price == {}
    assert unknown_assets == {
        UnknownEthereumToken(
            ethereum_address=ASSET_WETH.ethereum_address,
            symbol=ASSET_WETH.symbol,
            name=ASSET_WETH.name,
            decimals=ASSET_WETH.decimals,
        ),
    }
예제 #10
0
def test_init_default():
    ue_token = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL,
    )
    assert ue_token.ethereum_address == SHUF_ETHEREUM_ADDRESS
    assert ue_token.symbol == SHUF_SYMBOL
    assert ue_token.name is None
    assert ue_token.decimals is None
예제 #11
0
def test_repr():
    ue_token = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL,
        name=SHUF_NAME,
        decimals=SHUF_DECIMALS,
    )
    exp_repr = (f'<UnknownEthereumToken '
                f'ethereum_address:{ue_token.ethereum_address} '
                f'symbol:{ue_token.symbol} '
                f'name:{ue_token.name} '
                f'decimals: {ue_token.decimals}>')
    assert repr(ue_token) == exp_repr
예제 #12
0
def test_get_ethereum_token():
    assert A_DAI == get_ethereum_token(
        symbol='DAI',
        ethereum_address='0x6B175474E89094C44Da98b954EedeAC495271d0F',
    )
    unknown_token = UnknownEthereumToken(
        symbol='DAI',
        ethereum_address='0xA379B8204A49A72FF9703e18eE61402FAfCCdD60',
        decimals=18,
    )
    assert unknown_token == get_ethereum_token(
        symbol='DAI',
        ethereum_address='0xA379B8204A49A72FF9703e18eE61402FAfCCdD60',
    ), 'correct symbol but wrong address should result in unknown token'
    unknown_token = UnknownEthereumToken(
        symbol='DOT',
        ethereum_address='0xA379B8204A49A72FF9703e18eE61402FAfCCdD60',
        decimals=18,
    )
    assert unknown_token == get_ethereum_token(
        symbol='DOT',
        ethereum_address='0xA379B8204A49A72FF9703e18eE61402FAfCCdD60',
    ), 'symbol of normal chain (polkadot here) should result in unknown token'
예제 #13
0
def test_known_asset_has_zero_usd_price(mock_uniswap, inquirer):  # pylint: disable=unused-argument
    """Test `known_asset_price` is empty and that an <UnknownEthereumToken>
    has been added in `unknown_assets` when Inquirer returns a price eq
    ZERO.
    """
    known_assets = {ASSET_WETH}
    unknown_assets = set()

    known_asset_price = mock_uniswap._get_known_asset_price(
        known_assets=known_assets,
        unknown_assets=unknown_assets,
    )

    assert known_asset_price == {}
    assert unknown_assets == {
        UnknownEthereumToken(
            ethereum_address=ASSET_WETH.ethereum_address,
            symbol=ASSET_WETH.symbol,
            name=ASSET_WETH.name,
            decimals=ASSET_WETH.decimals,
        ),
    }
예제 #14
0
def deserialize_unknown_ethereum_token_from_db(
    ethereum_address: str,
    symbol: str,
    name: Optional[str],
    decimals: Optional[int],
) -> UnknownEthereumToken:
    """Takes at least an ethereum address and a symbol, and returns an
    <UnknownEthereumToken>
    """
    try:
        unknown_ethereum_token = UnknownEthereumToken(
            ethereum_address=deserialize_ethereum_address(ethereum_address),
            symbol=symbol,
            name=name,
            decimals=decimals,
        )
    except Exception as e:
        raise DeserializationError(
            f'Failed deserializing an unknown ethereum token with '
            f'address {ethereum_address}, symbol {symbol}, name {name}, '
            f'decimals {decimals}.', ) from e

    return unknown_ethereum_token
예제 #15
0
        to_address=deserialize_ethereum_address('0x21d05071cA08593e13cd3aFD0b4869537e015C92'),
        timestamp=Timestamp(1603056982),
        location=Location.UNISWAP,
        token0=EthereumToken('DAI'),
        token1=EthereumToken('WETH'),
        amount0_in=AssetAmount(ZERO),
        amount1_in=AssetAmount(FVal('3.8')),
        amount0_out=AssetAmount(FVal('1411.453463704718081611')),
        amount1_out=AssetAmount(ZERO),
    )],
), AMMTrade(
    trade_type=TradeType.BUY,
    base_asset=EthereumToken('DAI'),
    quote_asset=UnknownEthereumToken(
        ethereum_address=deserialize_ethereum_address('0x27702a26126e0B3702af63Ee09aC4d1A084EF628'),  # noqa: E501
        symbol='ALEPH',
        name='aleph.im v2',
    ),
    amount=AssetAmount(FVal('904.171423330858608178')),
    rate=Price(FVal('6.231222126465350944166830285')),
    trade_index=0,
    swaps=[AMMSwap(
        tx_hash='0x296c750be451687a6e95de55a85c1b86182e44138902599fb277990447d5ded6',
        log_index=98,
        address=deserialize_ethereum_address('0x21d05071cA08593e13cd3aFD0b4869537e015C92'),
        from_address=deserialize_ethereum_address('0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D'),
        to_address=deserialize_ethereum_address('0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11'),
        timestamp=Timestamp(1602796833),
        location=Location.UNISWAP,
        token0=UnknownEthereumToken(
            ethereum_address=deserialize_ethereum_address('0x27702a26126e0B3702af63Ee09aC4d1A084EF628'),  # noqa: E501
예제 #16
0
def test_hash():
    ue_token = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL,
    )
    assert hash(ue_token) == hash(ue_token.ethereum_address)
예제 #17
0
def test_serialize():
    ue_token = UnknownEthereumToken(
        ethereum_address=SHUF_ETHEREUM_ADDRESS,
        symbol=SHUF_SYMBOL,
    )
    assert ue_token.serialize() == ue_token.ethereum_address
예제 #18
0
    '0xfeF0E7635281eF8E3B705e9C5B86e1d3B0eAb397')
TEST_ADDRESS_2 = deserialize_ethereum_address(
    '0xcf2B8EeC2A9cE682822b252a1e9B78EedebEFB02')
TEST_ADDRESS_3 = deserialize_ethereum_address(
    '0x7777777777777777777777777777777777777777')

# Known tokens
ASSET_USDT = EthereumToken('USDT')
ASSET_WETH = EthereumToken('WETH')
TOKEN_BASED = EthereumToken('$BASED')

# Unknown tokens
ASSET_SHUF = UnknownEthereumToken(
    ethereum_address=deserialize_ethereum_address(
        '0x3A9FfF453d50D4Ac52A6890647b823379ba36B9E'),
    symbol='SHUF',
    name='Shuffle.Monster V3',
    decimals=18,
)
ASSET_TGX = UnknownEthereumToken(
    ethereum_address=deserialize_ethereum_address(
        '0x364A7381A5b378CeD7AB33d1CDf6ff1bf162Bfd6'),
    symbol='TGX',
    name='DeFi-X Token',
    decimals=18,
)
TOKEN_DICE = UnknownEthereumToken(
    ethereum_address=deserialize_ethereum_address(
        '0xCF67CEd76E8356366291246A9222169F4dBdBe64'),
    symbol='DICE',
    name='DICE.FINANCE TOKEN',
예제 #19
0
             token0=A_SYN,
             token1=A_WETH,
             amount0_in=AssetAmount(FVal('980.08365587152306176')),
             amount1_in=AssetAmount(ZERO),
             amount0_out=AssetAmount(ZERO),
             amount1_out=AssetAmount(FVal('1.352902561458047718')),
         ),
     ],
 ),
 AMMTrade(
     trade_type=TradeType.BUY,
     base_asset=A_WETH,
     quote_asset=UnknownEthereumToken(
         ethereum_address=string_to_ethereum_address(
             '0xa0afAA285Ce85974c3C881256cB7F225e3A1178a'),  # noqa: E501
         symbol='wCRES',
         name='Wrapped CRES',
         decimals=18,
     ),
     amount=AssetAmount(FVal('0.205709519074945018')),
     rate=Price(FVal('232.7409943164679514496089589')),
     trade_index=0,
     swaps=[
         AMMSwap(
             tx_hash=
             '0xf54be824b4619777f1db0e3da91b0cd52f6dba730c95a75644e2b085e6ab9824',  # noqa: E501
             log_index=300,
             address=string_to_ethereum_address(
                 '0x029f388aC4D5C8BfF490550ce0853221030E822b'
             ),  # noqa: E501
             from_address=string_to_ethereum_address(