diff --git a/crypto/sol/app.py b/crypto/sol/app.py index a926421..3997669 100644 --- a/crypto/sol/app.py +++ b/crypto/sol/app.py @@ -76,45 +76,49 @@ async def get_token_balance(wallet_address, token_address): +class SolanaEncoder(json.JSONEncoder): + def default(self, obj): + if hasattr(obj, '__dict__'): + return obj.__dict__ + return str(obj) + async def get_wallet_balances(wallet_address): balances = {} logging.info(f"Getting balances for wallet: {wallet_address}") - opts = TokenAccountOpts( - program_id=Pubkey.from_string("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), - encoding="jsonParsed" # Ensure encoding is set to jsonParsed - ) - try: - # Get all token accounts for the wallet - response = await solana_client.get_token_accounts_by_owner( + response = await solana_client.get_token_accounts_by_owner_json_parsed( Pubkey.from_string(wallet_address), - opts, + opts=TokenAccountOpts( + program_id=Pubkey.from_string("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") + ), commitment=Confirmed ) + logging.debug(f"Raw response: {json.dumps(response, indent=2, cls=SolanaEncoder)}") + if response.value: for account in response.value: - if 'parsed' in account.account.data and 'info' in account.account.data.parsed: - mint = account.account.data.parsed.info.mint + if 'parsed' in account.account.data and 'info' in account.account.data['parsed']: + mint = account.account.data['parsed']['info']['mint'] balance_response = await solana_client.get_token_account_balance(account.pubkey) if balance_response.value: - amount = float(balance_response.value.uiAmount) + amount = float(balance_response.value.ui_amount) balances[mint] = amount logging.debug(f"Balance for {mint}: {amount}") else: logging.warning(f"Unexpected data format for account: {account}") sol_balance = await solana_client.get_balance(Pubkey.from_string(wallet_address)) - if sol_balance.value: + if sol_balance.value is not None: balances['SOL'] = sol_balance.value / 1e9 + else: + logging.warning(f"SOL balance response missing for wallet: {wallet_address}") except Exception as e: logging.error(f"Error getting wallet balances: {str(e)}") return balances - - async def get_non_zero_token_balances(wallet_address): non_zero_balances = {} logging.info(f"Getting non-zero balances for wallet: {wallet_address}")