I am trying to deploy a contract from another factory contract and then return the address of the newly created contract. The address it returns however is the transaction hash not the contract address. I believe this is because the contract is not yet mined when the address is returned. When I deploy a contract using the web3 deploy it seems to wait until the contract is deployed before outputting the address.
The factory contract:
contract Factory {
mapping(uint256 => Contract) deployedContracts;
uint256 numContracts;
function Factory(){
numContracts = 0;
}
function createContract (uint32 name) returns (address){
deployedContracts[numContracts] = new Contract(name);
numContracts++;
return deployedContracts[numContracts];
}}
This is how I am calling the createContract function.
factory.createContract(2,function(err, res){
if (err){
console.log(err)
}else{
console.log(res)
}
});
Consider the below example. There are a number of ways you can get the address of the contract:
1 Store the Address and Return it:
Store the address in the contract as an attribute and retrieve it using a normal getter method.
2
Call
Before You Make A TransactionYou can make a
call
before you make a transaction:Once you have the address perform the transaction:
3 Calculate the Future Address
Otherwise, you can calculate the address of the future contract like so:
We ran across this problem today, and we're solving it as follows:
In the creation of the new contract raise an event.
Then once the block has been mined use the transaction hash and call
web3.eth.getTransaction
: http://web3js.readthedocs.io/en/1.0/web3-eth.html#gettransactionThen look at the
logs
object and you should find the event called by your newly created contract with its address.Note: this assumes you're able to update the Solidity code for the contract being created, or that it already calls such an event upon creation.