{
  "master": "0x382941c8381315521C2afc92bfd7043E187A036a",
  "gas": {
    "wei": "20030000",
    "gwei": 0.02003,
    "note": "Arbitrum L2 gas price. Multiply by transaction gas-used for total cost."
  },
  "registries": [],
  "info": {
    "network": "Arbitrum One (chainId 42161)",
    "stakeCurrency": "ETH",
    "becomeProvider": {
      "contract": "ProviderRegistry (per-version, registered under MasterFactory)",
      "method": "registerProvider(string appId, uint256 version, uint256 pricePerResolution)",
      "value": "msg.value >= minStake (excess refunded down to minStake)",
      "requirements": [
        "appId must reference a Docker image fingerprint registered via registerImage()",
        "image version must be active",
        "caller must not already be an active provider in this registry",
        "pricePerResolution must be > 0"
      ]
    },
    "slashing": [
      "slashNonResponder(option, provider) — permissionless. If a bet was forceResolved and a registered provider for that judgeAppId did not submit, anyone can slash 10% of minStake. 50% goes to bet creator, 50% goes back to the bet contract for user refunds.",
      "slash(provider, amount, reason) — owner-only. May be 0x0 (ownership renounced) on production registries; in that case only the permissionless path applies.",
      "If a provider's stake falls below minStake after slashing, they are auto-deactivated and remaining stake refunded."
    ],
    "exits": [
      "unregisterProvider() — withdraws full remaining stake, marks inactive.",
      "setAvailableUntil(ts) — schedule deadline (must be >= now + 3 days) after which provider stops accepting new resolutions.",
      "setReferral(addr) — name a fallback provider (same appId) who can resolve in your place. Your stake stays locked."
    ],
    "earn": "pricePerResolution is what the provider charges per signed judgment. Markets pay this on submitResolution."
  }
}