# In-Detail: Contract System on Primary Chain

<figure><img src="https://4205178306-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFlYByKE7IRS1A10tIyDS%2Fuploads%2FZvT99XqGiuaCNQ3KvGkn%2Fimg3.png?alt=media&#x26;token=cc6418a5-a7b2-4bcb-b77f-190cb02e41d6" alt=""><figcaption></figcaption></figure>

In order to create a modular smart contract system that can be extended after deployment, Nova applies a **diamond proxy contract** ([EIP-2535](https://eips.ethereum.org/EIPS/eip-2535))  with functions called facets, which include:

* **zkLink admin facet** that provides the interface for managing gas fee, adding new secondary chains, etc.
* **zkLink mail box facet** that provides the interface for on-chain transactions like deposit and withdraw.
* **zkLink executor facet** that provides the interface to commit, prove and execute batches.&#x20;
* **zkLink getters facet** that provides the interface to read the state of Nova network.

In the stage of proving a batch's validity,  the **verifier contract** will be called by the **executor facet** of the **diamond proxy contract** to validate ZKP.

**Governance contract** is the owner of the **diamond proxy contract**, which is able to upgrade facets in the proxy contract.

**Validator Timelock** controls the operations including committing, proving and executing batches.&#x20;

**L1ERC20Bridge** uses the requestL2Transaction interface of Diamond Proxy to send the ERC20 bridge message to Nova network.

**Linea2Gateway** is in charge of transmitting massage between Linea and Ethereum.
