This commit is contained in:
Dobromir Popov 2024-11-12 03:07:12 +02:00
parent a2b775029a
commit d4a7c0b653

View File

@ -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: