sauce pot prints an owner’s Pot address and its unsigned deployment, sends the deployment with --deploy, and keeps a record of the Pots you deploy.
Synopsis
Description
A Pot is the owner’s account that runs programs. Its address is known before it exists: on an EVM chain it is the CREATE2 address the released Kitchen derives from the owner and a salt, and on Solana it is the Kitchen’s program-derived address over the same two values. The default salt is zero, the one Pot an owner has by default.--salt <label> names another Pot of the same owner, with salt keccak256(label).
A Pot address depends on the Kitchen release the SDK uses.
Deploying a Pot by hand is optional. sauce run deploys it when it first needs it, asking first or with -y, and sauce tx puts the deployment in front of the cook when it reads the chain. On an EVM chain, deploy it before you send it funds from another wallet: an undeployed address is only the Kitchen’s prediction (Funding a Pot).
Without --deploy, the command prints the Pot’s address and the unsigned Kitchen.deployPot transaction as JSON. It also reads the chain: whether the released engine and Kitchen are deployed there, the Kitchen’s execution fee (in wei and in the chain’s native coin), and whether the Pot is deployed and whose it is. Read it before you fund the Pot, simulate or send on a chain: only the released Kitchen deploys the Pot, and a program runs only where the release’s engine is deployed. That reading goes to stderr and under deployment in the JSON. --offline skips it, so it does not show whether the Pot can be deployed.
With --deploy, it sends the deployment, unless the Pot already has code, and waits until the endpoint shows the code. The owner defaults to the signer. Deploying is permissionless on an EVM chain: with --owner, the signer sends and pays for another owner’s Pot, which belongs to that owner alone. With a signer and no --owner, the Pot is the signer’s own; a keystore’s address field is read without a password where the file has one, and a wallet’s address is read without its password.
On Solana, the command prints the Pot and its create_pot instruction, and lists the Pot’s token account for each registered mint except the tokenized stocks: its address, whether it exists and what it holds. The owner signs create_pot, so with --deploy the signer is the owner.
The Pot store. Every Pot a command deploys (sauce pot --deploy, a sauce run that deploys its Pot first, sauce send) is recorded in the Pot store, ~/.sauce/pots by default, once the chain shows it deployed. A record holds the chain, owner, salt and kind; the Kitchen and the release the Pot was minted under (the engine, and the compiler whose programs it runs); and the deploying transaction. sauce tx sends nothing and records nothing.
sauce pot listreads the store and no chain.sauce pot importrecords a Pot deployed from another machine or wallet, after reading it from the chain. With--pot, the release is identified from the address: the one whose Kitchen and Pot init-code hash produce that address for the Pot’s owner and salt. An address no known release produces is refused. With--owner, every release’s Pot of that owner and salt that has code is recorded. A Solana Pot is found by--ownerand its salt.
The Pot guard
On an EVM chain, before anything is simulated, built or sent,sauce pot, pot --deploy, simulate, tx, run and sign (signing a cook), and the MCP tools that call them, check the Pot against the chain:
- A Pot not deployed yet must be where the deployed Kitchen puts it. The command reads the Kitchen’s own
predictPot(owner, salt)and refuses an address other than the one this SDK derives, naming both:the Kitchen … puts the Pot of owner … and salt … at <its address>, but this SDK has it at <the SDK's>: this SDK does not match the deployed Kitchen …. A cook sent to an address with no code succeeds, runs nothing and leaves its value at that address, so the command builds none. - A deployed Pot must be of this SDK’s release. Its owner, salt and Kitchen are read from it, and its address must be that Kitchen’s CREATE2 address under the Pot init-code hash of a release the SDK records. A Pot of another release is refused, naming the compiler, engine and Kitchen it was minted under and the SDK releases that pair with them. Where the command keeps the Pot store, the refusal lists the owner’s other Pots on that chain, each with its release.
- An owner of zero is refused, online and offline, before anything is built:
Kitchen.deployPotreverts for that owner. A Pot with no owner is a Shared Pot, whichKitchen.deploySharedPot(salt)deploys. - Offline, the address is not checked.
--offlinederives the address from this SDK’s release and reads nothing, andpot,txandsignsay so on stderr (example). sign --cancelis not held to these checks. It builds the owner’sinvalidateNoncestransactions, which run no program: offline it builds them for any--owner, the zero address included.
sauce run, sauce pot --deploy, sauce send and a wallet’s send. A plan with a step they refuse is refused before any of its steps is sent, so a transfer into a Pot does not land ahead of a cook that would be refused. The checks trust the endpoint, as every read the command makes does.
Options
sauce pot
EVM chains only
Solana only
sauce pot list
sauce pot import
EVM chains only
Output
sauce pot prints JSON on stdout, or a cast send line with --format cast. Notes and the chain reading go to stderr.
Exit codes:
0 when the address is printed, a preview-chain refusal included; 1 when the command fails, such as a pot import that finds no Pot, or a Pot the guard refuses; 2 for a usage error, such as --json, which sauce pot does not take, or an owner of zero.
Examples
Print a Pot and its deployment on Base
data is deployPot(owner, salt).
Name a second Pot by a label, offline
keccak256("treasury"). With --offline, no deployment is read and the address is not checked against the deployed Kitchen. Run the command with an endpoint before you send funds to the address.
Refuse an owner of zero
2, offline and online alike. tx, simulate and sign (signing a cook) refuse --owner the zero address with the same message. sauce run cooks as its signer, so it refuses an --owner other than the signer first, the zero address included: --owner 0x0000000000000000000000000000000000000000 is not the signer, <signer>: cook() is onlyOwner, so the Pot a run cooks on must be the signer's. Leave --owner out to use the signer's own. The MCP server’s sauce_pot, sauce_tx, sauce_actions, sauce_simulate and sauce_signed_cook refuse owner the zero address.
Print the deployment as a cast command
<RPC_URL> or <PRIVATE_KEY>.
Read the fee on Arc
On Arc the native coin is USDC, so the fee prints in USDC beside wei:Print a Pot on Solana
Read a preview-chain refusal
refused in place of to, data and value. Its supportedChains lists the nine supported chains, and previewChains the request to file for Optimism.
List and import Pots
1: that owner has no deployed Pot on Base.
Next steps
- Pot: what a Pot is and who may cook on it.
- Kitchen: the contract that derives and deploys Pots.
sauce tx: a cook plan that deploys the Pot first.sauce run: deploys the Pot when it first needs it.- Deployments: the release addresses this command reads.
