import requests import json import pandas as pd import gradio as gr def return_df(): response1 = requests.post( "https://api.g.alchemy.com/data/v1/yhe6L3PXmiENzS1sP9Fu4_T5E3l0QyeB/assets/tokens/by-address", headers={}, json={ "addresses": [ { "address": "0x7743960B4305f9eAF4d412322B5fAb736DB51D4C", "networks": [ "base-mainnet" ] }, { "address": "0x3a6Cf81996b208f3167335f7075aB46e895382b1", "networks": [ "base-mainnet" ] }, { "address": "0xE040654071DC563a864Bb9EB56d592118CfCD468", "networks": [ "base-mainnet" ] } ], "withMetadata": True, "withPrices": True, "includeNativeTokens": True }, ) response2 = requests.post( "https://api.g.alchemy.com/data/v1/yhe6L3PXmiENzS1sP9Fu4_T5E3l0QyeB/assets/tokens/by-address", headers={}, json={ "addresses": [ { "address": "0x6f648Cd40Abe3aCc21a9141Fb9C7074bcf939285", "networks": [ "base-mainnet" ] }, { "address": "0xd58Fc0D2a4Fe66FE9be63BeDDC8866fDdE50ce0e", "networks": [ "base-mainnet" ] }, { "address": "0x7D8A95508caedF57E853F81F49FB1714d75dE750", "networks": [ "base-mainnet" ] } ], "withMetadata": True, "withPrices": True, "includeNativeTokens": True }, ) response3 = requests.post( "https://api.g.alchemy.com/data/v1/yhe6L3PXmiENzS1sP9Fu4_T5E3l0QyeB/assets/tokens/by-address", headers={}, json={ "addresses": [ { "address": "0x422473C72F19b0bdCA74d360CEDB72594C1b4Efa", "networks": [ "base-mainnet" ] }, { "address": "0x7743960B4305f9eAF4d412322B5fAb736DB51D4C", "networks": [ "base-mainnet" ] } ], "withMetadata": True, "withPrices": True, "includeNativeTokens": True }, ) response1 = response1.json()['data']['tokens'] response2 = response2.json()['data']['tokens'] response3 = response3.json()['data']['tokens'] # Extract the prioritized items priority_items = response2[:3] + response3[:2] # Remove those items from their original lists to avoid duplication remaining_items = response2[3:] + response3[2:] + response1 # Combine priority items with the rest response = priority_items + remaining_items df = pd.DataFrame(response) for i in range(8): df.at[i,'tokenMetadata'] = {} df['tokenBalance'] = df['tokenBalance'].apply(lambda x : int(x,16)) df['decimals'] = df['tokenMetadata'].apply(lambda x : x.get('decimals',0)) df['tokenBalance'] = df['tokenBalance']/(10**df['decimals']) for i in range(8): df.at[i, 'tokenBalance'] = df.at[i, 'tokenBalance'] / (10**18) df['symbol'] = df['tokenMetadata'].apply(lambda x : x.get('symbol','')) for i in range(8): df.at[i,'symbol'] = 'ETH' df['currentPrice'] = df['tokenPrices'].apply(lambda x : x[0].get('value',None) if len(x) > 0 else None) df.drop(columns=['tokenPrices','tokenMetadata','network','tokenAddress'], inplace=True) df = df.dropna() df['tokenBalance'] = pd.to_numeric(df['tokenBalance'], errors='coerce') df = df[df['tokenBalance'] != 0] df['tokenBalance'] = pd.to_numeric(df['tokenBalance'], errors='coerce') df['currentPrice'] = pd.to_numeric(df['currentPrice'], errors='coerce') df['value'] = df['tokenBalance'] * df['currentPrice'] df.drop(columns=['address','decimals'],inplace=True) df = df[df['symbol'].isin(['AGNT', 'ETH', 'USDT'])] df= df[['symbol','tokenBalance','value']] df = df.groupby("symbol", as_index=False).sum() return df, df['value'].sum() with gr.Blocks() as demo: gr.Markdown("## AGNT Balances and PnL") df0_out = gr.Dataframe(label="Current Balances") txt0_out = gr.Textbox(label="Total Value") # Load from MongoDB on app load (sync function) demo.load( fn=return_df, inputs=[], outputs=[ df0_out,txt0_out ] ) demo.launch(debug=True, share=True)