Deploying Multiple Contracts at the Same Address Using Hardhat
In newer versions of Hardhat, there is a new way to deploy multiple contracts at the same address. This feature allows you to create a contract that can be deployed with additional arguments or variables.
Workaround
To deploy two contracts A and B at the same address using Hardhat 4.x, you can use the --network
option and pass an array of contract addresses as arguments.
Here is an example:
// contracts.js
const ContractA = artifacts.require("ContractA");
const ContractB = artifacts.require("ContractB");
module.exports function deployContracts() {
return ethers.providers.deployer.at("0x..."),then((provider) => {
const [contractAAddress, contractBAddress] = ["0x...", "0x..."];
// Deploy contracts A and B to the same address
await ContractA.new({ from: provider, data: [], nonce: 0 });
await ContractB.new({ from: provider, data: [], nonce: 0 });
// Use deployed contracts in next contract
const contractA = ContractA.at(contractAAddress);
const contractB = ContractB.at(contractBAddress);
return [contractA, contractB];
});
}
// scripts/hardhat.js
const { deploy } = require("hardhat");
module.exports function deployContracts() {
return new Promise((resolve) => {
schedules([{
contract: "contracts/ContractA.json",
from: "0x...",
Gas price: 10000,
gasLimit: 2000000,
one time: 0,
}], (error, accounts) => {
if (error) {
console.error(error);
return;
}
// Get the distributed contracts
const [contractAddress, contractAddress] = accounts.map((account) =>
ContractA.at (contract address)
);
// Use the distributed contracts in the following contract
resolve([contractAddress, contractAddress]);
});
});
}
In this example, we define two contracts `ContractA'' and
ContractB''. We then deploy both contracts to the same address using the
deployContractsfunction. The
deployhook allows us to pass an array of contract addresses as arguments.
ThedeployContractsfunction returns a promise that resolves to an array containing the addresses of the deployed contracts. In this case, we use the
map` method to extract the addresses of each contract from the array of accounts.
Usage example
In your next Hardhat script, you can use the deployed contracts in a function or variable.
// scripts/hardhat.js
const { deployContracts } = require("./deployContracts");
asynchronous function main() {
const [contractAddress, contractAddress] = await deployContracts();
// Use the deployed contracts in the next contract
const contractA = ContractA.at(contractAAddress);
const contractB = ContractB.at(contractBAddress);
// Do something with the contracts...
}
Note that Hardhat 4.x also supports other features such as event emitters, access control, and more. Be sure to check the official Hardhat documentation for a comprehensive list of available hooks and functions.
Leave a Reply