## forge script

Run a smart contract as a script, building transactions that can be sent onchain

:::terminal

```bash
$ forge script --help
```

````txt
Usage: forge script [OPTIONS] <PATH> [ARGS]...

Arguments:
  <PATH>
          The contract you want to run. Either the file path or contract name.
          
          If multiple contracts exist in the same file you must specify the
          target contract with --target-contract.

  [ARGS]...
          Arguments to pass to the script function

Options:
  -j, --threads <THREADS>
          Number of threads to use. Specifying 0 defaults to the number of
          logical cores
          
          [aliases: --jobs]

      --target-contract <CONTRACT_NAME>
          The name of the contract you want to run
          
          [aliases: --tc]

  -s, --sig <SIG>
          The signature of the function you want to call in the contract, or raw
          calldata
          
          [default: run]

      --priority-gas-price <PRICE>
          Max priority fee per gas for EIP1559 transactions
          
          [env: ETH_PRIORITY_GAS_PRICE=]

      --legacy
          Use legacy transactions instead of EIP1559 ones.
          
          This is auto-enabled for common networks without EIP1559.

      --estimate <PRESET>
          How to estimate EIP-1559 fees: `low`, `market` (default), or
          `aggressive`.
          
          The preset sets the priority-fee percentile and the `maxFeePerGas`
          buffer (`low`: `base_fee * 1.5`, others: `* 2`); `low`'s tighter
          buffer is more likely to stall if the base fee rises.
          `--with-gas-price` and `--priority-gas-price` override only
          `maxFeePerGas` and `maxPriorityFeePerGas` respectively. Ignored for
          `--legacy`.

          Possible values:
          - low:        Lower priority-fee percentile (10th) and a tighter
            base-fee buffer (`base_fee * 1.5`). This only lowers the tip
            estimate and the max-fee cap, not the base fee that is actually
            paid, and risks the transaction stalling if the base fee rises
          - market:     Default: `base_fee * 2` plus a 20th-percentile priority
            fee
          - aggressive: Higher priority-fee percentile (50th) to bid a larger
            tip for faster inclusion

      --broadcast
          Broadcasts the transactions

      --batch
          Batch all broadcast transactions into a single Tempo batch
          transaction.
          
          When enabled, all vm.broadcast() calls are collected and sent as a
          single atomic type 0x76 transaction instead of individual
          transactions. This provides atomicity (all-or-nothing execution) and
          gas savings.

  -h, --help
          Print help (see a summary with '-h')

Display options:
  -v, --verbosity...
          Verbosity level of the log messages.
          
          Pass multiple times to increase the verbosity (e.g. -v, -vv, -vvv).
          
          Depending on the context the verbosity levels have different meanings.
          
          For example, the verbosity levels of the EVM are:
          - 2 (-vv): Print logs for all tests.
          - 3 (-vvv): Print execution traces for failing tests.
          - 4 (-vvvv): Print execution traces for all tests, and setup traces
          for failing tests.
          - 5 (-vvvvv): Print execution and setup traces for all tests,
          including storage changes and
            backtraces with line numbers.

  -q, --quiet
          Do not print log messages

      --json
          Format log messages as JSON

      --md
          Format log messages as Markdown

      --color <COLOR>
          The color of the log messages

          Possible values:
          - auto:   Intelligently guess whether to use color output (default)
          - always: Force color output
          - never:  Force disable color output

Tempo:
      --tempo.session <SESSION_ID>
          Use a live Tempo wallet session for signing.
          
          When set, Foundry resolves the session from
          `$TEMPO_HOME/wallet/sessions.toml` and signs Tempo transactions with
          the session's temporary access key on behalf of its root account.

      --tempo.fee-token <FEE_TOKEN>
          Fee token address, numeric TIP-20 token id, or known symbol for Tempo
          transactions.
          
          When set, builds a Tempo (type 0x76) transaction that pays gas fees in
          the specified token. Known symbols are PathUSD, AlphaUSD, BetaUSD, and
          ThetaUSD.
          
          If this is not set, the fee token is chosen according to network
          rules. See the Tempo docs for more information.

      --tempo.expires <SECONDS>
          Opt into TIP-1009 expiring-nonce mode with a validity window.
          
          Convenience flag that combines `--tempo.expiring-nonce` with a
          relative `--tempo.valid-before`. Sets nonce_key = U256::MAX, nonce =
          0, and valid_before = now + seconds.
          
          Maximum value is 30 seconds. The transaction must be mined before the
          deadline or it becomes permanently invalid, giving safe retry
          semantics: retries produce a fresh tx hash and the old tx can never
          land late.

      --tempo.nonce-key <NONCE_KEY>
          Nonce key for Tempo parallelizable nonces.
          
          When set, builds a Tempo (type 0x76) transaction with the specified
          nonce key, allowing multiple transactions with the same nonce but
          different keys to be executed in parallel. If not set, the protocol
          nonce key (0) will be used.
          
          For more information see
          [https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#parallelizable-nonces](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#parallelizable-nonces).

      --tempo.lane <NAME>
          Named nonce lane for Tempo parallelizable nonces.
          
          Resolves a friendly lane name (e.g. `deploy`, `payments`) to a
          `nonce_key` via a shared lanes file (default: `tempo.lanes.toml` at
          the project root). The lanes file is a TOML map of `name = <U256>`
          entries, e.g.:
          
          ```toml deploy   = 1 ops      = 2 payments = 3 ```
          
          Mutually exclusive with `--tempo.nonce-key`.

      --tempo.lanes-file <PATH>
          Path to the Tempo lanes file used by `--tempo.lane`.
          
          Defaults to `tempo.lanes.toml` at the project root.

      --tempo.sponsor <ADDRESS>
          Sponsor (fee payer) address for Tempo sponsored transactions

      --tempo.sponsor-signer <SIGNER>
          Sign Tempo sponsor digests in-band with the given signer URI.
          
          Supported forms include `env://VAR`, `keystore://PATH`,
          `account://NAME`, `ledger://`, `trezor://`, `aws://`, `gcp://`,
          `turnkey://`, and `private-key://KEY`.

      --tempo.sponsor-sig <SPONSOR_SIG>
          Sponsor (fee payer) signature for Tempo sponsored transactions.
          
          The sponsor signs the `fee_payer_signature_hash` to commit to paying
          gas fees on behalf of the sender. Provide as a hex-encoded signature.

      --sponsor-url <URL>
          Remote sponsor (fee payer) service URL.
          
          When set, the user-signed transaction is forwarded to this URL via
          `eth_signRawTransaction`. The service adds its fee payer signature and
          returns the fully-sponsored transaction, which is then submitted via
          the regular RPC. No local sponsor key is required.
          
          Example: `cast send 0x... --sponsor-url
          https://sponsor.tempo.xyz/tp_abc123`
          
          [env: TEMPO_SPONSOR_URL=]

      --tempo.print-sponsor-hash
          Print the sponsor signature hash and exit.
          
          Computes the `fee_payer_signature_hash` for the transaction so that a
          sponsor knows what hash to sign. The transaction is not sent.

      --tempo.key-id <KEY_ID>
          Access key ID for Tempo Keychain signature transactions.
          
          Used during gas estimation to override the key_id that would normally
          be recovered from the signature.

      --tempo.expiring-nonce
          Enable expiring nonce mode for Tempo transactions.
          
          Sets nonce to 0 and nonce_key to U256::MAX, enabling time-bounded
          transaction validity via `--tempo.valid-before` and
          `--tempo.valid-after`.

      --tempo.valid-before <VALID_BEFORE>
          Upper bound timestamp for Tempo expiring nonce transactions.
          
          The transaction is only valid before this unix timestamp. Requires
          `--tempo.expiring-nonce`.

      --tempo.valid-after <VALID_AFTER>
          Lower bound timestamp for Tempo expiring nonce transactions.
          
          The transaction is only valid after this unix timestamp. Requires
          `--tempo.expiring-nonce`.

      --session
          Create a temporary Tempo wallet session for this script run

      --session-root <ADDRESS>
          Root account that authorizes the temporary session

      --session-expires <DURATION>
          Session lifetime, expressed as a duration like `10m`, `2h`, or `7d`

      --session-scope <SCOPE>
          Allowed call scope, in `TARGET[:SELECTORS[@RECIPIENTS]]` format

      --session-target <ADDRESS>
          Allowed call target for issue-style `--target ... --selector ...`
          input

      --session-selector <SELECTOR>
          Function selector allowed for `--session-target`, such as
          `register(address)`

      --session-spend-limit <LIMIT>
          Token spend limit, in `TOKEN:AMOUNT` or `TOKEN=AMOUNT` format

      --session-interactive
          Open an interactive prompt for the root private key

      --session-private-key <RAW_PRIVATE_KEY>
          Root private key that signs the session authorization

      --session-mnemonic <MNEMONIC>
          Root mnemonic phrase or mnemonic file path

      --session-mnemonic-passphrase <PASSPHRASE>
          Passphrase for `--session-mnemonic`

      --session-hd-path <PATH>
          Wallet derivation path for the root signer

      --session-mnemonic-index <INDEX>
          Mnemonic or hardware-wallet index for the root signer

      --session-keystore <PATH>
          Root keystore path

      --session-account <ACCOUNT_NAME>
          Root account name from the default keystore directory

      --session-password <PASSWORD>
          Root keystore password

      --session-password-file <PATH>
          Root keystore password file

      --session-ledger
          Use a Ledger as the root signer

      --session-trezor
          Use a Trezor as the root signer

      --skip-simulation
          Skips on-chain simulation

  -g, --gas-estimate-multiplier <GAS_ESTIMATE_MULTIPLIER>
          Relative percentage to multiply gas estimates by
          
          [default: 130]

      --unlocked
          Send via `eth_sendTransaction` using the `--sender` argument as sender

      --resume
          Resumes submitting transactions that failed or timed-out previously.
          
          It DOES NOT simulate the script again and it expects nonces to have
          remained the same.
          
          Example: If transaction N has a nonce of 22, then the account should
          have a nonce of 22, otherwise it fails.

      --multi
          If present, --resume or --verify will be assumed to be a multi chain
          deployment

      --debug
          Open the script in the debugger.
          
          Takes precedence over broadcast.

      --debug-layout <DEBUG_LAYOUT>
          Debugger layout to use

          Possible values:
          - auto:       Select horizontal or vertical layout from the terminal
            size
          - horizontal: Force the two-column debugger layout
          - vertical:   Force the single-column debugger layout

      --dump <PATH>
          Dumps all debugger steps to file

      --slow
          Makes sure a transaction is sent, only after its previous one has been
          confirmed and succeeded

      --non-interactive
          Disables interactive prompts that might appear when deploying big
          contracts.
          
          For more info on the contract size limit, see EIP-170:
          [https://eips.ethereum.org/EIPS/eip-170](https://eips.ethereum.org/EIPS/eip-170)

      --disable-code-size-limit
          Disables the contract size limit during script execution

      --disable-labels
          Disables the labels in the traces

      --etherscan-api-key <KEY>
          The Etherscan (or equivalent) API key
          
          [env: ETHERSCAN_API_KEY=]

      --verify
          Verifies all the contracts found in the receipts of a script, if any

      --with-gas-price <PRICE>
          Gas price for legacy transactions, or max fee per gas for EIP1559
          transactions, either specified in wei, or as a string with a unit
          type.
          
          Examples: 1ether, 10gwei, 0.01ether
          
          [env: ETH_GAS_PRICE=]

      --timeout <TIMEOUT>
          Timeout to use for broadcasting transactions
          
          [env: ETH_TIMEOUT=]

Cache options:
      --force
          Clear the cache and artifacts folder and recompile

Build options:
      --no-cache
          Disable the cache

      --no-dynamic-test-linking
          Disable dynamic test linking

      --skip <SKIP>...
          Skip building files whose names contain the given filter.
          
          `test` and `script` are aliases for `.t.sol` and `.s.sol`.

Linker options:
      --libraries <LIBRARIES>
          Set pre-linked libraries
          
          [env: DAPP_LIBRARIES=]

Compiler options:
      --ignored-error-codes <ERROR_CODES>
          Ignore solc warnings by error code

  -D, --deny <LEVEL>
          A compiler error will be triggered at the specified diagnostic level.
          
          Replaces the deprecated `--deny-warnings` flag.
          
          Possible values: - `never`: Do not treat any diagnostics as errors. -
          `warnings`: Treat warnings as errors. - `notes`: Treat both, warnings
          and notes, as errors.

          Possible values:
          - never:    Always exit with zero code
          - warnings: Exit with a non-zero code if any warnings are found
          - notes:    Exit with a non-zero code if any notes or warnings are
            found

      --no-auto-detect
          Do not auto-detect the `solc` version

      --use <SOLC_VERSION>
          Specify the solc version, or a path to a local solc, to build with.
          
          Valid values are in the format `x.y.z`, `solc:x.y.z` or
          `path/to/solc`.

      --offline
          Do not access the network.
          
          Missing solc versions will not be installed.

      --via-ir
          Use the Yul intermediate representation compilation pipeline

      --use-literal-content
          Changes compilation to only use literal content and not URLs

      --no-metadata
          Do not append any metadata to the bytecode.
          
          This is equivalent to setting `bytecode_hash` to `none` and
          `cbor_metadata` to `false`.

      --ast
          Includes the AST as JSON in the compiler output

      --evm-version <VERSION>
          The target EVM version

      --optimize [<OPTIMIZE>]
          Activate the Solidity optimizer
          
          [possible values: true, false]

      --experimental
          Enable Solidity's experimental mode.
          
          This passes `--experimental` to solc, which is required by Solidity
          0.8.35+ for experimental features.

      --optimizer-runs <RUNS>
          The number of runs specifies roughly how often each opcode of the
          deployed code will be executed across the life-time of the contract.
          This means it is a trade-off parameter between code size (deploy cost)
          and code execution cost (cost after deployment). An `optimizer_runs`
          parameter of `1` will produce short but expensive code. In contrast, a
          larger `optimizer_runs` parameter will produce longer but more gas
          efficient code

      --extra-output <SELECTOR>...
          Extra output to include in the contract's artifact.
          
          Example keys: evm.assembly, ewasm, ir, irOptimized, metadata
          
          For a full description, see
          [https://docs.soliditylang.org/en/v0.8.13/using-the-compiler.html#input-description](https://docs.soliditylang.org/en/v0.8.13/using-the-compiler.html#input-description)

      --extra-output-files <SELECTOR>...
          Extra output to write to separate files.
          
          Valid values: metadata, ir, irOptimized, ewasm, evm.assembly

Project options:
  -o, --out <PATH>
          The path to the contract artifacts folder

      --revert-strings <REVERT>
          Revert string configuration.
          
          Possible values are "default", "strip" (remove), "debug"
          (Solidity-generated revert strings) and "verboseDebug"

      --build-info
          Generate build info files

      --build-info-path <PATH>
          Output path to directory that build info files will be written to

      --root <PATH>
          The project's root path.
          
          By default root of the Git repository, if in one, or the current
          working directory.

  -C, --contracts <PATH>
          The contracts source directory

  -R, --remappings <REMAPPINGS>
          The project's remappings

      --remappings-env <ENV>
          The project's remappings from the environment

      --cache-path <PATH>
          The path to the compiler cache

      --lib-paths <PATH>
          The path to the library folder

      --hardhat
          Use the Hardhat-style project layout.
          
          This is the same as using: `--contracts contracts --lib-paths
          node_modules`.
          
          [aliases: --hh]

      --config-path <FILE>
          Path to the config file

Wallet options - raw:
      --interactives <NUM>
          Open an interactive prompt to enter your private key.
          
          Takes a value for the number of keys to enter.
          
          [default: 0]

  -i, --interactive
          Open an interactive prompt to enter your private key

      --private-keys <RAW_PRIVATE_KEYS>
          Use the provided private keys

      --private-key <RAW_PRIVATE_KEY>
          Use the provided private key

      --mnemonics <MNEMONICS>
          Use the mnemonic phrases of mnemonic files at the specified paths

      --mnemonic-passphrases <PASSPHRASE>
          Use a BIP39 passphrases for the mnemonic

      --mnemonic-derivation-paths <PATH>
          The wallet derivation path.
          
          Works with both --mnemonic-path and hardware wallets.

      --mnemonic-indexes <INDEXES>
          Use the private key from the given mnemonic index.
          
          Can be used with --mnemonics, --ledger, --aws and --trezor.
          
          [default: 0]

Wallet options - keystore:
      --keystore <PATHS>
          Use the keystore by its filename in the given folder
          
          [env: ETH_KEYSTORE=]
          [aliases: --keystores]

      --account <ACCOUNT_NAMES>
          Use a keystore from the default keystores folder
          (~/.foundry/keystores) by its filename
          
          [env: ETH_KEYSTORE_ACCOUNT=]
          [aliases: --accounts]

      --password <PASSWORDS>
          The keystore password.
          
          Used with --keystore.

      --password-file <PATHS>
          The keystore password file path.
          
          Used with --keystore.
          
          [env: ETH_PASSWORD=]

Wallet options - hardware wallet:
  -l, --ledger
          Use a Ledger hardware wallet

  -t, --trezor
          Use a Trezor hardware wallet

Wallet options - remote:
      --aws
          Use AWS Key Management Service.
          
          Ensure either one of AWS_KMS_KEY_IDS (comma-separated) or
          AWS_KMS_KEY_ID environment variables are set.

      --gcp
          Use Google Cloud Key Management Service.
          
          Ensure the following environment variables are set: GCP_PROJECT_ID,
          GCP_LOCATION, GCP_KEY_RING, GCP_KEY_NAME, GCP_KEY_VERSION.
          
          See: [https://cloud.google.com/kms/docs](https://cloud.google.com/kms/docs)

      --turnkey
          Use Turnkey.
          
          Ensure the following environment variables are set:
          TURNKEY_API_PRIVATE_KEY, TURNKEY_ORGANIZATION_ID, TURNKEY_ADDRESS.
          
          See: [https://docs.turnkey.com/getting-started/quickstart](https://docs.turnkey.com/getting-started/quickstart)

Wallet options - browser wallet:
      --browser
          Use a browser wallet

      --browser-port <PORT>
          Port for the browser wallet server
          
          [default: 9545]

      --browser-disable-open
          Whether to open the browser for wallet connection

EVM options:
  -r, --rpc-url <URL>
          The RPC endpoint
          
          [aliases: --fork-url]

  -k, --insecure
          Allow insecure RPC connections (accept invalid HTTPS certificates).
          
          When the provider's inner runtime transport variant is HTTP, this
          configures the reqwest client to accept invalid certificates.

      --rpc-timeout <RPC_TIMEOUT>
          Timeout for the RPC request in seconds.
          
          The specified timeout will be used to override the default timeout for
          RPC requests.
          
          Default value: 45
          
          [env: ETH_RPC_TIMEOUT=]

      --no-proxy
          Disable automatic proxy detection.
          
          Use this in sandboxed environments (e.g., Cursor IDE sandbox, macOS
          App Sandbox) where system proxy detection causes crashes. When
          enabled, HTTP_PROXY/HTTPS_PROXY environment variables and system proxy
          settings will be ignored.

      --compute-units-per-second <CUPS>
          Sets the number of assumed available compute units per second for this
          provider.
          
          default value: 330
          
          See also
          [https://docs.alchemy.com/reference/compute-units#what-are-cups-compute-units-per-second](https://docs.alchemy.com/reference/compute-units#what-are-cups-compute-units-per-second)

      --no-rpc-rate-limit
          Disables rate limiting for this node's provider.
          
          See also
          [https://docs.alchemy.com/reference/compute-units#what-are-cups-compute-units-per-second](https://docs.alchemy.com/reference/compute-units#what-are-cups-compute-units-per-second)
          
          [aliases: --no-rate-limit]

      --fork-block-number <BLOCK>
          Fetch state from a specific block number over a remote endpoint.
          
          See --rpc-url.

      --fork-retries <RETRIES>
          Number of retries.
          
          See --rpc-url.

      --fork-retry-backoff <BACKOFF>
          Initial retry backoff on encountering errors.
          
          See --rpc-url.

      --no-storage-caching
          Explicitly disables the use of RPC caching.
          
          All storage slots are read entirely from the endpoint.
          
          This flag overrides the project's configuration file.
          
          See --rpc-url.

      --initial-balance <BALANCE>
          The initial balance of deployed test contracts

      --sender <ADDRESS>
          The address which will be executing tests/scripts

      --ffi
          Enable the FFI cheatcode

      --live-logs
          Whether to show `console.log` outputs in realtime during script/test
          execution

      --always-use-create-2-factory
          Use the create 2 factory in all cases including tests and
          non-broadcasting scripts

      --create2-deployer <ADDRESS>
          The CREATE2 deployer address to use, this will override the one in the
          config

Executor environment config:
      --code-size-limit <CODE_SIZE>
          EIP-170: Contract code size limit in bytes. Useful to increase this
          because of tests. By default, it is 0x6000 (~25kb)

      --chain <CHAIN>
          The chain name or EIP-155 chain ID
          
          [aliases: --chain-id]

      --gas-price <GAS_PRICE>
          The gas price

      --block-base-fee-per-gas <FEE>
          The base fee in a block
          
          [aliases: --base-fee]

      --tx-origin <ADDRESS>
          The transaction origin

      --block-coinbase <ADDRESS>
          The coinbase of the block

      --block-timestamp <TIMESTAMP>
          The timestamp of the block

      --block-number <BLOCK>
          The block number

      --block-difficulty <DIFFICULTY>
          The block difficulty

      --block-prevrandao <PREVRANDAO>
          The block prevrandao value. NOTE: Before merge this field was mix_hash

      --block-gas-limit <BLOCK_GAS_LIMIT>
          The block gas limit
          
          [aliases: --gas-limit]

      --memory-limit <MEMORY_LIMIT>
          The memory limit per EVM execution in bytes. If this limit is
          exceeded, a `MemoryLimitOOG` result is thrown.
          
          The default is 128MiB.

      --disable-block-gas-limit
          Whether to disable the block gas limit checks
          
          [aliases: --no-block-gas-limit, --no-gas-limit]

      --enable-tx-gas-limit
          Whether to enable tx gas limit checks as imposed by Osaka (EIP-7825)
          
          [aliases: --tx-gas-limit]

      --isolate
          Whether to enable isolation of calls. In isolation mode all top-level
          calls are executed as a separate transaction in a separate EVM
          context, enabling more precise gas accounting and transaction state
          changes

      --no-isolate
          Whether to disable isolation of calls

      --retries <RETRIES>
          Number of attempts for retrying verification
          
          [default: 5]

      --delay <DELAY>
          Optional delay to apply in between verification attempts, in seconds
          
          [default: 5]

Networks:
  -n, --network <NETWORK>
          Enable a specific network family
          
          [possible values: ethereum, tempo]

      --celo
          Enable Celo network features

Verifier options:
      --verifier <VERIFIER>
          The contract verification provider to use

          Possible values:
          - etherscan
          - sourcify
          - blockscout
          - oklink
          - custom:     Custom verification provider, requires compatibility
            with the Etherscan API

      --verifier-api-key <VERIFIER_API_KEY>
          The verifier API KEY, if using a custom provider
          
          [env: VERIFIER_API_KEY=]

      --verifier-url <VERIFIER_URL>
          The verifier URL, if using a custom provider
          
          [env: VERIFIER_URL=]
````

:::
