Letterlock memory agent
ERC-8004 agent #10260 on Monad mainnet
It seals notes to a person's Letterlock address: it reads their passkey-derived key from the Letterlock directory on Monad, encrypts to it with HPKE and drops the envelope onchain. Only their passkey, on any device it syncs to, can open it. Once a note is sent, the agent cannot open it either.
/health.
- Wallet
- Drops today
- Agent key
Seal a memory
Name a recipient (an address, or agent:<id>) and up to 1,000 characters. The agent resolves the
recipient's key with one keyOf / keyOfAgent read, seals the text to it and drops it on
the directory. A recipient without a published key gets nothing.
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"}'
Answers { envelope, dropTx, kid, epoch, directory }. The recipient finds the envelope in
their inbox (the directory's Dropped logs) and opens it with one passkey prompt.
Send it a sealed task
Another agent, or anyone, seals a task to agent:10260 with the key keyOfAgent(10260)
returns, and posts it with the address to answer. The agent opens it with its own key and drops an answer sealed
to that address, quoting the task's first 80 characters with the SHA-256 of all of it.
POST /task
{ "from": "0x… or agent:<id>",
"envelope": { …sealed to agent:10260… } }
inside the seal:
{ "v": 1, "replyTo": "<the same as from>", "nonce": "<32 hex digits>",
"issuedAt": <unix seconds>, "text": "<at most 1,000 characters>" }
The reply address is sealed inside the task, so a copied task posted with another from
is refused. Every refusal of a task that opened is one answer, TASK_REFUSED, so a copy tells whoever
posts it nothing about what is sealed inside. Each nonce is answered once per server instance, for 12 minutes: the
nonces live in each instance's memory.
What it never sees
- What it sealed. It seals to the recipient's published key and keeps no copy.
- Anything in its logs but the route, the status, an error code, the drop's transaction and its size: no text, no envelope, no address, no IP.
Limits
- 1,000 characters per note or task, 16 KiB per request.
- 5 POST requests per 10 minutes from one IP, at Vercel's firewall (counted per region), so every server instance shares it. Behind it, 5 drops per 10 minutes and 20 per day from one IP, counted in each server instance's memory: best effort, since instances do not share it.
- Each day (UTC), at most 150 drops, and no more than a quarter of the wallet pays for at the most a drop can cost (250,000 gas at the price drops pay). The wallet checks this on each drop as it signs it, by the drop's own nonce, so every instance counts the same drops.
- It keeps 0.1 MON for gas: it signs no drop whose own cost, at its fee cap, would take the wallet below that.
- Web pages may ask it to send only from the Letterlock app and this page. Servers and other agents are not affected.
- A kill switch (
AGENT_ENABLED) turns every endpoint that sends anything off.
- ERC-8004 agent
- #10260, registry
0x8004A169…a432 - Agent key
keyOfAgent(10260), epoch 2, kide5b30e2e52ec0dec: published by the agent's owner. Epoch 1 was a demo key from the deploy smoke test; the agent does not hold it.- Directory
0xA25BBACAb3fD2e71da1Aa002e54965B488d64b7e- Agent card
/.well-known/agent-card.json- Health
/health