Skip to content
LogoLogo

Nava Guardian policy model

Developer Preview

A Nava Guardian policy is a concrete, versionless document attached to a versioned service record. The active version is resolved for the agent when Nava Guardian evaluates a proposed action.

Concrete document shape

{
  "presetId": "spot-swapper",
  "sanctionsList": [],
  "perTxCapUsd": 1000,
  "max24hOutflowUsd": 10000,
  "venues": {
    "uniswap": {
      "chainAllowlist": [11155111],
      "assetUniverse": [
        {
          "chainId": 11155111,
          "address": "0x1111111111111111111111111111111111111111"
        }
      ],
      "recipientAllowlist": [
        "0x2222222222222222222222222222222222222222"
      ],
      "contractAllowlist": [
        {
          "address": "0x3333333333333333333333333333333333333333",
          "selectors": ["0x12345678"],
          "label": "Placeholder router"
        }
      ],
      "allowedSides": {
        "placeholder-asset": ["BUY", "SELL"]
      }
    }
  }
}

All values above are placeholders, not a recommended policy.

Root and shared fields

FieldTypeRules
presetIdstringRequired. Identifies the preset used to fill the policy.
sanctionsListaddress[]Required in the concrete document. Addresses pass the policy address validator.
perTxCapUsdnumberRequired and non-negative.
max24hOutflowUsdnumberRequired and non-negative; must be greater than or equal to perTxCapUsd.
venuesobjectRequired, strict, and must contain at least one supported venue block. A venue is allowed only when its block is present.

The root object, venue map, venue blocks, chain-scoped address objects, and contract-allowlist entries are strict objects: unknown keys are rejected. The allowedSides and maxExposurePerProtocol maps intentionally accept venue-native string keys.

EVM address fields use the service's EIP-55 address validator and are normalized with getAddress; a non-address or wrong-checksum mixed-case value is rejected. Function selectors must match a four-byte 0x-prefixed hexadecimal value.

Uniswap venue block

FieldTypeRequiredRules
chainAllowlistinteger[]YesEVM chain IDs.
assetUniverse{chainId, address}[]YesEach asset is identified by integer chain ID and token contract address, not a symbol.
recipientAllowlistaddress[]YesAllowed effective recipients.
contractAllowlist{address, selectors, label?}[]NoEach entry has an address, selector array, and optional label.
allowedSidesrecord of side arraysNoValues use BUY, SELL, LONG, or SHORT.

Hyperliquid venue block

FieldTypeRequiredRules
networkmainnet or testnetYesPins the policy to one Hyperliquid environment.
assetUniversestring[]YesVenue-native market symbols, not asset indexes.
allowedSidesrecord of side arraysNoValues use BUY, SELL, LONG, or SHORT.
maxPortfolioLeveragenumberYesRequired and non-negative.
maxExposurePerProtocolrecord of numbersNoOptional venue exposure caps.

The entire Hyperliquid policy and evaluation path is Developer Preview.

Authoring and versioning

The Developer Preview write model accepts a sparse preset overlay rather than an arbitrary concrete document. It exposes presetId, optional shared cap overrides, and optional Uniswap or Hyperliquid overrides. Omitted values inherit the preset; fixed preset values such as sanctionsList and some contract fields are retained. An override cannot add a venue that is absent from the selected preset.

Policy documents do not contain their own version. A write returns { policyId, version, document }; an active-policy read returns { version, document }; and each version-history entry returns { version, document, createdAt, active }. A write appends a version, activation moves the active pointer to an existing version, and copying creates an independent version for the target agent.

Policy management is a dashboard and UI-session operation in this preview: writes require a Privy bearer session, and agent API keys cannot read or write their policy. Do not include a policy document in POST /transactions; configure and activate it before submitting the proposed action.