Bounded mandate · owner console · NEAR Intents · USDC / wNEAR

static page no backend holds no keys

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

Review the mandate. Revoke, recover and withdraw as its owner.

Anyone can read the grant, its limits, the key on the verifier, open orders and balances. Only the contract's owner can act, and only by signing outside this page.

  1. 1Read the mandate and its limits§1: grant, limits, fixed accounts and balances, read at one final block.
  2. 2A permitted tradeMade by the agent, not here. Turnover used and balances in §1; the recorded trade in §3.
  3. 3Hostile requests refusedBy the agent key, the contract and the verifier, not by this page; listed in the evidence page's attack log.
  4. 4Spot a withheld signed order§1 Open orders: a signed order stays executable until its deadline or until key removal is confirmed.
  5. 5Revoke§2, signed outside this page. Not instant: until key removal is confirmed, signed orders may still execute.
  6. 6Check that the same order is rejectedAfter confirmed removal §1 shows the grant key absent on the verifier. This page never relays orders; the recorded relay is in §3.
  7. 7Recover§2: each asset to the owner's Intents account, with no agent, oracle or MPC involved.
  8. 8Withdraw§2: from the owner's Intents account to its NEAR account. The owner's own action, outside recovery claims.
live

Current chain state from an RPC you choose, after a chain-id and genesis check, at one final block (§1).

sandbox recorded

What one make demo run observed in a local sandbox with labelled test doubles (§3). Not live.

Live chain state

Read the mandate's current state straight from an RPC of your choice. Nothing is requested until you press the button. The RPC must first report the network's chain id and genesis hash; on a wrong chain, an error or a timeout nothing is shown as verified. The RPC you choose is trusted for every answer it returns.

Expected networks and deployments
  • NEAR mainnet: chain id mainnet, genesis EPnLgE7iEq9s7yTkos96M3cWymH5avBAPm3qx3NXqR8H; no expected deployment recorded, so owner controls stay disabled.

The live view needs JavaScript; the recorded evidence below does not.

Owner controls

Revoke, recover and withdraw are enabled only when all three hold: the connected signer is the contract's owner_id, the RPC's chain is the chosen network (genesis check), and the mandate account runs the expected code. Each action is shown exactly before anything is signed, and is signed outside this page.

A · Connect a signer

NEAR Connect 0.11.4 External wallets connect through NEAR Connect, from the wallet list in this page (no remote list, no saved or manually added wallets). On mainnet each wallet's adapter is pinned to a commit, checked against its sha256 before it runs, and runs in a sandboxed frame. A browser-extension wallet that announces itself to the page may also appear; it is labelled as not pinned. The wallet signs and broadcasts; the page holds no key and checks every returned transaction on chain against the exact preview. A wallet that ends a request without a hash leaves the action pending until you paste the hash or forget it. Compatibility with a specific wallet is established only when its owner connects it (see About).

Not connected.

B · Runner intent (optional)

Paste the runner's persisted bounded-mandate/external-intent@1 record. Then only that action can be signed, and only if the console's own preview, built from live state, equals it field by field.

No runner intent loaded: the console signs its own preview.

C · Owner actions, in journey order

Revoke first (step 5); recovery needs a revoked grant (step 7); withdrawal is the owner's own later step from its Intents account (step 8). Each opens an exact preview; nothing is signed until you confirm it there.

Controls need JavaScript and live state.

Actions in this browser

Pending actions are kept in this browser's storage, keyed by the intent's sha256. After a reload the console only resumes polling; it never signs or sends anything again by itself.

Recorded evidence (sandbox)

sandbox recorded evidence · not live

Recorded by make demo at revision dd665d181a03, 2026-11-14T16:15:20.434Z. A local sandbox ran our contract and the pinned Intents verifier WASM with labelled test doubles for the MPC signer, the oracle and the tokens. These values come from out/evidence/demo.json; they say nothing about any live network and are never combined with the live view above.

Mandate

Mandate
mandate.sandbox
Owner
owner.sandbox
Agent
agent.sandbox
Intents verifier
intents.sandbox
USDC token
usdc.sandbox
wNEAR token
wnear.sandbox
Test doubles
mpc.sandbox, oracle.sandbox

Grant and its limits

the grant as read after activation: not in this evidence.

Grant status through the run

After stepGrantKey on verifierOpen ordersMandate on IntentsOwner on IntentsOwner's NEAR account
Grant and limitsactiveregistered01,000 USDC
300 wNEAR
0 USDC
0 wNEAR
0 USDC
0 wNEAR
Mandate reviewed in the consoleactiveregistered01,000 USDC
300 wNEAR
0 USDC
0 wNEAR
0 USDC
0 wNEAR
Bounded agent proposal -> propose_orderactiveregistered11,000 USDC
300 wNEAR
0 USDC
0 wNEAR
0 USDC
0 wNEAR
Filler fills the first order (actual trade on the pinned verifier)activeregistered0950.1 USDC
316.546856… wNEAR
0 USDC
0 wNEAR
0 USDC
0 wNEAR
Hostile requests refusedactiveregistered0950.1 USDC
316.546856… wNEAR
0 USDC
0 wNEAR
0 USDC
0 wNEAR
Second signed order withheldactiveregistered1950.1 USDC
316.546856… wNEAR
0 USDC
0 wNEAR
0 USDC
0 wNEAR
Owner revokes in the console; removal confirmedrevokedabsent0950.1 USDC
316.546856… wNEAR
0 USDC
0 wNEAR
0 USDC
0 wNEAR
Withheld order relayed from another accountrevokedabsent0950.1 USDC
316.546856… wNEAR
0 USDC
0 wNEAR
0 USDC
0 wNEAR
Agent, oracle and MPC disabledrevokedabsent0950.1 USDC
316.546856… wNEAR
0 USDC
0 wNEAR
0 USDC
0 wNEAR
Recovery to the owner's Intents accountrevokedabsent00 USDC
0 wNEAR
950.1 USDC
316.546856… wNEAR
0 USDC
0 wNEAR
Owner withdrawal to its NEAR account (outside recovery)revokedabsent00 USDC
0 wNEAR
0 USDC
0 wNEAR
950.1 USDC
316.546856… wNEAR
Final balancesrevokedabsent00 USDC
0 wNEAR
0 USDC
0 wNEAR
950.1 USDC
316.546856… wNEAR

Orders

  • held Order traded: fill executed: mandate balances moved by exactly the signed amounts (fees borne by the filler)
  • held Its reservation released on settlement: settle_order released the reservation on the verifier's nonce evidence
  • held Second order signed and withheld (executable before revocation): withheld order is executable before revocation (simulate_intents accepts the bundle with no invariant violation)
  • held Withheld order's reservation released by confirmed key removal: withheld order's reservation released only by confirmed key removal
  • held Withheld order relayed after revocation: relayed withheld order failed with the verifier's error naming the removed grant key and the mandate, in a block before its deadline, with no balance change

Balances at the end of the run

HolderUSDCwNEAR
Mandate on Intents0 USDC0 wNEAR
Owner on Intents0 USDC0 wNEAR
Owner's NEAR account950.1 USDC316.546856… wNEAR

At block time 2026-11-14T16:15:20.247Z.

Recovery and withdrawal

Recovered USDC
950.1 USDC to the owner's Intents account
Recovered wNEAR
316.546856633333333333333334 wNEAR to the owner's Intents account

Owner withdrawal (outside recovery)

USDC
withdrawn: 950.1 USDC · owner was registered · 1 attempt(s)
wNEAR
withdrawn: 316.546856633333333333333334 wNEAR · owner registered first · 1 attempt(s)

First proposal and model replay

recorded-model The replayed response from claude-haiku-5-5 returned a proposal. No provider call was made during replay.

wNEAR is 47.37% of the $1,899.8 portfolio, a 2.63-point deviation from 50/50. Selling about $49.9 of USDC to buy wNEAR moves the split back to roughly 50/50, within the $379.96 per-order cap and the 50 bps concession limit.

Receipts

#StepOutcomeTransactionProvenance
1owner grantowner.sandbox → mandate.sandbox.grantsuccessexecuted, not awaited to final2iuxdUoLsQhJKfgbX1LhsdZ8M7j4v947hq713kafUBzxsandbox
2agent propose_order (first order)agent.sandbox → mandate.sandbox.propose_ordersuccessexecuted, not awaited to final9yEJ32yWm6aEGXnyg82JKLVSCWCQ3ofsY6nQHZAu13RBsandbox
3filler execute_intents order 0filler.sandbox → intents.sandbox.execute_intentssuccessexecuted, not awaited to finalCPwjMv5mqfT8NxeyAR4fj1MkPcCDEp6nLk6qzSP7PUAsandbox
4settle_order 0relayer.sandbox → mandate.sandbox.settle_ordersuccessexecuted, not awaited to finalAjSSiYa4j76HmswXbEKecKN1Ne2ncE83JuoY4VYUmZAcsandbox
5agent propose_order (second order, scripted, withheld)agent.sandbox → mandate.sandbox.propose_ordersuccessexecuted, not awaited to finalH6D9tBRQHamymE1f37GUSJt2FJXdZnhogPMJyWzHsR9psandbox
6owner revoke (owner controls via the local sandbox test signer (not a wallet))owner.sandbox → mandate.sandbox.revokesuccessfinalFXUHTWzjzNBLqBCTtY6nEtbRpThUqRZC1sEcpsP1eZsBsandbox
7relayer execute_intents (withheld order after revocation)relayer.sandbox → intents.sandbox.execute_intentsfailureexecuted, not awaited to finalDLocjVrit4XMMV9aDaJrVX44fL5FXkGHtPNaKH12NR34sandbox
8oracle set_fail(true)operator.sandbox → oracle.sandbox.set_failsuccessexecuted, not awaited to finalC4BF6rvFvn5SRZfWJo1oHVXZCUgEaoVQ9jCLZyfb6rMmsandbox
9mpc set_mode(hold)operator.sandbox → mpc.sandbox.set_modesuccessexecuted, not awaited to final4qYn1CVJy1xwr4ajEEb2VZyZXgXufxGR6BcwguqhMyX4sandbox
10agent propose_order after revocationagent.sandbox → mandate.sandbox.propose_orderfailureexecuted, not awaited to finalQBkgjy7ivG1DbRAUzoJqQvASfYbbXrMiLx7sAoYNKpqsandbox
11owner recover usdcowner.sandbox → mandate.sandbox.recoversuccessexecuted, not awaited to finalEtpZ9m9iv6phk22iBUib9g2cnsWP5LabJGoxdCo6RR2Jsandbox
12owner recover wnearowner.sandbox → mandate.sandbox.recoversuccessexecuted, not awaited to final5mrf9LEihYXvVU68GreZzRx2mKikjdarRGbEVSo4WJSRsandbox
13owner ft_withdraw usdc to its NEAR account (attempt 1)owner.sandbox → intents.sandbox.ft_withdrawsuccessexecuted, not awaited to finalGEBVoknGbGsKXJaKH5hMeZtWWeSftjJM7t5By5bQxJadsandbox
14owner storage_deposit on wnear tokenowner.sandbox → wnear.sandbox.storage_depositsuccessexecuted, not awaited to finalJ5Rj3menFxXwNfp5K9YYWSgxFm1mZNdBEfLc9UueBbc4sandbox
15owner ft_withdraw wnear to its NEAR account (attempt 1)owner.sandbox → intents.sandbox.ft_withdrawsuccessexecuted, not awaited to finalCBzmye2A7yeAMEsBTTENoZzw42Vz1Ybb77Xpu2VffDdysandbox
  • Sandbox execution only: MPC signer, oracle and tokens are labelled test doubles; the verifier is the pinned mainnet WASM.
  • No mainnet execution in this run; network latency on mainnet is not represented by sandbox timing.
  • The console review and the revocation run in headless Chromium with owner controls via the local sandbox test signer (not a wallet); no external wallet is exercised.
  • Concession bounds, randomized interleavings and breaker behaviour are covered by the Rust gate tests, not by this story.
  • A recorded model response was replayed. The claude-cli harness may add context that the recording cannot show.

About this console

  • No backend, no keys. This page is one static file. It holds no private key and no model credential; it reads public RPC state and hands transactions to a signer outside the page.
  • Two sources, never mixed. “Live” values come from the RPC you chose, after its genesis check, at one final block. “Recorded” values come from a sandbox run's evidence file. Neither is ever substituted for the other.
  • Signing adapters. External wallets connect through NEAR Connect (pinned library, in-page wallet list, adapters pinned by commit; see fixtures/wallets/near-connect.json). The local sandbox test signer is a local sandbox adapter, not a wallet. It is offered only when this page is served by tools/src/console/serve.ts, signs with a sandbox key in a Node process on this machine, refuses other chains and signs only the owner calls this console offers on the served deployment. The manual handoff shows the exact near CLI command and tracks the hash you paste.
  • Which wallets are verified. The NEAR Connect path (wallet list, sandboxed adapter, signature request, cancel, hash import) is tested end to end in a local sandbox with the labelled SANDBOX TEST WALLET only. No real wallet provider has signed through this console yet: compatibility with the owner's actual wallet is an owner-assisted check, and nothing here claims it.
  • Wallet adapters' own storage. An adapter granted storage keeps its session data in this site's browser storage under its wallet id. That is the wallet's data, not a key held by this page's code.
  • The runner verifies. The handoff record (intent sha256, transaction hash, signer) is imported by the runner, which checks the chain, signer, key, receiver, every action and argument, the receipt tree and the end state. The console's own final-state display is a convenience, not that verification.
  • Never resubmitted. With the local test signer, a cancelled signature or a rejected transaction leaves nothing pending. A wallet's rejection or closed window stays pending until you forget it, because a wallet's error cannot prove that nothing was sent. A reload during a pending action resumes polling only.