Skip to main content
Glama

ONEDeFi MCP Server

by JMadhan1
portfolio.cpython-311.pyc19.5 kB
� R\�h�J��|�ddlZddlZddlZddlmZddlmZddlmZej e ��Z Gd�d��Z dS)�N)�EthereumClient)� PolygonClient)� SolanaClientc�v�eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z dd �Z d �Z dd �Z d �Z d�Zd�Zd�Zd�Zd�Zd�ZdS)�PortfolioManagerz!Portfolio management and trackingc���t��|_t��|_t ��|_t jdd��|_t jdd��|_ dS)N�COINGECKO_API_KEYzdemo-key�MORALIS_API_KEY) r�ethereum_clientr�polygon_clientr� solana_client�os�getenv�coingecko_api_key�moralis_api_key)�selfs �./home/runner/workspace/defi_tools/portfolio.py�__init__zPortfolioManager.__init__ sZ��-�/�/���+�o�o���)�^�^���"$��+>� �!K�!K���!�y�):�J�G�G�����c��� |���dkr|�|��S|���dkr|�|��S|���dkr|�|��Sdd|��d�S#t$rF}t �dt|������dt|��d�cYd}~Sd}~wwxYw) z#Get complete portfolio for a wallet�ethereum�polygon�solanaFzUnsupported blockchain: ��success�errorzPortfolio fetch failed: N)�lower�_get_ethereum_portfolio�_get_polygon_portfolio�_get_solana_portfolio� Exception�loggerr�str)r�wallet_address� blockchain�es r� get_portfoliozPortfolioManager.get_portfolios�� 7����!�!�Z�/�/��3�3�N�C�C�C��!�!�#�#�y�0�0��2�2�>�B�B�B��!�!�#�#�x�/�/��1�1�.�A�A�A�#(�3Z�j�3Z�3Z�[�[�[��� 7� 7� 7� �L�L�<�C��F�F�<�<� =� =� =�$�s�1�v�v�6�6� 6� 6� 6� 6� 6� 6����� 7���s.�,B�,B�,B� B� C!�;C�C!�C!c�� d|�d�}d|ji}ddi}tj|||���}|jdkrdd d �S|���}|j�|��}|d gd |���d �}|�d ��} t|��| z} |d� ddd|| | dd���|dxx| z cc<|D�]} t| �dd����dkr�|� | d��} t| d��dt| �dd����zz } | | z}|d� | �dd��| �dd��| dt| ��| |t| �dd����d���|dxx|z cc<��d|d�S#t$rF}t�d t|������dt|��d �cYd!}~Sd!}~wwxYw)"zGet Ethereum portfolio�%https://deep-index.moralis.io/api/v2/�/erc20� X-API-Key�chain�eth��headers�params��F�Failed to fetch token balancesrr��r$r%�tokens�total_value_usd� last_updatedr5�ETH�Ethereum�*0x0000000000000000000000000000000000000000���symbol�name�address�balance� price_usd� value_usd�decimalsr6r@r� token_address� rCr=�UNKNOWNr>� Unknown TokenT�r� portfolioz!Ethereum portfolio fetch failed: N)r�requests�get� status_code�jsonr � get_balance�_get_current_timestamp�_get_token_price�float�append�_get_token_price_by_address�intr#r!r"r)rr$�urlr/r0�response� tokens_data� eth_balancerI� eth_price� eth_value�token� token_price�token_balance_formatted� token_valuer&s rrz(PortfolioManager._get_ethereum_portfolio&s���@ 7�P�.�P�P�P�C�"�D�$8�9�G��u�%�F��|�C���H�H�H�H��#�s�*�*�#(�3S�T�T�T�"�-�-�/�/�K��.�:�:�>�J�J�K�#1�(��#&� $� ;� ;� =� =� ��I��-�-�j�9�9�I��k�*�*�Y�6�I� �h� � &� &��"�G�&�&�&��(�(� � � � �'� (� (� (�I� 5� (� (� (�%� @� @������9�a�0�0�1�1�A�5�5�"&�"B�"B�5��CY�"Z�"Z�K�.3�E�)�4D�.E�.E��s�SX�S\�S\�]g�ik�Sl�Sl�Om�Om�Im�.n�+�"9�K�"G�K��h�'�.�.�"'�)�)�H�i�"@�"@� %� � �&�/� B� B�#(��#9�#&�'>�#?�#?�%0�%0�$'�� � �*�b�(A�(A�$B�$B�0�0�����/�0�0�0�K�?�0�0�0��#�)�<�<� <��� 7� 7� 7� �L�L�E�S��V�V�E�E� F� F� F�$�s�1�v�v�6�6� 6� 6� 6� 6� 6� 6����� 7���s#�9G<�F?G<�< I �;I�I �I c�� d|�d�}d|ji}ddi}tj|||���}|jdkrdd d �S|���}|j�|��}|dgd |���d �}|�d ��} t|��| z} |d� ddd|| | dd���|dxx| z cc<|D�]} t| �dd����dkr�|� | dd��} t| d��dt| �dd����zz } | | z}|d� | �dd��| �dd��| dt| ��| |t| �dd����d���|dxx|z cc<��d|d�S#t$rF}t�d t|������dt|��d �cYd!}~Sd!}~wwxYw)"zGet Polygon portfolior)r*r+r,rr.r1Fr2rr3r4z matic-networkr5�MATIC�Polygonr:r;r<r6r@rrDrErCr=rFr>rGTrHz Polygon portfolio fetch failed: N)rrJrKrLrMr rNrOrPrQrRrSrTr#r!r"r)rr$rUr/r0rVrW� matic_balancerI� matic_price� matic_valuer[r\r]r^r&s rrz'PortfolioManager._get_polygon_portfoliojs���? 7�P�.�P�P�P�C�"�D�$8�9�G��y�)�F��|�C���H�H�H�H��#�s�*�*�#(�3S�T�T�T�"�-�-�/�/�K�!�/�;�;�N�K�K�M�#1�'��#&� $� ;� ;� =� =� ��I��/�/��@�@�K�� �.�.��<�K� �h� � &� &�!�!�G�(�(�(��(�(� � � � �'� (� (� (�K� 7� (� (� (�%� @� @������9�a�0�0�1�1�A�5�5�"&�"B�"B�5��CY�[d�"e�"e�K�.3�E�)�4D�.E�.E��s�SX�S\�S\�]g�ik�Sl�Sl�Om�Om�Im�.n�+�"9�K�"G�K��h�'�.�.�"'�)�)�H�i�"@�"@� %� � �&�/� B� B�#(��#9�#&�'>�#?�#?�%0�%0�$'�� � �*�b�(A�(A�$B�$B�0�0�����/�0�0�0�K�?�0�0�0��#�)�<�<� <��� 7� 7� 7� �L�L�D�C��F�F�D�D� E� E� E�$�s�1�v�v�6�6� 6� 6� 6� 6� 6� 6����� 7���s#�9G=�GG=�= I �;I�I �I c �:� |j�|��}|j�|��}|dgd|���d�}|�d��}t |��|z}|d�ddd|||dd ���|d xx|z cc<|D�]}t |�d d ����d kr�|�|d ��}|� |d d��} t |d ��d|�dd��zz } | | z} |d�|�dd��|�dd��|d t| ��| | |�dd��d ���|d xx| z cc<��d|d�S#t$rF} t� dt| ������dt| ��d�cYd} ~ Sd} ~ wwxYw)zGet Solana portfoliorr3r4r5�SOL�Solana�+So11111111111111111111111111111111111111112� r<r6r@r�mintrErCr=rFr>rGTrHzSolana portfolio fetch failed: FrN)r rN�get_token_accountsrOrPrQrRrK�_get_solana_token_inforSr#r!r"r) rr$� sol_balance� spl_tokensrI� sol_price� sol_valuer[� token_infor\r]r^r&s rr z&PortfolioManager._get_solana_portfolio�s���7 7��,�8�8��H�H�K��+�>�>�~�N�N�J�#1�&��#&� $� ;� ;� =� =� ��I��-�-�h�7�7�I��k�*�*�Y�6�I� �h� � &� &�� �H�&�&�&��(�(� � � � �'� (� (� (�I� 5� (� (� (�$� @� @������9�a�0�0�1�1�A�5�5�!%�!<�!<�U�6�]�!K�!K�J�"&�"B�"B�5��=�RZ�"[�"[�K�.3�E�)�4D�.E�.E��z�~�~�^h�jk�Ol�Ol�Il�.m�+�"9�K�"G�K��h�'�.�.�",�.�.��9�"E�"E� *���v�� G� G�#(��=�#&�'>�#?�#?�%0�%0�$.�N�N�:�q�$A�$A�0�0�����/�0�0�0�K�?�0�0�0��#�)�<�<� <��� 7� 7� 7� �L�L�C�3�q�6�6�C�C� D� D� D�$�s�1�v�v�6�6� 6� 6� 6� 6� 6� 6����� 7���s�GG � H�;H�H�Hc �J� ||gggd|���d�}|���dkr�|�|d��}|d�|��|�|��}|d�|��|�|��}|d�|��n�|���dkrb|�|d��}|d�|��|�|��}|d�|��nH|���dkr0|�|��}|d�|��|d|d|dfD]+} | D]&} |d xx| �d d��z cc<�'�,d |d �S#t$rF} t� d t| ������dt| ��d�cYd} ~ Sd} ~ wwxYw)zGet DeFi positions for a walletr3)r$r%�lending_positions�farming_positions�staking_positions�total_value_lockedr7rrsrtrrrurvrBT)r� positionszPositions fetch failed: FrN) rOr�_get_aave_positions�extend�_get_compound_positions�_get_uniswap_positions�_get_quickswap_positions�_get_raydium_positionsrKr!r"rr#) rr$r%rw�aave_positions�compound_positions�uniswap_positions�quickswap_positions�raydium_positions�pos_list�posr&s r� get_positionszPortfolioManager.get_positions�s���/ 7�"0�(�%'�%'�%'�&)� $� ;� ;� =� =���I����!�!�Z�/�/�!%�!9�!9�.�*�!U�!U���-�.�5�5�n�E�E�E�&*�%A�%A�.�%Q�%Q�"��-�.�5�5�6H�I�I�I�%)�$?�$?��$O�$O�!��-�.�5�5�6G�H�H�H�H��!�!�#�#�y�0�0�!%�!9�!9�.�)�!T�!T���-�.�5�5�n�E�E�E�'+�&C�&C�N�&S�&S�#��-�.�5�5�6I�J�J�J�J��!�!�#�#�x�/�/�$(�$?�$?��$O�$O�!��-�.�5�5�6G�H�H�H�'�':�;�Y�GZ�=[�]f�gz�]{�|� Q� Q��#�Q�Q�C��2�3�3�3�s�w�w�{�C�7P�7P�P�3�3�3�3�Q� $�)�<�<� <��� 7� 7� 7� �L�L�<�C��F�F�<�<� =� =� =�$�s�1�v�v�6�6� 6� 6� 6� 6� 6� 6����� 7���s�GG� H"�;H�H"�H"�7dc �d� |||ddddd�gdddd�ddgd�d�}|�||��}|ds|S|d}|d }|d D]H}|d kr@|d |z d z} |d�|d|d|d | d����I|�||��} | dr�| d} | dD]f} d| vr`d | vr\| d | dd z z} |ddxx| z cc<|dd�| dd| | dd����g| dD]f}d|vr`d |vr\|d |dd z z} |ddxx| z cc<|dd�|dd| |dd����gtd�|ddD����}|d kr||z d z|dd<d|d �S#t$rF}t �d!t|������d"t|��d#�cYd}~Sd}~wwxYw)$z'Get portfolio analytics and performancer3N)� total_return�total_return_percentage�best_performing_asset�worst_performing_asset)� volatility� sharpe_ratio� max_drawdown)�total_yield_usd� average_apy� yield_sources)r$r%� timeframe� performance� allocation� risk_metrics� yield_earnedrrIr6r5rrB�dr�r=r>)r=r>rB� percentagerwrs�apyr�r�r��protocol�lending)r��type�annual_yield_usdr�rt�farmingc��g|] }|d�� S)r��)�.0�sources r� <listcomp>z<PortfolioManager.get_portfolio_analytics.<locals>.<listcomp>fs��$y�$y�$y�F�V�,>�%?�$y�$y�$yrr�T)r� analyticszPortfolio analytics failed: Fr)r'rRr��sumr!r"rr#)rr$r%r�r��portfolio_resultrI� total_valuer[�allocation_percentage�positions_resultrw� lending_pos� annual_yield� farming_pos�total_yield_valuer&s r�get_portfolio_analyticsz(PortfolioManager.get_portfolio_analyticss_��Q 7�"0�(�&�$'�/2�-1�.2�  � � !�"%�$'�$'�!�!� (+�#&�%'�!�!�!��I�0 $�1�1�.�*�M�M� �#�I�.� (�'�'�(��5�I�$�$5�6�K�"�8�,� � ����?�?�-2�;�-?�+�-M�QT�,T�)��l�+�2�2�"'��/� %�f� �%*�;�%7�&;� 4�4����� $�1�1�.�*�M�M� �� �*� �,�[�9� �$-�-@�#A� � �K�� �+�+� �{�0J�0J�'2�;�'?�;�u�CU�X[�C[�'\� �!�.�1�2C�D�D�D� �T�D�D�D�!�.�1�/�B�I�I�(3�J�(?�$-�0<�#.�u�#5� K�K�����$-�-@�#A� � �K�� �+�+� �{�0J�0J�'2�;�'?�;�u�CU�X[�C[�'\� �!�.�1�2C�D�D�D� �T�D�D�D�!�.�1�/�B�I�I�(3�J�(?�$-�0<�#.�u�#5� K�K�����!$�$y�$y�i�Xf�Ng�hw�Nx�$y�$y�$y� z� z� ��Q���<M�P[�<[�_b�;b� �.�)�-�8�#�)�<�<� <��� 7� 7� 7� �L�L�@��A���@�@� A� A� A�$�s�1�v�v�6�6� 6� 6� 6� 6� 6� 6����� 7���s#�6G�F%G� H/�);H*�$H/�*H/c �`� d}|dd�}tj||d���}|jdkr>|���}|�|i���dd��SdS#t$r8}t �d|�d t|������Yd }~dSd }~wwxYw) zGet token price from CoinGeckoz-https://api.coingecko.com/api/v3/simple/price�usd)�ids� vs_currenciesrE�r0�timeoutr1r3�Price fetch failed for �: N)rJrKrLrMr!r"rr#)r�token_idrUr0rV�datar&s rrPz!PortfolioManager._get_token_priceps��� �B�C��!&���F�  �|�C���C�C�C�H��#�s�*�*��}�}�����x�x��"�-�-�1�1�%��=�=�=��s��� � � � �L�L�G�8�G�G�s�1�v�v�G�G� H� H� H��3�3�3�3�3����� ���s�A&A+�+ B-�5-B(�(B-rc ��� dddd�}|�|d��}d|��}|dd�}tj||d� ��}|jd krP|���}|�|���i���dd ��Sd S#t $r8} t �d |�d t| ������Yd} ~ d Sd} ~ wwxYw)z#Get token price by contract addressrz polygon-posr)rrrz4https://api.coingecko.com/api/v3/simple/token_price/r�)�contract_addressesr�rEr�r1r3r�r�N) rKrJrLrMrr!r"rr#) rrDr,�platform_mapping�platformrUr0rVr�r&s rrSz,PortfolioManager._get_token_price_by_address�s�� �'�(�"� � � � (�+�+�E�:�>�>�H�S��S�S�C�&3�!&���F�  �|�C���C�C�C�H��#�s�*�*��}�}�����x�x� � 3� 3� 5� 5�r�:�:�>�>�u�c�J�J�J��s��� � � � �L�L�L�=�L�L�C��F�F�L�L� M� M� M��3�3�3�3�3����� ���s�BB� C�&-C�Cc��dddd�S)zGet Solana token informationrFrGri)r=r>rCr�)r� mint_addresss rrlz'PortfolioManager._get_solana_token_info�s�� �#�� � � rc��gS)zGet Aave positionsr�)rr$r%s rrxz$PortfolioManager._get_aave_positions�� ��� rc��gS)zGet Compound positionsr��rr$s rrzz(PortfolioManager._get_compound_positions�r�rc��gS)zGet Uniswap LP positionsr�r�s rr{z'PortfolioManager._get_uniswap_positions�r�rc��gS)zGet QuickSwap LP positionsr�r�s rr|z)PortfolioManager._get_quickswap_positions�r�rc��gS)zGet Raydium positionsr�r�s rr}z'PortfolioManager._get_raydium_positions�r�rc�Z�ddlm}|������S)zGet current timestampr)�datetime)r��utcnow� isoformat)rr�s rrOz'PortfolioManager._get_current_timestamp�s0��%�%�%�%�%�%���� � �*�*�,�,�,rN)r�)r)�__name__� __module__� __qualname__�__doc__rr'rrr r�r�rPrSrlrxrzr{r|r}rOr�rrrr s&������+�+�H�H�H�7�7�7� B7�B7�B7�HA7�A7�A7�F97�97�97�v17�17�17�fS7�S7�S7�S7�j���(����: � � ���� ��� ��� ��� ��� -�-�-�-�-rr) r�loggingrJ�blockchain.ethereumr�blockchain.polygonr�blockchain.solanar� getLoggerr�r"rr�rr�<module>r�s��� � � � ���������.�.�.�.�.�.�,�,�,�,�,�,�*�*�*�*�*�*� �� �8� $� $��|-�|-�|-�|-�|-�|-�|-�|-�|-�|-r

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/JMadhan1/OneDefi-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server