mezoAgent 0.1.3__py3-none-any.whl → 0.1.4__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- mezoAgent-0.1.4.dist-info/METADATA +11 -0
- mezoAgent-0.1.4.dist-info/RECORD +8 -0
- mezoAgent-0.1.4.dist-info/top_level.txt +1 -0
- mezo_agent/__init__.py +1 -0
- mezo_agent/config.py +46 -0
- mezo_agent/parsing.py +36 -0
- mezo_agent/transaction.py +53 -0
- mezoAgent-0.1.3.dist-info/METADATA +0 -15
- mezoAgent-0.1.3.dist-info/RECORD +0 -6
- mezoAgent-0.1.3.dist-info/top_level.txt +0 -1
- mezoTransactionTool/__init__.py +0 -3
- mezoTransactionTool/transaction_tools.py +0 -126
- {mezoAgent-0.1.3.dist-info → mezoAgent-0.1.4.dist-info}/WHEEL +0 -0
@@ -0,0 +1,11 @@
|
|
1
|
+
Metadata-Version: 2.1
|
2
|
+
Name: mezoAgent
|
3
|
+
Version: 0.1.4
|
4
|
+
Summary: A LangChain based tool kit for AI Agents to send BTC and mUSD transactions on Mezo Matsnet.
|
5
|
+
Author: Dreadwulf
|
6
|
+
Author-email: dreadwul@wtf.com
|
7
|
+
Requires-Python: >=3.7
|
8
|
+
Requires-Dist: web3
|
9
|
+
Requires-Dist: langchain
|
10
|
+
Requires-Dist: langchain-openai
|
11
|
+
Requires-Dist: python-dotenv
|
@@ -0,0 +1,8 @@
|
|
1
|
+
mezo_agent/__init__.py,sha256=CTQD3Y_lY9lzhuTzIeQjqsNzy7sYjOPygVSSK3wBlps,51
|
2
|
+
mezo_agent/config.py,sha256=c16-JHEbK5rFBKO-QdxBRtrl4DSlYzGckD9BzbTw2dY,1708
|
3
|
+
mezo_agent/parsing.py,sha256=dFqNHGH0LoG4_TEsHKcorj6aY_Rh4H8f5Yj7ZdfKJzE,1454
|
4
|
+
mezo_agent/transaction.py,sha256=75q88q94WJLg0UahMhkAfMqSxBfW-bqK3iZMGykmc-k,2069
|
5
|
+
mezoAgent-0.1.4.dist-info/METADATA,sha256=xYqUvTErxTwqLghZILJOFYOAmhOzfx96wOuA8k9eK2Y,343
|
6
|
+
mezoAgent-0.1.4.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
7
|
+
mezoAgent-0.1.4.dist-info/top_level.txt,sha256=rrAci_NyTR9z6w_BrQhQrAhzMW_A0NYhVa0x2USl0nQ,11
|
8
|
+
mezoAgent-0.1.4.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
mezo_agent
|
mezo_agent/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
from .transaction import mezo_agent_transaction_btc
|
mezo_agent/config.py
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
import os
|
2
|
+
import json
|
3
|
+
from dotenv import load_dotenv
|
4
|
+
from web3 import Web3
|
5
|
+
from web3.exceptions import Web3Exception
|
6
|
+
|
7
|
+
# ✅ Load environment variables
|
8
|
+
USER_PROJECT_DIR = os.getcwd()
|
9
|
+
USER_ENV_PATH = os.path.join(USER_PROJECT_DIR, ".env")
|
10
|
+
|
11
|
+
if os.path.exists(USER_ENV_PATH):
|
12
|
+
load_dotenv(USER_ENV_PATH)
|
13
|
+
else:
|
14
|
+
print("⚠️ Warning: No `.env` file found in your project directory! Transactions requiring signing may fail.")
|
15
|
+
|
16
|
+
# ✅ Load keys from the environment
|
17
|
+
PRIVATE_KEY = os.getenv("PRIVATE_KEY")
|
18
|
+
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
|
19
|
+
|
20
|
+
if not PRIVATE_KEY:
|
21
|
+
print("⚠️ Warning: PRIVATE_KEY not set. Please create a `.env` file in your project with your keys.")
|
22
|
+
PRIVATE_KEY = None # Allow package to be installed but prevent transactions
|
23
|
+
|
24
|
+
# ✅ Define RPC URL and initialize Web3
|
25
|
+
RPC_URL = "https://rpc.test.mezo.org"
|
26
|
+
web3_instance = Web3(Web3.HTTPProvider(RPC_URL))
|
27
|
+
|
28
|
+
if not web3_instance.is_connected():
|
29
|
+
raise ConnectionError("❌ Failed to connect to Mezo Matsnet RPC.")
|
30
|
+
|
31
|
+
# ✅ Initialize account and sender address
|
32
|
+
if PRIVATE_KEY:
|
33
|
+
account = web3_instance.eth.account.from_key(PRIVATE_KEY)
|
34
|
+
sender_address = account.address
|
35
|
+
else:
|
36
|
+
account = None
|
37
|
+
sender_address = None
|
38
|
+
|
39
|
+
# ✅ Set up contract details (for mUSD)
|
40
|
+
MUSD_ADDRESS = "0x637e22A1EBbca50EA2d34027c238317fD10003eB"
|
41
|
+
ERC20_ABI = json.loads(
|
42
|
+
'[{"constant": false, "inputs": [{"name": "recipient", "type": "address"},'
|
43
|
+
'{"name": "amount", "type": "uint256"}],"name": "transfer","outputs": [{"name": "", "type": "bool"}],'
|
44
|
+
'"stateMutability": "nonpayable","type":"function"}]'
|
45
|
+
)
|
46
|
+
musd_contract = web3_instance.eth.contract(address=MUSD_ADDRESS, abi=ERC20_ABI)
|
mezo_agent/parsing.py
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
|
2
|
+
from langchain.prompts import PromptTemplate
|
3
|
+
from langchain_openai import ChatOpenAI
|
4
|
+
from .config import OPENAI_API_KEY
|
5
|
+
|
6
|
+
# Define the expected response schema
|
7
|
+
response_schemas = [
|
8
|
+
ResponseSchema(name="amount", description="The amount of cryptocurrency to transfer."),
|
9
|
+
ResponseSchema(name="currency", description="The cryptocurrency (BTC or mUSD)."),
|
10
|
+
ResponseSchema(name="recipient", description="The recipient's wallet address."),
|
11
|
+
]
|
12
|
+
|
13
|
+
# Initialize the structured output parser
|
14
|
+
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
|
15
|
+
|
16
|
+
# Instantiate the ChatOpenAI LLM
|
17
|
+
llm = ChatOpenAI(temperature=0, openai_api_key=OPENAI_API_KEY)
|
18
|
+
|
19
|
+
# Prepare the prompt template
|
20
|
+
prompt_template = PromptTemplate(
|
21
|
+
template="Extract transaction details from this request:\n{input}\n{format_instructions}",
|
22
|
+
input_variables=["input"],
|
23
|
+
partial_variables={"format_instructions": output_parser.get_format_instructions()},
|
24
|
+
)
|
25
|
+
|
26
|
+
def extract_transaction_details(prompt: str):
|
27
|
+
"""
|
28
|
+
Uses LLM to extract structured transaction details from user input.
|
29
|
+
"""
|
30
|
+
formatted_prompt = prompt_template.format(input=prompt)
|
31
|
+
response = llm.invoke(formatted_prompt)
|
32
|
+
|
33
|
+
try:
|
34
|
+
return output_parser.parse(response.content)
|
35
|
+
except Exception as e:
|
36
|
+
return f"❌ Failed to extract transaction details: {str(e)}"
|
@@ -0,0 +1,53 @@
|
|
1
|
+
from web3.exceptions import Web3Exception
|
2
|
+
from langchain.tools import tool
|
3
|
+
from .config import web3_instance, sender_address, account
|
4
|
+
from .parsing import extract_transaction_details
|
5
|
+
|
6
|
+
@tool
|
7
|
+
def mezo_agent_transaction_btc(transaction_prompt: str) -> str:
|
8
|
+
"""
|
9
|
+
Sends BTC on Mezo Matsnet. Parses a transaction request and executes the transfer.
|
10
|
+
"""
|
11
|
+
transaction_details = extract_transaction_details(transaction_prompt)
|
12
|
+
|
13
|
+
if isinstance(transaction_details, str): # Handle errors
|
14
|
+
return transaction_details
|
15
|
+
|
16
|
+
amount = float(transaction_details["amount"])
|
17
|
+
currency = transaction_details["currency"].lower()
|
18
|
+
recipient = transaction_details["recipient"]
|
19
|
+
|
20
|
+
if currency != "btc":
|
21
|
+
return "❌ This function only supports BTC transactions."
|
22
|
+
|
23
|
+
# Convert amount to Wei (BTC uses 18 decimals on Mezo Matsnet)
|
24
|
+
amount_wei = web3_instance.to_wei(amount, "ether")
|
25
|
+
|
26
|
+
# Check sender's BTC balance
|
27
|
+
sender_balance = web3_instance.eth.get_balance(sender_address)
|
28
|
+
sender_balance_btc = web3_instance.from_wei(sender_balance, "ether")
|
29
|
+
|
30
|
+
if sender_balance < amount_wei:
|
31
|
+
return f"❌ Insufficient BTC balance! You have {sender_balance_btc} BTC but need {amount} BTC."
|
32
|
+
|
33
|
+
# Fetch nonce and gas price
|
34
|
+
nonce = web3_instance.eth.get_transaction_count(sender_address)
|
35
|
+
gas_price = web3_instance.eth.gas_price
|
36
|
+
gas_limit = web3_instance.eth.estimate_gas({"to": recipient, "value": amount_wei, "from": sender_address})
|
37
|
+
|
38
|
+
tx = {
|
39
|
+
"to": recipient,
|
40
|
+
"value": amount_wei,
|
41
|
+
"gas": gas_limit,
|
42
|
+
"gasPrice": gas_price,
|
43
|
+
"nonce": nonce,
|
44
|
+
"chainId": 31611, # Mezo Testnet Chain ID
|
45
|
+
}
|
46
|
+
|
47
|
+
try:
|
48
|
+
# Sign and send the transaction
|
49
|
+
signed_tx = account.sign_transaction(tx)
|
50
|
+
tx_hash = web3_instance.eth.send_raw_transaction(signed_tx.raw_transaction)
|
51
|
+
return f"✅ BTC Transaction Successful! Hash: {tx_hash.hex()}"
|
52
|
+
except Web3Exception as e:
|
53
|
+
return f"❌ BTC Transaction Failed: {str(e)}"
|
@@ -1,15 +0,0 @@
|
|
1
|
-
Metadata-Version: 2.1
|
2
|
-
Name: mezoAgent
|
3
|
-
Version: 0.1.3
|
4
|
-
Summary: A LangChain tool for sending BTC and mUSD transactions on Mezo Matsnet.
|
5
|
-
Home-page: https://github.com/yourusername/mezoTransactionTool
|
6
|
-
Author: Dreadwulf
|
7
|
-
Author-email: dreadwul@wtf.com
|
8
|
-
Classifier: Programming Language :: Python :: 3
|
9
|
-
Classifier: License :: OSI Approved :: MIT License
|
10
|
-
Classifier: Operating System :: OS Independent
|
11
|
-
Requires-Python: >=3.7
|
12
|
-
Requires-Dist: web3
|
13
|
-
Requires-Dist: langchain
|
14
|
-
Requires-Dist: langchain-openai
|
15
|
-
Requires-Dist: python-dotenv
|
mezoAgent-0.1.3.dist-info/RECORD
DELETED
@@ -1,6 +0,0 @@
|
|
1
|
-
mezoTransactionTool/__init__.py,sha256=4izlG8P3PTGXZb_RvEQ3HlPMxQ1jzSINnF9nSlxnEXE,161
|
2
|
-
mezoTransactionTool/transaction_tools.py,sha256=0VxSaiMSQW067K6qw2SJR9dm-CH7obwMF0cagbEEX1g,5013
|
3
|
-
mezoAgent-0.1.3.dist-info/METADATA,sha256=nMCSfEH-FTHSDb8iEP1W2sGNtNu7ahB-ZzEGy5CZFBo,536
|
4
|
-
mezoAgent-0.1.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
5
|
-
mezoAgent-0.1.3.dist-info/top_level.txt,sha256=Czoa5A8CU_I_oPKDa5OXa5H7RM4Jk94PF9mIpz2V9t4,20
|
6
|
-
mezoAgent-0.1.3.dist-info/RECORD,,
|
@@ -1 +0,0 @@
|
|
1
|
-
mezoTransactionTool
|
mezoTransactionTool/__init__.py
DELETED
@@ -1,126 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import json
|
3
|
-
from dotenv import load_dotenv
|
4
|
-
from web3 import Web3
|
5
|
-
from web3.exceptions import Web3Exception
|
6
|
-
from langchain.tools import tool
|
7
|
-
from langchain_openai import ChatOpenAI
|
8
|
-
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
|
9
|
-
from langchain.prompts import PromptTemplate
|
10
|
-
|
11
|
-
# ✅ Load environment variables
|
12
|
-
USER_PROJECT_DIR = os.getcwd()
|
13
|
-
USER_ENV_PATH = os.path.join(USER_PROJECT_DIR, ".env")
|
14
|
-
|
15
|
-
if os.path.exists(USER_ENV_PATH):
|
16
|
-
load_dotenv(USER_ENV_PATH)
|
17
|
-
else:
|
18
|
-
print("⚠️ Warning: No `.env` file found in your project directory! Transactions requiring signing may fail.")
|
19
|
-
|
20
|
-
# ✅ Load Private Key from User's `.env`
|
21
|
-
PRIVATE_KEY = os.getenv("PRIVATE_KEY")
|
22
|
-
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
|
23
|
-
|
24
|
-
if not PRIVATE_KEY:
|
25
|
-
print("⚠️ Warning: PRIVATE_KEY not set. Please create a `.env` file in your project with your keys.")
|
26
|
-
PRIVATE_KEY = None # Allow package to be installed but prevent transactions
|
27
|
-
|
28
|
-
# ✅ Define RPC URL before initializing Web3
|
29
|
-
RPC_URL = "https://rpc.test.mezo.org"
|
30
|
-
web3_instance = Web3(Web3.HTTPProvider(RPC_URL))
|
31
|
-
|
32
|
-
# ✅ Check Web3 connection
|
33
|
-
if not web3_instance.is_connected():
|
34
|
-
raise ConnectionError("❌ Failed to connect to Mezo Matsnet RPC.")
|
35
|
-
|
36
|
-
# ✅ Initialize account object using `web3_instance`
|
37
|
-
if PRIVATE_KEY:
|
38
|
-
account = web3_instance.eth.account.from_key(PRIVATE_KEY)
|
39
|
-
sender_address = account.address
|
40
|
-
else:
|
41
|
-
account = None
|
42
|
-
sender_address = None
|
43
|
-
|
44
|
-
MUSD_ADDRESS = "0x637e22A1EBbca50EA2d34027c238317fD10003eB"
|
45
|
-
ERC20_ABI = json.loads('[{"constant": false, "inputs": [{"name": "recipient", "type": "address"},{"name": "amount", "type": "uint256"}],"name": "transfer","outputs": [{"name": "", "type": "bool"}],"stateMutability": "nonpayable","type":"function"}]')
|
46
|
-
musd_contract = web3_instance.eth.contract(address=MUSD_ADDRESS, abi=ERC20_ABI)
|
47
|
-
|
48
|
-
# ✅ Define Structured Output Parser for Transaction Details
|
49
|
-
response_schemas = [
|
50
|
-
ResponseSchema(name="amount", description="The amount of cryptocurrency to transfer."),
|
51
|
-
ResponseSchema(name="currency", description="The cryptocurrency (BTC or mUSD)."),
|
52
|
-
ResponseSchema(name="recipient", description="The recipient's wallet address."),
|
53
|
-
]
|
54
|
-
|
55
|
-
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
|
56
|
-
|
57
|
-
# ✅ Define LLM Prompt for Parsing Transactions
|
58
|
-
llm = ChatOpenAI(temperature=0, openai_api_key=OPENAI_API_KEY)
|
59
|
-
|
60
|
-
prompt_template = PromptTemplate(
|
61
|
-
template="Extract transaction details from this request:\n{input}\n{format_instructions}",
|
62
|
-
input_variables=["input"],
|
63
|
-
partial_variables={"format_instructions": output_parser.get_format_instructions()},
|
64
|
-
)
|
65
|
-
|
66
|
-
def extract_transaction_details(prompt: str):
|
67
|
-
"""
|
68
|
-
Uses LLM to extract structured transaction details from user input.
|
69
|
-
"""
|
70
|
-
formatted_prompt = prompt_template.format(input=prompt)
|
71
|
-
response = llm.invoke(formatted_prompt)
|
72
|
-
|
73
|
-
try:
|
74
|
-
return output_parser.parse(response.content)
|
75
|
-
except Exception as e:
|
76
|
-
return f"❌ Failed to extract transaction details: {str(e)}"
|
77
|
-
|
78
|
-
@tool
|
79
|
-
def mezo_agent_transaction_btc(transaction_prompt: str) -> str:
|
80
|
-
"""
|
81
|
-
Sends BTC on Mezo Matsnet. Parses a transaction request and executes the transfer.
|
82
|
-
"""
|
83
|
-
transaction_details = extract_transaction_details(transaction_prompt)
|
84
|
-
|
85
|
-
if isinstance(transaction_details, str): # Handle errors
|
86
|
-
return transaction_details
|
87
|
-
|
88
|
-
amount = float(transaction_details["amount"])
|
89
|
-
currency = transaction_details["currency"].lower()
|
90
|
-
recipient = transaction_details["recipient"]
|
91
|
-
|
92
|
-
if currency != "btc":
|
93
|
-
return "❌ This function only supports BTC transactions."
|
94
|
-
|
95
|
-
# ✅ Convert amount to Wei (BTC uses 18 decimals on Mezo Matsnet)
|
96
|
-
amount_wei = web3_instance.to_wei(amount, "ether")
|
97
|
-
|
98
|
-
# ✅ Check sender's BTC balance
|
99
|
-
sender_balance = web3_instance.eth.get_balance(sender_address)
|
100
|
-
sender_balance_btc = web3_instance.from_wei(sender_balance, "ether")
|
101
|
-
|
102
|
-
if sender_balance < amount_wei:
|
103
|
-
return f"❌ Insufficient BTC balance! You have {sender_balance_btc} BTC but need {amount} BTC."
|
104
|
-
|
105
|
-
# ✅ Fetch nonce and gas price
|
106
|
-
nonce = web3_instance.eth.get_transaction_count(sender_address)
|
107
|
-
gas_price = web3_instance.eth.gas_price
|
108
|
-
gas_limit = web3_instance.eth.estimate_gas({"to": recipient, "value": amount_wei, "from": sender_address})
|
109
|
-
|
110
|
-
tx = {
|
111
|
-
"to": recipient,
|
112
|
-
"value": amount_wei,
|
113
|
-
"gas": gas_limit,
|
114
|
-
"gasPrice": gas_price,
|
115
|
-
"nonce": nonce,
|
116
|
-
"chainId": 31611, # Mezo Testnet Chain ID
|
117
|
-
}
|
118
|
-
|
119
|
-
try:
|
120
|
-
# ✅ Sign and send the transaction
|
121
|
-
signed_tx = account.sign_transaction(tx)
|
122
|
-
tx_hash = web3_instance.eth.send_raw_transaction(signed_tx.raw_transaction)
|
123
|
-
return f"✅ BTC Transaction Successful! Hash: {tx_hash.hex()}"
|
124
|
-
|
125
|
-
except Web3Exception as e:
|
126
|
-
return f"❌ BTC Transaction Failed: {str(e)}"
|
File without changes
|