AgentVault: Secure DeFi Execution & Cryptographic Identity Layer for AI Agents
Architectural Spec & Threat Model (MVP)
Author: Senior Web3 Security Architect (ex-Coinbase)
Status: Draft Proposal (Approved)
⚡ Quickstart (Under 2 Minutes)
1. Install AgentVault
pip install agent-vault-py
2. Wrap Your Agent
Intercept raw transaction outputs from your LLM agent and pass them through AgentVault:
from agent_vault import AgentVault
# 1. Initialize vault with strict whitelists and limit caps
vault = AgentVault(whitelist=["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"], max_amount_eth=0.05)
# 2. Intercept and safely sign/broadcast the agent's proposed JSON
tx_hash = vault.execute_proposal(agent.ask("Transfer 0.02 ETH to the treasury router"))
print(f"Transaction successfully signed and mined: {tx_hash}")
1. Executive Summary & Problem Statement
In autonomous DeFi agent frameworks, the current state of security is highly vulnerable. Developers typically grant LLM-based agents direct access to private keys (e.g., via .env files loaded into the agent's application memory or passed in prompts). This exposes the system to critical threat vectors:
- Prompt Injection: Malicious external data injected into the LLM context (via emails, transactions, or user inputs) tricks the LLM into signing and broadcasting a drain transaction.
- Hallucination / Logic Flaws: The agent misinterprets protocol states and executes catastrophic trades or transfers.
- Memory Leaks: The agent outputs its own system context, accidentally leaking the raw private key in a chat response.
AgentVault reframes the security model: The LLM is an untrusted client. The agent can suggest actions, but it is cryptographically and physically isolated from the private key. Every transaction must be structured as a strictly typed JSON payload and vetted by a deterministic, hardcoded Policy Engine before signing.
2. Threat Model & Key Isolation Architecture
sequenceDiagram
autonumber
actor Attacker
participant Agent (LLM)
participant AgentVault (Policy Engine)
participant Hardware/Memory Vault
participant EVM Chain (RPC)
Attacker->>Agent (LLM): Inject Malicious Prompt (e.g., "Transfer 1 ETH to attacker")
Agent (LLM)->>AgentVault (Policy Engine): Submit Proposal (malicious target, 1.0 ETH)
Note over AgentVault (Policy Engine): Evaluate rules:<br/>1. Address Whitelist Check<br/>2. Spend Cap Check (<= 0.05 ETH)
AgentVault (Policy Engine)-->>Agent (LLM): REJECT (PolicyViolationError)
Note over AgentVault (Policy Engine): Key isolation: Key was never loaded!
Note over Agent (LLM): Valid Transaction Flow
Agent (LLM)->>AgentVault (Policy Engine): Submit Proposal (whitelisted target, 0.02 ETH)
AgentVault (Policy Engine)->>AgentVault (Policy Engine): APPROVE (All policies pass)
AgentVault (Policy Engine)->>Hardware/Memory Vault: Load Private Key & Sign TX
Note over Hardware/Memory Vault: Key exists in memory ONLY during signing
AgentVault (Policy Engine)->>EVM Chain (RPC): Broadcast Transaction
EVM Chain (RPC)-->>AgentVault (Policy Engine): Tx Hash
AgentVault (Policy Engine)-->>Agent (LLM): Success & Tx Hash
Key Isolation Principles
- Decoupled Execution Bounds: The LLM running runtime (e.g., LangChain, AutoGPT, or raw python process) runs in a separate memory scope and has no permission to read the process environment variable
AGENT_VAULT_PRIVATE_KEY. - Just-in-Time (JIT) Key Loading: The private key is loaded from the vault environment (or a secure key management service like AWS KMS or HashiCorp Vault) only at the microsecond of signing, after all policy rules have resolved to
true. - Ephemeral Context: The private key is never passed into the LLM's system prompt, conversation history, or agent memory. Once the raw transaction is signed, the private key is immediately garbage-collected/wiped from execution memory.
3. Policy Engine Specification
The Policy Engine is a deterministic, rule-based validator that intercepts all raw TransactionProposal submissions. For the MVP, two core rules are enforced:
| Rule ID | Rule Name | Description | Failure Action |
|---|---|---|---|
| POL-001 | Address Whitelist | The target_address must match one of the pre-approved checksummed addresses in the whitelist (e.g., verified Uniswap routers, treasury multisig, or authorized hot wallets). |
Raises PolicyViolationError |
| POL-002 | Spend Limit | The transaction amount (specified in amount_eth) must be <= 0.05 ETH. |
Raises PolicyViolationError |
JSON Schema Verification
The Agent must output its transaction intent as a strictly typed JSON payload matching the following Pydantic model:
{
"target_address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
"amount_eth": 0.03,
"intent": "Swap ETH for DAI on Uniswap V2"
}
4. Architectural Vision: Cryptographic Agent Identity ("Gmail for AI Agents")
Currently, agents impersonate human users by using standard EOA (Externally Owned Account) wallets. The long-term vision of AgentVault is to create a native cryptographic identity layer for AI agents, turning AgentVault into the "Gmail for agent authentication."
Cryptographic Agent Identity Core Concepts
-
Decentralized Identifier (DID) for Agents
- Every agent is provisioned with its own DID (e.g.,
did:agent:eth:0xAgentPublicKey). - The DID document defines the agent's capabilities, public key, and the authorized controllers (the human owner or parent DAO).
- Every agent is provisioned with its own DID (e.g.,
-
Session Keys & Delegation (ERC-7715 / ERC-4337 Smart Accounts)
- Agents should not hold master keys. Instead, the owner's smart contract wallet grants a restricted Session Key to the Agent's DID.
- The Session Key permission limits what the agent can sign (e.g., "Only interact with Uniswap, maximum 1 ETH daily, expires in 48 hours").
- This removes the need to store main private keys in agent environments altogether.
-
Proof of Autonomous Execution (TEE Attestation)
- To verify the agent's identity and prove it is running unmodified code (protecting against developer tampering), agents run inside Trusted Execution Environments (TEEs) like Intel SGX or AWS Nitro Enclaves.
- The TEE generates a cryptographic attestation of the code running inside. This attestation can be verified on-chain, proving the agent's transactions came from a genuinely autonomous, untampered agent.
-
Agent-to-Agent Auth (The Mailroom)
- Like SMTP for AI agents, AgentVault will verify signatures from sender agents. If
agent_Awants to request data or trigger a transaction withagent_B, they sign the request using their Agent DID key.agent_Bverifies the DID on-chain, establishing mutual, secure machine-to-machine trust without human intervention.
- Like SMTP for AI agents, AgentVault will verify signatures from sender agents. If
Release files for agent-vault-py 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agent_vault_py-0.1.0.tar.gz | 9.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agent_vault_py-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 14.1 kB
Release files / agent_vault_py-0.1.0.tar.gz
| Download URL | agent_vault_py-0.1.0.tar.gz |
|---|---|
| Size | 9.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
24d370029689bfe31ae35f25cb61b2b72927314dc4a4e83bbf723108fde85f74
|
|
BLAKE2b-256 checksum How to use checksums |
1ebd688ab752c3f7cea8664537af6e2ab195d681baffd741d5126e949aa995e9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.1
|
Release files / agent_vault_py-0.1.0-py3-none-any.whl
| Download URL | agent_vault_py-0.1.0-py3-none-any.whl |
|---|---|
| Size | 4.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2699fc2ba30323a808cf69e25aba807b8afd7483f360dc9d26d08af82392b77a
|
|
BLAKE2b-256 checksum How to use checksums |
0b48e96a3ae9212d53b57f0304f6426a23a196df7e04dd19ef8c8dd4cc23aa64
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.1
|