--chain and reads it through an RPC endpoint. Only on a supported chain does a command build or send a transaction.
Prerequisites
Simulating a cook, building its transaction and sending it need the release’s engine deployed on the chain.sauce pot reports whether it is, and what the Kitchen charges:
deployment.engine.deployed, deployment.kitchen.executionFee (in wei) and deployment.pot.deployed. The addresses are listed on Deployments. The fee is shown in the chain’s native coin beside wei: ETH on Ethereum, Base and their testnets, USDC on Arc and Arc Testnet.
Where the engine has no code on the chain, the first line reads the engine <engine address> is NOT deployed, and pot adds:
Supported and preview chains
The registry holds 46 chains. Thesauce command builds and sends transactions on nine of them, four mainnets and five testnets:
Every other chain is a preview chain. Preview is a policy on transactions, not on deployment: on a preview chain a program compiles, the reads work, and
simulate runs wherever the release’s engine and Kitchen are deployed, but no transaction is built or sent:
A refusal happens before the command reaches any endpoint or reads a key. The command exits 1 and prints the action it refused, the chain, the supported chains, and how to request support for the refused chain. No flag lifts the refusal. Chains lists every chain with its support.
Testnets
The release’s engine and Kitchen are deployed on the five testnets at their published addresses. Their coins and tokens have no value, so a testnet is where to send a first transaction. Each has built-in public endpoints.-
Arc Testnet, Base Sepolia and Ethereum Sepolia register Circle’s stablecoins by symbol (
USDCon all three,EURCon Arc Testnet), CCTP (Cctp.TokenMessenger) and Circle Gateway (CircleGateway.GatewayWallet,CircleGateway.GatewayMinter). Their registries have no DEX, lending market or oracle: compile and simulate programs needing those against a mainnet registry that has them. Arc Testnet follows Arc’s model: USDC is the native coin behind the ERC-20USDC, and the fee floor of 20 gwei applies. -
No Permit2 on the EVM testnets. Their registries have no Permit2 entry, so
--fundof a token in the defaultpermit2mode is refused, and you choose another mode (Funding a Pot). Funding with the native coin alone needs no Permit2. -
Solana Devnet (
solana-devnet, alsodevnet) is a chain of its own. A program compiled for it reads its chain id as 1399811150, and its symbols are devnet’s mints (USDC,WSOL). The Solana venues are mainnet’s programs and pools, so a venue name is refused there: -
Solana Testnet (
solana-testnet, alsotestnet) is a chain of its own too, with id 1399811151. It runs devnet’s engine build, so a program compiled for it reads its chain id as 1399811150, as on devnet. Its only symbol isWSOL: give any other testnet mint by address, as anAddressargument ofmainforToken(mint). A venue name is refused there, as on devnet. Its built-in public endpoint is slow to read accounts, and a simulation through it can take minutes; give your own with--rpc-urlfor anything you depend on.
sauce pot reports a testnet’s deployment and the Kitchen’s execution fee as it does a mainnet’s. On local forks with the current contracts, of Base Sepolia at block 50929446, Ethereum Sepolia at block 12005429 and Arc Testnet at block 69337859, it read the engine and the Kitchen as deployed and the fee as 0. On Base Sepolia:
sauce pot before you send. The release gives zero execution fees on Solana Devnet and Solana Testnet; sauce pot --chain solana-devnet --owner <pubkey> (or --chain solana-testnet) reads the current one.
Example: a cook on Optimism
The examples on this page use a program that reverts unless the Pot holds USDC:balance.sauce.ts
--offline and without it, because the command reaches no endpoint before it checks the chain. The second line of the refusal says how to ask for Optimism; it is omitted here.
sauce simulate on Optimism runs the cook, and the cook reverts because the Pot holds no USDC:
from, to, value, deployPot and assumed. The command exits 1, as it does for any cook that reverts.
Where the release’s engine has no code, simulate stops before it simulates. On Avalanche C-Chain a program that compiles there exits 1 with sauce simulate: the released engine <engine address> is not deployed on avalanche: this SDK's cook cannot run there; balance.sauce.ts stops earlier, because Avalanche’s registry has no USDC. sauce pot --chain <chain> reports whether the engine is deployed on a chain.
sauce pot on a preview chain
sauce pot on a preview chain prints the Pot’s address, owner, salt and Kitchen, and no to, data or value. Its JSON adds a refused object with code ("preview-chain"), action, message, supportedChains and previewChains. The command exits 0.
Choose a chain with --chain
--chain takes a chain’s slug, one of its aliases, or its numeric chain id. Slugs are matched without regard to case. These lines all compile for Ethereum:
Each chain’s page under Chains lists its aliases. An unknown chain exits 2 and lists the known slugs:
--target <evm|svm>, where a command takes it, is checked against the chain; --target svm with no --chain means Solana. A mismatch exits 2:
Endpoints
A command that reads a chain picks its endpoint in this order:--rpc-url <url>, the endpoint for the chain the command is for;- the
--config <file>entry for the chain’s id; - the built-in public endpoints for the chain.
--rpc-url and --config are exclusive:
The config file
--config takes a JSON file that maps chain ids to endpoint URLs:
rpc.json
rpcUrls, or an entry that is not a URL, exits 2 before anything is read:
"updateCheck": false, which turns off the update notice for every command that is given this file:
rpc.json
sauce init writes sauce.config.example.json with placeholders. Copy it to sauce.config.json (the project’s .gitignore excludes that name) and replace each placeholder with your URL.
The built-in public endpoints
With no--rpc-url and no matching --config entry, the command reads the chain through the endpoints built into the package: one to three keyless public endpoints per chain. Each one was checked to answer with the chain’s id and to honour state overrides on eth_call. Kava, ZetaChain and Evmos have no built-in endpoint. The command prints one line on stderr when it uses them:
127.0.0.1, which sends each JSON-RPC request to the chain’s endpoints in order:
- It moves to the next endpoint when one cannot be reached, gives no answer within 8 seconds, refuses the request (401, 403), rate-limits it (429) or fails (5xx).
- It keeps to the endpoint that last answered, so one command reads one node’s view of the chain until that node fails.
- It sends
eth_simulateV1only to endpoints known to run it, and SolanagetProgramAccountsscans only to endpoints known to answer them.
eth_simulateV1 and the eth_call fallback
sauce simulate simulates an EVM cook with eth_simulateV1 where the endpoint serves it. That one simulated block holds the Pot’s deployment when the Pot has none yet, the approvals and transfers sent before the cook, then the cook. It returns the cook’s logs, so the output lists token transfers, approvals and traced native transfers.
An endpoint that does not serve eth_simulateV1 falls back to eth_call with state overrides, which gives the result and the gas but no logs. The JSON output names the path it took in path:
eth_simulateV1: without it, what a transaction moves is not measured, and a send that a limit applies to is refused.
--offline
--offline reaches no endpoint, not even a built-in one, and turns off the update check. A command whose output needs the chain refuses it:
sauce compile runs the same with --offline. sauce pot --offline predicts the Pot without reading it. sauce tx --offline needs --value, because it cannot read the Kitchen’s fee:
sauce globals, does not take --offline, and its error lists the commands that do.
Arc
Arc’s native coin is USDC. Gas, a cook’svalue and the Kitchen’s execution fee are paid in it.
The native coin and the ERC-20
USDC are one balance at two scales. Sending native value and calling USDC.transfer move the same money:
USDC.balanceOfis the native balance divided by 10^12 and rounded down.- Native fees paid by the program, such as bridge or messenger fees, spend the Pot’s balance. The ordinary cook’s Kitchen fee comes from the owner’s attached transaction value and is forwarded before the program runs; a signed cook can pay it from existing Pot funds.
- Every native amount has 18 decimals: a
valueof1000000is 10^-12 USDC. sauce potshows the Kitchen’s execution fee in USDC beside wei:10000000000000000 wei (0.01 USDC).
The fee floor
A transaction on Arc with amaxFeePerGas (or a legacy gasPrice) below 20 gwei is never included. On Arc the command applies the floor in two places:
-
sauce txandsauce potadd a note on stderr when they print an unsigned transaction. The note tells you to sign it with a fee cap at or above the floor: -
sauce sendrefuses a signed transaction whose fee cap is below the floor, before it sends anything, and exits 2:
sauce pot and sauce tx print the note with arc-testnet in place of arc.
Arc lists Arc’s tokens and protocols.
