agent0-sdk 0.31__py3-none-any.whl → 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agent0_sdk/__init__.py +1 -1
- agent0_sdk/core/agent.py +172 -30
- agent0_sdk/core/contracts.py +93 -58
- agent0_sdk/core/feedback_manager.py +90 -161
- agent0_sdk/core/indexer.py +54 -26
- agent0_sdk/core/models.py +6 -19
- agent0_sdk/core/oasf_validator.py +1 -1
- agent0_sdk/core/sdk.py +31 -16
- agent0_sdk/core/subgraph_client.py +34 -15
- agent0_sdk/core/web3_client.py +184 -17
- {agent0_sdk-0.31.dist-info → agent0_sdk-1.0.0.dist-info}/METADATA +21 -7
- agent0_sdk-1.0.0.dist-info/RECORD +19 -0
- {agent0_sdk-0.31.dist-info → agent0_sdk-1.0.0.dist-info}/top_level.txt +0 -1
- agent0_sdk-0.31.dist-info/RECORD +0 -33
- tests/__init__.py +0 -1
- tests/config.py +0 -46
- tests/conftest.py +0 -22
- tests/discover_test_data.py +0 -445
- tests/test_feedback.py +0 -417
- tests/test_models.py +0 -224
- tests/test_multi_chain.py +0 -588
- tests/test_oasf_management.py +0 -404
- tests/test_real_public_servers.py +0 -103
- tests/test_registration.py +0 -267
- tests/test_registrationIpfs.py +0 -227
- tests/test_sdk.py +0 -240
- tests/test_search.py +0 -415
- tests/test_transfer.py +0 -255
- {agent0_sdk-0.31.dist-info → agent0_sdk-1.0.0.dist-info}/WHEEL +0 -0
- {agent0_sdk-0.31.dist-info → agent0_sdk-1.0.0.dist-info}/licenses/LICENSE +0 -0
tests/test_registration.py
DELETED
|
@@ -1,267 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Test for Agent Registration with HTTP URI
|
|
3
|
-
Creates an agent, registers it with a mock HTTP URI, updates it, and verifies data integrity.
|
|
4
|
-
|
|
5
|
-
Flow:
|
|
6
|
-
1. Register agent on-chain with mock URI (obtain agentId)
|
|
7
|
-
2. Prepare registration file with obtained agentId
|
|
8
|
-
3. Print registration file JSON for developer to host
|
|
9
|
-
4. Update agent and verify consistency
|
|
10
|
-
"""
|
|
11
|
-
|
|
12
|
-
import logging
|
|
13
|
-
import time
|
|
14
|
-
import random
|
|
15
|
-
import json
|
|
16
|
-
import sys
|
|
17
|
-
|
|
18
|
-
# Configure logging: root logger at WARNING to suppress noisy dependencies
|
|
19
|
-
logging.basicConfig(
|
|
20
|
-
level=logging.WARNING,
|
|
21
|
-
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|
22
|
-
datefmt='%Y-%m-%d %H:%M:%S',
|
|
23
|
-
handlers=[logging.StreamHandler(sys.stdout)]
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
# Set debug level ONLY for agent0_sdk
|
|
27
|
-
logging.getLogger('agent0_sdk').setLevel(logging.DEBUG)
|
|
28
|
-
logging.getLogger('agent0_sdk.core').setLevel(logging.DEBUG)
|
|
29
|
-
|
|
30
|
-
from agent0_sdk import SDK
|
|
31
|
-
from config import CHAIN_ID, RPC_URL, AGENT_PRIVATE_KEY, print_config
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def generateRandomData():
|
|
35
|
-
"""Generate random test data for the agent."""
|
|
36
|
-
randomSuffix = random.randint(1000, 9999)
|
|
37
|
-
timestamp = int(time.time())
|
|
38
|
-
|
|
39
|
-
return {
|
|
40
|
-
'name': f"Test Agent {randomSuffix}",
|
|
41
|
-
'description': f"Created at {timestamp}",
|
|
42
|
-
'image': f"https://example.com/image_{randomSuffix}.png",
|
|
43
|
-
'mcpEndpoint': f"https://api.example.com/mcp/{randomSuffix}",
|
|
44
|
-
'mcpVersion': f"2025-06-{random.randint(1, 28)}",
|
|
45
|
-
'a2aEndpoint': f"https://api.example.com/a2a/{randomSuffix}.json",
|
|
46
|
-
'a2aVersion': f"0.{random.randint(30, 35)}",
|
|
47
|
-
'ensName': f"test{randomSuffix}.eth",
|
|
48
|
-
'ensVersion': f"1.{random.randint(0, 9)}",
|
|
49
|
-
'walletAddress': f"0x{'a' * 40}",
|
|
50
|
-
'walletChainId': random.choice([1, 11155111, 8453, 137, 42161]),
|
|
51
|
-
'active': True,
|
|
52
|
-
'x402support': False,
|
|
53
|
-
'reputation': random.choice([True, False]),
|
|
54
|
-
'cryptoEconomic': random.choice([True, False]),
|
|
55
|
-
'teeAttestation': random.choice([True, False])
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
def main():
|
|
60
|
-
print("🧪 Testing Agent Registration with HTTP URI")
|
|
61
|
-
print_config()
|
|
62
|
-
|
|
63
|
-
# SDK Configuration - no IPFS
|
|
64
|
-
sdkConfig = {
|
|
65
|
-
'chainId': CHAIN_ID,
|
|
66
|
-
'rpcUrl': RPC_URL
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
sdk = SDK(signer=AGENT_PRIVATE_KEY, **sdkConfig)
|
|
70
|
-
testData = generateRandomData()
|
|
71
|
-
|
|
72
|
-
# Step 1: Register agent on-chain with mock HTTP URI
|
|
73
|
-
print("\n📍 Step 1: Register Agent on-Chain with Mock URI")
|
|
74
|
-
print("-" * 60)
|
|
75
|
-
|
|
76
|
-
agent = sdk.createAgent(
|
|
77
|
-
name=testData['name'],
|
|
78
|
-
description=testData['description'],
|
|
79
|
-
image=testData['image']
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
# Register with mock URI to get agentId
|
|
83
|
-
mockUri = "https://example.com/agents/registration.json"
|
|
84
|
-
agent.register(mockUri)
|
|
85
|
-
agentId = agent.agentId
|
|
86
|
-
print(f"✅ Registered: ID={agentId}")
|
|
87
|
-
print(f" Mock URI: {mockUri}")
|
|
88
|
-
|
|
89
|
-
# Step 2: Configure agent with all details
|
|
90
|
-
print("\n📍 Step 2: Configure Agent Details")
|
|
91
|
-
print("-" * 60)
|
|
92
|
-
print(f"✅ Created: {testData['name']}")
|
|
93
|
-
|
|
94
|
-
agent.setMCP(testData['mcpEndpoint'], testData['mcpVersion'])
|
|
95
|
-
agent.setA2A(testData['a2aEndpoint'], testData['a2aVersion'])
|
|
96
|
-
agent.setENS(testData['ensName'], testData['ensVersion'])
|
|
97
|
-
agent.setAgentWallet(testData['walletAddress'], testData['walletChainId'])
|
|
98
|
-
agent.setActive(testData['active'])
|
|
99
|
-
agent.setX402Support(testData['x402support'])
|
|
100
|
-
agent.setTrust(
|
|
101
|
-
reputation=testData['reputation'],
|
|
102
|
-
cryptoEconomic=testData['cryptoEconomic'],
|
|
103
|
-
teeAttestation=testData['teeAttestation']
|
|
104
|
-
)
|
|
105
|
-
|
|
106
|
-
# Step 3: Get registration file and print it
|
|
107
|
-
print("\n📍 Step 3: Registration File for Hosting")
|
|
108
|
-
print("-" * 60)
|
|
109
|
-
|
|
110
|
-
registrationFile = agent.getRegistrationFile()
|
|
111
|
-
registrationJson = json.dumps(registrationFile.to_dict(), indent=2)
|
|
112
|
-
|
|
113
|
-
print("Registration file JSON (host this at the URL you specified):")
|
|
114
|
-
print("\n" + registrationJson)
|
|
115
|
-
|
|
116
|
-
# Save to file
|
|
117
|
-
filename = f"agent_registration_{agentId.replace(':', '_')}.json"
|
|
118
|
-
with open(filename, 'w') as f:
|
|
119
|
-
f.write(registrationJson)
|
|
120
|
-
print(f"\n✅ Saved to: {filename}")
|
|
121
|
-
|
|
122
|
-
capturedState = {
|
|
123
|
-
'agentId': agent.agentId,
|
|
124
|
-
'agentURI': agent.agentURI,
|
|
125
|
-
'name': agent.name,
|
|
126
|
-
'description': agent.description,
|
|
127
|
-
'image': agent.image,
|
|
128
|
-
'walletAddress': agent.walletAddress,
|
|
129
|
-
'walletChainId': agent.walletChainId,
|
|
130
|
-
'active': agent.active,
|
|
131
|
-
'x402support': agent.x402support,
|
|
132
|
-
'mcpEndpoint': agent.mcpEndpoint,
|
|
133
|
-
'a2aEndpoint': agent.a2aEndpoint,
|
|
134
|
-
'ensEndpoint': agent.ensEndpoint,
|
|
135
|
-
'metadata': agent.metadata.copy()
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
# Step 4: Update agent
|
|
139
|
-
print("\n📍 Step 4: Update Agent")
|
|
140
|
-
print("-" * 60)
|
|
141
|
-
|
|
142
|
-
agent.updateInfo(
|
|
143
|
-
name=testData['name'] + " UPDATED",
|
|
144
|
-
description=testData['description'] + " - UPDATED",
|
|
145
|
-
image=f"https://example.com/image_{random.randint(1000, 9999)}_updated.png"
|
|
146
|
-
)
|
|
147
|
-
agent.setMCP(f"https://api.example.com/mcp/{random.randint(10000, 99999)}", f"2025-06-{random.randint(1, 28)}")
|
|
148
|
-
agent.setA2A(f"https://api.example.com/a2a/{random.randint(10000, 99999)}.json", f"0.{random.randint(30, 35)}")
|
|
149
|
-
agent.setAgentWallet(f"0x{'b' * 40}", random.choice([1, 11155111, 8453, 137, 42161]))
|
|
150
|
-
agent.setENS(f"{testData['ensName']}.updated", f"1.{random.randint(0, 9)}")
|
|
151
|
-
agent.setActive(False)
|
|
152
|
-
agent.setX402Support(True)
|
|
153
|
-
agent.setTrust(
|
|
154
|
-
reputation=random.choice([True, False]),
|
|
155
|
-
cryptoEconomic=random.choice([True, False]),
|
|
156
|
-
teeAttestation=random.choice([True, False])
|
|
157
|
-
)
|
|
158
|
-
agent.setMetadata({
|
|
159
|
-
"testKey": "testValue",
|
|
160
|
-
"timestamp": int(time.time()),
|
|
161
|
-
"customField": "customValue",
|
|
162
|
-
"anotherField": "anotherValue",
|
|
163
|
-
"numericField": random.randint(1000, 9999)
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
# Update registration file and re-register
|
|
167
|
-
registrationFileUpdated = agent.getRegistrationFile()
|
|
168
|
-
registrationJsonUpdated = json.dumps(registrationFileUpdated.to_dict(), indent=2)
|
|
169
|
-
|
|
170
|
-
filenameUpdated = f"agent_registration_{agentId.replace(':', '_')}_updated.json"
|
|
171
|
-
with open(filenameUpdated, 'w') as f:
|
|
172
|
-
f.write(registrationJsonUpdated)
|
|
173
|
-
|
|
174
|
-
agent.register(mockUri)
|
|
175
|
-
print(f"✅ Updated & re-registered")
|
|
176
|
-
print(f" Updated registration file: {filenameUpdated}")
|
|
177
|
-
|
|
178
|
-
# Capture updated state
|
|
179
|
-
updatedState = {
|
|
180
|
-
'name': agent.name,
|
|
181
|
-
'description': agent.description,
|
|
182
|
-
'image': agent.image,
|
|
183
|
-
'walletAddress': agent.walletAddress,
|
|
184
|
-
'walletChainId': agent.walletChainId,
|
|
185
|
-
'active': agent.active,
|
|
186
|
-
'x402support': agent.x402support,
|
|
187
|
-
'mcpEndpoint': agent.mcpEndpoint,
|
|
188
|
-
'a2aEndpoint': agent.a2aEndpoint,
|
|
189
|
-
'ensEndpoint': agent.ensEndpoint,
|
|
190
|
-
'metadata': agent.metadata.copy()
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
# Step 5: Reload and verify
|
|
194
|
-
print("\n📍 Step 5: Reload and Verify")
|
|
195
|
-
print("-" * 60)
|
|
196
|
-
|
|
197
|
-
reloadedAgentId = agent.agentId
|
|
198
|
-
del agent
|
|
199
|
-
print("⏳ Waiting for blockchain transaction to be mined (15 seconds)...")
|
|
200
|
-
time.sleep(15)
|
|
201
|
-
reloadedAgent = sdk.loadAgent(reloadedAgentId)
|
|
202
|
-
print(f"✅ Reloaded from blockchain")
|
|
203
|
-
|
|
204
|
-
reloadedState = {
|
|
205
|
-
'name': reloadedAgent.name,
|
|
206
|
-
'description': reloadedAgent.description,
|
|
207
|
-
'image': reloadedAgent.image,
|
|
208
|
-
'walletAddress': reloadedAgent.walletAddress,
|
|
209
|
-
'walletChainId': reloadedAgent.walletChainId,
|
|
210
|
-
'active': reloadedAgent.active,
|
|
211
|
-
'x402support': reloadedAgent.x402support,
|
|
212
|
-
'mcpEndpoint': reloadedAgent.mcpEndpoint,
|
|
213
|
-
'a2aEndpoint': reloadedAgent.a2aEndpoint,
|
|
214
|
-
'ensEndpoint': reloadedAgent.ensEndpoint,
|
|
215
|
-
'metadata': reloadedAgent.metadata.copy()
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
expectedState = updatedState
|
|
219
|
-
expectedState['walletAddress'] = f"0x{'b' * 40}"
|
|
220
|
-
expectedState['walletChainId'] = sdk.chainId
|
|
221
|
-
|
|
222
|
-
allMatch = True
|
|
223
|
-
for field, expected in expectedState.items():
|
|
224
|
-
actual = reloadedState.get(field)
|
|
225
|
-
|
|
226
|
-
# Handle type casting for metadata fields
|
|
227
|
-
if field == 'metadata' and isinstance(actual, dict) and isinstance(expected, dict):
|
|
228
|
-
normalized_actual = {}
|
|
229
|
-
for k, v in actual.items():
|
|
230
|
-
if k in expected:
|
|
231
|
-
expected_val = expected[k]
|
|
232
|
-
if isinstance(expected_val, int):
|
|
233
|
-
try:
|
|
234
|
-
normalized_actual[k] = int(v) if isinstance(v, str) else v
|
|
235
|
-
except (ValueError, TypeError):
|
|
236
|
-
normalized_actual[k] = v
|
|
237
|
-
elif isinstance(expected_val, float):
|
|
238
|
-
try:
|
|
239
|
-
normalized_actual[k] = float(v) if isinstance(v, str) else v
|
|
240
|
-
except (ValueError, TypeError):
|
|
241
|
-
normalized_actual[k] = v
|
|
242
|
-
else:
|
|
243
|
-
normalized_actual[k] = v
|
|
244
|
-
else:
|
|
245
|
-
normalized_actual[k] = v
|
|
246
|
-
actual = normalized_actual
|
|
247
|
-
|
|
248
|
-
if actual == expected:
|
|
249
|
-
print(f"✅ {field}: {actual}")
|
|
250
|
-
else:
|
|
251
|
-
print(f"❌ {field}: expected={expected}, got={actual}")
|
|
252
|
-
allMatch = False
|
|
253
|
-
|
|
254
|
-
if allMatch:
|
|
255
|
-
print("\n✅ ALL CHECKS PASSED")
|
|
256
|
-
else:
|
|
257
|
-
print("\n❌ SOME CHECKS FAILED")
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
if __name__ == "__main__":
|
|
261
|
-
try:
|
|
262
|
-
main()
|
|
263
|
-
except Exception as e:
|
|
264
|
-
print(f"\n❌ Error: {e}")
|
|
265
|
-
import traceback
|
|
266
|
-
traceback.print_exc()
|
|
267
|
-
exit(1)
|
tests/test_registrationIpfs.py
DELETED
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Real Test for Agent Registration with IPFS Pin (using Pinata)
|
|
3
|
-
Creates an agent, updates it on-chain, deletes it, reloads it, and verifies data integrity.
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
import logging
|
|
7
|
-
import time
|
|
8
|
-
import random
|
|
9
|
-
import sys
|
|
10
|
-
|
|
11
|
-
# Configure logging: root logger at WARNING to suppress noisy dependencies
|
|
12
|
-
logging.basicConfig(
|
|
13
|
-
level=logging.WARNING,
|
|
14
|
-
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
|
15
|
-
datefmt='%Y-%m-%d %H:%M:%S',
|
|
16
|
-
handlers=[logging.StreamHandler(sys.stdout)]
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
# Set debug level ONLY for agent0_sdk
|
|
20
|
-
logging.getLogger('agent0_sdk').setLevel(logging.DEBUG)
|
|
21
|
-
logging.getLogger('agent0_sdk.core').setLevel(logging.DEBUG)
|
|
22
|
-
|
|
23
|
-
from agent0_sdk import SDK
|
|
24
|
-
from config import CHAIN_ID, RPC_URL, AGENT_PRIVATE_KEY, PINATA_JWT, print_config
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def generateRandomData():
|
|
28
|
-
"""Generate random test data for the agent."""
|
|
29
|
-
randomSuffix = random.randint(1000, 9999)
|
|
30
|
-
timestamp = int(time.time())
|
|
31
|
-
|
|
32
|
-
return {
|
|
33
|
-
'name': f"Test Agent {randomSuffix}",
|
|
34
|
-
'description': f"Created at {timestamp}",
|
|
35
|
-
'image': f"https://example.com/image_{randomSuffix}.png",
|
|
36
|
-
'mcpEndpoint': f"https://api.example.com/mcp/{randomSuffix}",
|
|
37
|
-
'mcpVersion': f"2025-06-{random.randint(1, 28)}",
|
|
38
|
-
'a2aEndpoint': f"https://api.example.com/a2a/{randomSuffix}.json",
|
|
39
|
-
'a2aVersion': f"0.{random.randint(30, 35)}",
|
|
40
|
-
'ensName': f"test{randomSuffix}.eth",
|
|
41
|
-
'ensVersion': f"1.{random.randint(0, 9)}",
|
|
42
|
-
'walletAddress': f"0x{'a' * 40}",
|
|
43
|
-
'walletChainId': random.choice([1, 11155111, 8453, 137, 42161]), # Mainnet, Sepolia, Base, Polygon, Arbitrum
|
|
44
|
-
'active': True,
|
|
45
|
-
'x402support': False,
|
|
46
|
-
'reputation': random.choice([True, False]),
|
|
47
|
-
'cryptoEconomic': random.choice([True, False]),
|
|
48
|
-
'teeAttestation': random.choice([True, False])
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def main():
|
|
53
|
-
print("🧪 Testing Agent Registration with IPFS Pin")
|
|
54
|
-
print_config()
|
|
55
|
-
|
|
56
|
-
# SDK Configuration with Pinata IPFS
|
|
57
|
-
sdkConfig = {
|
|
58
|
-
'chainId': CHAIN_ID,
|
|
59
|
-
'rpcUrl': RPC_URL,
|
|
60
|
-
'ipfs': 'pinata',
|
|
61
|
-
'pinataJwt': PINATA_JWT
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
sdk = SDK(signer=AGENT_PRIVATE_KEY, **sdkConfig)
|
|
65
|
-
testData = generateRandomData()
|
|
66
|
-
|
|
67
|
-
agent = sdk.createAgent(
|
|
68
|
-
name=testData['name'],
|
|
69
|
-
description=testData['description'],
|
|
70
|
-
image=testData['image']
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
agent.setMCP(testData['mcpEndpoint'], testData['mcpVersion'])
|
|
74
|
-
agent.setA2A(testData['a2aEndpoint'], testData['a2aVersion'])
|
|
75
|
-
agent.setENS(testData['ensName'], testData['ensVersion'])
|
|
76
|
-
agent.setAgentWallet(testData['walletAddress'], testData['walletChainId'])
|
|
77
|
-
agent.setActive(testData['active'])
|
|
78
|
-
agent.setX402Support(testData['x402support'])
|
|
79
|
-
agent.setTrust(
|
|
80
|
-
reputation=testData['reputation'],
|
|
81
|
-
cryptoEconomic=testData['cryptoEconomic'],
|
|
82
|
-
teeAttestation=testData['teeAttestation']
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
print(f"\n✅ Created: {testData['name']}")
|
|
86
|
-
|
|
87
|
-
agent.registerIPFS()
|
|
88
|
-
agentId = agent.agentId
|
|
89
|
-
print(f"✅ Registered: ID={agentId}")
|
|
90
|
-
|
|
91
|
-
capturedState = {
|
|
92
|
-
'agentId': agent.agentId,
|
|
93
|
-
'agentURI': agent.agentURI,
|
|
94
|
-
'name': agent.name,
|
|
95
|
-
'description': agent.description,
|
|
96
|
-
'image': agent.image,
|
|
97
|
-
'walletAddress': agent.walletAddress,
|
|
98
|
-
'walletChainId': agent.walletChainId,
|
|
99
|
-
'active': agent.active,
|
|
100
|
-
'x402support': agent.x402support,
|
|
101
|
-
'mcpEndpoint': agent.mcpEndpoint,
|
|
102
|
-
'a2aEndpoint': agent.a2aEndpoint,
|
|
103
|
-
'ensEndpoint': agent.ensEndpoint,
|
|
104
|
-
'metadata': agent.metadata.copy()
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
agent.updateInfo(
|
|
108
|
-
name=testData['name'] + " UPDATED",
|
|
109
|
-
description=testData['description'] + " - UPDATED",
|
|
110
|
-
image=f"https://example.com/image_{random.randint(1000, 9999)}_updated.png"
|
|
111
|
-
)
|
|
112
|
-
agent.setMCP(f"https://api.example.com/mcp/{random.randint(10000, 99999)}", f"2025-06-{random.randint(1, 28)}")
|
|
113
|
-
agent.setA2A(f"https://api.example.com/a2a/{random.randint(10000, 99999)}.json", f"0.{random.randint(30, 35)}")
|
|
114
|
-
agent.setAgentWallet(f"0x{'b' * 40}", random.choice([1, 11155111, 8453, 137, 42161]))
|
|
115
|
-
agent.setENS(f"{testData['ensName']}.updated", f"1.{random.randint(0, 9)}")
|
|
116
|
-
agent.setActive(False)
|
|
117
|
-
agent.setX402Support(True)
|
|
118
|
-
agent.setTrust(
|
|
119
|
-
reputation=random.choice([True, False]),
|
|
120
|
-
cryptoEconomic=random.choice([True, False]),
|
|
121
|
-
teeAttestation=random.choice([True, False])
|
|
122
|
-
)
|
|
123
|
-
agent.setMetadata({
|
|
124
|
-
"testKey": "testValue",
|
|
125
|
-
"timestamp": int(time.time()),
|
|
126
|
-
"customField": "customValue",
|
|
127
|
-
"anotherField": "anotherValue",
|
|
128
|
-
"numericField": random.randint(1000, 9999)
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
agent.registerIPFS()
|
|
132
|
-
print(f"✅ Updated & re-registered")
|
|
133
|
-
|
|
134
|
-
# Capture updated state before deletion
|
|
135
|
-
updatedState = {
|
|
136
|
-
'name': agent.name,
|
|
137
|
-
'description': agent.description,
|
|
138
|
-
'image': agent.image,
|
|
139
|
-
'walletAddress': agent.walletAddress,
|
|
140
|
-
'walletChainId': agent.walletChainId,
|
|
141
|
-
'active': agent.active,
|
|
142
|
-
'x402support': agent.x402support,
|
|
143
|
-
'mcpEndpoint': agent.mcpEndpoint,
|
|
144
|
-
'a2aEndpoint': agent.a2aEndpoint,
|
|
145
|
-
'ensEndpoint': agent.ensEndpoint,
|
|
146
|
-
'metadata': agent.metadata.copy()
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
reloadedAgentId = agent.agentId
|
|
150
|
-
del agent
|
|
151
|
-
# Wait for blockchain transaction to be mined (Sepolia takes ~15 seconds)
|
|
152
|
-
print("⏳ Waiting for blockchain transaction to be mined (15 seconds)...")
|
|
153
|
-
time.sleep(15)
|
|
154
|
-
reloadedAgent = sdk.loadAgent(reloadedAgentId)
|
|
155
|
-
print(f"✅ Reloaded from blockchain")
|
|
156
|
-
|
|
157
|
-
reloadedState = {
|
|
158
|
-
'name': reloadedAgent.name,
|
|
159
|
-
'description': reloadedAgent.description,
|
|
160
|
-
'image': reloadedAgent.image,
|
|
161
|
-
'walletAddress': reloadedAgent.walletAddress,
|
|
162
|
-
'walletChainId': reloadedAgent.walletChainId,
|
|
163
|
-
'active': reloadedAgent.active,
|
|
164
|
-
'x402support': reloadedAgent.x402support,
|
|
165
|
-
'mcpEndpoint': reloadedAgent.mcpEndpoint,
|
|
166
|
-
'a2aEndpoint': reloadedAgent.a2aEndpoint,
|
|
167
|
-
'ensEndpoint': reloadedAgent.ensEndpoint,
|
|
168
|
-
'metadata': reloadedAgent.metadata.copy()
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
expectedState = updatedState
|
|
172
|
-
|
|
173
|
-
# Override expected values for fields that should match the updated state
|
|
174
|
-
expectedState['walletAddress'] = f"0x{'b' * 40}"
|
|
175
|
-
# When wallet is set on-chain, walletChainId will be the current chain (where the update happened)
|
|
176
|
-
# This is different from the original registration file's chain ID
|
|
177
|
-
expectedState['walletChainId'] = sdk.chainId # Current chain where wallet was updated
|
|
178
|
-
|
|
179
|
-
allMatch = True
|
|
180
|
-
for field, expected in expectedState.items():
|
|
181
|
-
actual = reloadedState.get(field)
|
|
182
|
-
|
|
183
|
-
# Handle type casting for metadata fields (on-chain values are strings)
|
|
184
|
-
if field == 'metadata' and isinstance(actual, dict) and isinstance(expected, dict):
|
|
185
|
-
# Try to cast string values back to their original types
|
|
186
|
-
normalized_actual = {}
|
|
187
|
-
for k, v in actual.items():
|
|
188
|
-
if k in expected:
|
|
189
|
-
expected_val = expected[k]
|
|
190
|
-
# If expected is int or float, try to cast
|
|
191
|
-
if isinstance(expected_val, int):
|
|
192
|
-
try:
|
|
193
|
-
normalized_actual[k] = int(v) if isinstance(v, str) else v
|
|
194
|
-
except (ValueError, TypeError):
|
|
195
|
-
normalized_actual[k] = v
|
|
196
|
-
elif isinstance(expected_val, float):
|
|
197
|
-
try:
|
|
198
|
-
normalized_actual[k] = float(v) if isinstance(v, str) else v
|
|
199
|
-
except (ValueError, TypeError):
|
|
200
|
-
normalized_actual[k] = v
|
|
201
|
-
else:
|
|
202
|
-
normalized_actual[k] = v
|
|
203
|
-
else:
|
|
204
|
-
normalized_actual[k] = v
|
|
205
|
-
actual = normalized_actual
|
|
206
|
-
|
|
207
|
-
if actual == expected:
|
|
208
|
-
print(f"✅ {field}: {actual}")
|
|
209
|
-
else:
|
|
210
|
-
print(f"❌ {field}: expected={expected}, got={actual}")
|
|
211
|
-
allMatch = False
|
|
212
|
-
|
|
213
|
-
if allMatch:
|
|
214
|
-
print("\n✅ ALL CHECKS PASSED")
|
|
215
|
-
else:
|
|
216
|
-
print("\n❌ SOME CHECKS FAILED")
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
if __name__ == "__main__":
|
|
220
|
-
try:
|
|
221
|
-
main()
|
|
222
|
-
except Exception as e:
|
|
223
|
-
print(f"\n❌ Error: {e}")
|
|
224
|
-
import traceback
|
|
225
|
-
traceback.print_exc()
|
|
226
|
-
exit(1)
|
|
227
|
-
|