Skip to main content
The released EVM Pot and Kitchen ABIs (v12PotAbi, v12KitchenAbi) and handles with calldata encoders (v12Pot.encodeCook(engine, program), v12Kitchen.encodeDeployPot(owner, salt)). potRouterUpdate(client, pot) returns the call that moves a Pot to its Kitchen’s current Router, for the owner to sign. Signed cooks: a Private Pot minted under this release runs a cook its owner signed, for whoever submits it (cookSigned); a Shared Pot refuses them. signedCookTypedData(cook) is the EIP-712 typed data the owner signs, signedCookDigest its digest and signedCookTypedDataJson its eth_signTypedData_v4 form. encodeCookSigned builds the cookSigned call from the signed cook, verifySignedCook checks a signature as the Pot reads it, and checkSignedCookPot reads whether a Pot answers cookSigned. Each signature names a nonce: randomCookNonce() draws one, cookNonceUsed reads whether one is spent, and encodeInvalidateNonces(word, mask), with the pairs cookNonceMasks returns, cancels unused ones.
Generated from the type declarations of @eco-incorp/sauce.

signedCookTypedData

Function · @eco-incorp/sauce/evm/engine The typed data the owner of pot signs to let anyone run program there: domain Sauce Pot (the Pot, the chain), message Cook { engine, program, value, maxExecutionFee, nonce, deadline, submitter }. It is viem’s signTypedData input as it stands, and eth_signTypedData_v4’s through signedCookTypedDataJson:
Throws for a field cookSigned could not carry (an address that is not one, a number outside 256 bits, an empty program) and for an engine that the release sets record only for other compilers.

signedCookDigest

Function · @eco-incorp/sauce/evm/engine The 32-byte digest the owner’s signature is over: what the Pot hashes in cookSigned.

signedCookTypedDataJson

Function · @eco-incorp/sauce/evm/engine signedCookTypedData as JSON, in eth_signTypedData_v4’s spelling: the domain’s type written out, every number a decimal string. What a wallet that is not viem is handed.

encodeCookSigned

Function · @eco-incorp/sauce/evm/engine cookSigned(engine, program, maxExecutionFee, nonce, deadline, submitter, signature) on the Pot, as { to: pot, data, value }. Anyone sends it (only the named submitter, when there is one) with value as the signed value and nothing on top: the Pot pays the Kitchen’s fee itself, out of its balance, which includes that value. The Pot answers raw: call it, and do not ABI-decode the result. Only a Private Pot minted under this release has the call (checkSignedCookPot); an older one sends it on to its Router, which reverts.

encodeInvalidateNonces

Function · @eco-incorp/sauce/evm/engine invalidateNonces(word, mask) calldata: sets every bit of mask in nonce word word, so no signature for those nonces runs. Sent to the Pot by its owner, or by the Pot itself from a cook (cookNonceMasks turns nonces into words and masks). Bits are only ever set.

randomCookNonce

Function · @eco-incorp/sauce/evm/engine A fresh nonce: 256 random bits, which no two signatures share but by chance. A nonce in a word the Pot has not written costs its submitter about 17,000 gas more than one in a word it has.

cookNonceWordBit

Function · @eco-incorp/sauce/evm/engine The word and bit a nonce is recorded in: word nonce >> 8, bit nonce & 255.

cookNonceAt

Function · @eco-incorp/sauce/evm/engine The nonce at bit of word: the inverse of cookNonceWordBit.

cookNonceMasks

Function · @eco-incorp/sauce/evm/engine nonces as the (word, mask) pairs invalidateNonces takes: one per word, every bit named.

cookNonceSlot

Function · @eco-incorp/sauce/evm/engine The storage slot of nonce word word in a Pot, for eth_getStorageAt.

cookNonceUsed

Function · @eco-incorp/sauce/evm/engine Whether nonce is spent on pot: used by a signed cook, or cancelled.

verifySignedCook

Function · @eco-incorp/sauce/evm/engine Whether call.signature is owner’s over this cook, as the Pot reads it: a 65-byte r ‖ s ‖ v with s in the lower half of the curve order and v 27 or 28 that recovers owner (a compact 64-byte signature, or v 0 or 1, is refused on chain, and here). An owner with code - a contract wallet, or an EIP-7702 account - can sign through its ERC-1271 isValidSignature as well, which only a chain can answer: given a client, it is asked when the key does not match. Its answer is read as the Pot reads it (Pot.sol _signedByOwner): the call succeeds, returns at least 32 bytes, and the first word is the magic value with its other 28 bytes zero; anything after that word is ignored.

checkSignedCookPot

Function · @eco-incorp/sauce/evm/engine Whether pot answers cookSigned: a Private Pot minted under this release, fixed Router or not. cookSigned is in the Pot’s creation code, so it moved the Pot init-code hash: a Pot is this release’s when its address derives from its Kitchen and gateSalt() under the pinned hash, read, not assumed. An older Pot keeps its bytecode and has no cookSigned (a call to one goes to its Router, which reverts); its owner signs for a Pot minted under this release. A Shared Pot has no owner to sign, and refuses every signed cook.

potRouterUpdate

Function · @eco-incorp/sauce/evm/engine Whether pot runs its Kitchen’s current Router, and if not, the call that switches it. Reads pot.router() and the Kitchen’s router() through client - the caller’s, since the SDK holds no RPC endpoint - and returns undefined when they are the same Router, or the pot.setRouter(kitchenRouter) call otherwise. It never sends anything, and the Router’s address never passes through the caller: the Kitchen names it. Only the Pot’s owner can make this call - setRouter has cook’s gate and reverts NotOwner() for anyone else - and nothing makes it on the owner’s behalf: the Kitchen cannot move an existing Pot. Its owner’s setRouter changes the Router Pots minted afterwards start on, never a deployed Pot’s, so a Router rollout reaches an existing Pot only when its owner signs this. Throws for a Pot this SDK’s release does not mint: one minted before the Router moved into Pot storage has no setRouter at all and keeps its Router for good, so any call built for it would revert. A Pot is this release’s when its address derives from its owner and salt under the pinned init-code hash, which is read, not assumed.

v12PotAbi

Variable · @eco-incorp/sauce/evm/engine V12Pot - private Pots restrict cook() to their owner; Shared Pots allow any caller. The engine is named per cook. A Pot holds no engine: cook(address engine, bytes program) takes the interpreter as an argument, and inFlightEngine() reports the engine of the cook currently executing - it is address(0) outside one. The SVM kitchen takes an engine_program account per call for the same reason: which interpreter runs is the caller’s choice at call time. A cook runs exactly ONE program. The Router is the Pot’s own. Its fallback delegatecalls router(): the Router the Kitchen had when the Pot was minted. A private Pot’s owner can change it unless minted with a fixed Router; Shared Pots always fix it. Neither the Kitchen nor its owner can move a deployed Pot.

v12KitchenAbi

Variable · @eco-incorp/sauce/evm/engine V12Kitchen - CREATE2 Pot factory behind a UUPS proxy. deployPot bakes owner into the Pot’s CREATE2 address. router() is the Router Pots minted FROM NOW ON start on. The Kitchen’s owner moves it with setRouter; that moves no Pot address, no engine gate and no deployed Pot. The owner-only administration (initialize, setExecutionFee, withdrawExecutionFees, the two-step ownership transfer, upgradeToAndCall) is part of the ABI too, so a deployment script needs no artifact.

v12Pot

Variable · @eco-incorp/sauce/evm/engine Ready-to-use V12Pot handle: the viem ABI plus calldata encoders.

POT_SIGN_DOMAIN

Variable · @eco-incorp/sauce/evm/engine The EIP-712 domain a Pot’s owner signs a cook under: { name: "Sauce Pot", version: "1", chainId, verifyingContract: the Pot }. chainId and the Pot are the signature’s: a Private Pot has one address on every chain, and the chain id is what keeps a signature to one of them.

COOK_TYPE

Variable · @eco-incorp/sauce/evm/engine Cook’s EIP-712 type, field order and all: the Pot hashes exactly these, in this order.

COOK_TYPEHASH

Variable · @eco-incorp/sauce/evm/engine keccak256(COOK_TYPE), the constant the Pot hashes with (Pot.sol’s COOK_TYPEHASH).

COOK_NONCES_LOCATION

Variable · @eco-incorp/sauce/evm/engine The ERC-7201 slot of sauce.storage.CookNonces: word w of the nonce bitmap is at keccak256(abi.encode(w, COOK_NONCES_LOCATION)) (cookNonceSlot).

COOK_TYPES

Variable · @eco-incorp/sauce/evm/engine The Cook struct as a wallet’s signTypedData takes it.

SignedCookExecution

Interface · @eco-incorp/sauce/evm/engine One cook a Private Pot’s owner signs, for anyone (or one named account) to submit with cookSigned. Every field is covered by the signature: the Pot runs the cook if and only if the owner signed this engine, this program, this value, this fee ceiling, this nonce, this deadline and this submitter, for this Pot on this chain.

SignedCookCall

Interface · @eco-incorp/sauce/evm/engine SignedCookExecution with the owner’s signature: what encodeCookSigned submits.

SignedCookTransaction

Interface · @eco-incorp/sauce/evm/engine The call a Pot’s cookSigned submits, for any account to send.

CookNonceBit

Interface · @eco-incorp/sauce/evm/engine Where a nonce lives: bit bit of nonce word word, which is mask in that word.

SignedCookPotCheck

Type · @eco-incorp/sauce/evm/engine What checkSignedCookPot found.

v12Kitchen

Variable · @eco-incorp/sauce/evm/engine Ready-to-use V12Kitchen handle: the viem ABI plus calldata encoders.

PotRouterClient

Type · @eco-incorp/sauce/evm/engine The one read potRouterUpdate needs from a client - viem’s PublicClient has it.

PotRouterUpdate

Interface · @eco-incorp/sauce/evm/engine The call that points a Pot at its Kitchen’s current Router - for the Pot’s OWNER to sign.