diff options
Diffstat (limited to 'packages/sol-compiler')
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/**/*"] -} |