Live on NEAR mainnet · open source

Your agent can spend. It cannot overspend.

A wallet for AI agents on NEAR. Limits enforced by a contract, not a prompt — the agent's key can call exactly one method, and every decision lands on chain.

Open the dashboard → Source on GitHub Rust contract · TypeScript SDK · MCP server · MIT
Connects through MCP
Claude CodeClaude DesktopCodexCursorOpenClawIronClaw
Why

A NEAR access key limits gas, not money.

A key scoped to a token transfer can still drain the balance in one call — the allowance caps gas, not value. Bound puts a contract between the key and the money.

01

You write the rules once.

Per-action and daily caps, in NEAR or dollars. Who can be paid. What can be called. When. And an amount above which the agent must ask you.

02

The agent gets a key scoped to execute.

A normal NEAR function-call key, locked to one contract and one method. The policy runs before anything moves.

03

Every decision is public.

Executed, denied with the reason, queued, approved. The contract keeps its last 100 decisions; a registry turns them into a score per agent key.

Dashboard

Reads from the chain. Signs with your wallet.

Installs to your phone. No server, no indexer: state is read from RPC, actions sign with MyNearWallet or Meteor. Real testnet numbers below.

01Home

Balance free for agents, the pause switch, and anything waiting for approval.

02Policy

The fields the contract enforces. Dollar budgets use a price the contract fetches from Ref Finance, the NEAR oracle, or the owner.

03Approvals

Actions above the threshold wait here. Approving re-checks the policy before sending.

04Activity

The contract's own decision log, with reasons.

Available to agents
0.55 NEAR
3.84 total · 3.29 locked for contract storage
Agents are active
Pause denies every action.
1 Waiting for your approval
›
buyer
1.95 of 2 NEAR left this day
2 denied
Budget in
NEARUS dollars
Max per action
$10.00
Per day
$15.00
Ask me above
0.25 NEAR
on
Tripwire
2 denials in 60 minutes
on
Cross-chain swaps
NEAR Intents, counted against the caps
on
Asked you
Pay reins.testnet
buyer · just now
0.30 N
RejectApprove
The policy allows 0.5 NEAR per action and asks above 0.25. This one waits for the owner.
Executed0.1 N
Swap to USDC on Base → 0x1111…
Denied0.6 N
Pay reins.testnet
amount $12.00 exceeds max_per_tx $10.00
Tripwire
Agent suspended automatically
Reputation28 · new
3 scored decisions · 1 executed · 2 denied
Tripwire

Keeps probing? Gets cut off.

Pick a denial count and a window. Hit it, and the contract suspends the agent until you lift it. This sequence was recorded by guard.reins.testnet on 25 October, tripwire set to 2 denials per hour.

See the account on NearBlocks →
Pay reins.testnet · 0.05 N
Receiver is on the allowlist. Sent.
action_executed
Pay stranger.testnet · 0.05 N
receiver stranger.testnet not in allowlist
action_denied
Pay stranger.testnet · 0.05 N
Second denial inside the window. Agent suspended.
action_denied → agent_tripped
Pay reins.testnet · 0.05 N
Would have passed the policy. Denied because the agent is suspended.
action_denied: agent is suspended
Owner calls unsuspend
From the agent's page in the dashboard, or the CLI.
agent_unsuspended
For agents

One MCP server, four tools.

The config holds a key that can only call execute. If it leaks, the thief inherits the policy — nothing more.

bound_statusPolicy, remaining budget this window, counters, reputation if a registry is configured.
bound_checkEvaluates an action without executing it. Returns allowed, needs approval, or the denial reason.
bound_executeSubmits the action. Returns Executed, Denied with the reason, or Queued with an id.
bound_explain_denialTurns a denial reason into what the policy allows instead. Tells a suspended agent to stop retrying.
{
  "mcpServers": {
    "bound-wallet": {
      "command": "node",
      "args": ["sdk/dist/mcp.js"],
      "env": {
        "NEAR_NETWORK": "testnet",
        "BOUND_WALLET": "guard.reins.testnet",
        "BOUND_AGENT_KEY": "ed25519:…"  // function-call key, execute only
      }
    }
  }
}
1
Method an agent key can call. Owner methods reject it at the contract and at the protocol.
100
Most recent decisions the contract stores. Older ones remain in transaction logs as events.
27
Tests: 13 unit tests on the policy engine, 14 end-to-end tests on a local NEAR sandbox.
0
Full-access keys a wallet needs. The owner upgrades it through the contract.
Comparison

The same key, with and without Bound.

Function-call key on an accountFunction-call key on a Bound wallet
Value per callUnlimited. The allowance is a gas budget.Capped per action and per window, in NEAR or dollars.
ReceiversAny account the method accepts.Allowlist, or owner approval for new receivers.
Large actionsSent.Queued above a threshold until the owner approves.
Repeated denialsNot observed.Counted; the tripwire suspends the agent.
RecordTransaction logs, if indexed.Decision log in the contract, with reasons, plus events.
RevokingDelete the key.Delete the key, or suspend it and keep the history.
Try it

Give your agent money. Keep the limits.

Deploy to a testnet sub-account and hand over one key. The README has the exact commands.