def test_ens_lookup(ethereum_manager, call_order, ethereum_manager_connect_at_start): """Test that ENS lookup works. Both with etherscan and with querying a real node""" wait_until_all_nodes_connected(ethereum_manager_connect_at_start, ethereum_manager) result = ethereum_manager.ens_lookup('api.zerion.eth', call_order=call_order) assert result is not None if result != ZERION_ADAPTER_ADDRESS: test_warnings.warn( UserWarning('Zerion Adapter registry got an update')) result = ethereum_manager.ens_lookup('rotki.eth', call_order=call_order) assert result == '0x9531C059098e3d194fF87FebB587aB07B30B1306' # Test invalid name with pytest.raises(InputError) as e: ethereum_manager.ens_lookup('fl00_id.loopring.eth', call_order=call_order) assert "fl00_id.loopring.eth is an invalid name, because Codepoint U+005F not allowed at position 5 in 'fl00_id.loopring.eth'" in str( e.value) # noqa: E501 result = ethereum_manager.ens_lookup('ishouldprobablynotexist.eth', call_order=call_order) assert result is None result = ethereum_manager.ens_lookup('dsadsad', call_order=call_order) assert result is None
def test_get_transaction_by_hash(ethereum_manager, call_order, ethereum_manager_connect_at_start): wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) result = ethereum_manager.get_transaction_by_hash( hexstring_to_bytes( '0x5b180e3dcc19cd29c918b98c876f19393e07b74c07fd728102eb6241db3c2d5c' ), call_order=call_order, ) expected_tx = EthereumTransaction( tx_hash=make_evm_tx_hash( b'[\x18\x0e=\xcc\x19\xcd)\xc9\x18\xb9\x8c\x87o\x199>\x07\xb7L\x07\xfdr\x81\x02\xebbA\xdb<-\\' ), # noqa: E501 timestamp=1633128954, block_number=13336285, from_address='0x2F6789A208A05C762cA8d142A3df95d29C18b065', to_address='0x7Be8076f4EA4A4AD08075C2508e481d6C946D12b', value=33000000000000000, gas=294144, gas_price=66936353558, gas_used=218523, input_data= b"\xab\x83K\xab\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{\xe8\x07oN\xa4\xa4\xad\x08\x07\\%\x08\xe4\x81\xd6\xc9F\xd1+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/g\x89\xa2\x08\xa0\\v,\xa8\xd1B\xa3\xdf\x95\xd2\x9c\x18\xb0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x8d\xfa\x06\xdfX\x9a\x1e\x19W9\x1b\x86.\x02\xf7\x17X$\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00I_\x94rvt\x9c\xe6F\xf6\x8a\xc8\xc2HB\x00E\xcb{^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00{\xe8\x07oN\xa4\xa4\xad\x08\x07\\%\x08\xe4\x81\xd6\xc9F\xd1+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x8d\xfa\x06\xdfX\x9a\x1e\x19W9\x1b\x86.\x02\xf7\x17X$\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[2V\x96^|<\xf2n\x11\xfc\xaf)m\xfc\x88\x07\xc0\x10s\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00I_\x94rvt\x9c\xe6F\xf6\x8a\xc8\xc2HB\x00E\xcb{^\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00u=S=\x96\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00aW\x91\x84\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00C\x96\x18\xf8\xa6p,\x86\xbd?\xcf\x83\x8c3\xd3 \x89\x9f1\xffaX\x1a\r|\xa0\xcb\x12\xad\xbeY\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\xe2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00u=S=\x96\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00aU\xa9E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00bDI$\x9d\xc420bKZ\xb5v\x96\xf6\xef\xa0hg\x993\x00\x07y\x07]\x83\xc6\xd2I\x1c\x87\x19\x13\x1e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\n\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x02\xe0\x9f\xaa\xce\x1aZ\xaf\\'\xb7&\x99l\x10\xe7u4\x11\xc6V\x17\xb3\xb5)z\xd5\x04/7\xd8\x04\x07y\xb1\xa8\xfe\x0c\x1c\xa5\xc9\xc4{e\x07\xa2:\xee\x0f\xb3&\xcf_3[{\xcc\x13]~o\xe9\xd1\xd8\x02\xe0\x9f\xaa\xce\x1aZ\xaf\\'\xb7&\x99l\x10\xe7u4\x11\xc6V\x17\xb3\xb5)z\xd5\x04/7\xd8\x04\x07y\xb1\xa8\xfe\x0c\x1c\xa5\xc9\xc4{e\x07\xa2:\xee\x0f\xb3&\xcf_3[{\xcc\x13]~o\xe9\xd1\xd8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\xf2BC*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00/g\x89\xa2\x08\xa0\\v,\xa8\xd1B\xa3\xdf\x95\xd2\x9c\x18\xb0ep\x8d\xfa\x06\xdfX\x9a\x1e\x19W9\x1b\x86.\x02\xf7\x17X$\xe9\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\xf2BC*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x8d\xfa\x06\xdfX\x9a\x1e\x19W9\x1b\x86.\x02\xf7\x17X$\xe9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00p\x8d\xfa\x06\xdfX\x9a\x1e\x19W9\x1b\x86.\x02\xf7\x17X$\xe9\x00\x00\x00\x00\x00\x00\xac\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # noqa: E501 nonce=204, ) assert result == expected_tx
def test_call_contract(ethereum_manager, call_order, ethereum_manager_connect_at_start): wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) result = ethereum_manager.call_contract( contract_address=YEARN_YCRV_VAULT.address, abi=YEARN_YCRV_VAULT.abi, method_name='symbol', call_order=call_order, ) assert result == 'yyDAI+yUSDC+yUSDT+yTUSD' # also test that doing contract.call() has the same result result2 = YEARN_YCRV_VAULT.call(ethereum_manager, 'symbol', call_order=call_order) assert result == result2 result = ethereum_manager.call_contract( contract_address=YEARN_YCRV_VAULT.address, abi=YEARN_YCRV_VAULT.abi, method_name='balanceOf', arguments=['0x5dbcF33D8c2E976c6b560249878e6F1491Bca25c'], call_order=call_order, ) assert result >= 0
def test_query_all_protocol_balances_for_account( ethereum_manager, function_scope_messages_aggregator, inquirer, # pylint: disable=unused-argument ethereum_manager_connect_at_start, call_order, # pylint: disable=unused-argument ): """Simple test that we can get balances for various defi protocols via zerion At the moment we are using random accounts that at some point have balances in a protocol. So the test just checks that some balance is queried. No specific. TODO: Perhaps create a small rotki tests account on the mainnet that keeps a certain balance in a few DeFi protocols and does not change them. This way we can have something stable to check again. """ wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) zerion = ZerionSDK(ethereum_manager, function_scope_messages_aggregator) balances = zerion.all_balances_for_account( '0xf753beFE986e8Be8EBE7598C9d2b6297D9DD6662') if len(balances) == 0: test_warnings.warn( UserWarning('Test account for DeFi balances has no balances')) return assert len(balances) > 0 errors = function_scope_messages_aggregator.consume_errors() assert len(errors) == 0 warnings = function_scope_messages_aggregator.consume_warnings() assert len(warnings) == 0
def ethereum_manager( ethrpc_port, etherscan, messages_aggregator, ethrpc_endpoint, ethereum_manager_connect_at_start, greenlet_manager, database, ): if ethrpc_endpoint is None: endpoint = f'http://localhost:{ethrpc_port}' else: endpoint = ethrpc_endpoint manager = EthereumManager( ethrpc_endpoint=endpoint, etherscan=etherscan, database=database, msg_aggregator=messages_aggregator, greenlet_manager=greenlet_manager, connect_at_start=ethereum_manager_connect_at_start, ) wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=manager, ) return manager
def test_get_block_by_number(ethereum_manager, call_order, ethereum_manager_connect_at_start): wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) block = ethereum_manager.get_block_by_number(10304885, call_order=call_order) assert block['timestamp'] == 1592686213 assert block['number'] == 10304885 assert block['hash'] == '0xe2217ba1639c6ca2183f40b0f800185b3901faece2462854b3162d4c5077752c'
def test_get_logs(ethereum_manager, call_order, ethereum_manager_connect_at_start): wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) argument_filters = { 'from': '0x7780E86699e941254c8f4D9b7eB08FF7e96BBE10', 'to': YEARN_YCRV_VAULT.address, } events = ethereum_manager.get_logs( contract_address='0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8', abi=ERC20TOKEN_ABI, event_name='Transfer', argument_filters=argument_filters, from_block=10712531, to_block=10712753, call_order=call_order, ) assert len(events) == 1 expected_event = { 'address': '0xdF5e0e81Dff6FAF3A7e52BA697820c5e32D806A8', 'blockNumber': 10712731, 'data': '0x0000000000000000000000000000000000000000000001e3f60028423cff0000', 'gasPrice': 72000000000, 'gasUsed': 93339, 'logIndex': 157, 'topics': [ '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef', '0x0000000000000000000000007780e86699e941254c8f4d9b7eb08ff7e96bbe10', '0x0000000000000000000000005dbcf33d8c2e976c6b560249878e6f1491bca25c', ], 'transactionHash': '0xca33e56e1e529dacc9aa1261c8ba9230927329eb609fbe252e5bd3c2f5f3bcc9', 'transactionIndex': 85, } assert_serialized_dicts_equal( events[0], expected_event, same_key_length=False, ignore_keys=[ 'timeStamp', # returned from etherscan 'blockHash', # returned from web3 'removed', # returned from web3 ], )
def test_get_eth2_staking_deposits_onchain( # pylint: disable=unused-argument ethereum_manager, call_order, ethereum_manager_connect_at_start, inquirer, price_historian, ): """ Test on-chain request of deposit events for ADDR1, ADDR2 and ADDR3 in a specific time range: - From ts: 1604506685 (from EXPECTED_DEPOSITS[0].timestamp) - To ts: 1605044577 (from EXPECTED_DEPOSITS[-1].timestamp) NB: Using `to_ts` from datetime now is for showing usefulness of freezegun """ from_ts = EXPECTED_DEPOSITS[0].timestamp # 1604506685 to_ts = int(datetime.now().timestamp()) # 1605044577 wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) # Main call deposits = _get_eth2_staking_deposits_onchain( ethereum=ethereum_manager, addresses=[ADDR1, ADDR2, ADDR3], msg_aggregator=MessagesAggregator(), from_ts=from_ts, to_ts=to_ts, ) # Querying filtering by a timestamp range and specific addresses, and # having replicated the deposits in EXPECTED_DEPOSITS allows to assert the # length. Due to `_get_eth2_staking_deposits_onchain()` does not implement # sorting deposits by (timestamp, log_index), asserting both lists against # each other is discarded assert len(deposits) == len(EXPECTED_DEPOSITS) for expected_deposit in EXPECTED_DEPOSITS: assert expected_deposit in deposits total_addr1 = sum( deposit.value.amount for deposit in deposits if deposit.from_address == ADDR1 ) total_addr2 = sum( deposit.value.amount for deposit in deposits if deposit.from_address == ADDR2 ) total_addr3 = sum( deposit.value.amount for deposit in deposits if deposit.from_address == ADDR3 ) assert total_addr1 == FVal(32) assert total_addr2 == FVal(64) assert total_addr3 == FVal(480)
def test_use_open_nodes(ethereum_manager, call_order, ethereum_manager_connect_at_start): """Test that we can connect to and use the open nodes (except from etherscan)""" # Wait until all nodes are connected wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) result = ethereum_manager.get_transaction_receipt( '0x12d474b6cbba04fd1a14e55ef45b1eb175985612244631b4b70450c888962a89', call_order=call_order, ) block_hash = '0x6f3a7838a8788c3371b88df170c3643d19bad896c915a7368681292882b6ad61' assert result['blockHash'] == block_hash
def test_ens_lookup(ethereum_manager, call_order, ethereum_manager_connect_at_start): """Test that ENS lookup works. Both with etherscan and with querying a real node""" wait_until_all_nodes_connected(ethereum_manager_connect_at_start, ethereum_manager) result = ethereum_manager.ens_lookup('api.zerion.eth', call_order) assert result is not None if result != ZERION_ADAPTER_ADDRESS: test_warnings.warn(UserWarning('Zerion Adapter registry got an update')) result = ethereum_manager.ens_lookup('rotki.eth', call_order) assert result == '0x9531C059098e3d194fF87FebB587aB07B30B1306' result = ethereum_manager.ens_lookup('ishouldprobablynotexist.eth', call_order) assert result is None result = ethereum_manager.ens_lookup('dsadsad', call_order) assert result is None
def test_use_open_nodes(ethereum_manager, call_order, ethereum_manager_connect_at_start): """Test that we can connect to and use the open nodes (except from etherscan) Note: If this fails with transaction not found probably open nodes started pruning. Change test to use a more recent transaction. """ # Wait until all nodes are connected wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) result = ethereum_manager.get_transaction_receipt( '0x1470187132df3b6755ed30774a772ec8bbc1cd27f10a8a6b7f6095dd95560f20', call_order=call_order, ) block_hash = '0x23daab1980fd238778750bf9ac732fa1bb45e3439fa208ac47f5995efb5924e3' assert result['blockHash'] == block_hash
def test_get_log_and_receipt_etherscan_bad_tx_index( ethereum_manager, call_order, ethereum_manager_connect_at_start, ): """ https://etherscan.io/tx/0x00eea6359d247c9433d32620358555a0fd3265378ff146b9511b7cff1ecb7829 contains a log entry which in etherscan has transaction index 0x. Our code was not handling this well and was raising ValueError. This is a regression test for that. """ wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) # Test getting the offending log entry does not raise argument_filters = { 'from': ZERO_ADDRESS, 'to': '0xbA215F7BE6c620dA3F8240B82741eaF3C5f5D786', } events = ethereum_manager.get_logs( contract_address='0xFC4B8ED459e00e5400be803A9BB3954234FD50e3', abi=ATOKEN_ABI, event_name='Transfer', argument_filters=argument_filters, from_block=10773651, to_block=10773653, call_order=call_order, ) assert len(events) == 2 assert events[0]['transactionIndex'] == 0 assert events[1]['transactionIndex'] == 0 # Test getting the transaction receipt (also containing the log entries) does not raise # They seem to all be 0 result = ethereum_manager.get_transaction_receipt( hexstring_to_bytes( '0x00eea6359d247c9433d32620358555a0fd3265378ff146b9511b7cff1ecb7829' ), call_order=call_order, ) assert all(x['transactionIndex'] == 0 for x in result['logs'])
def init_ethereum(rpc_endpoint: str, use_other_nodes: bool) -> EthereumManager: nodes_to_connect = ETHEREUM_NODES_TO_CONNECT_AT_START if use_other_nodes else ( NodeName.OWN, ) msg_aggregator = MessagesAggregator() etherscan = Etherscan(database=None, msg_aggregator=msg_aggregator) api_key = os.environ.get('ETHERSCAN_API_KEY', None) greenlet_manager = GreenletManager(msg_aggregator=msg_aggregator) etherscan.api_key = api_key ethereum = EthereumManager( ethrpc_endpoint=rpc_endpoint, etherscan=etherscan, msg_aggregator=msg_aggregator, greenlet_manager=greenlet_manager, connect_at_start=nodes_to_connect, ) wait_until_all_nodes_connected( ethereum_manager_connect_at_start=nodes_to_connect, ethereum=ethereum, ) return ethereum
def test_ens_lookup_multichain( ethereum_manager, call_order, ethereum_manager_connect_at_start, ): """Tests that ENS multichain lookup works as expected. Testing ENS domain is 'bruno.eth' from Kusama documention (it shouldn't change) https://app.ens.domains/name/bruno.eth """ wait_until_all_nodes_connected(ethereum_manager_connect_at_start, ethereum_manager) # Test default Ethereum result = ethereum_manager.ens_lookup(ENS_BRUNO, call_order=call_order) assert result == ENS_BRUNO_ETH_ADDR # Test blockchain Ethereum (defaults to 'addr(bytes32)') result = ethereum_manager.ens_lookup( ENS_BRUNO, call_order=call_order, blockchain=SupportedBlockchain.ETHEREUM, ) assert result == ENS_BRUNO_ETH_ADDR # Test blockchain Bitcoin result = ethereum_manager.ens_lookup( ENS_BRUNO, call_order=call_order, blockchain=SupportedBlockchain.BITCOIN, ) assert result == ENS_BRUNO_BTC_BYTES # Test blockchain Kusama result = ethereum_manager.ens_lookup( ENS_BRUNO, call_order=call_order, blockchain=SupportedBlockchain.KUSAMA, ) assert result == ENS_BRUNO_SUBSTRATE_PUBLIC_KEY
def test_get_transaction_receipt(ethereum_manager, call_order, ethereum_manager_connect_at_start): wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) result = ethereum_manager.get_transaction_receipt( '0x12d474b6cbba04fd1a14e55ef45b1eb175985612244631b4b70450c888962a89', call_order=call_order, ) block_hash = '0x6f3a7838a8788c3371b88df170c3643d19bad896c915a7368681292882b6ad61' assert result['blockHash'] == block_hash assert len(result['logs']) == 2 assert result['gasUsed'] == 144046 assert result['blockNumber'] == 10840714 assert result['logs'][0]['blockNumber'] == 10840714 assert result['logs'][1]['blockNumber'] == 10840714 assert result['status'] == 1 assert result['transactionIndex'] == 110 assert result['logs'][0]['transactionIndex'] == 110 assert result['logs'][1]['transactionIndex'] == 110 assert result['logs'][0]['logIndex'] == 235 assert result['logs'][1]['logIndex'] == 236
def initialize_mock_rotkehlchen_instance( rotki, start_with_logged_in_user, start_with_valid_premium, db_password, rotki_premium_credentials, username, blockchain_accounts, include_etherscan_key, include_cryptocompare_key, should_mock_price_queries, mocked_price_queries, ethereum_modules, db_settings, ignored_assets, tags, manually_tracked_balances, default_mock_price_value, ethereum_manager_connect_at_start, kusama_manager_connect_at_start, eth_rpc_endpoint, ksm_rpc_endpoint, aave_use_graph, max_tasks_num, ): if not start_with_logged_in_user: return # Mock the initial get settings to include the specified ethereum modules def mock_get_settings() -> DBSettings: settings = DBSettings( active_modules=ethereum_modules, eth_rpc_endpoint=eth_rpc_endpoint, ksm_rpc_endpoint=ksm_rpc_endpoint, ) return settings settings_patch = patch.object(rotki, 'get_settings', side_effect=mock_get_settings) # Do not connect to the usual nodes at start by default. Do not want to spam # them during our tests. It's configurable per test, with the default being nothing eth_rpcconnect_patch = patch( 'rotkehlchen.rotkehlchen.ETHEREUM_NODES_TO_CONNECT_AT_START', new=ethereum_manager_connect_at_start, ) ksm_rpcconnect_patch = patch( 'rotkehlchen.rotkehlchen.KUSAMA_NODES_TO_CONNECT_AT_START', new=kusama_manager_connect_at_start, ) ksm_connect_on_startup_patch = patch.object( rotki, '_connect_ksm_manager_on_startup', return_value=bool(blockchain_accounts.ksm), ) with settings_patch, eth_rpcconnect_patch, ksm_rpcconnect_patch, ksm_connect_on_startup_patch: rotki.unlock_user( user=username, password=db_password, create_new=True, sync_approval='no', premium_credentials=None, ) # configure when task manager should run for tests rotki.task_manager.max_tasks_num = max_tasks_num if start_with_valid_premium: rotki.premium = Premium(rotki_premium_credentials) rotki.premium_sync_manager.premium = rotki.premium # After unlocking when all objects are created we need to also include # customized fixtures that may have been set by the tests rotki.chain_manager.accounts = blockchain_accounts add_settings_to_test_db(rotki.data.db, db_settings, ignored_assets) maybe_include_etherscan_key(rotki.data.db, include_etherscan_key) maybe_include_cryptocompare_key(rotki.data.db, include_cryptocompare_key) add_blockchain_accounts_to_db(rotki.data.db, blockchain_accounts) add_tags_to_test_db(rotki.data.db, tags) add_manually_tracked_balances_to_test_db(rotki.data.db, manually_tracked_balances) maybe_mock_historical_price_queries( historian=PriceHistorian(), should_mock_price_queries=should_mock_price_queries, mocked_price_queries=mocked_price_queries, default_mock_value=default_mock_price_value, ) wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=rotki.chain_manager.ethereum, ) wait_until_all_substrate_nodes_connected( substrate_manager_connect_at_start=kusama_manager_connect_at_start, substrate_manager=rotki.chain_manager.kusama, ) aave = rotki.chain_manager.get_module('aave') if aave: aave.use_graph = aave_use_graph
def test_get_transaction_receipt( ethereum_manager, call_order, ethereum_manager_connect_at_start, database, ): wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) tx_hash = deserialize_evm_tx_hash( '0x12d474b6cbba04fd1a14e55ef45b1eb175985612244631b4b70450c888962a89' ) # noqa: E501 result = ethereum_manager.get_transaction_receipt(tx_hash, call_order=call_order) block_hash = '0x6f3a7838a8788c3371b88df170c3643d19bad896c915a7368681292882b6ad61' assert result['blockHash'] == block_hash assert len(result['logs']) == 2 assert result['gasUsed'] == 144046 assert result['blockNumber'] == 10840714 assert result['logs'][0]['blockNumber'] == 10840714 assert result['logs'][1]['blockNumber'] == 10840714 assert result['status'] == 1 assert result['transactionIndex'] == 110 assert result['logs'][0]['transactionIndex'] == 110 assert result['logs'][1]['transactionIndex'] == 110 assert result['logs'][0]['logIndex'] == 235 assert result['logs'][1]['logIndex'] == 236 from_addy = make_ethereum_address() to_addy = make_ethereum_address() database.add_blockchain_accounts( blockchain=SupportedBlockchain.ETHEREUM, account_data=[ BlockchainAccountData(address=from_addy), BlockchainAccountData(address=to_addy), ], ) db = DBEthTx(database) db.add_ethereum_transactions( [ EthereumTransaction( # need to add the tx first tx_hash=tx_hash, timestamp=1, # all other fields don't matter for this test block_number=1, from_address=from_addy, to_address=to_addy, value=1, gas=1, gas_price=1, gas_used=1, input_data=b'', nonce=1, ) ], relevant_address=from_addy, ) # also test receipt can be stored and retrieved from the DB. # This tests that all node types (say openethereum) are processed properly db.add_receipt_data(result) receipt = db.get_receipt(tx_hash) assert receipt == EthereumTxReceipt( tx_hash=tx_hash, contract_address=None, status=True, type=0, logs=[ EthereumTxReceiptLog( log_index=235, data= b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02T\x0b\xe4\x00', # noqa: E501 address='0x5bEaBAEBB3146685Dd74176f68a0721F91297D37', removed=False, topics=[ b'\xdd\xf2R\xad\x1b\xe2\xc8\x9bi\xc2\xb0h\xfc7\x8d\xaa\x95+\xa7\xf1c\xc4\xa1\x16(\xf5ZM\xf5#\xb3\xef', # noqa: E501 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00s(*c\xf0\xe3\xd7\xe9`EuB\x0fwsa\xec\xa3\xc8j', # noqa: E501 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6 \xf1\x93ME\x84\xdd\xa6\x99\x9e\xdc\xad\xd3)\x81)dj\xa5', # noqa: E501 ]), EthereumTxReceiptLog( log_index=236, data= b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6 \xf1\x93ME\x84\xdd\xa6\x99\x9e\xdc\xad\xd3)\x81)dj\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb6 \xf1\x93ME\x84\xdd\xa6\x99\x9e\xdc\xad\xd3)\x81)dj\xa5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00[\xea\xba\xeb\xb3\x14f\x85\xddt\x17oh\xa0r\x1f\x91)}7\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02T\x0b\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\r\xe0\xb6\xb3\xa7d\x00\x00', # noqa: E501 address='0x73282A63F0e3D7e9604575420F777361ecA3C86A', removed=False, topics=[ b'\xd6\xd4\xf5h\x1c$l\x9fB\xc2\x03\xe2\x87\x97Z\xf1`\x1f\x8d\xf8\x03Z\x92Q\xf7\x9a\xab\\\x8f\t\xe2\xf8' ], # noqa: E501 ), ])
def test_get_eth2_staking_deposits_fetch_from_db( # pylint: disable=unused-argument ethereum_manager, call_order, ethereum_manager_connect_at_start, inquirer, price_historian, freezer, ): """ Test new on-chain requests for existing addresses requires a difference of REQUEST_DELTA_TS since last used query range `end_ts`. """ freezer.move_to(datetime.fromtimestamp(EXPECTED_DEPOSITS[0].timestamp)) ts_now = int(datetime.now().timestamp()) # 1604506685 database = MagicMock() database.get_used_query_range.side_effect = [ (Timestamp(ts_now - (2 * REQUEST_DELTA_TS)), Timestamp(ts_now)), (Timestamp(ts_now - (2 * REQUEST_DELTA_TS)), Timestamp(ts_now)), (Timestamp(ts_now - (2 * REQUEST_DELTA_TS)), Timestamp(ts_now)), ] dbeth2 = MagicMock() dbeth2.get_eth2_deposits.side_effect = [ [], # no on-chain request, nothing in DB [], # no on-chain request, nothing in DB [EXPECTED_DEPOSITS[0]], # on-chain request, deposit in DB ] dbeth2_mock = patch('rotkehlchen.chain.ethereum.eth2.DBEth2', return_value=dbeth2) with dbeth2_mock, patch( 'rotkehlchen.chain.ethereum.eth2._get_eth2_staking_deposits_onchain', ) as mock_get_eth2_staking_deposits_onchain: # 3rd call return mock_get_eth2_staking_deposits_onchain.return_value = [ EXPECTED_DEPOSITS[0] ] wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=ethereum_manager, ) message_aggregator = MessagesAggregator() # First call deposit_results_onchain = get_eth2_staking_deposits( ethereum=ethereum_manager, addresses=[ADDR1], msg_aggregator=message_aggregator, database=database, ) assert deposit_results_onchain == [] mock_get_eth2_staking_deposits_onchain.assert_not_called() # NB: Move time to ts_now + REQUEST_DELTA_TS - 1s freezer.move_to(datetime.fromtimestamp(ts_now + REQUEST_DELTA_TS - 1)) # Second call deposit_results_onchain = get_eth2_staking_deposits( ethereum=ethereum_manager, addresses=[ADDR1], msg_aggregator=message_aggregator, database=database, ) assert deposit_results_onchain == [] mock_get_eth2_staking_deposits_onchain.assert_not_called() # NB: Move time to ts_now + REQUEST_DELTA_TS (triggers request) freezer.move_to(datetime.fromtimestamp(ts_now + REQUEST_DELTA_TS)) # Third call deposit_results_onchain = get_eth2_staking_deposits( ethereum=ethereum_manager, addresses=[ADDR1], msg_aggregator=message_aggregator, database=database, ) assert deposit_results_onchain == [EXPECTED_DEPOSITS[0]] mock_get_eth2_staking_deposits_onchain.assert_called_with( ethereum=ethereum_manager, addresses=[ADDR1], msg_aggregator=message_aggregator, from_ts=Timestamp(ts_now), to_ts=Timestamp(ts_now + REQUEST_DELTA_TS), )
def initialize_mock_rotkehlchen_instance( rotki, start_with_logged_in_user, start_with_valid_premium, db_password, rotki_premium_credentials, username, blockchain_accounts, include_etherscan_key, include_cryptocompare_key, should_mock_price_queries, mocked_price_queries, ethereum_modules, db_settings, ignored_assets, tags, manually_tracked_balances, default_mock_price_value, ethereum_manager_connect_at_start, kusama_manager_connect_at_start, eth_rpc_endpoint, ksm_rpc_endpoint, aave_use_graph, max_tasks_num, legacy_messages_via_websockets, data_migration_version, use_custom_database, user_data_dir, perform_migrations_at_unlock, perform_upgrades_at_unlock, ): if not start_with_logged_in_user: return # Mock the initial get settings to include the specified ethereum modules def mock_get_settings() -> DBSettings: settings = DBSettings( active_modules=ethereum_modules, eth_rpc_endpoint=eth_rpc_endpoint, ksm_rpc_endpoint=ksm_rpc_endpoint, ) return settings settings_patch = patch.object(rotki, 'get_settings', side_effect=mock_get_settings) # Do not connect to the usual nodes at start by default. Do not want to spam # them during our tests. It's configurable per test, with the default being nothing eth_rpcconnect_patch = patch( 'rotkehlchen.rotkehlchen.ETHEREUM_NODES_TO_CONNECT_AT_START', new=ethereum_manager_connect_at_start, ) ksm_rpcconnect_patch = patch( 'rotkehlchen.rotkehlchen.KUSAMA_NODES_TO_CONNECT_AT_START', new=kusama_manager_connect_at_start, ) ksm_connect_on_startup_patch = patch.object( rotki, '_connect_ksm_manager_on_startup', return_value=bool(blockchain_accounts.ksm), ) # patch the constants to make sure that the periodic query for icons # does not run during tests size_patch = patch('rotkehlchen.rotkehlchen.ICONS_BATCH_SIZE', new=0) sleep_patch = patch('rotkehlchen.rotkehlchen.ICONS_QUERY_SLEEP', new=999999) create_new = True if use_custom_database is not None: _use_prepared_db(user_data_dir, use_custom_database) create_new = False with ExitStack() as stack: stack.enter_context(settings_patch) stack.enter_context(eth_rpcconnect_patch) stack.enter_context(ksm_rpcconnect_patch) stack.enter_context(ksm_connect_on_startup_patch) stack.enter_context(size_patch) stack.enter_context(sleep_patch) if perform_migrations_at_unlock is False: migrations_patch = patch.object( DataMigrationManager, 'maybe_migrate_data', side_effect=lambda *args: None, ) stack.enter_context(migrations_patch) if perform_upgrades_at_unlock is False: upgrades_patch = patch.object( DBUpgradeManager, 'run_upgrades', side_effect=lambda *args: None, ) stack.enter_context(upgrades_patch) rotki.unlock_user( user=username, password=db_password, create_new=create_new, sync_approval='no', premium_credentials=None, ) # configure when task manager should run for tests rotki.task_manager.max_tasks_num = max_tasks_num if start_with_valid_premium: rotki.premium = Premium(rotki_premium_credentials) rotki.premium_sync_manager.premium = rotki.premium rotki.chain_manager.premium = rotki.premium # Add premium to all the modules for module_name in AVAILABLE_MODULES_MAP: module = rotki.chain_manager.get_module(module_name) if module is not None: module.premium = rotki.premium if legacy_messages_via_websockets is False: rotki.msg_aggregator.rotki_notifier = None # After unlocking when all objects are created we need to also include # customized fixtures that may have been set by the tests rotki.chain_manager.accounts = blockchain_accounts add_settings_to_test_db(rotki.data.db, db_settings, ignored_assets, data_migration_version) maybe_include_etherscan_key(rotki.data.db, include_etherscan_key) maybe_include_cryptocompare_key(rotki.data.db, include_cryptocompare_key) add_blockchain_accounts_to_db(rotki.data.db, blockchain_accounts) add_tags_to_test_db(rotki.data.db, tags) add_manually_tracked_balances_to_test_db(rotki.data.db, manually_tracked_balances) maybe_mock_historical_price_queries( historian=PriceHistorian(), should_mock_price_queries=should_mock_price_queries, mocked_price_queries=mocked_price_queries, default_mock_value=default_mock_price_value, ) wait_until_all_nodes_connected( ethereum_manager_connect_at_start=ethereum_manager_connect_at_start, ethereum=rotki.chain_manager.ethereum, ) wait_until_all_substrate_nodes_connected( substrate_manager_connect_at_start=kusama_manager_connect_at_start, substrate_manager=rotki.chain_manager.kusama, ) aave = rotki.chain_manager.get_module('aave') if aave: aave.use_graph = aave_use_graph