Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

Functor Agentic Wallet

Functor Agentic Wallet enables a global registry of permissions on-chain, accessible by any agent.

Traditional agentic wallets store permissions locally or in centralized servers. Functor's Keystore infrastructure makes composable permissions accessible across any chain and any wallet, enabling:

  • Agent-to-agent verification. Two AIs acting on the same wallet can verify each other's authority on-chain. No platform in between.
  • Cross-app authorization. Any DEX, orderbook, or protocol can read whether an agent is authorized, without integrating with the specific wallet vendor.
  • A new class of agent services. Users hire AI agents through on-chain employment contracts. Anyone can verify what an agent is allowed to do, and revoke is one transaction.

See how Functor compares

Install

npm install @functornetwork/agentic-wallet viem

Two ways to create a wallet

Same smart account underneath, different signer.

For end-user apps (browser): Passkey wallet, secured by Face ID or Touch ID. No seed phrase, no extension.

import { createPasskeyWallet } from "@functornetwork/agentic-wallet";
 
const wallet = await createPasskeyWallet({
  rpId: "myapp.example",
  user: { name: "alice@example.com", displayName: "Alice" },
});

For agents and scripts: Private-key wallet. Bring your own key from env, OS keychain, or hardware wallet.

import { createWallet, signerFromPrivateKey } from "@functornetwork/agentic-wallet";
 
const signer = signerFromPrivateKey(process.env.PRIVATE_KEY as `0x${string}`);
const wallet = await createWallet({ signer });

Both return the same Wallet handle. Every other SDK function works with either.

Grant a scoped session

import { grantSession, execute } from "@functornetwork/agentic-wallet";
 
const session = await grantSession(wallet, wallet.signer, {
  permissions: {
    calls: [{ to: "0xUniswapRouter..." }],
    spend: [{ limit: 100_000_000n, period: "day", token: "0xUSDC..." }],
  },
  expiry: Math.floor(Date.now() / 1000) + 7 * 24 * 60 * 60,
});
 
// The agent uses the session directly. Admin not involved.
await execute(session, [
  { to: "0xUniswapRouter...", data: "0x...", value: 0n },
]);

The session is on-chain in Keystore the moment grantSession confirms. Any tool can verify the authorization without going through Functor.

What's next