Solidity – How to Call an Imported Contract Using Solidity Effectively

importpopulussolcsolidity

Inside my contract I want to use importkeyword to load other contracts and libraries to make my code more clean. As an example, I carried DateTime.sol contract to another file and import it inside myContract file without any problem.

myContract.sol:

import "/Users/avatar/populus/contracts/DateTime.sol"; //works.
contract myContract{
   DateTime date = new DateTime(); //does not work.
   <Some_Code>
}

But from myContract contract, when I try to call the DateTime contract as: DateTime date = new DateTime() I have faced with the following error:

/usr/local/lib/python2.7/site-packages/populus/chain.py:580: in get_contract
    if contract_name not in self.contract_factories:
/usr/local/lib/python2.7/site-packages/populus/utils/functional.py:50: in __get__
    res = instance.__dict__[self.name] = self.func(instance)
/usr/local/lib/python2.7/site-packages/populus/chain.py:198: in contract_factories
    compiled_contracts = self.project.compiled_contracts
/usr/local/lib/python2.7/site-packages/populus/project.py:153: in compiled_contracts
    optimize=True,
/usr/local/lib/python2.7/site-packages/populus/compilation.py:42: in compile_project_contracts
    compiled_sources = compile_files(contract_source_paths, **compiler_kwargs)
/usr/local/lib/python2.7/site-packages/solc/main.py:129: in compile_files
    **kwargs
/usr/local/lib/python2.7/site-packages/solc/utils/string.py:91: in inner
    return force_obj_to_text(fn(*args, **kwargs))

E Dynamic exception type: boost::exception_detail::clone_impl<dev::solidity::InternalCompilerError>
E std::exception::what: std::exception
E [dev::tag_comment*] = Compiled contract not found.

But when the DateTime contract was embedded inside myContract.sol file, I was able to call DateTime date = new DateTime(); from myContract contract without having any problem. I have used following approach: How to call a Contract from an existing contract approach.

myContract.sol:

contract myContract{
   DateTime date = new DateTime(); //works now.
   <Some_Code>
}
contract DateTime{
   <Some_Code>
}

[Q] I have tried this approach on Solidity Browser and it works. How could I fix this problem on Populus?

Some information:

  • platform darwin — Python 2.7.12, pytest-3.0.2, py-1.4.31,
    pluggy-0.3.1
  • plugins: populus-1.1.0
  • OS: Mac OS X

solc –version: the solidity compiler commandline interface
Version: 0.4.8+commit.60cc1668.Darwin.appleclang

Thank you for your time and help.

Best Answer

The error you have is not related to Populus:

   Dynamic exception type: boost::exception_detail::clone_impl<dev::solidity::InternalCompilerError>
   E std::exception::what: std::exception

It says Solidity cannot compile your contract because of a bug. Please repeat the issue by manually compiling the contracts from the command line and then issuing a bug report against Solidity with repeatable steps.

Also, update your Solidity to the latest version before doing this.

Related Topic