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)
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
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
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
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
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
def test_eq_invalid_type(): ue_token = UnknownEthereumToken( ethereum_address=SHUF_ETHEREUM_ADDRESS, symbol=SHUF_SYMBOL, ) token = EthereumToken('WETH') assert ue_token != token
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}'
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, ), }
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
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
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'
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, ), }
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
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
def test_hash(): ue_token = UnknownEthereumToken( ethereum_address=SHUF_ETHEREUM_ADDRESS, symbol=SHUF_SYMBOL, ) assert hash(ue_token) == hash(ue_token.ethereum_address)
def test_serialize(): ue_token = UnknownEthereumToken( ethereum_address=SHUF_ETHEREUM_ADDRESS, symbol=SHUF_SYMBOL, ) assert ue_token.serialize() == ue_token.ethereum_address
'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',
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(