diff --git a/crypto/sol/modules/webui.py b/crypto/sol/modules/webui.py index 3c65f80..69e4dca 100644 --- a/crypto/sol/modules/webui.py +++ b/crypto/sol/modules/webui.py @@ -187,11 +187,12 @@ def init_app(tr_handler=None): token_inputs = swap_event.get('tokenInputs', []) token_outputs = swap_event.get('tokenOutputs', []) - - usdcMint = LIQUIDITY_TOKENS[0] tr = {} wallet = data[0]['feePayer'] # Using feePayer as the wallet address tx_signature = data[0]['signature'] + usdcMint = LIQUIDITY_TOKENS[0] + solMint = LIQUIDITY_TOKENS[1] + try: # Determine transaction type @@ -203,31 +204,39 @@ def init_app(tr_handler=None): else: tr["type"] = "SWAP" + + if swap_event.get('nativeInput', None): + tr["token_in"] = solMint + tr["amount_in"] = int(swap_event.get('nativeInput')["amount"])/ 10**6 + tr["type"] = "BUY" + tr["token_in_decimals"] = 6 + + if swap_event.get('nativeOutput', None): + tr["token_out"] = solMint + tr["amount_out"] = int(swap_event.get('nativeOutput')["amount"]) / 10**6 + tr["type"] = "SELL" + tr["token_out_decimals"] = 6 + if not token_inputs or len(token_inputs) == 0: logging.info("Assumed USDC as first token. BUY transaction detected") tr["token_in"] = usdcMint tr["type"] = "BUY" - prices = await SolanaAPI.DEX.get_token_prices([token_outputs[0]["mint"]]) - tr["amount_in"] = prices[token_outputs[0]["mint"]] * int(token_outputs[0]["rawTokenAmount"]["tokenAmount"]) / 10** int(token_outputs[0]["rawTokenAmount"]["decimals"]) - + tr["amount_in"] = await calculate_price_amount(token_outputs[0]) else: token_in = token_inputs[0] tr["token_in"] = token_in["mint"] - tr["token_in_decimals"] = token_in["rawTokenAmount"]["decimals"] - tr["amount_in"] = float(int(token_in["rawTokenAmount"]["tokenAmount"]) / 10**token_in["rawTokenAmount"]["decimals"]) + tr["token_in_decimals"] = get_decimals(token_in) + tr["amount_in"] = calculate_amount(token_in) if not token_outputs or len(token_outputs) == 0: logging.info("Assumed USDC as second token. SELL transaction detected") tr["token_out"] = usdcMint tr["type"] = "SELL" - prices = await SolanaAPI.DEX.get_token_prices([token_inputs[0]["mint"]]) - tr["amount_out"] = prices[token_inputs[0]["mint"]] * int(token_inputs[0]["rawTokenAmount"]["tokenAmount"]) / 10** int(token_inputs[0]["rawTokenAmount"]["decimals"]) - + tr["amount_out"] = await calculate_price_amount(token_inputs[0]) else: token_out = token_outputs[0] tr["token_out"] = token_out["mint"] - tr["token_out_decimals"] = token_out["rawTokenAmount"]["decimals"] - tr["amount_out"] = float(int(token_out["rawTokenAmount"]["tokenAmount"]) / 10**token_out["rawTokenAmount"]["decimals"]) + tr["token_out_decimals"] = get_decimals(token_out) # Store transaction in database if tr["type"] in ["BUY", "SELL"]: @@ -287,7 +296,7 @@ def init_app(tr_handler=None): value_out_usd=tr.get("swap_amount_usd", 0) if not is_buy else 0, tx_signature=tx_signature ) - try: storage.store_transaction(copyTransaction) + try: await storage.store_transaction(copyTransaction) except: logging.error(traceback.format_exc()) # Attempt to execute the copytrade transaction @@ -298,10 +307,10 @@ def init_app(tr_handler=None): else: await SolanaAPI.SAPI.follow_move(tr) # Store the successful copytrade transaction - storage.store_transaction(wallet, "SWAP", tr['symbol_in'] , tr['amount_in'], tr['value_in_USD'], tr['symbol_out'], tr['amount_out'], tr['value_out_USD'],tx_signature) + await storage.store_transaction(wallet, "SWAP", tr['symbol_in'] , tr['amount_in'], tr['value_in_USD'], tr['symbol_out'], tr['amount_out'], tr['value_out_USD'],tx_signature) except Exception as e: # Store the failed copytrade transaction - storage.store_transaction(wallet, "SWAP_FAIL", tr['symbol_in'] , tr['amount_in'], tr['value_in_USD'], tr['symbol_out'], tr['amount_out'], tr['value_out_USD'],tx_signature) + # await storage.store_transaction(wallet, "SWAP_FAIL", tr['symbol_in'] , tr['amount_in'], tr['value_in_USD'], tr['symbol_out'], tr['amount_out'], tr['value_out_USD'],tx_signature) logging.error(f"Copytrade transaction failed: {e}") # ToDo - probably optimize await SolanaAPI.DEX.save_token_info() @@ -312,6 +321,19 @@ def init_app(tr_handler=None): # Log the full traceback for debugging logging.error(traceback.format_exc()) + def get_decimals(token_data): + return token_data["rawTokenAmount"].get("decimals") or token_data["rawTokenAmount"].get("decimalFs", 0) + def calculate_amount(token_data): + decimals = get_decimals(token_data) + token_amount = int(token_data["rawTokenAmount"]["tokenAmount"]) + return float(token_amount / 10**decimals) + async def calculate_price_amount(token_data, prices=None): + if not prices: + prices = await SolanaAPI.DEX.get_token_prices([token_data["mint"]]) + decimals = get_decimals(token_data) + token_amount = int(token_data["rawTokenAmount"]["tokenAmount"]) + return prices[token_data["mint"]] * token_amount / 10**decimals + @app.route('/replay_wh', methods=['POST']) async def replay_wh(): try: