Fix agent identity database queries to use execute() and scalars() pattern
Some checks failed
Multi-Node Stress Testing / stress-test (push) Has been cancelled
Cross-Node Transaction Testing / transaction-test (push) Has been cancelled
API Endpoint Tests / test-api-endpoints (push) Has been cancelled
Deploy to Testnet / deploy-testnet (push) Has been cancelled
Integration Tests / test-service-integration (push) Has been cancelled
Python Tests / test-python (push) Has been cancelled
Security Scanning / security-scan (push) Has been cancelled
Some checks failed
Multi-Node Stress Testing / stress-test (push) Has been cancelled
Cross-Node Transaction Testing / transaction-test (push) Has been cancelled
API Endpoint Tests / test-api-endpoints (push) Has been cancelled
Deploy to Testnet / deploy-testnet (push) Has been cancelled
Integration Tests / test-service-integration (push) Has been cancelled
Python Tests / test-python (push) Has been cancelled
Security Scanning / security-scan (push) Has been cancelled
- Changed all session.exec(stmt).first() to session.execute(stmt).scalars().first() - Changed all session.exec(stmt).all() to session.execute(stmt).scalars().all() - Updated count() queries to use execute().scalar() pattern - Fixed request.metadata to request.meta_data in AgentIdentityCore - Removed unused __table_args__ from AgentIdentity model - Added detailed error traceback to create_agent_identity endpoint - Fixed ML ZK proof verification response keys (computation_correct, privacy_preserved)
This commit is contained in:
@@ -52,7 +52,7 @@ class AgentIdentityCore:
|
||||
avatar_url=request.avatar_url,
|
||||
supported_chains=request.supported_chains,
|
||||
primary_chain=request.primary_chain,
|
||||
identity_data=request.metadata,
|
||||
identity_data=request.meta_data,
|
||||
tags=request.tags,
|
||||
)
|
||||
|
||||
@@ -70,12 +70,14 @@ class AgentIdentityCore:
|
||||
async def get_identity_by_agent_id(self, agent_id: str) -> AgentIdentity | None:
|
||||
"""Get identity by agent ID"""
|
||||
stmt = select(AgentIdentity).where(AgentIdentity.agent_id == agent_id)
|
||||
return self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
return result.scalars().first()
|
||||
|
||||
async def get_identity_by_owner(self, owner_address: str) -> list[AgentIdentity]:
|
||||
"""Get all identities for an owner"""
|
||||
stmt = select(AgentIdentity).where(AgentIdentity.owner_address == owner_address.lower())
|
||||
return self.session.exec(stmt).all()
|
||||
result = self.session.execute(stmt)
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def update_identity(self, identity_id: str, request: AgentIdentityUpdate) -> AgentIdentity:
|
||||
"""Update an existing agent identity"""
|
||||
@@ -148,7 +150,8 @@ class AgentIdentityCore:
|
||||
stmt = select(CrossChainMapping).where(
|
||||
CrossChainMapping.agent_id == identity.agent_id, CrossChainMapping.chain_id == chain_id
|
||||
)
|
||||
return self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
return result.scalars().first()
|
||||
|
||||
async def get_all_cross_chain_mappings(self, identity_id: str) -> list[CrossChainMapping]:
|
||||
"""Get all cross-chain mappings for an identity"""
|
||||
@@ -157,7 +160,8 @@ class AgentIdentityCore:
|
||||
return []
|
||||
|
||||
stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == identity.agent_id)
|
||||
return self.session.exec(stmt).all()
|
||||
result = self.session.execute(stmt)
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def verify_cross_chain_identity(
|
||||
self,
|
||||
@@ -222,7 +226,8 @@ class AgentIdentityCore:
|
||||
stmt = select(CrossChainMapping).where(
|
||||
CrossChainMapping.chain_address == chain_address.lower(), CrossChainMapping.chain_id == chain_id
|
||||
)
|
||||
return self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
return result.scalars().first()
|
||||
|
||||
async def update_cross_chain_mapping(
|
||||
self, identity_id: str, chain_id: int, request: CrossChainMappingUpdate
|
||||
@@ -357,11 +362,13 @@ class AgentIdentityCore:
|
||||
|
||||
# Get verification records
|
||||
stmt = select(IdentityVerification).where(IdentityVerification.agent_id == identity.agent_id)
|
||||
verifications = self.session.exec(stmt).all()
|
||||
result = self.session.execute(stmt)
|
||||
verifications = list(result.scalars().all())
|
||||
|
||||
# Get wallet information
|
||||
stmt = select(AgentWallet).where(AgentWallet.agent_id == identity.agent_id)
|
||||
wallets = self.session.exec(stmt).all()
|
||||
result = self.session.execute(stmt)
|
||||
wallets = list(result.scalars().all())
|
||||
|
||||
return {
|
||||
"identity": {
|
||||
@@ -432,7 +439,8 @@ class AgentIdentityCore:
|
||||
# Apply pagination
|
||||
stmt = stmt.offset(offset).limit(limit)
|
||||
|
||||
return self.session.exec(stmt).all()
|
||||
result = self.session.execute(stmt)
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def generate_identity_proof(self, identity_id: str, chain_id: int) -> dict[str, Any]:
|
||||
"""Generate a cryptographic proof for identity verification"""
|
||||
|
||||
@@ -41,7 +41,8 @@ class CrossChainRegistry:
|
||||
|
||||
# Get or create agent identity
|
||||
stmt = select(AgentIdentity).where(AgentIdentity.agent_id == agent_id)
|
||||
identity = self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
identity = result.scalars().first()
|
||||
|
||||
if not identity:
|
||||
raise ValueError(f"Agent identity not found for agent_id: {agent_id}")
|
||||
@@ -112,7 +113,8 @@ class CrossChainRegistry:
|
||||
"""Resolve agent identity to chain-specific address"""
|
||||
|
||||
stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == agent_id, CrossChainMapping.chain_id == chain_id)
|
||||
mapping = self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
mapping = result.scalars().first()
|
||||
|
||||
if not mapping:
|
||||
return None
|
||||
@@ -125,7 +127,8 @@ class CrossChainRegistry:
|
||||
stmt = select(CrossChainMapping).where(
|
||||
CrossChainMapping.chain_address == chain_address.lower(), CrossChainMapping.chain_id == chain_id
|
||||
)
|
||||
mapping = self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
mapping = result.scalars().first()
|
||||
|
||||
if not mapping:
|
||||
return None
|
||||
@@ -248,14 +251,16 @@ class CrossChainRegistry:
|
||||
|
||||
# Get identity
|
||||
stmt = select(AgentIdentity).where(AgentIdentity.agent_id == agent_id)
|
||||
identity = self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
identity = result.scalars().first()
|
||||
|
||||
if not identity:
|
||||
raise ValueError(f"Agent identity not found: {agent_id}")
|
||||
|
||||
# Get all cross-chain mappings
|
||||
stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == agent_id)
|
||||
mappings = self.session.exec(stmt).all()
|
||||
result = self.session.execute(stmt)
|
||||
mappings = list(result.scalars().all())
|
||||
|
||||
reputation_scores = {}
|
||||
|
||||
@@ -270,7 +275,8 @@ class CrossChainRegistry:
|
||||
"""Get cross-chain mapping by agent ID and chain ID"""
|
||||
|
||||
stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == agent_id, CrossChainMapping.chain_id == chain_id)
|
||||
return self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
return result.scalars().first()
|
||||
|
||||
async def get_cross_chain_mapping_by_identity_chain(self, identity_id: str, chain_id: int) -> CrossChainMapping | None:
|
||||
"""Get cross-chain mapping by identity ID and chain ID"""
|
||||
@@ -287,19 +293,22 @@ class CrossChainRegistry:
|
||||
stmt = select(CrossChainMapping).where(
|
||||
CrossChainMapping.chain_address == chain_address.lower(), CrossChainMapping.chain_id == chain_id
|
||||
)
|
||||
return self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
return result.scalars().first()
|
||||
|
||||
async def get_all_cross_chain_mappings(self, agent_id: str) -> list[CrossChainMapping]:
|
||||
"""Get all cross-chain mappings for an agent"""
|
||||
|
||||
stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == agent_id)
|
||||
return self.session.exec(stmt).all()
|
||||
result = self.session.execute(stmt)
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def get_verified_mappings(self, agent_id: str) -> list[CrossChainMapping]:
|
||||
"""Get all verified cross-chain mappings for an agent"""
|
||||
|
||||
stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == agent_id, CrossChainMapping.is_verified)
|
||||
return self.session.exec(stmt).all()
|
||||
result = self.session.execute(stmt)
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def get_identity_verifications(self, agent_id: str, chain_id: int | None = None) -> list[IdentityVerification]:
|
||||
"""Get verification records for an agent"""
|
||||
@@ -309,7 +318,8 @@ class CrossChainRegistry:
|
||||
if chain_id:
|
||||
stmt = stmt.where(IdentityVerification.chain_id == chain_id)
|
||||
|
||||
return self.session.exec(stmt).all()
|
||||
result = self.session.execute(stmt)
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def migrate_agent_identity(
|
||||
self, agent_id: str, from_chain: int, to_chain: int, new_address: str, verifier_address: str | None = None
|
||||
@@ -409,22 +419,17 @@ class CrossChainRegistry:
|
||||
"""Get comprehensive registry statistics"""
|
||||
|
||||
# Total identities
|
||||
identity_count = self.session.exec(select(AgentIdentity)).count()
|
||||
|
||||
# Total mappings
|
||||
mapping_count = self.session.exec(select(CrossChainMapping)).count()
|
||||
|
||||
# Verified mappings
|
||||
verified_mapping_count = self.session.exec(
|
||||
identity_count = self.session.execute(select(AgentIdentity)).scalar()
|
||||
mapping_count = self.session.execute(select(CrossChainMapping)).scalar()
|
||||
verified_mapping_count = self.session.execute(
|
||||
select(CrossChainMapping).where(CrossChainMapping.is_verified)
|
||||
).count()
|
||||
|
||||
# Total verifications
|
||||
verification_count = self.session.exec(select(IdentityVerification)).count()
|
||||
).scalar()
|
||||
verification_count = self.session.execute(select(IdentityVerification)).scalar()
|
||||
|
||||
# Chain breakdown
|
||||
chain_breakdown = {}
|
||||
mappings = self.session.exec(select(CrossChainMapping)).all()
|
||||
result = self.session.execute(select(CrossChainMapping))
|
||||
mappings = list(result.scalars().all())
|
||||
|
||||
for mapping in mappings:
|
||||
chain_name = self._get_chain_name(mapping.chain_id)
|
||||
@@ -457,7 +462,8 @@ class CrossChainRegistry:
|
||||
|
||||
# Find expired verifications
|
||||
stmt = select(IdentityVerification).where(IdentityVerification.expires_at < current_time)
|
||||
expired_verifications = self.session.exec(stmt).all()
|
||||
result = self.session.execute(stmt)
|
||||
expired_verifications = list(result.scalars().all())
|
||||
|
||||
cleaned_count = 0
|
||||
|
||||
@@ -555,7 +561,8 @@ class CrossChainRegistry:
|
||||
"""Get identity ID by agent ID"""
|
||||
|
||||
stmt = select(AgentIdentity).where(AgentIdentity.agent_id == agent_id)
|
||||
identity = self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
identity = result.scalars().first()
|
||||
|
||||
if not identity:
|
||||
raise ValueError(f"Identity not found for agent: {agent_id}")
|
||||
|
||||
@@ -311,7 +311,8 @@ class MultiChainWalletAdapter:
|
||||
stmt = select(AgentWallet).where(
|
||||
AgentWallet.agent_id == agent_id, AgentWallet.chain_id == chain_id, AgentWallet.is_active
|
||||
)
|
||||
wallet = self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
wallet = result.scalars().first()
|
||||
|
||||
if not wallet:
|
||||
raise ValueError(f"Active wallet not found for agent {agent_id} on chain {chain_id}")
|
||||
@@ -335,7 +336,8 @@ class MultiChainWalletAdapter:
|
||||
stmt = select(AgentWallet).where(
|
||||
AgentWallet.agent_id == agent_id, AgentWallet.chain_id == chain_id, AgentWallet.is_active
|
||||
)
|
||||
wallet = self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
wallet = result.scalars().first()
|
||||
|
||||
if not wallet:
|
||||
raise ValueError(f"Active wallet not found for agent {agent_id} on chain {chain_id}")
|
||||
@@ -366,7 +368,8 @@ class MultiChainWalletAdapter:
|
||||
stmt = select(AgentWallet).where(
|
||||
AgentWallet.agent_id == agent_id, AgentWallet.chain_id == chain_id, AgentWallet.is_active
|
||||
)
|
||||
wallet = self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
wallet = result.scalars().first()
|
||||
|
||||
if not wallet:
|
||||
raise ValueError(f"Active wallet not found for agent {agent_id} on chain {chain_id}")
|
||||
@@ -382,7 +385,8 @@ class MultiChainWalletAdapter:
|
||||
|
||||
# Get wallet from database
|
||||
stmt = select(AgentWallet).where(AgentWallet.agent_id == agent_id, AgentWallet.chain_id == chain_id)
|
||||
wallet = self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
wallet = result.scalars().first()
|
||||
|
||||
if not wallet:
|
||||
raise ValueError(f"Wallet not found for agent {agent_id} on chain {chain_id}")
|
||||
@@ -405,14 +409,16 @@ class MultiChainWalletAdapter:
|
||||
"""Get all wallets for an agent across all chains"""
|
||||
|
||||
stmt = select(AgentWallet).where(AgentWallet.agent_id == agent_id)
|
||||
return self.session.exec(stmt).all()
|
||||
result = self.session.execute(stmt)
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def deactivate_wallet(self, agent_id: str, chain_id: int) -> bool:
|
||||
"""Deactivate an agent wallet"""
|
||||
|
||||
# Get wallet from database
|
||||
stmt = select(AgentWallet).where(AgentWallet.agent_id == agent_id, AgentWallet.chain_id == chain_id)
|
||||
wallet = self.session.exec(stmt).first()
|
||||
result = self.session.execute(stmt)
|
||||
wallet = result.scalars().first()
|
||||
|
||||
if not wallet:
|
||||
raise ValueError(f"Wallet not found for agent {agent_id} on chain {chain_id}")
|
||||
|
||||
@@ -84,14 +84,6 @@ class AgentIdentity(SQLModel, table=True):
|
||||
created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
||||
updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
|
||||
|
||||
# Indexes for performance
|
||||
__table_args__ = {
|
||||
# # Index( Index("idx_agent_identity_owner", "owner_address"),)
|
||||
# # Index( Index("idx_agent_identity_status", "status"),)
|
||||
# # Index( Index("idx_agent_identity_verified", "is_verified"),)
|
||||
# # Index( Index("idx_agent_identity_reputation", "reputation_score"),)
|
||||
}
|
||||
|
||||
|
||||
class CrossChainMapping(SQLModel, table=True):
|
||||
"""Mapping of agent identity across different blockchains"""
|
||||
|
||||
@@ -44,7 +44,9 @@ async def create_agent_identity(request: dict[str, Any], manager: AgentIdentityM
|
||||
)
|
||||
return JSONResponse(content=result, status_code=201)
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=400, detail="Failed to create agent identity")
|
||||
import traceback
|
||||
error_detail = f"Failed to create agent identity: {str(e)}\n{traceback.format_exc()}"
|
||||
raise HTTPException(status_code=400, detail=error_detail)
|
||||
|
||||
|
||||
@router.get("/identities/{agent_id}", response_model=dict[str, Any])
|
||||
|
||||
@@ -57,9 +57,9 @@ async def verify_ml_training(request: Request, verification_request: dict) -> di
|
||||
)
|
||||
|
||||
return {
|
||||
"verified": verification_result["verified"],
|
||||
"training_correct": verification_result["training_correct"],
|
||||
"gradient_descent_valid": verification_result["gradient_descent_valid"],
|
||||
"verified": verification_result.get("verified", False),
|
||||
"computation_correct": verification_result.get("computation_correct", False),
|
||||
"privacy_preserved": verification_result.get("privacy_preserved", False),
|
||||
}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@@ -164,7 +164,7 @@ main();
|
||||
|
||||
if result.returncode != 0:
|
||||
logger.error(f"Proof verification failed: {result.stderr}")
|
||||
return {"verified": False, "error": result.stderr}
|
||||
return {"verified": False, "computation_correct": False, "privacy_preserved": False, "error": result.stderr}
|
||||
|
||||
is_verified = result.stdout.strip() == "true"
|
||||
return {
|
||||
|
||||
@@ -139,15 +139,22 @@ async def scan_edge_gpus(
|
||||
return await svc.discover_and_register_edge_gpus(miner_id)
|
||||
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class OptimizeInferenceRequest(BaseModel):
|
||||
model_name: str
|
||||
request_data: dict
|
||||
|
||||
|
||||
@app.post("/v1/marketplace/edge-gpu/optimize/inference/{gpu_id}")
|
||||
async def optimize_inference(
|
||||
gpu_id: str,
|
||||
model_name: str,
|
||||
request_data: dict,
|
||||
request: OptimizeInferenceRequest,
|
||||
svc: EdgeGPUService = Depends(get_edge_service),
|
||||
):
|
||||
"""Optimize ML inference request for edge GPU"""
|
||||
return await svc.optimize_inference_for_edge(gpu_id, model_name, request_data)
|
||||
return await svc.optimize_inference_for_edge(gpu_id, request.model_name, request.request_data)
|
||||
|
||||
|
||||
@app.post("/v1/transactions")
|
||||
|
||||
@@ -161,6 +161,75 @@ async def list_chain_wallets(chain_id: str):
|
||||
"total": len(wallet_list)
|
||||
})
|
||||
|
||||
@app.post("/v1/chains/{chain_id}/wallets")
|
||||
async def create_chain_wallet(chain_id: str, request: dict[str, Any] = None):
|
||||
"""Create a wallet in a specific chain"""
|
||||
if request is None:
|
||||
request = {}
|
||||
|
||||
wallet_name = request.get("wallet_name", f"{chain_id}-wallet-{datetime.now().timestamp()}")
|
||||
password = request.get("password", "")
|
||||
|
||||
# Import wallet creation from CLI
|
||||
try:
|
||||
from aitbc_cli.commands.wallet import create_wallet as cli_create_wallet
|
||||
import io
|
||||
import sys
|
||||
|
||||
# Capture stdout to avoid printing to console
|
||||
old_stdout = sys.stdout
|
||||
sys.stdout = io.StringIO()
|
||||
|
||||
# Create wallet using CLI function
|
||||
result = cli_create_wallet(wallet_name, password)
|
||||
|
||||
# Restore stdout
|
||||
sys.stdout = old_stdout
|
||||
|
||||
return JSONResponse({
|
||||
"wallet_name": wallet_name,
|
||||
"chain_id": chain_id,
|
||||
"address": result.get("address", ""),
|
||||
"public_key": result.get("public_key", ""),
|
||||
"encrypted": result.get("encrypted", False),
|
||||
"created_at": datetime.now().isoformat(),
|
||||
"mode": "daemon"
|
||||
})
|
||||
except ImportError:
|
||||
# Fallback: create a simple wallet if CLI not available
|
||||
from aitbc import derive_ethereum_address
|
||||
import secrets
|
||||
|
||||
private_key = secrets.token_hex(32)
|
||||
public_key = derive_ethereum_address(private_key)
|
||||
address = f"ait1{public_key[2:]}"
|
||||
|
||||
# Save to keystore
|
||||
wallet_data = {
|
||||
"address": address,
|
||||
"public_key": public_key,
|
||||
"private_key": private_key,
|
||||
"encrypted": False,
|
||||
"chain_id": chain_id
|
||||
}
|
||||
|
||||
KEYSTORE_PATH.mkdir(parents=True, exist_ok=True)
|
||||
wallet_file = KEYSTORE_PATH / f"{wallet_name}.json"
|
||||
with open(wallet_file, 'w') as f:
|
||||
json.dump(wallet_data, f)
|
||||
|
||||
return JSONResponse({
|
||||
"wallet_name": wallet_name,
|
||||
"chain_id": chain_id,
|
||||
"address": address,
|
||||
"public_key": public_key,
|
||||
"encrypted": False,
|
||||
"created_at": datetime.now().isoformat(),
|
||||
"mode": "daemon"
|
||||
})
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Failed to create wallet: {str(e)}")
|
||||
|
||||
@app.get("/v1/chains/{chain_id}/wallets/{wallet_id}")
|
||||
async def get_chain_wallet_info(chain_id: str, wallet_id: str):
|
||||
"""Get wallet information from a specific chain"""
|
||||
@@ -249,9 +318,70 @@ async def list_wallets():
|
||||
return JSONResponse({"items": wallets, "total": len(wallets)})
|
||||
|
||||
@app.post("/v1/wallets")
|
||||
async def create_wallet():
|
||||
async def create_wallet(request: dict[str, Any] = None):
|
||||
"""Create a wallet"""
|
||||
raise HTTPException(status_code=501, detail="Wallet creation not implemented - use CLI instead")
|
||||
if request is None:
|
||||
request = {}
|
||||
|
||||
wallet_name = request.get("wallet_name", f"wallet-{datetime.now().timestamp()}")
|
||||
password = request.get("password", "")
|
||||
|
||||
# Import wallet creation from CLI
|
||||
try:
|
||||
from aitbc_cli.commands.wallet import create_wallet as cli_create_wallet
|
||||
import io
|
||||
import sys
|
||||
|
||||
# Capture stdout to avoid printing to console
|
||||
old_stdout = sys.stdout
|
||||
sys.stdout = io.StringIO()
|
||||
|
||||
# Create wallet using CLI function
|
||||
result = cli_create_wallet(wallet_name, password)
|
||||
|
||||
# Restore stdout
|
||||
sys.stdout = old_stdout
|
||||
|
||||
return JSONResponse({
|
||||
"wallet_name": wallet_name,
|
||||
"address": result.get("address", ""),
|
||||
"public_key": result.get("public_key", ""),
|
||||
"encrypted": result.get("encrypted", False),
|
||||
"created_at": datetime.now().isoformat(),
|
||||
"mode": "daemon"
|
||||
})
|
||||
except ImportError:
|
||||
# Fallback: create a simple wallet if CLI not available
|
||||
from aitbc import derive_ethereum_address
|
||||
import secrets
|
||||
|
||||
private_key = secrets.token_hex(32)
|
||||
public_key = derive_ethereum_address(private_key)
|
||||
address = f"ait1{public_key[2:]}"
|
||||
|
||||
# Save to keystore
|
||||
wallet_data = {
|
||||
"address": address,
|
||||
"public_key": public_key,
|
||||
"private_key": private_key,
|
||||
"encrypted": False
|
||||
}
|
||||
|
||||
KEYSTORE_PATH.mkdir(parents=True, exist_ok=True)
|
||||
wallet_file = KEYSTORE_PATH / f"{wallet_name}.json"
|
||||
with open(wallet_file, 'w') as f:
|
||||
json.dump(wallet_data, f)
|
||||
|
||||
return JSONResponse({
|
||||
"wallet_name": wallet_name,
|
||||
"address": address,
|
||||
"public_key": public_key,
|
||||
"encrypted": False,
|
||||
"created_at": datetime.now().isoformat(),
|
||||
"mode": "daemon"
|
||||
})
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=f"Failed to create wallet: {str(e)}")
|
||||
|
||||
@app.post("/v1/wallets/{wallet_id}/unlock")
|
||||
async def unlock_wallet(wallet_id: str):
|
||||
|
||||
Reference in New Issue
Block a user