Product

A mandate is a law, not a route

Waypoint-class permissioning with a different centre of gravity: the rule comes first, the agent second. Nothing here can move value until a mandate exists, simulates cleanly, and you sign it.

The composer

  1. Step 1

    Purpose

    State the outcome you want and the outcome you refuse.

  2. Step 2

    Mode

    Observe, Propose, or Execute. Propose is the default.

  3. Step 3

    Actions

    Pick from the directory. Each carries a contract and selector.

  4. Step 4

    Limits

    Total, daily, and per-call caps, cooldown, max slippage, expiry.

  5. Step 5

    Recipients

    Locked to your own smart account in the prototype.

  6. Step 6

    Timing

    Cadence, cooldown, and the moment authority ends.

  7. Step 7

    Review

    Simulate, inspect the diff in the Witness step, then sign once.

Invariants

  • Any edit after a simulation invalidates it. A stale simulation cannot be signed.
  • Write actions stay disabled until an approved mandate names them explicitly.
  • The recipient is your own smart account and cannot be changed in the prototype.
  • Stock Token write actions are off behind a legal and eligibility flag.
  • Every write path emits an immutable audit event.

Example compiled policy

noli.policy/1
{
  "version": "noli.policy/1",
  "mode": "execute",
  "chainId": 4663,
  "network": "Robinhood Chain mainnet",
  "owner": "0x…  your connected wallet",
  "recipient": "0x…  locked at signing time",
  "asset": {
    "address": null,
    "symbol": "ETH",
    "decimals": 18
  },
  "limits": {
    "totalCap": "1.0",
    "dailyCap": "0.25",
    "perCallCap": "0.05",
    "cooldownSeconds": 3600,
    "maxSlippageBps": 50,
    "expiry": "ISO-8601 timestamp"
  },
  "actions": [
    {
      "slug": "transfer.native",
      "selector": null
    },
    {
      "slug": "read.nativeBalance"
    }
  ],
  "signature": "EIP-712 signature over this grant, produced by your wallet",
  "corpus": {
    "datasetVersion": "not-connected",
    "policyHashAnchored": false
  }
}

Action directory

Robinhood Chain

Read native ETH balance

Read
VerifiedLow riskMonitor
Target contract
— (eth_getBalance)
Function selector
Input schema
{ "account": "address" }
Calls
live RPC

ERC-20

Read ERC-20 balance

Read
VerifiedLow riskMonitor
Target contract
any ERC-20 you add
Function selector
0x70a08231
Input schema
{ "token": "address", "account": "address" }
Calls
live RPC

Robinhood Chain

Read chain head and gas price

Read
VerifiedLow riskMonitor
Target contract
— (eth_blockNumber, eth_gasPrice)
Function selector
Input schema
{}
Calls
live RPC

Robinhood Chain

Transfer native ETH to the locked recipient

Write
VerifiedHigh riskTransfer
Target contract
— (direct value transfer)
Function selector
Input schema
{ "to": "address", "value": "uint256" }
Calls
signed per call

ERC-20

Transfer ERC-20 to the locked recipient

Write
VerifiedHigh riskTransfer
Target contract
any ERC-20 you add
Function selector
0xa9059cbb
Input schema
{ "token": "address", "to": "address", "amount": "uint256" }
Calls
signed per call