Mandate splits the agent from the authority. The agent runs in a TEE and proposes swaps. A NEAR smart contract holds the only key to the treasury on NEAR Intents, and signs a trade only after checking it against the owner's rules. This page states exactly what is built, what is proven on mainnet, and what is not done yet.
Each row names the mechanism that enforces the limit. "Nothing" means the limit is a promise, not a guarantee.
| Actor | Can | Cannot | Enforced by |
|---|---|---|---|
| Owner | Set the mandate, pause, unpause | Bypass the contract's checks on a trade, because trades go through the gates regardlessContract: set_mandate needs a full-access key and 1 yocto | |
| Agent (TEE, planned) | Propose a swap | Sign, withdraw, change the mandate, bypass a gate | Contract. The agent has no key. |
| Keeper (planned) | Trigger steps, delay a trade | Change a trade, sign anything | Contract. The signed bytes fix amounts, deadline and nonce. |
| Solver | Fill a signed trade at or above the minimum | Take more than the signed token_diff | NEAR Intents verifier |
| Signer (MPC) | Sign a payload the contract asks for | Be asked by anyone but the vault contract | Chain Signatures: the derived key is bound to the contract account |
| Anyone with agent access | Stop trading | Move funds | Contract (see the rows above) |
The trade passes two transactions by design: a decision, then an execution. Each step says whether it exists today.
Runs inside an OutLayer TEE, pinned by code hash. Results are returned to the contract by yield and resume.
Stale prices are rejected. Oracle feed format is still to be confirmed.
Exact 256-bit USD math. Each rule has boundary tests and a property test.
Proven: the same bytes built by the vault's code pass mainnet simulate_intents checks.
Proven on testnet: the signature is accepted by mainnet intents.near. The vault wiring is not done.
Not run for a real trade yet.
Only claims marked "proven" or "tested" have evidence you can rerun. The rest are plans.
| Claim | Status | Evidence |
|---|---|---|
| A contract can get an MPC signature that intents.near accepts as its own intent.R1 · part 2 | proven on mainnet | Testnet MPC signature, verified locally, then checked with simulate_intents on mainnet. Report: docs/spikes/R1.md. Rerun: spikes/r1-part2.sh |
| A payload built by the vault's own code passes signature, nonce and salt checks. | proven on mainnet | Valid V1 nonce with the live salt fails only on balance. A fake salt is rejected with invalid salt. Rerun: cargo run --release in spikes/r1-intents-signing |
| A tampered intent is rejected. | proven on mainnet | Payload changed after signing: invalid signature. Wrong verifying_contract: rejected. |
| Nine mandate gates reject each violation with a named code. | unit and property tests | Boundary tests per gate. A property test re-derives every rule for 20,000 random trades. A coverage guard checks that approvals and every rejection type occur. Rerun: cargo test -p mandate-vault engine:: |
| Owner controls work on a real chain: re-init blocked, non-owner rejected, pause and unpause. | sandbox test | Deployed to a local NEAR sandbox and called through transactions. Rerun: ./scripts/verify.sh --integration |
| The vault registers its MPC-derived key on the real intents.near contract, using predecessor auth. | sandbox test | The exact mainnet intents.near wasm runs in a local sandbox. The test reads the key back from it and refuses a second registration. The MPC signer there is a stand-in that enforces the call convention. Fixture check: scripts/fetch-intents-fixture.sh. Rerun: ./scripts/verify.sh --integration |
| The vault's trading flow runs end to end on a chain. | not yet | Milestone M3. No evidence exists yet, and none is claimed. |
| The agent runs in a verifiable TEE. | not yet | Milestone M4. No attestation exists yet. |
You need Rust (installed automatically from rust-toolchain.toml) and Python 3. No keys, no accounts, no funds.
The dashboard renders scenarios from fixed sample data. It does not query the chain, so use steps 1 and 2 to check the claims.
Commits, pull requests and the R1 report are in the repository. The repository is private until submission.
Verifier: intents.near · MPC signer: v1.signer. Anyone can read both on-chain.