all_token_price.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import json
  2. import os
  3. from pycoingecko import CoinGeckoAPI
  4. from rediscluster import RedisCluster
  5. import redis
  6. import ast
  7. import requests
  8. import traceback
  9. #const
  10. DEFAULT_PRICE = 0.00000000000000001
  11. #redis keys
  12. TOKENPRICE = 'TOKENPRICE_TO_FETCH'
  13. R = None
  14. # REDIS_ONLINE = 'denet-chain-prod.y2slbl.clustercfg.memorydb.us-east-1.amazonaws.com'
  15. # R = RedisCluster(host=REDIS_ONLINE, port=6379, decode_responses=True, skip_full_coverage_check=True)
  16. env = os.environ['ENV']
  17. redis_host = os.environ['redis_host']
  18. if env == 'dev':
  19. redis_password = os.environ['redis_password']
  20. R = redis.Redis(
  21. host=redis_host,
  22. port=6379,
  23. password='denet#2022',
  24. decode_responses=True)
  25. else:
  26. R = RedisCluster(host=redis_host, port=6379, decode_responses=True, skip_full_coverage_check=True)
  27. def get_swap_price(tokens):
  28. print('get_swap_price')
  29. ret_d = {}
  30. for t in tokens:
  31. segs = t.split('_')
  32. chain = segs[0]
  33. contract = segs[1]
  34. if chain.strip().upper() == 'BSC':
  35. price = get_pancakeswap_price(contract)
  36. if price is not None:
  37. ret_d[t] = price
  38. return ret_d
  39. def get_pancakeswap_price(contract):
  40. url = f'https://api.pancakeswap.info/api/v2/tokens/{contract}'
  41. try:
  42. ret = requests.get(url)
  43. price = float(ret.json()['data']['price'])
  44. print(price)
  45. return price
  46. except:
  47. traceback.print_exc()
  48. return None
  49. def get_coingecko_price(tokens):
  50. print('get_coingecko_price')
  51. exceptions = set()
  52. ret_d = {}
  53. try:
  54. cg = CoinGeckoAPI()
  55. coin_prices = cg.get_price(ids=list(tokens), vs_currencies='usd')
  56. print(coin_prices)
  57. for k, v in coin_prices.items():
  58. if v.get('usd') is None:
  59. exceptions.add(k)
  60. continue
  61. price = v['usd']
  62. ret_d[k] = price
  63. except:
  64. traceback.print_exc()
  65. print('get_coingecko_price exception tokens', exceptions)
  66. return ret_d
  67. def get_tokens():
  68. tokens = R.smembers(TOKENPRICE)
  69. tokens = [ast.literal_eval(t) for t in tokens]
  70. print(tokens)
  71. realtime_price_token = set()
  72. fixed_or_swap_price_token = set()
  73. for t in tokens:
  74. if t.get('fixed_price') is None:
  75. realtime_price_token.add(t.get('coingecko_id'))
  76. else:
  77. fixed_or_swap_price_token.add(f"{t.get('chain')}_{t.get('contract')}")
  78. realtime_price = get_coingecko_price(realtime_price_token) #{'coingecko_id':price}
  79. swap_price_token = get_swap_price(fixed_or_swap_price_token) #{'chain_contract': price}
  80. return tokens, realtime_price, swap_price_token
  81. def merge_price(tokens, realtime_price, swap_price_token):
  82. ret_d = {}
  83. exceptions = set()
  84. for t in tokens:
  85. chain = t.get('chain')
  86. contract = t.get('contract')
  87. coingecko_id = t.get('coingecko_id')
  88. fixed_price = t.get('fixed_price')
  89. now_price = realtime_price.get(coingecko_id)
  90. if now_price is None:
  91. now_price = swap_price_token.get(f'{chain}_{contract}')
  92. if now_price is None:
  93. now_price = fixed_price
  94. if now_price is None:
  95. exceptions.add(str(t))
  96. else:
  97. l = ret_d.get(chain, [])
  98. l.append({'contract': contract, 'usdPrice': now_price})
  99. ret_d[chain] = l
  100. print('merge_price exceptions', exceptions)
  101. return ret_d
  102. def save_price(prices):
  103. for chain, token_dict in prices.items():
  104. R.set(f'{TOKENPRICE}{chain.upper()}', json.dumps({'tokenPrice':token_dict}))
  105. print('add', f'{TOKENPRICE}{chain.upper()}', json.dumps({'tokenPrice':token_dict}))
  106. if __name__ == '__main__':
  107. tokens, realtime_price, swap_price_token = get_tokens()
  108. prices = merge_price(tokens, realtime_price, swap_price_token)
  109. save_price(prices)