###### tags: `strunfun`
# multisighandlermodule
## Description
The module which knows about the specific MultiSig Contracts - thus also knows how to treat them. It should know all the types and has the capability to deploy new and manages our known contracts to choose from.
## Expectation to the Environment
- `allModules.contractmanagermodule` - dependency [contractmanagermodule](https://hackmd.io/quCugmQvS_eMIj6L19LvpQ?view)
- `allModules.ethershandlermodule` - dependency [ethershandlermodule](https://hackmd.io/tEuEIpJmTFKPnJP3Ds9OrQ?view)
- `allModules.statemodule` - dependency [pwa-sources-statemodule](https://hackmd.io/nn708ujuRLeo0crmfr2X_Q?view)
- `byteCodes° = require "./multisigbytecodes"`
- `abis° = require "./multisigabis"`
## Structure
- `byteCodes°`
- `abis°`
- `contractManager°`
- `ethersHandler°`
- `state°`
- `currentContract°`
- `knownContracts°`
- `loadCurrentContract§`
- `addNewContract§` `chainId"`, `address"`, `type"`
- `probeUnknownContract§` `chainId"`, `address"`
- `.initialize§`
- `addKnownContracts§`
- `onContractChange§`
- `onAccountChange§`
- `setCorrectStatusMessage§`
- `.deployMultiSig2of3§` `owners["`
## Specification
- `byteCodes°` = map `type"` -> `byteCode"` where `byteCode` is the specific compiled byte code used for deployment
- `abis°` = map `type"` -> `ABI°`
- `contractManager°` = reference to the external [contractmanagermodule](https://hackmd.io/quCugmQvS_eMIj6L19LvpQ?view)
- `ethersHandler°` = reference to the external [ethershandlermodule](https://hackmd.io/tEuEIpJmTFKPnJP3Ds9OrQ?view)
- `state°` = reference to the external [pwa-sources-statemodule](https://hackmd.io/nn708ujuRLeo0crmfr2X_Q?view)
- `currentContract°` = the currently active `contract°` where `contract` is a [`MultiSigContract°`](https://hackmd.io/yFCXiF_wTJKgNT90uY7_Tg)
- `knownContracts°` = map of `contractId"` -> `contract°` of all known [`MultiSigContract°`](https://hackmd.io/yFCXiF_wTJKgNT90uY7_Tg)
- `loadCurrentContract>§` =
- retrieves contract for currently defined `contractAddress"` in our `state` accordingly to our current `chainId"`
- also checks our contract type and calls `§>addNewContract` if it is a valid contract but was unknown
- `addNewContract>§` `chainId"`, `address"`, `type"` =
- creates the `contract°` as [`MultiSigContract°`](https://hackmd.io/yFCXiF_wTJKgNT90uY7_Tg)
- adds the `contract` to the `knownContracts`
- saves the `knownContracts` to the `state`
- retrieves ABI and adds the contract to the `contractManager`
- `probeUnknownContract>§` `chainId"`, `address"` =
- uses the `"NoType"` ABI to request the contract type
- for add the contract as `"Probe"+chainId"+address"` to the `contractManager`
- we return `"NoType"` if any error occurs in the call.
- `addKnownContracts>§`
- go through all `contract°` of `knownContracts°`
- add them to the `contractManager`
- `onContractChange§` = called when the `contractAddress` changes in the `state`
- checks if the contract is valid sets type and status accordingly if it is not
- if it is valid calls `§loadCurrentContract`
- if we have a `currentContract` then call `§checkCurrentContract`
- `onAccountChange§` = called when the `account` changes in the `state`
- calls `§checkCurrentContract`
- `checkCurrentContract§` = retrieves the `account` from the `state` and uses the `currentContract`
- to set the `type` in our `state`
- to check if it is complete - then sets `isComplete` accordingly in our `state`
- to check if our account is authorized - then sets `currentWalletIsOwner` accordingly in our `state`
- then sets the `statusMessage` appropriately or calls `§setCorrectStatusMessage`
- `setCorrectStatusMessage§` = sets the `statusMessage` appropriately according to our`state`
- `.initialize§`
- wires up our `contractManager`, `ethersHandler` and `state` to referencing the external module
- loads `knownContracts` from the `state` or intializes it if it does not exist yet
- sets an appropriate change detection function on our `state` for `knownContracts`
- `§>addKNownContracts`
- `§>loadCurrentContract`
- wires up our onChange listeners on our `state` for `contractAddress` and `account`
- `.deployMultiSig2of3§` `owners["`
- uses the `abi` and `code` for `"MultiSig2of3"` to then call`§ethersHandler.getNewDeployedContract abi,code,owners`
- creates a new `contract°` and saves it to `knownContracts`
- saves the `contract.address` to our `state` as `contractAddress`