using percent in following amounts
This commit is contained in:
parent
dc256e119a
commit
405445e6a8
15
crypto/sol/.env.example
Normal file
15
crypto/sol/.env.example
Normal file
@ -0,0 +1,15 @@
|
||||
|
||||
SOLANA_WS_URL="wss://api.mainnet-beta.solana.com"
|
||||
SOLANA_WS_URL2="wss://mainnet.rpcpool.com"
|
||||
SOLANA_HTTP_URL="https://api.mainnet-beta.solana.com"
|
||||
DEVELOPER_CHAT_ID="777826553"
|
||||
# Niki's
|
||||
# FOLLOWED_WALLET="9U7D916zuQ8qcL9kQZqkcroWhHGho5vD8VNekvztrutN"
|
||||
# My test Brave sync wallet
|
||||
FOLLOWED_WALLET="7QXGLRjvyFAmxdRaP9Wk18KwWTMfspF4Na2sr3o3PzxV"
|
||||
|
||||
TELEGRAM_BOT_TOKEN="6805059978:AAHNJKuOeazMSJHc3-BXRCsFfEVyFHeFnjw"
|
||||
DISPLAY_CURRENCY=USD
|
||||
|
||||
YOUR_WALLET="65nzyZXTLC81MthTo52a2gRJjqryTizWVqpK2fDKLye5"
|
||||
PK={}
|
@ -325,10 +325,17 @@ async def load_subscription_id():
|
||||
return int(subscription_id) if subscription_id else None
|
||||
|
||||
|
||||
async def get_token_name(mint_address):
|
||||
try:
|
||||
token_info = await solana_client.get_token_supply(Pubkey.from_string(mint_address))
|
||||
if token_info.value and 'symbol' in token_info.value:
|
||||
return token_info.value['symbol']
|
||||
except Exception as e:
|
||||
logging.error(f"Error fetching token name for {mint_address}: {str(e)}")
|
||||
return None
|
||||
|
||||
async def get_wallet_balances(wallet_address):
|
||||
balances = {}
|
||||
token_addresses = []
|
||||
logging.info(f"Getting balances for wallet: {wallet_address}")
|
||||
|
||||
try:
|
||||
@ -349,9 +356,9 @@ async def get_wallet_balances(wallet_address):
|
||||
mint = info['mint']
|
||||
amount = float(info['tokenAmount']['uiAmount'])
|
||||
if amount > 0:
|
||||
token_addresses.append(mint)
|
||||
balances[mint] = amount
|
||||
logging.debug(f"Balance for {mint}: {amount}")
|
||||
token_name = await get_token_name(mint) or mint
|
||||
balances[f"{token_name} ({mint})"] = amount
|
||||
logging.debug(f"Balance for {token_name} ({mint}): {amount}")
|
||||
else:
|
||||
logging.warning(f"Unexpected data format for account: {account}")
|
||||
|
||||
@ -364,18 +371,15 @@ async def get_wallet_balances(wallet_address):
|
||||
except Exception as e:
|
||||
logging.error(f"Error getting wallet balances: {str(e)}")
|
||||
|
||||
return balances, token_addresses
|
||||
|
||||
|
||||
|
||||
return balances
|
||||
|
||||
async def list_initial_wallet_states():
|
||||
global TOKEN_ADDRESSES, FOLLOWED_WALLET_VALUE, YOUR_WALLET_VALUE
|
||||
|
||||
followed_wallet_balances, followed_token_addresses = await get_wallet_balances(FOLLOWED_WALLET)
|
||||
your_wallet_balances, your_token_addresses = await get_wallet_balances(YOUR_WALLET)
|
||||
followed_wallet_balances = await get_wallet_balances(FOLLOWED_WALLET)
|
||||
your_wallet_balances = await get_wallet_balances(YOUR_WALLET)
|
||||
|
||||
all_token_addresses = list(set(followed_token_addresses + your_token_addresses))
|
||||
all_token_addresses = list(set(followed_wallet_balances.keys()) | set(your_wallet_balances.keys()))
|
||||
token_prices = await get_token_prices(all_token_addresses)
|
||||
sol_price = await get_sol_price()
|
||||
|
||||
@ -415,10 +419,6 @@ async def list_initial_wallet_states():
|
||||
await send_telegram_message(message)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
async def get_transaction_details_rpc(tx_signature, readfromDump=False):
|
||||
url = SOLANA_HTTP_URL
|
||||
# url = 'https://solana.drpc.org'
|
||||
@ -491,6 +491,7 @@ async def process_log(log_result):
|
||||
f"Token In: {details['token_in']}\n"
|
||||
f"Token Out: {details['token_out']}\n"
|
||||
f"Amount In USD: {details['amount_in_USD']}\n"
|
||||
f"Percentage Swapped: {details['percentage_swapped']:.2f}%"
|
||||
)
|
||||
|
||||
await send_telegram_message(message_text)
|
||||
@ -519,9 +520,9 @@ async def parse_swap_logs(logs):
|
||||
amount_out_expected = 0
|
||||
amount_out_actual = 0
|
||||
order_id = None
|
||||
before_source_balance = 0
|
||||
|
||||
for log in logs:
|
||||
# Check for token identifiers
|
||||
if "Program log:" in log:
|
||||
if "order_id:" in log:
|
||||
order_id = log.split("order_id: ")[-1].strip()
|
||||
@ -533,62 +534,61 @@ async def parse_swap_logs(logs):
|
||||
elif not token_out:
|
||||
token_out = log.split("Program log: ")[-1].strip()
|
||||
|
||||
# Use regex to find amount_in and amount_out patterns
|
||||
if "before_source_balance:" in log:
|
||||
before_source_balance = int(re.search(r"before_source_balance: (\d+)", log).group(1))
|
||||
|
||||
if "amount_in" in log or "amount_out" in log:
|
||||
amount_matches = re.findall(r"(amount_in|amount_out): (\d+)", log)
|
||||
for amount_type, value in amount_matches:
|
||||
if amount_type == "amount_in":
|
||||
amount_in = int(value)/1e6
|
||||
amount_in = int(value)
|
||||
elif amount_type == "amount_out":
|
||||
amount_out_expected = int(value)/1e6
|
||||
amount_out_expected = int(value)
|
||||
|
||||
# Check for source_token_change and destination_token_change for additional details
|
||||
elif "source_token_change:" in log or "destination_token_change:" in log:
|
||||
changes = log.split(", ")
|
||||
for change in changes:
|
||||
if "source_token_change" in change:
|
||||
amount_in = int(change.split(": ")[-1])/1e6
|
||||
amount_in = int(change.split(": ")[-1])
|
||||
elif "destination_token_change" in change:
|
||||
amount_out_actual = int(change.split(": ")[-1])/1e6
|
||||
amount_out_actual = int(change.split(": ")[-1])
|
||||
|
||||
token_prices = await get_token_prices([token_in, token_out])
|
||||
amount_in_usd = amount_in * token_prices.get(token_in, 0)
|
||||
amount_out_usd = amount_out_actual * token_prices.get(token_out, 0)
|
||||
amount_in_usd = amount_in / 1e6 * token_prices.get(token_in, 0)
|
||||
amount_out_usd = amount_out_actual / 1e6 * token_prices.get(token_out, 0)
|
||||
|
||||
# Calculate the percentage of the source balance that was swapped
|
||||
percentage_swapped = (amount_in / before_source_balance) * 100 if before_source_balance > 0 else 0
|
||||
|
||||
return {
|
||||
"order_id": order_id,
|
||||
"token_in": token_in,
|
||||
"token_out": token_out,
|
||||
"amount_in": amount_in,
|
||||
"amount_out_expected": amount_out_expected,
|
||||
"amount_out_actual": amount_out_actual,
|
||||
"amount_in": amount_in / 1e6,
|
||||
"amount_out_expected": amount_out_expected / 1e6,
|
||||
"amount_out_actual": amount_out_actual / 1e6,
|
||||
"amount_in_USD": amount_in_usd,
|
||||
"amount_out_USD": amount_out_usd,
|
||||
"percentage_swapped": percentage_swapped
|
||||
}
|
||||
|
||||
|
||||
async def follow_move(move):
|
||||
followed_balances = await get_wallet_balances(FOLLOWED_WALLET)
|
||||
your_balances = await get_wallet_balances(YOUR_WALLET)
|
||||
your_balance = your_balances.get(move['token_in'], 0)
|
||||
|
||||
followed_balance = followed_balances[move.token_in]
|
||||
your_balance = your_balances[move.token_in]
|
||||
|
||||
proportion = your_balance / followed_balance if followed_balance > 0 else 0
|
||||
amount_to_swap = move.amount_in * proportion
|
||||
# Calculate the amount to swap based on the same percentage as the followed move
|
||||
amount_to_swap = your_balance * (move['percentage_swapped'] / 100)
|
||||
|
||||
if your_balance >= amount_to_swap:
|
||||
try:
|
||||
# Initialize Jupiter client
|
||||
private_key = Keypair.from_bytes(base58.b58decode(os.getenv("PK")))
|
||||
async_client = AsyncClient(SOLANA_WS_URL)
|
||||
jupiter = Jupiter(async_client, private_key)
|
||||
|
||||
# Perform the swap
|
||||
transaction_data = await jupiter.swap(
|
||||
input_mint=move.token_in,
|
||||
output_mint=move.token_out,
|
||||
amount=int(amount_to_swap),
|
||||
input_mint=move['token_in'],
|
||||
output_mint=move['token_out'],
|
||||
amount=int(amount_to_swap * 1e6), # Convert to lamports
|
||||
slippage_bps=1,
|
||||
)
|
||||
|
||||
@ -601,8 +601,9 @@ async def follow_move(move):
|
||||
|
||||
message = (
|
||||
f"<b>Move Followed:</b>\n"
|
||||
f"Swapped {amount_to_swap:.6f} {move['token']} "
|
||||
f"for {transaction_data['outputAmount']:.6f} {move['to_token']}"
|
||||
f"Swapped {amount_to_swap:.6f} {move['token_in']} "
|
||||
f"(same {move['percentage_swapped']:.2f}% as followed wallet)\n"
|
||||
f"for {transaction_data['outputAmount'] / 1e6:.6f} {move['token_out']}"
|
||||
)
|
||||
logging.info(message)
|
||||
await send_telegram_message(message)
|
||||
@ -613,12 +614,12 @@ async def follow_move(move):
|
||||
else:
|
||||
message = (
|
||||
f"<b>Move Failed:</b>\n"
|
||||
f"Insufficient balance to swap {amount_to_swap:.6f} {move['token']}"
|
||||
f"Insufficient balance to swap {amount_to_swap:.6f} {move['token_in']}"
|
||||
)
|
||||
logging.warning(message)
|
||||
await send_telegram_message(message)
|
||||
|
||||
|
||||
# Helper functions (implement these according to your needs)
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user