Skip to content

Latest commit

Β 

History

25 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Sui Β Β Β  ENS

AgentVault

Constrained Autonomous Agent Spending on Sui + ENS Integration

Sui Prize Β  ENS Prize

Give your AI a wallet. With limits.


Overview

AgentVault enables autonomous AI agents to execute transactions and trades within hard, on-chain spending constraints. Built on Sui blockchain with DeepBook v3 integration, and featuring a novel ENS-powered constraint profile system.

overview

Hackathon Prizes

πŸ”΅ Sui Prize

DeepBook v3 Integration

  • Native CLOB trading
  • On-chain constraint enforcement
  • Shared object vault architecture
  • Real autonomous agent spending

πŸ”· ENS Prize

Most Creative Use of ENS for DeFi

  • Constraint profiles stored in ENS text records
  • Pay to ENS names (alice.eth β†’ 0x...)
  • Agent identity via ENS resolution
  • Decentralized DeFi configuration

Key Features

πŸ›‘οΈ On-Chain Constraints

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    VAULT CONSTRAINTS                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                  β”‚
β”‚   Daily Limit        β”‚β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β”‚  $100/day           β”‚
β”‚   Per-TX Limit       β”‚β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β”‚  $25/transaction    β”‚
β”‚   Alert Threshold    β”‚β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‘β–‘β–‘β–‘β”‚  $80 (triggers event)β”‚
β”‚   Min Balance        β”‚β–ˆβ–ˆβ–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β–‘β”‚  $10 (floor)        β”‚
β”‚   Emergency Pause    β”‚ β—‹ OFF               β”‚  Owner can halt     β”‚
β”‚                                                                  β”‚
β”‚   βœ“ Enforced by Move VM - Cannot be bypassed                    β”‚
β”‚   βœ“ No backend, no multisig, pure smart contract               β”‚
β”‚                                                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”· ENS Constraint Profiles (Novel Feature!)

Instead of manually entering constraints, load pre-configured profiles from ENS names:

ens profile

Why this is creative:

  • Goes beyond nameβ†’address mapping
  • Uses ENS as a decentralized DeFi configuration store
  • Profiles are shareable and composable
  • Your risk tolerance, stored on-chain!

πŸ”„ ENS Name Resolution

ens resolution flow

Architecture

agent architecture

Tech Stack

Layer Technology Purpose
Smart Contracts Move (Sui) Vault logic, constraint enforcement
DEX DeepBook v3 On-chain CLOB trading
Name Resolution ENS (Ethereum) Human-readable names, constraint profiles
Backend Express.js + TypeScript Transaction building, intent parsing
Frontend React 18 + Vite User interface
Wallet Sui dapp-kit Wallet connection
ENS Library viem ENS resolution

Project Structure

agentvault2/
β”œβ”€β”€ contracts/                    # Move smart contracts
β”‚   β”œβ”€β”€ sources/
β”‚   β”‚   β”œβ”€β”€ vault.move           # Core vault + constraint logic
β”‚   β”‚   └── events.move          # Event definitions
β”‚   └── Move.toml
β”‚
β”œβ”€β”€ backend/                      # Express API server
β”‚   └── src/
β”‚       β”œβ”€β”€ routes/              # API endpoints
β”‚       β”‚   β”œβ”€β”€ vault.ts         # Vault operations
β”‚       β”‚   └── swap.ts          # DeepBook swaps
β”‚       β”œβ”€β”€ services/
β”‚       β”‚   β”œβ”€β”€ suiClient.ts     # Sui SDK wrapper
β”‚       β”‚   β”œβ”€β”€ intentParser.ts  # NLP to constraints
β”‚       β”‚   └── swapService.ts   # DeepBook integration
β”‚       └── config/
β”‚
β”œβ”€β”€ frontend/                     # React web app
β”‚   └── src/
β”‚       β”œβ”€β”€ App.tsx              # Main application
β”‚       β”œβ”€β”€ styles.css           # Brutalist styling
β”‚       β”œβ”€β”€ services/
β”‚       β”‚   └── ensService.ts    # πŸ”· ENS resolution
β”‚       └── hooks/
β”‚           └── useENS.ts        # πŸ”· ENS React hooks
β”‚
└── scripts/
    └── demo-agent.ts            # Autonomous agent demo

Quick Start

Prerequisites

  • Node.js 18+
  • Sui wallet with testnet SUI
  • (Optional) DEEP tokens for trading fees

Installation

# Clone repository
git clone https://github.com/your-repo/agentvault2.git
cd agentvault2

# Install backend
cd backend && npm install

# Install frontend
cd ../frontend && npm install

Configuration

# Backend (.env)
PACKAGE_ID=0x9eb66e8ef73279472ec71d9ff8e07e97e4cb3bca5b526091019c133e24a3b434
SUI_NETWORK=testnet

# Frontend (.env)
VITE_API_BASE=http://localhost:3001
VITE_PACKAGE_ID=0x9eb66e8ef73279472ec71d9ff8e07e97e4cb3bca5b526091019c133e24a3b434

Run

# Terminal 1: Backend
cd backend && npm run dev

# Terminal 2: Frontend
cd frontend && npm run dev

Open http://localhost:5173


Usage Guide

1️⃣ Create a Vault with ENS Profile

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  CREATE TAB                                                β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                            β”‚
β”‚  πŸ”· Load ENS Profile                                       β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”‚ β”‚
β”‚  β”‚ β”‚Conservativeβ”‚ β”‚ Moderate   β”‚ β”‚ Aggressive β”‚ ← Click β”‚ β”‚
β”‚  β”‚ β”‚   $50/day  β”‚ β”‚  $200/day  β”‚ β”‚ $1000/day  β”‚        β”‚ β”‚
β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚                                                            β”‚
β”‚  Or enter custom ENS: [myprofile.eth        ] [Load]      β”‚
β”‚                                                            β”‚
β”‚  ─────────────── OR ───────────────                       β”‚
β”‚                                                            β”‚
β”‚  πŸ“ Manual: "Spend $100/day, max $25 per trade"           β”‚
β”‚                                                            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2️⃣ Set Agent via ENS Name

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  AGENT ADDRESS                                  ENS βœ“      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                            β”‚
β”‚  [trading-bot.eth                              ]           β”‚
β”‚                                                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ πŸ–ΌοΈ  trading-bot.eth                                β”‚   β”‚
β”‚  β”‚     0x742d35Cc6634C0532925a3b...                   β”‚   β”‚
β”‚  β”‚                                         βœ… Verified β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

3️⃣ Pay to ENS Names

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  πŸ’Έ EXECUTE PAYMENT                                        β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                            β”‚
β”‚  Recipient: [vitalik.eth                       ]           β”‚
β”‚                                                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ πŸ–ΌοΈ  vitalik.eth                                    β”‚   β”‚
β”‚  β”‚     0xd8dA6BF26964aF9D7eEd9e03...                  β”‚   β”‚
β”‚  β”‚                                         βœ… Verified β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                            β”‚
β”‚  Amount: [10.00                ] SUI                       β”‚
β”‚                                                            β”‚
β”‚  [        Send Payment        ]                            β”‚
β”‚                                                            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Smart Contract API

Vault Operations

// Create vault with constraints
public entry fun create_vault<T>(
    initial_deposit: Coin<T>,
    agent: address,
    daily_limit: u64,
    per_tx_limit: u64,
    alert_threshold: u64,
    yield_enabled: bool,
    min_balance: u64,
    clock: &Clock,
    ctx: &mut TxContext
)

// Agent executes payment (checked against constraints)
public entry fun execute_payment<T>(
    vault: &mut Vault<T>,
    recipient: address,
    amount: u64,
    clock: &Clock,
    ctx: &mut TxContext
)

// Agent executes swap on DeepBook v3
public entry fun execute_swap<BaseAsset, QuoteAsset>(
    vault: &mut Vault<QuoteAsset>,
    pool: &mut Pool<BaseAsset, QuoteAsset>,
    quantity: u64,
    min_base_out: u64,
    deep_in: Coin<DEEP>,
    is_bid: bool,
    clock: &Clock,
    ctx: &mut TxContext
)

Owner Management

public entry fun update_constraints<T>(vault, daily_limit, per_tx_limit, ...)
public entry fun set_paused<T>(vault, paused: bool, ...)
public entry fun set_agent<T>(vault, new_agent: address, ...)
public entry fun deposit<T>(vault, coin, ...)
public entry fun withdraw<T>(vault, amount, ...)

ENS Integration Details

Text Record Schema

Store constraint profiles in ENS text records:

Key Value Description
agentvault.dailyLimit "100" Max daily spending
agentvault.perTxLimit "25" Max per transaction
agentvault.alertThreshold "80" Alert trigger point
agentvault.minBalance "10" Minimum vault balance
agentvault.yieldEnabled "true" Enable yield routing
description "..." Human-readable description

ENS Service Functions

// Resolve ENS name to address
await resolveENSName("vitalik.eth") // β†’ "0xd8dA6BF26964aF..."

// Load constraint profile from ENS
await loadENSConstraintProfile("conservative.agentvault.eth")
// β†’ { dailyLimit: 50, perTxLimit: 10, ... }

// Full resolution with avatar
await resolveENSOrAddress("alice.eth")
// β†’ { address: "0x...", ensName: "alice.eth", avatar: "https://..." }

Constraint Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         CONSTRAINT VALIDATION FLOW                              β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                                 β”‚
β”‚  Agent calls execute_swap(vault, pool, quantity=30, ...)                       β”‚
β”‚                           β”‚                                                     β”‚
β”‚                           β–Ό                                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  1. CHECK: sender == vault.agent?                                        β”‚   β”‚
β”‚  β”‚     └── ❌ Abort: ENotAgent                                              β”‚   β”‚
β”‚  β”‚     └── βœ… Continue                                                       β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                           β”‚                                                     β”‚
β”‚                           β–Ό                                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  2. CHECK: vault.paused == false?                                        β”‚   β”‚
β”‚  β”‚     └── ❌ Abort: EVaultPaused                                           β”‚   β”‚
β”‚  β”‚     └── βœ… Continue                                                       β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                           β”‚                                                     β”‚
β”‚                           β–Ό                                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  3. CHECK: quantity <= per_tx_limit (25)?                                β”‚   β”‚
β”‚  β”‚     └── 30 > 25 ❌ Abort: EExceedsPerTxLimit                             β”‚   β”‚
β”‚  β”‚     └── βœ… Continue                                                       β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                           β”‚                                                     β”‚
β”‚                           β–Ό                                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  4. CHECK: spent_today + quantity <= daily_limit (100)?                  β”‚   β”‚
β”‚  β”‚     └── 45 + 30 = 75 ≀ 100 βœ… Continue                                   β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                           β”‚                                                     β”‚
β”‚                           β–Ό                                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  5. CHECK: balance - quantity >= min_balance (10)?                       β”‚   β”‚
β”‚  β”‚     └── 500 - 30 = 470 β‰₯ 10 βœ… Continue                                  β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                           β”‚                                                     β”‚
β”‚                           β–Ό                                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  6. CHECK: spent_today + quantity >= alert_threshold (80)?               β”‚   β”‚
β”‚  β”‚     └── 75 < 80 β†’ No alert                                               β”‚   β”‚
β”‚  β”‚     └── If β‰₯ 80 β†’ Emit AlertTriggered event                              β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                           β”‚                                                     β”‚
β”‚                           β–Ό                                                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚  7. EXECUTE: DeepBook swap                                               β”‚   β”‚
β”‚  β”‚     └── Update spent_today = 75                                          β”‚   β”‚
β”‚  β”‚     └── Emit SwapExecuted event                                          β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                                                                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Events

Event Description
VaultCreated New vault deployed
PaymentExecuted Agent made a payment
SwapExecuted Agent executed a swap
AlertTriggered Spending exceeded alert threshold
ConstraintsUpdated Owner changed limits
VaultPaused Owner paused/unpaused vault
FundsDeposited Owner added funds
FundsWithdrawn Owner removed funds

Deployed Contracts

Network Package ID
Sui Testnet 0x9eb66e8ef73279472ec71d9ff8e07e97e4cb3bca5b526091019c133e24a3b434

DeepBook v3 Testnet Pools

Pair Pool ID
DEEP/SUI 0x0064034cf7f797e298bd9cd506f0e127ce511a798b3d9113e2f0cdb7e2c049f6
SUI/DBUSDC 0xe05dafb5133bcffb8d59f4e12465dc0e9faeaa05e3e342a08fe135800e3e4407
DEEP/DBUSDC 0xf948981b806057580f91622417534f491da5f61aeaf33d0ed8e69fd5691c95ce

Security Model

Feature Implementation
On-chain enforcement Constraints checked by Move VM, not backend
Shared objects Agents can transact without owner signature
Daily reset Spending limits reset every 24 hours automatically
Emergency pause Owner can halt all activity instantly
No key sharing Agent uses its own keypair
ENS verification Resolved addresses shown with verification badge

Future Roadmap

  • Real ENS subdomain deployment for profiles
  • Yield routing integration (Scallop, Navi)
  • Multi-agent vaults
  • Time-based constraints
  • Whitelist/blacklist for recipients
  • Mainnet deployment

Demo

# Run the demo agent
cd scripts
npm install
npm run agent-demo

Built For

ETHGlobal HackMoney 2026


License

MIT


Built with ❀️ on Move and Sui

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages