Contract Factory
This second ZKsync 101 installment advances from your introductory exploration of smart contract deployment to dive into the utility of contract factories.
Through this guide, you'll learn how to streamline the deployment of multiple crowdfunding campaigns using a single contract factory, leveraging the
foundational CrowdfundingCampaign
contract in the first guide.
Advance your ZKsync development journey with contract factories.
Construct a contract factory to create multiple crowdfunding campaigns.
Seamlessly deploy your contract factory on ZKsync Era using Hardhat.
Let's explore the efficiency and scalability that contract factories bring.
What is a contract factory?
A contract factory is a design pattern that allows for the creation of multiple contract instances from a single "factory" contract. It's essentially a contract that creates other contracts, streamlining and organizing the deployment of numerous similar contracts efficiently.
Setup the project
Make sure to go through the setup provided in the previous sections.
You will have downloaded the 101 project through ZKsync CLI create
and started up a local in-memory node for development.
Compile the contracts
This section will focus on compiling and deploying the CrowdfundingFactory.sol
contract that is provided under the /contracts/2-contract-factory
directory.
The CrowdfundingFactory.sol
contract will be used to deploy multiple instances of
the CrowdfundingCampaign.sol
contract from the previous guide.
This contract factory approach streamlines the deployment of crowdfunding campaigns,
making it efficient to launch and manage multiple campaigns.
The CrowdfundingFactory
contract automates the creation and oversight of
CrowdfundingCampaign
contracts, each with their own distinct funding goals.
The factory contract features:
- Campaign Creation: Utilizes the
createCampaign
method to initiate a newCrowdfundingCampaign
contract. This function takes afundingGoal
as an argument, deploys a new campaign contract with this goal, and tracks the created campaign in thecampaigns
array. - Campaign Tracking: The
getCampaigns
method offers a view into all the campaigns created by the factory, allowing for easy access and management of multiple crowdfunding initiatives.
Run the compile script from your project in the terminal:
npm run compile
Deploy CrowdfundingCampaigns via the CrowdfundingFactory
This section outlines the steps to deploy the CrowdfundingCampaign
contract
using our new CrowdfundingFactory
.
The deployment script is located at /deploy/2-contract-factory/deploy.ts
.
The deploy script:
- deploys a single
CrowdfundingFactory
. - saves an instance of the deployed factory to
factoryContract
. This gives us access to the factory's functionalities. - The
createCampaign
method is called on this instance to create and deploy a new crowdfunding campaign contract.
Run the deployment command.
npm run deploy:crowdfunding-factory
Upon successful deployment, you'll receive the deployed factory and campaign addresses:
🏭 CrowdfundingFactory address: <0xFACTORY_CONTRACT_ADDRESS>
🚀 New CrowdfundingCampaign deployed at: <0xCAMPAIGN_ADDRESS>
✅ Deployment and campaign creation complete!
Takeaways
- Contract Factories: Utilizing contract factories significantly streamlines
the deployment process, allowing for the creation of multiple instances of a
contract, like the
CrowdfundingCampaign
, with varied parameters. - Scalability and Management: Contract factories offer a scalable solution to manage numerous contract instances, enhancing project organization and efficiency.
- Event-Driven Insights: The
CampaignCreated
event in the factory contract provides a transparent mechanism to track each crowdfunding campaign's deployment, useful for off-chain monitoring and interaction.
Next steps
With the contract factory in your ZKsync development arsenal, you're set to elevate your smart contract projects. Here's how you can further your journey:
- Contract Testing: Progress to the next guide focused on testing your contracts.
Ensuring the reliability and security of your
CrowdfundingCampaign
through comprehensive tests is critical. - Advanced ZKsync Integrations: Explore deeper into ZKsync's ecosystem by implementing features like account abstraction and paymasters to enhance user experience and contract flexibility.
- Community Engagement and Contribution: Join the vibrant ZKsync developer community. Participate in forums, Discord, or GitHub discussions. Sharing insights, asking queries, and contributing can enrich the ecosystem and your understanding of ZKsync.