Bounded Mandate · revocable trading on NEAR Intents

Give an AI agent trading authority without unrestricted control of your treasury.

Pausing a trading agent doesn't void orders it already signed. Here the agent trades within your limits: the contract builds and checks each order before requesting its MPC signature. Revoke removes the signing key, so signed orders not yet executed fail once removal is confirmed, and you recover the assets without the agent.

Mainnet, 14 Nov 2026: 1 USDC trade filled → key revoked → the same held signed order rejected 67.25 s before expiry → assets recovered · Verify ↓

What happened on mainnet

Mainnet

One approved mainnet run, 14 Nov 2026, fixed proposals, our own filler; shows integration, not reliability or profitability.

  1. Permitted trade

    1.00 USDC paid by the mandate → 0.322008 wNEAR

    A fixed proposal within the limits, signed through v1.signer (Chain Signatures) and filled.

    Fill: 2PzTvX…y1MK

  2. Confirmed revocation

    key removed at intents.near

    The owner calls revoke. The grant's signing key is removed from the verifier, and the removal is confirmed.

    Revoke: H7KpB2…ApJSC

  3. Same signed order rejected

    67.25 s before expiry

    A second order, signed before revoke and withheld, is relayed unchanged. intents.near rejects it: the key no longer exists for the mandate account.

    Relay: 5R1wKw…3LLw

  4. Recovery

    3.999999 USDC + 0.422008 wNEAR

    Returned to the owner's Intents account, without the agent. Withdrawing to a NEAR wallet is the owner's separate step.

    Recover: Cuan44…2qJt, 7ypZiT…rEGj

The withheld order's lifetime, measured on chain

120 s order lifetime (approved policy maximum). Axis: seconds left before the order's deadline.

S
Order signed: 83.9 s before the deadline
R
Revoke transaction's block: 78.9 s before
C
Check after confirmed removal: 70.8 s still left
X
Rejection executed at intents.near: 67.25 s before

Shaded: from the revoke transaction's block to the deadline. Without revocation the order could have been relayed and executed anywhere in this window.

node verify.mjs --mainnet re-reads the run from the chain: 54 read-only chain checks passed, 0 failed.

How it works

The agent can only propose. The contract prices the order, checks it against the owner's limits, and only then asks the MPC network to sign it.

Architecture The owner grants, limits, revokes and recovers through the mandate contract, a keyless account. The agent holds a function-call key that can only call propose_order. The mandate reads prices from aggregate-oracle.near, checks size, turnover and concession limits, and asks v1.signer (Chain Signatures, MPC) to sign. The signed order goes to the intents.near verifier, which checks the registered key on every intent, and is settled by a filler (our own account in the mainnet run). Revoke removes that key at intents.near. revoke: remove the key at intents.near Owner (wallet or DAO) grant · limits · revoke · recover AI agent key allows propose_order only Mandate contract keyless account holds the funds aggregate-oracle prices Limit checks size, turnover, concession v1.signer Chain Signatures (MPC) signs the order signed order, relayed by a filler intents.near checks the key on every signed intent key removed Settled by a filler (our own account in the mainnet run) Architecture The owner grants, limits, revokes and recovers through the mandate contract, a keyless account. The agent holds a function-call key that can only call propose_order. The mandate reads prices from aggregate-oracle.near, checks size, turnover and concession limits, and asks v1.signer (Chain Signatures, MPC) to sign. The signed order goes to the intents.near verifier, which checks the registered key on every intent, and is settled by a filler (our own account in the mainnet run). Revoke removes that key at intents.near. Owner grant, limits, revoke, recover AI agent function-call key: propose_order Mandate contract keyless account that holds the funds Limit checks size, turnover, concession aggregate- oracle prices v1.signer Chain Signatures (MPC) signs the order signed order, relayed by a filler intents.near verifier checks the key on every signed intent Settled by a filler (our own account in the mainnet run) revoke: remove key at intents.near
  • Every signed intent is checked against the key registered for the mandate at intents.near. Revoke removes that key, so every outstanding signed order fails once the removal is confirmed.
  • Recover returns the assets to the owner's Intents account. It needs no agent, oracle or MPC.

Watch

Narrated explainer based on recorded evidence; not a certified cut.

Recorded demo cuts from the project's own test gate (not an external certification): short · full

Verify it yourself

make verify

Checks the committed evidence. Offline, no install.

node verify.mjs --mainnet --rpc https://near.drpc.org

Reads the mainnet run from the chain, read-only.

make quick

Replays the story in a local sandbox. Node 24, no Rust.

Limitations

More detail

Hostile requests refused, by layer Sandbox

39 of 39 scripted hostile requests refused in the sandbox, each at the layer that stopped it. Supporting evidence, not a security guarantee.

LayerRefused
Local validation10
Contract method checks14
Policy checks4
Agent key permission10
Verifier1
Other ways to stop a signed order Sandbox

Withheld, unexpired signed orders were relayed after each owner action. Wait, nonce cancel and key removal used three orders each.

Owner's actionWithheld orders that still executed (lower is better)
Wait for expiry3 of 3
Cancel nonces, list incomplete1 of 3
Pause flag (our re-implementation of a published pause design)a withheld order executed after pause
Remove the key at intents.near0 of 3
Glossary
Function-call key
A NEAR access key limited to one contract and named methods. The agent's key can only call propose_order.
Chain Signatures (MPC)
NEAR's multi-party signing service at v1.signer. The mandate asks it to sign with a key derived for the grant; the agent never holds that key.
NEAR Intents verifier
The intents.near contract. It executes a signed intent only if the signing key is registered for the account.
Withheld order
An order that was signed but not relayed yet. Whoever holds it can relay it until its deadline.
Revoke vs recover
Revoke removes the grant's key, so outstanding signed orders fail. Recover moves the assets back to the owner's Intents account.
Certified
All 48 required cases passed in one clean run from a fresh clone at revision dd665d1. The project's own gate, not an external audit.