Wallets menu

Selecting a wallet

If already you have created wallet / wallets, the only thing you need to do is made a choice of the pull out list, and confim you decision clicking "Confirm choice" button and alternatively entering your decription key ("Encryption" Section).

def list_wallets():
    directory = create_wallet_directory()
    wallets = [f for f in os.listdir(directory) if f.endswith('.txt') or f.endswith('.dat')]
    return wallets
def on_wallet_confirm(self):
    selected_wallet_display = self.wallet_option_menu.get()
    wallets = list_wallets()
    wallet_filenames = {f[:-4]: f for f in wallets}
    wallet_filename = wallet_filenames.get(selected_wallet_display)
    if wallet_filename:
        self.current_wallet = wallet_filename
        self.wallet_switch_counter += 1
        current_counter = self.wallet_switch_counter

        self.token_list = []

        if wallet_filename.endswith('.dat'):
            if wallet_filename in self.decrypted_wallets:
                public_key, private_key_base58 = self.decrypted_wallets[wallet_filename]
            else:
                passphrase, _ = self.prompt_for_passphrase(title="Unlock wallet", allow_no_encrypt=False)
                if passphrase is None:
                    self.show_message("Passphrase is required to decrypt the wallet.", "Error")
                    self.current_wallet = None
                    self.selected_wallet_label.configure(text="Selected wallet: None")
                    self.navigate_to(self.wallet_menu)
                    return
                public_key, private_key_base58 = get_wallet_details(wallet_filename, passphrase)
                if public_key is None:
                    self.show_message("Incorrect passphrase. Failed to decrypt the wallet.", "Error")
                    self.current_wallet = None
                    self.selected_wallet_label.configure(text="Selected wallet: None")
                    self.navigate_to(self.wallet_menu)
                    return
                self.decrypted_wallets[wallet_filename] = (public_key, private_key_base58)
        elif wallet_filename.endswith('.txt'):
            public_key, private_key_base58 = get_wallet_details(wallet_filename)
            if public_key is None:
                self.show_message("Failed to load wallet details.", "Error")
                self.navigate_to(self.wallet_menu)
                return

        if public_key is None:
            self.show_message("Failed to load wallet details.", "Error")
            self.navigate_to(self.wallet_menu)
            return

        self.wallet_actions_menu(wallet_filename, current_counter, public_key, private_key_base58)
        formatted_name = selected_wallet_display
        self.selected_wallet_label.configure(text=f"Selected wallet: {formatted_name}")

Displaying tokens according to public key

After confirmation your choice, the Terminal is going to display all Solana assets which specific wallet posses. View of assets includes:

  • Ticker

  • Balance (with accuracy to 3 places after dot)

  • Estimated value in USD (with accuracy to 2 places after dot)

  • Comfortable way to swap or audit selected token (check "Terminal" Section)

Identifying tokens:

def get_token_by_ca(contract_address, endpoint):
    url = f"https://api.dexscreener.com/latest/dex/tokens/{contract_address}"
    try:
        response = requests.get(url, timeout=10)
        if response.status_code == 200:
            token_data = response.json()
            if token_data.get('pairs'):
                return token_data['pairs'][0]
            else:
                return None
        else:
            return None
    except requests.RequestException as e:
        print(f"Dexscreener API Error for CA {contract_address}: {e}")
        return None

Displaying values:

def get_token_balances_dexscreener(self, public_key):
    client = Client(self.endpoints['fetch_transaction_history'])
    opts = TokenAccountOpts(program_id=TOKEN_PROGRAM_ID, encoding='jsonParsed')
    try:
        token_accounts = client.get_token_accounts_by_owner(PublicKey(public_key), opts)
    except Exception as e:
        print(f"Error fetching token accounts: {e}")
        return []

    tokens = []
    if token_accounts['result']['value']:
        for token_account in token_accounts['result']['value']:
            account_info = token_account['account']['data']['parsed']['info']
            token_address = account_info['mint']
            token_amount = int(account_info['tokenAmount']['amount'])
            decimals = int(account_info['tokenAmount']['decimals'])
            amount = token_amount / (10 ** decimals)

            if token_address in self.dexscreener_cache:
                symbol, price = self.dexscreener_cache[token_address]
            else:
                token_data = get_token_by_ca(token_address, self.endpoints['fetch_transaction_history'])
                if token_data:
                    symbol = token_data['baseToken']['symbol']
                    try:
                        price = float(token_data['priceUsd'])
                    except (ValueError, TypeError):
                        price = 0
                    self.dexscreener_cache[token_address] = (symbol, price)
                else:
                    symbol = "Unknown"
                    price = 0
                    self.dexscreener_cache[token_address] = (symbol, price)

            usd_value = amount * price

            if usd_value < 0.01:
                continue

            tokens.append({
                'mint': token_address,
                'symbol': symbol,
                'amount': amount,
                'decimals': decimals,
                'usd_value': usd_value
            })
    return tokens

Last updated