npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@unifra/scroll-sdk-cli

v0.1.4

Published

A tool for managing and testing Scroll SDK(Dogeos) deployments

Readme

Scroll SDK CLI

Twitter Follow Discord

Introduction

A tool for configuring, managing, and testing Scroll SDK deployments.

Other Scroll SDK Repos

oclif Version Downloads/week

Installation

  1. scrollsdk setup domains
  2. scrollsdk setup db-init --clean
  3. scrollsdk setup gen-keystore
  4. scrollsdk doge config
  5. scrollsdk doge dummy-signers
  6. scrollsdk doge bridge-init

    Note: If you encounter an "Insufficient base funds" error like this:

    2025-05-31T00:32:08.308083Z  INFO generate_test_keys: Checking funding for distribution helper address: nmCrhAu4STRor8Tmv4rNHt6JXeqUXFxeo1
    ......
    Error: Insufficient base funds for setup tx after selecting all UTXOs. Needed: 6049001000 sats, Have: 3950999000 sats

or

? Enter the seed string 123456
Pulling Docker Image: docker.io/dogeos69/generate-test-keys:v0.1.1-test
Image pulled successfully
Creating Docker Container...
Starting Container
M--- Running Test Setup & Key Generation (with OP_RETURN bridge funding) ---
PLoading configuration from: "./.data/setup_defaults.toml"...
'Starting setup for network: Testnet...
)Using RPC URL: https://testnet.doge.xyz/
:Using Blockbook URL: https://dogebook-testnet.nownodes.io
�2025-05-31T03:19:48.077868Z  INFO generate_test_keys: Using OP_RETURN payload (hex): 00151a64570e4997739458455ba4ab5a535fd2e306 for script (hex): 6a1500151a64570e4997739458455ba4ab5a535fd2e306
TDistribution Helper Address (derived from seed): nqBXoHUiH92gxgrsmFYjqcBNWZ7VMPFNJY
{2025-05-31T03:19:48.077948Z  INFO generate_test_keys: Initializing Dogecoin RPC client...
�2025-05-31T03:19:48.144522Z  INFO generate_test_keys: Checking funding for distribution helper address: nqBXoHUiH92gxgrsmFYjqcBNWZ7VMPFNJY
�2025-05-31T03:19:49.671868Z ERROR generate_test_keys: Distribution Helper address nqBXoHUiH92gxgrsmFYjqcBNWZ7VMPFNJY has no funds on testnet!

EPlease send some testnet DOGE to: nqBXoHUiH92gxgrsmFYjqcBNWZ7VMPFNJY
Then re-run this script.

Send Dogecoin to the displayed helper address and retry the command. Please keep the same seed string, or the helper address will change.

  1. scrollsdk setup configs
  2. scrollsdk setup prep-charts
  3.  scrollsdk setup cubesigner-refresh
  4. scrollsdk setup push-secrets
  5. scrollsdk setup tls
  6. scrollsdk helper fund-accounts -i -f 2 -d

  7. scrollsdk helper fund-accounts -l 1 -f 2 -d

  8. scrollsdk helper fund-accounts -l 2 -d

Non-Interactive / CI Mode

Steps 1-11 support --non-interactive (-N) and --json flags for automated pipelines. Steps 12-14 (helper fund-accounts) are already fully flag-driven with no prompts. See docs/automation.md for the full automation guide including required flags per step, JSON output format, error codes, environment variable substitution, and example scripts.

Usage

$ npm install -g @unifra/scroll-sdk-cli
$ scrollsdk COMMAND
running command...
$ scrollsdk (--version)
@unifra/scroll-sdk-cli/0.1.4 darwin-arm64 node-v22.19.0
$ scrollsdk --help [COMMAND]
USAGE
  $ scrollsdk COMMAND
...

Commands

scrollsdk check prerequisites

Check that all required prerequisites are installed and configured

USAGE
  $ scrollsdk check prerequisites [--json] [-v]

FLAGS
  -v, --verbose  Show detailed output for each check
      --json     Output in JSON format (stdout for data, stderr for logs)

DESCRIPTION
  Check that all required prerequisites are installed and configured

EXAMPLES
  $ scrollsdk check prerequisites

  $ scrollsdk check prerequisites --json

  $ scrollsdk check prerequisites --verbose

See code: src/commands/check/prerequisites.ts

scrollsdk doge bridge-init

Initialize bridge for mainnet or testnet

USAGE
  $ scrollsdk doge bridge-init [--image-tag <value>] [--json] [-N] [-s <value>]

FLAGS
  -N, --non-interactive    Run without prompts. Requires --seed flag.
  -s, --seed=<value>       seed which will regenerate the sequencer and fee wallet
      --image-tag=<value>  Specify the Docker image tag to use (defaults to 0.2.0-rc.3)
      --json               Output in JSON format (stdout for data, stderr for logs)

DESCRIPTION
  Initialize bridge for mainnet or testnet

EXAMPLES
  $ scrollsdk doge:bridge-init

  $ scrollsdk doge:bridge-init -s 123456

  $ scrollsdk doge:bridge-init --seed 123456

  $ scrollsdk doge:bridge-init --image-tag 0.2.0-debug

  $ scrollsdk doge:bridge-init --non-interactive --seed 123456 --image-tag 0.2.0-rc.3

  $ scrollsdk doge:bridge-init --non-interactive --json --seed 123456

See code: src/commands/doge/bridge-init.ts

scrollsdk doge config

Configure Dogecoin settings for mainnet or testnet

USAGE
  $ scrollsdk doge config [-c <value>] [--json] [-n mainnet|testnet] [-N]

FLAGS
  -N, --non-interactive   Run without prompts, using existing config values
  -c, --config=<value>    Path to config file (e.g., .data/doge-config-mainnet.toml or .data/doge-config-testnet.toml)
  -n, --network=<option>  Network to configure (mainnet or testnet) - required for non-interactive mode with new config
                          <options: mainnet|testnet>
      --json              Output in JSON format (stdout for data, stderr for logs)

DESCRIPTION
  Configure Dogecoin settings for mainnet or testnet

EXAMPLES
  $ scrollsdk doge:config

  $ scrollsdk doge:config --config .data/doge-config-mainnet.toml

  $ scrollsdk doge:config --config .data/doge-config-testnet.toml

  $ scrollsdk doge:config --non-interactive --network testnet

  $ scrollsdk doge:config --non-interactive --json --network mainnet

See code: src/commands/doge/config.ts

scrollsdk doge dummy-signers

Set up dummy signers (local Docker or AWS with KMS keys)

USAGE
  $ scrollsdk doge dummy-signers [--aws-account-id <value>] [--aws-network-alias <value>] [-a] [--aws-region <value>]
    [--aws-suffixes <value>] [-c <value>] [--generate-wif-keys] [--image-tag <value>] [--json] [-l] [-N] [--num-signers
    <value>] [--threshold <value>] [--wif-network regtest|testnet|mainnet]

FLAGS
  -N, --non-interactive            Run without prompts. Uses config values or sensible defaults.
  -a, --aws-only                   Set up AWS KMS signers only
  -c, --config=<value>             Path to config file (e.g., .data/doge-config-mainnet.toml or
                                   .data/doge-config-testnet.toml)
  -l, --local-only                 Set up local Docker signers only
      --aws-account-id=<value>     AWS account ID
      --aws-network-alias=<value>  Network alias for AWS resources
      --aws-region=<value>         AWS region for KMS signers
      --aws-suffixes=<value>       Space-separated suffixes for AWS signers (e.g., "00 01 02")
      --[no-]generate-wif-keys     Generate new WIF keys (non-interactive mode)
      --image-tag=<value>          Specify the Docker image tag to use
      --json                       Output in JSON format (stdout for data, stderr for logs)
      --num-signers=<value>        [default: 3] Number of signers (non-interactive mode)
      --threshold=<value>          Correctness threshold (non-interactive mode). Defaults to 2/3 majority.
      --wif-network=<option>       [default: regtest] Network for WIF generation: regtest, testnet, or mainnet
                                   <options: regtest|testnet|mainnet>

DESCRIPTION
  Set up dummy signers (local Docker or AWS with KMS keys)

EXAMPLES
  $ scrollsdk doge:dummy-signers

  $ scrollsdk doge:dummy-signers --config .data/doge-config-testnet.toml

  $ scrollsdk doge:dummy-signers --local-only

  $ scrollsdk doge:dummy-signers --aws-only

  $ scrollsdk doge:dummy-signers --image-tag shu-test-0605

See code: src/commands/doge/dummy-signers.ts

scrollsdk doge wallet new

Create a new Dogecoin wallet (mainnet or testnet)

USAGE
  $ scrollsdk doge wallet new [-c <value>] [-d] [-f] [--json] [-N] [-p <value>]

FLAGS
  -N, --non-interactive  Run without prompts (implies --force)
  -c, --config=<value>   [default: .data/doge-config.toml] Path to Dogecoin config file (determines network and default
                         wallet path)
  -d, --dry-run          Show what would be created without actually creating the wallet
  -f, --force            Skip confirmation prompt
  -p, --path=<value>     Path to save the wallet file (overrides path from config file)
      --json             Output in JSON format (stdout for data, stderr for logs)

DESCRIPTION
  Create a new Dogecoin wallet (mainnet or testnet)

EXAMPLES
  $ scrollsdk doge:wallet new --config .data/doge-config-mainnet.toml

  $ scrollsdk doge:wallet new --config .data/doge-config-testnet.toml

  $ scrollsdk doge:wallet new --path ./my-custom-wallet.json --config .data/doge-config-testnet.toml

  $ scrollsdk doge:wallet new --dry-run

  $ scrollsdk doge:wallet new --force

See code: src/commands/doge/wallet/new.ts

scrollsdk doge wallet send

Send DOGE to an address or the bridge with cross-chain data (mainnet/testnet aware)

USAGE
  $ scrollsdk doge wallet send -a <value> [-c <value>] [-d] [-f] [--no-bridge | [--evm-address <value> | --hex-data
    <value> | --text-data <value>]] [-p <value>] [-t <value>]

FLAGS
  -a, --amount=<value>       (required) Amount to send in DOGE
  -c, --config=<value>       Path to Dogecoin config file
  -d, --dry-run              Simulate transaction without broadcasting
  -f, --force                Skip wallet sync prompt
  -p, --path=<value>         Path to wallet file (overrides config)
  -t, --to=<value>           Recipient Dogecoin address (required if --no-bridge and not using default recipient from
                             config)
      --evm-address=<value>  EVM address (20 bytes hex, 0x-prefixed) for bridge transactions
      --hex-data=<value>     Custom hex data for OP_RETURN (requires --no-bridge)
      --no-bridge            Send without bridge data (allows custom OP_RETURN data, or send to non-bridge address)
      --text-data=<value>    Text data for OP_RETURN (requires --no-bridge)

DESCRIPTION
  Send DOGE to an address or the bridge with cross-chain data (mainnet/testnet aware)

EXAMPLES
  $ scrollsdk doge:wallet send --amount 1.0

  $ scrollsdk doge:wallet send --amount 1.0 --evm-address 0xabc... --config .data/doge-config-testnet.toml

  $ scrollsdk doge:wallet send --amount 1.0 --no-bridge --to અનન્ય_ADDRESS

  $ scrollsdk doge:wallet send --amount 1.0 --hex-data 6a0468656c6c6f --no-bridge

  $ scrollsdk doge:wallet send --amount 1.0 --force

See code: src/commands/doge/wallet/send.ts

scrollsdk doge wallet sync

Sync wallet UTXOs and balance (mainnet/testnet aware)

USAGE
  $ scrollsdk doge wallet sync [-k <value>] [-c <value>] [-p <value>]

FLAGS
  -c, --config=<value>   Path to Dogecoin config file
  -k, --api-key=<value>  NowNodes API key (overrides API key from config)
  -p, --path=<value>     Custom path for the wallet file (overrides path from config)

DESCRIPTION
  Sync wallet UTXOs and balance (mainnet/testnet aware)

EXAMPLES
  $ scrollsdk doge:wallet sync --config .data/doge-config-mainnet.toml

  $ scrollsdk doge:wallet sync --config .data/doge-config-testnet.toml

See code: src/commands/doge/wallet/sync.ts

scrollsdk help [COMMAND]

Display help for scrollsdk.

USAGE
  $ scrollsdk help [COMMAND...] [-n]

ARGUMENTS
  COMMAND...  Command to show help for.

FLAGS
  -n, --nested-commands  Include all nested commands in the output.

DESCRIPTION
  Display help for scrollsdk.

See code: @oclif/plugin-help

scrollsdk helper activity

Generate transactions on the specified network(s) to produce more blocks

USAGE
  $ scrollsdk helper activity [-c <value>] [-d] [-i <value>] [-o] [-t] [-p] [-k <value>] [-x <value>] [-r <value>]
    [-s]

FLAGS
  -c, --config=<value>      [default: ./config.toml] Path to config.toml file
  -d, --debug               Enable debug mode for more detailed logging
  -i, --interval=<value>    [default: 3] Interval between transactions in seconds
  -k, --privateKey=<value>  Private key (overrides config)
  -o, --layer1              Generate activity on Layer 1
  -p, --pod                 Run inside Kubernetes pod
  -r, --rpc=<value>         RPC URL (overrides config for both layers)
  -s, --spam                with 110KB input while sending transaction
  -t, --[no-]layer2         Generate activity on Layer 2
  -x, --recipient=<value>   Recipient address (overrides config)

DESCRIPTION
  Generate transactions on the specified network(s) to produce more blocks

See code: src/commands/helper/activity.ts

scrollsdk helper clear-accounts

Clear pending transactions and optionally transfer remaining funds on Layer 2

USAGE
  $ scrollsdk helper clear-accounts [-a <value>] [-c <value>] [-d] [-m <value>] [-p] [-k <value>] [-x <value>] [-r
  <value>]

FLAGS
  -a, --accounts=<value>    [default: 10] Number of accounts to generate from mnemonic
  -c, --config=<value>      [default: ./config.toml] Path to config.toml file
  -d, --debug               Run in debug mode
  -k, --privateKey=<value>  Private key to clear pending transactions
  -m, --mnemonic=<value>    Mnemonic to generate wallets
  -p, --pod                 Run in pod mode
  -r, --rpc=<value>         Layer 2 RPC URL
  -x, --recipient=<value>   Recipient address for remaining funds

DESCRIPTION
  Clear pending transactions and optionally transfer remaining funds on Layer 2

See code: src/commands/helper/clear-accounts.ts

scrollsdk helper derive-enode NODEKEY

Derive enode and L2_GETH_STATIC_PEERS from a nodekey

USAGE
  $ scrollsdk helper derive-enode NODEKEY

ARGUMENTS
  NODEKEY  Nodekey of the geth ethereum node

DESCRIPTION
  Derive enode and L2_GETH_STATIC_PEERS from a nodekey

EXAMPLES
  $ scrollsdk helper derive-enode 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

See code: src/commands/helper/derive-enode.ts

scrollsdk helper fund-accounts

Fund L1 and L2 accounts for contracts

USAGE
  $ scrollsdk helper fund-accounts [-a <value>] [-f <value>] [-c <value>] [-n <value>] [-d] [-i] [-o <value>] [-t <value>]
    [-l 1|2] [-m] [-p] [-k <value>]

FLAGS
  -a, --account=<value>      Additional account to fund
  -c, --config=<value>       [default: ./config.toml] Path to config.toml file
  -d, --dev                  Use Anvil devnet funding logic
  -f, --amount=<value>       [default: 0.1] Amount to fund in ETH
  -i, --fund-deployer        Fund the deployer address only
  -k, --private-key=<value>  Private key for funder wallet
  -l, --layer=<option>       Specify layer to fund (1 for L1, 2 for L2)
                             <options: 1|2>
  -m, --manual               Manually fund the accounts
  -n, --contracts=<value>    [default: ./config-contracts.toml] Path to configs-contracts.toml file
  -o, --l1rpc=<value>        L1 RPC URL
  -p, --pod                  Run inside Kubernetes pod
  -t, --l2rpc=<value>        L2 RPC URL

DESCRIPTION
  Fund L1 and L2 accounts for contracts

See code: src/commands/helper/fund-accounts.ts

scrollsdk helper set-scalars

Set commit and blob scalars for Scroll SDK

USAGE
  $ scrollsdk helper set-scalars [--blobScalar <value>] [--commitScalar <value>] [-c <value>] [-n <value>] [-k <value>]
    [-p] [-r <value>]

FLAGS
  -c, --config=<value>        [default: ./config.toml] Path to config.toml file
  -k, --k=<value>             Private key of the Owner
  -n, --contracts=<value>     [default: ./config-contracts.toml] Path to configs-contracts.toml file
  -p, --pod                   Run inside Kubernetes pod
  -r, --rpc=<value>           RPC URL (overrides config)
      --blobScalar=<value>    Value for setBlobScalar
      --commitScalar=<value>  Value for setCommitScalar

DESCRIPTION
  Set commit and blob scalars for Scroll SDK

See code: src/commands/helper/set-scalars.ts

scrollsdk plugins

List installed plugins.

USAGE
  $ scrollsdk plugins [--json] [--core]

FLAGS
  --core  Show core plugins.

GLOBAL FLAGS
  --json  Format output as json.

DESCRIPTION
  List installed plugins.

EXAMPLES
  $ scrollsdk plugins

See code: @oclif/plugin-plugins

scrollsdk plugins add PLUGIN

Installs a plugin into scrollsdk.

USAGE
  $ scrollsdk plugins add PLUGIN... [--json] [-f] [-h] [-s | -v]

ARGUMENTS
  PLUGIN...  Plugin to install.

FLAGS
  -f, --force    Force npm to fetch remote resources even if a local copy exists on disk.
  -h, --help     Show CLI help.
  -s, --silent   Silences npm output.
  -v, --verbose  Show verbose npm output.

GLOBAL FLAGS
  --json  Format output as json.

DESCRIPTION
  Installs a plugin into scrollsdk.

  Uses npm to install plugins.

  Installation of a user-installed plugin will override a core plugin.

  Use the SCROLLSDK_NPM_LOG_LEVEL environment variable to set the npm loglevel.
  Use the SCROLLSDK_NPM_REGISTRY environment variable to set the npm registry.

ALIASES
  $ scrollsdk plugins add

EXAMPLES
  Install a plugin from npm registry.

    $ scrollsdk plugins add myplugin

  Install a plugin from a github url.

    $ scrollsdk plugins add https://github.com/someuser/someplugin

  Install a plugin from a github slug.

    $ scrollsdk plugins add someuser/someplugin

scrollsdk plugins:inspect PLUGIN...

Displays installation properties of a plugin.

USAGE
  $ scrollsdk plugins inspect PLUGIN...

ARGUMENTS
  PLUGIN...  [default: .] Plugin to inspect.

FLAGS
  -h, --help     Show CLI help.
  -v, --verbose

GLOBAL FLAGS
  --json  Format output as json.

DESCRIPTION
  Displays installation properties of a plugin.

EXAMPLES
  $ scrollsdk plugins inspect myplugin

See code: @oclif/plugin-plugins

scrollsdk plugins install PLUGIN

Installs a plugin into scrollsdk.

USAGE
  $ scrollsdk plugins install PLUGIN... [--json] [-f] [-h] [-s | -v]

ARGUMENTS
  PLUGIN...  Plugin to install.

FLAGS
  -f, --force    Force npm to fetch remote resources even if a local copy exists on disk.
  -h, --help     Show CLI help.
  -s, --silent   Silences npm output.
  -v, --verbose  Show verbose npm output.

GLOBAL FLAGS
  --json  Format output as json.

DESCRIPTION
  Installs a plugin into scrollsdk.

  Uses npm to install plugins.

  Installation of a user-installed plugin will override a core plugin.

  Use the SCROLLSDK_NPM_LOG_LEVEL environment variable to set the npm loglevel.
  Use the SCROLLSDK_NPM_REGISTRY environment variable to set the npm registry.

ALIASES
  $ scrollsdk plugins add

EXAMPLES
  Install a plugin from npm registry.

    $ scrollsdk plugins install myplugin

  Install a plugin from a github url.

    $ scrollsdk plugins install https://github.com/someuser/someplugin

  Install a plugin from a github slug.

    $ scrollsdk plugins install someuser/someplugin

See code: @oclif/plugin-plugins

scrollsdk plugins link PATH

Links a plugin into the CLI for development.

USAGE
  $ scrollsdk plugins link PATH [-h] [--install] [-v]

ARGUMENTS
  PATH  [default: .] path to plugin

FLAGS
  -h, --help          Show CLI help.
  -v, --verbose
      --[no-]install  Install dependencies after linking the plugin.

DESCRIPTION
  Links a plugin into the CLI for development.
  Installation of a linked plugin will override a user-installed or core plugin.

  e.g. If you have a user-installed or core plugin that has a 'hello' command, installing a linked plugin with a 'hello'
  command will override the user-installed or core plugin implementation. This is useful for development work.


EXAMPLES
  $ scrollsdk plugins link myplugin

See code: @oclif/plugin-plugins

scrollsdk plugins remove [PLUGIN]

Removes a plugin from the CLI.

USAGE
  $ scrollsdk plugins remove [PLUGIN...] [-h] [-v]

ARGUMENTS
  PLUGIN...  plugin to uninstall

FLAGS
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Removes a plugin from the CLI.

ALIASES
  $ scrollsdk plugins unlink
  $ scrollsdk plugins remove

EXAMPLES
  $ scrollsdk plugins remove myplugin

scrollsdk plugins reset

Remove all user-installed and linked plugins.

USAGE
  $ scrollsdk plugins reset [--hard] [--reinstall]

FLAGS
  --hard       Delete node_modules and package manager related files in addition to uninstalling plugins.
  --reinstall  Reinstall all plugins after uninstalling.

See code: @oclif/plugin-plugins

scrollsdk plugins uninstall [PLUGIN]

Removes a plugin from the CLI.

USAGE
  $ scrollsdk plugins uninstall [PLUGIN...] [-h] [-v]

ARGUMENTS
  PLUGIN...  plugin to uninstall

FLAGS
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Removes a plugin from the CLI.

ALIASES
  $ scrollsdk plugins unlink
  $ scrollsdk plugins remove

EXAMPLES
  $ scrollsdk plugins uninstall myplugin

See code: @oclif/plugin-plugins

scrollsdk plugins unlink [PLUGIN]

Removes a plugin from the CLI.

USAGE
  $ scrollsdk plugins unlink [PLUGIN...] [-h] [-v]

ARGUMENTS
  PLUGIN...  plugin to uninstall

FLAGS
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Removes a plugin from the CLI.

ALIASES
  $ scrollsdk plugins unlink
  $ scrollsdk plugins remove

EXAMPLES
  $ scrollsdk plugins unlink myplugin

scrollsdk plugins update

Update installed plugins.

USAGE
  $ scrollsdk plugins update [-h] [-v]

FLAGS
  -h, --help     Show CLI help.
  -v, --verbose

DESCRIPTION
  Update installed plugins.

See code: @oclif/plugin-plugins

scrollsdk setup bootnode-public-p2p

Enable external nodes to form P2P network with cluster bootnodes by setting up static IPs and LoadBalancer services

USAGE
  $ scrollsdk setup bootnode-public-p2p [--cluster-name <value>] [--json] [-N] [--provider aws|gcp] [--region <value>]
    [--values-dir <value>]

FLAGS
  -N, --non-interactive       Run without prompts. Requires --provider flag.
      --cluster-name=<value>  Kubernetes cluster name for resource tagging and identification
      --json                  Output in JSON format (stdout for data, stderr for logs)
      --provider=<option>     Cloud provider for static IP allocation (aws, gcp)
                              <options: aws|gcp>
      --region=<value>        Cloud provider region where resources will be created
      --values-dir=<value>    [default: ./values] Directory containing Helm values files for configuration

DESCRIPTION
  Enable external nodes to form P2P network with cluster bootnodes by setting up static IPs and LoadBalancer services

EXAMPLES
  # Setup static IPs with interactive provider selection

  $ scrollsdk setup bootnode-public-p2p



  # Setup static IPs for AWS with specific cluster and region

  $ scrollsdk setup bootnode-public-p2p --provider=aws --cluster-name=my-cluster --region=us-west-2



  # Setup with custom values directory

  $ scrollsdk setup bootnode-public-p2p --values-dir=./custom-values



  # Non-interactive mode (requires --provider)

  $ scrollsdk setup bootnode-public-p2p --non-interactive --provider=aws --cluster-name=my-cluster --region=us-west-2



  # JSON output mode

  $ scrollsdk setup bootnode-public-p2p --non-interactive --json --provider=aws --cluster-name=my-cluster --region=us-west-2

See code: src/commands/setup/bootnode-public-p2p.ts

scrollsdk setup configs

Generate configuration files and create environment files for services

USAGE
  $ scrollsdk setup configs [--base-fee-per-gas <value>] [--configs-dir <value>] [--deployment-salt <value>]
    [--doge-config <value>] [--image-tag <value>] [--json] [--l1-fee-vault-addr <value>] [--l1-plonk-verifier-addr
    <value>] [--l2-bridge-fee-recipient-addr <value>] [-N] [--skip-deployment-salt-update] [--skip-genesis]
    [--skip-l1-fee-vault-update] [--skip-l1-plonk-verifier-update]

FLAGS
  -N, --non-interactive                       Run without prompts. Uses config values or sensible defaults.
      --base-fee-per-gas=<value>              Base fee per gas (non-interactive mode). Uses existing config value if not
                                              provided.
      --configs-dir=<value>                   [default: values] Directory name to copy configs to
      --deployment-salt=<value>               Deployment salt value (non-interactive mode). If not provided, keeps
                                              existing or auto-increments.
      --doge-config=<value>                   Path to config file (e.g., .data/doge-config-mainnet.toml or
                                              .data/doge-config-testnet.toml)
      --image-tag=<value>                     Specify the Docker image tag to use
      --json                                  Output in JSON format (stdout for data, stderr for logs)
      --l1-fee-vault-addr=<value>             L1 fee vault address (non-interactive mode). Defaults to OWNER_ADDR.
      --l1-plonk-verifier-addr=<value>        L1 plonk verifier address (non-interactive mode). If not provided, one
                                              will be deployed.
      --l2-bridge-fee-recipient-addr=<value>  L2 bridge fee recipient address (non-interactive mode). Defaults to zero
                                              address.
      --skip-deployment-salt-update           Skip deployment salt update (non-interactive mode)
      --skip-genesis                          Skip genesis file generation (Docker step)
      --skip-l1-fee-vault-update              Skip L1 fee vault address update (non-interactive mode)
      --skip-l1-plonk-verifier-update         Skip L1 plonk verifier address update (non-interactive mode)

DESCRIPTION
  Generate configuration files and create environment files for services

EXAMPLES
  $ scrollsdk setup configs

  $ scrollsdk setup configs --image-tag gen-configs-v0.2.0-debug

  $ scrollsdk setup configs --configs-dir ./configs-override

See code: src/commands/setup/configs.ts

scrollsdk setup cubesigner-init

Setup cubesigner keys and roles

USAGE
  $ scrollsdk setup cubesigner-init [--count <value>] [--doge-config <value>] [--json] [--new] [-N] [--role-prefix <value>]
    [--roles <value>...] [--threshold <value>]

FLAGS
  -N, --non-interactive      Run without prompts. Requires --doge-config and either --new (with --count, --role-prefix)
                             or --roles.
      --count=<value>        Number of keys/roles to create (when using --new)
      --doge-config=<value>  Path to config file (e.g., .data/doge-config-mainnet.toml or
                             .data/doge-config-testnet.toml)
      --json                 Output in JSON format (stdout for data, stderr for logs)
      --new                  Create new roles and keys
      --role-prefix=<value>  Prefix for role names (when using --new)
      --roles=<value>...     Comma-separated list of existing role names to use
      --threshold=<value>    Attestation threshold (how many signatures required). Defaults to 2/3 majority.

DESCRIPTION
  Setup cubesigner keys and roles

EXAMPLES
  $ scrollsdk setup cubesigner-init --roles foo_role bar_role baz_role

  $ scrollsdk setup cubesigner-init --new --count 4 --role-prefix attestor

  $ scrollsdk setup cubesigner-init --new --count 3 --role-prefix validator

  $ scrollsdk setup cubesigner-init --roles role_a role_b --doge-config .data/doge-config-testnet.toml

  $ scrollsdk setup cubesigner-init

  $ scrollsdk setup cubesigner-init --non-interactive --new --count 3 --role-prefix validator --threshold 2 --doge-config .data/doge-config-testnet.toml

  $ scrollsdk setup cubesigner-init --non-interactive --json --roles role_a role_b --threshold 2 --doge-config .data/doge-config-testnet.toml

See code: src/commands/setup/cubesigner-init.ts

scrollsdk setup cubesigner-refresh

Refresh cubesigner session secrets

USAGE
  $ scrollsdk setup cubesigner-refresh [--doge-config <value>] [--email <value>] [--environment <value>] [--json] [-N]
    [--org-id <value>]

FLAGS
  -N, --non-interactive      Run without prompts. Requires --doge-config. If not logged in, also requires --org-id and
                             --email.
      --doge-config=<value>  Path to config file (e.g., .data/doge-config-mainnet.toml or
                             .data/doge-config-testnet.toml)
      --email=<value>        CubeSigner account email (for non-interactive login if not already logged in)
      --environment=<value>  [default: gamma] CubeSigner environment (default: gamma)
      --json                 Output in JSON format (stdout for data, stderr for logs)
      --org-id=<value>       CubeSigner organization ID (for non-interactive login if not already logged in)

DESCRIPTION
  Refresh cubesigner session secrets

EXAMPLES
  $ scrollsdk setup cubesigner-refresh

  $ scrollsdk setup cubesigner-refresh --doge-config .data/doge-config-testnet.toml

  $ scrollsdk setup cubesigner-refresh --non-interactive --doge-config .data/doge-config-testnet.toml

  $ scrollsdk setup cubesigner-refresh --non-interactive --json --doge-config .data/doge-config-testnet.toml --org-id Org#xxx --email [email protected]

See code: src/commands/setup/cubesigner-refresh.ts

scrollsdk setup db-init

Initialize databases with new users and passwords interactively or update permissions

USAGE
  $ scrollsdk setup db-init [-c] [-d] [--json] [-N] [-u] [--update-port <value>]

FLAGS
  -N, --non-interactive      Run without prompts, using config.toml values. Requires [db.admin] section with
                             PUBLIC_HOST, PUBLIC_PORT, USERNAME, PASSWORD (or $ENV: refs)
  -c, --clean                Delete existing database and user before creating new ones
  -d, --debug                Show debug output including SQL queries
  -u, --update-permissions   Update permissions for existing users
      --json                 Output in JSON format (stdout for data, stderr for logs)
      --update-port=<value>  Update the port of current database values

DESCRIPTION
  Initialize databases with new users and passwords interactively or update permissions

EXAMPLES
  $ scrollsdk setup db-init

  $ scrollsdk setup db-init --update-permissions

  $ scrollsdk setup db-init --update-permissions --debug

  $ scrollsdk setup db-init --clean

  $ scrollsdk setup db-init --update-db-port=25061

  $ scrollsdk setup db-init --non-interactive

  $ scrollsdk setup db-init --non-interactive --json --clean

See code: src/commands/setup/db-init.ts

scrollsdk setup disable-internal

Disable ingress for internal services (Celestia, Dogecoin, Anvil L1)

USAGE
  $ scrollsdk setup disable-internal [--dry-run] [-f] [--list-k8s |  | [--disable <value> | --list | --enable <value> |
    --disable-internal] |  | ] [-n <value>] [--skip-helm] [--values-dir <value>]

FLAGS
  -f, --force               Skip confirmation prompts
  -n, --namespace=<value>   [default: default] Kubernetes namespace
      --disable=<value>     Disable ingress for a service
      --disable-internal    Disable all internal services (Celestia, Dogecoin, Anvil L1) using kubectl
      --dry-run             Show what would be deleted without actually deleting
      --enable=<value>      Enable ingress for a service
      --list                List current ingress status from local values files
      --list-k8s            List current ingress status from Kubernetes cluster
      --skip-helm           Skip helm upgrade
      --values-dir=<value>  [default: ./values] Directory containing values files

DESCRIPTION
  Disable ingress for internal services (Celestia, Dogecoin, Anvil L1)

EXAMPLES
  $ scrollsdk setup disable-internal

  $ scrollsdk setup disable-internal --namespace scroll

  $ scrollsdk setup disable-internal --dry-run

  $ scrollsdk setup disable-internal --list

  $ scrollsdk setup disable-internal --list-k8s

  $ scrollsdk setup disable-internal --enable l2-rpc

  $ scrollsdk setup disable-internal --disable frontends

See code: src/commands/setup/disable-internal.ts

scrollsdk setup dogecoin-wallet-import

Dogecoin wallet import

USAGE
  $ scrollsdk setup dogecoin-wallet-import [--doge-config <value>] [--image-tag <value>]

FLAGS
  --doge-config=<value>  Path to doge-config toml (e.g., .data/doge-config-testnet.toml)
  --image-tag=<value>    Docker image tag

DESCRIPTION
  Dogecoin wallet import

See code: src/commands/setup/dogecoin-wallet-import.ts

scrollsdk setup domains

Set up domain configurations for external services

USAGE
  $ scrollsdk setup domains [--json] [-N]

FLAGS
  -N, --non-interactive  Run without prompts, using config.toml values
      --json             Output in JSON format (stdout for data, stderr for logs)

DESCRIPTION
  Set up domain configurations for external services

EXAMPLES
  $ scrollsdk setup domains

  $ scrollsdk setup domains --non-interactive

  $ scrollsdk setup domains --non-interactive --json

See code: src/commands/setup/domains.ts

scrollsdk setup gas-token

Set up gas token configurations

USAGE
  $ scrollsdk setup gas-token

DESCRIPTION
  Set up gas token configurations

EXAMPLES
  $ scrollsdk setup gas-token

See code: src/commands/setup/gas-token.ts

scrollsdk setup gen-keystore

Generate keystore and account keys for L2 Geth

USAGE
  $ scrollsdk setup gen-keystore [--accounts] [--bootnode-count <value>] [--json] [-N] [--regenerate-bootnodes]
    [--regenerate-sequencers] [--sequencer-count <value>] [--sequencer-password <value>]

FLAGS
  -N, --non-interactive             Run without prompts. Uses existing keys or generates new ones based on flags.
      --[no-]accounts               Generate account key pairs
      --bootnode-count=<value>      [default: 2] Number of bootnodes. In non-interactive mode, generates if not enough
                                    exist.
      --json                        Output in JSON format (stdout for data, stderr for logs)
      --regenerate-bootnodes        Force regeneration of all bootnode keys (non-interactive mode)
      --regenerate-sequencers       Force regeneration of all sequencer keys (non-interactive mode)
      --sequencer-count=<value>     [default: 2] Number of sequencers (including primary). In non-interactive mode,
                                    generates if not enough exist.
      --sequencer-password=<value>  Password for sequencer keystores (or use $ENV:VAR_NAME pattern in config). Required
                                    for new sequencers in non-interactive mode.

DESCRIPTION
  Generate keystore and account keys for L2 Geth

EXAMPLES
  $ scrollsdk setup gen-keystore

  $ scrollsdk setup gen-keystore --no-accounts

  $ scrollsdk setup gen-keystore --non-interactive

  $ scrollsdk setup gen-keystore --non-interactive --json --sequencer-count 2 --bootnode-count 2

See code: src/commands/setup/gen-keystore.ts

scrollsdk setup gen-rpc-package

Generate configuration files for dogeos-rpc-package to enable external RPC nodes

USAGE
  $ scrollsdk setup gen-rpc-package -d <value> [--config-path <value>] [--doge-config <value>] [-n <value>] [--values-dir
    <value>]

FLAGS
  -d, --dogeos-rpc-package-dir=<value>  (required) Path to dogeos-rpc-package project directory (clone from
                                        https://github.com/dogeos69/dogeos-rpc-package)
  -n, --namespace=<value>               Kubernetes namespace
      --config-path=<value>             [default: ./config.toml] Path to config.toml file containing cluster
                                        configuration
      --doge-config=<value>             Path to doge config file to determine network type (mainnet/testnet)
      --values-dir=<value>              [default: ./values] Directory containing Helm values files (must include
                                        genesis.yaml)

DESCRIPTION
  Generate configuration files for dogeos-rpc-package to enable external RPC nodes

EXAMPLES
  # Generate RPC package (dogeos-rpc-package directory is required)

  $ scrollsdk setup gen-rpc-package -d ~/github/dogeos-rpc-package/



  # Generate mainnet RPC package with specific config and namespace

  $ scrollsdk setup gen-rpc-package --doge-config .data/doge-config-mainnet.toml -d ~/github/dogeos-rpc-package/ -n scroll-mainnet



  # First clone the project: git clone https://github.com/dogeos69/dogeos-rpc-package

  $ scrollsdk setup gen-rpc-package -d ./dogeos-rpc-package/ --namespace default

See code: src/commands/setup/gen-rpc-package.ts

scrollsdk setup generate-from-spec

Generate all configuration files from a DeploymentSpec YAML file

USAGE
  $ scrollsdk setup generate-from-spec -s <value> [--config-only] [--dry-run] [-f] [--json] [-o <value>] [--values-only]

FLAGS
  -f, --force           Overwrite existing files without warning
  -o, --output=<value>  [default: .] Output directory for generated files
  -s, --spec=<value>    (required) Path to DeploymentSpec YAML file
      --config-only     Only generate config.toml, doge-config.toml, setup_defaults.toml
      --dry-run         Validate spec and show what would be generated without writing files
      --json            Output in JSON format (stdout for data, stderr for logs)
      --values-only     Only generate values/*.yaml Helm files

DESCRIPTION
  Generate all configuration files from a DeploymentSpec YAML file

EXAMPLES
  # Generate configs in current directory

  $ scrollsdk setup generate-from-spec --spec deployment-spec.yaml



  # Generate configs to specific output directory

  $ scrollsdk setup generate-from-spec --spec deployment-spec.yaml --output ./my-deployment



  # Generate with JSON output for automation

  $ scrollsdk setup generate-from-spec --spec deployment-spec.yaml --json



  # Dry run - validate and show what would be generated

  $ scrollsdk setup generate-from-spec --spec deployment-spec.yaml --dry-run



  # Generate only specific config types

  $ scrollsdk setup generate-from-spec --spec deployment-spec.yaml --config-only

  $ scrollsdk setup generate-from-spec --spec deployment-spec.yaml --values-only

See code: src/commands/setup/generate-from-spec.ts

scrollsdk setup prep-charts

Validate Makefile and prepare Helm charts for Scroll SDK

USAGE
  $ scrollsdk setup prep-charts [--doge-config <value>] [--github-token <value>] [--github-username <value>] [--json]
    [-N] [--skip-auth-check] [--values-dir <value>]

FLAGS
  -N, --non-interactive          Run without prompts. Auto-applies all detected changes.
      --doge-config=<value>      Path to config file (e.g., .data/doge-config-mainnet.toml or
                                 .data/doge-config-testnet.toml)
      --github-token=<value>     GitHub Personal Access Token
      --github-username=<value>  GitHub username
      --json                     Output in JSON format (stdout for data, stderr for logs)
      --skip-auth-check          Skip authentication check for individual charts
      --values-dir=<value>       [default: ./values] Directory containing values files

DESCRIPTION
  Validate Makefile and prepare Helm charts for Scroll SDK

EXAMPLES
  $ scrollsdk setup prep-charts

  $ scrollsdk setup prep-charts --github-username=your-username --github-token=your-token

  $ scrollsdk setup prep-charts --values-dir=./custom-values

  $ scrollsdk setup prep-charts --skip-auth-check

See code: src/commands/setup/prep-charts.ts

scrollsdk setup push-secrets

Push secrets to the selected secret service

USAGE
  $ scrollsdk setup push-secrets [--aws-prefix <value>] [--aws-region <value>] [--aws-service-account <value>] [-c] [-d]
    [-f <value>] [--json] [-N] [--provider aws|vault] [--skip-yaml-update] [--values-dir <value>] [--vault-path <value>]
    [--vault-server <value>] [--vault-token-secret-key <value>] [--vault-token-secret-name <value>] [--vault-version
    <value>]

FLAGS
  -N, --non-interactive                  Run without prompts. Auto-overrides existing secrets.
  -c, --cubesigner-only                  Only push CubeSigner related secrets (cubesigner-signer-* files)
  -d, --debug                            Show debug output
  -f, --file=<value>                     Specific secret file to push (e.g., my-secret.json)
      --aws-prefix=<value>               [default: dogeos] AWS Secrets Manager path prefix (e.g., dogeos/testnet)
      --aws-region=<value>               AWS region for secrets (e.g., us-east-1)
      --aws-service-account=<value>      [default: external-secrets] AWS IAM service account
      --json                             Output in JSON format (stdout for data, stderr for logs)
      --provider=<option>                Secret service provider (aws or vault). Required for non-interactive mode.
                                         <options: aws|vault>
      --skip-yaml-update                 Skip updating production YAML files with new secret provider
      --values-dir=<value>               [default: values] Directory containing the values files
      --vault-path=<value>               [default: scroll] Vault path prefix
      --vault-server=<value>             [default: http://vault.default.svc.cluster.local:8200] Vault server URL
      --vault-token-secret-key=<value>   [default: token] Vault token secret key
      --vault-token-secret-name=<value>  [default: vault-token] Vault token secret name
      --vault-version=<value>            [default: v2] Vault version

DESCRIPTION
  Push secrets to the selected secret service

EXAMPLES
  $ scrollsdk setup push-secrets

  $ scrollsdk setup push-secrets --debug

  $ scrollsdk setup push-secrets --values-dir custom-values

  $ scrollsdk setup push-secrets --cubesigner-only

  $ scrollsdk setup push-secrets -c --debug

See code: src/commands/setup/push-secrets.ts

scrollsdk setup tls

Update TLS configuration in Helm charts

USAGE
  $ scrollsdk setup tls [--cluster-issuer <value>] [--create-issuer] [-d] [--issuer-email <value>] [--json]
    [-N] [--values-dir <value>]

FLAGS
  -N, --non-interactive         Run without prompts. Requires --cluster-issuer or (--create-issuer with --issuer-email)
  -d, --debug                   Show debug output and confirm before making changes
      --cluster-issuer=<value>  Specify the ClusterIssuer to use (for non-interactive mode)
      --create-issuer           Create a letsencrypt-prod ClusterIssuer if none exists (for non-interactive mode)
      --issuer-email=<value>    Email address for the ClusterIssuer (required with --create-issuer)
      --json                    Output in JSON format (stdout for data, stderr for logs)
      --values-dir=<value>      [default: values] Directory containing the values files

DESCRIPTION
  Update TLS configuration in Helm charts

EXAMPLES
  $ scrollsdk setup tls

  $ scrollsdk setup tls --debug

  $ scrollsdk setup tls --values-dir custom-values

  $ scrollsdk setup tls --non-interactive --cluster-issuer letsencrypt-prod

  $ scrollsdk setup tls --non-interactive --json --cluster-issuer letsencrypt-prod

  $ scrollsdk setup tls --non-interactive --create-issuer --issuer-email [email protected]

See code: src/commands/setup/tls.ts

scrollsdk setup verify-contracts

Set up contracts verification

USAGE
  $ scrollsdk setup verify-contracts [--image-tag <value>]

FLAGS
  --image-tag=<value>  Specify the Docker image tag to use

DESCRIPTION
  Set up contracts verification

EXAMPLES
  $ scrollsdk setup verify-contracts

  $ scrollsdk setup verify-contracts --image-tag verify-v0.2.0-debug

See code: src/commands/setup/verify-contracts.ts

scrollsdk test contracts

Test contracts by checking deployment and initialization

USAGE
  $ scrollsdk test contracts [-c <value>] [-n <value>] [-p]

FLAGS
  -c, --config=<value>     [default: ./config.toml] Path to config.toml file
  -n, --contracts=<value>  [default: ./config-contracts.toml] Path to configs-contracts.toml file
  -p, --pod                Run inside Kubernetes pod

DESCRIPTION
  Test contracts by checking deployment and initialization

See code: src/commands/test/contracts.ts

scrollsdk test dependencies

Check for required dependencies

USAGE
  $ scrollsdk test dependencies [-d]

FLAGS
  -d, --dev  Include development dependencies

DESCRIPTION
  Check for required dependencies

See code: src/commands/test/dependencies.ts

scrollsdk test dogeos [CASENAME]

Run DogeOS integration tests.

USAGE
  $ scrollsdk test dogeos [CASENAME] [--attackValue <value>] [-b <value>] [--l2PrivateKey <value>] [-m <value>]
    [-c <value>] [-v <value>] [--verbose]

ARGUMENTS
  CASENAME  The name of the case to run

FLAGS
  -b, --blockbookurl=<value>  [default: https://doge-electrs-testnet-demo.qed.me] blockbook url
  -c, --outputcount=<value>   [default: 24] Number of P2PKH outputs when running the multiple-output scenario
  -m, --masterwif=<value>     [default: cftTTdqFUYi3Njx4VLZGATAFCuX8wetJddD71FGmC91wKJ2XidVY] master wif key, provide
                              test dogecoin
  -v, --outputvalue=<value>   [default: 1000000] Value per P2PKH output (in dogetoshis) when running the multiple-output
                              scenario
      --attackValue=<value>   [default: 100000000000] Output value in dogetoshis for bridge UTXO attack scenario
      --l2PrivateKey=<value>  [default: 0x713137ab6bfaf197200b4f1e033bb3abadaf76564f6b2ca4f00aaa90c3c8efe5]
      --verbose               Enable detailed verbose logging

DESCRIPTION
  Run DogeOS integration tests.

  Available Test Cases:
  - 1: Multiple OP_RETURN - Send a transaction with multiple OP_RETURN outputs
  - 2: Multiple Output - Send a transaction with many P2PKH outputs
  - 3: Bridge UTXO Attack - Simulate a UTXO fan-out attack on the bridge
  - 4: Multiple Withdrawal Per Tx - Test multiple withdrawals in a single L2 transaction
  - 5: Large PSBT - Construct and broadcast a large transaction with many inputs
  - 6: Fee Wallet 2000 Inputs - Send M+1 to the fee wallet using 2000 inputs via an agent
  - 7: Replace Mempool TXs (Master) - Bump-fee replace masterAddress mempool transactions with self-spends
  - 8: CPFP Master Mempool - Use CPFP to bump-fee unconfirmed masterAddress transactions
  - 0: Run All Cases - Execute all test cases sequentially

EXAMPLES
  $ scrollsdk test dogeos

  $ scrollsdk test dogeos multiple-opreturn

  $ scrollsdk test dogeos multiple-output --bridge=n...

See code: src/commands/test/dogeos.ts

scrollsdk test e2e

Test contracts by checking deployment and initialization

USAGE
  $ scrollsdk test e2e [-c <value>] [-n <value>] [-m] [-p] [-k <value>] [-r] [-s]

FLAGS
  -c, --config=<value>          [default: ./config.toml] Path to config.toml file
  -k, --private-key=<value>     Private key for funder wallet initialization
  -m, --manual                  Manually fund the test wallet.
  -n, --contracts=<value>       [default: ./config-contracts.toml] Path to configs-contracts.toml file
  -p, --pod                     Run inside Kubernetes pod
  -r, --resume                  Uses e2e_resume.json to continue last run.
  -s, --skip-wallet-generation  Manually fund the test wallet.

DESCRIPTION
  Test contracts by checking deployment and initialization

See code: src/commands/test/e2e.ts

scrollsdk test ingress

Check for required ingress hosts and validate frontend URLs

USAGE
  $ scrollsdk test ingress [-c <value>] [-d] [-n <value>]

FLAGS
  -c, --config=<value>     Path to config.toml file
  -d, --dev                Include development ingresses
  -n, --namespace=<value>  [default: default] Kubernetes namespace

DESCRIPTION
  Check for required ingress hosts and validate frontend URLs

See code: src/commands/test/ingress.ts