Kurtosis Ethereum
ethpandaops/ethereum-package
Run Ethereum multi-client devnets using Kurtosis and the ethpandaops/ethereum-package.
Internal — for Boundless team members only. An agent skill from boundless-xyz/boundless.
$ npx skills add boundless-xyz/boundless --skill ops-check-balances -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install boundless-xyz/boundless ops-check-balances --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/boundless-xyz/boundless.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/ops-check-balances .claude/skills/ops-check-balances && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ops-check-balances" agent skill from https://github.com/boundless-xyz/boundless/tree/main/.claude/skills/ops-check-balances into .claude/skills/ops-check-balances/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-check-balances", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/boundless-xyz/boundless/tree/main/.claude/skills/ops-check-balancesType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add boundless-xyz/boundless --skill ops-check-balances -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install boundless-xyz/boundless ops-check-balances --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/boundless-xyz/boundless.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/ops-check-balances .agents/skills/ops-check-balances && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ops-check-balances" agent skill from https://github.com/boundless-xyz/boundless/tree/main/.claude/skills/ops-check-balances into .agents/skills/ops-check-balances/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-check-balances", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add boundless-xyz/boundless --skill ops-check-balances -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install boundless-xyz/boundless ops-check-balances --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/boundless-xyz/boundless.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/ops-check-balances .cursor/skills/ops-check-balances && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ops-check-balances" agent skill from https://github.com/boundless-xyz/boundless/tree/main/.claude/skills/ops-check-balances into .cursor/skills/ops-check-balances/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-check-balances", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/boundless-xyz/boundless.git --path .claude/skills/ops-check-balances--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add boundless-xyz/boundless --skill ops-check-balances -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install boundless-xyz/boundless ops-check-balances --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/boundless-xyz/boundless.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/ops-check-balances .gemini/skills/ops-check-balances && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ops-check-balances" agent skill from https://github.com/boundless-xyz/boundless/tree/main/.claude/skills/ops-check-balances into .gemini/skills/ops-check-balances/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-check-balances", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install boundless-xyz/boundless ops-check-balancesInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add boundless-xyz/boundless --skill ops-check-balances -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/boundless-xyz/boundless.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/ops-check-balances .github/skills/ops-check-balances && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ops-check-balances" agent skill from https://github.com/boundless-xyz/boundless/tree/main/.claude/skills/ops-check-balances into .github/skills/ops-check-balances/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-check-balances", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add boundless-xyz/boundless --skill ops-check-balances -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install boundless-xyz/boundless ops-check-balances --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/boundless-xyz/boundless.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/ops-check-balances .opencode/skills/ops-check-balances && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ops-check-balances" agent skill from https://github.com/boundless-xyz/boundless/tree/main/.claude/skills/ops-check-balances into .opencode/skills/ops-check-balances/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ops-check-balances", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ops-check-balancesInternal — for Boundless team members only. An agent skill from boundless-xyz/boundless.
Ops Check Balances is an agent skill from boundless-xyz/boundless. Internal — for Boundless team members only. Audit native ETH, market deposit, prover collateral, and distributor ZKC reserve balances for every operator-managed address (provers, distributor, order generators, signal). Use when the user wants to know which addresses need topping up, asks about the balance of provers/OGs/distributor/signal signers, says something is "running low" or "out of gas", or wants a periodic operational health check on operator wallets. Defaults to prod env (mainnets + prod testnets) —…
Its SKILL.md is about 4.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in DevOps & Cloud. It works with Ethereum. The repository describes itself as: Monorepo for Boundless, the universal ZK protocol. The licence is Apache-2.0.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 93e971a. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
jqghpython3From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
rpc.taiko.xyzmainnet.base.orgsepolia.base.orgAlso links to:
book.getfoundry.shFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ops Check Balances loads about 4.9k tokens when it runs. Until then it costs about 143 tokens; SKILL.md has 1,166 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
| select($incl == "true" or .env == "prod" or .env == "all")| select($incl == "true" or .env == "prod" or .env == "all")Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from boundless-xyz/boundless at commit 93e971a, republished under its Apache-2.0 licence (© boundless-xyz). 1,166 words, ~4,861 tokens.
.claude/skills/ops-check-balances/SKILL.md (or your agent's skills folder).Audit balances on every Boundless-operated address: native ETH, market deposit (balanceOf), prover collateral (balanceOfCollateral), and the distributor's bridged-ZKC ERC20 reserve.
The list of addresses, per-role thresholds, and which checks apply (gas vs market deposit) are loaded at runtime from the runbooks repo. The skill itself contains only public protocol data (chain → market/collateral-token addresses, public RPCs).
CLI tools: cast (from foundry), jq, python3, curl, and standard Unix utilities. python3 is used for wei → human-readable conversion (awk silently truncates large integers) and for parsing deployment.toml. curl fetches the contract registry from the public boundless repo.
gh CLI authenticated against boundless-xyz (required). The canonical address list and thresholds live in the private boundless-xyz/runbooks repo and are fetched at runtime via gh api — no local clone needed. Verify with:
gh api -H "Accept: application/vnd.github.raw" \
repos/boundless-xyz/runbooks/contents/addresses/operator_addresses.json | head -5If that fails with a 401/403, run gh auth login and ensure your account has access to boundless-xyz/runbooks.
network_secrets.toml at the repo root (optional). Public RPCs are usually sufficient. When a balance comes back as exactly 0 it may be rate-limited rather than actually empty — in that case retry against the private QuikNode endpoint from [networks.<chain>.rpc]. The runbook has setup instructions.
For each address in operator_addresses.json, on every chain it operates on:
needs_gas: true) — cast balance --rpc-url <RPC> <addr>. Required to pay gas.needs_market_check: true) — cast call <market> "balanceOf(address)(uint256)" <addr>. Funds available to pay for orders (requestor) or to claim as rewards (prover).role: prover) — cast call <market> "balanceOfCollateral(address)(uint256)" <addr>. Stake the prover has put up.role: distributor) — cast call <collateral_token> "balanceOf(address)(uint256)" <distributor_addr>. The distributor's raw ERC20 balance of bridged ZKC, used to top up provers' collateral. Not the same as balanceOfCollateral — that's deposited stake; this is the unstaked reserve.Loaded from operator_addresses.json's thresholds block. Resolved field-by-field with priority:
per-entry override → by_role[role] → by_chain[chain] → defaultETH thresholds for distributor-managed roles (provers, OGs) come from by_chain because the distributor's ETH_THRESHOLD varies by ~2 orders of magnitude across chains (0.008 ETH on Taiko vs 1 ETH on Base Sepolia staging). Audit thresholds are tied to those values: WARN ≈ 0.5 × ETH_THRESHOLD (distributor missed at least one cycle), CRIT ≈ 0.125 × ETH_THRESHOLD (auto-top-up clearly broken).
ETH thresholds for non-distributor-managed roles (distributor itself, signal signers) come from by_role and ignore the chain. Distributor's WARN matches the operational DISTRIBUTOR_ETH_ALERT_THRESHOLD of 0.5; signal signers use a smaller threshold tuned to their ~0.0001 ETH/day burn.
ZKC thresholds (prover collateral, distributor reserve) come from by_role.prover and by_role.distributor respectively, since they're uniform across chains.
eth_warn/eth_crit gate the native-ETH gas balance. To alert on an address's market deposit (balanceOf) instead of (or in addition to) gas, set deposit_warn/deposit_crit (ETH-equivalent units). These are opt-in: there is no default, so the script flags a deposit (DEPOSIT-LOW / DEPOSIT-CRIT) only for entries that resolve a deposit threshold. Used for requestors whose deposit is the operational signal (e.g. KOG, deposit WARN 1 / CRIT 0.1, while its gas stays on the base-mainnet default).
The resolved values the skill consumes live in operator_addresses.json's thresholds block. The runbook README no longer mirrors a values table — the operational source of truth is the distributor Pulumi config in the boundless repo (infra/distributor/Pulumi.l-prod-{chain_id}.yaml / Pulumi.l-staging-{chain_id}.yaml, keys like ETH_THRESHOLD / DISTRIBUTOR_ETH_ALERT_THRESHOLD). The deposit_warn/deposit_crit overrides are runbook-local and exist only in operator_addresses.json.
A specific entry can override any field by setting a thresholds: { eth_warn: ..., ... } block on it — only the fields you set are overridden; the rest fall through.
Contract addresses (market, collateral token) are fetched at runtime from the public contracts/deployment.toml in the boundless repo on GitHub. The skill never hardcodes them — when a chain is added or addresses rotate, it's a single edit to deployment.toml and the skill picks it up on next run, no code change.
DEPLOYMENT_TOML_URL="https://raw.githubusercontent.com/boundless-xyz/boundless/main/contracts/deployment.toml"The chain label used in operator_addresses.json must match a [deployment.<label>] section in deployment.toml. Today that's base-mainnet, taiko-mainnet, base-sepolia-staging, taiko-staging (the prod testnets base-sepolia and ethereum-sepolia were discontinued).
The only inline data the skill keeps is the chain label → public RPC URL mapping below — RPC URLs aren't in deployment.toml and don't rotate.
| Chain label | Public RPC |
|---|---|
base-mainnet | https://mainnet.base.org |
taiko-mainnet | https://rpc.taiko.xyz |
base-sepolia-staging | https://sepolia.base.org |
taiko-staging | https://rpc.taiko.xyz |
Save as /tmp/balance_check.sh and run. Defaults to prod env (mainnets + prod testnets); pass --all to also include staging.
#!/usr/bin/env bash
set -euo pipefail
# Fetch the operator address registry directly from the private runbooks repo
# via gh CLI (no local clone needed). RUNBOOKS_REF can be set to fetch from a
# specific branch/tag/sha (default: main).
RUNBOOKS_REF="${RUNBOOKS_REF:-main}"
ADDRS_FILE=$(mktemp)
trap 'rm -f "$ADDRS_FILE" "${DEPLOYMENT_TOML:-}"' EXIT
if ! gh api -H "Accept: application/vnd.github.raw" \
"repos/boundless-xyz/runbooks/contents/addresses/operator_addresses.json?ref=$RUNBOOKS_REF" \
> "$ADDRS_FILE" 2>/dev/null; then
echo "ERROR: failed to fetch operator_addresses.json from boundless-xyz/runbooks" >&2
echo " Run 'gh auth login' and ensure your account has access to that repo." >&2
exit 1
fi
# Default: prod only. --all also includes staging.
INCLUDE_STAGING="${INCLUDE_STAGING:-false}"
[ "${1:-}" = "--all" ] && INCLUDE_STAGING=true
# Public RPC URLs (the only inline data — they're not in deployment.toml and
# don't rotate). Function-based for macOS bash 3.2 compatibility.
chain_rpc() {
case "$1" in
base-mainnet) echo "https://mainnet.base.org" ;;
taiko-mainnet) echo "https://rpc.taiko.xyz" ;;
base-sepolia-staging) echo "https://sepolia.base.org" ;;
taiko-staging) echo "https://rpc.taiko.xyz" ;;
*) echo "" ;;
esac
}
# Fetch the canonical contract address registry from the public boundless repo
# and build a chain_label -> "market|collateral" map. Keeps the skill self-updating
# when contracts/deployment.toml changes.
DEPLOYMENT_TOML_URL="${DEPLOYMENT_TOML_URL:-https://raw.githubusercontent.com/boundless-xyz/boundless/main/contracts/deployment.toml}"
DEPLOYMENT_TOML=$(mktemp)
if ! curl -fsSL "$DEPLOYMENT_TOML_URL" -o "$DEPLOYMENT_TOML"; then
echo "ERROR: failed to fetch $DEPLOYMENT_TOML_URL" >&2
exit 1
fi
# Build a flat "label\tmarket\tcollateral" table by parsing the TOML once.
CHAIN_CONTRACTS=$(python3 - "$DEPLOYMENT_TOML" <<'PY'
import re, sys
t = open(sys.argv[1]).read()
zero = "0x0000000000000000000000000000000000000000"
for s in re.split(r'\n(?=\[deployment\.)', t):
m = re.match(r'\[deployment\.([^\]]+)\]', s)
if not m: continue
name = m.group(1)
market = re.search(r'^boundless-market\s*=\s*"(0x[a-fA-F0-9]{40})"', s, re.MULTILINE)
coll = re.search(r'^collateral-token\s*=\s*"(0x[a-fA-F0-9]{40})"', s, re.MULTILINE)
if not market or market.group(1).lower() == zero: continue
coll_addr = coll.group(1) if coll and coll.group(1).lower() != zero else ""
print(f"{name}\t{market.group(1)}\t{coll_addr}")
PY
)
# label -> "market|collateral" lookup using the fetched data.
chain_contracts() {
echo "$CHAIN_CONTRACTS" | awk -v c="$1" -F'\t' '$1==c {print $2"|"$3; exit}'
}
decode_uint() { echo "$1" | head -1 | awk '{print $1}' | grep -oE '^[0-9]+'; }
fmt_eth() { python3 -c "v='${1:-}'; print(f'{int(v)/1e18:.6f}' if v else '?')" 2>/dev/null; }
fmt_zkc() { python3 -c "v='${1:-}'; print(f'{int(v)/1e18:.4f}' if v else '?')" 2>/dev/null; }
flt_lt() { python3 -c "import sys; sys.exit(0 if float('$1') < float('$2') else 1)" 2>/dev/null; }
# Build (entry × chain) tuples filtered by env, into TSV:
# label \t address \t role \t chain \t needs_gas \t needs_market \t eth_warn \t eth_crit \t deposit_warn \t deposit_crit
#
# Threshold resolution (field-by-field): per-entry override → by_role[role] → by_chain[chain] → default.
# `//` works correctly here because thresholds are numbers, not booleans (no false-collapse risk).
# But for the boolean flags `needs_gas` / `needs_market_check`, `//` would mistreat `false`,
# so we use `has()` for those.
# eth_* gate native ETH (gas). deposit_* gate the market balanceOf and are OPT-IN: no default,
# so they resolve to "" when unset and the consumer skips deposit flagging for that entry.
TUPLES=$(jq -r --arg incl "$INCLUDE_STAGING" '
. as $root
| .addresses[]
| . as $e
| select($incl == "true" or .env == "prod" or .env == "all")
| .chains[] as $c
| (
(($e.thresholds // {}).eth_warn)
// (($root.thresholds.by_role[$e.role] // {}).eth_warn)
// (($root.thresholds.by_chain[$c] // {}).eth_warn)
// ($root.thresholds.default.eth_warn)
// 0.02
) as $eth_warn
| (
(($e.thresholds // {}).eth_crit)
// (($root.thresholds.by_role[$e.role] // {}).eth_crit)
// (($root.thresholds.by_chain[$c] // {}).eth_crit)
// ($root.thresholds.default.eth_crit)
// 0.005
) as $eth_crit
| (
(($e.thresholds // {}).deposit_warn)
// (($root.thresholds.by_role[$e.role] // {}).deposit_warn)
// (($root.thresholds.by_chain[$c] // {}).deposit_warn)
// ($root.thresholds.default.deposit_warn)
// ""
) as $dep_warn
| (
(($e.thresholds // {}).deposit_crit)
// (($root.thresholds.by_role[$e.role] // {}).deposit_crit)
// (($root.thresholds.by_chain[$c] // {}).deposit_crit)
// ($root.thresholds.default.deposit_crit)
// ""
) as $dep_crit
| [.label, .address, .role, $c,
(if has("needs_gas") then .needs_gas else true end),
(if has("needs_market_check") then .needs_market_check else false end),
$eth_warn, $eth_crit, $dep_warn, $dep_crit]
| @tsv
' "$ADDRS_FILE")
printf "%-36s %-44s %-12s %-22s %-12s %-13s %-12s %s\n" SERVICE ADDRESS ROLE CHAIN ETH DEPOSIT COLLATERAL FLAG
echo "--------------------------------------------------------------------------------------------------------------------------------------------------------------------"
while IFS=$'\t' read -r LABEL ADDR ROLE CHAIN NEEDS_GAS NEEDS_MARKET ETH_WARN ETH_CRIT DEP_WARN DEP_CRIT; do
RPC=$(chain_rpc "$CHAIN")
CHAIN_INFO=$(chain_contracts "$CHAIN")
if [ -z "$RPC" ] || [ -z "$CHAIN_INFO" ]; then
printf "%-36s %-44s %-12s %-22s %s\n" "$LABEL" "$ADDR" "$ROLE" "$CHAIN" "(chain not found — RPC or deployment.toml entry missing)"
continue
fi
MKT="${CHAIN_INFO%%|*}"
E="-"; D="-"; C="-"
FLAG=""
if [ "$NEEDS_GAS" = "true" ]; then
E_RAW=$(cast balance --rpc-url "$RPC" "$ADDR" 2>/dev/null || true)
E=$(fmt_eth "$E_RAW")
if [ "$E" != "?" ] && [ "$E" != "-" ]; then
if flt_lt "$E" "$ETH_CRIT"; then FLAG="$FLAG ETH-CRIT"
elif flt_lt "$E" "$ETH_WARN"; then FLAG="$FLAG ETH-LOW"
fi
fi
fi
if [ "$NEEDS_MARKET" = "true" ] && [ -n "$MKT" ]; then
D_RAW=$(decode_uint "$(cast call --rpc-url "$RPC" "$MKT" 'balanceOf(address)(uint256)' "$ADDR" 2>/dev/null || true)")
D=$(fmt_eth "$D_RAW")
# Market-deposit thresholds are opt-in (no default); flag only when resolved for this entry.
if [ "$D" != "?" ] && [ "$D" != "-" ]; then
if [ -n "$DEP_CRIT" ] && flt_lt "$D" "$DEP_CRIT"; then FLAG="$FLAG DEPOSIT-CRIT"
elif [ -n "$DEP_WARN" ] && flt_lt "$D" "$DEP_WARN"; then FLAG="$FLAG DEPOSIT-LOW"
fi
fi
fi
if [ "$ROLE" = "prover" ] && [ -n "$MKT" ]; then
C_RAW=$(decode_uint "$(cast call --rpc-url "$RPC" "$MKT" 'balanceOfCollateral(address)(uint256)' "$ADDR" 2>/dev/null || true)")
C=$(fmt_zkc "$C_RAW")
# Collateral thresholds are uniform; pulled from by_role.prover (or default).
C_WARN=$(jq -r '.thresholds.by_role.prover.collateral_warn // .thresholds.default.collateral_warn // 100' "$ADDRS_FILE")
C_CRIT=$(jq -r '.thresholds.by_role.prover.collateral_crit // .thresholds.default.collateral_crit // 50' "$ADDRS_FILE")
if [ "$C" != "?" ] && [ "$C" != "-" ]; then
if flt_lt "$C" "$C_CRIT"; then FLAG="$FLAG ZKC-CRIT"
elif flt_lt "$C" "$C_WARN"; then FLAG="$FLAG ZKC-LOW"
fi
fi
fi
printf "%-36s %-44s %-12s %-22s %-12s %-13s %-12s%s\n" "$LABEL" "$ADDR" "$ROLE" "$CHAIN" "$E" "$D" "$C" "$FLAG"
done <<<"$TUPLES"
# Distributor bridged-ZKC reserve (one row per (distributor address × its chains))
echo
echo "=== Distributor bridged-ZKC ERC20 reserve ==="
printf "%-36s %-44s %-22s %-14s %s\n" DISTRIBUTOR ADDRESS CHAIN ZKC_RESERVE FLAG
echo "------------------------------------------------------------------------------------------------------------------------"
DISTRIB_TUPLES=$(jq -r --arg incl "$INCLUDE_STAGING" '
.addresses[]
| select(.role == "distributor")
| select($incl == "true" or .env == "prod" or .env == "all")
| .chains[] as $c
| [.label, .address, $c] | @tsv
' "$ADDRS_FILE")
while IFS=$'\t' read -r LABEL ADDR CHAIN; do
RPC=$(chain_rpc "$CHAIN")
CHAIN_INFO=$(chain_contracts "$CHAIN")
if [ -z "$RPC" ] || [ -z "$CHAIN_INFO" ]; then continue; fi
TOKEN="${CHAIN_INFO##*|}"
if [ -z "$TOKEN" ]; then continue; fi
RAW=$(decode_uint "$(cast call --rpc-url "$RPC" "$TOKEN" 'balanceOf(address)(uint256)' "$ADDR" 2>/dev/null || true)")
ZKC=$(fmt_zkc "$RAW")
R_WARN=$(jq -r '.thresholds.by_role.distributor.reserve_zkc_warn // .thresholds.default.reserve_zkc_warn // 100' "$ADDRS_FILE")
R_CRIT=$(jq -r '.thresholds.by_role.distributor.reserve_zkc_crit // .thresholds.default.reserve_zkc_crit // 50' "$ADDRS_FILE")
FLAG=""
if [ "$ZKC" != "?" ] && [ "$ZKC" != "-" ]; then
if flt_lt "$ZKC" "$R_CRIT"; then FLAG="ZKC-CRIT"
elif flt_lt "$ZKC" "$R_WARN"; then FLAG="ZKC-LOW"
fi
fi
printf "%-36s %-44s %-22s %-14s %s\n" "$LABEL" "$ADDR" "$CHAIN" "$ZKC" "$FLAG"
done <<<"$DISTRIB_TUPLES"Render the script's output as two separate markdown tables grouped by environment tier, in this order so operators can scan the highest-stakes rows first:
base-mainnet, taiko-mainnet. Real funds at stake; flagged rows here matter most.base-sepolia-staging, taiko-staging. Internal testing; flagged rows are usually not paging-worthy unless they block an active staging change.(The prod testnets base-sepolia and ethereum-sepolia were discontinued, so there's no prod-testnet tier.)
Within each tier, flagged rows in bold (CRIT and LOW). The Distributor's bridged-ZKC reserve table can stay as a single third table at the end (or split by tier too if it's noisy).
Follow with a short "action list" ordered by urgency (CRIT before LOW), with prod-mainnet items first since they map directly to operational impact. Skip the section if nothing is flagged.
balanceOfCollateral with balanceOf for distributors. Distributors don't deposit stake — their ZKC sits in the bridged-ERC20 directly. The script renders both: market deposit (needs_market_check: true) and the per-distributor ZKC reserve in the second table.taiko-mainnet) and a staging market (taiko-staging); chain 84532 (Base Sepolia) now only carries the staging market (base-sepolia-staging) since the prod base-sepolia testnet was discontinued. The runbook disambiguates by chain label, and the skill's chain lookup table mirrors that./boundless/bento/prover-01, prover-02, bento-prover-{1,2}). The audit reflects the runbook's operator_addresses.json (which mirrors infra/cw-monitoring/Pulumi.production.yaml for active provers), not historical log-group existence.network_secrets.toml's QuikNode keys) before declaring it actually empty.awk truncates wei to scientific notation. Always pipe through Python or printf "%.6f" for any wei→ETH math.cast call quoting. The function signature 'balanceOf(address)(uint256)' must be a single-quoted string; the parens are part of the type signature.Edit the runbook, not this skill:
infra/<service>/Pulumi.l-prod-*.yaml (preferred) or ansible/inventory.yml.runbooks/addresses/operator_addresses.json (and the corresponding markdown table in runbooks/addresses/README.md) with the right role, chains, and needs_gas / needs_market_check flags.contracts/deployment.toml in the boundless repo (the canonical contract registry). The skill picks up market + collateral-token addresses automatically on the next run.chain_rpc function (the only inline thing left — RPC endpoints aren't in deployment.toml).runbooks/addresses/operator_addresses.json for any operator addresses operating on that chain.© boundless-xyz, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/ops-check-balances of boundless-xyz/boundless.
Open the folder on GitHubat commit 93e971a
Ops Check Balances next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ops Check Balances this skillboundless-xyz/boundless | 193 | — | ~4.9k | Automated safety check: Notes | Apache-2.0 | |
| Kurtosis Ethereumethpandaops/ethereum-package | 481 | — | ~1.6k | Automated safety check: Notes | MIT | |
| Fix Check Superchain Registryethereum-optimism/superchain-ops | 99 | — | ~932 | Automated safety check: Pass | MIT | |
| Devnet Triagegeanlabs/gean | 177 | — | ~3.7k | Automated safety check: Warn | None | |
| ClankerBankrBot/skills | 1.2k | 1 repos | ~3k | Automated safety check: Notes | None | |
| OrlixBankrBot/skills | 1.2k | — | ~2.7k | Automated safety check: Pass | None |
ethpandaops/ethereum-package
Run Ethereum multi-client devnets using Kurtosis and the ethpandaops/ethereum-package.
ethereum-optimism/superchain-ops
Diagnose and fix a failing checksuperchainregistry CircleCI job on superchain-ops, typically caused by the pinned lib/superchain-registry submodule drifting from upstream main.
geanlabs/gean
Diagnose a live, running lean devnet from its Prometheus and container logs, then report findings with proposed fixes and stop for approval.
BankrBot/skills
Deploy ERC20 tokens on Base, Ethereum, Arbitrum, and other EVM chains using the Clanker SDK.
BankrBot/skills
Personal AI Operating System on Base. An agent skill from BankrBot/skills.
ccashwell/evm-cortex
A skill your agent uses when deploying contracts to L2 networks (Base, Optimism, Arbitrum).
boundless-xyz/boundless
How to use the Boundless CLI — the primary interface for the Boundless ZK proof marketplace.
boundless-xyz/boundless
Internal — for Boundless team members only. An agent skill from boundless-xyz/boundless.
boundless-xyz/boundless
Internal — for Boundless team members only. An agent skill from boundless-xyz/boundless.
boundless-xyz/boundless
Start and interact with the Boundless localnet (docker compose-based local development network).
boundless-xyz/boundless
Internal — for Boundless team members only. An agent skill from boundless-xyz/boundless.
boundless-xyz/boundless
Internal — for Boundless team members only. An agent skill from boundless-xyz/boundless.
Works with
Categories
Internal — for Boundless team members only. An agent skill from boundless-xyz/boundless. Ops Check Balances is an agent skill from boundless-xyz/boundless. Internal — for Boundless team members only.
Ops Check Balances fits situations like: the user wants to know which addresses need topping up; asks about the balance of provers/OGs/distributor/signal signers; says something is running low; wants a periodic operational health check on operator wallets.
Run `npx skills add boundless-xyz/boundless --skill ops-check-balances -a claude-code`. Or copy the skill folder (.claude/skills/ops-check-balances in boundless-xyz/boundless) into .claude/skills/ops-check-balances in your project. Claude Code loads it when a task matches its description.
Run `npx skills add boundless-xyz/boundless --skill ops-check-balances -a codex`. Or copy the skill folder (.claude/skills/ops-check-balances in boundless-xyz/boundless) into .agents/skills/ops-check-balances in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add boundless-xyz/boundless --skill ops-check-balances -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ops-check-balances, .gemini/skills/ops-check-balances, .github/skills/ops-check-balances and .opencode/skills/ops-check-balances in your project.
Going by SKILL.md and its folder, Ops Check Balances needs the command-line tools its instructions call (jq, gh and python3). Our summary lists: Python 3.
SKILL.md names 4 domains. In commands or code: rpc.taiko.xyz, mainnet.base.org and sepolia.base.org; the agent is likely to contact these when it follows the instructions. As links in the text: book.getfoundry.sh. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Ops Check Balances is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.9k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Ops Check Balances: Kurtosis Ethereum (ethpandaops/ethereum-package, 481 stars), Fix Check Superchain Registry (ethereum-optimism/superchain-ops, 99 stars), Devnet Triage (geanlabs/gean, 177 stars) and Clanker (BankrBot/skills, 1.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
boundless-xyz (a GitHub organization) maintains it in boundless-xyz/boundless, which has 193 GitHub stars. The repository holds 12 skills in this directory. The repository was last updated on August 26, 2026.
Source: boundless-xyz/boundless on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.