aboutsummaryrefslogtreecommitdiffstats
path: root/packages/sol-compiler
diff options
context:
space:
mode:
authorHsuan Lee <boczeratul@gmail.com>2019-03-06 17:46:50 +0800
committerHsuan Lee <boczeratul@gmail.com>2019-03-06 17:46:50 +0800
commit35703539d0f2b4ddb3b11d0de8c9634af59ab71f (patch)
treeae3731221dbbb3a6fa40060a8d916cfd3f738289 /packages/sol-compiler
parent92a1fde5b1ecd81b07cdb5bf0c9c1cd3544799db (diff)
downloaddexon-0x-contracts-35703539d0f2b4ddb3b11d0de8c9634af59ab71f.tar.gz
dexon-0x-contracts-35703539d0f2b4ddb3b11d0de8c9634af59ab71f.tar.zst
dexon-0x-contracts-35703539d0f2b4ddb3b11d0de8c9634af59ab71f.zip
Deploy @dexon-foundation/0x.jsstable
Diffstat (limited to 'packages/sol-compiler')
-rw-r--r--packages/sol-compiler/.npmignore7
-rw-r--r--packages/sol-compiler/CHANGELOG.json497
-rw-r--r--packages/sol-compiler/CHANGELOG.md205
-rw-r--r--packages/sol-compiler/README.md97
-rwxr-xr-xpackages/sol-compiler/bin/sol-compiler.js2
-rw-r--r--packages/sol-compiler/coverage/.gitkeep0
-rw-r--r--packages/sol-compiler/package.json95
-rw-r--r--packages/sol-compiler/solc_bin/.gitkeep0
-rw-r--r--packages/sol-compiler/src/cli.ts52
-rw-r--r--packages/sol-compiler/src/compiler.ts389
-rw-r--r--packages/sol-compiler/src/globals.d.ts6
-rw-r--r--packages/sol-compiler/src/index.ts29
-rw-r--r--packages/sol-compiler/src/schemas/compiler_options_schema.ts27
-rw-r--r--packages/sol-compiler/src/utils/compiler.ts411
-rw-r--r--packages/sol-compiler/src/utils/constants.ts8
-rw-r--r--packages/sol-compiler/src/utils/encoder.ts20
-rw-r--r--packages/sol-compiler/src/utils/fs_wrapper.ts28
-rw-r--r--packages/sol-compiler/src/utils/types.ts44
-rw-r--r--packages/sol-compiler/src/utils/utils.ts6
-rw-r--r--packages/sol-compiler/test/compiler_test.ts117
-rw-r--r--packages/sol-compiler/test/compiler_utils_test.ts83
-rw-r--r--packages/sol-compiler/test/fixtures/contracts/BadContractName.sol3
-rw-r--r--packages/sol-compiler/test/fixtures/contracts/EmptyContract.sol3
-rw-r--r--packages/sol-compiler/test/fixtures/contracts/Exchange.sol603
-rw-r--r--packages/sol-compiler/test/fixtures/contracts/TokenTransferProxy.sol115
-rw-r--r--packages/sol-compiler/test/fixtures/contracts/base/SafeMath.sol41
-rw-r--r--packages/sol-compiler/test/fixtures/contracts/base/Token.sol38
-rw-r--r--packages/sol-compiler/test/fixtures/exchange_bin.ts4
-rw-r--r--packages/sol-compiler/test/util/chai_setup.ts13
-rw-r--r--packages/sol-compiler/test/util/constants.ts11
-rw-r--r--packages/sol-compiler/test/util/provider.ts7
-rw-r--r--packages/sol-compiler/tsconfig.json9
-rw-r--r--packages/sol-compiler/tslint.json3
-rw-r--r--packages/sol-compiler/typedoc-tsconfig.json8
34 files changed, 0 insertions, 2981 deletions
diff --git a/packages/sol-compiler/.npmignore b/packages/sol-compiler/.npmignore
deleted file mode 100644
index 44df80fad..000000000
--- a/packages/sol-compiler/.npmignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.*
-yarn-error.log
-/src/
-/scripts/
-test/
-tsconfig.json
-/lib/src/monorepo_scripts/
diff --git a/packages/sol-compiler/CHANGELOG.json b/packages/sol-compiler/CHANGELOG.json
deleted file mode 100644
index ed9c45245..000000000
--- a/packages/sol-compiler/CHANGELOG.json
+++ /dev/null
@@ -1,497 +0,0 @@
-[
- {
- "version": "3.0.2",
- "changes": [
- {
- "note": "Fix a bug when smart recompilation wasn't working because of remappings",
- "pr": 1575
- },
- {
- "note": "Fix a bug that made `opts` required instead of optional",
- "pr": 1596
- },
- {
- "note": "Remove `bin_paths` and fetch the list of Solidity compilers from Github",
- "pr": 1596
- },
- {
- "note": "Fix a bug causing `ast` and `legacyAST` to not be added to the artifacts even when requested",
- "pr": 1596
- }
- ],
- "timestamp": 1549547375
- },
- {
- "timestamp": 1549452781,
- "version": "3.0.1",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "version": "3.0.0",
- "changes": [
- {
- "note": "Upgrade the bignumber.js to v8.0.2",
- "pr": 1517
- }
- ],
- "timestamp": 1549373905
- },
- {
- "timestamp": 1547561734,
- "version": "2.0.2",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1547225310,
- "version": "2.0.1",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "version": "2.0.0",
- "changes": [
- {
- "note": "Add sol-compiler watch mode with -w flag",
- "pr": 1461
- },
- {
- "note": "Make error and warning colouring more visually pleasant and consistent with other compilers",
- "pr": 1461
- },
- {
- "note": "Add newest solidity versions from 0.4.25 to 0.5.2",
- "pr": 1496
- }
- ],
- "timestamp": 1547040760
- },
- {
- "version": "1.1.16",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ],
- "timestamp": 1544739608
- },
- {
- "version": "1.1.15",
- "changes": [
- {
- "note": "Fix bug where we were appending base path to absolute imports (e.g NPM imports)",
- "pr": 1311
- }
- ],
- "timestamp": 1544570656
- },
- {
- "timestamp": 1543401373,
- "version": "1.1.14",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1542821676,
- "version": "1.1.13",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1542208198,
- "version": "1.1.12",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1542134075,
- "version": "1.1.11",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1542028948,
- "version": "1.1.10",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "version": "1.1.9",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ],
- "timestamp": 1541740904
- },
- {
- "timestamp": 1539871071,
- "version": "1.1.8",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "version": "1.1.7",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ],
- "timestamp": 1538693146
- },
- {
- "timestamp": 1538157789,
- "version": "1.1.6",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1537907159,
- "version": "1.1.5",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1537875740,
- "version": "1.1.4",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1537541580,
- "version": "1.1.3",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1536142250,
- "version": "1.1.2",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1535377027,
- "version": "1.1.1",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "version": "1.1.0",
- "changes": [
- {
- "note": "Quicken compilation by sending multiple contracts to the same solcjs invocation, batching them together based on compiler version requirements.",
- "pr": 965
- },
- {
- "note": "Stop exporting types: `ContractArtifact`, `ContractNetworks`",
- "pr": 924
- },
- {
- "note": "Export types: `CompilerSettings`, `OutputField`",
- "pr": 924
- }
- ],
- "timestamp": 1535133899
- },
- {
- "timestamp": 1534210131,
- "version": "1.0.5",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1532619515,
- "version": "1.0.4",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1532614997,
- "version": "1.0.3",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1532605697,
- "version": "1.0.2",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1532357734,
- "version": "1.0.1",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1532043000,
- "version": "1.0.0",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1531919263,
- "version": "0.5.4",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1531149657,
- "version": "0.5.3",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "timestamp": 1529397769,
- "version": "0.5.2",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "version": "0.5.1",
- "changes": [
- {
- "note": "Make `opts` constructor parameter optional",
- "pr": 621
- },
- {
- "note": "Add schema validation for compiler configuration",
- "pr": 621
- }
- ],
- "timestamp": 1527009133
- },
- {
- "version": "0.5.0",
- "changes": [
- {
- "note": "Properly export the executable binary",
- "pr": 588
- },
- {
- "note": "Add the ability to define a specific solidity version",
- "pr": 589
- }
- ],
- "timestamp": 1527009133
- },
- {
- "timestamp": 1525477860,
- "version": "0.4.3",
- "changes": [
- {
- "note": "Dependencies updated"
- }
- ]
- },
- {
- "version": "0.4.2",
- "changes": [
- {
- "note": "Add support for solidity 0.4.23",
- "pr": 545
- }
- ],
- "timestamp": 1525428773
- },
- {
- "version": "0.4.1",
- "changes": [
- {
- "note": "Add support for solidity 0.4.22",
- "pr": 531
- }
- ],
- "timestamp": 1524044013
- },
- {
- "version": "0.4.0",
- "changes": [
- {
- "note": "Changed the config key `web3Provider` to `provider` to be consistent with other tools",
- "pr": 501
- }
- ],
- "timestamp": 1523462196
- },
- {
- "version": "0.3.5",
- "changes": [
- {
- "note": "Don't try to write contract artifact if an error occured",
- "pr": 485
- }
- ],
- "timestamp": 1522673609
- },
- {
- "version": "0.3.4",
- "changes": [
- {
- "note": "Create solc_bin directory if does not exist before attempting to compile",
- "pr": 491
- }
- ],
- "timestamp": 1522658513
- },
- {
- "version": "0.3.1",
- "changes": [
- {
- "note": "Add TS types for `yargs`"
- }
- ],
- "timestamp": 1521298800
- },
- {
- "version": "0.3.0",
- "changes": [
- {
- "note": "Add support for Solidity 0.4.20 and 0.4.21"
- },
- {
- "note": "Replace `jsonrpcPort` config with `jsonrpcUrl`",
- "pr": 426
- },
- {
- "note": "Replace `jsonrpc-port` CLI option with `jsonrpc-url`",
- "pr": 426
- },
- {
- "note": "Export the `Compiler`",
- "pr": 426
- },
- {
- "note": "Load solc from remote source instead of having it locally",
- "pr": 426
- },
- {
- "note": "Add `bytecode`, `runtime_bytecode`, `source_map`, `source_map_runtime` and `sources` fields to artifacts",
- "pr": 426
- },
- {
- "note": "Remove 0x-specific `migrate` command",
- "pr": 426
- },
- {
- "note": "Allow deployer to accept a provider instead of port and host. This makes it possible to run it with in-process ganache-core",
- "pr": 426
- },
- {
- "note": "Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package",
- "pr": 452
- },
- {
- "note": "Add `#!/usr/bin/env node` pragma above `cli.ts` script to fix command-line error."
- }
- ],
- "timestamp": 1521298800
- },
- {
- "version": "0.2.0",
- "changes": [
- {
- "note": "Check dependencies when determining if contracts should be recompiled",
- "pr": 408
- },
- {
- "note": "Improve an error message for when deployer is supplied with an incorrect number of constructor arguments",
- "pr": 419
- }
- ],
- "timestamp": 1520089200
- },
- {
- "version": "0.1.0",
- "changes": [
- {
- "note": "Add the ability to pass in specific contracts to compile in CLI",
- "pr": 400
- }
- ],
- "timestamp": 1518706800
- },
- {
- "version": "0.0.8",
- "changes": [
- {
- "note": "Fix publishing issue where .npmignore was not properly excluding undesired content",
- "pr": 389
- }
- ],
- "timestamp": 1518102000
- }
-]
diff --git a/packages/sol-compiler/CHANGELOG.md b/packages/sol-compiler/CHANGELOG.md
deleted file mode 100644
index 016509028..000000000
--- a/packages/sol-compiler/CHANGELOG.md
+++ /dev/null
@@ -1,205 +0,0 @@
-<!--
-changelogUtils.file is auto-generated using the monorepo-scripts package. Don't edit directly.
-Edit the package's CHANGELOG.json file only.
--->
-
-CHANGELOG
-
-## v3.0.2 - _February 7, 2019_
-
- * Fix a bug when smart recompilation wasn't working because of remappings (#1575)
- * Fix a bug that made `opts` required instead of optional (#1596)
- * Remove `bin_paths` and fetch the list of Solidity compilers from Github (#1596)
- * Fix a bug causing `ast` and `legacyAST` to not be added to the artifacts even when requested (#1596)
-
-## v3.0.1 - _February 6, 2019_
-
- * Dependencies updated
-
-## v3.0.0 - _February 5, 2019_
-
- * Upgrade the bignumber.js to v8.0.2 (#1517)
-
-## v2.0.2 - _January 15, 2019_
-
- * Dependencies updated
-
-## v2.0.1 - _January 11, 2019_
-
- * Dependencies updated
-
-## v2.0.0 - _January 9, 2019_
-
- * Add sol-compiler watch mode with -w flag (#1461)
- * Make error and warning colouring more visually pleasant and consistent with other compilers (#1461)
- * Add newest solidity versions from 0.4.25 to 0.5.2 (#1496)
-
-## v1.1.16 - _December 13, 2018_
-
- * Dependencies updated
-
-## v1.1.15 - _December 11, 2018_
-
- * Fix bug where we were appending base path to absolute imports (e.g NPM imports) (#1311)
-
-## v1.1.14 - _November 28, 2018_
-
- * Dependencies updated
-
-## v1.1.13 - _November 21, 2018_
-
- * Dependencies updated
-
-## v1.1.12 - _November 14, 2018_
-
- * Dependencies updated
-
-## v1.1.11 - _November 13, 2018_
-
- * Dependencies updated
-
-## v1.1.10 - _November 12, 2018_
-
- * Dependencies updated
-
-## v1.1.9 - _November 9, 2018_
-
- * Dependencies updated
-
-## v1.1.8 - _October 18, 2018_
-
- * Dependencies updated
-
-## v1.1.7 - _October 4, 2018_
-
- * Dependencies updated
-
-## v1.1.6 - _September 28, 2018_
-
- * Dependencies updated
-
-## v1.1.5 - _September 25, 2018_
-
- * Dependencies updated
-
-## v1.1.4 - _September 25, 2018_
-
- * Dependencies updated
-
-## v1.1.3 - _September 21, 2018_
-
- * Dependencies updated
-
-## v1.1.2 - _September 5, 2018_
-
- * Dependencies updated
-
-## v1.1.1 - _August 27, 2018_
-
- * Dependencies updated
-
-## v1.1.0 - _August 24, 2018_
-
- * Quicken compilation by sending multiple contracts to the same solcjs invocation, batching them together based on compiler version requirements. (#965)
- * Stop exporting types: `ContractArtifact`, `ContractNetworks` (#924)
- * Export types: `CompilerSettings`, `OutputField` (#924)
-
-## v1.0.5 - _August 14, 2018_
-
- * Dependencies updated
-
-## v1.0.4 - _July 26, 2018_
-
- * Dependencies updated
-
-## v1.0.3 - _July 26, 2018_
-
- * Dependencies updated
-
-## v1.0.2 - _July 26, 2018_
-
- * Dependencies updated
-
-## v1.0.1 - _July 23, 2018_
-
- * Dependencies updated
-
-## v1.0.0 - _July 19, 2018_
-
- * Dependencies updated
-
-## v0.5.4 - _July 18, 2018_
-
- * Dependencies updated
-
-## v0.5.3 - _July 9, 2018_
-
- * Dependencies updated
-
-## v0.5.2 - _June 19, 2018_
-
- * Dependencies updated
-
-## v0.5.1 - _May 22, 2018_
-
- * Make `opts` constructor parameter optional (#621)
- * Add schema validation for compiler configuration (#621)
-
-## v0.5.0 - _May 22, 2018_
-
- * Properly export the executable binary (#588)
- * Add the ability to define a specific solidity version (#589)
-
-## v0.4.3 - _May 4, 2018_
-
- * Dependencies updated
-
-## v0.4.2 - _May 4, 2018_
-
- * Add support for solidity 0.4.23 (#545)
-
-## v0.4.1 - _April 18, 2018_
-
- * Add support for solidity 0.4.22 (#531)
-
-## v0.4.0 - _April 11, 2018_
-
- * Changed the config key `web3Provider` to `provider` to be consistent with other tools (#501)
-
-## v0.3.5 - _April 2, 2018_
-
- * Don't try to write contract artifact if an error occured (#485)
-
-## v0.3.4 - _April 2, 2018_
-
- * Create solc_bin directory if does not exist before attempting to compile (#491)
-
-## v0.3.1 - _March 17, 2018_
-
- * Add TS types for `yargs`
-
-## v0.3.0 - _March 17, 2018_
-
- * Add support for Solidity 0.4.20 and 0.4.21
- * Replace `jsonrpcPort` config with `jsonrpcUrl` (#426)
- * Replace `jsonrpc-port` CLI option with `jsonrpc-url` (#426)
- * Export the `Compiler` (#426)
- * Load solc from remote source instead of having it locally (#426)
- * Add `bytecode`, `runtime_bytecode`, `source_map`, `source_map_runtime` and `sources` fields to artifacts (#426)
- * Remove 0x-specific `migrate` command (#426)
- * Allow deployer to accept a provider instead of port and host. This makes it possible to run it with in-process ganache-core (#426)
- * Consolidate all `console.log` calls into `logUtils` in the `@0xproject/utils` package (#452)
- * Add `#!/usr/bin/env node` pragma above `cli.ts` script to fix command-line error.
-
-## v0.2.0 - _March 3, 2018_
-
- * Check dependencies when determining if contracts should be recompiled (#408)
- * Improve an error message for when deployer is supplied with an incorrect number of constructor arguments (#419)
-
-## v0.1.0 - _February 15, 2018_
-
- * Add the ability to pass in specific contracts to compile in CLI (#400)
-
-## v0.0.8 - _February 8, 2018_
-
- * Fix publishing issue where .npmignore was not properly excluding undesired content (#389)
diff --git a/packages/sol-compiler/README.md b/packages/sol-compiler/README.md
deleted file mode 100644
index 412a5fc02..000000000
--- a/packages/sol-compiler/README.md
+++ /dev/null
@@ -1,97 +0,0 @@
-## @0x/sol-compiler
-
-Sol-compiler is a wrapper around [solc-js](https://www.npmjs.com/package/solc) that adds:
-
-- Smart re-compilation: Only recompiles when smart contracts have changed
-- Ability to compile an entire project instead of only individual `.sol` files
-- Compilation using the Solidity version specified at the top of each individual `.sol` file
-- Proper parsing of Solidity version ranges
-- Support for the standard [input description](https://solidity.readthedocs.io/en/develop/using-the-compiler.html#input-description) for what information you'd like added to the resulting `artifacts` file (i.e 100% configurable artifacts content).
-
-### Read the [Documentation](https://0xproject.com/docs/sol-compiler).
-
-## Installation
-
-#### CLI Installation
-
-```bash
-yarn global add @0x/sol-compiler
-```
-
-#### API Installation
-
-```bash
-yarn add @0x/sol-compiler
-```
-
-If your project is in [TypeScript](https://www.typescriptlang.org/), add the following to your `tsconfig.json`:
-
-```json
-"compilerOptions": {
- "typeRoots": ["node_modules/@0x/typescript-typings/types", "node_modules/@types"],
-}
-```
-
-**Import**
-
-```typescript
-import { Compiler } from '@0x/sol-compiler';
-```
-
-or
-
-```javascript
-var Compiler = require('@0x/sol-compiler').Compiler;
-```
-
-## Contributing
-
-We welcome improvements and fixes from the wider community! To report bugs within this package, please create an issue in this repository.
-
-Please read our [contribution guidelines](../../CONTRIBUTING.md) before getting started.
-
-### Install dependencies
-
-If you don't have yarn workspaces enabled (Yarn < v1.0) - enable them:
-
-```bash
-yarn config set workspaces-experimental true
-```
-
-Then install dependencies
-
-```bash
-yarn install
-```
-
-### Build
-
-To build this package and all other monorepo packages that it depends on, run the following from the monorepo root directory:
-
-```bash
-PKG=@0x/sol-compiler yarn build
-```
-
-Or continuously rebuild on change:
-
-```bash
-PKG=@0x/sol-compiler yarn watch
-```
-
-### Clean
-
-```bash
-yarn clean
-```
-
-### Lint
-
-```bash
-yarn lint
-```
-
-### Run Tests
-
-```bash
-yarn test
-```
diff --git a/packages/sol-compiler/bin/sol-compiler.js b/packages/sol-compiler/bin/sol-compiler.js
deleted file mode 100755
index 0e5b69af0..000000000
--- a/packages/sol-compiler/bin/sol-compiler.js
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/usr/bin/env node
-require('../lib/src/cli.js')
diff --git a/packages/sol-compiler/coverage/.gitkeep b/packages/sol-compiler/coverage/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
--- a/packages/sol-compiler/coverage/.gitkeep
+++ /dev/null
diff --git a/packages/sol-compiler/package.json b/packages/sol-compiler/package.json
deleted file mode 100644
index 3344c0b38..000000000
--- a/packages/sol-compiler/package.json
+++ /dev/null
@@ -1,95 +0,0 @@
-{
- "name": "@0x/sol-compiler",
- "version": "3.0.2",
- "engines": {
- "node": ">=6.12"
- },
- "description": "Solidity compiler wrapper and artifactor",
- "main": "lib/src/index.js",
- "types": "lib/src/index.d.ts",
- "scripts": {
- "build": "yarn pre_build && tsc -b",
- "build:ci": "yarn build",
- "pre_build": "run-s update_contract_fixtures",
- "update_contract_fixtures": "copyfiles 'test/fixtures/contracts/**/*' ./lib",
- "test": "yarn run_mocha",
- "rebuild_and_test": "run-s build test",
- "run_mocha": "mocha --require source-map-support/register --require make-promises-safe lib/test/*_test.js --bail --exit",
- "test:coverage": "nyc npm run test --all && yarn coverage:report:lcov",
- "coverage:report:lcov": "nyc report --reporter=text-lcov > coverage/lcov.info",
- "clean": "shx rm -rf lib generated_docs",
- "migrate": "npm run build; node lib/src/cli.js migrate",
- "lint": "tslint --format stylish --project .",
- "test:circleci": "yarn test:coverage",
- "docs:json": "typedoc --excludePrivate --excludeExternals --target ES5 --tsconfig typedoc-tsconfig.json --json $JSON_FILE_PATH $PROJECT_FILES"
- },
- "config": {
- "postpublish": {
- "assets": []
- }
- },
- "bin": {
- "sol-compiler": "bin/sol-compiler.js"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/0xProject/0x-monorepo.git"
- },
- "author": "Amir Bandeali",
- "license": "Apache-2.0",
- "bugs": {
- "url": "https://github.com/0xProject/0x-monorepo/issues"
- },
- "homepage": "https://github.com/0xProject/0x-monorepo/packages/sol-compiler/README.md",
- "devDependencies": {
- "@0x/dev-utils": "^2.0.2",
- "@0x/tslint-config": "^3.0.0",
- "@types/chokidar": "^1.7.5",
- "@types/mkdirp": "^0.5.2",
- "@types/pluralize": "^0.0.29",
- "@types/require-from-string": "^1.2.0",
- "@types/semver": "5.5.0",
- "chai": "^4.0.1",
- "chai-as-promised": "^7.1.0",
- "chai-bignumber": "^3.0.0",
- "copyfiles": "^2.0.0",
- "dirty-chai": "^2.0.1",
- "make-promises-safe": "^1.1.0",
- "mocha": "^4.1.0",
- "npm-run-all": "^4.1.2",
- "nyc": "^11.0.1",
- "shx": "^0.2.2",
- "tslint": "5.11.0",
- "typedoc": "0.13.0",
- "types-bn": "^0.0.1",
- "typescript": "3.0.1",
- "web3-typescript-typings": "^0.10.2",
- "zeppelin-solidity": "1.8.0"
- },
- "dependencies": {
- "@0x/assert": "^2.0.2",
- "@0x/json-schemas": "^3.0.2",
- "@0x/sol-resolver": "^2.0.2",
- "@0x/types": "^2.0.2",
- "@0x/typescript-typings": "^4.0.0",
- "@0x/utils": "^4.0.3",
- "@0x/web3-wrapper": "^4.0.2",
- "@types/yargs": "^11.0.0",
- "chalk": "^2.3.0",
- "chokidar": "^2.0.4",
- "ethereum-types": "^2.0.0",
- "ethereumjs-util": "^5.1.1",
- "lodash": "^4.17.11",
- "mkdirp": "^0.5.1",
- "pluralize": "^7.0.0",
- "require-from-string": "^2.0.1",
- "semver": "5.5.0",
- "solc": "^0.5.2",
- "source-map-support": "^0.5.0",
- "web3-eth-abi": "^1.0.0-beta.24",
- "yargs": "^10.0.3"
- },
- "publishConfig": {
- "access": "public"
- }
-}
diff --git a/packages/sol-compiler/solc_bin/.gitkeep b/packages/sol-compiler/solc_bin/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
--- a/packages/sol-compiler/solc_bin/.gitkeep
+++ /dev/null
diff --git a/packages/sol-compiler/src/cli.ts b/packages/sol-compiler/src/cli.ts
deleted file mode 100644
index db0c09581..000000000
--- a/packages/sol-compiler/src/cli.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/env node
-// We need the above pragma since this script will be run as a command-line tool.
-
-import { logUtils } from '@0x/utils';
-import * as _ from 'lodash';
-import 'source-map-support/register';
-import * as yargs from 'yargs';
-
-import { Compiler } from './compiler';
-
-const DEFAULT_CONTRACTS_LIST = '*';
-const SEPARATOR = ',';
-
-(async () => {
- const argv = yargs
- .option('contracts-dir', {
- type: 'string',
- description: 'path of contracts directory to compile',
- })
- .option('artifacts-dir', {
- type: 'string',
- description: 'path to write contracts artifacts to',
- })
- .option('contracts', {
- type: 'string',
- description: 'comma separated list of contracts to compile',
- })
- .option('watch', {
- alias: 'w',
- default: false,
- })
- .help().argv;
- const contracts = _.isUndefined(argv.contracts)
- ? undefined
- : argv.contracts === DEFAULT_CONTRACTS_LIST
- ? DEFAULT_CONTRACTS_LIST
- : argv.contracts.split(SEPARATOR);
- const opts = {
- contractsDir: argv.contractsDir,
- artifactsDir: argv.artifactsDir,
- contracts,
- };
- const compiler = new Compiler(opts);
- if (argv.watch) {
- await compiler.watchAsync();
- } else {
- await compiler.compileAsync();
- }
-})().catch(err => {
- logUtils.log(err);
- process.exit(1);
-});
diff --git a/packages/sol-compiler/src/compiler.ts b/packages/sol-compiler/src/compiler.ts
deleted file mode 100644
index afa4cc5bb..000000000
--- a/packages/sol-compiler/src/compiler.ts
+++ /dev/null
@@ -1,389 +0,0 @@
-import { assert } from '@0x/assert';
-import {
- FallthroughResolver,
- FSResolver,
- NameResolver,
- NPMResolver,
- RelativeFSResolver,
- Resolver,
- SpyResolver,
- URLResolver,
-} from '@0x/sol-resolver';
-import { logUtils } from '@0x/utils';
-import { execSync } from 'child_process';
-import * as chokidar from 'chokidar';
-import { CompilerOptions, ContractArtifact, ContractVersionData, StandardOutput } from 'ethereum-types';
-import * as fs from 'fs';
-import * as _ from 'lodash';
-import * as path from 'path';
-import * as pluralize from 'pluralize';
-import * as semver from 'semver';
-import solc = require('solc');
-
-import { compilerOptionsSchema } from './schemas/compiler_options_schema';
-import {
- addHexPrefixToContractBytecode,
- compileDockerAsync,
- compileSolcJSAsync,
- createDirIfDoesNotExistAsync,
- getContractArtifactIfExistsAsync,
- getDependencyNameToPackagePath,
- getSolcJSReleasesAsync,
- getSourcesWithDependencies,
- getSourceTreeHash,
- makeContractPathsRelative,
- parseSolidityVersionRange,
- printCompilationErrorsAndWarnings,
-} from './utils/compiler';
-import { constants } from './utils/constants';
-import { fsWrapper } from './utils/fs_wrapper';
-import { utils } from './utils/utils';
-
-type TYPE_ALL_FILES_IDENTIFIER = '*';
-const ALL_CONTRACTS_IDENTIFIER = '*';
-const ALL_FILES_IDENTIFIER = '*';
-const DEFAULT_CONTRACTS_DIR = path.resolve('contracts');
-const DEFAULT_ARTIFACTS_DIR = path.resolve('artifacts');
-const DEFAULT_USE_DOCKERISED_SOLC = false;
-// Solc compiler settings cannot be configured from the commandline.
-// If you need this configured, please create a `compiler.json` config file
-// with your desired configurations.
-const DEFAULT_COMPILER_SETTINGS: solc.CompilerSettings = {
- optimizer: {
- enabled: false,
- },
- outputSelection: {
- [ALL_FILES_IDENTIFIER]: {
- [ALL_CONTRACTS_IDENTIFIER]: ['abi', 'evm.bytecode.object'],
- },
- },
-};
-const CONFIG_FILE = 'compiler.json';
-
-interface VersionToInputs {
- [solcVersion: string]: {
- standardInput: solc.StandardInput;
- contractsToCompile: string[];
- };
-}
-
-interface ContractPathToData {
- [contractPath: string]: ContractData;
-}
-
-interface ContractData {
- currentArtifactIfExists: ContractArtifact | void;
- sourceTreeHashHex: string;
- contractName: string;
-}
-
-/**
- * The Compiler facilitates compiling Solidity smart contracts and saves the results
- * to artifact files.
- */
-export class Compiler {
- private readonly _resolver: Resolver;
- private readonly _nameResolver: NameResolver;
- private readonly _contractsDir: string;
- private readonly _compilerSettings: solc.CompilerSettings;
- private readonly _artifactsDir: string;
- private readonly _solcVersionIfExists: string | undefined;
- private readonly _specifiedContracts: string[] | TYPE_ALL_FILES_IDENTIFIER;
- private readonly _useDockerisedSolc: boolean;
- /**
- * Instantiates a new instance of the Compiler class.
- * @param opts Optional compiler options
- * @return An instance of the Compiler class.
- */
- constructor(opts?: CompilerOptions) {
- const passedOpts = opts || {};
- assert.doesConformToSchema('opts', passedOpts, compilerOptionsSchema);
- // TODO: Look for config file in parent directories if not found in current directory
- const config: CompilerOptions = fs.existsSync(CONFIG_FILE)
- ? JSON.parse(fs.readFileSync(CONFIG_FILE).toString())
- : {};
- assert.doesConformToSchema('compiler.json', config, compilerOptionsSchema);
- this._contractsDir = path.resolve(passedOpts.contractsDir || config.contractsDir || DEFAULT_CONTRACTS_DIR);
- this._solcVersionIfExists = passedOpts.solcVersion || config.solcVersion;
- this._compilerSettings = passedOpts.compilerSettings || config.compilerSettings || DEFAULT_COMPILER_SETTINGS;
- this._artifactsDir = passedOpts.artifactsDir || config.artifactsDir || DEFAULT_ARTIFACTS_DIR;
- this._specifiedContracts = passedOpts.contracts || config.contracts || ALL_CONTRACTS_IDENTIFIER;
- this._useDockerisedSolc =
- passedOpts.useDockerisedSolc || config.useDockerisedSolc || DEFAULT_USE_DOCKERISED_SOLC;
- this._nameResolver = new NameResolver(this._contractsDir);
- const resolver = new FallthroughResolver();
- resolver.appendResolver(new URLResolver());
- resolver.appendResolver(new NPMResolver(this._contractsDir));
- resolver.appendResolver(new RelativeFSResolver(this._contractsDir));
- resolver.appendResolver(new FSResolver());
- resolver.appendResolver(this._nameResolver);
- this._resolver = resolver;
- }
- /**
- * Compiles selected Solidity files found in `contractsDir` and writes JSON artifacts to `artifactsDir`.
- */
- public async compileAsync(): Promise<void> {
- await createDirIfDoesNotExistAsync(this._artifactsDir);
- await createDirIfDoesNotExistAsync(constants.SOLC_BIN_DIR);
- await this._compileContractsAsync(this._getContractNamesToCompile(), true);
- }
- /**
- * Compiles Solidity files specified during instantiation, and returns the
- * compiler output given by solc. Return value is an array of outputs:
- * Solidity modules are batched together by version required, and each
- * element of the returned array corresponds to a compiler version, and
- * each element contains the output for all of the modules compiled with
- * that version.
- */
- public async getCompilerOutputsAsync(): Promise<StandardOutput[]> {
- const promisedOutputs = this._compileContractsAsync(this._getContractNamesToCompile(), false);
- return promisedOutputs;
- }
- public async watchAsync(): Promise<void> {
- console.clear(); // tslint:disable-line:no-console
- logUtils.logWithTime('Starting compilation in watch mode...');
- const MATCH_NOTHING_REGEX = '^$';
- const IGNORE_DOT_FILES_REGEX = /(^|[\/\\])\../;
- // Initially we watch nothing. We'll add the paths later.
- const watcher = chokidar.watch(MATCH_NOTHING_REGEX, { ignored: IGNORE_DOT_FILES_REGEX });
- const onFileChangedAsync = async () => {
- watcher.unwatch('*'); // Stop watching
- try {
- await this.compileAsync();
- logUtils.logWithTime('Found 0 errors. Watching for file changes.');
- } catch (err) {
- if (err.typeName === 'CompilationError') {
- logUtils.logWithTime(
- `Found ${err.errorsCount} ${pluralize('error', err.errorsCount)}. Watching for file changes.`,
- );
- } else {
- logUtils.logWithTime('Found errors. Watching for file changes.');
- }
- }
-
- const pathsToWatch = this._getPathsToWatch();
- watcher.add(pathsToWatch);
- };
- await onFileChangedAsync();
- watcher.on('change', (changedFilePath: string) => {
- console.clear(); // tslint:disable-line:no-console
- logUtils.logWithTime('File change detected. Starting incremental compilation...');
- // NOTE: We can't await it here because that's a callback.
- // Instead we stop watching inside of it and start it again when we're finished.
- onFileChangedAsync(); // tslint:disable-line no-floating-promises
- });
- }
- private _getPathsToWatch(): string[] {
- const contractNames = this._getContractNamesToCompile();
- const spyResolver = new SpyResolver(this._resolver);
- for (const contractName of contractNames) {
- const contractSource = spyResolver.resolve(contractName);
- // NOTE: We ignore the return value here. We don't want to compute the source tree hash.
- // We just want to call a SpyResolver on each contracts and it's dependencies and
- // this is a convenient way to reuse the existing code that does that.
- // We can then get all the relevant paths from the `spyResolver` below.
- getSourceTreeHash(spyResolver, contractSource.path);
- }
- const pathsToWatch = _.uniq(spyResolver.resolvedContractSources.map(cs => cs.absolutePath));
- return pathsToWatch;
- }
- private _getContractNamesToCompile(): string[] {
- let contractNamesToCompile;
- if (this._specifiedContracts === ALL_CONTRACTS_IDENTIFIER) {
- const allContracts = this._nameResolver.getAll();
- contractNamesToCompile = _.map(allContracts, contractSource =>
- path.basename(contractSource.path, constants.SOLIDITY_FILE_EXTENSION),
- );
- } else {
- return this._specifiedContracts;
- }
- return contractNamesToCompile;
- }
- /**
- * Compiles contracts, and, if `shouldPersist` is true, saves artifacts to artifactsDir.
- * @param fileName Name of contract with '.sol' extension.
- * @return an array of compiler outputs, where each element corresponds to a different version of solc-js.
- */
- private async _compileContractsAsync(contractNames: string[], shouldPersist: boolean): Promise<StandardOutput[]> {
- // batch input contracts together based on the version of the compiler that they require.
- const versionToInputs: VersionToInputs = {};
-
- // map contract paths to data about them for later verification and persistence
- const contractPathToData: ContractPathToData = {};
-
- const solcJSReleases = await getSolcJSReleasesAsync();
- const resolvedContractSources = [];
- for (const contractName of contractNames) {
- const spyResolver = new SpyResolver(this._resolver);
- const contractSource = spyResolver.resolve(contractName);
- const sourceTreeHashHex = getSourceTreeHash(spyResolver, contractSource.path).toString('hex');
- const contractData = {
- contractName: path.basename(contractName, constants.SOLIDITY_FILE_EXTENSION),
- currentArtifactIfExists: await getContractArtifactIfExistsAsync(this._artifactsDir, contractName),
- sourceTreeHashHex: `0x${sourceTreeHashHex}`,
- };
- if (!this._shouldCompile(contractData)) {
- continue;
- }
- contractPathToData[contractSource.path] = contractData;
- const solcVersion = _.isUndefined(this._solcVersionIfExists)
- ? semver.maxSatisfying(_.keys(solcJSReleases), parseSolidityVersionRange(contractSource.source))
- : this._solcVersionIfExists;
- const isFirstContractWithThisVersion = _.isUndefined(versionToInputs[solcVersion]);
- if (isFirstContractWithThisVersion) {
- versionToInputs[solcVersion] = {
- standardInput: {
- language: 'Solidity',
- sources: {},
- settings: this._compilerSettings,
- },
- contractsToCompile: [],
- };
- }
- // add input to the right version batch
- for (const resolvedContractSource of spyResolver.resolvedContractSources) {
- versionToInputs[solcVersion].standardInput.sources[resolvedContractSource.absolutePath] = {
- content: resolvedContractSource.source,
- };
- }
- resolvedContractSources.push(...spyResolver.resolvedContractSources);
- versionToInputs[solcVersion].contractsToCompile.push(contractSource.path);
- }
-
- const dependencyNameToPath = getDependencyNameToPackagePath(resolvedContractSources);
-
- const compilerOutputs: StandardOutput[] = [];
- for (const solcVersion of _.keys(versionToInputs)) {
- const input = versionToInputs[solcVersion];
- logUtils.warn(
- `Compiling ${input.contractsToCompile.length} contracts (${
- input.contractsToCompile
- }) with Solidity v${solcVersion}...`,
- );
- let compilerOutput;
- let fullSolcVersion;
- input.standardInput.settings.remappings = _.map(
- dependencyNameToPath,
- (dependencyPackagePath: string, dependencyName: string) => `${dependencyName}=${dependencyPackagePath}`,
- );
- if (this._useDockerisedSolc) {
- const dockerCommand = `docker run ethereum/solc:${solcVersion} --version`;
- const versionCommandOutput = execSync(dockerCommand).toString();
- const versionCommandOutputParts = versionCommandOutput.split(' ');
- fullSolcVersion = versionCommandOutputParts[versionCommandOutputParts.length - 1].trim();
- compilerOutput = await compileDockerAsync(solcVersion, input.standardInput);
- } else {
- fullSolcVersion = solcJSReleases[solcVersion];
- compilerOutput = await compileSolcJSAsync(solcVersion, input.standardInput);
- }
- if (!_.isUndefined(compilerOutput.errors)) {
- printCompilationErrorsAndWarnings(compilerOutput.errors);
- }
- compilerOutput.sources = makeContractPathsRelative(
- compilerOutput.sources,
- this._contractsDir,
- dependencyNameToPath,
- );
- compilerOutput.contracts = makeContractPathsRelative(
- compilerOutput.contracts,
- this._contractsDir,
- dependencyNameToPath,
- );
-
- for (const contractPath of input.contractsToCompile) {
- const contractName = contractPathToData[contractPath].contractName;
-
- const compiledContract = compilerOutput.contracts[contractPath][contractName];
- if (_.isUndefined(compiledContract)) {
- throw new Error(
- `Contract ${contractName} not found in ${contractPath}. Please make sure your contract has the same name as it's file name`,
- );
- }
-
- addHexPrefixToContractBytecode(compiledContract);
-
- if (shouldPersist) {
- await this._persistCompiledContractAsync(
- contractPath,
- contractPathToData[contractPath].currentArtifactIfExists,
- contractPathToData[contractPath].sourceTreeHashHex,
- contractName,
- fullSolcVersion,
- compilerOutput,
- );
- }
- }
-
- compilerOutputs.push(compilerOutput);
- }
-
- return compilerOutputs;
- }
- private _shouldCompile(contractData: ContractData): boolean {
- if (_.isUndefined(contractData.currentArtifactIfExists)) {
- return true;
- } else {
- const currentArtifact = contractData.currentArtifactIfExists as ContractArtifact;
- const isUserOnLatestVersion = currentArtifact.schemaVersion === constants.LATEST_ARTIFACT_VERSION;
- const didCompilerSettingsChange = !_.isEqual(
- _.omit(currentArtifact.compiler.settings, 'remappings'),
- _.omit(this._compilerSettings, 'remappings'),
- );
- const didSourceChange = currentArtifact.sourceTreeHashHex !== contractData.sourceTreeHashHex;
- return !isUserOnLatestVersion || didCompilerSettingsChange || didSourceChange;
- }
- }
- private async _persistCompiledContractAsync(
- contractPath: string,
- currentArtifactIfExists: ContractArtifact | void,
- sourceTreeHashHex: string,
- contractName: string,
- fullSolcVersion: string,
- compilerOutput: solc.StandardOutput,
- ): Promise<void> {
- const compiledContract = compilerOutput.contracts[contractPath][contractName];
-
- // need to gather sourceCodes for this artifact, but compilerOutput.sources (the list of contract modules)
- // contains listings for every contract compiled during the compiler invocation that compiled the contract
- // to be persisted, which could include many that are irrelevant to the contract at hand. So, gather up only
- // the relevant sources:
- const { sourceCodes, sources } = getSourcesWithDependencies(
- this._resolver,
- contractPath,
- compilerOutput.sources,
- );
-
- const contractVersion: ContractVersionData = {
- compilerOutput: compiledContract,
- sources,
- sourceCodes,
- sourceTreeHashHex,
- compiler: {
- name: 'solc',
- version: fullSolcVersion,
- settings: this._compilerSettings,
- },
- };
-
- let newArtifact: ContractArtifact;
- if (!_.isUndefined(currentArtifactIfExists)) {
- const currentArtifact = currentArtifactIfExists as ContractArtifact;
- newArtifact = {
- ...currentArtifact,
- ...contractVersion,
- };
- } else {
- newArtifact = {
- schemaVersion: constants.LATEST_ARTIFACT_VERSION,
- contractName,
- ...contractVersion,
- networks: {},
- };
- }
-
- const artifactString = utils.stringifyWithFormatting(newArtifact);
- const currentArtifactPath = `${this._artifactsDir}/${contractName}.json`;
- await fsWrapper.writeFileAsync(currentArtifactPath, artifactString);
- logUtils.warn(`${contractName} artifact saved!`);
- }
-}
diff --git a/packages/sol-compiler/src/globals.d.ts b/packages/sol-compiler/src/globals.d.ts
deleted file mode 100644
index 94e63a32d..000000000
--- a/packages/sol-compiler/src/globals.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-declare module '*.json' {
- const json: any;
- /* tslint:disable */
- export default json;
- /* tslint:enable */
-}
diff --git a/packages/sol-compiler/src/index.ts b/packages/sol-compiler/src/index.ts
deleted file mode 100644
index d8a60666f..000000000
--- a/packages/sol-compiler/src/index.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-export { Compiler } from './compiler';
-export {
- AbiDefinition,
- CompilerOptions,
- CompilerSettings,
- DataItem,
- DevdocOutput,
- ErrorSeverity,
- ErrorType,
- EventAbi,
- EventParameter,
- EvmBytecodeOutput,
- EvmOutput,
- FallbackAbi,
- FunctionAbi,
- MethodAbi,
- ConstructorAbi,
- ConstructorStateMutability,
- ContractAbi,
- OutputField,
- CompilerSettingsMetadata,
- OptimizerSettings,
- ParamDescription,
- SolcError,
- StandardContractOutput,
- StandardOutput,
- StateMutability,
- SourceLocation,
-} from 'ethereum-types';
diff --git a/packages/sol-compiler/src/schemas/compiler_options_schema.ts b/packages/sol-compiler/src/schemas/compiler_options_schema.ts
deleted file mode 100644
index c0766b625..000000000
--- a/packages/sol-compiler/src/schemas/compiler_options_schema.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-export const compilerOptionsSchema = {
- id: '/CompilerOptions',
- properties: {
- contractsDir: { type: 'string' },
- artifactsDir: { type: 'string' },
- solcVersion: { type: 'string', pattern: '^\\d+.\\d+.\\d+$' },
- compilerSettings: { type: 'object' },
- contracts: {
- oneOf: [
- {
- type: 'string',
- pattern: '^\\*$',
- },
- {
- type: 'array',
- items: {
- type: 'string',
- },
- },
- ],
- },
- useDockerisedSolc: { type: 'boolean' },
- },
- type: 'object',
- required: [],
- additionalProperties: false,
-};
diff --git a/packages/sol-compiler/src/utils/compiler.ts b/packages/sol-compiler/src/utils/compiler.ts
deleted file mode 100644
index 28049e453..000000000
--- a/packages/sol-compiler/src/utils/compiler.ts
+++ /dev/null
@@ -1,411 +0,0 @@
-import { ContractSource, Resolver } from '@0x/sol-resolver';
-import { fetchAsync, logUtils } from '@0x/utils';
-import chalk from 'chalk';
-import { execSync } from 'child_process';
-import { ContractArtifact } from 'ethereum-types';
-import * as ethUtil from 'ethereumjs-util';
-import * as _ from 'lodash';
-import * as path from 'path';
-import * as requireFromString from 'require-from-string';
-import * as solc from 'solc';
-
-import { constants } from './constants';
-import { fsWrapper } from './fs_wrapper';
-import { BinaryPaths, CompilationError } from './types';
-
-/**
- * Gets contract data on network or returns if an artifact does not exist.
- * @param artifactsDir Path to the artifacts directory.
- * @param contractName Name of contract.
- * @return Contract data on network or undefined.
- */
-export async function getContractArtifactIfExistsAsync(
- artifactsDir: string,
- contractName: string,
-): Promise<ContractArtifact | void> {
- let contractArtifact;
- const currentArtifactPath = `${artifactsDir}/${path.basename(
- contractName,
- constants.SOLIDITY_FILE_EXTENSION,
- )}.json`;
- try {
- const opts = {
- encoding: 'utf8',
- };
- const contractArtifactString = await fsWrapper.readFileAsync(currentArtifactPath, opts);
- contractArtifact = JSON.parse(contractArtifactString);
- return contractArtifact;
- } catch (err) {
- logUtils.warn(`Artifact for ${contractName} does not exist`);
- return undefined;
- }
-}
-
-/**
- * Creates a directory if it does not already exist.
- * @param artifactsDir Path to the directory.
- */
-export async function createDirIfDoesNotExistAsync(dirPath: string): Promise<void> {
- if (!fsWrapper.doesPathExistSync(dirPath)) {
- logUtils.warn(`Creating directory at ${dirPath}...`);
- await fsWrapper.mkdirpAsync(dirPath);
- }
-}
-
-/**
- * Searches Solidity source code for compiler version range.
- * @param source Source code of contract.
- * @return Solc compiler version range.
- */
-export function parseSolidityVersionRange(source: string): string {
- const SOLIDITY_VERSION_RANGE_REGEX = /pragma\s+solidity\s+(.*);/;
- const solcVersionRangeMatch = source.match(SOLIDITY_VERSION_RANGE_REGEX);
- if (_.isNull(solcVersionRangeMatch)) {
- throw new Error('Could not find Solidity version range in source');
- }
- const solcVersionRange = solcVersionRangeMatch[1];
- return solcVersionRange;
-}
-
-/**
- * Normalizes the path found in the error message. If it cannot be normalized
- * the original error message is returned.
- * Example: converts 'base/Token.sol:6:46: Warning: Unused local variable'
- * to 'Token.sol:6:46: Warning: Unused local variable'
- * This is used to prevent logging the same error multiple times.
- * @param errMsg An error message from the compiled output.
- * @return The error message with directories truncated from the contract path.
- */
-export function getNormalizedErrMsg(errMsg: string): string {
- const SOLIDITY_FILE_EXTENSION_REGEX = /(.*\.sol)/;
- const errPathMatch = errMsg.match(SOLIDITY_FILE_EXTENSION_REGEX);
- if (_.isNull(errPathMatch)) {
- // This can occur if solidity outputs a general warning, e.g
- // Warning: This is a pre-release compiler version, please do not use it in production.
- return errMsg;
- }
- const errPath = errPathMatch[0];
- const baseContract = path.basename(errPath);
- const normalizedErrMsg = errMsg.replace(errPath, baseContract);
- return normalizedErrMsg;
-}
-
-/**
- * Parses the contract source code and extracts the dendencies
- * @param source Contract source code
- * @return List of dependendencies
- */
-export function parseDependencies(contractSource: ContractSource): string[] {
- // TODO: Use a proper parser
- const source = contractSource.source;
- const IMPORT_REGEX = /(import\s)/;
- const DEPENDENCY_PATH_REGEX = /"([^"]+)"/; // Source: https://github.com/BlockChainCompany/soljitsu/blob/master/lib/shared.js
- const dependencies: string[] = [];
- const lines = source.split('\n');
- _.forEach(lines, line => {
- if (!_.isNull(line.match(IMPORT_REGEX))) {
- const dependencyMatch = line.match(DEPENDENCY_PATH_REGEX);
- if (!_.isNull(dependencyMatch)) {
- let dependencyPath = dependencyMatch[1];
- if (dependencyPath.startsWith('.')) {
- dependencyPath = path.join(path.dirname(contractSource.path), dependencyPath);
- }
- dependencies.push(dependencyPath);
- }
- }
- });
- return dependencies;
-}
-
-let solcJSReleasesCache: BinaryPaths | undefined;
-
-/**
- * Fetches the list of available solidity compilers
- */
-export async function getSolcJSReleasesAsync(): Promise<BinaryPaths> {
- if (_.isUndefined(solcJSReleasesCache)) {
- const versionList = await fetch('https://ethereum.github.io/solc-bin/bin/list.json');
- const versionListJSON = await versionList.json();
- solcJSReleasesCache = versionListJSON.releases;
- }
- return solcJSReleasesCache as BinaryPaths;
-}
-
-/**
- * Compiles the contracts and prints errors/warnings
- * @param solcVersion Version of a solc compiler
- * @param standardInput Solidity standard JSON input
- */
-export async function compileSolcJSAsync(
- solcVersion: string,
- standardInput: solc.StandardInput,
-): Promise<solc.StandardOutput> {
- const solcInstance = await getSolcJSAsync(solcVersion);
- const standardInputStr = JSON.stringify(standardInput);
- const standardOutputStr = solcInstance.compileStandardWrapper(standardInputStr);
- const compiled: solc.StandardOutput = JSON.parse(standardOutputStr);
- return compiled;
-}
-
-/**
- * Compiles the contracts and prints errors/warnings
- * @param solcVersion Version of a solc compiler
- * @param standardInput Solidity standard JSON input
- */
-export async function compileDockerAsync(
- solcVersion: string,
- standardInput: solc.StandardInput,
-): Promise<solc.StandardOutput> {
- const standardInputStr = JSON.stringify(standardInput, null, 2);
- const dockerCommand = `docker run -i -a stdin -a stdout -a stderr ethereum/solc:${solcVersion} solc --standard-json`;
- const standardOutputStr = execSync(dockerCommand, { input: standardInputStr }).toString();
- const compiled: solc.StandardOutput = JSON.parse(standardOutputStr);
- return compiled;
-}
-
-/**
- * Example "relative" paths:
- * /user/leo/0x-monorepo/contracts/extensions/contracts/extension.sol -> extension.sol
- * /user/leo/0x-monorepo/node_modules/@0x/contracts-protocol/contracts/exchange.sol -> @0x/contracts-protocol/contracts/exchange.sol
- */
-function makeContractPathRelative(
- absolutePath: string,
- contractsDir: string,
- dependencyNameToPath: { [dependencyName: string]: string },
-): string {
- let contractPath = absolutePath.replace(`${contractsDir}/`, '');
- _.map(dependencyNameToPath, (packagePath: string, dependencyName: string) => {
- contractPath = contractPath.replace(packagePath, dependencyName);
- });
- return contractPath;
-}
-
-/**
- * Makes the path relative removing all system-dependent data. Converts absolute paths to a format suitable for artifacts.
- * @param absolutePathToSmth Absolute path to contract or source
- * @param contractsDir Current package contracts directory location
- * @param dependencyNameToPath Mapping of dependency name to package path
- */
-export function makeContractPathsRelative(
- absolutePathToSmth: { [absoluteContractPath: string]: any },
- contractsDir: string,
- dependencyNameToPath: { [dependencyName: string]: string },
-): { [contractPath: string]: any } {
- return _.mapKeys(absolutePathToSmth, (_val: any, absoluteContractPath: string) =>
- makeContractPathRelative(absoluteContractPath, contractsDir, dependencyNameToPath),
- );
-}
-
-/**
- * Separates errors from warnings, formats the messages and prints them. Throws if there is any compilation error (not warning).
- * @param solcErrors The errors field of standard JSON output that contains errors and warnings.
- */
-export function printCompilationErrorsAndWarnings(solcErrors: solc.SolcError[]): void {
- const SOLIDITY_WARNING = 'warning';
- const errors = _.filter(solcErrors, entry => entry.severity !== SOLIDITY_WARNING);
- const warnings = _.filter(solcErrors, entry => entry.severity === SOLIDITY_WARNING);
- if (!_.isEmpty(errors)) {
- errors.forEach(error => {
- const normalizedErrMsg = getNormalizedErrMsg(error.formattedMessage || error.message);
- logUtils.log(chalk.red('error'), normalizedErrMsg);
- });
- throw new CompilationError(errors.length);
- } else {
- warnings.forEach(warning => {
- const normalizedWarningMsg = getNormalizedErrMsg(warning.formattedMessage || warning.message);
- logUtils.log(chalk.yellow('warning'), normalizedWarningMsg);
- });
- }
-}
-
-/**
- * Gets the source tree hash for a file and its dependencies.
- * @param fileName Name of contract file.
- */
-export function getSourceTreeHash(resolver: Resolver, importPath: string): Buffer {
- const contractSource = resolver.resolve(importPath);
- const dependencies = parseDependencies(contractSource);
- const sourceHash = ethUtil.sha3(contractSource.source);
- if (dependencies.length === 0) {
- return sourceHash;
- } else {
- const dependencySourceTreeHashes = _.map(dependencies, (dependency: string) =>
- getSourceTreeHash(resolver, dependency),
- );
- const sourceTreeHashesBuffer = Buffer.concat([sourceHash, ...dependencySourceTreeHashes]);
- const sourceTreeHash = ethUtil.sha3(sourceTreeHashesBuffer);
- return sourceTreeHash;
- }
-}
-
-/**
- * For the given @param contractPath, populates JSON objects to be used in the ContractVersionData interface's
- * properties `sources` (source code file names mapped to ID numbers) and `sourceCodes` (source code content of
- * contracts) for that contract. The source code pointed to by contractPath is read and parsed directly (via
- * `resolver.resolve().source`), as are its imports, recursively. The ID numbers for @return `sources` are
- * taken from the corresponding ID's in @param fullSources, and the content for @return sourceCodes is read from
- * disk (via the aforementioned `resolver.source`).
- */
-export function getSourcesWithDependencies(
- resolver: Resolver,
- contractPath: string,
- fullSources: { [sourceName: string]: { id: number } },
-): { sourceCodes: { [sourceName: string]: string }; sources: { [sourceName: string]: { id: number } } } {
- const sources = { [contractPath]: fullSources[contractPath] };
- const sourceCodes = { [contractPath]: resolver.resolve(contractPath).source };
- recursivelyGatherDependencySources(
- resolver,
- contractPath,
- sourceCodes[contractPath],
- fullSources,
- sources,
- sourceCodes,
- );
- return { sourceCodes, sources };
-}
-
-function recursivelyGatherDependencySources(
- resolver: Resolver,
- contractPath: string,
- contractSource: string,
- fullSources: { [sourceName: string]: { id: number } },
- sourcesToAppendTo: { [sourceName: string]: { id: number } },
- sourceCodesToAppendTo: { [sourceName: string]: string },
-): void {
- const importStatementMatches = contractSource.match(/\nimport[^;]*;/g);
- if (importStatementMatches === null) {
- return;
- }
- for (const importStatementMatch of importStatementMatches) {
- const importPathMatches = importStatementMatch.match(/\"([^\"]*)\"/);
- if (importPathMatches === null || importPathMatches.length === 0) {
- continue;
- }
-
- let importPath = importPathMatches[1];
- // HACK(albrow): We have, e.g.:
- //
- // importPath = "../../utils/LibBytes/LibBytes.sol"
- // contractPath = "2.0.0/protocol/AssetProxyOwner/AssetProxyOwner.sol"
- //
- // Resolver doesn't understand "../" so we want to pass
- // "2.0.0/utils/LibBytes/LibBytes.sol" to resolver.
- //
- // This hack involves using path.resolve. But path.resolve returns
- // absolute directories by default. We trick it into thinking that
- // contractPath is a root directory by prepending a '/' and then
- // removing the '/' the end.
- //
- // path.resolve("/a/b/c", ""../../d/e") === "/a/d/e"
- //
- const lastPathSeparatorPos = contractPath.lastIndexOf('/');
- const contractFolder = lastPathSeparatorPos === -1 ? '' : contractPath.slice(0, lastPathSeparatorPos + 1);
- if (importPath.startsWith('.')) {
- /**
- * Some imports path are relative ("../Token.sol", "./Wallet.sol")
- * while others are absolute ("Token.sol", "@0x/contracts/Wallet.sol")
- * And we need to append the base path for relative imports.
- */
- importPath = path.resolve(`/${contractFolder}`, importPath).replace('/', '');
- }
-
- if (_.isUndefined(sourcesToAppendTo[importPath])) {
- sourcesToAppendTo[importPath] = { id: fullSources[importPath].id };
- sourceCodesToAppendTo[importPath] = resolver.resolve(importPath).source;
-
- recursivelyGatherDependencySources(
- resolver,
- importPath,
- resolver.resolve(importPath).source,
- fullSources,
- sourcesToAppendTo,
- sourceCodesToAppendTo,
- );
- }
- }
-}
-
-/**
- * Gets the solidity compiler instance. If the compiler is already cached - gets it from FS,
- * otherwise - fetches it and caches it.
- * @param solcVersion The compiler version. e.g. 0.5.0
- */
-export async function getSolcJSAsync(solcVersion: string): Promise<solc.SolcInstance> {
- const solcJSReleases = await getSolcJSReleasesAsync();
- const fullSolcVersion = solcJSReleases[solcVersion];
- if (_.isUndefined(fullSolcVersion)) {
- throw new Error(`${solcVersion} is not a known compiler version`);
- }
- const compilerBinFilename = path.join(constants.SOLC_BIN_DIR, fullSolcVersion);
- let solcjs: string;
- if (await fsWrapper.doesFileExistAsync(compilerBinFilename)) {
- solcjs = (await fsWrapper.readFileAsync(compilerBinFilename)).toString();
- } else {
- logUtils.warn(`Downloading ${fullSolcVersion}...`);
- const url = `${constants.BASE_COMPILER_URL}${fullSolcVersion}`;
- const response = await fetchAsync(url);
- const SUCCESS_STATUS = 200;
- if (response.status !== SUCCESS_STATUS) {
- throw new Error(`Failed to load ${fullSolcVersion}`);
- }
- solcjs = await response.text();
- await fsWrapper.writeFileAsync(compilerBinFilename, solcjs);
- }
- if (solcjs.length === 0) {
- throw new Error('No compiler available');
- }
- const solcInstance = solc.setupMethods(requireFromString(solcjs, compilerBinFilename));
- return solcInstance;
-}
-
-/**
- * Solidity compiler emits the bytecode without a 0x prefix for a hex. This function fixes it if bytecode is present.
- * @param compiledContract The standard JSON output section for a contract. Geth modified in place.
- */
-export function addHexPrefixToContractBytecode(compiledContract: solc.StandardContractOutput): void {
- if (!_.isUndefined(compiledContract.evm)) {
- if (!_.isUndefined(compiledContract.evm.bytecode) && !_.isUndefined(compiledContract.evm.bytecode.object)) {
- compiledContract.evm.bytecode.object = ethUtil.addHexPrefix(compiledContract.evm.bytecode.object);
- }
- if (
- !_.isUndefined(compiledContract.evm.deployedBytecode) &&
- !_.isUndefined(compiledContract.evm.deployedBytecode.object)
- ) {
- compiledContract.evm.deployedBytecode.object = ethUtil.addHexPrefix(
- compiledContract.evm.deployedBytecode.object,
- );
- }
- }
-}
-
-/**
- * Takes the list of resolved contract sources from `SpyResolver` and produces a mapping from dependency name
- * to package path used in `remappings` later, as well as in generating the "relative" source paths saved to the artifact files.
- * @param contractSources The list of resolved contract sources
- */
-export function getDependencyNameToPackagePath(
- contractSources: ContractSource[],
-): { [dependencyName: string]: string } {
- const allTouchedFiles = contractSources.map(contractSource => `${contractSource.absolutePath}`);
- const NODE_MODULES = 'node_modules';
- const allTouchedDependencies = _.filter(allTouchedFiles, filePath => filePath.includes(NODE_MODULES));
- const dependencyNameToPath: { [dependencyName: string]: string } = {};
- _.map(allTouchedDependencies, dependencyFilePath => {
- const lastNodeModulesStart = dependencyFilePath.lastIndexOf(NODE_MODULES);
- const lastNodeModulesEnd = lastNodeModulesStart + NODE_MODULES.length;
- const importPath = dependencyFilePath.substr(lastNodeModulesEnd + 1);
- let packageName;
- let packageScopeIfExists;
- let dependencyName;
- if (_.startsWith(importPath, '@')) {
- [packageScopeIfExists, packageName] = importPath.split('/');
- dependencyName = `${packageScopeIfExists}/${packageName}`;
- } else {
- [packageName] = importPath.split('/');
- dependencyName = `${packageName}`;
- }
- const dependencyPackagePath = path.join(dependencyFilePath.substr(0, lastNodeModulesEnd), dependencyName);
- dependencyNameToPath[dependencyName] = dependencyPackagePath;
- });
- return dependencyNameToPath;
-}
diff --git a/packages/sol-compiler/src/utils/constants.ts b/packages/sol-compiler/src/utils/constants.ts
deleted file mode 100644
index 433897f8a..000000000
--- a/packages/sol-compiler/src/utils/constants.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import * as path from 'path';
-
-export const constants = {
- SOLIDITY_FILE_EXTENSION: '.sol',
- BASE_COMPILER_URL: 'https://ethereum.github.io/solc-bin/bin/',
- LATEST_ARTIFACT_VERSION: '2.0.0',
- SOLC_BIN_DIR: path.join(__dirname, '..', '..', 'solc_bin'),
-};
diff --git a/packages/sol-compiler/src/utils/encoder.ts b/packages/sol-compiler/src/utils/encoder.ts
deleted file mode 100644
index 40b103fd5..000000000
--- a/packages/sol-compiler/src/utils/encoder.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { AbiDefinition, AbiType, ConstructorAbi, ContractAbi, DataItem } from 'ethereum-types';
-import * as _ from 'lodash';
-import * as web3Abi from 'web3-eth-abi';
-
-export const encoder = {
- encodeConstructorArgsFromAbi(args: any[], abi: ContractAbi): string {
- const constructorTypes: string[] = [];
- _.each(abi, (element: AbiDefinition) => {
- if (element.type === AbiType.Constructor) {
- // tslint:disable-next-line:no-unnecessary-type-assertion
- const constuctorAbi = element as ConstructorAbi;
- _.each(constuctorAbi.inputs, (input: DataItem) => {
- constructorTypes.push(input.type);
- });
- }
- });
- const encodedParameters = web3Abi.encodeParameters(constructorTypes, args);
- return encodedParameters;
- },
-};
diff --git a/packages/sol-compiler/src/utils/fs_wrapper.ts b/packages/sol-compiler/src/utils/fs_wrapper.ts
deleted file mode 100644
index a52b50963..000000000
--- a/packages/sol-compiler/src/utils/fs_wrapper.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { promisify } from '@0x/utils';
-import * as fs from 'fs';
-import * as mkdirp from 'mkdirp';
-
-export const fsWrapper = {
- readdirAsync: promisify<string[]>(fs.readdir),
- readFileAsync: promisify<string>(fs.readFile),
- writeFileAsync: promisify<undefined>(fs.writeFile),
- mkdirpAsync: promisify<undefined>(mkdirp),
- doesPathExistSync: fs.existsSync,
- rmdirSync: fs.rmdirSync,
- removeFileAsync: promisify<undefined>(fs.unlink),
- statAsync: promisify<fs.Stats>(fs.stat),
- appendFileAsync: promisify<undefined>(fs.appendFile),
- accessAsync: promisify<boolean>(fs.access),
- doesFileExistAsync: async (filePath: string): Promise<boolean> => {
- try {
- await fsWrapper.accessAsync(
- filePath,
- // node says we need to use bitwise, but tslint says no:
- fs.constants.F_OK | fs.constants.R_OK, // tslint:disable-line:no-bitwise
- );
- } catch (err) {
- return false;
- }
- return true;
- },
-};
diff --git a/packages/sol-compiler/src/utils/types.ts b/packages/sol-compiler/src/utils/types.ts
deleted file mode 100644
index f756c51bb..000000000
--- a/packages/sol-compiler/src/utils/types.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-export enum AbiType {
- Function = 'function',
- Constructor = 'constructor',
- Event = 'event',
- Fallback = 'fallback',
-}
-
-export interface SolcErrors {
- [key: string]: boolean;
-}
-
-export interface ContractSourceData {
- [contractName: string]: ContractSpecificSourceData;
-}
-
-export interface BinaryPaths {
- [key: string]: string;
-}
-
-export interface ContractSpecificSourceData {
- solcVersionRange: string;
- sourceHash: Buffer;
- sourceTreeHash: Buffer;
-}
-
-export interface Token {
- address?: string;
- name: string;
- symbol: string;
- decimals: number;
- ipfsHash: string;
- swarmHash: string;
-}
-
-export type DoneCallback = (err?: Error) => void;
-
-export class CompilationError extends Error {
- public errorsCount: number;
- public typeName = 'CompilationError';
- constructor(errorsCount: number) {
- super('Compilation errors encountered');
- this.errorsCount = errorsCount;
- }
-}
diff --git a/packages/sol-compiler/src/utils/utils.ts b/packages/sol-compiler/src/utils/utils.ts
deleted file mode 100644
index 4f2de2caa..000000000
--- a/packages/sol-compiler/src/utils/utils.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export const utils = {
- stringifyWithFormatting(obj: any): string {
- const stringifiedObj = JSON.stringify(obj, null, '\t');
- return stringifiedObj;
- },
-};
diff --git a/packages/sol-compiler/test/compiler_test.ts b/packages/sol-compiler/test/compiler_test.ts
deleted file mode 100644
index cae6bce05..000000000
--- a/packages/sol-compiler/test/compiler_test.ts
+++ /dev/null
@@ -1,117 +0,0 @@
-import { join } from 'path';
-
-import * as chai from 'chai';
-import { CompilerOptions, ContractArtifact } from 'ethereum-types';
-import 'mocha';
-
-import { Compiler } from '../src/compiler';
-import { fsWrapper } from '../src/utils/fs_wrapper';
-
-import { exchange_binary } from './fixtures/exchange_bin';
-import { chaiSetup } from './util/chai_setup';
-import { constants } from './util/constants';
-
-chaiSetup.configure();
-const expect = chai.expect;
-
-describe('#Compiler', function(): void {
- this.timeout(constants.timeoutMs); // tslint:disable-line:no-invalid-this
- const artifactsDir = `${__dirname}/fixtures/artifacts`;
- const contractsDir = `${__dirname}/fixtures/contracts`;
- const compilerOpts: CompilerOptions = {
- artifactsDir,
- contractsDir,
- contracts: constants.contracts,
- };
- it('should create a Compiler with empty opts', async () => {
- const _compiler = new Compiler(); // tslint:disable-line no-unused-variable
- });
- it('should create an Exchange artifact with the correct unlinked binary', async () => {
- compilerOpts.contracts = ['Exchange'];
-
- const exchangeArtifactPath = `${artifactsDir}/Exchange.json`;
- if (fsWrapper.doesPathExistSync(exchangeArtifactPath)) {
- await fsWrapper.removeFileAsync(exchangeArtifactPath);
- }
-
- await new Compiler(compilerOpts).compileAsync();
-
- const opts = {
- encoding: 'utf8',
- };
- const exchangeArtifactString = await fsWrapper.readFileAsync(exchangeArtifactPath, opts);
- const exchangeArtifact: ContractArtifact = JSON.parse(exchangeArtifactString);
- // The last 43 bytes of the binaries are metadata which may not be equivalent
- const metadataByteLength = 43;
- const metadataHexLength = metadataByteLength * 2;
- const unlinkedBinaryWithoutMetadata = exchangeArtifact.compilerOutput.evm.bytecode.object.slice(
- 2,
- -metadataHexLength,
- );
- const exchangeBinaryWithoutMetadata = exchange_binary.slice(0, -metadataHexLength);
- expect(unlinkedBinaryWithoutMetadata).to.equal(exchangeBinaryWithoutMetadata);
- });
- it("should throw when Whatever.sol doesn't contain a Whatever contract", async () => {
- const contract = 'BadContractName';
-
- const exchangeArtifactPath = `${artifactsDir}/${contract}.json`;
- if (fsWrapper.doesPathExistSync(exchangeArtifactPath)) {
- await fsWrapper.removeFileAsync(exchangeArtifactPath);
- }
-
- compilerOpts.contracts = [contract];
- const compiler = new Compiler(compilerOpts);
-
- expect(compiler.compileAsync()).to.be.rejected();
- });
- describe('after a successful compilation', () => {
- const contract = 'Exchange';
- let artifactPath: string;
- let artifactCreatedAtMs: number;
- beforeEach(async () => {
- compilerOpts.contracts = [contract];
-
- artifactPath = `${artifactsDir}/${contract}.json`;
- if (fsWrapper.doesPathExistSync(artifactPath)) {
- await fsWrapper.removeFileAsync(artifactPath);
- }
-
- await new Compiler(compilerOpts).compileAsync();
-
- artifactCreatedAtMs = (await fsWrapper.statAsync(artifactPath)).mtimeMs;
- });
- it('recompilation should update artifact when source has changed', async () => {
- // append some meaningless data to the contract, so that its hash
- // will change, so that the compiler will decide to recompile it.
- await fsWrapper.appendFileAsync(join(contractsDir, `${contract}.sol`), ' ');
-
- await new Compiler(compilerOpts).compileAsync();
-
- const artifactModifiedAtMs = (await fsWrapper.statAsync(artifactPath)).mtimeMs;
-
- expect(artifactModifiedAtMs).to.be.greaterThan(artifactCreatedAtMs);
- });
- it("recompilation should NOT update artifact when source hasn't changed", async () => {
- await new Compiler(compilerOpts).compileAsync();
-
- const artifactModifiedAtMs = (await fsWrapper.statAsync(artifactPath)).mtimeMs;
-
- expect(artifactModifiedAtMs).to.equal(artifactCreatedAtMs);
- });
- });
- it('should only compile what was requested', async () => {
- // remove all artifacts
- for (const artifact of await fsWrapper.readdirAsync(artifactsDir)) {
- await fsWrapper.removeFileAsync(join(artifactsDir, artifact));
- }
-
- // compile EmptyContract
- compilerOpts.contracts = ['EmptyContract'];
- await new Compiler(compilerOpts).compileAsync();
-
- // make sure the artifacts dir only contains EmptyContract.json
- for (const artifact of await fsWrapper.readdirAsync(artifactsDir)) {
- expect(artifact).to.equal('EmptyContract.json');
- }
- });
-});
diff --git a/packages/sol-compiler/test/compiler_utils_test.ts b/packages/sol-compiler/test/compiler_utils_test.ts
deleted file mode 100644
index b8c18110c..000000000
--- a/packages/sol-compiler/test/compiler_utils_test.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-import * as chai from 'chai';
-import * as dirtyChai from 'dirty-chai';
-import * as _ from 'lodash';
-import 'mocha';
-
-import {
- createDirIfDoesNotExistAsync,
- getNormalizedErrMsg,
- parseDependencies,
- parseSolidityVersionRange,
-} from '../src/utils/compiler';
-import { fsWrapper } from '../src/utils/fs_wrapper';
-
-chai.use(dirtyChai);
-const expect = chai.expect;
-
-describe('Compiler utils', () => {
- describe('#getNormalizedErrorMessage', () => {
- it('normalizes the error message', () => {
- const errMsg = 'base/Token.sol:6:46: Warning: Unused local variable';
- const normalizedErrMsg = getNormalizedErrMsg(errMsg);
- expect(normalizedErrMsg).to.be.equal('Token.sol:6:46: Warning: Unused local variable');
- });
- });
- describe('#createDirIfDoesNotExistAsync', () => {
- it('creates artifacts dir', async () => {
- const artifactsDir = `${__dirname}/artifacts`;
- expect(fsWrapper.doesPathExistSync(artifactsDir)).to.be.false();
- await createDirIfDoesNotExistAsync(artifactsDir);
- expect(fsWrapper.doesPathExistSync(artifactsDir)).to.be.true();
- fsWrapper.rmdirSync(artifactsDir);
- expect(fsWrapper.doesPathExistSync(artifactsDir)).to.be.false();
- });
- });
- describe('#parseSolidityVersionRange', () => {
- it('correctly parses the version range', () => {
- expect(parseSolidityVersionRange('pragma solidity ^0.0.1;')).to.be.equal('^0.0.1');
- expect(parseSolidityVersionRange('\npragma solidity 0.0.1;')).to.be.equal('0.0.1');
- expect(parseSolidityVersionRange('pragma solidity <=1.0.1;')).to.be.equal('<=1.0.1');
- expect(parseSolidityVersionRange('pragma solidity ~1.0.1;')).to.be.equal('~1.0.1');
- });
- // TODO: For now that doesn't work. This will work after we switch to a grammar-based parser
- it.skip('correctly parses the version range with comments', () => {
- expect(parseSolidityVersionRange('// pragma solidity ~1.0.1;\npragma solidity ~1.0.2;')).to.be.equal(
- '~1.0.2',
- );
- });
- });
- describe('#parseDependencies', () => {
- it('correctly parses Exchange dependencies', async () => {
- const path = `${__dirname}/fixtures/contracts/Exchange.sol`;
- const source = await fsWrapper.readFileAsync(path, {
- encoding: 'utf8',
- });
- const dependencies = parseDependencies({ source, path, absolutePath: path });
- const expectedDependencies = [
- 'zeppelin-solidity/contracts/token/ERC20/ERC20.sol',
- 'packages/sol-compiler/lib/test/fixtures/contracts/TokenTransferProxy.sol',
- 'packages/sol-compiler/lib/test/fixtures/contracts/base/SafeMath.sol',
- ];
- _.each(expectedDependencies, expectedDepdency => {
- const foundDependency = _.find(dependencies, dependency => _.endsWith(dependency, expectedDepdency));
- expect(foundDependency, `${expectedDepdency} not found`).to.not.be.undefined();
- });
- });
- it('correctly parses TokenTransferProxy dependencies', async () => {
- const path = `${__dirname}/fixtures/contracts/TokenTransferProxy.sol`;
- const source = await fsWrapper.readFileAsync(path, {
- encoding: 'utf8',
- });
- expect(parseDependencies({ source, path, absolutePath: path })).to.be.deep.equal([
- 'zeppelin-solidity/contracts/ownership/Ownable.sol',
- 'zeppelin-solidity/contracts/token/ERC20/ERC20.sol',
- ]);
- });
- // TODO: For now that doesn't work. This will work after we switch to a grammar-based parser
- it.skip('correctly parses commented out dependencies', async () => {
- const path = '';
- const source = `// import "./TokenTransferProxy.sol";`;
- expect(parseDependencies({ path, source, absolutePath: path })).to.be.deep.equal([]);
- });
- });
-});
diff --git a/packages/sol-compiler/test/fixtures/contracts/BadContractName.sol b/packages/sol-compiler/test/fixtures/contracts/BadContractName.sol
deleted file mode 100644
index 3193cc0eb..000000000
--- a/packages/sol-compiler/test/fixtures/contracts/BadContractName.sol
+++ /dev/null
@@ -1,3 +0,0 @@
-pragma solidity ^0.4.14;
-
-contract ContractNameThatDoesntMatchFilename { }
diff --git a/packages/sol-compiler/test/fixtures/contracts/EmptyContract.sol b/packages/sol-compiler/test/fixtures/contracts/EmptyContract.sol
deleted file mode 100644
index 971ca7826..000000000
--- a/packages/sol-compiler/test/fixtures/contracts/EmptyContract.sol
+++ /dev/null
@@ -1,3 +0,0 @@
-pragma solidity ^0.4.14;
-
-contract EmptyContract { }
diff --git a/packages/sol-compiler/test/fixtures/contracts/Exchange.sol b/packages/sol-compiler/test/fixtures/contracts/Exchange.sol
deleted file mode 100644
index e3725335b..000000000
--- a/packages/sol-compiler/test/fixtures/contracts/Exchange.sol
+++ /dev/null
@@ -1,603 +0,0 @@
-/*
-
- Copyright 2018 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity ^0.4.14;
-
-import {ERC20 as Token} from "zeppelin-solidity/contracts/token/ERC20/ERC20.sol";
-
-import "./TokenTransferProxy.sol";
-import "./base/SafeMath.sol";
-
-/// @title Exchange - Facilitates exchange of ERC20 tokens.
-/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
-contract Exchange is SafeMath {
-
- // Error Codes
- enum Errors {
- ORDER_EXPIRED, // Order has already expired
- ORDER_FULLY_FILLED_OR_CANCELLED, // Order has already been fully filled or cancelled
- ROUNDING_ERROR_TOO_LARGE, // Rounding error too large
- INSUFFICIENT_BALANCE_OR_ALLOWANCE // Insufficient balance or allowance for token transfer
- }
-
- string constant public VERSION = "1.0.0";
- uint16 constant public EXTERNAL_QUERY_GAS_LIMIT = 4999; // Changes to state require at least 5000 gas
-
- address public ZRX_TOKEN_CONTRACT;
- address public TOKEN_TRANSFER_PROXY_CONTRACT;
-
- // Mappings of orderHash => amounts of takerTokenAmount filled or cancelled.
- mapping (bytes32 => uint) public filled;
- mapping (bytes32 => uint) public cancelled;
-
- event LogFill(
- address indexed maker,
- address taker,
- address indexed feeRecipient,
- address makerToken,
- address takerToken,
- uint filledMakerTokenAmount,
- uint filledTakerTokenAmount,
- uint paidMakerFee,
- uint paidTakerFee,
- bytes32 indexed tokens, // keccak256(makerToken, takerToken), allows subscribing to a token pair
- bytes32 orderHash
- );
-
- event LogCancel(
- address indexed maker,
- address indexed feeRecipient,
- address makerToken,
- address takerToken,
- uint cancelledMakerTokenAmount,
- uint cancelledTakerTokenAmount,
- bytes32 indexed tokens,
- bytes32 orderHash
- );
-
- event LogError(uint8 indexed errorId, bytes32 indexed orderHash);
-
- struct Order {
- address maker;
- address taker;
- address makerToken;
- address takerToken;
- address feeRecipient;
- uint makerTokenAmount;
- uint takerTokenAmount;
- uint makerFee;
- uint takerFee;
- uint expirationTimestampInSec;
- bytes32 orderHash;
- }
-
- function Exchange(address _zrxToken, address _tokenTransferProxy) {
- ZRX_TOKEN_CONTRACT = _zrxToken;
- TOKEN_TRANSFER_PROXY_CONTRACT = _tokenTransferProxy;
- }
-
- /*
- * Core exchange functions
- */
-
- /// @dev Fills the input order.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
- /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfer will fail before attempting.
- /// @param v ECDSA signature parameter v.
- /// @param r ECDSA signature parameters r.
- /// @param s ECDSA signature parameters s.
- /// @return Total amount of takerToken filled in trade.
- function fillOrder(
- address[5] orderAddresses,
- uint[6] orderValues,
- uint fillTakerTokenAmount,
- bool shouldThrowOnInsufficientBalanceOrAllowance,
- uint8 v,
- bytes32 r,
- bytes32 s)
- public
- returns (uint filledTakerTokenAmount)
- {
- Order memory order = Order({
- maker: orderAddresses[0],
- taker: orderAddresses[1],
- makerToken: orderAddresses[2],
- takerToken: orderAddresses[3],
- feeRecipient: orderAddresses[4],
- makerTokenAmount: orderValues[0],
- takerTokenAmount: orderValues[1],
- makerFee: orderValues[2],
- takerFee: orderValues[3],
- expirationTimestampInSec: orderValues[4],
- orderHash: getOrderHash(orderAddresses, orderValues)
- });
-
- require(order.taker == address(0) || order.taker == msg.sender);
- require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && fillTakerTokenAmount > 0);
- require(isValidSignature(
- order.maker,
- order.orderHash,
- v,
- r,
- s
- ));
-
- if (block.timestamp >= order.expirationTimestampInSec) {
- LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
- return 0;
- }
-
- uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
- filledTakerTokenAmount = min256(fillTakerTokenAmount, remainingTakerTokenAmount);
- if (filledTakerTokenAmount == 0) {
- LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
- return 0;
- }
-
- if (isRoundingError(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount)) {
- LogError(uint8(Errors.ROUNDING_ERROR_TOO_LARGE), order.orderHash);
- return 0;
- }
-
- if (!shouldThrowOnInsufficientBalanceOrAllowance && !isTransferable(order, filledTakerTokenAmount)) {
- LogError(uint8(Errors.INSUFFICIENT_BALANCE_OR_ALLOWANCE), order.orderHash);
- return 0;
- }
-
- uint filledMakerTokenAmount = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);
- uint paidMakerFee;
- uint paidTakerFee;
- filled[order.orderHash] = safeAdd(filled[order.orderHash], filledTakerTokenAmount);
- require(transferViaTokenTransferProxy(
- order.makerToken,
- order.maker,
- msg.sender,
- filledMakerTokenAmount
- ));
- require(transferViaTokenTransferProxy(
- order.takerToken,
- msg.sender,
- order.maker,
- filledTakerTokenAmount
- ));
- if (order.feeRecipient != address(0)) {
- if (order.makerFee > 0) {
- paidMakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.makerFee);
- require(transferViaTokenTransferProxy(
- ZRX_TOKEN_CONTRACT,
- order.maker,
- order.feeRecipient,
- paidMakerFee
- ));
- }
- if (order.takerFee > 0) {
- paidTakerFee = getPartialAmount(filledTakerTokenAmount, order.takerTokenAmount, order.takerFee);
- require(transferViaTokenTransferProxy(
- ZRX_TOKEN_CONTRACT,
- msg.sender,
- order.feeRecipient,
- paidTakerFee
- ));
- }
- }
-
- LogFill(
- order.maker,
- msg.sender,
- order.feeRecipient,
- order.makerToken,
- order.takerToken,
- filledMakerTokenAmount,
- filledTakerTokenAmount,
- paidMakerFee,
- paidTakerFee,
- keccak256(order.makerToken, order.takerToken),
- order.orderHash
- );
- return filledTakerTokenAmount;
- }
-
- /// @dev Cancels the input order.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @param cancelTakerTokenAmount Desired amount of takerToken to cancel in order.
- /// @return Amount of takerToken cancelled.
- function cancelOrder(
- address[5] orderAddresses,
- uint[6] orderValues,
- uint cancelTakerTokenAmount)
- public
- returns (uint)
- {
- Order memory order = Order({
- maker: orderAddresses[0],
- taker: orderAddresses[1],
- makerToken: orderAddresses[2],
- takerToken: orderAddresses[3],
- feeRecipient: orderAddresses[4],
- makerTokenAmount: orderValues[0],
- takerTokenAmount: orderValues[1],
- makerFee: orderValues[2],
- takerFee: orderValues[3],
- expirationTimestampInSec: orderValues[4],
- orderHash: getOrderHash(orderAddresses, orderValues)
- });
-
- require(order.maker == msg.sender);
- require(order.makerTokenAmount > 0 && order.takerTokenAmount > 0 && cancelTakerTokenAmount > 0);
-
- if (block.timestamp >= order.expirationTimestampInSec) {
- LogError(uint8(Errors.ORDER_EXPIRED), order.orderHash);
- return 0;
- }
-
- uint remainingTakerTokenAmount = safeSub(order.takerTokenAmount, getUnavailableTakerTokenAmount(order.orderHash));
- uint cancelledTakerTokenAmount = min256(cancelTakerTokenAmount, remainingTakerTokenAmount);
- if (cancelledTakerTokenAmount == 0) {
- LogError(uint8(Errors.ORDER_FULLY_FILLED_OR_CANCELLED), order.orderHash);
- return 0;
- }
-
- cancelled[order.orderHash] = safeAdd(cancelled[order.orderHash], cancelledTakerTokenAmount);
-
- LogCancel(
- order.maker,
- order.feeRecipient,
- order.makerToken,
- order.takerToken,
- getPartialAmount(cancelledTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount),
- cancelledTakerTokenAmount,
- keccak256(order.makerToken, order.takerToken),
- order.orderHash
- );
- return cancelledTakerTokenAmount;
- }
-
- /*
- * Wrapper functions
- */
-
- /// @dev Fills an order with specified parameters and ECDSA signature, throws if specified amount not filled entirely.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
- /// @param v ECDSA signature parameter v.
- /// @param r ECDSA signature parameters r.
- /// @param s ECDSA signature parameters s.
- function fillOrKillOrder(
- address[5] orderAddresses,
- uint[6] orderValues,
- uint fillTakerTokenAmount,
- uint8 v,
- bytes32 r,
- bytes32 s)
- public
- {
- require(fillOrder(
- orderAddresses,
- orderValues,
- fillTakerTokenAmount,
- false,
- v,
- r,
- s
- ) == fillTakerTokenAmount);
- }
-
- /// @dev Synchronously executes multiple fill orders in a single transaction.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
- /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
- /// @param v Array ECDSA signature v parameters.
- /// @param r Array of ECDSA signature r parameters.
- /// @param s Array of ECDSA signature s parameters.
- function batchFillOrders(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint[] fillTakerTokenAmounts,
- bool shouldThrowOnInsufficientBalanceOrAllowance,
- uint8[] v,
- bytes32[] r,
- bytes32[] s)
- public
- {
- for (uint i = 0; i < orderAddresses.length; i++) {
- fillOrder(
- orderAddresses[i],
- orderValues[i],
- fillTakerTokenAmounts[i],
- shouldThrowOnInsufficientBalanceOrAllowance,
- v[i],
- r[i],
- s[i]
- );
- }
- }
-
- /// @dev Synchronously executes multiple fillOrKill orders in a single transaction.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param fillTakerTokenAmounts Array of desired amounts of takerToken to fill in orders.
- /// @param v Array ECDSA signature v parameters.
- /// @param r Array of ECDSA signature r parameters.
- /// @param s Array of ECDSA signature s parameters.
- function batchFillOrKillOrders(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint[] fillTakerTokenAmounts,
- uint8[] v,
- bytes32[] r,
- bytes32[] s)
- public
- {
- for (uint i = 0; i < orderAddresses.length; i++) {
- fillOrKillOrder(
- orderAddresses[i],
- orderValues[i],
- fillTakerTokenAmounts[i],
- v[i],
- r[i],
- s[i]
- );
- }
- }
-
- /// @dev Synchronously executes multiple fill orders in a single transaction until total fillTakerTokenAmount filled.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param fillTakerTokenAmount Desired total amount of takerToken to fill in orders.
- /// @param shouldThrowOnInsufficientBalanceOrAllowance Test if transfers will fail before attempting.
- /// @param v Array ECDSA signature v parameters.
- /// @param r Array of ECDSA signature r parameters.
- /// @param s Array of ECDSA signature s parameters.
- /// @return Total amount of fillTakerTokenAmount filled in orders.
- function fillOrdersUpTo(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint fillTakerTokenAmount,
- bool shouldThrowOnInsufficientBalanceOrAllowance,
- uint8[] v,
- bytes32[] r,
- bytes32[] s)
- public
- returns (uint)
- {
- uint filledTakerTokenAmount = 0;
- for (uint i = 0; i < orderAddresses.length; i++) {
- require(orderAddresses[i][3] == orderAddresses[0][3]); // takerToken must be the same for each order
- filledTakerTokenAmount = safeAdd(filledTakerTokenAmount, fillOrder(
- orderAddresses[i],
- orderValues[i],
- safeSub(fillTakerTokenAmount, filledTakerTokenAmount),
- shouldThrowOnInsufficientBalanceOrAllowance,
- v[i],
- r[i],
- s[i]
- ));
- if (filledTakerTokenAmount == fillTakerTokenAmount) break;
- }
- return filledTakerTokenAmount;
- }
-
- /// @dev Synchronously cancels multiple orders in a single transaction.
- /// @param orderAddresses Array of address arrays containing individual order addresses.
- /// @param orderValues Array of uint arrays containing individual order values.
- /// @param cancelTakerTokenAmounts Array of desired amounts of takerToken to cancel in orders.
- function batchCancelOrders(
- address[5][] orderAddresses,
- uint[6][] orderValues,
- uint[] cancelTakerTokenAmounts)
- public
- {
- for (uint i = 0; i < orderAddresses.length; i++) {
- cancelOrder(
- orderAddresses[i],
- orderValues[i],
- cancelTakerTokenAmounts[i]
- );
- }
- }
-
- /*
- * Constant public functions
- */
-
- /// @dev Calculates Keccak-256 hash of order with specified parameters.
- /// @param orderAddresses Array of order's maker, taker, makerToken, takerToken, and feeRecipient.
- /// @param orderValues Array of order's makerTokenAmount, takerTokenAmount, makerFee, takerFee, expirationTimestampInSec, and salt.
- /// @return Keccak-256 hash of order.
- function getOrderHash(address[5] orderAddresses, uint[6] orderValues)
- public
- constant
- returns (bytes32)
- {
- return keccak256(
- address(this),
- orderAddresses[0], // maker
- orderAddresses[1], // taker
- orderAddresses[2], // makerToken
- orderAddresses[3], // takerToken
- orderAddresses[4], // feeRecipient
- orderValues[0], // makerTokenAmount
- orderValues[1], // takerTokenAmount
- orderValues[2], // makerFee
- orderValues[3], // takerFee
- orderValues[4], // expirationTimestampInSec
- orderValues[5] // salt
- );
- }
-
- /// @dev Verifies that an order signature is valid.
- /// @param signer address of signer.
- /// @param hash Signed Keccak-256 hash.
- /// @param v ECDSA signature parameter v.
- /// @param r ECDSA signature parameters r.
- /// @param s ECDSA signature parameters s.
- /// @return Validity of order signature.
- function isValidSignature(
- address signer,
- bytes32 hash,
- uint8 v,
- bytes32 r,
- bytes32 s)
- public
- constant
- returns (bool)
- {
- return signer == ecrecover(
- keccak256("\x19Ethereum Signed Message:\n32", hash),
- v,
- r,
- s
- );
- }
-
- /// @dev Checks if rounding error > 0.1%.
- /// @param numerator Numerator.
- /// @param denominator Denominator.
- /// @param target Value to multiply with numerator/denominator.
- /// @return Rounding error is present.
- function isRoundingError(uint numerator, uint denominator, uint target)
- public
- constant
- returns (bool)
- {
- uint remainder = mulmod(target, numerator, denominator);
- if (remainder == 0) return false; // No rounding error.
-
- uint errPercentageTimes1000000 = safeDiv(
- safeMul(remainder, 1000000),
- safeMul(numerator, target)
- );
- return errPercentageTimes1000000 > 1000;
- }
-
- /// @dev Calculates partial value given a numerator and denominator.
- /// @param numerator Numerator.
- /// @param denominator Denominator.
- /// @param target Value to calculate partial of.
- /// @return Partial value of target.
- function getPartialAmount(uint numerator, uint denominator, uint target)
- public
- constant
- returns (uint)
- {
- return safeDiv(safeMul(numerator, target), denominator);
- }
-
- /// @dev Calculates the sum of values already filled and cancelled for a given order.
- /// @param orderHash The Keccak-256 hash of the given order.
- /// @return Sum of values already filled and cancelled.
- function getUnavailableTakerTokenAmount(bytes32 orderHash)
- public
- constant
- returns (uint)
- {
- return safeAdd(filled[orderHash], cancelled[orderHash]);
- }
-
-
- /*
- * Internal functions
- */
-
- /// @dev Transfers a token using TokenTransferProxy transferFrom function.
- /// @param token Address of token to transferFrom.
- /// @param from Address transfering token.
- /// @param to Address receiving token.
- /// @param value Amount of token to transfer.
- /// @return Success of token transfer.
- function transferViaTokenTransferProxy(
- address token,
- address from,
- address to,
- uint value)
- internal
- returns (bool)
- {
- return TokenTransferProxy(TOKEN_TRANSFER_PROXY_CONTRACT).transferFrom(token, from, to, value);
- }
-
- /// @dev Checks if any order transfers will fail.
- /// @param order Order struct of params that will be checked.
- /// @param fillTakerTokenAmount Desired amount of takerToken to fill.
- /// @return Predicted result of transfers.
- function isTransferable(Order order, uint fillTakerTokenAmount)
- internal
- constant // The called token contracts may attempt to change state, but will not be able to due to gas limits on getBalance and getAllowance.
- returns (bool)
- {
- address taker = msg.sender;
- uint fillMakerTokenAmount = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerTokenAmount);
-
- if (order.feeRecipient != address(0)) {
- bool isMakerTokenZRX = order.makerToken == ZRX_TOKEN_CONTRACT;
- bool isTakerTokenZRX = order.takerToken == ZRX_TOKEN_CONTRACT;
- uint paidMakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.makerFee);
- uint paidTakerFee = getPartialAmount(fillTakerTokenAmount, order.takerTokenAmount, order.takerFee);
- uint requiredMakerZRX = isMakerTokenZRX ? safeAdd(fillMakerTokenAmount, paidMakerFee) : paidMakerFee;
- uint requiredTakerZRX = isTakerTokenZRX ? safeAdd(fillTakerTokenAmount, paidTakerFee) : paidTakerFee;
-
- if ( getBalance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
- || getAllowance(ZRX_TOKEN_CONTRACT, order.maker) < requiredMakerZRX
- || getBalance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
- || getAllowance(ZRX_TOKEN_CONTRACT, taker) < requiredTakerZRX
- ) return false;
-
- if (!isMakerTokenZRX && ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount // Don't double check makerToken if ZRX
- || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount)
- ) return false;
- if (!isTakerTokenZRX && ( getBalance(order.takerToken, taker) < fillTakerTokenAmount // Don't double check takerToken if ZRX
- || getAllowance(order.takerToken, taker) < fillTakerTokenAmount)
- ) return false;
- } else if ( getBalance(order.makerToken, order.maker) < fillMakerTokenAmount
- || getAllowance(order.makerToken, order.maker) < fillMakerTokenAmount
- || getBalance(order.takerToken, taker) < fillTakerTokenAmount
- || getAllowance(order.takerToken, taker) < fillTakerTokenAmount
- ) return false;
-
- return true;
- }
-
- /// @dev Get token balance of an address.
- /// @param token Address of token.
- /// @param owner Address of owner.
- /// @return Token balance of owner.
- function getBalance(address token, address owner)
- internal
- constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
- returns (uint)
- {
- return Token(token).balanceOf.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner); // Limit gas to prevent reentrancy
- }
-
- /// @dev Get allowance of token given to TokenTransferProxy by an address.
- /// @param token Address of token.
- /// @param owner Address of owner.
- /// @return Allowance of token given to TokenTransferProxy by owner.
- function getAllowance(address token, address owner)
- internal
- constant // The called token contract may attempt to change state, but will not be able to due to an added gas limit.
- returns (uint)
- {
- return Token(token).allowance.gas(EXTERNAL_QUERY_GAS_LIMIT)(owner, TOKEN_TRANSFER_PROXY_CONTRACT); // Limit gas to prevent reentrancy
- }
-}
diff --git a/packages/sol-compiler/test/fixtures/contracts/TokenTransferProxy.sol b/packages/sol-compiler/test/fixtures/contracts/TokenTransferProxy.sol
deleted file mode 100644
index 44570d459..000000000
--- a/packages/sol-compiler/test/fixtures/contracts/TokenTransferProxy.sol
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
-
- Copyright 2018 ZeroEx Intl.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-pragma solidity ^0.4.14;
-
-import { Ownable } from "zeppelin-solidity/contracts/ownership/Ownable.sol";
-import { ERC20 as Token } from "zeppelin-solidity/contracts/token/ERC20/ERC20.sol";
-
-/// @title TokenTransferProxy - Transfers tokens on behalf of contracts that have been approved via decentralized governance.
-/// @author Amir Bandeali - <amir@0xProject.com>, Will Warren - <will@0xProject.com>
-contract TokenTransferProxy is Ownable {
-
- /// @dev Only authorized addresses can invoke functions with this modifier.
- modifier onlyAuthorized {
- require(authorized[msg.sender]);
- _;
- }
-
- modifier targetAuthorized(address target) {
- require(authorized[target]);
- _;
- }
-
- modifier targetNotAuthorized(address target) {
- require(!authorized[target]);
- _;
- }
-
- mapping (address => bool) public authorized;
- address[] public authorities;
-
- event LogAuthorizedAddressAdded(address indexed target, address indexed caller);
- event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);
-
- /*
- * Public functions
- */
-
- /// @dev Authorizes an address.
- /// @param target Address to authorize.
- function addAuthorizedAddress(address target)
- public
- onlyOwner
- targetNotAuthorized(target)
- {
- authorized[target] = true;
- authorities.push(target);
- LogAuthorizedAddressAdded(target, msg.sender);
- }
-
- /// @dev Removes authorizion of an address.
- /// @param target Address to remove authorization from.
- function removeAuthorizedAddress(address target)
- public
- onlyOwner
- targetAuthorized(target)
- {
- delete authorized[target];
- for (uint i = 0; i < authorities.length; i++) {
- if (authorities[i] == target) {
- authorities[i] = authorities[authorities.length - 1];
- authorities.length -= 1;
- break;
- }
- }
- LogAuthorizedAddressRemoved(target, msg.sender);
- }
-
- /// @dev Calls into ERC20 Token contract, invoking transferFrom.
- /// @param token Address of token to transfer.
- /// @param from Address to transfer token from.
- /// @param to Address to transfer token to.
- /// @param value Amount of token to transfer.
- /// @return Success of transfer.
- function transferFrom(
- address token,
- address from,
- address to,
- uint value)
- public
- onlyAuthorized
- returns (bool)
- {
- return Token(token).transferFrom(from, to, value);
- }
-
- /*
- * Public constant functions
- */
-
- /// @dev Gets all authorized addresses.
- /// @return Array of authorized addresses.
- function getAuthorizedAddresses()
- public
- constant
- returns (address[])
- {
- return authorities;
- }
-}
diff --git a/packages/sol-compiler/test/fixtures/contracts/base/SafeMath.sol b/packages/sol-compiler/test/fixtures/contracts/base/SafeMath.sol
deleted file mode 100644
index 92ce11cde..000000000
--- a/packages/sol-compiler/test/fixtures/contracts/base/SafeMath.sol
+++ /dev/null
@@ -1,41 +0,0 @@
-pragma solidity ^0.4.14;
-
-contract SafeMath {
- function safeMul(uint a, uint b) internal constant returns (uint256) {
- uint c = a * b;
- assert(a == 0 || c / a == b);
- return c;
- }
-
- function safeDiv(uint a, uint b) internal constant returns (uint256) {
- uint c = a / b;
- return c;
- }
-
- function safeSub(uint a, uint b) internal constant returns (uint256) {
- assert(b <= a);
- return a - b;
- }
-
- function safeAdd(uint a, uint b) internal constant returns (uint256) {
- uint c = a + b;
- assert(c >= a);
- return c;
- }
-
- function max64(uint64 a, uint64 b) internal constant returns (uint64) {
- return a >= b ? a : b;
- }
-
- function min64(uint64 a, uint64 b) internal constant returns (uint64) {
- return a < b ? a : b;
- }
-
- function max256(uint256 a, uint256 b) internal constant returns (uint256) {
- return a >= b ? a : b;
- }
-
- function min256(uint256 a, uint256 b) internal constant returns (uint256) {
- return a < b ? a : b;
- }
-}
diff --git a/packages/sol-compiler/test/fixtures/contracts/base/Token.sol b/packages/sol-compiler/test/fixtures/contracts/base/Token.sol
deleted file mode 100644
index 483010d7d..000000000
--- a/packages/sol-compiler/test/fixtures/contracts/base/Token.sol
+++ /dev/null
@@ -1,38 +0,0 @@
-pragma solidity ^0.4.14;
-
-contract Token {
-
- /// @return total amount of tokens
- function totalSupply() constant returns (uint supply) {}
-
- /// @param _owner The address from which the balance will be retrieved
- /// @return The balance
- function balanceOf(address _owner) constant returns (uint balance) {}
-
- /// @notice send `_value` token to `_to` from `msg.sender`
- /// @param _to The address of the recipient
- /// @param _value The amount of token to be transferred
- /// @return Whether the transfer was successful or not
- function transfer(address _to, uint _value) returns (bool success) {}
-
- /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
- /// @param _from The address of the sender
- /// @param _to The address of the recipient
- /// @param _value The amount of token to be transferred
- /// @return Whether the transfer was successful or not
- function transferFrom(address _from, address _to, uint _value) returns (bool success) {}
-
- /// @notice `msg.sender` approves `_addr` to spend `_value` tokens
- /// @param _spender The address of the account able to transfer the tokens
- /// @param _value The amount of wei to be approved for transfer
- /// @return Whether the approval was successful or not
- function approve(address _spender, uint _value) returns (bool success) {}
-
- /// @param _owner The address of the account owning tokens
- /// @param _spender The address of the account able to transfer the tokens
- /// @return Amount of remaining tokens allowed to spent
- function allowance(address _owner, address _spender) constant returns (uint remaining) {}
-
- event Transfer(address indexed _from, address indexed _to, uint _value);
- event Approval(address indexed _owner, address indexed _spender, uint _value);
-}
diff --git a/packages/sol-compiler/test/fixtures/exchange_bin.ts b/packages/sol-compiler/test/fixtures/exchange_bin.ts
deleted file mode 100644
index 914e76bf5..000000000
--- a/packages/sol-compiler/test/fixtures/exchange_bin.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-export const constructor_args =
- '0x000000000000000000000000e41d2489571d322189246dafa5ebde1f4699f4980000000000000000000000008da0d80f5007ef1e431dd2127178d224e32c2ef4';
-export const exchange_binary =
- '608060405234801561001057600080fd5b50604051604080612d998339810180604052810190808051906020019092919080519060200190929190505050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050612cca806100cf6000396000f3006080604052600436106100fc576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806314df96ee14610101578063288cdc911461015a5780632ac126221461019f578063363349be146101e4578063394c21e7146103f85780633b30ba59146104975780634f150787146104ee578063741bcc931461071b5780637e9abb50146107cf5780638163681e1461081457806398024a8b146108a6578063add1cbc5146108fb578063b7b2c7d614610952578063baa0181d14610b8b578063bc61394a14610cef578063cfc4d0ec14610dc3578063f06bbf7514610e60578063ffa1ad7414610e93575b600080fd5b34801561010d57600080fd5b50610140600480360381019080803590602001909291908035906020019092919080359060200190929190505050610f23565b604051808215151515815260200191505060405180910390f35b34801561016657600080fd5b506101896004803603810190808035600019169060200190929190505050610f7b565b6040518082815260200191505060405180910390f35b3480156101ab57600080fd5b506101ce6004803603810190808035600019169060200190929190505050610f93565b6040518082815260200191505060405180910390f35b3480156101f057600080fd5b506103e260048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b8282101561027257848483905060a00201600580602002604051908101604052809291908260056020028082843782019150505050508152602001906001019061022d565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156102f157848483905060c0020160068060200260405190810160405280929190826006602002808284378201915050505050815260200190600101906102ac565b5050505050919291929080359060200190929190803515159060200190929190803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610fab565b6040518082815260200191505060405180910390f35b34801561040457600080fd5b506104816004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190505050611110565b6040518082815260200191505060405180910390f35b3480156104a357600080fd5b506104ac6115f8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104fa57600080fd5b5061071960048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b8282101561057c57848483905060a002016005806020026040519081016040528092919082600560200280828437820191505050505081526020019060010190610537565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156105fb57848483905060c0020160068060200260405190810160405280929190826006602002808284378201915050505050815260200190600101906105b6565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061161d565b005b34801561072757600080fd5b506107cd6004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190803560ff169060200190929190803560001916906020019092919080356000191690602001909291905050506116da565b005b3480156107db57600080fd5b506107fe60048036038101908080356000191690602001909291905050506116ff565b6040518082815260200191505060405180910390f35b34801561082057600080fd5b5061088c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600019169060200190929190803560ff16906020019092919080356000191690602001909291908035600019169060200190929190505050611748565b604051808215151515815260200191505060405180910390f35b3480156108b257600080fd5b506108e5600480360381019080803590602001909291908035906020019092919080359060200190929190505050611849565b6040518082815260200191505060405180910390f35b34801561090757600080fd5b50610910611867565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561095e57600080fd5b50610b8960048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156109e057848483905060a00201600580602002604051908101604052809291908260056020028082843782019150505050508152602001906001019061099b565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610a5f57848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610a1a565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080351515906020019092919080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061188d565b005b348015610b9757600080fd5b50610ced60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610c1957848483905060a002016005806020026040519081016040528092919082600560200280828437820191505050505081526020019060010190610bd4565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610c9857848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610c53565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929050505061194d565b005b348015610cfb57600080fd5b50610dad6004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c0019060068060200260405190810160405280929190826006602002808284378201915050505050919291929080359060200190929190803515159060200190929190803560ff169060200190929190803560001916906020019092919080356000191690602001909291905050506119c0565b6040518082815260200191505060405180910390f35b348015610dcf57600080fd5b50610e426004803603810190808060a001906005806020026040519081016040528092919082600560200280828437820191505050505091929192908060c00190600680602002604051908101604052809291908260066020028082843782019150505050509192919290505050612160565b60405180826000191660001916815260200191505060405180910390f35b348015610e6c57600080fd5b50610e7561240b565b604051808261ffff1661ffff16815260200191505060405180910390f35b348015610e9f57600080fd5b50610ea8612411565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610ee8578082015181840152602081019050610ecd565b50505050905090810190601f168015610f155780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b600080600084801515610f3257fe5b86850991506000821415610f495760009250610f72565b610f68610f5983620f424061244a565b610f63888761244a565b61247d565b90506103e8811192505b50509392505050565b60026020528060005260406000206000915090505481565b60036020528060005260406000206000915090505481565b6000806000809150600090505b895181101561110057896000815181101515610fd057fe5b906020019060200201516003600581101515610fe857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff168a8281518110151561101157fe5b90602001906020020151600360058110151561102957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1614151561105057600080fd5b6110e4826110df8c8481518110151561106557fe5b906020019060200201518c8581518110151561107d57fe5b906020019060200201516110918d88612498565b8c8c888151811015156110a057fe5b906020019060200201518c898151811015156110b857fe5b906020019060200201518c8a8151811015156110d057fe5b906020019060200201516119c0565b6124b1565b9150878214156110f357611100565b8080600101915050610fb8565b8192505050979650505050505050565b600061111a612bd2565b6000806101606040519081016040528088600060058110151561113957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200188600160058110151561116857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200188600260058110151561119757fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018860036005811015156111c657fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018860046005811015156111f557fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16815260200187600060068110151561122457fe5b6020020151815260200187600160068110151561123d57fe5b6020020151815260200187600260068110151561125657fe5b6020020151815260200187600360068110151561126f57fe5b6020020151815260200187600460068110151561128857fe5b6020020151815260200161129c8989612160565b6000191681525092503373ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161415156112e357600080fd5b60008360a001511180156112fb575060008360c00151115b80156113075750600085115b151561131257600080fd5b8261012001514210151561136f57826101400151600019166000600381111561133757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600093506115ee565b61138a8360c001516113858561014001516116ff565b612498565b915061139685836124cf565b905060008114156113f05782610140015160001916600160038111156113b857fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a3600093506115ee565b61141a600360008561014001516000191660001916815260200190815260200160002054826124b1565b60036000856101400151600019166000191681526020019081526020016000208190555082604001518360600151604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902060001916836080015173ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff167f67d66f160bc93d925d05dae1794c90d2d6d6688b29b84ff069398a9b0458713186604001518760600151611552878a60c001518b60a00151611849565b878a6101400151604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182600019166000191681526020019550505050505060405180910390a48093505b5050509392505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008090505b86518110156116d1576116c4878281518110151561163d57fe5b90602001906020020151878381518110151561165557fe5b90602001906020020151878481518110151561166d57fe5b90602001906020020151878581518110151561168557fe5b90602001906020020151878681518110151561169d57fe5b9060200190602002015187878151811015156116b557fe5b906020019060200201516116da565b8080600101915050611623565b50505050505050565b836116eb87878760008888886119c0565b1415156116f757600080fd5b505050505050565b600061174160026000846000191660001916815260200190815260200160002054600360008560001916600019168152602001908152602001600020546124b1565b9050919050565b600060018560405180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040518091039020858585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015611806573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b600061185e611858858461244a565b8461247d565b90509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008090505b87518110156119435761193588828151811015156118ad57fe5b9060200190602002015188838151811015156118c557fe5b9060200190602002015188848151811015156118dd57fe5b906020019060200201518888868151811015156118f657fe5b90602001906020020151888781518110151561190e57fe5b90602001906020020151888881518110151561192657fe5b906020019060200201516119c0565b508080600101915050611893565b5050505050505050565b60008090505b83518110156119ba576119ac848281518110151561196d57fe5b90602001906020020151848381518110151561198557fe5b90602001906020020151848481518110151561199d57fe5b90602001906020020151611110565b508080600101915050611953565b50505050565b60006119ca612bd2565b600080600080610160604051908101604052808e60006005811015156119ec57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6001600581101515611a1b57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6002600581101515611a4a57fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6003600581101515611a7957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018e6004600581101515611aa857fe5b602002015173ffffffffffffffffffffffffffffffffffffffff1681526020018d6000600681101515611ad757fe5b602002015181526020018d6001600681101515611af057fe5b602002015181526020018d6002600681101515611b0957fe5b602002015181526020018d6003600681101515611b2257fe5b602002015181526020018d6004600681101515611b3b57fe5b60200201518152602001611b4f8f8f612160565b600019168152509450600073ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff161480611bc657503373ffffffffffffffffffffffffffffffffffffffff16856020015173ffffffffffffffffffffffffffffffffffffffff16145b1515611bd157600080fd5b60008560a00151118015611be9575060008560c00151115b8015611bf5575060008b115b1515611c0057600080fd5b611c1685600001518661014001518b8b8b611748565b1515611c2157600080fd5b84610120015142101515611c7e578461014001516000191660006003811115611c4657fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611c998560c00151611c948761014001516116ff565b612498565b9350611ca58b856124cf565b95506000861415611cff578461014001516000191660016003811115611cc757fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611d12868660c001518760a00151610f23565b15611d66578461014001516000191660026003811115611d2e57fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b89158015611d7b5750611d7985876124e8565b155b15611dce5784610140015160001916600380811115611d9657fe5b60ff167f36d86c59e00bd73dc19ba3adfe068e4b64ac7e92be35546adeddf1b956a87e9060405160405180910390a360009550612150565b611de1868660c001518760a00151611849565b9250611e0d600260008761014001516000191660001916815260200190815260200160002054876124b1565b600260008761014001516000191660001916815260200190815260200160002081905550611e45856040015186600001513386612838565b1515611e5057600080fd5b611e64856060015133876000015189612838565b1515611e6f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16856080015173ffffffffffffffffffffffffffffffffffffffff16141515611f6e5760008560e001511115611f0c57611ec9868660c001518760e00151611849565b9150611f006000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660000151876080015185612838565b1515611f0b57600080fd5b5b60008561010001511115611f6d57611f2e868660c00151876101000151611849565b9050611f616000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633876080015184612838565b1515611f6c57600080fd5b5b5b84604001518560600151604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140192505050604051809103902060001916856080015173ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff167f0d0b9391970d9a25552f37d436d2aae2925e2bfe1b2a923754bada030c498cb33389604001518a60600151898d8a8a8f6101400151604051808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200184815260200183815260200182600019166000191681526020019850505050505050505060405180910390a48595505b5050505050979650505050505050565b60003083600060058110151561217257fe5b602002015184600160058110151561218657fe5b602002015185600260058110151561219a57fe5b60200201518660036005811015156121ae57fe5b60200201518760046005811015156121c257fe5b60200201518760006006811015156121d657fe5b60200201518860016006811015156121ea57fe5b60200201518960026006811015156121fe57fe5b60200201518a600360068110151561221257fe5b60200201518b600460068110151561222657fe5b60200201518c600560068110151561223a57fe5b6020020151604051808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018781526020018681526020018581526020018481526020018381526020018281526020019c505050505050505050505050506040518091039020905092915050565b61138781565b6040805190810160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6000808284029050600084148061246b575082848281151561246857fe5b04145b151561247357fe5b8091505092915050565b600080828481151561248b57fe5b0490508091505092915050565b60008282111515156124a657fe5b818303905092915050565b60008082840190508381101515156124c557fe5b8091505092915050565b60008183106124de57816124e0565b825b905092915050565b600080600080600080600080600033975061250c8a8c60c001518d60a00151611849565b9650600073ffffffffffffffffffffffffffffffffffffffff168b6080015173ffffffffffffffffffffffffffffffffffffffff161415156127b9576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b6040015173ffffffffffffffffffffffffffffffffffffffff161495506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168b6060015173ffffffffffffffffffffffffffffffffffffffff161494506126078a8c60c001518d60e00151611849565b935061261d8a8c60c001518d6101000151611849565b92508561262a5783612635565b61263487856124b1565b5b915084612642578261264d565b61264c8a846124b1565b5b90508161267f6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d600001516129ac565b10806126b85750816126b66000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168d60000151612a94565b105b806126ec5750806126ea6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a6129ac565b105b8061272057508061271e6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff168a612a94565b105b1561272e576000985061282a565b8515801561276757508661274a8c604001518d600001516129ac565b10806127665750866127648c604001518d60000151612a94565b105b5b15612775576000985061282a565b841580156127a657508961278d8c606001518a6129ac565b10806127a55750896127a38c606001518a612a94565b105b5b156127b4576000985061282a565b612825565b866127cc8c604001518d600001516129ac565b10806127e85750866127e68c604001518d60000151612a94565b105b806127ff5750896127fd8c606001518a6129ac565b105b806128165750896128148c606001518a612a94565b105b15612824576000985061282a565b5b600198505b505050505050505092915050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea868686866040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b15801561296757600080fd5b505af115801561297b573d6000803e3d6000fd5b505050506040513d602081101561299157600080fd5b81019080805190602001909291905050509050949350505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a0823161138761ffff16846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600088803b158015612a5057600080fd5b5087f1158015612a64573d6000803e3d6000fd5b50505050506040513d6020811015612a7b57600080fd5b8101908080519060200190929190505050905092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e61138761ffff1684600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600088803b158015612b8e57600080fd5b5087f1158015612ba2573d6000803e3d6000fd5b50505050506040513d6020811015612bb957600080fd5b8101908080519060200190929190505050905092915050565b61016060405190810160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160008152602001600081526020016000801916815250905600a165627a7a72305820f91599ebd80f85632ef190bb5e1a738e7288d68a2cf9dcc6b579d76b892dcf6f0029';
diff --git a/packages/sol-compiler/test/util/chai_setup.ts b/packages/sol-compiler/test/util/chai_setup.ts
deleted file mode 100644
index 1a8733093..000000000
--- a/packages/sol-compiler/test/util/chai_setup.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import * as chai from 'chai';
-import chaiAsPromised = require('chai-as-promised');
-import ChaiBigNumber = require('chai-bignumber');
-import * as dirtyChai from 'dirty-chai';
-
-export const chaiSetup = {
- configure(): void {
- chai.config.includeStack = true;
- chai.use(ChaiBigNumber());
- chai.use(dirtyChai);
- chai.use(chaiAsPromised);
- },
-};
diff --git a/packages/sol-compiler/test/util/constants.ts b/packages/sol-compiler/test/util/constants.ts
deleted file mode 100644
index a74ea1b68..000000000
--- a/packages/sol-compiler/test/util/constants.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { BigNumber } from '@0x/utils';
-
-export const constants = {
- networkId: 0,
- optimizerEnabled: false,
- gasPrice: new BigNumber(20000000000),
- timeoutMs: 30000,
- zrxTokenAddress: '0xe41d2489571d322189246dafa5ebde1f4699f498',
- tokenTransferProxyAddress: '0x8da0d80f5007ef1e431dd2127178d224e32c2ef4',
- contracts: '*' as '*',
-};
diff --git a/packages/sol-compiler/test/util/provider.ts b/packages/sol-compiler/test/util/provider.ts
deleted file mode 100644
index 4561a1699..000000000
--- a/packages/sol-compiler/test/util/provider.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { web3Factory } from '@0x/dev-utils';
-import { Provider } from 'ethereum-types';
-
-const providerConfigs = { shouldUseInProcessGanache: true };
-const provider: Provider = web3Factory.getRpcProvider(providerConfigs);
-
-export { provider };
diff --git a/packages/sol-compiler/tsconfig.json b/packages/sol-compiler/tsconfig.json
deleted file mode 100644
index c6ffbb99b..000000000
--- a/packages/sol-compiler/tsconfig.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "extends": "../../tsconfig",
- "compilerOptions": {
- "outDir": "lib",
- "rootDir": ".",
- "strictFunctionTypes": false
- },
- "include": ["./src/**/*", "./test/**/*"]
-}
diff --git a/packages/sol-compiler/tslint.json b/packages/sol-compiler/tslint.json
deleted file mode 100644
index dd9053357..000000000
--- a/packages/sol-compiler/tslint.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "extends": ["@0x/tslint-config"]
-}
diff --git a/packages/sol-compiler/typedoc-tsconfig.json b/packages/sol-compiler/typedoc-tsconfig.json
deleted file mode 100644
index 22897c131..000000000
--- a/packages/sol-compiler/typedoc-tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "extends": "../../typedoc-tsconfig",
- "compilerOptions": {
- "outDir": "lib",
- "strictFunctionTypes": false
- },
- "include": ["./src/**/*", "./test/**/*"]
-}