Docs / Intent drift check

How do I detect parameter drift in an unsigned agent transaction?

Meridian by MioDio's POST /v1/drift compares optional intent to an unsigned tx or EIP-712 payload and answers match, drift, or cannot_verify for $0.005 USDC on Base. Without intent it decodes common typed-data patterns and gives back risk_flags; a match is not a guarantee.

With intent vs decode-only

Request body shape

JSON body required. anyOf requires one of tx, typed_data, or eip7702_authorization.

Properties: chain (base or ethereum), optional intent, tx, typed_data, eip7702_authorization (object or array).

Decoder caps (OpenAPI): body at most 20480 chars; tx.data at most 8192 bytes; typed JSON depth at most 8, nodes at most 200, object keys at most 32, array length at most 16; type/field/primaryType names at most 64 chars; array suffix depth at most 4; wei at most 2^256-1; eip7702_authorization length at most 16.

Call it (curl + free demo)

curl -s "https://meridian.miodiollc.com/v1/demo/drift"

curl -i -X POST "https://meridian.miodiollc.com/v1/drift" \
  -H 'content-type: application/json' \
  -d '{
    "chain": "base",
    "intent": {
      "action": "transfer",
      "recipient": "0x0000000000000000000000000000000000000001",
      "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "amount": "1000000",
      "expected_contract": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
    },
    "tx": {
      "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "value": "0x0",
      "data": "0xa9059cbb000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000f4240",
      "chainId": 8453
    }
  }'

Unpaid -> HTTP 402 + PAYMENT-REQUIRED. Oversize body -> 400 before payment.

Price

$0.005 USDC on Base (~5000 atomic). Network eip155:8453. Asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913. payTo 0x4DA1ED782BD61BaE9AdD5a5CaBbCf32f767f8d7F.

Caps and errors

See decoder caps above. Oversize drift body is 400 before payment. Invalid input after a payment header is 400 and not settled.

Response (demo, trimmed)

{
  "card": "parameter_drift",
  "status": "ok",
  "chain": "base",
  "verdict": "drift",
  "diffs": [
    {
      "field": "recipient",
      "intended": "0x0000000000000000000000000000000000000001",
      "actual": "0x0000000000000000000000000000000000000002",
      "severity": "high"
    }
  ],
  "decoded": {
    "selector": "0xa9059cbb",
    "function": "transfer",
    "kind": "erc20_transfer",
    "token": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "recipient": "0x0000000000000000000000000000000000000002",
    "amount": "1000000",
    "unlimited": false
  },
  "flags": ["recipient_differs"],
  "risk_flags": []
}

verdict is the answer. diffs lists each field that disagrees. A paid answer may also carry a signed Meridian-Receipt header.

What it does NOT do

Unpaid calls return HTTP 402 with PAYMENT-REQUIRED. Retry with PAYMENT-SIGNATURE.

FAQ

Does drift run the transaction?
No. It compares and decodes only. It never signs or moves funds.
Is a match a guarantee?
No. OpenAPI states a match is not a guarantee.
What typed data can it decode without intent?
Permit, Permit2, DAI, CoW, Seaport, or EIP-7702. Unknown primaryType is UNDECODED_CAUTION.
What happens on an oversize body?
Oversize drift or simulate body is HTTP 400 before payment.

Related