mezoAgent 0.4.2__py3-none-any.whl → 0.5.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mezoAgent
3
- Version: 0.4.2
3
+ Version: 0.5.0
4
4
  Summary: A Python package for Mezo Agent transactions with LangChain tools
5
5
  Author: Dreadwulf, Duck, Digi
6
6
  Requires-Dist: python-dotenv
@@ -0,0 +1,14 @@
1
+ mezo_agent/__init__.py,sha256=naG5ZIXKDWTRlqdx2oi1zJcRZpJBO9ugVkW0MaPkZuk,497
2
+ mezo_agent/characters.py,sha256=wub7y9BrAAdAKWwcNAdgrvhRi2zHMaZNzTr2y3qtbsw,515
3
+ mezo_agent/chat.py,sha256=ZtNurUDV7UzJjbFyU96DNGy37hO3gl0osn19mRu7ER8,859
4
+ mezo_agent/config.py,sha256=LgMTntnzXrY7giGXy6JZqhPwPxxMpWWOgc2Ah6g3Y48,3017
5
+ mezo_agent/parsing.py,sha256=6g0U4x8nQaOkwIPon1UlKlnVX6-S2Tf4LKqdY1ZGyiY,4000
6
+ mezo_agent/swap_musd_btc.py,sha256=Co-XcfK73spm94VC6qzGY0VYoGwsMDKKHM8ToGh2JxU,4289
7
+ mezo_agent/token_balance_tool.py,sha256=GQsZnM6zwIdCL5fRISd_KAdc8RNVOTa0LYHPhPIdW1g,1304
8
+ mezo_agent/transaction.py,sha256=YpfWrkEaf0YGM_Kc4cFwlT9GmBGZkeJHWm0VGHs9Gks,4199
9
+ mezo_agent/utils.py,sha256=Kdq3YRj6fOnAmDjI6vktvOvN0vAR8U7TgoTGqcA2KcI,973
10
+ mezo_agent/data/new_router.json,sha256=A8U-NVfe1F-hDyR90_SuH8jDAxmzyyHWdJW62j9TZsc,26756
11
+ mezoAgent-0.5.0.dist-info/METADATA,sha256=ZfVWkIcivB8L4OlUGNFpwhg-SQXFqHp8wkFg-Ugh4W0,273
12
+ mezoAgent-0.5.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
13
+ mezoAgent-0.5.0.dist-info/top_level.txt,sha256=rrAci_NyTR9z6w_BrQhQrAhzMW_A0NYhVa0x2USl0nQ,11
14
+ mezoAgent-0.5.0.dist-info/RECORD,,
mezo_agent/__init__.py CHANGED
@@ -1,12 +1,14 @@
1
1
  from .transaction import mezo_agent_transaction_btc, mezo_agent_musd_transaction
2
2
  from .swap_musd_btc import mezo_agent_swap_musd_btc
3
- from .chat import mezo_character_chat # Corrected function name
3
+ from .chat import mezo_character_chat
4
4
  from .characters import get_character_prompt
5
+ from .token_balance_tool import mezo_agent_token_balance_tool
5
6
 
6
7
  __all__ = [
7
8
  "mezo_agent_transaction_btc",
8
9
  "mezo_agent_musd_transaction",
9
10
  "mezo_agent_swap_musd_btc",
10
- "mezo_character_chat", # Corrected function name
11
+ "mezo_character_chat",
12
+ "mezo_agent_token_balance_tool",
11
13
  "get_character_prompt"
12
14
  ]
mezo_agent/config.py CHANGED
@@ -3,6 +3,8 @@ import json
3
3
  from dotenv import load_dotenv
4
4
  from web3 import Web3
5
5
  import importlib.resources as pkg_resources
6
+ import requests
7
+
6
8
  # Load environment variables
7
9
  load_dotenv()
8
10
 
@@ -25,6 +27,9 @@ if not PRIVATE_KEY:
25
27
  RPC_URL = "https://rpc.test.mezo.org"
26
28
  web3_instance = Web3(Web3.HTTPProvider(RPC_URL))
27
29
 
30
+ #Graph endpoint
31
+ GRAPH_URL = "https://api.goldsky.com/api/public/project_cm48lsrzo0axx01tna6rb1ee9/subgraphs/exchange-v2-mezo/1.0.0/gn"
32
+
28
33
  # Create Account Object
29
34
  account = web3_instance.eth.account.from_key(PRIVATE_KEY)
30
35
  sender_address = account.address
@@ -32,13 +37,28 @@ sender_address = account.address
32
37
  # mUSD Contract Setup using approve/allowance ABI
33
38
  MUSD_ADDRESS = "0x637e22A1EBbca50EA2d34027c238317fD10003eB"
34
39
  ERC20_ABI = json.loads(
35
- '[{"constant": false, "inputs": [{"name": "spender", "type": "address"}, {"name": "amount", "type": "uint256"}],'
40
+ '[{"constant": false, "inputs": [{"name": "recipient", "type": "address"}, {"name": "amount", "type": "uint256"}],'
41
+ '"name": "transfer", "outputs": [{"name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"},'
42
+ '{"constant": false, "inputs": [{"name": "spender", "type": "address"}, {"name": "amount", "type": "uint256"}],'
36
43
  '"name": "approve", "outputs": [{"name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"},'
37
44
  '{"constant": true, "inputs": [{"name": "owner", "type": "address"}, {"name": "spender", "type": "address"}],'
38
45
  '"name": "allowance", "outputs": [{"name": "remaining", "type": "uint256"}], "stateMutability": "view", "type": "function"}]'
39
46
  )
40
47
  musd_contract = web3_instance.eth.contract(address=MUSD_ADDRESS, abi=ERC20_ABI)
41
48
 
49
+ #Query graph for token info
50
+ def query_graph(query: str) -> dict:
51
+ """
52
+ Queries the Goldsky GraphQL API for blockchain data.
53
+ :param query: GraphQL query string.
54
+ :return: JSON response as a dictionary.
55
+ """
56
+ response = requests.post(GRAPH_URL, json={"query": query})
57
+ if response.status_code == 200:
58
+ return response.json()
59
+ else:
60
+ raise Exception(f"GraphQL query failed with status code {response.status_code}")
61
+
42
62
  # Wrapped BTC and Swap Router setup
43
63
  WRAPPED_BTC_ADDRESS = "0xA460F83cdd9584E4bD6a9838abb0baC58EAde999"
44
64
  ROUTER_ADDRESS = "0xC2E61936a542D78b9c3AA024fA141c4C632DF6c1"
@@ -47,4 +67,4 @@ ROUTER_ADDRESS = "0xC2E61936a542D78b9c3AA024fA141c4C632DF6c1"
47
67
  with pkg_resources.open_text("mezo_agent.data", "new_router.json") as f:
48
68
  router_abi = json.load(f)
49
69
 
50
- router_contract = web3_instance.eth.contract(address=ROUTER_ADDRESS, abi=router_abi)
70
+ router_contract = web3_instance.eth.contract(address=ROUTER_ADDRESS, abi=router_abi)
mezo_agent/parsing.py CHANGED
@@ -62,4 +62,38 @@ def extract_swap_details(prompt: str):
62
62
  try:
63
63
  return swap_output_parser.parse(response.content)
64
64
  except Exception as e:
65
- return f"Failed to extract swap details: {str(e)}"
65
+ return f"Failed to extract swap details: {str(e)}"
66
+
67
+ #parsing for balance check tool
68
+
69
+ balance_response_schema = [
70
+ ResponseSchema(name="token_symbol", description="The token symbol to check the balance for (e.g., 'MUSD').")
71
+ ]
72
+
73
+ balance_output_parser = StructuredOutputParser.from_response_schemas(balance_response_schema)
74
+
75
+ balance_prompt_template = PromptTemplate(
76
+ template="""Output a JSON object with the following key:
77
+ - token_symbol: (string) The token symbol for which to check the balance (e.g., "MUSD").
78
+
79
+ Extract this detail from the following query:
80
+ {input}
81
+
82
+ Your output must be a valid JSON object with no additional text.
83
+ """,
84
+ input_variables=["input"],
85
+ )
86
+
87
+ def extract_balance_details(prompt: str):
88
+ """
89
+ Parses a balance query and extracts the token symbol.
90
+
91
+ :param prompt: User input asking for a token balance.
92
+ :return: Dictionary containing the token symbol or an error message.
93
+ """
94
+ try:
95
+ formatted_prompt = balance_prompt_template.format(input=prompt)
96
+ response = balance_output_parser.parse(formatted_prompt)
97
+ return response
98
+ except Exception as e:
99
+ return f"❌ Failed to extract balance details: {str(e)}"
@@ -0,0 +1,32 @@
1
+ from langchain.tools import tool
2
+ from mezo_agent.config import web3_instance, sender_address, extract_balance_details, ERC20_ABI
3
+ from mezo_agent.utils import get_token_address_by_symbol
4
+
5
+ @tool
6
+ def mezo_agent_token_balance_tool(balance_prompt: str) -> str:
7
+ """
8
+ Queries the wallet balance for a specified token on Mezo Matsnet.
9
+
10
+ :param balance_prompt: User query containing the token symbol.
11
+ :return: Token balance for the sender's address.
12
+ """
13
+ details = extract_balance_details(balance_prompt)
14
+
15
+ if isinstance(details, str): # Handle extraction errors
16
+ return details
17
+
18
+ token_symbol = details.get("token_symbol")
19
+ if not token_symbol:
20
+ return "❌ Could not extract token symbol for balance query."
21
+
22
+ try:
23
+ # Get the contract address dynamically
24
+ token_address = get_token_address_by_symbol(token_symbol)
25
+ token_contract = web3_instance.eth.contract(address=token_address, abi=ERC20_ABI)
26
+
27
+ # Fetch balance
28
+ balance_wei = token_contract.functions.balanceOf(sender_address).call()
29
+ balance = web3_instance.from_wei(balance_wei, "ether")
30
+ return f"✅ {token_symbol.upper()} Balance: {balance}"
31
+ except Exception as e:
32
+ return f"❌ Failed to fetch balance: {str(e)}"
mezo_agent/utils.py ADDED
@@ -0,0 +1,29 @@
1
+ from mezo_agent.config import web3_instance, query_graph
2
+
3
+ def get_token_address_by_symbol(symbol: str) -> str:
4
+ """
5
+ Fetches the token contract address dynamically from the Goldsky subgraph.
6
+ :param symbol: Token symbol (e.g., 'MUSD', 'WBTC').
7
+ :return: Ethereum checksum address of the token.
8
+ """
9
+ if symbol.lower() == "btc":
10
+ symbol = "wtbtc"
11
+
12
+ query_all = '''
13
+ {
14
+ tokens(first: 100) {
15
+ id
16
+ symbol
17
+ }
18
+ }
19
+ '''
20
+ data = query_graph(query_all)
21
+ tokens = data.get("data", {}).get("tokens", [])
22
+ matching_tokens = [t for t in tokens if t["symbol"].lower() == symbol.lower()]
23
+
24
+ if matching_tokens:
25
+ token_address = matching_tokens[0]["id"]
26
+ return web3_instance.to_checksum_address(token_address)
27
+ else:
28
+ available_symbols = [t["symbol"] for t in tokens]
29
+ raise Exception(f"Token '{symbol}' not found. Available: {', '.join(available_symbols)}")
@@ -1,12 +0,0 @@
1
- mezo_agent/__init__.py,sha256=PRFZfcq8B68pQI2toci1ACM_SPcu7suy9D3OD8IvZeI,450
2
- mezo_agent/characters.py,sha256=wub7y9BrAAdAKWwcNAdgrvhRi2zHMaZNzTr2y3qtbsw,515
3
- mezo_agent/chat.py,sha256=ZtNurUDV7UzJjbFyU96DNGy37hO3gl0osn19mRu7ER8,859
4
- mezo_agent/config.py,sha256=1PWeaHdQPKqKPraE-tM81CwRKeBiCbz5C_8iZTEiCgo,2148
5
- mezo_agent/parsing.py,sha256=rolPVE8r_RS6BqKe25r1nyZQ47rvTPG2Hv09Kxxfv4c,2821
6
- mezo_agent/swap_musd_btc.py,sha256=Co-XcfK73spm94VC6qzGY0VYoGwsMDKKHM8ToGh2JxU,4289
7
- mezo_agent/transaction.py,sha256=YpfWrkEaf0YGM_Kc4cFwlT9GmBGZkeJHWm0VGHs9Gks,4199
8
- mezo_agent/data/new_router.json,sha256=A8U-NVfe1F-hDyR90_SuH8jDAxmzyyHWdJW62j9TZsc,26756
9
- mezoAgent-0.4.2.dist-info/METADATA,sha256=YEbcKgTvvW13zDdNJKRz47odDmCOX73-Bl_KTa3Qn_k,273
10
- mezoAgent-0.4.2.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
11
- mezoAgent-0.4.2.dist-info/top_level.txt,sha256=rrAci_NyTR9z6w_BrQhQrAhzMW_A0NYhVa0x2USl0nQ,11
12
- mezoAgent-0.4.2.dist-info/RECORD,,