I made a compiler script that takes all contracts in folder ./contracts/ and produces a .json for each contract, containing an ABI and Bytecode. This worked fine for a while. However, I added some ERC20 functionalities so on my Smart contract I did:
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";
This works really good in Remix cause it downloads the files for me. However now when I run my compiler.py script, I get this error.
$ python3 compiler.py
Traceback (most recent call last):
File "compiler.py", line 23, in <module>
compiled_contracts = compile_files(array_of_contracts_to_compile)
File "/home/jquintanilha/Documents/ethereum-contracts/MyEnv/lib/python3.7/site-packages/solcx/main.py", line 133, in compile_files
stdoutdata, stderrdata, command, proc = solc_wrapper(**compiler_kwargs)
File "/home/jquintanilha/Documents/ethereum-contracts/MyEnv/lib/python3.7/site-packages/solcx/utils/string.py", line 85, in inner
return force_obj_to_text(fn(*args, **kwargs))
File "/home/jquintanilha/Documents/ethereum-contracts/MyEnv/lib/python3.7/site-packages/solcx/wrapper.py", line 177, in solc_wrapper
stderr_data=stderrdata,
solcx.exceptions.SolcError: An error occurred during execution
> command: `/home/jquintanilha/Documents/ethereum-contracts/MyEnv/lib/python3.7/site-packages/solcx/bin/solc-v0.5.11 --combined-json abi,asm,ast,bin,bin-runtime,devdoc,opcodes,userdoc ./contracts/DoubleSigWalletFactory.sol ./contracts/Pricing.sol ./contracts/PricingFactory.sol ./contracts/DoubleSigWallet.sol`
> return code: `1`
> stderr:
> stdout:
./contracts/DoubleSigWallet.sol:9:1: Error: Source "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol" not found: File outside of allowed directories.
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol";
^-----------------------------------------------------------------------------------------------------------^
./contracts/DoubleSigWallet.sol:10:1: Error: Source "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol" not found: File outside of allowed directories.
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";
^----------------------------------------------------------------------------------------------------------^
It kind of looks like I can't import remote repositories locally to compile. Is that true?
Here is my compiler.py
import os
import json
import shutil
from os import listdir
from solcx import compile_files
path_to_contracts = "./contracts/"
array_of_contracts_to_compile = []
c_json = ""
# gets all contracts .sol in contracts dir
for f in listdir(path_to_contracts):
if f.split('.')[1] == 'sol':
array_of_contracts_to_compile.append(path_to_contracts+f)
# deletes dir build + its files and creates an empty new one
if os.path.exists("build"):
shutil.rmtree('build')
os.mkdir('build')
# compiles all contracts in folder ./contracts
compiled_contracts = compile_files(array_of_contracts_to_compile)
# for each compiled contract, create json file inside build directory
# contains abi and bytecode of each contract
for c in compiled_contracts:
c_json = json.dumps(compiled_contracts[c], indent=2)
f = open(r"./build/" + str(c.split(':')[1]) + ".json", "w+")
f.write(c_json)
and here is the beginning of my contract where it crashes:
pragma solidity ^0.5.11;
/// @title DoubleSigWallet - Allows two parties to agree on transactions before execution.
/// @author João Quintanilha
import "./Pricing.sol";
// Import OpenZeppelin's ERC20 interface defenition
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol";
contract DoubleSigWallet {
IERC20 public DAI;
/*
* Events
*/
event NewTransaction(uint256 transactionId);
event EndUserSigned(bool signed);
...
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.3.0/contracts/token/ERC20/ERC20.sol";