InterlockC6 dashboard
static snapshotchain 84532wallet 0xe7f1…0512registry 0x5fc8…5707

Passports / 12-graph-two-hop

Vandelay: vendor two hops from a bad actor, held for review

BLOCKED
G23 GRAPH_RISK_REVIEW · decision Review · decided by gateway

Gateway's explanation (attested, not verifiable): NEEDS APPROVAL. Risk graph: the vendor Vandelay Industries (0x1000…0005) reaches a known bad actor in 2 hops: Vandelay Industries -> Vandelay Router Contract -> Known Bad Actor. Send this explanation to the approver. If they sign this exact payment, resubmit it with their signature. What the transaction does: pay 6.00 mUSDC from the Interlock wallet to Vandelay Payouts (0x2000…0005), for invoice "INV-5001" (agent-supplied) from Vandelay Industries (0x1000…0005). This is at or below the 15.00 mUSDC review threshold, but the risk graph requires the approver's signature anyway. The payment expires at 2026-11-01 00:38:22 UTC.

Passport hash0x24b6975bae731e2171e97cb125289aca145933b46cc4fe8d0993cc81270194bf
Issued by0xbb50b6623454712be08befecb0b78b9ec7d16086 at 2026-11-01 00:08:22 UTC
C7 registryattested · tx 0x6ed89e…a91bc1 · block 36

Verification run in your browser, offline (static deployment)

VERIFYING…

Decoded transaction

Callexecute(Payment, bytes approverSig)
To (wallet)0xe7f1725e7734ce288f8367e1bb143e90bb3f0512
Value0 wei
Payment.toVandelay Payouts (0x2000…0005)
Payment.amount6.00 (6000000 units)
Payment.token0x5fbdb2315678afecb367f032d93f642f64180aa3
Payment.nonce10 (agent range)
Payment.deadline2026-11-01 00:38:22 UTC
Payment.invoiceHash0x0a13676781e8c448ac9db0476f8e4c31d07b1070042e150aeefd3014da928285
approverSig(empty)
On-chainnot sent
Calldata (260 bytes)
0xbd57de2300000000000000000000000020000000000000000000000000000000000000050000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa300000000000000000000000000000000000000000000000000000000005b8d80000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000006ae689fe0a13676781e8c448ac9db0476f8e4c31d07b1070042e150aeefd3014da92828500000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000

Raw invoice bound to calldata

Agent-supplied and untrusted: shown as inert text. This is the exact canonical byte string whose keccak256 is the invoiceHash.

{"amount":"6000000","invoice_id":"INV-5001","memo":"Import fees","payee":"0x2000000000000000000000000000000000000005","vendor":"0x1000000000000000000000000000000000000005"}
invoice_idINV-5001
vendor0x1000000000000000000000000000000000000005
payee0x2000000000000000000000000000000000000005
amount6000000 = 6.00
memoImport fees
keccak2560x0a13676781e8c448ac9db0476f8e4c31d07b1070042e150aeefd3014da928285

Mandate v2 0x243484de…465daae1diff vs v1

Fields: v1 → v2

Fieldv1v2Enforced by
vendors0x1000…0001, 0x1000…0002, 0x1000…00060x1000…0001, 0x1000…0002, 0x1000…0006, 0x1000…0003, 0x1000…0004, 0x1000…0005
+ 0x1000…0003
+ 0x1000…0004
+ 0x1000…0005
C4 only
vendorPayees0x2000…0001, 0x2000…0002, 0x2000…00060x2000…0001, 0x2000…0002, 0x2000…0006, 0x2000…0003, 0x2000…0004, 0x2000…0005
+ 0x2000…0003
+ 0x2000…0004
+ 0x2000…0005
C4 + C5
token0x5fbd…0aa30x5fbd…0aa3C4 + C5
maxTx20.0025.00C4 + C5
reviewThreshold15.0015.00C4 + C5
taskBudget100.0080.00C4 counter; C5 via M6
bucketCapacity40.0040.00C5
refillRate99 units/s (8.5536/day)99 units/s (8.5536/day)C5
maxValidity7 d3 dC4 + C5
expiry2026-11-08 00:00:04 UTC2026-11-04 00:05:45 UTCC4 + C5
issuedAt2026-11-01 00:00:04 UTC2026-11-01 00:05:45 UTCC4 + C5
chainId8453284532C5
version12C4 only
nonce12C5 (minNonce)

This payment against the mandate

CheckPaymentMandateRule
✓ token0x5fbd…0aa30x5fbd…0aa3G07 / C5
✓ payee ∈ vendorPayees0x2000…00056 allowedG10 / C5
✓ vendor ∈ vendors0x1000…00056 allowedG09 (C4 only)
✓ 0 < amount ≤ maxTx6.0025.00G11 / C5
✓ tierAllowthreshold 15.00G13/G16 / C5
✓ deadline2026-11-01 00:38:22 UTCmandate expiry 2026-11-04 00:05:45 UTCG12 / C5

Display only. The gateway (GW-1) and the wallet decide; this table restates their limits. The task-budget counter and the bucket depend on history and are not recomputed here.

Risk graph graph engine · py/interlock_gateway/graph.py

The same in-memory graph the gateway queries before it signs (rules G22 Block, G23 Review). Directed edges, shortest path to a known bad actor: the address itself or one edge away is Block, two or more is Review, none within 6 is Allow, an unreachable graph is Review. It knows only what its operator file says; Allow means “no known link”, not “safe”.

Vendor / walletContractKnown bad actorsource: passport (recorded at decision)

At decision time (attested in the passport)

REVIEW vendor 0x1000…0005 · reaches a known bad actor in 2 hops
Vandelay Industries 0x1000…0005—DEPLOYED→Vandelay Router Contract 0xc000…0005—FORWARDS_TO→Known Bad Actor 0x0000…ad01

Live query not available: this is a static deployment with no graph service. The result above is the one the gateway recorded at decision time.

Labels come from the operator's graph file; payee and vendor names elsewhere on this page come from the address book.

What the agent read demo context · not attested

mail-5001 · email: billing@vandelay.example
Vandelay import fees, INV-5001, 6.00 USDC.

Raw passport

Show the JSON exactly as issued (4,649 canonical bytes)
{
  "body": {
    "kind": "interlock.verification-passport",
    "version": "1",
    "chain": {
      "chain_id": "84532",
      "wallet": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
      "registry": "0x5fc8d32690cc91d4c39d9d3abcbd16989f875707"
    },
    "issuer": "0xbb50b6623454712be08befecb0b78b9ec7d16086",
    "issued_at": "1793491702",
    "request": {
      "tx": {
        "to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
        "data": "0xbd57de2300000000000000000000000020000000000000000000000000000000000000050000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa300000000000000000000000000000000000000000000000000000000005b8d80000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000006ae689fe0a13676781e8c448ac9db0476f8e4c31d07b1070042e150aeefd3014da92828500000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000",
        "value": "0"
      },
      "claim": {
        "invoice": {
          "invoice_id": "INV-5001",
          "vendor": "0x1000000000000000000000000000000000000005",
          "payee": "0x2000000000000000000000000000000000000005",
          "amount": "6000000",
          "memo": "Import fees"
        }
      }
    },
    "decoded": {
      "payment": {
        "to": "0x2000000000000000000000000000000000000005",
        "token": "0x5fbdb2315678afecb367f032d93f642f64180aa3",
        "amount": "6000000",
        "nonce": "10",
        "deadline": "1793493502",
        "invoiceHash": "0x0a13676781e8c448ac9db0476f8e4c31d07b1070042e150aeefd3014da928285"
      },
      "approver_sig": ""
    },
    "mandate": {
      "schema_version": "3",
      "primaryType": "Mandate",
      "domain": {
        "name": "InterlockWallet",
        "version": "1",
        "chainId": "84532",
        "verifyingContract": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512"
      },
      "message": {
        "vendors": [
          "0x1000000000000000000000000000000000000001",
          "0x1000000000000000000000000000000000000002",
          "0x1000000000000000000000000000000000000006",
          "0x1000000000000000000000000000000000000003",
          "0x1000000000000000000000000000000000000004",
          "0x1000000000000000000000000000000000000005"
        ],
        "vendorPayees": [
          "0x2000000000000000000000000000000000000001",
          "0x2000000000000000000000000000000000000002",
          "0x2000000000000000000000000000000000000006",
          "0x2000000000000000000000000000000000000003",
          "0x2000000000000000000000000000000000000004",
          "0x2000000000000000000000000000000000000005"
        ],
        "token": "0x5fbdb2315678afecb367f032d93f642f64180aa3",
        "maxTx": "25000000",
        "reviewThreshold": "15000000",
        "taskBudget": "80000000",
        "bucketCapacity": "40000000",
        "refillRate": "99",
        "maxValidity": "259200",
        "expiry": "1793750745",
        "chainId": "84532",
        "version": "2",
        "nonce": "2",
        "issuedAt": "1793491545"
      },
      "digest": "0x243484de24d070cf8b343b5a8e0cbc2e685c698170d0e2dd44547f74465daae1",
      "signature": "0x0216958bdf56a2d43908c273f856ba393395789e1bfe1e2c96fd4b4ce2a0b19d6f08bc267c5502b9695db25e2f20495537f49b880c3974e2e691027eb2c96af11c"
    },
    "digests": {
      "mandate": "0x243484de24d070cf8b343b5a8e0cbc2e685c698170d0e2dd44547f74465daae1",
      "payment": "0x70cbecc74f306c5c1d94ae57a7e876b9ecf9140897d73e051e6088bb0d7bff05",
      "invoice": "0x0a13676781e8c448ac9db0476f8e4c31d07b1070042e150aeefd3014da928285"
    },
    "verdict": {
      "rule_id": "G23",
      "rule": "GRAPH_RISK_REVIEW",
      "decision": "Review",
      "deciding_layer": "gateway",
      "outcome": "Blocked",
      "explanation": "NEEDS APPROVAL. Risk graph: the vendor Vandelay Industries (0x1000…0005) reaches a known bad actor in 2 hops: Vandelay Industries -> Vandelay Router Contract -> Known Bad Actor. Send this explanation to the approver. If they sign this exact payment, resubmit it with their signature. What the transaction does: pay 6.00 mUSDC from the Interlock wallet to Vandelay Payouts (0x2000…0005), for invoice \"INV-5001\" (agent-supplied) from Vandelay Industries (0x1000…0005). This is at or below the 15.00 mUSDC review threshold, but the risk graph requires the approver's signature anyway. The payment expires at 2026-11-01 00:38:22 UTC.",
      "detail": "the vendor Vandelay Industries (0x1000…0005) reaches a known bad actor in 2 hops: Vandelay Industries -> Vandelay Router Contract -> Known Bad Actor",
      "wallet_error": null
    },
    "execution": null,
    "graph": {
      "address": "0x1000000000000000000000000000000000000005",
      "verdict": "Review",
      "hops": "2",
      "path": [
        {
          "address": "0x1000000000000000000000000000000000000005",
          "kind": "wallet",
          "label": "Vandelay Industries",
          "via": null
        },
        {
          "address": "0xc000000000000000000000000000000000000005",
          "kind": "contract",
          "label": "Vandelay Router Contract",
          "via": "DEPLOYED"
        },
        {
          "address": "0x00000000000000000000000000000000000bad01",
          "kind": "bad_actor",
          "label": "Known Bad Actor",
          "via": "FORWARDS_TO"
        }
      ],
      "reason": "reaches a known bad actor in 2 hops",
      "path_text": "Vandelay Industries -> Vandelay Router Contract -> Known Bad Actor",
      "available": true,
      "role": "vendor",
      "summary": "the vendor Vandelay Industries (0x1000…0005) reaches a known bad actor in 2 hops: Vandelay Industries -> Vandelay Router Contract -> Known Bad Actor"
    }
  },
  "passport_hash": "0x24b6975bae731e2171e97cb125289aca145933b46cc4fe8d0993cc81270194bf",
  "anchor": {
    "kind": "attest",
    "registry": "0x5fc8d32690cc91d4c39d9d3abcbd16989f875707",
    "attester": "0xbb50b6623454712be08befecb0b78b9ec7d16086",
    "tx_hash": "0x6ed89e52350b7e5385158983ef3235c2c83a6dcf5978331e3c346971fba91bc1",
    "block_number": "36"
  }
}