{"x402Version":2,"service":"HALOWERK kettenwerk","version":"1.0.0","network":"eip155:8453","network_name":"Base Mainnet","chain_id":8453,"recipient":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","asset":{"symbol":"USDC","address":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","decimals":6},"facilitators":["CDP","https://facilitator.xpay.sh"],"payment_headers":{"primary":"PAYMENT-SIGNATURE","accepted":["PAYMENT-SIGNATURE","X-Payment","PAYMENT"],"challenge":["PAYMENT-REQUIRED"],"response":["PAYMENT-RESPONSE"]},"resources":[{"url":"https://kette.halowerk.com/token/resolve","method":"POST","name":"token_resolve","description":"A symbol is not an identity. Dozens of contracts carry the symbol USDC and most of them are not the one anyone means. This endpoint returns all of them rather than silently picking one: every match carries its chain, contract, on-chain symbol, name and decimals read directly from the contract, whether its source is verified, its market cap rank when it is inside the top 250, and a canonical flag whose criterion is stated in the answer — a contract is canonical when the price directory lists it under that asset for that chain. Bridged and wrapped images are flagged with the evidence taken from the contract's own name or symbol, never inferred. When more than one match exists, ambiguous is true and a recommendation names one contract with its reason; that recommendation is about identity, not about whether to buy anything. Symbol matches with no on-chain code, and contracts the price directory does not know, are still listed, because hiding them is exactly how an agent ends up on a look-alike. Accepts \"USDC\", \"0x…\" or \"coingecko:usd-coin\".","summary":"Resolves a token symbol, contract address or price-directory id into every matching contract across Ethereum, Base, Arbitrum, Optimism, Polygon and BNB Smart Chain, marking which one is the issuer-operated version and which are bridged or look-alike contracts.","inputSchema":{"type":"object","required":["query"],"additionalProperties":false,"properties":{"query":{"type":"string","minLength":1,"maxLength":100,"description":"Token symbol (\"USDC\"), contract address (\"0x…\") or price-directory id (\"coingecko:usd-coin\")."},"chain":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","bsc"],"description":"Restrict the answer to one chain. Omit to search all six."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"2000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/contract/verification","method":"POST","name":"contract_verification","description":"Checks one address on Ethereum, Base, Arbitrum, Optimism, Polygon or BNB Smart Chain against the open verification registry and against the chain itself. For a proxy the answer is deliberately split in two: whether the proxy is verified says almost nothing, whether the implementation it currently points to is verified is the real question, and both are reported separately with the implementation address read from the EIP-1967 storage slot, the EIP-1167 clone pattern or an implementation() call — with the evidence named in each case. Not verified means the source is not published here; it is not a statement about safety, and this endpoint deliberately makes none. similar_contracts_count would need a bytecode index this hub does not run, so it stays null and the runtime bytecode hash is returned instead, which is what such a lookup would need. Security judgements are made by /token/authorities, /contract/upgrade-risk and /token/report, not here.","summary":"Tells whether a contract's source is publicly verified, with compiler version, optimizer settings, license, deployer, creation block — and for a proxy, whether the implementation behind it is verified, which is the question that actually matters.","inputSchema":{"type":"object","required":["chain","address"],"additionalProperties":false,"properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","bsc"],"description":"Chain the contract lives on."},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Contract address."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"4000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/token/honeypot","method":"POST","name":"honeypot_check","description":"Runs each step separately as a simulation (eth_call with state override) against the current chain state and reports each result on its own, so a token that can be received but not moved on is visible as exactly that. Nothing is ever executed: no transaction is broadcast, no key is held, no approval is given. Limits, and they are decisive: can_buy and can_sell through a DEX router are NOT simulated - that needs a funded account and a router path this service cannot back, so both stay null. What IS tested is the transfer itself, which is where most traps sit. Balances are overridden at the account level, not inside the token contract storage, so a token that reads balances from its own mapping may report zero and the step then ends as \"unklar\" rather than as a pass. A negative result is no proof of fraud and a positive one is no clearance: the contract can change its behaviour after this check, and an owner with a tax switch can flip it at any time. That sentence belongs to every answer. Where the simulation does not carry, the verdict is \"unklar\" and the fields stay null.","summary":"Simulates a transfer of an ERC-20 token against the live chain state with an overridden balance and reports, step by step, whether it goes through or reverts - without ever sending a transaction.","inputSchema":{"type":"object","required":["chain","token"],"additionalProperties":false,"properties":{"chain":{"type":"string","description":"Chain identifier, for example ethereum, base, arbitrum, optimism, polygon or bsc."},"token":{"type":"string","description":"ERC-20 contract address, 0x followed by 40 hex characters."},"holder":{"type":"string","description":"Optional: an address that actually holds the token. Its balance is used as the source for the transfer simulation, which makes the result far more meaningful."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/token/restrictions","method":"POST","name":"token_restrictions","description":"Scans the deployed bytecode for function selectors that grant control over trading, and reads the values that can be read directly. The decisive field is tax_modifiable: a tax of zero that the owner can raise to ninety-nine percent at any time is more dangerous than a fixed five percent, so the ability is reported, not just the current number. detection_method is given per field, because reading a selector out of bytecode is a different kind of evidence than calling the contract. Limits: current buy and sell tax are NOT simulated - measuring them honestly needs a forked node with a funded account, which this service does not have; the fields stay null and are listed in unavailable_fields rather than being guessed from the code. A selector found in the bytecode proves the function EXISTS, never that it is active or has ever been used - that distinction is carried in every finding. Not detected means null, never false.","summary":"Reports which trading restrictions an ERC-20 contract can impose - blacklists, pause switches, wallet and transaction caps, changeable taxes - and states for every finding whether it was read from bytecode or from a live call.","inputSchema":{"type":"object","required":["chain","token"],"additionalProperties":false,"properties":{"chain":{"type":"string","description":"Chain identifier, for example ethereum, base, arbitrum, optimism, polygon or bsc."},"token":{"type":"string","description":"ERC-20 contract address, 0x followed by 40 hex characters."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"8000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/token/holders","method":"POST","name":"holder_concentration","description":"Reads the holder list of an ERC-20 token from a public block explorer index and reports concentration. Addresses that do not represent a person or entity - liquidity pools, bridges, burn addresses and exchange custody - are excluded from the adjusted figure and every exclusion is listed with its evidence. The raw top-10 share is reported alongside so both numbers can be compared. Labels are only set when they can be backed by on-chain code or a public tag; otherwise the label is \"unbekannt\". Limits: holder lists come from a public index and exist only for Ethereum, Base, Arbitrum and Optimism - on Polygon and BNB Chain this call reports the field as unavailable instead of guessing. Tokens with very large holder counts may exceed the time budget of the index; the response then says so. The Gini value is computed over the examined holders only, not over the whole holder base. No statement is made about the people behind addresses.","summary":"Returns the largest holders of an ERC-20 token with pool, bridge, burn and exchange addresses excluded, plus an adjusted top-10 share, a Gini value and a concentration verdict.","inputSchema":{"type":"object","required":["chain","token"],"additionalProperties":false,"properties":{"chain":{"type":"string","description":"Chain identifier, for example ethereum, base, arbitrum or optimism."},"token":{"type":"string","description":"ERC-20 contract address, 0x followed by 40 hex characters."},"top_n":{"type":"integer","minimum":10,"maximum":100,"default":20,"description":"How many holders to examine. Default 20."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"4000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/token/liquidity-ownership","method":"POST","name":"liquidity_ownership","description":"Reads the holders of an LP token and splits them into burned, locked in a named locker, and free. Burned and locked are two different things and are reported separately - burned is gone for good, locked comes back. A locker contract that is not in the curated table yields is_locker \"unbekannt\" rather than false, because an unknown lock contract is not the same as a demonstrably free holder. Limits: earliest_unlock_ts is NOT read - the unlock time lives inside each locker contract in its own layout, and decoding all of them honestly is beyond what this service can back; the field stays null and is listed in unavailable_fields. A lock that expires tomorrow is no lock, so treat locked_pct as an upper bound, not a guarantee. The holder list comes from a public index available for Ethereum, Base, Arbitrum and Optimism only. This endpoint takes the POOL address, not the token address - pool discovery for a token is a different question.","summary":"For a liquidity pool: who holds the LP tokens, how much is burned, how much sits in a known locker, how much is free to be pulled at any moment, and which named locker it is.","inputSchema":{"type":"object","required":["chain","pool"],"additionalProperties":false,"properties":{"chain":{"type":"string","description":"Chain identifier, for example ethereum, base, arbitrum or optimism."},"pool":{"type":"string","description":"Address of the liquidity pool (the LP token contract), 0x followed by 40 hex characters."},"top_n":{"type":"integer","minimum":10,"maximum":100,"default":30,"description":"How many LP holders to examine. Default 30."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"6000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/token/authorities","method":"POST","name":"token_authorities","description":"Reads the contract itself rather than a project's claims. Ownership renouncement is checked, not believed: the zero address in owner() is evidence, a sentence in a whitepaper is not. Dangerous functions are found by their four-byte selectors in the runtime bytecode, and every finding names the function and the selector — a selector that is merely absent from the dispatch table is not reported. Whether a function is actually restricted is then tested by simulating the call from a neutral address that owns nothing: a call that goes through from there is a strong finding and is reported as such, a call that reverts with an access message is evidence of a guard, and anything else stays \"unklar\" instead of being interpreted. Nothing is ever signed or sent — every probe is a read-only simulation. A multisig owner is not the same as a single address, so the threshold and signer count are read from the owner contract and stated. Risk is a classification with all thresholds disclosed in the answer, not a score from a black box, and it is not investment or security advice.","summary":"Finds who can still change a token: owner, whether ownership was really renounced, mint, pause, freeze, blacklist, upgrade and fee authorities — each backed by the function name, its selector and a simulated call that shows whether access is actually restricted.","inputSchema":{"type":"object","required":["chain","token"],"additionalProperties":false,"properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","bsc"],"description":"Chain the token lives on."},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Token contract address."},"probe_calls":{"type":"boolean","default":true,"description":"Simulate each dangerous function from a neutral address to test whether access is restricted. Read-only, nothing is sent."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"5000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/contract/upgrade-risk","method":"POST","name":"proxy_upgrade_risk","description":"Upgradeability alone is not a finding — every serious protocol is upgradeable. The finding is who holds the key and how much warning holders get. This endpoint reads the proxy pattern from the EIP-1967 slots, the clone bytecode or an implementation() call, resolves the admin, checks whether that admin is a multisig by asking it for its threshold and signer count, and checks whether it is a timelock by asking for getMinDelay() or delay() — a timelock with a delay of zero is not a timelock and is reported as such, with the delay always given in seconds. The upgrade history comes from the contract's own Upgraded events with block, timestamp, previous and new implementation and the transaction hash, so a buyer can go and look. Public nodes limit log ranges, so the window actually searched is stated and an incomplete history is marked incomplete rather than presented as complete. The storage gap check reads the published source; without published source it stays null, which means unknown, not absent. Risk is a classification with every threshold disclosed, not advice.","summary":"For an upgradeable contract: who is allowed to swap the code behind the address, whether a timelock stands in front of it and how long its delay is, plus the full upgrade history with transaction references.","inputSchema":{"type":"object","required":["chain","address"],"additionalProperties":false,"properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","bsc"],"description":"Chain the contract lives on."},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Contract or proxy address."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"6000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/wallet/allowances","method":"POST","name":"allowance_risk","description":"Reads Approval events of one wallet from the chain, resolves the CURRENT allowance for every token and spender pair with a direct call, and weighs it against the balance actually held. An unlimited approval on an empty balance carries no risk and is reported as such. Every entry carries ready-made call data to revoke it - this service never signs and never sends anything, the caller decides. Limits: Approval events are read from a bounded block window, not from the whole chain history; the window is stated in the response as window_blocks and window_note, and approvals granted before it are missing. Spender labels are only set when a curated entry backs them, never guessed. last_used is not reported at all - proving when an approval was last drawn on would need a full transfer index this service does not have; the field is listed under unavailable_fields instead of being estimated. Prices come from a public DEX index and are missing for tokens it does not know.","summary":"Lists the ERC-20 spending approvals a wallet has granted, how much of each is actually at risk given the current balance, and returns ready-made revoke call data the caller can sign themselves.","inputSchema":{"type":"object","required":["chain","wallet"],"additionalProperties":false,"properties":{"chain":{"type":"string","description":"Chain identifier, for example ethereum, base, arbitrum, optimism, polygon or bsc."},"wallet":{"type":"string","description":"Wallet address, 0x followed by 40 hex characters."},"min_value_usd":{"type":"number","minimum":0,"description":"Only report entries whose value at risk reaches this amount. Entries without a known price are always kept."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"4000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/tx/decode","method":"POST","name":"tx_decode","description":"Turns opaque call data into something an agent can reason about before signing. The method signature is resolved from the verified source of the contract first, then from this hub's own list of common signatures, then from the open selector directory — and the answer always names which of the three was used, because a four-byte selector is short enough to collide and colliding entries are listed. An unknown selector stays unknown: parameters are returned raw and nothing is guessed. Approvals and transfers are pulled out separately and unlimited approvals are flagged in warnings. For a mined transaction hash the receipt logs are decoded as well, which gives the transfers and approvals that actually happened rather than only those visible in the call data. Batching wrappers (multicall, aggregate3, Universal Router execute) are unpacked one level. This endpoint decodes only — it never executes, never simulates and never sends. What the transaction would do to your balances is answered by /tx/simulate.","summary":"Decodes EVM call data into a readable method name, typed parameters, approvals and transfers, plus a one-sentence summary of what the transaction does — from a transaction hash, a raw signed transaction or a plain {to, data, value}.","inputSchema":{"type":"object","required":["chain"],"additionalProperties":false,"properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","bsc"],"description":"Chain the call belongs to."},"tx_hash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"Hash of an existing transaction. Its receipt logs are decoded too when it is mined."},"raw":{"type":"string","pattern":"^0x[0-9a-fA-F]{20,}$","description":"Raw signed transaction (any EIP-2718 type). It is only parsed, never broadcast."},"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Target address, when passing call data directly."},"data":{"type":"string","pattern":"^0x[0-9a-fA-F]*$","description":"Call data, when passing it directly."},"value":{"type":"string","description":"Value in wei as a decimal or 0x string. Optional, defaults to 0."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"3000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/tx/simulate","method":"POST","name":"tx_simulate","description":"Answers the question that stands before every signature: what really happens to my assets and my rights. The call is executed against the state of a named block on a simulation interface, never on the chain — this hub holds no private key and broadcasts nothing. Balance changes are not inferred from events but measured: the same simulation reads every touched balance immediately before and immediately after the call, native currency included, so an outflow that emits no event is still visible. Approvals granted and revoked are extracted separately and unlimited ones are flagged. Where a public node offers a call tracer, the full internal call tree with depth and the number of storage slots written are included; where it does not, both fields are null and listed in unavailable_fields rather than approximated — currently Arbitrum and BNB Smart Chain have no free tracer. State overrides are supported for what-if questions. A revert is a valid, billable answer with its reason; a simulation that could not be run at all is not billed. The result holds for the stated block only — state can change before execution.","summary":"Simulates one EVM transaction against a forked chain state and returns exactly what it would do: success or revert reason, gas used, every balance change measured before and after, approvals granted or revoked, the call tree and warnings — without ever signing or broadcasting anything.","inputSchema":{"type":"object","required":["chain","from","to"],"additionalProperties":false,"properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","bsc"],"description":"Chain to simulate on."},"from":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Sender address. No signature is needed and none is created."},"to":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Target address."},"data":{"type":"string","pattern":"^0x[0-9a-fA-F]*$","default":"0x","description":"Call data."},"value":{"type":"string","default":"0","description":"Value in wei, decimal or 0x."},"gas":{"type":"integer","minimum":21000,"maximum":30000000,"description":"Optional gas limit for the simulation."},"block":{"type":"string","default":"latest","description":"\"latest\" or a block number as decimal string."},"state_overrides":{"type":"object","description":"Optional state overrides per address, in the eth_simulateV1 format (balance, nonce, code, state, stateDiff)."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"12000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/token/report","method":"POST","name":"token_risk_report","description":"Runs the identity resolver, the verification check, the authority scanner and the upgrade risk check against one token and merges them into a single answer. Nothing new is measured here: every statement carries the endpoint number it came from, so any finding can be re-bought individually and checked. A section that fails does not sink the report — it is set to null, listed in checks_failed with its reason, and the score is computed only over the checks that ran, with coverage stated. Sections this hub does not offer yet (taxes and restrictions, holder concentration, liquidity ownership, honeypot simulation, unlock schedule) are named explicitly in sections_not_covered rather than silently omitted, because a report that hides what it did not look at is worse than no report. The score is arithmetic with every deduction listed by name and amount and every threshold disclosed; it is a summary of measurements, not a verdict on a project. This is not investment advice and not a security audit — a contract can behave differently after this check, and a clean report is not a guarantee.","summary":"One combined report on an ERC-20 token: identity and look-alikes, source verification, who can still mint, pause, blacklist or upgrade it, and the upgrade history — every finding tagged with the endpoint it came from, priced below the sum of the individual calls.","inputSchema":{"type":"object","required":["chain","token"],"additionalProperties":false,"properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","bsc"],"description":"Chain the token lives on."},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Token contract address."},"depth":{"type":"string","enum":["schnell","voll"],"default":"voll","description":"\"schnell\" skips the upgrade history, which needs a log scan; \"voll\" runs everything available."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"14000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/wallet/portfolio","method":"POST","name":"wallet_portfolio","description":"Lists token and native balances of one wallet across chains and prices them where a price exists. priced_pct is mandatory and says how much of the portfolio is actually backed by a price - a total where a third of the holdings have none is not an answer without that number. Tokens that carry the marks of unsolicited airdrops are flagged with the reason but never silently removed; whether they count is the buyer decision. Holdings that cannot be priced appear in unknown_tokens with a reason instead of being set to zero. Limits: DeFi positions are NOT resolved - naming a position inside a lending or LP protocol needs per-protocol decoding this service does not have, so defi_positions stays empty and the field is listed under unavailable_fields rather than being guessed. NFT holdings are counted, not valued. The index exists for Ethereum, Base, Arbitrum and Optimism only.","summary":"Priced snapshot of everything a wallet holds across chains, with the share of the total that actually carries a price, spam tokens flagged rather than dropped, and every unpriced holding listed with a reason.","inputSchema":{"type":"object","required":["wallet"],"additionalProperties":false,"properties":{"wallet":{"type":"string","description":"Wallet address, 0x followed by 40 hex characters."},"chains":{"type":"array","maxItems":4,"items":{"type":"string"},"description":"Chains to query. Default: ethereum, base, arbitrum, optimism."},"min_value_usd":{"type":"number","minimum":0,"default":0.01,"description":"Hide priced holdings below this value. Unpriced holdings are always kept."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"5000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/wallet/activity","method":"POST","name":"wallet_activity","description":"Reads the transaction history of one wallet from a public block explorer index and groups it by kind of action. Classification follows the called contract and method, never the amount - a transfer to a known router is a swap, not a payment. Anything that cannot be backed by a method name stays in the category \"unbekannt\", which is a valid answer here: a large honest remainder beats an invented assignment. Limits: history comes from a public index available for Ethereum, Base, Arbitrum and Optimism only; other chains are reported under chains_failed instead of being guessed. The index is read page by page with a cap, so very busy wallets are truncated - truncated is then true and tx_count_index carries the full count the index reports. Gas spent in USD is not computed: it would need the native token price at the time of each transaction, which this service has no source for, so the field is listed under unavailable_fields. No statement is made about the person behind a wallet.","summary":"Summarises what a wallet has been doing across chains: transaction count by type, first and last activity, active days, counterparties, protocols touched and a daily timeline.","inputSchema":{"type":"object","required":["wallet"],"additionalProperties":false,"properties":{"wallet":{"type":"string","description":"Wallet address, 0x followed by 40 hex characters."},"chains":{"type":"array","maxItems":4,"items":{"type":"string"},"description":"Chains to query. Default: ethereum, base, arbitrum, optimism."},"window":{"type":"string","enum":["7d","30d","90d","all"],"default":"30d","description":"Time window. Default 30d."},"limit":{"type":"integer","minimum":10,"maximum":200,"default":100,"description":"Upper bound of transactions examined per chain."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"5000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/wallet/pnl","method":"POST","name":"wallet_pnl","description":"Reads token movements of a wallet, prices every inflow and outflow at the time it happened, and derives cost basis, realised and unrealised profit or loss per asset. The method is stated because the result depends on it. Uncertainty is a mandatory field, not a footnote: an on-chain history knows nothing about deposits from exchanges, transfers between wallets of the same owner, or assets no price source covers. coverage_pct says which share of the movements carries a price; below sixty percent the answer is still delivered but marked as patchy, because a partial view honestly labelled is worth more than a confident wrong number. THIS IS NOT TAX ADVICE and not a tax computation - national rules decide holding periods, allowances and what counts as a disposal, and this endpoint knows none of them. Limits: transfers are read up to a cap per chain, so long histories are truncated; internal transfers of native currency are not included, only token movements; a transfer between two wallets of the same owner looks like a disposal here and inflates realised PnL - that is named in uncertainty.","summary":"Cost basis and profit or loss per asset for one wallet, computed from on-chain transfers priced at the time they happened, with an explicit coverage figure saying how much of it is actually backed.","inputSchema":{"type":"object","required":["wallet"],"additionalProperties":false,"properties":{"wallet":{"type":"string","description":"Wallet address, 0x followed by 40 hex characters."},"chains":{"type":"array","maxItems":2,"items":{"type":"string"},"description":"Chains to query. Default: base. Each chain costs time, so the cap is two."},"method":{"type":"string","enum":["fifo","lifo","average"],"default":"fifo","description":"Cost basis method. The result depends on it and it is echoed in method_used."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"12000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/wallet/classify","method":"POST","name":"wallet_classify","description":"Derives behaviour classes from on-chain activity: share of swaps, regularity of intervals, hour-of-day spread, counterparty count and contract code. Several classes at once are allowed and usually more accurate than one. Every class carries its evidence; without evidence no class is set. automation_likelihood comes from measurable traits - interval regularity and how evenly activity spreads over the day - listed in features_used, never from a hunch. Limits: this classifies BEHAVIOUR, not people. No statement is made about identity, origin, intent or lawfulness, and nothing is ever marked criminal, suspicious or sanctioned. The history comes from a public index available for Ethereum, Base, Arbitrum and Optimism only, and is read up to a cap, so a very busy wallet is judged on its most recent activity - truncated says so. Interval and hour statistics need at least five transactions; below that they stay null instead of carrying a made-up shape.","summary":"Classifies what a wallet does - trading, automation, liquidity, bridging, collecting, dormant, contract or distribution - with the evidence behind every class and the thresholds used.","inputSchema":{"type":"object","required":["wallet"],"additionalProperties":false,"properties":{"wallet":{"type":"string","description":"Wallet address, 0x followed by 40 hex characters."},"chains":{"type":"array","maxItems":4,"items":{"type":"string"},"description":"Chains to query. Default: ethereum, base, arbitrum, optimism."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"6000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/wallet/counterparties","method":"POST","name":"counterparty_graph","description":"Collects the addresses a wallet interacted with from its transactions and token transfers, counts the interactions per edge and names the type of each contract where it can be backed by a curated entry or a verified contract name. Depth is capped at two by design: anything deeper turns this into a tool for de-anonymisation, and that is not built here. Limits and the rule that matters: only contract designations and service types are reported. There is NO assignment to natural persons, no names, and no joining with outside data sources for identification. Shared on-chain activity is not evidence of a relationship between people - that sentence is part of every answer. The graph is capped in size and truncated says so honestly. History comes from a public index available for Ethereum, Base, Arbitrum and Optimism only. Volume in USD is not computed: it would need the price of every token at the time of every transfer, which this service has no source for.","summary":"Builds the interaction graph around one wallet - which contracts and addresses it dealt with, how often, in which direction and when - with contract types named and no link to people.","inputSchema":{"type":"object","required":["wallet"],"additionalProperties":false,"properties":{"wallet":{"type":"string","description":"Wallet address, 0x followed by 40 hex characters."},"chains":{"type":"array","maxItems":4,"items":{"type":"string"},"description":"Chains to query. Default: ethereum, base, arbitrum, optimism."},"depth":{"type":"integer","minimum":1,"maximum":2,"default":1,"description":"Graph depth. Two is the hard maximum by design."},"min_interactions":{"type":"integer","minimum":1,"default":1,"description":"Only keep edges with at least this many interactions."},"window":{"type":"string","enum":["7d","30d","90d","all"],"default":"30d"}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/wallet/balances","method":"POST","name":"cross_chain_balance","description":"Reads token balances of one wallet on several chains from a public index and the native balance from the node itself. The same asset exists on several chains in different versions; canonical and bridged issues are reported separately and still summed, because both together are the answer. Every chain carries its block height, without which the sum cannot be checked. A chain that cannot be reached drops out with a reason under chains_failed and the call stays valid. Limits: the index exists for Ethereum, Base, Arbitrum and Optimism only. is_canonical is set from a curated table of the most common assets; where the table has no entry the field stays null rather than carrying a guess. Values in USD come from the index exchange rate where it has one - tokens without a rate are counted in the amount but not in total_value_usd, and priced_pct says how much of the value is actually backed by a price.","summary":"Balances of one wallet across several chains, grouped by asset and by chain, with canonical and bridged versions of the same asset told apart and still added up.","inputSchema":{"type":"object","required":["wallet"],"additionalProperties":false,"properties":{"wallet":{"type":"string","description":"Wallet address, 0x followed by 40 hex characters."},"chains":{"type":"array","maxItems":4,"items":{"type":"string"},"description":"Chains to query. Default: ethereum, base, arbitrum, optimism."},"group_by":{"type":"string","enum":["asset","chain"],"default":"asset","description":"Which grouping to put first. Both are always returned."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"6000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/tx/status","method":"POST","name":"tx_status","description":"Reads one transaction hash on Ethereum, Base, Arbitrum, Optimism, Polygon or BNB Smart Chain and answers the question an agent actually has: did it go through, is it final yet, and what did it cost. Finality is defined differently per chain, so the rule used and the required block count are part of the answer instead of a single hard-coded number. A hash that no node knows is reported as \"unbekannt\", never as \"fehlgeschlagen\" — the two are not the same. A pending transaction whose nonce has already been consumed elsewhere is reported as \"ersetzt\", and the replacing transaction is searched for in the last 15 blocks; the search window is stated, so an empty result is not sold as proof of absence. Does not broadcast, sign or accelerate anything, and cannot tell you when a transaction entered the mempool — no node reports that.","summary":"Status of one EVM transaction: confirmed, failed, pending, replaced or unknown, with confirmations, the finality rule of that chain, the fee actually paid and the revert reason when it failed.","inputSchema":{"type":"object","required":["chain","tx_hash"],"additionalProperties":false,"properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","bsc"],"description":"Chain the transaction lives on."},"tx_hash":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"Transaction hash, 0x plus 64 hex characters."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"2000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/gas","method":"POST","name":"gas_estimate","description":"Reads the fee history of the last 20 blocks on Ethereum, Base, Arbitrum, Optimism, Polygon or BNB Smart Chain and returns what a transaction costs right now. Priority fees come from the 10th, 50th and 90th percentile of the tips actually paid in those blocks — the percentile used is named, not hidden. On rollups the L1 data fee is quoted separately from the L2 execution fee, because it is often the larger part and an estimate that merges them is simply wrong; the L1 part is computed from the chain's own gas price oracle for a synthetic payload of a stated byte size. Waiting times are derived from the measured average block time over the last blocks, not guessed, and the number of blocks assumed per speed level is disclosed. USD cost needs a price for the native currency from two independent sources; if neither answers, the USD fields stay null instead of being estimated. Arbitrum has no OP-Stack gas price oracle, so its L1 data fee is reported as unavailable rather than approximated. This is a measurement, not a recommendation.","summary":"Current gas cost on one EVM chain: base fee, priority fee for slow, normal and fast, the suggested max fee, the expected wait in seconds measured from real block times, and the total cost in USD for a typical transaction.","inputSchema":{"type":"object","required":["chain"],"additionalProperties":false,"properties":{"chain":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","bsc"],"description":"Chain to read fees from."},"speed":{"type":"string","enum":["langsam","normal","schnell","alle"],"default":"alle","description":"Which speed level to highlight. All three are always returned."},"tx_type":{"type":"string","enum":["native_transfer","erc20_transfer","erc20_approve","swap","nft_mint","contract_deploy"],"default":"erc20_transfer","description":"Transaction profile used for the total cost estimate. Its assumed gas limit and byte size are stated in the answer."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"2000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/chain/health","method":"POST","name":"chain_health","description":"Queries every public RPC endpoint this hub knows for a chain in parallel — at least three, usually five — and reports what each one says instead of trusting one. Disagreement is the valuable finding: a single endpoint that lags or serves a different fork is exactly the failure mode this endpoint is built to expose, so agreement is reported per endpoint and the tolerance in blocks is derived from that chain's block time and stated. Beyond height it compares the actual block hash six blocks deep across endpoints; two different hashes at the same height mean the endpoints are on different chains. Endpoint names are given, never URLs, credentials or internal addresses. An endpoint this hub has rate-limited itself is marked self_limited with reachable null, because our own throttle says nothing about the endpoint. Supported chains: Ethereum, Base, Arbitrum, Optimism, Polygon, BNB Smart Chain. This is a status measurement, not advice on which endpoint to use.","summary":"Health of one or more EVM chains measured across several independent public RPC endpoints at once: block height per endpoint, agreement, latency, block age, a real block-hash comparison at fixed depth and a gas spike flag.","inputSchema":{"type":"object","additionalProperties":false,"properties":{"chains":{"type":"array","items":{"type":"string","enum":["ethereum","base","arbitrum","optimism","polygon","bsc"]},"minItems":1,"maxItems":6,"default":["base"],"description":"Chains to check. Defaults to base."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"3000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/bridge/track","method":"POST","name":"bridge_track","description":"Reads the source transaction on chain, identifies the bridge from the contracts it touched, and reports what actually left the wallet. overdue is measured against the usual duration of THAT bridge, and the comparison value is part of the answer - not against a fixed number. For bridges that need a manual claim, next_step says which step is missing and who has to trigger it; that is the real answer for a transfer that looks stuck. amount_delta shows what was deducted on the way, so a smaller arrival is visible rather than hidden. Limits: the destination side is NOT resolved - matching a deposit to its payout on the target chain needs a per-bridge message index this service does not have, so destination stays null and the field is listed under unavailable_fields. status is therefore derived from the source side and elapsed time only, never from an observed arrival. A bridge that is not in the curated table yields bridge_detected null instead of a guess. Nothing is executed and no claim is ever triggered.","summary":"Follows one bridge deposit from its source transaction: which bridge, how much left, what was deducted on the way, how long it has been running against that bridge usual duration, and what step is missing next.","inputSchema":{"type":"object","required":["source_chain","tx_hash"],"additionalProperties":false,"properties":{"source_chain":{"type":"string","description":"Chain the deposit was made on."},"tx_hash":{"type":"string","description":"Transaction hash of the deposit, 0x followed by 64 hex characters."},"bridge":{"type":"string","description":"Optional hint which bridge was used. Only used when detection fails."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"4000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]},{"url":"https://kette.halowerk.com/graph/patterns","method":"POST","name":"fraud_graph_patterns","description":"Analyzes only the transaction graph supplied in the request. It detects four mechanical graph patterns: directed rings, pass-through nodes that receive and send similar amounts within a configured time gap, star patterns around one high-degree node, and chain-like structuring where similar amounts move across several hops. Every pattern includes the edge ids that support it. The endpoint is stateless and deterministic, does not query blockchains or outside datasets, does not score people or wallets, and does not make an AML, fraud, sanctions, suspicious-activity or compliance decision.","summary":"Finds rings, pass-through nodes, star patterns and chain-like structuring in a submitted transaction graph, with edge-level evidence and no fraud or AML verdict.","inputSchema":{"type":"object","required":["transactions"],"additionalProperties":false,"properties":{"transactions":{"type":"array","minItems":1,"maxItems":250,"description":"Directed transaction edges supplied by the caller. No outside graph is loaded.","items":{"type":"object","required":["from","to","amount_units"],"additionalProperties":false,"properties":{"id":{"type":"string","maxLength":80,"description":"Caller-provided edge identifier returned as evidence."},"from":{"type":"string","minLength":1,"maxLength":96,"description":"Source node id or 0x address."},"to":{"type":"string","minLength":1,"maxLength":96,"description":"Target node id or 0x address."},"amount_units":{"type":["number","string"],"description":"Transfer amount in the smallest token unit or another caller-defined unit."},"token_symbol":{"type":"string","maxLength":24,"description":"Optional token symbol used to avoid matching unlike assets."},"timestamp":{"type":"string","description":"Optional ISO-8601 timestamp used for pass-through time windows."}}}},"min_spokes":{"type":"integer","minimum":2,"maximum":25,"default":4,"description":"Minimum distinct counterparties for a star pattern."},"min_chain_length":{"type":"integer","minimum":2,"maximum":8,"default":4,"description":"Minimum node count for chain structuring."},"max_cycle_length":{"type":"integer","minimum":3,"maximum":8,"default":5,"description":"Maximum node count for a directed ring."},"max_time_gap_minutes":{"type":"integer","minimum":0,"maximum":10080,"default":120,"description":"Maximum time gap in minutes for pass-through matching."},"amount_tolerance_pct":{"type":"number","minimum":0,"maximum":100,"default":12,"description":"Maximum relative amount difference for similar-amount matching."}}},"mimeType":"application/json","accepts":[{"scheme":"exact","network":"eip155:8453","payTo":"0x2880EdfFF13100677Bf97A3CBdF3Bc34771C4E5E","price":{"amount":"6000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"asset":"USDC","network_name":"Base Mainnet","name":"USD Coin","version":"2","assetTransferMethod":"eip3009","eip712Domain":{"name":"USD Coin","version":"2","chainId":8453,"verifyingContract":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},"maxTimeoutSeconds":300}]}]}