> ## Documentation Index
> Fetch the complete documentation index at: https://docs.eco.com/llms.txt
> Use this file to discover all available pages before exploring further.

# evm/engine: V12Pot, V12Kitchen and signed cooks

> V12Pot, V12Kitchen and signed cooks: the declaration and description of each of the 30 exports of @eco-incorp/sauce/evm/engine.

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.

```typescript theme={null}
import { v12Pot, signedCookTypedData, encodeCookSigned, potRouterUpdate } from "@eco-incorp/sauce/evm/engine";
```

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`:

```ts theme={null}
const signature = await wallet.signTypedData(signedCookTypedData(cook));
const { to, data, value } = encodeCookSigned({ ...cook, signature }); // sent by anyone
```

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.

```typescript theme={null}
export declare function signedCookTypedData(execution: SignedCookExecution): {
    readonly domain: {
        readonly chainId: bigint;
        readonly verifyingContract: `0x${string}`;
        readonly name: "Sauce Pot";
        readonly version: "1";
    };
    readonly types: {
        readonly Cook: readonly [
            {
                readonly name: "engine";
                readonly type: "address";
            },
            {
                readonly name: "program";
                readonly type: "bytes";
            },
            {
                readonly name: "value";
                readonly type: "uint256";
            },
            {
                readonly name: "maxExecutionFee";
                readonly type: "uint256";
            },
            {
                readonly name: "nonce";
                readonly type: "uint256";
            },
            {
                readonly name: "deadline";
                readonly type: "uint256";
            },
            {
                readonly name: "submitter";
                readonly type: "address";
            }
        ];
    };
    readonly primaryType: "Cook";
    readonly message: {
        readonly engine: `0x${string}`;
        readonly program: `0x${string}`;
        readonly value: bigint;
        readonly maxExecutionFee: bigint;
        readonly nonce: bigint;
        readonly deadline: bigint;
        readonly submitter: `0x${string}`;
    };
};
```

### `signedCookDigest`

*Function* · `@eco-incorp/sauce/evm/engine`

The 32-byte digest the owner's signature is over: what the Pot hashes in `cookSigned`.

```typescript theme={null}
export declare function signedCookDigest(execution: SignedCookExecution): Hex;
```

### `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.

```typescript theme={null}
export declare function signedCookTypedDataJson(execution: SignedCookExecution): {
    readonly domain: {
        readonly name: "Sauce Pot";
        readonly version: "1";
        readonly chainId: string;
        readonly verifyingContract: `0x${string}`;
    };
    readonly types: {
        readonly Cook: readonly [
            {
                readonly name: "engine";
                readonly type: "address";
            },
            {
                readonly name: "program";
                readonly type: "bytes";
            },
            {
                readonly name: "value";
                readonly type: "uint256";
            },
            {
                readonly name: "maxExecutionFee";
                readonly type: "uint256";
            },
            {
                readonly name: "nonce";
                readonly type: "uint256";
            },
            {
                readonly name: "deadline";
                readonly type: "uint256";
            },
            {
                readonly name: "submitter";
                readonly type: "address";
            }
        ];
        readonly EIP712Domain: readonly [
            {
                readonly name: "name";
                readonly type: "string";
            },
            {
                readonly name: "version";
                readonly type: "string";
            },
            {
                readonly name: "chainId";
                readonly type: "uint256";
            },
            {
                readonly name: "verifyingContract";
                readonly type: "address";
            }
        ];
    };
    readonly primaryType: "Cook";
    readonly message: {
        readonly engine: `0x${string}`;
        readonly program: `0x${string}`;
        readonly value: string;
        readonly maxExecutionFee: string;
        readonly nonce: string;
        readonly deadline: string;
        readonly submitter: `0x${string}`;
    };
};
```

### `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.

```typescript theme={null}
export declare function encodeCookSigned(call: SignedCookCall): SignedCookTransaction;
```

### `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.

```typescript theme={null}
export declare function encodeInvalidateNonces(word: bigint, mask: bigint): Hex;
```

### `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.

```typescript theme={null}
export declare function randomCookNonce(): bigint;
```

### `cookNonceWordBit`

*Function* · `@eco-incorp/sauce/evm/engine`

The word and bit a nonce is recorded in: word `nonce >> 8`, bit `nonce & 255`.

```typescript theme={null}
export declare function cookNonceWordBit(nonce: bigint): CookNonceBit;
```

### `cookNonceAt`

*Function* · `@eco-incorp/sauce/evm/engine`

The nonce at `bit` of `word`: the inverse of `cookNonceWordBit`.

```typescript theme={null}
export declare function cookNonceAt(word: bigint, bit: number): bigint;
```

### `cookNonceMasks`

*Function* · `@eco-incorp/sauce/evm/engine`

`nonces` as the `(word, mask)` pairs `invalidateNonces` takes: one per word, every bit named.

```typescript theme={null}
export declare function cookNonceMasks(nonces: readonly bigint[]): readonly {
    readonly word: bigint;
    readonly mask: bigint;
}[];
```

### `cookNonceSlot`

*Function* · `@eco-incorp/sauce/evm/engine`

The storage slot of nonce word `word` in a Pot, for `eth_getStorageAt`.

```typescript theme={null}
export declare function cookNonceSlot(word: bigint): Hex;
```

### `cookNonceUsed`

*Function* · `@eco-incorp/sauce/evm/engine`

Whether `nonce` is spent on `pot`: used by a signed cook, or cancelled.

```typescript theme={null}
export declare function cookNonceUsed(client: Pick<PublicClient, "getStorageAt">, pot: Address, nonce: bigint): Promise<boolean>;
```

### `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.

```typescript theme={null}
export declare function verifySignedCook(call: SignedCookCall & {
    readonly owner: Address;
}, client?: Pick<PublicClient, "call" | "getCode">): Promise<boolean>;
```

### `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.

```typescript theme={null}
export declare function checkSignedCookPot(client: Pick<PublicClient, "readContract" | "getCode">, pot: Address): Promise<SignedCookPotCheck>;
```

### `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.

```typescript theme={null}
export declare function potRouterUpdate(client: PotRouterClient, pot: Address): Promise<PotRouterUpdate | undefined>;
```

### `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.

```typescript theme={null}
v12PotAbi: readonly [
    {
        readonly type: "constructor";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
        ];
    },
    {
        readonly type: "fallback";
        readonly stateMutability: "payable";
    },
    {
        readonly type: "receive";
        readonly stateMutability: "payable";
    },
    {
        readonly name: "cook";
        readonly type: "function";
        readonly stateMutability: "payable";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "engine";
            },
            {
                readonly type: "bytes";
                readonly name: "program";
            }
        ];
        readonly outputs: readonly [
            {
                readonly type: "bytes";
            }
        ];
    },
    {
        readonly name: "cookSigned";
        readonly type: "function";
        readonly stateMutability: "payable";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "engine";
            },
            {
                readonly type: "bytes";
                readonly name: "program";
            },
            {
                readonly type: "uint256";
                readonly name: "maxExecutionFee";
            },
            {
                readonly type: "uint256";
                readonly name: "nonce";
            },
            {
                readonly type: "uint256";
                readonly name: "deadline";
            },
            {
                readonly type: "address";
                readonly name: "submitter";
            },
            {
                readonly type: "bytes";
                readonly name: "signature";
            }
        ];
        readonly outputs: readonly [
            {
                readonly type: "bytes";
            }
        ];
    },
    {
        readonly name: "eval";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
            {
                readonly type: "bytes";
                readonly name: "program";
            }
        ];
        readonly outputs: readonly [
            {
                readonly type: "bytes";
            }
        ];
    },
    {
        readonly name: "gateSalt";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "bytes32";
            }
        ];
    },
    {
        readonly name: "inFlightEngine";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
                readonly name: "armed";
            }
        ];
    },
    {
        readonly name: "invalidateNonces";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
            {
                readonly type: "uint256";
                readonly name: "word";
            },
            {
                readonly type: "uint256";
                readonly name: "mask";
            }
        ];
        readonly outputs: readonly [
        ];
    },
    {
        readonly name: "kitchen";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
            }
        ];
    },
    {
        readonly name: "owner";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
            }
        ];
    },
    {
        readonly name: "router";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
            }
        ];
    },
    {
        readonly name: "setRouter";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "newRouter";
            }
        ];
        readonly outputs: readonly [
        ];
    },
    {
        readonly name: "userSalt";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "bytes32";
            }
        ];
    },
    {
        readonly name: "RouterSet";
        readonly type: "event";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "router";
                readonly indexed: true;
            }
        ];
    },
    {
        readonly name: "NoncesInvalidated";
        readonly type: "event";
        readonly inputs: readonly [
            {
                readonly type: "uint256";
                readonly name: "word";
                readonly indexed: true;
            },
            {
                readonly type: "uint256";
                readonly name: "mask";
            }
        ];
    },
    {
        readonly name: "SignedCook";
        readonly type: "event";
        readonly inputs: readonly [
            {
                readonly type: "uint256";
                readonly name: "nonce";
                readonly indexed: true;
            },
            {
                readonly type: "address";
                readonly name: "submitter";
                readonly indexed: true;
            }
        ];
    },
    {
        readonly name: "BadSignature";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "Expired";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "NonceUsed";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "WrongSubmitter";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "EmptyProgram";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "EngineHasNoCode";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "FeeNotPaid";
        readonly type: "error";
        readonly inputs: readonly [
            {
                readonly type: "uint256";
                readonly name: "required";
            },
            {
                readonly type: "uint256";
                readonly name: "provided";
            }
        ];
    },
    {
        readonly name: "FeeTransferFailed";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "NotOwner";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "NotInFlightEngine";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "RouterFixed";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "SharedRouterNotFixed";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "RouterHasNoCode";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "RouterUnset";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    }
]
```

### `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.

```typescript theme={null}
v12KitchenAbi: readonly [
    {
        readonly type: "constructor";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
        ];
    },
    {
        readonly type: "receive";
        readonly stateMutability: "payable";
    },
    {
        readonly name: "UPGRADE_INTERFACE_VERSION";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "string";
            }
        ];
    },
    {
        readonly name: "acceptOwnership";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
        ];
    },
    {
        readonly name: "deployPot";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "owner";
            },
            {
                readonly type: "bytes32";
                readonly name: "salt";
            }
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
                readonly name: "pot";
            }
        ];
    },
    {
        readonly name: "deployPot";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "owner";
            },
            {
                readonly type: "bytes32";
                readonly name: "salt";
            },
            {
                readonly type: "bool";
                readonly name: "routerFixed";
            }
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
                readonly name: "pot";
            }
        ];
    },
    {
        readonly name: "deploySharedPot";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
            {
                readonly type: "bytes32";
                readonly name: "salt";
            }
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
                readonly name: "pot";
            }
        ];
    },
    {
        readonly name: "executionFee";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "uint256";
            }
        ];
    },
    {
        readonly name: "initialize";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "initialOwner";
            },
            {
                readonly type: "uint256";
                readonly name: "initialExecutionFee";
            }
        ];
        readonly outputs: readonly [
        ];
    },
    {
        readonly name: "owner";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
            }
        ];
    },
    {
        readonly name: "pendingOwner";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
            }
        ];
    },
    {
        readonly name: "potInitCodeHash";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "bytes32";
            }
        ];
    },
    {
        readonly name: "potParameters";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
                readonly name: "owner";
            },
            {
                readonly type: "bytes32";
                readonly name: "salt";
            },
            {
                readonly type: "bool";
                readonly name: "routerFixed";
            }
        ];
    },
    {
        readonly name: "predictPot";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "owner";
            },
            {
                readonly type: "bytes32";
                readonly name: "salt";
            }
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
            }
        ];
    },
    {
        readonly name: "predictPot";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "owner";
            },
            {
                readonly type: "bytes32";
                readonly name: "salt";
            },
            {
                readonly type: "bool";
                readonly name: "routerFixed";
            }
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
            }
        ];
    },
    {
        readonly name: "predictSharedPot";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
            {
                readonly type: "bytes32";
                readonly name: "salt";
            }
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
            }
        ];
    },
    {
        readonly name: "proxiableUUID";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "bytes32";
            }
        ];
    },
    {
        readonly name: "renounceOwnership";
        readonly type: "function";
        readonly stateMutability: "pure";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
        ];
    },
    {
        readonly name: "router";
        readonly type: "function";
        readonly stateMutability: "view";
        readonly inputs: readonly [
        ];
        readonly outputs: readonly [
            {
                readonly type: "address";
            }
        ];
    },
    {
        readonly name: "setExecutionFee";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
            {
                readonly type: "uint256";
                readonly name: "fee";
            }
        ];
        readonly outputs: readonly [
        ];
    },
    {
        readonly name: "setRouter";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "newRouter";
            }
        ];
        readonly outputs: readonly [
        ];
    },
    {
        readonly name: "transferOwnership";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "newOwner";
            }
        ];
        readonly outputs: readonly [
        ];
    },
    {
        readonly name: "upgradeToAndCall";
        readonly type: "function";
        readonly stateMutability: "payable";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "newImplementation";
            },
            {
                readonly type: "bytes";
                readonly name: "data";
            }
        ];
        readonly outputs: readonly [
        ];
    },
    {
        readonly name: "withdrawExecutionFees";
        readonly type: "function";
        readonly stateMutability: "nonpayable";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "recipient";
            },
            {
                readonly type: "uint256";
                readonly name: "amount";
            }
        ];
        readonly outputs: readonly [
        ];
    },
    {
        readonly name: "ExecutionFeeSet";
        readonly type: "event";
        readonly inputs: readonly [
            {
                readonly type: "uint256";
                readonly name: "fee";
            }
        ];
    },
    {
        readonly name: "ExecutionFeesWithdrawn";
        readonly type: "event";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "recipient";
                readonly indexed: true;
            },
            {
                readonly type: "uint256";
                readonly name: "amount";
            }
        ];
    },
    {
        readonly name: "Initialized";
        readonly type: "event";
        readonly inputs: readonly [
            {
                readonly type: "uint64";
                readonly name: "version";
            }
        ];
    },
    {
        readonly name: "OwnershipTransferStarted";
        readonly type: "event";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "previousOwner";
                readonly indexed: true;
            },
            {
                readonly type: "address";
                readonly name: "newOwner";
                readonly indexed: true;
            }
        ];
    },
    {
        readonly name: "OwnershipTransferred";
        readonly type: "event";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "previousOwner";
                readonly indexed: true;
            },
            {
                readonly type: "address";
                readonly name: "newOwner";
                readonly indexed: true;
            }
        ];
    },
    {
        readonly name: "PotDeployed";
        readonly type: "event";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "owner";
                readonly indexed: true;
            },
            {
                readonly type: "bytes32";
                readonly name: "salt";
                readonly indexed: true;
            },
            {
                readonly type: "address";
                readonly name: "pot";
            }
        ];
    },
    {
        readonly name: "RouterSet";
        readonly type: "event";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "router";
                readonly indexed: true;
            }
        ];
    },
    {
        readonly name: "Upgraded";
        readonly type: "event";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "implementation";
                readonly indexed: true;
            }
        ];
    },
    {
        readonly name: "AddressEmptyCode";
        readonly type: "error";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "target";
            }
        ];
    },
    {
        readonly name: "ERC1967InvalidImplementation";
        readonly type: "error";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "implementation";
            }
        ];
    },
    {
        readonly name: "ERC1967NonPayable";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "FailedCall";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "InsufficientBalance";
        readonly type: "error";
        readonly inputs: readonly [
            {
                readonly type: "uint256";
                readonly name: "requested";
            },
            {
                readonly type: "uint256";
                readonly name: "available";
            }
        ];
    },
    {
        readonly name: "InvalidInitialization";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "NotInitializing";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "OwnableInvalidOwner";
        readonly type: "error";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "owner";
            }
        ];
    },
    {
        readonly name: "OwnableUnauthorizedAccount";
        readonly type: "error";
        readonly inputs: readonly [
            {
                readonly type: "address";
                readonly name: "account";
            }
        ];
    },
    {
        readonly name: "OwnershipIsPermanent";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "RouterHasNoCode";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "UUPSUnauthorizedCallContext";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "UUPSUnsupportedProxiableUUID";
        readonly type: "error";
        readonly inputs: readonly [
            {
                readonly type: "bytes32";
                readonly name: "slot";
            }
        ];
    },
    {
        readonly name: "WithdrawalFailed";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "ZeroInitialExecutionFee";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "ZeroOwner";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    },
    {
        readonly name: "ZeroRecipient";
        readonly type: "error";
        readonly inputs: readonly [
        ];
    }
]
```

### `v12Pot`

*Variable* · `@eco-incorp/sauce/evm/engine`

Ready-to-use V12Pot handle: the viem ABI plus calldata encoders.

```typescript theme={null}
v12Pot: {
    readonly abi: readonly [
        {
            readonly type: "constructor";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
            ];
        },
        {
            readonly type: "fallback";
            readonly stateMutability: "payable";
        },
        {
            readonly type: "receive";
            readonly stateMutability: "payable";
        },
        {
            readonly name: "cook";
            readonly type: "function";
            readonly stateMutability: "payable";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "engine";
                },
                {
                    readonly type: "bytes";
                    readonly name: "program";
                }
            ];
            readonly outputs: readonly [
                {
                    readonly type: "bytes";
                }
            ];
        },
        {
            readonly name: "cookSigned";
            readonly type: "function";
            readonly stateMutability: "payable";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "engine";
                },
                {
                    readonly type: "bytes";
                    readonly name: "program";
                },
                {
                    readonly type: "uint256";
                    readonly name: "maxExecutionFee";
                },
                {
                    readonly type: "uint256";
                    readonly name: "nonce";
                },
                {
                    readonly type: "uint256";
                    readonly name: "deadline";
                },
                {
                    readonly type: "address";
                    readonly name: "submitter";
                },
                {
                    readonly type: "bytes";
                    readonly name: "signature";
                }
            ];
            readonly outputs: readonly [
                {
                    readonly type: "bytes";
                }
            ];
        },
        {
            readonly name: "eval";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
                {
                    readonly type: "bytes";
                    readonly name: "program";
                }
            ];
            readonly outputs: readonly [
                {
                    readonly type: "bytes";
                }
            ];
        },
        {
            readonly name: "gateSalt";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "bytes32";
                }
            ];
        },
        {
            readonly name: "inFlightEngine";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "armed";
                }
            ];
        },
        {
            readonly name: "invalidateNonces";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
                {
                    readonly type: "uint256";
                    readonly name: "word";
                },
                {
                    readonly type: "uint256";
                    readonly name: "mask";
                }
            ];
            readonly outputs: readonly [
            ];
        },
        {
            readonly name: "kitchen";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                }
            ];
        },
        {
            readonly name: "owner";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                }
            ];
        },
        {
            readonly name: "router";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                }
            ];
        },
        {
            readonly name: "setRouter";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "newRouter";
                }
            ];
            readonly outputs: readonly [
            ];
        },
        {
            readonly name: "userSalt";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "bytes32";
                }
            ];
        },
        {
            readonly name: "RouterSet";
            readonly type: "event";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "router";
                    readonly indexed: true;
                }
            ];
        },
        {
            readonly name: "NoncesInvalidated";
            readonly type: "event";
            readonly inputs: readonly [
                {
                    readonly type: "uint256";
                    readonly name: "word";
                    readonly indexed: true;
                },
                {
                    readonly type: "uint256";
                    readonly name: "mask";
                }
            ];
        },
        {
            readonly name: "SignedCook";
            readonly type: "event";
            readonly inputs: readonly [
                {
                    readonly type: "uint256";
                    readonly name: "nonce";
                    readonly indexed: true;
                },
                {
                    readonly type: "address";
                    readonly name: "submitter";
                    readonly indexed: true;
                }
            ];
        },
        {
            readonly name: "BadSignature";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "Expired";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "NonceUsed";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "WrongSubmitter";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "EmptyProgram";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "EngineHasNoCode";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "FeeNotPaid";
            readonly type: "error";
            readonly inputs: readonly [
                {
                    readonly type: "uint256";
                    readonly name: "required";
                },
                {
                    readonly type: "uint256";
                    readonly name: "provided";
                }
            ];
        },
        {
            readonly name: "FeeTransferFailed";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "NotOwner";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "NotInFlightEngine";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "RouterFixed";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "SharedRouterNotFixed";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "RouterHasNoCode";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "RouterUnset";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        }
    ];
    readonly encodeCook: (engine: Address, program: Hex) => Hex;
}
```

### `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.

```typescript theme={null}
POT_SIGN_DOMAIN: {
    readonly name: "Sauce Pot";
    readonly version: "1";
}
```

### `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.

```typescript theme={null}
COOK_TYPE = "Cook(address engine,bytes program,uint256 value,uint256 maxExecutionFee,uint256 nonce,uint256 deadline,address submitter)"
```

### `COOK_TYPEHASH`

*Variable* · `@eco-incorp/sauce/evm/engine`

`keccak256(COOK_TYPE)`, the constant the Pot hashes with (`Pot.sol`'s `COOK_TYPEHASH`).

```typescript theme={null}
COOK_TYPEHASH: Hex
```

### `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`).

```typescript theme={null}
COOK_NONCES_LOCATION: Hex
```

### `COOK_TYPES`

*Variable* · `@eco-incorp/sauce/evm/engine`

The `Cook` struct as a wallet's `signTypedData` takes it.

```typescript theme={null}
COOK_TYPES: {
    readonly Cook: readonly [
        {
            readonly name: "engine";
            readonly type: "address";
        },
        {
            readonly name: "program";
            readonly type: "bytes";
        },
        {
            readonly name: "value";
            readonly type: "uint256";
        },
        {
            readonly name: "maxExecutionFee";
            readonly type: "uint256";
        },
        {
            readonly name: "nonce";
            readonly type: "uint256";
        },
        {
            readonly name: "deadline";
            readonly type: "uint256";
        },
        {
            readonly name: "submitter";
            readonly type: "address";
        }
    ];
}
```

### `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.

```typescript theme={null}
export interface SignedCookExecution {
    readonly chainId: number | bigint;
    readonly pot: Address;
    readonly engine: Address;
    readonly program: Hex;
    readonly value?: bigint;
    readonly maxExecutionFee: bigint;
    readonly nonce: bigint;
    readonly deadline: bigint;
    readonly submitter?: Address;
}
```

### `SignedCookCall`

*Interface* · `@eco-incorp/sauce/evm/engine`

`SignedCookExecution` with the owner's signature: what `encodeCookSigned` submits.

```typescript theme={null}
export interface SignedCookCall extends SignedCookExecution {
    readonly signature: Hex;
}
```

### `SignedCookTransaction`

*Interface* · `@eco-incorp/sauce/evm/engine`

The call a Pot's `cookSigned` submits, for any account to send.

```typescript theme={null}
export interface SignedCookTransaction {
    readonly to: Address;
    readonly data: Hex;
    readonly value: bigint;
}
```

### `CookNonceBit`

*Interface* · `@eco-incorp/sauce/evm/engine`

Where a nonce lives: bit `bit` of nonce word `word`, which is `mask` in that word.

```typescript theme={null}
export interface CookNonceBit {
    readonly word: bigint;
    readonly bit: number;
    readonly mask: bigint;
}
```

### `SignedCookPotCheck`

*Type* · `@eco-incorp/sauce/evm/engine`

What `checkSignedCookPot` found.

```typescript theme={null}
export type SignedCookPotCheck = {
    readonly ok: true;
    readonly owner: Address;
} | {
    readonly ok: false;
    readonly reason: string;
};
```

### `v12Kitchen`

*Variable* · `@eco-incorp/sauce/evm/engine`

Ready-to-use V12Kitchen handle: the viem ABI plus calldata encoders.

```typescript theme={null}
v12Kitchen: {
    readonly abi: readonly [
        {
            readonly type: "constructor";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
            ];
        },
        {
            readonly type: "receive";
            readonly stateMutability: "payable";
        },
        {
            readonly name: "UPGRADE_INTERFACE_VERSION";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "string";
                }
            ];
        },
        {
            readonly name: "acceptOwnership";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
            ];
        },
        {
            readonly name: "deployPot";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "owner";
                },
                {
                    readonly type: "bytes32";
                    readonly name: "salt";
                }
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "pot";
                }
            ];
        },
        {
            readonly name: "deployPot";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "owner";
                },
                {
                    readonly type: "bytes32";
                    readonly name: "salt";
                },
                {
                    readonly type: "bool";
                    readonly name: "routerFixed";
                }
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "pot";
                }
            ];
        },
        {
            readonly name: "deploySharedPot";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
                {
                    readonly type: "bytes32";
                    readonly name: "salt";
                }
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "pot";
                }
            ];
        },
        {
            readonly name: "executionFee";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "uint256";
                }
            ];
        },
        {
            readonly name: "initialize";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "initialOwner";
                },
                {
                    readonly type: "uint256";
                    readonly name: "initialExecutionFee";
                }
            ];
            readonly outputs: readonly [
            ];
        },
        {
            readonly name: "owner";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                }
            ];
        },
        {
            readonly name: "pendingOwner";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                }
            ];
        },
        {
            readonly name: "potInitCodeHash";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "bytes32";
                }
            ];
        },
        {
            readonly name: "potParameters";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "owner";
                },
                {
                    readonly type: "bytes32";
                    readonly name: "salt";
                },
                {
                    readonly type: "bool";
                    readonly name: "routerFixed";
                }
            ];
        },
        {
            readonly name: "predictPot";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "owner";
                },
                {
                    readonly type: "bytes32";
                    readonly name: "salt";
                }
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                }
            ];
        },
        {
            readonly name: "predictPot";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "owner";
                },
                {
                    readonly type: "bytes32";
                    readonly name: "salt";
                },
                {
                    readonly type: "bool";
                    readonly name: "routerFixed";
                }
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                }
            ];
        },
        {
            readonly name: "predictSharedPot";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
                {
                    readonly type: "bytes32";
                    readonly name: "salt";
                }
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                }
            ];
        },
        {
            readonly name: "proxiableUUID";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "bytes32";
                }
            ];
        },
        {
            readonly name: "renounceOwnership";
            readonly type: "function";
            readonly stateMutability: "pure";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
            ];
        },
        {
            readonly name: "router";
            readonly type: "function";
            readonly stateMutability: "view";
            readonly inputs: readonly [
            ];
            readonly outputs: readonly [
                {
                    readonly type: "address";
                }
            ];
        },
        {
            readonly name: "setExecutionFee";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
                {
                    readonly type: "uint256";
                    readonly name: "fee";
                }
            ];
            readonly outputs: readonly [
            ];
        },
        {
            readonly name: "setRouter";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "newRouter";
                }
            ];
            readonly outputs: readonly [
            ];
        },
        {
            readonly name: "transferOwnership";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "newOwner";
                }
            ];
            readonly outputs: readonly [
            ];
        },
        {
            readonly name: "upgradeToAndCall";
            readonly type: "function";
            readonly stateMutability: "payable";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "newImplementation";
                },
                {
                    readonly type: "bytes";
                    readonly name: "data";
                }
            ];
            readonly outputs: readonly [
            ];
        },
        {
            readonly name: "withdrawExecutionFees";
            readonly type: "function";
            readonly stateMutability: "nonpayable";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "recipient";
                },
                {
                    readonly type: "uint256";
                    readonly name: "amount";
                }
            ];
            readonly outputs: readonly [
            ];
        },
        {
            readonly name: "ExecutionFeeSet";
            readonly type: "event";
            readonly inputs: readonly [
                {
                    readonly type: "uint256";
                    readonly name: "fee";
                }
            ];
        },
        {
            readonly name: "ExecutionFeesWithdrawn";
            readonly type: "event";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "recipient";
                    readonly indexed: true;
                },
                {
                    readonly type: "uint256";
                    readonly name: "amount";
                }
            ];
        },
        {
            readonly name: "Initialized";
            readonly type: "event";
            readonly inputs: readonly [
                {
                    readonly type: "uint64";
                    readonly name: "version";
                }
            ];
        },
        {
            readonly name: "OwnershipTransferStarted";
            readonly type: "event";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "previousOwner";
                    readonly indexed: true;
                },
                {
                    readonly type: "address";
                    readonly name: "newOwner";
                    readonly indexed: true;
                }
            ];
        },
        {
            readonly name: "OwnershipTransferred";
            readonly type: "event";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "previousOwner";
                    readonly indexed: true;
                },
                {
                    readonly type: "address";
                    readonly name: "newOwner";
                    readonly indexed: true;
                }
            ];
        },
        {
            readonly name: "PotDeployed";
            readonly type: "event";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "owner";
                    readonly indexed: true;
                },
                {
                    readonly type: "bytes32";
                    readonly name: "salt";
                    readonly indexed: true;
                },
                {
                    readonly type: "address";
                    readonly name: "pot";
                }
            ];
        },
        {
            readonly name: "RouterSet";
            readonly type: "event";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "router";
                    readonly indexed: true;
                }
            ];
        },
        {
            readonly name: "Upgraded";
            readonly type: "event";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "implementation";
                    readonly indexed: true;
                }
            ];
        },
        {
            readonly name: "AddressEmptyCode";
            readonly type: "error";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "target";
                }
            ];
        },
        {
            readonly name: "ERC1967InvalidImplementation";
            readonly type: "error";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "implementation";
                }
            ];
        },
        {
            readonly name: "ERC1967NonPayable";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "FailedCall";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "InsufficientBalance";
            readonly type: "error";
            readonly inputs: readonly [
                {
                    readonly type: "uint256";
                    readonly name: "requested";
                },
                {
                    readonly type: "uint256";
                    readonly name: "available";
                }
            ];
        },
        {
            readonly name: "InvalidInitialization";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "NotInitializing";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "OwnableInvalidOwner";
            readonly type: "error";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "owner";
                }
            ];
        },
        {
            readonly name: "OwnableUnauthorizedAccount";
            readonly type: "error";
            readonly inputs: readonly [
                {
                    readonly type: "address";
                    readonly name: "account";
                }
            ];
        },
        {
            readonly name: "OwnershipIsPermanent";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "RouterHasNoCode";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "UUPSUnauthorizedCallContext";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "UUPSUnsupportedProxiableUUID";
            readonly type: "error";
            readonly inputs: readonly [
                {
                    readonly type: "bytes32";
                    readonly name: "slot";
                }
            ];
        },
        {
            readonly name: "WithdrawalFailed";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "ZeroInitialExecutionFee";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "ZeroOwner";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        },
        {
            readonly name: "ZeroRecipient";
            readonly type: "error";
            readonly inputs: readonly [
            ];
        }
    ];
    readonly encodeDeployPot: (owner: Address, salt: Hex) => Hex;
    readonly encodePredictPot: (owner: Address, salt: Hex) => Hex;
}
```

### `PotRouterClient`

*Type* · `@eco-incorp/sauce/evm/engine`

The one read `potRouterUpdate` needs from a client - viem's `PublicClient` has it.

```typescript theme={null}
export type PotRouterClient = Pick<PublicClient, "readContract">;
```

### `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.

```typescript theme={null}
export interface PotRouterUpdate {
    readonly to: Address;
    readonly data: Hex;
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.