Skip to content

Latest commit

ย 

History

205 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Edge

The Trust Primitive for Autonomous Agents EdgePass gives agents your rules, not your keys.

Built on Sui Walrus Storage npm version npm downloads Tests License Sui Overflow

Live Demo โ†’ ยท npm โ†’ ยท Contract โ†’ ยท Docs โ†’

The best infrastructure is invisible.


โš ๏ธ Network status โ€” read this before you mint anything

edge_pass_v2 is deployed to Sui testnet only. Mainnet cannot mint v2 passes yet โ€” sdk.create() on mainnet throws rather than silently targeting a package that doesn't have the module. Use network: 'testnet' until v2 ships to mainnet.

New passes are always v2. There is no v1 creation path in the 2.x SDK โ€” sdk.create() only ever mints v2.

v1 passes are read-only in the 2.x SDK. If you already hold a v1 pass (minted on mainnet before this release), you can still fetch(), inspect, and revoke() it โ€” you cannot create a new one or spend against one.

edge_pass.move (v1) stays in this repo permanently. It's not dead code left over from before v2 โ€” real v1 passes exist on Sui mainnet today, and the SDK's fetch()/revoke() need that module's functions to keep working for them, indefinitely.


The Problem

Every developer building an autonomous agent hits the same wall:

Option Approach Problem
A Give the agent full wallet access Catastrophic risk โ€” unlimited exposure
B Human approves every transaction Defeats the purpose of automation
C Build custom policy logic per app 6โ€“8 weeks of infrastructure before any business logic

There is no Option D. No standard primitive for saying:

"This agent can spend up to $300, at these merchants, auto-approve under $50, ask me before anything over $100, and shut down in 48 hours โ€” without ever touching my keys."

Edge is Option D.


What Edge Does

Edge is programmable trust infrastructure. Users define boundaries once. Agents execute freely within them. Unsafe actions escalate automatically.

The atomic unit is the EdgePass โ€” a Sui Move object encoding a complete trust policy:

budget: $300  ยท  auto-approve: < $50  ยท  escalate: > $100  ยท  merchants: [...]  ยท  expiry: 48h

Without Edge, every developer builds the same infrastructure from scratch:

โŒ Policy engine        who can the agent pay? how much?
โŒ Escalation system    when does the human get notified?
โŒ Audit trail          what did the agent do? prove it.
โŒ Budget tracker       how much is left?
โŒ Expiry system        when does authority end?
โŒ Revocation           how do I stop it immediately?
โŒ On-chain state       where does the policy live?

With Edge:

pnpm add @edge-protocol/sdk
const pass = await sdk.create(EdgePass.fromTemplate('festival', { agent }), signer);
const outcome = await sdk.execute(pass, { merchant, amount }, signer);
// โœ… policy enforced  ยท  ๐Ÿ—‚ audit logged  ยท  โœ“ done

10 lines of code. 8 weeks of infrastructure. Gone.


๐Ÿค– Live AI Agent Demo

The real proof: an AI agent autonomously manages festival purchases within an EdgePass. Claude and Gemini both supported โ€” model agnostic by design.

๐Ÿง  Agent:         "Shuttle from parking โ€” $18.50 at Shuttle Express"
โš™๏ธ  PolicyEngine:  โœ… auto-approved ยท under $75 threshold ยท trusted merchant
โ›“  Sui:           execute_transaction ยท Success ยท digest verifiable on Suiscan

๐Ÿง  Agent:         "Drinks for the group โ€” $45 at Hydra Bar"
โš™๏ธ  PolicyEngine:  โœ… auto-approved ยท within policy limits
โ›“  Sui:           execute_transaction ยท Success

๐Ÿง  Agent:         "VIP stage access โ€” $220"
โš™๏ธ  PolicyEngine:  โš ๏ธ  escalated ยท exceeds $150 threshold ยท agent paused
๐Ÿ‘ค User:          reviews and approves via modal
โ›“  Sui:           execute_transaction ยท Success

๐Ÿง  Agent:         "ShadyTokens.xyz โ€” quick flip"
โš™๏ธ  PolicyEngine:  ๐Ÿšซ blocked ยท merchant not in approved list ยท <1ms ยท never submitted

โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”
4 transactions executed autonomously
$188.50 spent ยท $311.50 remaining
0 wallet interruptions ยท every action verified on Suiscan
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

๐Ÿ“ฆ SDK Quickstart

npm install @edge-protocol/sdk
pnpm add @edge-protocol/sdk
yarn add @edge-protocol/sdk

Note: BigInt literal syntax (32n) requires TypeScript targeting ES2020+. For ES2019 apps use BigInt(32) * MIST_PER_SUI.

Create a trust boundary

import { EdgePass, MIST_PER_SUI } from '@edge-protocol/sdk';

const sdk = new EdgePass({ network: 'mainnet', enokiApiKey: 'YOUR_KEY' });

const pass = await sdk.create(
  EdgePass.fromTemplate('festival', {
    approvedMerchants: ['0xshuttle...', '0xhydrabar...', '0xstageaccess...'],
    agent: agentAddress,   // spends against the pass โ€” this key signs execute()
    issuer: userAddress,   // grants/revokes โ€” bookkeeping only, never sent on-chain
  }),
  signer
);

Execute autonomously

const outcome = await sdk.execute(pass, {
  merchant:      '0xshuttle...',        // address โ€” must be in approvedMerchants
  merchantLabel: 'Shuttle Express',     // display only, not enforced
  amount:        BigInt(18_500_000_000), // 18.5 SUI in MIST
}, signer);

switch (outcome.status) {
  case 'approved':   console.log('executed:', outcome.digest); break;
  case 'escalated':  await notifyUser(outcome.reason); break;
  case 'blocked':    console.log('policy rejected:', outcome.reason); break;
}

Simulate before executing

// Zero network calls โ€” predict the full session instantly
const plan = sdk.simulate(pass, decisions);
console.log(plan.summary);
// { approvedCount: 4, blockedCount: 1, escalatedCount: 1 }

// Show plan, then execute approved decisions
for (const decision of plan.approved) {
  await sdk.execute(pass, decision.request, signer);
}

Budget intelligence

const status = sdk.budgetStatus(pass);
// { spent, remaining, utilizationPct, isNearLimit, isExhausted }

sdk.isNearLimit(pass)      // true if > 80% spent
sdk.timeRemaining(pass)    // ms until expiry
sdk.isExpiringSoon(pass)   // true if < 1 hour remaining

Wrap any AI tool with policy enforcement

const safePurchase = EdgePass.withPolicy(pass, signer, sdk, async (request) => {
  return await processPayment(request);
});
// blocked/escalated never reach your tool logic
const { outcome, result } = await safePurchase({ merchant, amount });

React hook

import { useEdgePass } from '@edge-protocol/sdk/react';

const { pass, execute, simulate, budgetStatus, loading } = useEdgePass({
  passId, network: 'mainnet', enokiApiKey: KEY, signer,
  autoRefresh: true, // re-fetch after every approved execute
});

Preview without executing

const preview = sdk.validate(pass, { merchant, amount });
// { allowed: boolean, requiresEscalation: boolean, reason: string }

๐Ÿ“‹ Templates

Template Budget Escalate โ‰ฅ Max/tx Expiry
festival 300 SUI 50 SUI 200 SUI 48h
gaming 50 SUI 2 SUI 10 SUI 4h
subscription 200 SUI 20 SUI 50 SUI 30d
defi 10,000 SUI 500 SUI 2,000 SUI 7d
enterprise 50,000 SUI 1,000 SUI 10,000 SUI 30d

โš™๏ธ How It Works

User creates EdgePass (once)
         โ”‚
         โ–ผ
Agent calls sdk.execute() โ€” many times, autonomously
         โ”‚
         โ”œโ”€โ–ถ ๐Ÿ” Layer 1 โ€” TypeScript PolicyEngine
         โ”‚         Pure TypeScript ยท no network ยท <1ms
         โ”‚         โ”œโ”€ active? expired? merchant in allowlist?
         โ”‚         โ”œโ”€ amount within budget? below maxPerTx? within velocity cap?
         โ”‚         โ”œโ”€ amount > escalateAbove? โ†’ โš ๏ธ  escalate (agent pauses)
         โ”‚         โ””โ”€ amount โ‰ค escalateAbove? โ†’ โœ… auto-approve
         โ”‚         blocked/escalated NEVER touch the chain
         โ”‚
         โ”œโ”€โ–ถ โšก Layer 2 โ€” Sui Move Contract (PTB, atomic)
         โ”‚         validate โ†’ execute โ†’ update spent โ†’ emit event
         โ”‚         if any assertion fails โ†’ everything reverts ยท no partial state
         โ”‚         cannot be bypassed ยท the chain is the source of truth
         โ”‚
         โ””โ”€โ–ถ ๐Ÿ—‚ Walrus โ€” immutable audit receipt
                   cryptographically committed ยท decentralized ยท permanent

The Two-Layer Security Model

This is Edge's most important architectural decision:

Layer 1 โ€” TypeScript PolicyEngine    <1ms ยท zero network ยท developer convenience
Layer 2 โ€” Sui Move Contract          atomic ยท tamper-proof ยท cannot be bypassed

Blocked/Escalated โ†’ Layer 1 catches them ยท never submitted to chain ยท no gas wasted
Approved          โ†’ Layer 1 + Layer 2 ยท both must pass ยท atomic execution

Layer 1 can be bypassed by a compromised agent runtime. Treat it as a UX convenience and gas optimization โ€” not a security boundary.

Layer 2 cannot be bypassed. The Move contract validates the same five rules independently. A compromised SDK, a compromised agent, a compromised developer machine โ€” none of these can circumvent the contract. The chain enforces the policy.


โš ๏ธ zkLogin Salt Derivation Fix

Most zkLogin implementations call jwtToAddress(jwt, BigInt(0)) โ€” hardcoding the salt as zero. This silently derives the wrong wallet address. Users can log in but their transactions fail or go to the wrong address.

The correct pattern: fetch the unique salt from Enoki before deriving the address.

Edge fixes this. Your users will have the correct wallet address derived from their Google identity.


๐Ÿ”ท Why This Is Only Possible on Sui

๐Ÿ” zkLogin โ€” Invisible wallet from Google login. No seed phrase, no MetaMask. On Ethereum: weeks of account abstraction. On Sui: one API call.

โ›ฝ Sponsored Transactions โ€” Users never pay gas. Protocol-level primitive. On Ethereum: deploy and maintain a Paymaster contract. On Sui: one API key.

๐Ÿงฑ Programmable Transaction Blocks โ€” Policy check + execution + state update โ€” one atomic block. If any step fails, everything reverts. No partial state. No race conditions. Native to Sui.

๐Ÿ“ฆ Object Model โ€” EdgePass is a first-class owned object in the user's wallet. An agent executes against it without ever taking ownership. On Ethereum: a contract mapping the developer can modify. On Sui: an object only the owner can touch.

๐Ÿ—‚ Walrus โ€” Decentralized audit storage built by the same team as Sui. Byzantine fault-tolerant. Erasure-coded. Not IPFS. Not S3. Native.

You could build a worse version of Edge on Ethereum in months. On Sui it took 10 days โ€” because every primitive was already there.


๐Ÿ”’ Security Model

sdk.validate()  โ†’  TypeScript (instant preview, saves gas on rejections)
sdk.execute()   โ†’  TypeScript + Move contract (atomic, tamper-proof, final)

The Move contract runs six assertions, in order, in the Sui VM before recording any spend:

assert!(pass.active, EPassInactive);
assert!(now <= pass.expires_at_ms, EPassExpired);
assert!(ctx.sender() == pass.agent, ENotAgent);
assert!(pass.approved_merchants.contains(&merchant), EMerchantNotApproved);
assert!(amount <= pass.max_per_transaction, EExceedsMaxPerTransaction);
assert!(pass.velocity_used + 1 <= pass.velocity_cap, EVelocityExceeded);  // skipped when velocity_cap == 0
assert!(pass.spent + amount <= pass.budget, EBudgetExceeded);

Notice escalateAbove isn't in that list โ€” escalation is an off-chain routing decision the SDK's PolicyEngine makes, not a refusal the contract can enforce. The chain only knows hard yes/no answers: active, in-scope, under the per-transaction ceiling, under the velocity cap, under budget. If any assertion fails, the entire transaction reverts. A compromised agent cannot bypass the contract. The chain is the trust boundary.


Competitive Positioning

Edge is the policy layer for the agentic economy. It is not a payment rail.

Solution Layer Open Source Sui Native simulate() 3-line SDK
Edge Protocol Policy enforcement โœ… โœ… โœ… โœ…
x402 (Coinbase) Payment rail โœ… โŒ โŒ โŒ
ERC-4337 Account abstraction โœ… โŒ EVM only โŒ โŒ
Trust Wallet Agent Kit Wallet interactions โœ… Partial โŒ โŒ
Cobo Agentic Wallet Custody โŒ Enterprise โŒ โŒ โŒ
Skyfire Identity + settlement โŒ โŒ โŒ โŒ

Edge complements x402, it does not compete with it.

x402 answers: how does money move from agent to merchant? Edge answers: should this agent be allowed to spend this money at all?

Edge (policy layer)  โ†’  x402 (payment rail)  โ†’  Settlement
"is this allowed?"       "move the money"

๐ŸŒ Use Cases

Vertical Template The agent does
๐ŸŽช Consumer / Festival festival Purchases at approved vendors, escalates big spends
๐ŸŽฎ Gaming gaming In-game micro-purchases within session budget
๐Ÿ“ฆ Subscriptions subscription Recurring payments to approved services
๐Ÿ“ˆ DeFi / Trading defi Trades on approved DEXes within risk parameters
๐Ÿข Enterprise / Payroll enterprise Vendor payments with compliance audit trail
๐Ÿค– AI Agent Platforms any Any LLM making autonomous spending decisions
๐Ÿฆ Institutional enterprise Fireblocks custody + Edge policy = complete stack

โ›“ Move Contract

Network:   Sui Mainnet โœ…
Package:   0x2ad62ac22e74172cc2e33cbebd7471fb16403831b3bdd1143d51935cefd1bbde

View on Suiscan โ†’


๐Ÿงช Testing

cd packages/sdk && pnpm test
๐Ÿ“‹ PolicyEngine.validate()          11 tests โœ“
๐Ÿ“‹ PolicyEngine helpers              7 tests โœ“
๐Ÿ“‹ EdgePass.fromTemplate()           7 tests โœ“
๐Ÿ“‹ EdgePass.create() validation      2 tests โœ“
๐Ÿ“‹ Constants                         5 tests โœ“
๐Ÿ“‹ Events system                     7 tests โœ“

39 passed ยท 0 failed โœ…

๐Ÿš€ Local Development

git clone https://github.com/fluturecode/edge.git
cd edge && pnpm install

cp apps/web/.env.example apps/web/.env.local
# Add: NEXT_PUBLIC_ENOKI_API_KEY, NEXT_PUBLIC_GOOGLE_CLIENT_ID, ANTHROPIC_API_KEY, GOOGLE_API_KEY

cd apps/web && pnpm dev       # โ†’ http://localhost:3000
cd packages/sdk && pnpm test  # โ†’ 39 passing
cd packages/sdk && pnpm build

๐Ÿ“ Repository Structure

edge/
โ”œโ”€โ”€ ๐Ÿ“ฑ apps/web/                     Next.js 15 demo app
โ”‚   โ”œโ”€โ”€ app/
โ”‚   โ”‚   โ”œโ”€โ”€ page.tsx                 Login โ€” terminal typewriter, zkLogin
โ”‚   โ”‚   โ”œโ”€โ”€ auth/callback/           zkLogin callback, Enoki address derivation
โ”‚   โ”‚   โ”œโ”€โ”€ dashboard/               Main dashboard, EdgePass card
โ”‚   โ”‚   โ”œโ”€โ”€ dashboard/create/        EdgePass creation + PTB preview
โ”‚   โ”‚   โ””โ”€โ”€ dashboard/agent/         ๐Ÿค– AI agent demo โ€” Claude + Gemini
โ”‚   โ”œโ”€โ”€ lib/
โ”‚   โ”‚   โ”œโ”€โ”€ signer.ts                zkLogin signer, gas coin resolution
โ”‚   โ”‚   โ”œโ”€โ”€ zklogin.ts               ZK proof generation via Enoki
โ”‚   โ”‚   โ”œโ”€โ”€ walrus.ts                Walrus HTTP API (write/read blobs)
โ”‚   โ”‚   โ””โ”€โ”€ seal.ts                  Seal policy serialization โ€” not yet encrypted, see Roadmap
โ”‚   โ””โ”€โ”€ app/api/
โ”‚       โ”œโ”€โ”€ sign/route.ts            Transaction signing + Sui execution
โ”‚       โ”œโ”€โ”€ zkp/route.ts             ZK proof generation via Enoki
โ”‚       โ””โ”€โ”€ agent/route.ts           Claude/Gemini API for autonomous decisions
โ”‚
โ”œโ”€โ”€ ๐Ÿ“ฆ packages/sdk/                 @edge-protocol/sdk v2.0.0
โ”‚   โ””โ”€โ”€ src/
โ”‚       โ”œโ”€โ”€ core/
โ”‚       โ”‚   โ”œโ”€โ”€ EdgePass.ts             Main API + events + simulate() + withPolicy()
โ”‚       โ”‚   โ”œโ”€โ”€ PolicyEngine.ts         Validation + budget/velocity helpers (37 tests)
โ”‚       โ”‚   โ”œโ”€โ”€ ExecutionEngine.ts      PTB builder + chain execution + fetch (v1 + v2)
โ”‚       โ”‚   โ”œโ”€โ”€ IdempotencyRegistry.ts  Two-phase commit for createWithFireblocks()
โ”‚       โ”‚   โ””โ”€โ”€ withFireblocks.ts       Hardened Fireblocks settlement HOF
โ”‚       โ”œโ”€โ”€ compliance/
โ”‚       โ”‚   โ”œโ”€โ”€ ComplianceEngine.ts         AML / sanctions / risk screening (6th dimension)
โ”‚       โ”‚   โ””โ”€โ”€ DynamicIdentityBinding.ts   Binds passes to Dynamic enterprise identities
โ”‚       โ”œโ”€โ”€ audit/
โ”‚       โ”‚   โ””โ”€โ”€ WalrusAudit.ts           Real Walrus mainnet audit log storage
โ”‚       โ”œโ”€โ”€ react/
โ”‚       โ”‚   โ””โ”€โ”€ index.ts             useEdgePass, useBudgetStatus, useSimulate
โ”‚       โ””โ”€โ”€ utils/
โ”‚           โ”œโ”€โ”€ types.ts             All TypeScript types (v1 read-only + v2 create/spend)
โ”‚           โ””โ”€โ”€ constants.ts         Templates + Package IDs + MIST_PER_SUI
โ”‚
โ””โ”€โ”€ ๐Ÿ“œ contracts/navis/
    โ””โ”€โ”€ sources/
        โ”œโ”€โ”€ edge_pass.move           v1 โ€” deployed, read-only going forward
        โ””โ”€โ”€ edge_pass_v2.move        โœ… current โ€” issuer/agent split, velocity limits

๐Ÿ—บ Roadmap

Phase 1 โ€” Foundation โœ… shipped

  • โœ… zkLogin onboarding โ€” invisible wallet from Google (salt derivation fixed)
  • โœ… EdgePass creation โ€” real Move object on Sui mainnet
  • โœ… PolicyEngine โ€” pure TypeScript, zero network
  • โœ… Two-layer enforcement โ€” TypeScript preview + Move contract source of truth
  • โœ… Human-in-the-loop escalation โ€” agent pauses, awaits human approval via modal
  • โœ… Events system โ€” on('approved'), on('escalated'), on('blocked')
  • โœ… simulate() โ€” predict full session outcomes before touching the chain
  • โœ… Budget helpers โ€” budgetStatus(), isNearLimit(), timeRemaining()
  • โœ… withPolicy() โ€” wrap any AI tool with on-chain enforcement in one line
  • โœ… React hooks โ€” useEdgePass, useBudgetStatus, useSimulate
  • โœ… ๐Ÿค– Live AI agent demo โ€” Claude + Gemini, real autonomous decisions
  • โœ… Seal policy serialization โ€” lib/seal.ts turns the policy into a JSON string today; it is plaintext, not encrypted. Real Seal encryption and network storage are both still pending key server deployment
  • โœ… Move contract โ€” deployed to Sui mainnet
  • โœ… SDK on npm โ€” @edge-protocol/sdk

Phase 2 โ€” Trust Layer โœ… shipped

  • โœ… EdgePassV2 โ€” issuer/agent separation: a human grants and revokes, an agent spends, neither can do the other's job
  • โœ… Merchant scope can only narrow, never widen, after minting โ€” not even the issuer can add merchants back
  • โœ… Rolling velocity windows โ€” velocityCap / velocityWindowMs, replaces the old maxTransactionsPerHour idea with an on-chain-enforced rate limit
  • โœ… Hard per-transaction ceiling (maxPerTransaction) โ€” required and enforced on chain, not just advisory
  • โœ… On-chain denials โ€” a blocked outcome can be recorded as an aborted transaction, so the refusal itself is independently verifiable on Suiscan
  • โœ… Approved merchants moved from display names to addresses โ€” enforceable, not just cosmetic
  • โœ… Upgraded to @mysten/sui v2 + @mysten/walrus v1 โ€” unblocked real Walrus storage
  • โœ… Real Walrus blob storage โ€” the demo app writes to public mainnet publishers with a local mock fallback only if every publisher is unreachable
  • โœ… Two-Phase Commit / Idempotency โ€” createWithFireblocks() with retry-safe idempotencyKey
  • โœ… Compliance Engine (6th dimension) โ€” AML / sanctions / risk screening, pluggable providers
  • โœ… Dynamic Identity Binding โ€” bind a pass to a Dynamic enterprise session via JWT

Phase 3 โ€” Protocol & Business ๐Ÿ“‹ coming

  • โฌœ Managed escalation dashboard โ€” proprietary SaaS approval UI
  • โฌœ On-chain policy signatures โ€” tamper-proof policy commitment
  • โฌœ Multi-token support โ€” USDC, USDT, any Sui coin
  • โฌœ Tool-use architecture โ€” agent decides one transaction at a time, sees results
  • โฌœ Enterprise guardrails โ€” SOC2, SIEM
  • โฌœ Cross-agent coordination โ€” multi-agent quorum execution
  • โฌœ Intent-based policies โ€” natural language โ†’ on-chain rules
  • โฌœ Cross-chain EdgePasses

๐Ÿ’ก The Analogy

Before Stripe, every developer built their own payment processing. After Stripe, you call stripe.charge().

Edge is stripe.charge() for autonomous agent trust.


๐Ÿ— Open-Core Model

PROPRIETARY (future business):
  Managed escalation UI ยท Enterprise auth ยท Policy feeds ยท Compliance exports

OPEN SOURCE (always free):
  TypeScript SDK ยท Move contracts ยท Walrus audit parsers ยท PolicyEngine

The SDK, Move contracts, and PolicyEngine are and will always be open source.


๐Ÿ“Š Why It Matters

The agentic economy is already here. Every autonomous agent that touches money needs a trust boundary. Today, every team builds their own. With Edge, every team ships in a day.


The best infrastructure is invisible.

Built with โ™ฅ by @fluturecode for Sui Overflow 2026 โ€” Agentic Web track.

pnpm add @edge-protocol/sdk

GitHub ยท npm ยท Sui ยท MIT License

Releases

Packages

Contributors

Languages