Agentic Wallet supports managing multiple AI agents simultaneously, each with independent wallets, capabilities, and budget controls. This enables complex multi-agent workflows with treasury management and coordinated actions.
Overview
Multi-agent orchestration provides:
Independent Wallets : Each agent has its own custody boundary
Capability Isolation : Per-agent intent and protocol allowlists
Budget Management : Treasury allocation and rebalancing between agents
Autonomous Coordination : Agents can transfer funds and trigger workflows
Execution Modes : Supervised or fully autonomous operation
The demo script scripts/devnet-multi-agent.ts showcases a complete multi-agent workflow.
Creating Multiple Agents
Each agent requires a wallet, capabilities, and execution mode configuration.
Agent Creation Workflow
Create first agent
curl -X POST http://localhost:3000/api/v1/agents \
-H 'x-api-key: dev-api-key' \
-H 'content-type: application/json' \
-d '{
"name": "agent-alpha",
"allowedIntents": ["transfer_sol", "query_balance"],
"executionMode": "autonomous"
}'
Response includes: {
"data" : {
"id" : "<agent-id>" ,
"walletId" : "<wallet-id>" ,
"name" : "agent-alpha" ,
"status" : "created"
}
}
Create second agent
curl -X POST http://localhost:3000/api/v1/agents \
-H 'x-api-key: dev-api-key' \
-H 'content-type: application/json' \
-d '{
"name": "agent-beta",
"allowedIntents": ["transfer_sol", "query_balance", "swap"],
"allowedProtocols": ["system-program", "jupiter"],
"executionMode": "supervised"
}'
Start both agents
curl -X POST http://localhost:3000/api/v1/agents/ < agent-alpha-i d > /start \
-H 'x-api-key: dev-api-key'
curl -X POST http://localhost:3000/api/v1/agents/ < agent-beta-i d > /start \
-H 'x-api-key: dev-api-key'
Using the SDK
import { AgenticWalletSDK } from '@agentic-wallet/sdk' ;
const client = new AgenticWalletSDK (
'http://localhost:3000' ,
{ 'x-api-key' : 'dev-api-key' }
);
// Create multiple agents in parallel
const [ agentA , agentB ] = await Promise . all ([
client . agents . create ({
name: 'agent-alpha' ,
allowedIntents: [ 'transfer_sol' , 'query_balance' ],
executionMode: 'autonomous' ,
}),
client . agents . create ({
name: 'agent-beta' ,
allowedIntents: [ 'transfer_sol' , 'query_balance' , 'swap' ],
allowedProtocols: [ 'system-program' , 'jupiter' ],
executionMode: 'autonomous' ,
}),
]);
// Start both agents
await Promise . all ([
client . agents . start ( agentA . id ),
client . agents . start ( agentB . id ),
]);
Treasury Allocation
Distribute funds from a treasury source to agent wallets.
Direct Allocation
Allocate SOL to an agent without a source (increases total budget):
curl -X POST http://localhost:3000/api/v1/treasury/allocate \
-H 'x-api-key: dev-api-key' \
-H 'content-type: application/json' \
-d '{
"targetAgentId": "<agent-id>",
"lamports": 1000000,
"reason": "Initial agent budget"
}'
Allocation from Source Agent
curl -X POST http://localhost:3000/api/v1/treasury/allocate \
-H 'x-api-key: dev-api-key' \
-H 'content-type: application/json' \
-d '{
"sourceAgentId": "<treasury-agent-id>",
"targetAgentId": "<recipient-agent-id>",
"lamports": 5000000,
"reason": "Allocated for swap operations"
}'
npm run cli -- treasury allocate \
--target-agent-id < agent-i d > \
--lamports 1000000 \
--reason "Initial budget"
Budget Rebalancing
Transfer budget between agents to optimize capital allocation.
Rebalance Workflow
curl -X POST http://localhost:3000/api/v1/treasury/rebalance \
-H 'x-api-key: dev-api-key' \
-H 'content-type: application/json' \
-d '{
"sourceAgentId": "<agent-a-id>",
"targetAgentId": "<agent-b-id>",
"lamports": 500000
}'
Response:
{
"data" : {
"sourceAgentId" : "<agent-a-id>" ,
"targetAgentId" : "<agent-b-id>" ,
"lamports" : 500000 ,
"sourceBudgetBefore" : 1000000 ,
"sourceBudgetAfter" : 500000 ,
"targetBudgetBefore" : 200000 ,
"targetBudgetAfter" : 700000
}
}
Using the SDK
const result = await client . treasury . rebalance ({
sourceAgentId: agentA . id ,
targetAgentId: agentB . id ,
lamports: 500_000 ,
});
console . log ( `Rebalanced ${ result . lamports } lamports` );
console . log ( `Source budget: ${ result . sourceBudgetAfter } ` );
console . log ( `Target budget: ${ result . targetBudgetAfter } ` );
Rebalancing only adjusts budget tracking. You must separately execute on-chain transfers if physical SOL movement is required.
Coordinating Agent Capabilities
Capability Profiles
Design agents with specialized roles:
Trader Agent
Treasury Agent
Escrow Agent
{
"name" : "trader-agent" ,
"allowedIntents" : [
"swap" ,
"query_balance" ,
"transfer_sol"
],
"allowedProtocols" : [
"jupiter" ,
"orca" ,
"raydium"
],
"executionMode" : "autonomous" ,
"budgetLamports" : 10000000
}
Updating Capabilities
curl -X PUT http://localhost:3000/api/v1/agents/ < agent-i d > /capabilities \
-H 'x-api-key: dev-api-key' \
-H 'content-type: application/json' \
-d '{
"allowedIntents": ["transfer_sol", "query_balance", "stake"],
"allowedProtocols": ["system-program", "marinade"]
}'
Autonomous Coordination Example
The devnet-multi-agent.ts script demonstrates end-to-end orchestration:
// Create two agents
const [ a1 , a2 ] = await Promise . all ([
createAgent ( 'agent-alpha' ),
createAgent ( 'agent-beta' )
]);
// Start both agents
await Promise . all ([
startAgent ( a1 . data . id ),
startAgent ( a2 . data . id ),
]);
// Fund agent-alpha wallet from treasury
const fundTx = new Transaction (). add (
SystemProgram . transfer ({
fromPubkey: treasuryKeypair . publicKey ,
toPubkey: new PublicKey ( a1 . walletPublicKey ),
lamports: 2_000_000 ,
}),
);
await sendAndConfirmTransaction ( connection , fundTx , [ treasuryKeypair ]);
// Agent-alpha autonomously transfers to agent-beta
const executeRes = await fetch (
` ${ apiBase } /api/v1/agents/ ${ a1 . data . id } /execute` ,
{
method: 'POST' ,
headers: { 'content-type' : 'application/json' , 'x-api-key' : apiKey },
body: JSON . stringify ({
type: 'transfer_sol' ,
protocol: 'system-program' ,
intent: {
destination: a2 . walletPublicKey ,
lamports: 1_000_000 ,
},
}),
}
);
// Verify transaction confirmed
const result = await executeRes . json ();
assert ( result . data . status === 'confirmed' );
// Stop both agents
await Promise . all ([
stopAgent ( a1 . data . id ),
stopAgent ( a2 . data . id ),
]);
Running the Demo
# Set PRIVATE_KEY for devnet treasury funding
export PRIVATE_KEY = "<your-base58-private-key>"
npm run devnet:multi-agent
Expected output:
Created agent-alpha: <agent-id-1>
Created agent-beta: <agent-id-2>
Funded agent-alpha with 2 SOL
Agent-alpha transferred 1 SOL to agent-beta
Transaction confirmed: <signature>
Budget Management
Query Agent Budget
curl -H 'x-api-key: dev-api-key' \
http://localhost:3000/api/v1/agents/ < agent-i d > /budget
Response:
{
"data" : {
"agentId" : "<agent-id>" ,
"walletId" : "<wallet-id>" ,
"budgetLamports" : 1000000 ,
"spentLamports" : 250000 ,
"remainingLamports" : 750000 ,
"lastUpdated" : "2026-03-08T12:00:00.000Z"
}
}
Budget Enforcement
Agents automatically reject intents that exceed remaining budget:
{
"status" : "failure" ,
"errorCode" : "POLICY_VIOLATION" ,
"failedAt" : "policy" ,
"message" : "Agent budget exceeded (remaining: 50000, required: 100000)"
}
Advanced Patterns
Leader-Follower Architecture
// Leader agent coordinates strategy
const leader = await client . agents . create ({
name: 'leader-agent' ,
allowedIntents: [ 'transfer_sol' , 'query_balance' ],
executionMode: 'autonomous' ,
autonomy: {
enabled: true ,
mode: 'execute' ,
cadenceSeconds: 60 ,
rules: [
{
id: 'distribute-to-followers' ,
when: [{ metric: 'balance_lamports' , op: 'gt' , value: 10_000_000 }],
then: {
type: 'transfer_sol' ,
protocol: 'system-program' ,
intent: {
destination: '{{knownWallet0}}' ,
lamports: 1_000_000 ,
},
},
maxRuns: 5 ,
cooldownSeconds: 300 ,
},
],
},
});
// Follower agents execute specialized tasks
const followers = await Promise . all ([
client . agents . create ({
name: 'follower-swap' ,
allowedIntents: [ 'swap' ],
allowedProtocols: [ 'jupiter' ],
executionMode: 'autonomous' ,
}),
client . agents . create ({
name: 'follower-stake' ,
allowedIntents: [ 'stake' ],
allowedProtocols: [ 'marinade' ],
executionMode: 'autonomous' ,
}),
]);
Round-Robin Load Distribution
const agents = await Promise . all (
Array . from ({ length: 5 }, ( _ , i ) =>
client . agents . create ({
name: `worker- ${ i } ` ,
allowedIntents: [ 'transfer_sol' ],
executionMode: 'autonomous' ,
})
)
);
let currentIndex = 0 ;
function getNextAgent () {
const agent = agents [ currentIndex ];
currentIndex = ( currentIndex + 1 ) % agents . length ;
return agent ;
}
for ( const task of tasks ) {
const agent = getNextAgent ();
await client . agents . execute ( agent . id , {
type: 'transfer_sol' ,
protocol: 'system-program' ,
intent: task ,
});
}
Observability
Agent Audit Trail
curl -H 'x-api-key: dev-api-key' \
'http://localhost:3000/api/v1/audit/events?agentId=<agent-id>&limit=50'
Transaction History per Agent
curl -H 'x-api-key: dev-api-key' \
http://localhost:3000/api/v1/wallets/ < wallet-i d > /transactions
Multi-Agent Metrics
curl -H 'x-api-key: dev-api-key' \
http://localhost:3000/api/v1/metrics
Filters available:
agentId
protocol
status (confirmed/failed)
startDate/endDate
Security Considerations
Multi-Agent Security Best Practices:
Use separate API keys per agent for revocability
Set conservative budget caps on autonomous agents
Require approval gates for high-value operations
Monitor cross-agent transfer patterns for anomalies
Implement rate limits per agent
Capability Manifests
For production deployments, issue signed manifests:
curl -X POST http://localhost:3000/api/v1/agents/ < agent-i d > /manifest/issue \
-H 'x-api-key: dev-api-key' \
-H 'content-type: application/json' \
-d '{
"intents": ["transfer_sol", "swap"],
"protocols": ["system-program", "jupiter"],
"ttl": 3600
}'
Enable enforcement:
AGENT_REQUIRE_MANIFEST = true
Next Steps
Strategy Backtesting Test multi-agent strategies before live deployment
Gasless Transactions Enable gasless execution for agent operations