Buyer proof · Openfort-compatible

Observe before an EIP-7702 / ERC-4337 UserOperation is signed.

This standalone TypeScript adapter shows the exact boundary: resolve the execution target, run M2M Sentinel, apply the caller's policy, then invoke an Openfort-style signUserOperation callback. It is not an official Openfort integration or partnership.

The boundary in four steps

1 · TargetUse the contract or delegated account target selected for this UserOperation.
2 · ObserveGET /v1/audit/:address runs immediately before signing.
3 · PolicyThe caller checks evidence grade, reachability, and proxy/delegation resolution.
4 · SignsignUserOperation is called only after policy allows.
An unresolved EIP7702_DELEGATED_EOA or proxy path stays explicit with resolutionComplete: false; the sample policy blocks it before the signing callback.

Run it without credentials

From a checkout of the M2M Sentinel repository with Node.js 22+:

node --experimental-strip-types examples/proofs/openfort-7702-preflight.ts
node --experimental-strip-types examples/proofs/openfort-7702-preflight.ts --unresolved

The first command uses a deterministic resolved fixture and a mock signer. The second exits non-zero with PROXY_OR_DELEGATION_UNRESOLVED and does not call the signer.

Expected evidence

policy: ALLOW
OPENFORT_SIGN_USER_OPERATION (mock signer; no wallet action)
resolutionComplete: true
reachability: NOT_ESTABLISHED
notASafetyGuarantee: true

The mock is intentionally not a wallet. Replace only the signer callback in a buyer codebase after retaining the preflight boundary.

Optional live observation

Set M2M_SENTINEL_API_KEY in the local environment and run --live. The key is sent in the x-api-key header, never in a URL. The proof still uses a mock signer, performs no wallet action, and fails closed on 401, 402, 503, network errors, invalid JSON, or unresolved evidence.

The official repository's README identifies an MIT license; this proof uses original adapter code and makes no claim of official integration.

Limits