The configuration is never stored directly on the contract, but instead is hashed and checked against every time a signature is validated. This allows the wallet contracts to reduce the usage of storage and therefore the gas cost.
Wallets that never have been updated don’t store the imageHash directly, instead the imageHash is used as the salt during the contract creation, and signatures are validated against the address of the wallet.
// The code of the wallet proxy contractconst WalletProxyBytecode ="0x603a600e3d39601a805130553df3363d3d373d3d3d363d30545af43d82803e903d91601857fd5bf3";// These values are defined by the wallet context// they must be known in order to validate the counter-factual wallet imageHashconst factory = "0xf9D09D634Fb818b05149329C1dcCFAeA53639d96";const mainModule = "0xd01F11855bCcb95f88D7A48492F66410d4637313";// Append the `mainModule` to the `WalletProxyBytecode`// this completed the creation code of the proxy contract// used for computing the wallet address as defined by the CREATE2 opcodeconst codeHash = ethers.solidityPackedKeccak256(ethers.solidityPackedKeccak256(["bytes", "bytes32"],[WalletContractBytecode, ethers.hexZeroPad(mainModule, 32)]));// Compute the wallet addressconst hash = ethers.solidityPackedKeccak256(ethers.solidityPackedKeccak256(["bytes1", "address", "bytes32", "bytes32"],["0xff", factory, salt, codeHash]));const address = ethers.getAddress(ethers.dataSlice(hash, 12));