Learn how to retrieve the address of a contract deployed by another contract in Solidity, enabling interaction and communication between different smart contracts.
In the world of smart contracts, it's common for one contract to deploy others. When this happens, knowing the address of the newly deployed contract is essential for interaction. There are three primary ways to capture this address: emitting an event, returning the address directly from the deployment function, and storing the address in a mapping within the factory contract.
When a contract deploys another contract, it's crucial to capture the deployed contract's address. Here's how:
event Deployed(address newContractAddress);
function deployMyContract() public {
MyContract newContract = new MyContract();
emit Deployed(address(newContract));
}function deployMyContract() public returns (address) {
MyContract newContract = new MyContract();
return address(newContract);
}mapping(address => address) public deployedContracts;
function deployMyContract() public {
MyContract newContract = new MyContract();
deployedContracts[msg.sender] = address(newContract);
}Explanation:
Important Considerations:
This Solidity code defines two contracts: MyContract and MyContractFactory. MyContract is a simple contract with a variable and a function to modify it. MyContractFactory deploys instances of MyContract and captures their addresses using three methods: emitting an event, storing in a mapping, and returning from a function. This allows users to access deployed contract addresses in different ways.
This example demonstrates all three methods of capturing deployed contract addresses:
pragma solidity ^0.8.0;
// Define the contract to be deployed
contract MyContract {
uint256 public myNumber;
constructor() {
myNumber = 42;
}
function setNumber(uint256 newNumber) public {
myNumber = newNumber;
}
}
// Define the factory contract
contract MyContractFactory {
// Event to log deployed contract addresses
event Deployed(address indexed deployer, address newContractAddress);
// Mapping to store deployed contract addresses
mapping(address => address) public deployedContracts;
// Function to deploy MyContract and capture its address using all three methods
function deployMyContract() public returns (address) {
// Deploy the contract
MyContract newContract = new MyContract();
// Emit an event with the deployed contract address
emit Deployed(msg.sender, address(newContract));
// Store the deployed contract address in the mapping
deployedContracts[msg.sender] = address(newContract);
// Return the deployed contract address
return address(newContract);
}
}Explanation:
myNumber and a function setNumber to modify it.MyContract and captures their addresses.
Deployed event: This event is emitted every time a new MyContract is deployed. It logs the deployer's address and the new contract's address.deployedContracts mapping: This mapping stores the deployed contract address against the deployer's address.deployMyContract function: This function deploys a new MyContract, emits the Deployed event, stores the address in the deployedContracts mapping, and finally returns the deployed contract address.How to use:
MyContractFactory contract.deployMyContract function.Deployed event.deployMyContract function.deployedContracts mapping using the deployer's address.This example demonstrates different ways to capture deployed contract addresses. Choose the method that best suits your needs and remember to test your deployment process thoroughly.
Choosing the Right Method:
Beyond Basic Deployment:
Best Practices:
This article outlines three methods for capturing the address of a contract deployed by another contract in Solidity:
| Method | Description | Pros | Cons |
|---|---|---|---|
| Emit an Event | Log the deployed address in an event emitted by the factory contract. | - Accessible off-chain. - Useful for tracking contract actions. | - Requires external indexing and querying. |
| Return the Address | Directly return the deployed address from the deployment function. | - Simple and straightforward. | - Not ideal for complex scenarios. |
| Store the Address | Store the deployed address in a mapping within the factory contract. | - Persistent storage and retrieval. | - Increased contract storage size. |
Key Takeaways:
Capturing the address of a deployed contract is a fundamental aspect of smart contract development in Solidity. Whether you choose to emit an event, return the address directly, or store it in a mapping, understanding the strengths and weaknesses of each approach is crucial. Remember to prioritize security, gas efficiency, and code readability in your implementation. By following best practices and testing thoroughly, you can ensure the seamless interaction and management of your deployed contracts within the decentralized world.
How to deploy a Proxy Upgradeable Contract from a contract ... | Greetings. I would like to understand how I can upgrade a contract that was deployed from another contract. vault.logic = new CompoundVault(); <--- stores implementation address of upgradeable vault.logic.initializeIt( address(this), deployer, cToken, asset, fees, feeBase, mentissa, symbol, name ); I notice that the deployment is returning the implementation address ...
How To Get the Address of a Contract Deployed by Another Contract ... | When one contract in Solidity deploys another, it's common to need the address of a deployed contract for further interactions.
How can I get a deployed proxy contract's implementation address ... | Hi, How can I get a deployed proxy contract’s implementation address from inside solidity? I wanna get this state from any contract really. I only found this method: https://docs.openzeppelin.com/sdk/2.5/api/upgrades#BaseAdminUpgradeabilityProxy-implementation-- But it is not what I am looking for, due to ifAdmin modifier.