Passports / 13-graph-approved
Same payment, released by the approver after reading the path
Gateway's explanation (attested, not verifiable): ALLOWED. All checks passed and the simulation succeeded. After this payment, spending under the mandate will be 18.00 of 80.00 mUSDC. 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, so no approver signature is needed. The payment expires at 2026-11-01 00:38:22 UTC.
| Passport hash | 0xe6d92c0a270597d0230a75c9f1f963cf60a3114656824543d5642bcef09bdb13 |
| Issued by | 0xbb50b6623454712be08befecb0b78b9ec7d16086 at 2026-11-01 00:08:54 UTC |
| C7 registry | attested + anchored to the payment digest · tx 0x9df131…fc9fdb · block 39 |
Verification run in your browser, offline (static deployment)
VERIFYING…
Decoded transaction
| Call | execute(Payment, bytes approverSig) |
| To (wallet) | 0xe7f1725e7734ce288f8367e1bb143e90bb3f0512 |
| Value | 0 wei |
| Payment.to | Vandelay Payouts (0x2000…0005) |
| Payment.amount | 6.00 (6000000 units) |
| Payment.token | 0x5fbdb2315678afecb367f032d93f642f64180aa3 |
| Payment.nonce | 10 (agent range) |
| Payment.deadline | 2026-11-01 00:38:22 UTC |
| Payment.invoiceHash | 0x0a13676781e8c448ac9db0476f8e4c31d07b1070042e150aeefd3014da928285 |
| approverSig | 0x78e4f5d63b…88edbe481c |
| On-chain | tx 0xda36f5…9bb998 · block 38 · status 1 |
Calldata (356 bytes)
0xbd57de2300000000000000000000000020000000000000000000000000000000000000050000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa300000000000000000000000000000000000000000000000000000000005b8d80000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000006ae689fe0a13676781e8c448ac9db0476f8e4c31d07b1070042e150aeefd3014da92828500000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004178e4f5d63b37e143452a674957f368e08a37e98d48f1ccaa1f830eb74621d654618d8e043b89cb1490f0da8cedf21ec6b22f34e41991ece4688698b188edbe481c00000000000000000000000000000000000000000000000000000000000000
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_id | INV-5001 |
| vendor | 0x1000000000000000000000000000000000000005 |
| payee | 0x2000000000000000000000000000000000000005 |
| amount | 6000000 = 6.00 |
| memo | Import fees |
| keccak256 | 0x0a13676781e8c448ac9db0476f8e4c31d07b1070042e150aeefd3014da928285 |
Mandate v2 0x243484de…465daae1diff vs v1
Fields: v1 → v2
| Field | v1 | v2 | Enforced by |
|---|---|---|---|
| vendors | 0x1000…0001, 0x1000…0002, 0x1000…0006 | 0x1000…0001, 0x1000…0002, 0x1000…0006, 0x1000…0003, 0x1000…0004, 0x1000…0005 + 0x1000…0003 + 0x1000…0004 + 0x1000…0005 | C4 only |
| vendorPayees | 0x2000…0001, 0x2000…0002, 0x2000…0006 | 0x2000…0001, 0x2000…0002, 0x2000…0006, 0x2000…0003, 0x2000…0004, 0x2000…0005 + 0x2000…0003 + 0x2000…0004 + 0x2000…0005 | C4 + C5 |
| token | 0x5fbd…0aa3 | 0x5fbd…0aa3 | C4 + C5 |
| maxTx | 20.00 | 25.00 | C4 + C5 |
| reviewThreshold | 15.00 | 15.00 | C4 + C5 |
| taskBudget | 100.00 | 80.00 | C4 counter; C5 via M6 |
| bucketCapacity | 40.00 | 40.00 | C5 |
| refillRate | 99 units/s (8.5536/day) | 99 units/s (8.5536/day) | C5 |
| maxValidity | 7 d | 3 d | C4 + C5 |
| expiry | 2026-11-08 00:00:04 UTC | 2026-11-04 00:05:45 UTC | C4 + C5 |
| issuedAt | 2026-11-01 00:00:04 UTC | 2026-11-01 00:05:45 UTC | C4 + C5 |
| chainId | 84532 | 84532 | C5 |
| version | 1 | 2 | C4 only |
| nonce | 1 | 2 | C5 (minNonce) |
This payment against the mandate
| Check | Payment | Mandate | Rule |
|---|---|---|---|
| ✓ token | 0x5fbd…0aa3 | 0x5fbd…0aa3 | G07 / C5 |
| ✓ payee ∈ vendorPayees | 0x2000…0005 | 6 allowed | G10 / C5 |
| ✓ vendor ∈ vendors | 0x1000…0005 | 6 allowed | G09 (C4 only) |
| ✓ 0 < amount ≤ maxTx | 6.00 | 25.00 | G11 / C5 |
| ✓ tier | Allow | threshold 15.00 | G13/G16 / C5 |
| ✓ deadline | 2026-11-01 00:38:22 UTC | mandate expiry 2026-11-04 00:05:45 UTC | G12 / 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”.
At decision time (attested in the passport)
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
Raw passport
Show the JSON exactly as issued (4,748 canonical bytes)
{
"body": {
"kind": "interlock.verification-passport",
"version": "1",
"chain": {
"chain_id": "84532",
"wallet": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
"registry": "0x5fc8d32690cc91d4c39d9d3abcbd16989f875707"
},
"issuer": "0xbb50b6623454712be08befecb0b78b9ec7d16086",
"issued_at": "1793491734",
"request": {
"tx": {
"to": "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512",
"data": "0xbd57de2300000000000000000000000020000000000000000000000000000000000000050000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa300000000000000000000000000000000000000000000000000000000005b8d80000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000006ae689fe0a13676781e8c448ac9db0476f8e4c31d07b1070042e150aeefd3014da92828500000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004178e4f5d63b37e143452a674957f368e08a37e98d48f1ccaa1f830eb74621d654618d8e043b89cb1490f0da8cedf21ec6b22f34e41991ece4688698b188edbe481c00000000000000000000000000000000000000000000000000000000000000",
"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": "0x78e4f5d63b37e143452a674957f368e08a37e98d48f1ccaa1f830eb74621d654618d8e043b89cb1490f0da8cedf21ec6b22f34e41991ece4688698b188edbe481c"
},
"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": "G20",
"rule": "ALLOW",
"decision": "Allow",
"deciding_layer": "wallet",
"outcome": "Executed",
"explanation": "ALLOWED. All checks passed and the simulation succeeded. After this payment, spending under the mandate will be 18.00 of 80.00 mUSDC. 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, so no approver signature is needed. The payment expires at 2026-11-01 00:38:22 UTC.",
"detail": null,
"wallet_error": null
},
"execution": {
"tx_hash": "0xda36f52ba16b042464d3afc6ab1bb6eceaf4242b14d3830598fc2876f39bb998",
"block_number": "38",
"status": "1"
},
"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": "0xe6d92c0a270597d0230a75c9f1f963cf60a3114656824543d5642bcef09bdb13",
"anchor": {
"kind": "anchor",
"registry": "0x5fc8d32690cc91d4c39d9d3abcbd16989f875707",
"attester": "0xbb50b6623454712be08befecb0b78b9ec7d16086",
"tx_hash": "0x9df13149e44069dfdd9c0af3f7fc314db0fde1b60d8c6664ef65ca9d39fc9fdb",
"block_number": "39"
}
}