{
  "about": "APEX Faucet signal registry for Arc tools (2026-10-09, suggested by Arc Studio). One entry per warning: which tools carry it, under which key, and which call is the source of truth if two answers ever disagree. Every tool that carries a signal applies the same rule (compared line by line on 9 Oct), so the same input gives the same signal everywhere.",
  "signals": [
    {
      "signal": "fake stablecoin name",
      "rule": "the token's symbol is USDC, EURC or USDT but the contract is not Circle's USDC (0x3600000000000000000000000000000000000000) or EURC (0xbef5f6d51cb62b58e6a8f77868681825c6fe21c1)",
      "keys": {
        "arc-transfers": "flags: impostor-name (and impostor: true)",
        "arc-send-guard": "reasons key: impostor-token (stop)",
        "arc-token-info": "riskSignals: 'calls itself ...'"
      },
      "sourceOfTruth": "arc-token-info"
    },
    {
      "signal": "forged transfer (address poisoning bait)",
      "rule": "the transaction was sent straight to the token contract by someone other than the row's from address: the token wrote the event, nobody signed it",
      "keys": {
        "arc-transfers": "flags: sender-did-not-sign",
        "arc-send-guard": "reasons key: poison-bait (stop) when the destination only appears in such rows"
      },
      "sourceOfTruth": "arc-transfers"
    },
    {
      "signal": "lookalike address",
      "rule": "two different addresses whose first and last hex characters match: 7 or more together, or at least 3 at each end (case-insensitive, so EIP-55 casing changes nothing)",
      "keys": {
        "arc-transfers": "flags: lookalike-address (any two counterparties in the history)",
        "arc-send-guard": "reasons key: lookalike (stop; measured against the sender's REAL counterparties only)"
      },
      "sourceOfTruth": "arc-send-guard for a send decision; arc-transfers for reading a history"
    },
    {
      "signal": "sanctioned or frozen destination",
      "rule": "OFAC SDN Ethereum address list, and USDC's own isBlacklisted() on Arc",
      "keys": {
        "arc-send-guard": "reasons keys: sanctioned, usdc-blacklisted (stop)"
      },
      "sourceOfTruth": "arc-send-guard"
    },
    {
      "signal": "sending to a contract / token contract / burn address",
      "rule": "eth_getCode at the destination; a contract that answers decimals() is a token; the zero and 0x...dead addresses are burns",
      "keys": {
        "arc-send-guard": "reasons keys: token-contract, burn (stop); contract (check)"
      },
      "sourceOfTruth": "arc-send-guard"
    },
    {
      "signal": "thin or missing liquidity",
      "rule": "the deepest Uniswap v4 USDC pool of the token holds under $50, has only one pool, or there is none",
      "keys": {
        "arc-price": "warnings: 'thin: under $50 of liquidity'",
        "arc-wallet": "tokens[].warnings",
        "arc-token-info": "riskSignals"
      },
      "sourceOfTruth": "arc-price (the pool read itself)"
    },
    {
      "signal": "who launched the token",
      "rule": "the wallet that sent the launch transaction, from our index of launchpad launches of the last 30 days; never guessed; 200+ launches in 30 days is named a launchpad service or bot",
      "keys": {
        "arc-token-info": "creator, creatorNote, riskSignals"
      },
      "sourceOfTruth": "arc-token-info"
    },
    {
      "signal": "risky approval",
      "rule": "an allowance of 2^255 or more to a contract our code does not use on Arc, any approval to a plain wallet, or an approval larger than the owner's balance",
      "keys": {
        "arc-allowance": "isUnlimited, spenderIsContract, spenderIsKnown, riskSignals"
      },
      "sourceOfTruth": "arc-allowance"
    }
  ],
  "reasonKeys": {
    "about": "Every reason key of arc-send-guard (each reason is { level, key, message }; reasons come most severe first), with its level and where the signal is defined. Complete as of 10 Oct 2026.",
    "lookalike": {
      "level": "stop",
      "signal": "lookalike address",
      "sourceOfTruth": "arc-send-guard"
    },
    "poison-bait": {
      "level": "stop",
      "signal": "forged transfer (address poisoning bait)",
      "sourceOfTruth": "arc-transfers (sender-did-not-sign rows)"
    },
    "token-contract": {
      "level": "stop",
      "signal": "sending to a contract / token contract / burn address",
      "sourceOfTruth": "arc-send-guard"
    },
    "burn": {
      "level": "stop",
      "signal": "sending to a contract / token contract / burn address",
      "sourceOfTruth": "arc-send-guard"
    },
    "sanctioned": {
      "level": "stop",
      "signal": "sanctioned or frozen destination",
      "sourceOfTruth": "arc-send-guard (OFAC SDN Ethereum list)"
    },
    "usdc-blacklisted": {
      "level": "stop",
      "signal": "sanctioned or frozen destination",
      "sourceOfTruth": "arc-send-guard (USDC isBlacklisted on Arc)"
    },
    "impostor-token": {
      "level": "stop",
      "signal": "fake stablecoin name",
      "sourceOfTruth": "arc-token-info"
    },
    "not-a-token": {
      "level": "stop",
      "signal": "the token address does not answer like a token",
      "sourceOfTruth": "arc-token-info (refuses non-tokens)"
    },
    "contract": {
      "level": "check",
      "signal": "the destination is a contract that is not a token",
      "sourceOfTruth": "arc-send-guard"
    },
    "fresh": {
      "level": "check",
      "signal": "a brand-new address: never sent a transaction, holds no USDC",
      "sourceOfTruth": "arc-send-guard"
    },
    "self": {
      "level": "check",
      "signal": "sending to the sending wallet itself",
      "sourceOfTruth": "arc-send-guard"
    },
    "history-unread": {
      "level": "check",
      "signal": "the sender's history could not be read, so lookalikes were not checked",
      "sourceOfTruth": "arc-send-guard"
    },
    "sanctions-unread": {
      "level": "check",
      "signal": "the sanctions list could not be read",
      "sourceOfTruth": "arc-send-guard"
    },
    "token-unread": {
      "level": "check",
      "signal": "the token could not be read",
      "sourceOfTruth": "arc-send-guard"
    },
    "known": {
      "level": "info",
      "signal": "a counterparty the sender really transferred with recently",
      "sourceOfTruth": "arc-transfers"
    }
  }
}
