import time
from kafka import KafkaConsumer
from concurrent.futures import ProcessPoolExecutor
from concurrent.futures.process import BrokenProcessPool
from logger import Logger
from chain_data.helper import DeFiContract
from chain_data.driver import DbMytokenConn
import json
import web3
import grequests
from config import cfg
logging = Logger.default_logger('chain_currency_data')
dbmt = DbMytokenConn()
def g_handler(*args):
logging.error("post error")
# 并发同步 post 到
def async_post_to_remote(post_data):
"""
并发post
:param post_data:
:return:
"""
post_list = [grequests.post(cfg.get('api', 'holder_percent_create'), data={'json': json.dumps(item)}) for item in
post_data]
print(post_list)
# grequests.map(post_list, size=20, exception_handler=g_handler)
# logging.debug('async post successfully:data_count={}'.format(len(post_data)))
def process_msg():
# data = json.loads(msg.value.decode('utf-8'))
# print('data', data)
data = {"market_id": 2355, "contract_address": "0x0eD7e52944161450477ee417DE9Cd3a859b14fD0"}
contract_address = data['contract_address']
market_id = data['market_id']
chain_type = dbmt.get_chain_type(market_id)
print('{} {} {}', market_id, chain_type,contract_address)
if contract_address and market_id and chain_type:
print(contract_address)
pair_contract = DeFiContract(contract_address, 'Pair', chain='bsc')
# print('{} {}', pair_contract, chain_type)
token0_address = pair_contract.token0()
print(token0_address)
# token0 = DeFiContract(token0_address, 'ERC20', chain='bsc')
# print('token0' ,token0)
# try:
# decimals0 = token0.decimals()
# except web3.exceptions.ContractLogicError:
# decimals0 = 18
# except web3.exceptions.BadFunctionCallOutput:
# decimals0 = 18
# token1_address = pair_contract.token1()
# token1 = DeFiContract(token1_address, 'ERC20', chain='bsc')
# try:
# decimals1 = token1.decimals()
# except web3.exceptions.ContractLogicError:
# decimals1 = 18
# except web3.exceptions.BadFunctionCallOutput:
# decimals1 = 18
# reserve0, reserve1, _ = pair_contract.getReserves()
# reserve0 = reserve0 / (10 ** decimals0)
# reserve1 = reserve1 / (10 ** decimals1)
#
# print('{} {}', reserve0, reserve1)
# token0_price_usd = float(dbmt.get_price(token0_address))
# token1_price_usd = float(dbmt.get_price(token1_address))
#
# if token0_price_usd == 0:
# anchor_pro = float('{:.4f}'.format(reserve1 / reserve0)) if reserve0 != 0 else 0
# token0_price_usd = float(token1_price_usd * anchor_pro)
# if token1_price_usd == 0:
# anchor_pro = float('{:+.4f}'.format(reserve0 / reserve1)) if reserve1 != 0 else 0
# token1_price_usd = float('{:.2f}'.format(anchor_pro * token0_price_usd))
# lock_amount = float('{:.2f}'.format(reserve0 * token0_price_usd + reserve1 * token1_price_usd))
# print('{} {} {:>15.2f} {:>15.2f} {} {}'.format(contract_address, reserve0, reserve1, token0_price_usd, token1_price_usd,lock_amount))
#
# currency_map = []
# dict_data = {'market_id': market_id, 'contract_address': contract_address, 'lock_usd': lock_amount}
# currency_map.append(dict_data)
# if len(currency_map) > 3:
# async_post_to_remote(currency_map)
def run_consumer():
topic = 'topic_a'
print(cfg.get('kafka', 'online_brokers'))
consumer = KafkaConsumer(group_id='group_id_test', bootstrap_servers=cfg.get('kafka', 'online_brokers').split(','))
consumer.subscribe([topic])
pool = ProcessPoolExecutor(16)
for msg in consumer:
try:
pool.submit(process_msg, msg)
except BrokenProcessPool as e:
logging.info("BrokenProcessPool:{}".format(e))
continue
if __name__ == '__main__':
# while True:
# run_consumer()
# time.sleep(180)
process_msg()