{"openapi":"3.1.0","info":{"title":"HALOWERK identwerk","version":"1.0.0","description":"HALOWERK identwerk — bezahlte Endpunkte nach x402. Preise in USDC auf Base Mainnet.","contact":{"url":"https://ident.halowerk.com/"}},"servers":[{"url":"https://ident.halowerk.com"}],"paths":{"/v1/name-resolve":{"post":{"operationId":"name_resolve","summary":"Resolve ENS, Basenames and Solana .sol names to addresses, or an address back to its name, with the reverse entry checked against the forward record.","description":"Forward resolution takes a name and returns the address it points to, plus the resolver and the owner. ENS names resolve on Ethereum, .base.eth on Base, .sol through the Solana name service. Reverse resolution takes an address and returns its primary name — and always verifies it by resolving that name forward again, because a reverse entry can be set by anyone and is worthless as identity until the forward record agrees; a mismatch is reported rather than hidden. Optional text records (avatar, url, com.twitter and so on) are read for EVM names. Everything runs against public nodes with no key, and several nodes per chain so one outage does not take the service down. A name that resolves is not proof of who holds it.","tags":["identwerk"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"name":{"type":"string","maxLength":255,"description":"The name to resolve, e.g. vitalik.eth, jesse.base.eth or bonfida.sol. Either this or address."},"address":{"type":"string","maxLength":64,"description":"An address to resolve backwards to a name. Either this or name."},"chain":{"type":"string","enum":["ethereum","base"],"default":"ethereum","description":"Which chain to use for a reverse lookup."},"text_keys":{"type":"array","items":{"type":"string","maxLength":64},"maxItems":10,"description":"ENS text records to read as well, e.g. [\"avatar\",\"url\",\"com.twitter\"]."}}}}}},"responses":{"200":{"description":"Ergebnis","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Eingabe ungültig, charged=false"},"402":{"description":"Zahlung erforderlich. Die Antwort trägt accepts, description und inputSchema.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"429":{"description":"Zu viele unbezahlte Anfragen, charged=false"},"502":{"description":"Gegenstelle nicht erreichbar, charged=false"},"504":{"description":"Zeitbudget überschritten, charged=false"}}}},"/v1/multisig-inspect":{"post":{"operationId":"multisig_inspect","summary":"Inspect a Safe multisig: owners, signing threshold, enabled modules and guard, plus the queued transactions and how many signatures each still needs.","description":"Reads a Safe from the public transaction service and returns what decides whether it can act: the owner set, the threshold, the current nonce, any enabled modules and the guard contract, and the master copy version. Queued transactions are listed with the confirmations they already carry and the number still missing, so it is visible which of them are one signature away from executing. Modules and a guard are called out explicitly because either can move funds or block execution independently of the threshold — a Safe with a module is not fully described by its owner list. Supports the chains Safe operates a service for. It reads only: nothing is proposed, signed or executed, and a queued transaction is not a prediction that it will pass.","tags":["identwerk"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["address"],"additionalProperties":false,"properties":{"address":{"type":"string","maxLength":64,"description":"The Safe address."},"chain":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","gnosis","bsc","avalanche"],"default":"ethereum","description":"Which chain the Safe is on."},"include_queued":{"type":"boolean","default":true,"description":"Read the queued (not yet executed) transactions."},"queued_limit":{"type":"integer","minimum":1,"maximum":50,"default":10,"description":"How many queued transactions to return."}}}}}},"responses":{"200":{"description":"Ergebnis","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Eingabe ungültig, charged=false"},"402":{"description":"Zahlung erforderlich. Die Antwort trägt accepts, description und inputSchema.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"429":{"description":"Zu viele unbezahlte Anfragen, charged=false"},"502":{"description":"Gegenstelle nicht erreichbar, charged=false"},"504":{"description":"Zeitbudget überschritten, charged=false"}}}},"/v1/aa-simulate":{"post":{"operationId":"aa_simulate","summary":"Check an ERC-4337 UserOperation before sending it: required prefund against the deposit, paymaster coverage and stake, nonce, and the inner call revert reason in plain words.","description":"Validates a UserOperation structurally and against chain state. It computes the required prefund from the gas limits and fee fields, reads the sender deposit on the EntryPoint and, when a paymaster is set, that paymaster deposit and stake, and says plainly whether the operation is funded. The nonce is read from the EntryPoint and compared with the one supplied, so a stale nonce is caught before submission. The inner call is executed with eth_call from the sender address, and a revert is decoded into Error(string), a named Panic code, or a custom error selector rather than returned as raw hex. This is not bundler validation: a bundler additionally enforces ERC-7562 storage-access rules that cannot be reproduced without a tracing node, so an operation that passes here can still be rejected. Nothing is submitted.","tags":["identwerk"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["user_operation"],"additionalProperties":false,"properties":{"user_operation":{"type":"object","description":"The UserOperation. EntryPoint v0.7 field names; v0.6 style is accepted and mapped.","properties":{"sender":{"type":"string","description":"Smart account address."},"nonce":{"type":"string","description":"Nonce as hex or decimal."},"callData":{"type":"string","description":"The call the account should make."},"callGasLimit":{"type":"string"},"verificationGasLimit":{"type":"string"},"preVerificationGas":{"type":"string"},"maxFeePerGas":{"type":"string"},"maxPriorityFeePerGas":{"type":"string"},"paymaster":{"type":"string","description":"Paymaster address, v0.7 style."},"paymasterAndData":{"type":"string","description":"v0.6 style; the first 20 bytes are read as the paymaster."},"factory":{"type":"string"},"initCode":{"type":"string","description":"v0.6 style; the first 20 bytes are read as the factory."}}},"chain":{"type":"string","enum":["ethereum","base"],"default":"base","description":"Which chain to check against."},"entry_point":{"type":"string","maxLength":64,"description":"EntryPoint address. Defaults to v0.7."},"simulate_call":{"type":"boolean","default":true,"description":"Execute the inner call with eth_call to surface a revert."}}}}}},"responses":{"200":{"description":"Ergebnis","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Eingabe ungültig, charged=false"},"402":{"description":"Zahlung erforderlich. Die Antwort trägt accepts, description und inputSchema.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"429":{"description":"Zu viele unbezahlte Anfragen, charged=false"},"502":{"description":"Gegenstelle nicht erreichbar, charged=false"},"504":{"description":"Zeitbudget überschritten, charged=false"}}}},"/v1/dao-snapshot":{"post":{"operationId":"dao_snapshot","summary":"Read a DAO governance space: open and recent proposals with scores per choice, turnout, quorum status, time remaining and whether the result is final.","description":"Reads a Snapshot space and returns what a voter or an observer needs to act. Per proposal: the choices with their scores and share, total voting power cast, the leading option, the number of voters, the quorum and whether it is met, when voting closes and how much time is left. Scores are marked final or pending — Snapshot computes them asynchronously, and a pending score can still move, so a result read too early is not a result. The space itself reports its voting type, strategies, delay and period, because a score means something different under quadratic than under single-choice weighting. Proposal bodies are truncated to keep the answer usable; the canonical link is always included. Read-only: nothing is voted on, and a leading proposal is not an executed one.","tags":["identwerk"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["space"],"additionalProperties":false,"properties":{"space":{"type":"string","maxLength":128,"description":"Snapshot space id, e.g. ens.eth, aavedao.eth, uniswapgovernance.eth."},"state":{"type":"string","enum":["active","closed","pending","all"],"default":"active","description":"Which proposals to return."},"limit":{"type":"integer","minimum":1,"maximum":20,"default":5,"description":"How many proposals."},"body_chars":{"type":"integer","minimum":0,"maximum":4000,"default":400,"description":"How much of each proposal body to include."}}}}}},"responses":{"200":{"description":"Ergebnis","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Eingabe ungültig, charged=false"},"402":{"description":"Zahlung erforderlich. Die Antwort trägt accepts, description und inputSchema.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"429":{"description":"Zu viele unbezahlte Anfragen, charged=false"},"502":{"description":"Gegenstelle nicht erreichbar, charged=false"},"504":{"description":"Zeitbudget überschritten, charged=false"}}}},"/v1/onchain-identity":{"post":{"operationId":"onchain_identity","summary":"List the attestations an address holds or issued, separated into valid, revoked, expired and self-issued, with the issuer and decoded fields of each.","description":"Reads Ethereum Attestation Service records for an address and sorts them by what they are actually worth. Each attestation carries its issuer, schema, decoded field values, issue time and expiry. The result separates four states that look identical in a raw list: currently valid, revoked by the issuer, expired, and self-issued — an attestation someone wrote about themselves proves nothing and is counted apart rather than mixed into the total. Issuers are aggregated so a single issuer behind many attestations is visible. Direction can be received (attestations about this address) or issued (attestations this address made about others). Available on Base, Ethereum, Optimism, Arbitrum and Sepolia. Nothing here says an issuer is trustworthy: that judgement stays with the caller.","tags":["identwerk"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["address"],"additionalProperties":false,"properties":{"address":{"type":"string","maxLength":64,"description":"The address to look up."},"chain":{"type":"string","enum":["base","ethereum","optimism","arbitrum","sepolia"],"default":"base","description":"Which chain to read."},"direction":{"type":"string","enum":["received","issued"],"default":"received","description":"received = attestations about this address, issued = attestations it made."},"schema_id":{"type":"string","maxLength":80,"description":"Only attestations of this schema."},"include_revoked":{"type":"boolean","default":true,"description":"Include revoked attestations (they stay in the count either way)."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":25,"description":"How many to read."}}}}}},"responses":{"200":{"description":"Ergebnis","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Eingabe ungültig, charged=false"},"402":{"description":"Zahlung erforderlich. Die Antwort trägt accepts, description und inputSchema.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequired"}}}},"429":{"description":"Zu viele unbezahlte Anfragen, charged=false"},"502":{"description":"Gegenstelle nicht erreichbar, charged=false"},"504":{"description":"Zeitbudget überschritten, charged=false"}}}}},"components":{"schemas":{"PaymentRequired":{"type":"object","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"description":{"type":"string"},"inputSchema":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}}}}},"securitySchemes":{"x402":{"type":"apiKey","in":"header","name":"PAYMENT-SIGNATURE","description":"x402 Zahlungsnachweis"}}}}