I have zeppelin as a submodule, and I am trying to import a solidity contract from inside of the zeppelin submodule. solc is throwing and error when trying to compile though. File outside of allowed directories.\nimport 'zeppelin-solidity/contracts/ownership/Ownable.sol any idea what's causing this?
Here is my repository https://github.com/aleitner/MineableToken
The following works on linux, but not on windows:
# pwd
/tmp
# cat a/b/c/d/a.sol
import "../../x/y/r.sol";
# cat a/b/c/x/y/r.sol
# (empty)
# solc --allow-paths . a/b/c/d/a.sol
Trying to load a/b/x/y/r.sol (boost: "a/b/x/y/r.sol" canonical: "/tmp/a/b/x/y/r.sol" )
Allowed directory: ""
Is allowed: 1
# (compilation successful)
@aleitner I'm having a similar issue when editing a .sol file in <prj-root>/contracts, trying to import from <prj-root>/node_modules/
How did you resolve this?
It was happening when I was trying to include a file that was a git submodule. When I just added the code to the project in a folder rather than as a submodule, the problem went away
@aleitner Did the pathname then exist when it didn't before? I created a symlink and its not working :(
I didn't look too far into how git submodules work, but I reopened the issues because it's still a problem that needs to be addressed.
Solidity checks the canonical path and does not allow symlinks.
The same behaviour occurs even without symlinks, as shown here.
Also when running from inside the node_modules directory:
$ solc ../contracts/CapitalCoin.sol
../contracts/CapitalCoin.sol:2:1: Error: Source "zeppelin-solidity/contracts/token/StandardToken.sol" not found: File outside of allowed directories.
import 'zeppelin-solidity/contracts/token/StandardToken.sol';
^-----------------------------------------------------------^
$ pwd
/home/ravi/repo/erc20/coin/node_modules
$ readlink -f 'zeppelin-solidity/contracts/token/StandardToken.sol'
/home/ravi/repo/erc20/coin/node_modules/zeppelin-solidity/contracts/token/StandardToken.sol
$
readlink -f shows that there are no symlinks in this case.
import 'zeppelin-solidity/contracts/token/StandardToken.sol' is importing from an absolute path, i.e. from /zeppelin-solidity/contracts/token/StandardToken.sol. Does it work if you change it to relative?
If I prepend ./, I get a different issue:
$ pwd
/home/ravi/repo/erc20/coin/node_modules
$ cat ../contracts/testImport.sol
pragma solidity ^0.4.15;
import './zeppelin-solidity/contracts/token/StandardToken.sol';
$ solc ../contracts/testImport.sol
../contracts/testImport.sol:2:1: Error: Source "../contracts/zeppelin-solidity/contracts/token/StandardToken.sol" not found: File outside of allowed directories.
import './zeppelin-solidity/contracts/token/StandardToken.sol';
^-------------------------------------------------------------^
$
It's not using the $PWD working directory as ., but rather ../contracts, so it won't find ../contracts/zeppelin-solidity.
What is the design decision behind not allowing a fundamental feature of POSIX filesystems, namely symlinks?
@chriseth
I guess there may be a typo. Here import path is preparing for comparison:
https://github.com/ethereum/solidity/blob/dc154b4e5661945ca9c98720e097e84729a528be/solc/CommandLineInterface.cpp#L672
And here one of allow-paths is preparing for append:
https://github.com/ethereum/solidity/blob/dc154b4e5661945ca9c98720e097e84729a528be/solc/CommandLineInterface.cpp#L713
I suggest to change boost::filesystem::path(path); into boost::filesystem::canonical(path); in the second fragment.
Do you accept?
@ekpyron I think all of these were sorted?
I'm still seeing errors and my setup is like @HaleTom (using node_modules). Given that, and that the issue is still marked as open, I presume it is not yet fixed?
Issue is still present in 0.4.24 compiler version. Can we expect fixing this error?
@Talvish @JuliusBrain could you please explain your set up a little more in detail? The issue is still open because it is not clear whether this is a bug or what the expectation is.
compiled_sol = compile_source(contract_source_code, import_remappings=['=./pathDirectory', '-'])
Compiled source code
You can use -rmp on the cmd to remap the path to node_modules:
python oyente.py -rmp openzeppelin-solidity=/full/path/to/node_modules/openzeppelin-solidity -s someContract.sol
If you import other files (e. g. stuff you wrote via import '../../blah') in your code you can use -ap to allow other paths, like:
python oyente.py -ap /full/path/to/the/dir/from/where/you/want/to/import/a/module -s someContract.sol
Ofc, you can also combine both.
I'm following this tutorial! but got error -> "TokenCreate has not been deployed to detected network (network/artifact mismatch)"
while running command =>TokenCreate.deployed().then(inst => { crowdsale = inst } )
is any idea to resolve it ?
@HaleTom @chriseth try this => import "../../node_modules/zeppelin-solidity/contracts/crowdsale/emission/MintedCrowdsale.sol";
import "../../node_modules/zeppelin-solidity/contracts/crowdsale/validation/TimedCrowdsale.sol";
I hope it'll work for you!
@chriseth When I'm using solc to compile a contract which uses contracts from openzeppelin, I get Error: Source "openzeppelin-solidity/contracts/math/SafeMath.sol" not found: File outside of allowed directories.
@JuliusBrain use solc --allow-paths
what should I put in the --allow-paths to make it work? My project have typical truffle structure.
Perhaps your project directory?
@chriseth:
I have tried to configure the --allow-paths switch in every conceivable way, and without any success.
It is worth pointing out that truffle compile completes successfully, implying that all my import lines are written correctly.
Similarly to what others have noted here before me, the path used in those lines, as well as for the --allow-paths compilation switch is ../../node_modules/zeppelin-solidity/contracts.
So I am beginning to doubt that this is resolved.
Is there any chance that this is fixed in solc 0.4.25 (which will be a good enough motivation for me to upgrade from solc 0.4.24)?
Thanks
Could you try an absolute path for --allow-paths, please?
No, 0.4.25 is just a tiny security bugfix release.
@chriseth:
I have - that was under my conceivable ways category.
Side note: I am using solc for windows, and I have tried both forward-slashes and backward-slashes.
I just went briefly through your source code (here), and traced back allow-paths --> g_strAllowPaths --> g_argAllowPaths --> m_allowedDirectories --> weaklyCanonicalFilesystemPath, which is the only place (out of all the previous ones up the chain) where I could suspect a problem (I suppose that I could have probably found it faster by tracing back File outside of allowed directories to begin with).
Would you be able to rule out any problem in this function?
Thanks
Without knowing the inner workings of truffle, either the path is just somewhere else, there might be problems with symlinks or solc cannot figure out that some relative path is the same as some other absolute path.
@chriseth:
Truffle compiler doesn't impose the same restriction imposed by the Solidity compiler (solc) due to:
For security reasons the compiler has restrictions what directories it can access. Paths (and their subdirectories) of source files specified on the commandline and paths defined by remappings are allowed for import statements, but everything else is rejected. Additional paths (and their subdirectories) can be allowed via the
--allow-paths /sample/path,/another/sample/pathswitch.
So I suppose that Truffle only needs to append the (relative) path in the import line to the (absolute) execution path of truffle compile, in order to resolve it (this is my alternative to "knowing the inner workings of truffle").
Would you be able to add some logging inside the for (auto const& allowedDir: m_allowedDirectories) loop in file CommandLineInterface.cpp, and then release a test-version for me to try?
I've done this kind of investigation in the past, on a (different) problem in Truffle, in collaboration with one of the project's contributors. I admit that it was probably easier in that specific case, since Truffle is implemented in JS, so no need to rebuild binaries, etc.
But I think that it might be very useful for a quick resolution of this problem.
Thanks
I can try that, but to be honest, the best solution would be for truffle to properly use remappings. You should be able to use import "zeppelin/Token.sol"; and have a remapping of the following form configured: "zeppelin=/home/user/project/node_modules/zeppelin/contracts"
Are you able to access this job? https://circleci.com/gh/ethereum/solidity/41975 The binary should be in the "artifacts" tab once it is completed.
@chriseth:
Yes, but I don't see any tab titled artifacts. Will it appear once the build completes?
Also, the title says "build_x86_linux", so for all it matters, please note that I am running on Windows and using solc.exe.
Thanks
Ah I see! Then it will be here: https://ci.appveyor.com/project/ethereum-free/solidity/build/1.0.11219/job/m03c1j4wqj4rrdak
@chriseth:
Great, but how do I download an executable (like I do here)?
Or do I need to build it myself?
@barakman the link to the binary should appear there once it is built. Unfortunately, it takes a little longer on appveyor.
@chriseth:
What should I be looking for as an indication of build completion?
It should turn green and then the artifacts should be here: https://ci.appveyor.com/project/ethereum-free/solidity/build/1.0.11219/job/m03c1j4wqj4rrdak/artifacts
@chriseth:
Thanks.
There is nothing under the Artifacts tab, but the Console tab possibly indicates that something had gone wrong.
There's some printout marked red here:
[master 03040fe] Added report.
1 file changed, 7762 insertions(+)
create mode 100644 2018-10-02-55cca2e36d1dd3b737bed9bd272a50eb2b58dc1a/windows.txt
scripts\bytecodecompare\storebytecode.bat : From github.com:ethereum/solidity-test-bytecode
At line:1 char:22
+ ... priv_key) { scripts\bytecodecompare\storebytecode.bat $Env:CONFIGURAT ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (From github.com...y-test-bytecode:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
b1e6960..ea4bce7 master -> origin/master
First, rewinding head to replay your work on top of it...
Applying: Added report.
To github.com:ethereum/solidity-test-bytecode.git
ea4bce7..dba35c8 master -> master
Command executed with exception: b1e6960..ea4bce7 master -> origin/master
@chriseth:
OK, analysis...
For my initial attempt - without specifying --allow-paths at all - I get Is allowed: 0.
After several trials, my general observation is that in order to get Is allowed: 1, I need to set this switch to either one of the following:
node_modules folder and my contracts foldernode_modules folder and contains my contracts folderI'm pretty sure that the 1st rule will always hold, while the 2nd rule might hold due to the fact that my contracts folder is located directly under a sibling folder of the node_modules folder.
Note that attempting the above with relative paths has proven unsuccessful (Is allowed: 0); perhaps this could hint towards the cause of the problem.
So this seems to solve the File outside of allowed directories errors.
And I get the feeling that in order to determine if an imported file is allowed, you are possibly cutting out some or all of the relative path prefix at the beginning of that file name (in the import statement).
To support this conjecture, I now get a different set of compilation errors:
Error: Source "node_modules/openzeppelin-solidity/contracts/.../xxx.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/.../xxx.sol";
This brings me to suspect that you are using a completely different method when you get to the point of resolving an import statement (pre-compilation stage, I suppose).
I believe that for the compiler to work flawlessly on this aspect, the method for verifying an import-path and the method for resolving an import-path should rely on the same code-base.
Side note:
I am hoping that at the end of this process, I will be able to grab your test-version and use it until you release an official version. So the test-version should probably originate from your latest official release, i.e., v0.4.25.
However, you have branched this test-version off of v0.5.0, which means that I would ultimately be at risk using it (I even get Warning: This is a pre-release compiler version, please do not use it in production.).
Would it be possible for us to continue investigating this issue with test versions originating from v0.4.25?
Thank you very much for your help!
Thanks for digging so deep into this!
First one comment: Is the line import "../../../node_modules/openzeppelin-solidity/contracts/.../xxx.sol"; part of your source code? If yes, I would strongly suggest to use remappings and absolute paths. Note that .. will bring up up one level in the virtual directory layout of the compiler and not in the filesystem outside of the compiler. This might easily solve the "allowed directories" problem and should also help with source-verifying the compilation on different systems.
Specifying an absolute path that somehow contains node_modules should work. You can also try just providing the root of your filesystem as allowed path.
What does the compiler print (apart from just "allowed: 0 / 1") if you specify a relative path for --allowed-paths? Please also try both / and \ as directory separator.
Edit: If this will lead to a fix, then it will probably land in 0.5.0 which is to be released in the next 1-3 weeks.
@chriseth:
Thanks.
I will refer to your comments below:
I would strongly suggest to use remappings and absolute paths.
Not sure how to do that, while keeping the entire project portable to any other system.
Note that .. will bring up up one level in the virtual directory layout of the compiler and not in the filesystem outside of the compiler. This might easily solve the "allowed directories" problem and should also help with source-verifying the compilation on different systems.
Not sure what you mean by "one level in the virtual directory layout of the compiler and not in the filesystem outside of the compiler", but I do know that truffle compile works fine with that when executed from the same working directory (my project's top-level folder).
I would therefore expect solc to behave the same. Am I wrong in expecting this?
What does the compiler print (apart from just "allowed: 0 / 1") if you specify a relative path for --allowed-paths? Please also try both / and \ as directory separator.
In the case of Is allowed: 0, i get (for each file):
contracts folder embraced in double-quotescontracts folder embraced in double-quotescontracts folder embraced in double-quotescontracts folder embraced in double-quotescontracts folder embraced in double-quotesIn the case of Is allowed: 1, i get (for each file):
Please also try both / and \ as directory separator.
I did play with that a bit (all forward-slashes or all backward-slashes but no mixtures).
Didn't notice any different behavior.
However, in the case of Is allowed: 0, the absolute path of my contracts folder as well as all the absolute paths under it began with C:/ and continued with only backward-slashes (\).
This is possibly just a Windows issue (i.e., the std function that you use in your source code probably fetches paths from the OS).
Edit: If this will lead to a fix, then it will probably land in 0.5.0 which is to be released in the next 1-3 weeks.
Thank you for this vital piece of information :)
Bottom-line question:
How exactly should we continue from here?
I need a scheme that will:
Thanks
Hm, I actually think we need someone from the truffle team in this discussion, as I don't really know what truffle does to the compiler. For example, why does the compiler output multiple allowed paths? Also, could you please paste the exact output from the compiler (you can mask some of the path components) and also how you invoke the compiler.
@chriseth:
I will do so in a few moments (takes some time to setup my env for that).
But in the meanwhile, I would like to refer your attention to a number of things:
I don't really know what truffle does to the compiler. For example, why does the compiler output multiple allowed paths?
I'm at a lost here.
I got this output from YOUR compiler, not from Truffle's.
The test-version that you uploaded is the one which printed out these multiple paths, as a result of you adding it in the code. Am I missing something?
When I call truffle compile, it completes successfully; I suppose that this is the case because Truffle doesn't have the "allowed paths" issue.
Did you perhaps mean that because Truffle uses solc.js and the solc.js project relies on solc, you need to understand from Truffle dev team how they got solc.js to work despite the "allowed paths" issue?
If that's indeed the case then:
solc.js project itself.solc.js dev team has taken your core classes, while stripping away the "management layer" (e.g., files like CommandLineInterface.cpp, etc). A simple way to assert this conjecture is by looking for allowed-paths in Truffle source code (file /node_modules/truffle/build/cli.bundled.js) and in solc.js source code (all files in folder node_modules/solc). I did, and it's not there indeed.The other thing that I wanted to refer your attention to (also getting this from audits to my Solidity project):
I believe that anyone who uses installed packages like npm install openzeppelin-solidity, has most likely given up the effort of using solc, and instead uses Truffle (or solc.js directly).
Of course, there are numerous ways to work around this, like adding an auto-script at the end the installation, which copies the third-party source files from the installation path into your local (contracts) folder. But I'm thinking to myself, this is most likely not the case.
BTW, I also got this impression from OZ when I brought up the solc problem on a GitHub chat with them.
So my point is, if we are to keep solc widely used, then fixing this issue is imperative IMO.
I will paste here the full logging info printed in your test-version shortly.
Thanks!!!
Oh I'm sorry, it seems I misunderstood you there - you are calling solc directly and want to get the same result as when it's called via truffle, right?
Indeed, solc and solc-js should work identically and we want to keep both. For larger projects, the recommendation is to use --standard-json, though, which basically removes all filesystem access complications and turns the compiler into a "string in - string out" mode, which is much easier to keep consistent across platforms.
@chriseth:
Use --standard-json where?
We are currently using solc.exe instead of truffle compile for several reasons:
solc.exe generates abi and bin files for each source file, while truffle compile generates a json file for each source file. We find the former output easier to use for various reasons:truffle compile updates the json files on every compilation, even if none of the source files has changed, which makes version-control more difficult.solc.exe, we know exactly what compiler version is used, while with Truffle it is "a lot more implicit" (you have to dig into your node packages, and you have to do so every time the npm package for Truffle is updated on GitHub).That is why we try hard to resolve the allowed-paths issue.
Here are the two printouts of your test-version:
Case #1:
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Allowed directory: "C:/Users\...\project\contracts\..."
Is allowed: 0
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project\contracts"
Is allowed: 1
Warning: This is a pre-release compiler version, please do not use it in production.
contracts/.../aaa.sol:4:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../bbb.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../ccc.sol:8:1: Error: Source "node_modules/openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol";
^-------------------------------------------------------------------------------------------^
contracts/.../ccc.sol:9:1: Error: Source "node_modules/openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol";
^-------------------------------------------------------------------------------------------^
contracts/.../ddd.sol:4:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../eee.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../fff.sol:4:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../ggg.sol:10:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../ggg.sol:11:1: Error: Source "node_modules/openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol";
^-------------------------------------------------------------------------------------------^
contracts/.../ggg.sol:12:1: Error: Source "node_modules/openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
^-------------------------------------------------------------------------------------------^
contracts/.../hhh.sol:4:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../iii.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../jjj.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../kkk.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../lll.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File outside of allowed directories.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
Case #2:
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Checking whether import is fine to use.
Allowed directory: "C:\Users\...\project"
Is allowed: 1
Warning: This is a pre-release compiler version, please do not use it in production.
contracts/.../aaa.sol:4:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../bbb.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../ccc.sol:8:1: Error: Source "node_modules/openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol";
^-------------------------------------------------------------------------------------------^
contracts/.../ccc.sol:9:1: Error: Source "node_modules/openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol";
^-------------------------------------------------------------------------------------------^
contracts/.../ddd.sol:4:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../eee.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../fff.sol:4:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../ggg.sol:10:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../ggg.sol:11:1: Error: Source "node_modules/openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol";
^-------------------------------------------------------------------------------------------^
contracts/.../ggg.sol:12:1: Error: Source "node_modules/openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/token/ERC20/MintableToken.sol";
^-------------------------------------------------------------------------------------------^
contracts/.../hhh.sol:4:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../iii.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../jjj.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../kkk.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
contracts/.../lll.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
^-------------------------------------------------------------------------------------^
Thanks
Pleas provide the full command line you use!
One thing I noticed:
contracts/.../iii.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
This looks like the compiler is searching for "node_modules/..., which might mean that it does not interpret the .. as going up one level in the directory hierarchy because it already arrived at the root of its virtual directory hierarchy (just created https://github.com/ethereum/solidity/issues/5146 for that).
One solution for that would be: Do not use .. in imports, but use remappings instead.
Another solution would be to call the compiler from "further above", i.e. use solc x/y/z/my/source.solc so that ../../../ actually works.
@chriseth:
might mean that it does not interpret the .. as going up one level in the directory hierarchy because it already arrived at the root of its virtual directory hierarchy
I actually mentioned that in one of my comments above:
And I get the feeling that in order to determine if an imported file is allowed, you are possibly cutting out some or all of the relative path prefix at the beginning of that file name (in the import statement).
To support this conjecture, I now get a different set of compilation errors:
Error: Source "node_modules/openzeppelin-solidity/contracts/.../xxx.sol" not found: File not found.
import "../../../node_modules/openzeppelin-solidity/contracts/.../xxx.sol";
One solution for that would be: Do not use
..in imports, but use remappings instead.
The problem with this solution is that truffle compile will fail to work, and it will fail to work simply because this would be an incorrect path (i.e., not something that we could blame Truffle for).
So I am kind of reluctant to even try it.
I take truffle compile success of failure as reference, when I set up my expectation from solc.exe.
That is, unless I am not interpreting your "remappings" suggestion correctly.
Another solution would be to call the compiler from "further above", i.e. use solc x/y/z/my/source.solc so that ../../../ actually works.
I doubt that it matters. When I call solc.exe (see command-line below), I pass each and every one of the input source files with a relative path which corresponds to the location of solc.exe in my file system.
Since truffle compile must be executed from the same path as the truffle-config.js file, I chose to run solc.exe from that path as well. But I've made sure that each one of the input file names which I pass to solc.exe is prefixed with the correct (relative) path.
Here is my command-line:
@echo off
cd project
if exist build\binaries rd /s /q build\binaries
echo Building binaries; please stand by...
call ..\..\solc_0.5.0\solc.exe --bin --abi --optimize --optimize-runs=5000000 --output-dir=build\binaries ^
contracts/.../xxx.sol ^
contracts/.../yyy.sol ^
contracts/.../zzz.sol
choice /m "Process complete; press X or simply close the window" /n /c X
And when a file imports some other file located outside of the contracts folder, this command-line fails (with or without the allowed-paths configuration).
Thanks
Could you please provide more details about the location of your node_modules directory and the stuff you replaced by ...?
@chriseth:
My directory structure is this:
Coming to think about it, perhaps I should add openzeppelin source files to the compilation command-line...?
I mean, I probably should, but would that solve my remaining problems once allowed-paths is configured correctly?
I will have to give it a try...
In my opinion, the best way to compile this would be using solc project/contracts/*.sol openzeppelin=./node_modules/openzeppelin-solidity/contracts/ and then importing via openzeppelin/.... If you do not want to change your code, then
solc project/contracts/*.sol --allow-paths=.
should work, or at least --allow-paths with the absolute current path.
If this does not work, then please include the full compiler output and the full commandline you used.
@chriseth:
I'm not sure I follow.
In my contracts, I import "external" files like this, for example:
import "../../../node_modules/openzeppelin-solidity/contracts/ownership/Claimable.sol";
This obviously goes outside of my contracts folder, and truffle compile nevertheless completes successfully.
Are you suggesting that I change this type of relative paths in my Solidity code in order to make solc.exe work?
Because I don't quite see how truffle compile will continue to work after I do so.
Can you please explain?
Thanks
@chriseth:
And again, I would like to emphasize an analysis that I made earlier in this thread.
Depending on the value of allow-paths, the error is either one of the following two:
Source "node_modules/.../xxx.sol" not found: File outside of allowed directories.Source "node_modules/.../xxx.sol" not found: File not found.Based on this observation, I believe that your method for approving an import-path and your method for resolving an import-path (executed later in the compilation process) do not rely on the same code-base.
Of course, even if I'm right here, it will not provide me with a solution for the current solc version, so I would be happy with any workaround which will allow me to run both solc.exe and truffle compile successfully on the same set of Solidity source files.
Please provide the full commands you run, the full paths to the directories the commands are run from, the import statements in the individual files (one should suffice) and the complete output of the solc binary.
I think we talked about this before - import should not use ... It might still work, but if you want your code to be portable across code bases, you should avoid it.
@chriseth:
I do not understand why it is imperative that I avoid using .., because:
truffle compile seems to be handling it well.In any case, I will set up an MVP (minimal verifiable procedure or something like that) which reproduces each one of the errors that I have mentioned above, and then post it here (directory structure, import statements in each source file, and compilation command-line).
Thanks again for all your help :)
@chriseth:
Please see below an MVP which reproduces the problem.
Directory Structure:
npm install):File MyContract.sol:
pragma solidity 0.4.24;
import "../../node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol";
contract MyContract is Ownable {
uint public x = 42;
}
File compile_with_solc.bat:
@echo off
cd project
if exist build\binaries rd /s /q build\binaries
call ..\solc_0.4.24\solc.exe --bin --abi --output-dir=build\binaries ^
contracts/MyContract.sol ^
../node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol
choice /m "Process complete; press X or simply close the window" /n /c X
File compile_with_truffle.bat:
@echo off
set path=%path%;%cd%\node_modules\.bin
cd project
if exist build\contracts rd /s /q build\contracts
call truffle compile
choice /m "Process complete; press X or simply close the window" /n /c X
File package.json:
{
"devDependencies": {
"truffle": "4.1.14",
"openzeppelin-solidity": "1.12.0"
}
}
When compiling with truffle, the following is created under project/build:
When compiling with solc, the following should be created under project/build, but it is not:
Depending on the value of --allow-paths passed to solc, the error is either this:
contracts/MyContract.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol" not found: File outside of allowed directories.
import "../../node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol";
^--------------------------------------------------------------------------------^
Or this:
contracts/MyContract.sol:3:1: Error: Source "node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol" not found: File not found.
import "../../node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol";
^--------------------------------------------------------------------------------^
Thanks
Thanks again for your help, but PLEASE tell us which "--allow-paths" argument provides which output in the modified binary I created for you.
@chriseth:
The File outside of allowed directories error occurs when:
--allow-paths is not specified--allow-paths=C:\Users\barak\test\project\contracts--allow-paths=C:\Users\barak\test\node_modules\openzeppelin-solidity\contracts\ownership--allow-paths=C:\Users\barak\test\node_modules\openzeppelin-solidity\contracts--allow-paths=C:\Users\barak\test\node_modules\openzeppelin-solidity--allow-paths=C:\Users\barak\test\node_modules--allow-paths=..The File not found error occurs when:
--allow-paths=C:\Users\barak\test\project--allow-paths=C:\Users\barak\test--allow-paths=C:\Users\barak--allow-paths=C:\Users--allow-paths=C:--allow-paths=.I tried all of the above also with forward slashes, and got the same results.
Note that technically, since my execution path is C:\Users\barak\test\project, the paths .. and C:\Users\barak\test are identical. Nevertheless, as you can see, each one of them yields a different error.
Thanks
@barakman ok, then please use --allow-paths=C:\Users\barak\test\project for all further tries. Giving the full path of the input files does not help, I assume? Then I think I have to create a new binary for further debugging.
@chriseth:
C:\Users\barak\test\node_modules\openzeppelin-solidity\contracts\ownership is the full path of the only "external" input file in this MVP, and I have already tried it (as you can learn from my previous comment).
Reducing the configuration of allow-paths to a single option will indeed make my life a lot easier with this one.
I'll be standing await for a new debug-version.
Thanks
@chriseth:
Some progress via a different channel (of a different issue that I've been dealing with):
While investigating why the bytecode generated by truffle compile and the bin generated by solc are always different (given the same input file), I have been able to determine that the difference is only in the metadata part of the bytecode (the 64 characters which appear right before the last 4 characters).
However, I then noticed that the generated bytecode is different even when I apply truffle compile on the same input file located in two different folders.
Again, the difference is reflected only in the metadata, but for the sake of version control, I found this very troubling (in case you're wondering why one would save compiled code under version control - we do this in order to allow for better tracking of changes in our system).
The entire investigation (including a fix) is reported here.
In any case, during this investigation, I have located the piece of Truffle source code responsible for embedding the input file's absolute path name into the metadata part of the bytecode.
And as part of this investigation, I was able to get hold of the input which truffle compile sends to solc, which I then figured could be of interest to you (since solc completes successfully even though we have a file located outside of allowed directories).
So I generated this input for our case (the setup that I have described here earlier):
{
"language": "Solidity",
"sources": {
"/C/Users/barak/test/project/contracts/MyContract.sol": {
"content": "pragma solidity 0.4.24;\r\nimport \"../../node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol\";\r\ncontract MyContract is Ownable {\r\n uint public x = 42;\r\n}"
},
"/C/Users/barak/test/node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol": {
"content": "pragma solidity ^0.4.24;\n\n\n/**\n * @title Ownable\n * @dev The Ownable contract has an owner address, and provides basic authorization control\n * functions, this simplifies the implementation of \"user permissions\".\n */\ncontract Ownable {\n address public owner;\n\n\n event OwnershipRenounced(address indexed previousOwner);\n event OwnershipTransferred(\n address indexed previousOwner,\n address indexed newOwner\n );\n\n\n /**\n * @dev The Ownable constructor sets the original `owner` of the contract to the sender\n * account.\n */\n constructor() public {\n owner = msg.sender;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(msg.sender == owner);\n _;\n }\n\n /**\n * @dev Allows the current owner to relinquish control of the contract.\n * @notice Renouncing to ownership will leave the contract without an owner.\n * It will not be possible to call the functions with the `onlyOwner`\n * modifier anymore.\n */\n function renounceOwnership() public onlyOwner {\n emit OwnershipRenounced(owner);\n owner = address(0);\n }\n\n /**\n * @dev Allows the current owner to transfer control of the contract to a newOwner.\n * @param _newOwner The address to transfer ownership to.\n */\n function transferOwnership(address _newOwner) public onlyOwner {\n _transferOwnership(_newOwner);\n }\n\n /**\n * @dev Transfers control of the contract to a newOwner.\n * @param _newOwner The address to transfer ownership to.\n */\n function _transferOwnership(address _newOwner) internal {\n require(_newOwner != address(0));\n emit OwnershipTransferred(owner, _newOwner);\n owner = _newOwner;\n }\n}\n"
}
},
"settings": {
"evmVersion": "byzantium",
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"": [
"legacyAST",
"ast"
],
"*": [
"abi",
"evm.bytecode.object",
"evm.bytecode.sourceMap",
"evm.deployedBytecode.object",
"evm.deployedBytecode.sourceMap"
]
}
}
}
}
If you're planning on consulting with Truffle dev team, then the object above (passed to solc as a string) is called solcStandardInput in the their code.
Thanks
Ah, that's good to know! So perhaps truffle transforms C: to /C/ and this could be the trick - although I doubt it.
The reason the metadata changes is because the path of the input files is part of the metadata to allow recompilation. Have you read https://solidity.readthedocs.io/en/develop/using-the-compiler.html and https://solidity.readthedocs.io/en/develop/metadata.html yet?
So I think this is really an issue about windows. I created a new debug binary to be found at https://ci.appveyor.com/project/ethereum-free/solidity/build/job/j29vmubcyt6ni4wy and it produces the following output on my system:
# pwd
/tmp
# cat a/b/c/d/a.sol
import "../../x/y/r.sol";
# cat a/b/c/x/y/r.sol
# (empty)
# solc --allow-paths . a/b/c/d/a.sol
Trying to load a/b/x/y/r.sol (boost: "a/b/x/y/r.sol" canonical: "/tmp/a/b/x/y/r.sol" )
Allowed directory: ""
Is allowed: 1
# (compilation successful)
@chriseth:
Possibly, though I would rather calling it "an issue about solc over windows" (implying it should be fixed in solc).
The problem with the path of the input files being part of the metadata, is that when this path is absolute, the compilation artifacts become "inappropriate" for version-control.
In order to "straighten this out", I have applied a patch in my local Truffle, which changes this path from absolute to relative when using truffle compile in combined with --fix_paths.
Metadata for my compilation above (added a contract in a.sol):
{"compiler":{"version":"0.5.0+commit.c5c8023b.mod"},"language":"Solidity","output":{"abi":[],"devdoc":{"methods":{}},"userdoc":{"methods":{}}},"settings":{"compilationTarget":{"a/b/c/d/a.sol":"c"},"evmVersion":"byzantium","libraries":{},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"a/b/c/d/a.sol":{"keccak256":"0xc38153aeaa4ace759b27180251cf86669ccef64be34c4fba795b38a1a76a2a32","urls":["bzzr://2c6f579e5c04e85fe12ab81ab6970109489e6312c766da73ce00a10aa14632f0"]},"a/b/x/y/r.sol":{"keccak256":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470","urls":["bzzr://011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce"]}},"version":1}
Here are the artifacts: https://ci.appveyor.com/api/buildjobs/754jayqv3g0ebic4/artifacts/solidity-windows.zip
@chriseth:
And BTW, I have moved from compiling directly with solc, to compiling with truffle.
So I am willing to continue with this investigation if my help is needed, but I will not mind if you decide to close this issue, as I am no longer in a dire need to get it solved.
Thanks for all your help :)
I would still like to find the root cause for this, especially since it works on my system but not on yours. Your help is much appreciated!
Now that we isolated the bug, it would be great if you could run it once more.
@chriseth:
So just to be sure we're on the same page here - you want me to:
solc version from https://ci.appveyor.com/project/ethereum-free/solidity/build/job/j29vmubcyt6ni4wyIs that correct?
Please use the solc version you mentioned and compile the same situation as in my comment https://github.com/ethereum/solidity/issues/2742#issuecomment-427795397 and post the full printout and the full commands. Thanks a lot!
@chriseth :
You want me to compile a source file which contains nothing but import "../../x/y/r.sol";...?
Create a directory hierarchy: a\b\c\d containing a file a.sol whose contents are
import "../../x/y/r.sol";
And another empty file r.sol in the directory a\b\x\y\ ( note the last two path components are different).
Then run from the directory that contains a as a subdirectory:
solc.exe --allow-paths . a/b/c/d/a.sol
and please also try
solc.exe --allow-paths . a\b\c\d\a.sol
@chriseth:
Got it.
At present, there are 2 queued jobs and nothing to download (unless I'm missing something).
So I will check it again in about an hour.
Thanks
@chriseth:
For your first request:
Trying to load a/b/x/y/r.sol (boost: "a/b/x/y/r.sol" canonical: "C:/Users\barak\Desktop\test\a\b\x\y\r.sol" )
Allowed directory: ""
Is allowed: 1
Warning: This is a pre-release compiler version, please do not use it in production.
a/b/x/y/r.sol:1:1: Warning: Source file does not specify required compiler version!
^
a/b/c/d/a.sol:1:1: Warning: Source file does not specify required compiler version!
import "../../x/y/r.sol";
^ (Relevant source part starts here and spans across multiple lines).
For your second request:
Trying to load a/b/x/y/r.sol (boost: "a/b/x/y/r.sol" canonical: "C:/Users\barak\Desktop\test\a\b\x\y\r.sol" )
Allowed directory: ""
Is allowed: 1
Warning: This is a pre-release compiler version, please do not use it in production.
a/b/x/y/r.sol:1:1: Warning: Source file does not specify required compiler version!
^
a/b/c/d/a.sol:1:1: Warning: Source file does not specify required compiler version!
import "../../x/y/r.sol";
^ (Relevant source part starts here and spans across multiple lines).
@barakman ok, that looks like it is indeed working. Why did it not work for your concrete source code?
@chriseth:
I would need to actually try it on my MVP in order to answer this question, but one quick hunch would be the location of solc in each case.
In my MVP:
solc (and all required DLLs) was under test/solc_0.4.24solc was therefore via call ..\solc_0.4.24\solc.exeIn your test-case:
solc (and all required DLLs) is under test (alongside a)solc is therefore via call solc.exeAnother difference I just noticed, is that in my MVP, I have specified the following compilation flags (which you haven't specified in your test-case):
--bin--abi--output-dir=build\binariesI can give it a try (all of the differences above applied into your test-case), and see if I get different results...
I can hardly imagine that this would have an influence. The current working directory has an influence, but not the location of the compiler binary or which output you request.
@chriseth:
Indeed no impact.
I also added some actual contract to each one of source files that you requested (otherwise no binaries are created, so I figured we might not be testing things "for real").
But no difference.
@barakman so are you saying that everything works as expected? Then can this issue be closed?
@chriseth:
I apologize for the delayed response.
I have located the difference between my MVP and your MVP, which leads to a compilation error in mine but not in yours.
It is the execution path of solc.
In your case, you run it from a path which is a parent of both source files.
In my case, I run it from a path which is a parent of the 1st source file, but an uncle of the 2nd source file.
I do so, by executing cd project before executing solc.
I'm not sure if to consider it as a problem in solc or in the usage of solc (I guess it's up for you to decide on that), but as far as I'm concerned, it's a done deal.
Thank you very much for all your help with this issue :)
OK, thanks for your response!
Most helpful comment
Solidity checks the canonical path and does not allow symlinks.