{
  "type": "https://eips.ethereum.org/EIPS/eip-8004#registration-v1",
  "name": "Letterlock memory agent",
  "description": "Seals notes to a Letterlock address on Monad, and answers tasks sealed to it. POST /remember {to, text} reads the recipient's passkey-derived X25519 key from the Letterlock directory (keyOf or keyOfAgent), seals the text to it with HPKE (RFC 9180) and drops the envelope on the directory from the agent's own wallet: only the recipient's passkey, on any device it syncs to, can open it. POST /task {from, envelope} opens a task sealed to agent:10260 with the agent's own key and drops an answer sealed to the address named inside the task. Sealed notes are opaque to this agent after sending: it keeps no copy and cannot open what it sealed.",
  "image": "https://letterlock-agent.vercel.app/icon.svg",
  "services": [
    {
      "name": "web",
      "endpoint": "https://letterlock-agent.vercel.app/"
    },
    {
      "name": "seal-a-memory",
      "endpoint": "https://letterlock-agent.vercel.app/remember",
      "method": "POST",
      "version": "1"
    },
    {
      "name": "answer-a-sealed-task",
      "endpoint": "https://letterlock-agent.vercel.app/task",
      "method": "POST",
      "version": "1"
    },
    {
      "name": "health",
      "endpoint": "https://letterlock-agent.vercel.app/health",
      "method": "GET"
    }
  ],
  "x402Support": false,
  "active": true,
  "registrations": [
    {
      "agentId": 10260,
      "agentRegistry": "eip155:143:0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
    }
  ],
  "url": "https://letterlock-agent.vercel.app/",
  "version": "1.0.0",
  "provider": {
    "organization": "Letterlock",
    "url": "https://github.com/edycutjong/letterlock"
  },
  "documentationUrl": "https://letterlock-agent.vercel.app/",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false
  },
  "defaultInputModes": ["application/json"],
  "defaultOutputModes": ["application/json"],
  "skills": [
    {
      "id": "seal-a-memory",
      "name": "Seal a memory",
      "description": "POST /remember with {\"to\": \"0x…\" or \"agent:<id>\", \"text\": at most 1000 characters}. One keyOf / keyOfAgent read resolves the recipient's key; the text is sealed to it (HPKE base mode: X25519, HKDF-SHA256, ChaCha20-Poly1305) and the envelope is dropped on the Letterlock directory. Answers 200 {envelope, dropTx, kid, epoch, directory}. A recipient without a published key gets nothing (422 NO_KEY_PUBLISHED).",
      "tags": ["encryption", "hpke", "passkey", "webauthn-prf", "monad", "letterlock"],
      "examples": [
        "curl -X POST https://letterlock-agent.vercel.app/remember -H 'content-type: application/json' -d '{\"to\":\"0x…\",\"text\":\"the dentist moved to Thursday 10:40\"}'"
      ],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    },
    {
      "id": "answer-a-sealed-task",
      "name": "Answer a sealed task",
      "description": "POST /task with {\"from\": \"0x…\" or \"agent:<id>\", \"envelope\": an envelope sealed to agent:10260}. Seal to the key keyOfAgent(10260) returns. Inside the seal: JSON {\"v\": 1, \"replyTo\": the same as from, \"nonce\": 32 hex digits, \"issuedAt\": unix seconds (at most 600 s old), \"text\": at most 1000 characters}. The agent opens it with its own key and drops an answer sealed to replyTo, quoting the task's first 80 characters with the SHA-256 of all of it. It answers only the address sealed inside the task, and each nonce once per server instance (for 12 minutes). Every refusal of a task that opened is one code, TASK_REFUSED, so a copied task tells whoever posts it nothing about what is sealed in it.",
      "tags": ["agent-to-agent", "hpke", "erc-8004", "monad", "letterlock"],
      "examples": [
        "node examples/agent-memory/scripts/call.ts task --from 0x… --text \"what did I ask you to remember?\""
      ],
      "inputModes": ["application/json"],
      "outputModes": ["application/json"]
    }
  ],
  "letterlock": {
    "chainId": 143,
    "directory": "0xA25BBACAb3fD2e71da1Aa002e54965B488d64b7e",
    "identityRegistry": "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432",
    "recipient": "agent:10260",
    "agentKey": {
      "read": "keyOfAgent(10260) on the directory",
      "epoch": 2,
      "publicKey": "0xa38ed883578ddcf912a3d20f2f698ea3f15c00339c1656714402594db6324806",
      "kid": "e5b30e2e52ec0dec",
      "publishTx": "0x072dc08d72aefacbe3fe05fedd2296c857c1181fbfa9f548c7ed9322594c294b",
      "derivation": "The Letterlock agent key (docs/SPEC.md §2) over a WebAuthn-style PRF of a 32-byte seed that only this agent's host holds: prf = HMAC-SHA256(seed, SHA-256(\"WebAuthn PRF\" ‖ 0x00 ‖ agentSalt(10260, epoch))).",
      "previous": "Epoch 1 (kid 2fc259671e68693d) is the deploy smoke test's demo key. This agent does not hold it and refuses tasks sealed to it."
    },
    "wallet": "0xDE8a4A3c3bE2802bf9Be78cfC1de1a5a0A4c47a4",
    "sealedNotes": "Sealed notes are opaque to this agent after sending: it seals to the recipient's published key, keeps no copy, and cannot open them. The only envelopes it opens are tasks sealed to agent:10260.",
    "limits": {
      "textMaxChars": 1000,
      "postsPerIp": "5 POST requests per 10 minutes per IP, at Vercel's firewall (fixed window, counted per region)",
      "dropsPerIp": "5 per 10 minutes and 20 per day, counted in each server instance's memory: best effort, since instances do not share it",
      "dropsPerDay": "at most 150, and no more than 25% of the wallet pays for at the most a drop can cost (maxDropGas at the price a drop pays: the base fee plus its priority fee); checked when each drop is signed, by its nonce, so every instance counts the same drops",
      "maxDropGas": 250000,
      "gasReserveMON": "0.1: no drop is signed whose own cost at its fee cap (gas × maxFeePerGas) would take the wallet below it",
      "taskNonce": "each nonce is answered once per server instance, for 12 minutes",
      "browserOrigins": ["https://letterlock-app.vercel.app", "https://letterlock-agent.vercel.app"],
      "killSwitch": "AGENT_ENABLED"
    },
    "explorer": "https://monadvision.com/address/0xA25BBACAb3fD2e71da1Aa002e54965B488d64b7e"
  }
}
