Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
86 commits
Select commit Hold shift + click to select a range
f790dd1
feat: #216 agent cred-fetch — CLI consumer + real e2e (VERIFIED again…
hanwencheng Jun 6, 2026
5b8ebbd
feat: #216 cred-wire-demo.sh — the FULL agent-side wire e2e (VERIFIED…
hanwencheng Jun 6, 2026
c7e3922
feat: #216 phase1-wire Phase 4.0b — plant the VAULT-fetched key (env …
hanwencheng Jun 6, 2026
346ef5e
feat: #216 `agentkeys cred store` — symmetric store half + #204 daemo…
hanwencheng Jun 6, 2026
7978716
docs: #216 make operator-runbook-wire.md the single source of truth (…
hanwencheng Jun 7, 2026
a8bf1bd
docs: #216 fix Path A — the web app doesn't provision the agent device
hanwencheng Jun 7, 2026
0356793
docs+harness: #216 make wire runbook Path A / Path B fully independen…
hanwencheng Jun 7, 2026
e7ea8cf
docs: #216 fix Path A pairing command — --request-pairing requires --…
hanwencheng Jun 7, 2026
bc9cbd9
feat: #216 default the agent pairing broker to prod (no --broker-url …
hanwencheng Jun 7, 2026
c02e782
fix: #214 web pairing register 502 — daemon couldn't find heima-agent…
hanwencheng Jun 7, 2026
d2a7828
Merge branch 'main' of https://github.com/litentry/agentKeys into cla…
hanwencheng Jun 7, 2026
7c35770
style: rustfmt the merged ui_bridge.rs (register path-fix block)
hanwencheng Jun 7, 2026
39c78ca
feat: #224 pairing-card cross-verification — show device_key_hash + f…
hanwencheng Jun 7, 2026
1b3f903
ui: #224 relabel pairing card D_pub → 'device public address · verify…
hanwencheng Jun 7, 2026
a986ac1
ui: refresh paired-device list after accept so it shows without a man…
hanwencheng Jun 7, 2026
a2ba511
feat: #225 E7 — ERC-4337 accept-batch callData builders (atomic P.2+P.3)
hanwencheng Jun 7, 2026
f255e32
feat: #225 E7 — assemble the sponsored accept UserOp (broker composer)
hanwencheng Jun 7, 2026
eb3d1cf
feat: #225 E7 — accept-flow wire types (backend-client, #204 one-owner)
hanwencheng Jun 7, 2026
d597339
feat: #225 E7 — PackedUserOp→wire conversion + /v1/accept/build response
hanwencheng Jun 7, 2026
30ed570
docs: #225 E7 — scope the account-auth cutover + onboarding-as-account
hanwencheng Jun 7, 2026
1494982
docs: #225 — cutover spec reuses erc4337-register-master.sh; decouple…
hanwencheng Jun 7, 2026
0e86485
feat: #225 E7 — heima-cutover-account-auth.sh (the account-auth cutov…
hanwencheng Jun 7, 2026
877815d
fix: #225 — heima-cutover-account-auth.sh resolves RPC via agentkeys …
hanwencheng Jun 8, 2026
0dc4365
docs: #225 — account-auth cutover operator runbook (+ correct the pos…
hanwencheng Jun 8, 2026
07bcb59
docs: #225 — simplify cutover runbook (dev-only: cutover = 1-3, then …
hanwencheng Jun 8, 2026
e34aee7
feat: unpair button + ON-CHAIN device revoke (was local-only)
hanwencheng Jun 8, 2026
b2679ac
docs: arch.md §10.1a — canonical list of Touch-ID-gated (sensitive) o…
hanwencheng Jun 8, 2026
3e7f7e9
feat: #225 E7 (2b slice 1) — broker /v1/accept request type + pure pa…
hanwencheng Jun 8, 2026
063e71d
feat: #225 E7 (2b slice 2) — broker POST /v1/accept/build handler
hanwencheng Jun 8, 2026
00df4d3
feat: #225 E7 (2b slice 3) — broker POST /v1/accept/submit (handleOps…
hanwencheng Jun 8, 2026
07ff5c6
feat: #225 E7 (2b slice 4) — daemon /v1/accept/{build,submit} proxy r…
hanwencheng Jun 8, 2026
fff6bb8
feat: #225 E7 (2b slice 5) — browser Touch ID accept ceremony
hanwencheng Jun 8, 2026
fcd16e3
feat: #225 E7 — encode_webauthn_signature (the browser-assertion → Us…
hanwencheng Jun 8, 2026
7036cae
fix: heima-bring-up.sh FORCE_DEPLOY=1 now actually forces a redeploy …
hanwencheng Jun 8, 2026
06378f4
docs: cutover script — QUICK START + all session findings in the header
hanwencheng Jun 8, 2026
45f9856
docs: cutover operator runbook — Quick start block + session findings
hanwencheng Jun 8, 2026
4aaf30b
fix: don't blind-redeploy when expected code is live; enforce deploy→…
hanwencheng Jun 8, 2026
f3e2dfb
ci: enforce deployed-contracts.md ⊇ operator-workstation.env contract…
hanwencheng Jun 8, 2026
b08cc09
agentkeys: fold contract registry into the chain profile + record v0.1
hanwencheng Jun 8, 2026
89fecf4
docs: account-auth cutover runbook — add the accept-flow Solution (wa…
hanwencheng Jun 8, 2026
2fa0ffb
agentkeys: unsponsored accept keystone — /v1/accept/build works witho…
hanwencheng Jun 8, 2026
3ce646c
agentkeys: accept submit-encoding keystone — credId convention + brow…
hanwencheng Jun 8, 2026
077e89b
agentkeys: wire accept_submit — broker encodes the browser assertion …
hanwencheng Jun 8, 2026
8ab8ccf
agentkeys: paymaster route — VerifyingPaymaster deploy helper + heima…
hanwencheng Jun 8, 2026
05dbc2f
fix: heima-deploy-paymaster.sh — deploy via cast send --create, not f…
hanwencheng Jun 8, 2026
eb9cb18
agentkeys: wire the accept-flow broker env into setup-broker-host.sh …
hanwencheng Jun 8, 2026
0b90f5d
docs: runbook — extract the sponsor key VALUE (not cat ~/.zshenv) int…
hanwencheng Jun 8, 2026
8c00023
fix: heima-deploy-paymaster.sh — single --create value (cast variadic…
hanwencheng Jun 8, 2026
84086ec
fix: heima-deploy-paymaster.sh — cast send flags FIRST, --create LAST
hanwencheng Jun 8, 2026
f11a8a8
fix: heima-deploy-paymaster.sh — --gas-limit on deposit()/setBrokerSi…
hanwencheng Jun 8, 2026
c42a172
agentkeys: record VerifyingPaymaster 0xca3655… (deployed + funded, #2…
hanwencheng Jun 8, 2026
4b97652
docs: runbook — sponsored accept as 3 idempotent steps (local → broke…
hanwencheng Jun 8, 2026
bce6438
feat: heima-deploy-paymaster.sh auto-records + commits a fresh deploy
hanwencheng Jun 8, 2026
6331654
feat(ui): pairing requests show the real pairing code + a formatted t…
hanwencheng Jun 8, 2026
c049dd2
docs+ui: pairing identifiers spec + mark declared-vs-attested in the UI
hanwencheng Jun 8, 2026
c69c0e8
docs: coherent runbook rewrite — entry-script map + explicit broker-s…
hanwencheng Jun 8, 2026
8b3715f
fix: accept web demo — broker finds cast (502) + auto-select the mast…
hanwencheng Jun 8, 2026
5da309a
fix: real pairing decline (was UI-only) + broker auto-installs foundr…
hanwencheng Jun 8, 2026
1f0cf15
fix: setup-broker-host.sh finds cast under sudo (was missed → no copy…
hanwencheng Jun 8, 2026
1f0ea6b
fix: accept_submit handleOps — pin --gas-limit (Heima estimation reve…
hanwencheng Jun 8, 2026
72cd8cb
docs: heima-eth-gap.md — consolidated Heima↔Ethereum EVM gap inventor…
hanwencheng Jun 9, 2026
ab515ea
fix(accept): reject EOA master at /v1/accept/build + runbook drift di…
hanwencheng Jun 9, 2026
4c1b9bd
docs(plan): E7 onboarding → P256Account master (broker + daemon + web…
hanwencheng Jun 9, 2026
1c825fa
feat(chain): account-model first-master register (drop self-attestati…
hanwencheng Jun 9, 2026
852a03b
feat(daemon): two-phase passkey master register (E7 build->submit)
hanwencheng Jun 9, 2026
1b5b469
feat(web): onboarding binds a P256Account master (2nd Touch ID) + dev…
hanwencheng Jun 9, 2026
0efdffb
docs(plan): mark onboarding-P256Account implementation status (steps …
hanwencheng Jun 9, 2026
1df0840
style: cargo fmt --all (fix CI fmt check on the #225/E7 changes)
hanwencheng Jun 9, 2026
34b9e5f
feat(web): show each actor's on-chain account on the actor page (E7 s…
hanwencheng Jun 9, 2026
b20578f
chain: redeploy v0.2 (account-model registerFirstMasterDevice)
hanwencheng Jun 9, 2026
3d4f7c8
test(daemon): make audit-decode address assertion redeploy-proof
hanwencheng Jun 9, 2026
de4bbd1
fix(broker): contract addresses come from operator-workstation.env, n…
hanwencheng Jun 9, 2026
c5d222a
feat(web): idempotent passkey onboarding + master reset (the re-onboa…
hanwencheng Jun 9, 2026
6fbab72
feat(web): greppable [agentkeys] logs of account + signer passkey acr…
hanwencheng Jun 9, 2026
9b1d70d
feat(web): discoverable 'reset master' button on the master actor page
hanwencheng Jun 9, 2026
c5bd022
feat: owner-gated resetMaster — unbind a stranded master without rede…
hanwencheng Jun 9, 2026
eeb5cec
fix(dev.sh): rebuild daemon/mcp when the chain profile changes (post-…
hanwencheng Jun 9, 2026
e3e9d80
feat(dev.sh): log the chain profile version every run (+ redeploy-pen…
hanwencheng Jun 9, 2026
cb4f8d7
feat(dev.sh): --force flag to rebuild everything (bypass build caches)
hanwencheng Jun 9, 2026
84d5a0f
feat(ui): surface "reset master" in the nav menu under "log out"
hanwencheng Jun 9, 2026
4e002c1
chore(deploy): land the v0.3 full-set redeploy artifacts (heima.json …
hanwencheng Jun 9, 2026
1f0e3ff
fix: guard against the split-registry accept failure (commit deploy a…
hanwencheng Jun 9, 2026
e6725bc
feat(ui): make the two-Touch-ID onboarding self-explanatory (flow unc…
hanwencheng Jun 9, 2026
f3d242a
fix: lower master-register deposit 5→0.2 HEI + pre-flight deployer-ba…
hanwencheng Jun 9, 2026
dc5481b
fix(broker): accept verificationGasLimit 600k→1.5M (the real AA24 cau…
hanwencheng Jun 9, 2026
c248da3
fix(ui): ack the pending binding after accept so the request leaves t…
hanwencheng Jun 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,8 @@ same change** (the keep-the-docs-in-sync rule).

## Heima EVM compatibility level — keep `evm_version = "london"` in foundry.toml (but NOT because Heima is "London")

> **Migration index:** every Heima-vs-Ethereum EVM divergence the repo works around (this `evm_version` pin, the `eth_estimateGas`-reverts-on-`handleOps` gas-limit pins, the mixHash-less-receipt on-chain re-verify posture, the `cast send --create` deploy path, the year-prefixed `chain_id`) is consolidated as a **gap → symptom → workaround → code site → what-changes-on-eth** inventory in [`docs/spec/heima-eth-gap.md`](docs/spec/heima-eth-gap.md), with a Heima→Ethereum migration checklist. This section stays the canonical home for the *capability proofs* below; the gap doc defers here for them.

**Two separate things — do not conflate them (the earlier revision of this section did):**

1. **EVM *execution* level (which opcodes the chain runs) = Cancun.** Heima's Frontier `stable2412` `pallet_evm` returns `&CANCUN_CONFIG` from `frame/evm/src/lib.rs::config()` (the `// London` doc-comment one line up is stale upstream). **Verified on-chain** (local `heima-node --dev`, 2026-06-01) by deploying + *executing* contracts that use post-London opcodes:
Expand Down Expand Up @@ -300,7 +302,16 @@ Determine the real opcode level any time by *executing* a probe on a dev chain (

## Deployed contract registry

Live contract addresses on each chain (Heima mainnet v2 set, the ERC-4337 master infra #164, historical v1) plus the prod/test EVM deployer wallets are kept in [`docs/spec/deployed-contracts.md`](docs/spec/deployed-contracts.md) — the single canonical registry, indexed from `arch.md` §5. (`docs/contracts.md` is now a redirect to it.) The same addresses are also written to `scripts/operator-workstation.env` (via `env_set` in `scripts/heima-bring-up.sh` step 6) for shell-script consumption — those env-file entries are the operational source of truth and `docs/spec/deployed-contracts.md` is the human-readable canonical record (deployer, deploy date, block, explorer links, ABI summary).
Live contract addresses on each chain plus the prod/test EVM deployer wallets are documented in [`docs/spec/deployed-contracts.md`](docs/spec/deployed-contracts.md) — **human PROSE only** (deployer wallets, ABI summaries, cutover/historical notes, explorer links), indexed from `arch.md` §5. (`docs/contracts.md` redirects to it.) It **no longer carries an address table** — the addresses live in the chain profile (below).

**The machine-readable SOURCE OF TRUTH is the chain profile [`crates/agentkeys-core/chain-profiles/<chain>.json`](crates/agentkeys-core/chain-profiles/heima.json)** — a strict-typed `ChainProfile` (Rust struct + `include_str!` + the `chain_profile::tests::heima_carries_full_contract_registry_and_version` pinning test). Its `contracts[]` array holds each contract's address; `contract_set_version` holds the deployed SET version. `scripts/heima-bring-up.sh` step 6b **rewrites it programmatically on every fresh deploy** (alongside `scripts/operator-workstation.env`, the shell mirror, step 6). The **expected** source version lives in [`crates/agentkeys-chain/VERSION`](crates/agentkeys-chain/VERSION). (The former `deployed-contracts.json` was folded INTO the chain profile — do not re-create it.)

**Two HARD rules when any contract changes:**

1. **Idempotency is by VERSION, not bytecode.** Solidity bytecode isn't reliably comparable (embedded metadata hash + immutables), so do NOT diff bytecode. A redeploy is warranted when `crates/agentkeys-chain/VERSION` ≠ the chain profile's `contract_set_version` (or there's no on-chain code). **Bump `VERSION` when you change a contract** → the next deploy redeploys + bumps the profile's `contract_set_version`. A `VERSION` mismatch while code is already live is a **hard stop** (the script prints the mismatch + asks for an explicit opt-in — orphaning state costs mainnet gas), not an auto-redeploy. `FORCE_DEPLOY=1 heima-bring-up.sh` is a **BLIND manual override**; for the #225 account-auth cutover use [`scripts/heima-cutover-account-auth.sh`](scripts/heima-cutover-account-auth.sh) (probes the live `setScope` selector `d8e9e3c6` + skips when already live).
2. **A new deploy auto-updates the two machine mirrors; YOU update only the prose + rebuild.** `heima-bring-up.sh` writes the chain profile (`contracts[]` + `contract_set_version`) + `operator-workstation.env` automatically. You ALSO touch `docs/spec/deployed-contracts.md` **only if the design/version changed** (the version line + any ABI/cutover note — no address table to edit), and since the profile is `include_str!`-compiled, **rebuild the broker/daemon/UI** (`setup-broker-host.sh --ref main`) so they serve the new addresses. `arch.md` §5 links to the registry (no literal addresses to edit). **Confirm locally — NOT a per-PR CI workflow (CI is reserved for heavier checks):** `bash scripts/check-deployed-contracts-sync.sh` (verifies the chain profile ⟷ `operator-workstation.env`).

**COMMIT + PUSH the two machine mirrors BEFORE you redeploy the broker (HARD — real #225 split-registry incident).** The broker host deploys from `origin/<branch>` and compiles the chain profile in via `include_str!`. If the freshly-rewritten `heima.json` + `operator-workstation.env` are left uncommitted (or committed-but-unpushed), `setup-broker-host.sh --ref <branch>` rebuilds the broker on the **OLD** registry while the local daemon onboards into the **NEW** one. The broker then reads `operatorMasterWallet` from the orphaned registry, builds the accept UserOp for the wrong (stale) master account, and `handleOps` reverts **`SIG_VALIDATION_FAILED`** — an accept failure that looks like a "wrong passkey" bug but is actually a split registry. Order: deploy → **commit + push `heima.json` + `operator-workstation.env`** → `setup-broker-host.sh --ref <branch>` on the host. `heima-bring-up.sh`'s step-7 guard warns loudly if you skip the commit.

Verify all contracts are live + functional any time:

Expand Down
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading