2

I have a smart contract that deploys another smart contract and returns the address of the deployed smart contract. The code for the smart contract looks like this-

contract ContractCreator {
    mapping(address=>address) deployedAddress;
constructor() public {   
}

function createNFT(bytes32 _name) public returns(address){
    MyArtSale ob= new MyArtSale( _name, msg.sender);
    deployedAddress[msg.sender]=address(ob);
    return address(ob);
}

function fetchNFT () public view returns(address) {
    return deployedAddress[msg.sender];
}

}

I want to interact with the createNFT function using web3.py and following is the python program-

truffleFile = json.load(open('./build/contracts/Ballot.json'))
abi = truffleFile['abi']
address = truffleFile['address']
contract= w3.eth.contract(address=address, abi=abi)

#building transaction construct_txn = contract.functions.createCourse().buildTransaction({ 'from': acct.address, 'nonce': w3.eth.getTransactionCount(acct.address), 'gas': 1728712, 'gasPrice': w3.toWei('50', 'gwei')})

signed = acct.signTransaction(construct_txn)

tx_hash=w3.eth.sendRawTransaction(signed.rawTransaction) print(tx_hash.hex()) tx_receipt = w3.eth.waitForTransactionReceipt(tx_hash)

How can I access the address that is returned by the createNFT address using the python program

1 Answers1

2

Transactions do not have return values, only function calls do. You need to emit events in your function and parse them from the transaction receipt section

Mikko Ohtamaa
  • 22,269
  • 6
  • 62
  • 127