From 00e2147371af9923fe321c194e8f873c10457a9b Mon Sep 17 00:00:00 2001 From: ben-chain Date: Tue, 4 Feb 2020 10:41:24 -0500 Subject: [PATCH 01/13] fix timestamp --- .../src/tools/transpiler/static-memory-opcodes.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rollup-dev-tools/src/tools/transpiler/static-memory-opcodes.ts b/packages/rollup-dev-tools/src/tools/transpiler/static-memory-opcodes.ts index 160e8379e38..cf7a07ce1e8 100644 --- a/packages/rollup-dev-tools/src/tools/transpiler/static-memory-opcodes.ts +++ b/packages/rollup-dev-tools/src/tools/transpiler/static-memory-opcodes.ts @@ -104,7 +104,7 @@ export const getTIMESTAMPReplacement = ( return callContractWithStackElementsAndReturnWordToStack( executionManagerAddress, ovmTIMESTAMPFunctionName, - 1, + 0, 1 ) } From 5a93eb09dc198755c4a4dbce06ef46a9e14d4f05 Mon Sep 17 00:00:00 2001 From: Will Meister Date: Tue, 11 Feb 2020 12:45:55 -0600 Subject: [PATCH 02/13] Changing examples package to be more generic (#64) * Changing examples package to be more generic * Updating default exec manager address --- .github/workflows/build-test-lint.yml | 8 +-- .../README.md | 0 .../contracts/Dummy.sol | 0 .../contracts/Dummy2.sol | 0 .../package.json | 14 ++-- .../truffle-config.js | 0 .../waffle-config.json | 2 +- yarn.lock | 66 +++---------------- 8 files changed, 20 insertions(+), 70 deletions(-) rename packages/{wrapped-solc-example => examples}/README.md (100%) rename packages/{wrapped-solc-example => examples}/contracts/Dummy.sol (100%) rename packages/{wrapped-solc-example => examples}/contracts/Dummy2.sol (100%) rename packages/{wrapped-solc-example => examples}/package.json (55%) rename packages/{wrapped-solc-example => examples}/truffle-config.js (100%) rename packages/{wrapped-solc-example => examples}/waffle-config.json (78%) diff --git a/.github/workflows/build-test-lint.yml b/.github/workflows/build-test-lint.yml index 44ff896bd5c..00ed7c98a5d 100644 --- a/.github/workflows/build-test-lint.yml +++ b/.github/workflows/build-test-lint.yml @@ -97,12 +97,12 @@ jobs: path: packages/solc-transpiler/node_modules key: ${{ runner.os }}-${{ matrix.node }}-${{ hashFiles('packages/solc-transpiler/package.json') }} - - name: Cache wrapped-solc-example deps + - name: Cache examples deps uses: actions/cache@v1 - id: cache_wrapped-solc-example + id: cache_examples with: - path: packages/wrapped-solc-example/node_modules - key: ${{ runner.os }}-${{ matrix.node }}-${{ hashFiles('packages/wrapped-solc-example/package.json') }} + path: packages/examples/node_modules + key: ${{ runner.os }}-${{ matrix.node }}-${{ hashFiles('packages/examples/package.json') }} # END DEPENDENCY CACHING diff --git a/packages/wrapped-solc-example/README.md b/packages/examples/README.md similarity index 100% rename from packages/wrapped-solc-example/README.md rename to packages/examples/README.md diff --git a/packages/wrapped-solc-example/contracts/Dummy.sol b/packages/examples/contracts/Dummy.sol similarity index 100% rename from packages/wrapped-solc-example/contracts/Dummy.sol rename to packages/examples/contracts/Dummy.sol diff --git a/packages/wrapped-solc-example/contracts/Dummy2.sol b/packages/examples/contracts/Dummy2.sol similarity index 100% rename from packages/wrapped-solc-example/contracts/Dummy2.sol rename to packages/examples/contracts/Dummy2.sol diff --git a/packages/wrapped-solc-example/package.json b/packages/examples/package.json similarity index 55% rename from packages/wrapped-solc-example/package.json rename to packages/examples/package.json index 770293b4179..b218ea40b0b 100644 --- a/packages/wrapped-solc-example/package.json +++ b/packages/examples/package.json @@ -1,13 +1,13 @@ { - "name": "@eth-optimism/wrapped-solc-example", + "name": "@eth-optimism/examples", "version": "0.0.1-alpha.1", - "description": "Example of using solc-transpiler in place of solc-js", + "description": "Example of using solc-transpiler & Web3 full node in place of solc-js and other Web3 providers", "scripts": { "clean": "rimraf build", - "test:waffle": "mkdir -p build/waffle && waffle waffle-config.json", - "test:truffle": "export EXECUTION_MANAGER_ADDRESS=\"0x0000000000000000000000000000000000000000\" && truffle compile", - "test": "yarn test:waffle && yarn test:truffle", - "all": "yarn clean && yarn test" + "build:truffle": "export EXECUTION_MANAGER_ADDRESS=\"0xA193E42526F1FEA8C99AF609dcEabf30C1c29fAA\" && truffle compile", + "build:waffle": "mkdir -p build/waffle && waffle waffle-config.json", + "build": "yarn build:waffle && yarn build:truffle", + "all": "yarn clean && yarn build" }, "keywords": [ "optimism", @@ -16,7 +16,7 @@ "ethereum", "client" ], - "homepage": "https://github.com/ethereum-optimism/optimism-monorepo/tree/master/packages/wrapped-solc-example#readme", + "homepage": "https://github.com/ethereum-optimism/optimism-monorepo/tree/master/packages/examples#readme", "license": "MIT", "author": "Optimism PBC", "repository": { diff --git a/packages/wrapped-solc-example/truffle-config.js b/packages/examples/truffle-config.js similarity index 100% rename from packages/wrapped-solc-example/truffle-config.js rename to packages/examples/truffle-config.js diff --git a/packages/wrapped-solc-example/waffle-config.json b/packages/examples/waffle-config.json similarity index 78% rename from packages/wrapped-solc-example/waffle-config.json rename to packages/examples/waffle-config.json index bbfb74d13dd..0c1275e2fc4 100644 --- a/packages/wrapped-solc-example/waffle-config.json +++ b/packages/examples/waffle-config.json @@ -9,6 +9,6 @@ "*": ["*"] } }, - "executionManagerAddress": "0x0000000000000000000000000000000000000000" + "executionManagerAddress": "0xA193E42526F1FEA8C99AF609dcEabf30C1c29fAA" } } diff --git a/yarn.lock b/yarn.lock index 61ea5f86b1b..e4d4cde46ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3256,7 +3256,7 @@ debug@3.1.0, debug@=3.1.0: dependencies: ms "2.0.0" -debug@3.2.6, debug@^3.1.0, debug@^3.2.6: +debug@3.2.6, debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -3377,11 +3377,6 @@ deep-equal@~1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - default-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" @@ -3513,11 +3508,6 @@ detect-indent@^5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - dezalgo@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" @@ -5659,7 +5649,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5756,7 +5746,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -7517,15 +7507,6 @@ napi-macros@~2.0.0: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== -needle@^2.2.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.2.tgz#3342dea100b7160960a450dc8c22160ac712a528" - integrity sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -7603,22 +7584,6 @@ node-gyp@^5.0.2: tar "^4.4.12" which "^1.3.1" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -7702,7 +7667,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: semver "^5.6.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.6, npm-packlist@^1.4.4: +npm-packlist@^1.4.4: version "1.4.8" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== @@ -7727,7 +7692,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2, npmlog@^4.1.2: +npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -8602,16 +8567,6 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - read-cmd-shim@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16" @@ -9010,7 +8965,7 @@ retry@^0.10.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -9087,11 +9042,6 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - scrypt-js@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.3.tgz#bb0040be03043da9a012a2cea9fc9f852cfc87d4" @@ -9741,7 +9691,7 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= -strip-json-comments@2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -9887,7 +9837,7 @@ tar@^2.1.1: fstream "^1.0.12" inherits "2" -tar@^4.0.2, tar@^4.4.10, tar@^4.4.12, tar@^4.4.2, tar@^4.4.8: +tar@^4.0.2, tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== From 950e0ab60686c2f3e4ae0f23d87021e0a72bcf33 Mon Sep 17 00:00:00 2001 From: Karl Floersch Date: Tue, 11 Feb 2020 14:11:10 -0500 Subject: [PATCH 03/13] Add executable fullnode (#66) * Add executable fullnode * Add better logging with debug mode * Fix linting bug --- packages/rollup-full-node/package.json | 4 +- packages/rollup-full-node/src/app/handler.ts | 5 +- .../rollup-full-node/src/exec/fullnode.ts | 72 +++++++++++++++++++ 3 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 packages/rollup-full-node/src/exec/fullnode.ts diff --git a/packages/rollup-full-node/package.json b/packages/rollup-full-node/package.json index d5b5844d3f6..a2a682077f9 100644 --- a/packages/rollup-full-node/package.json +++ b/packages/rollup-full-node/package.json @@ -13,7 +13,9 @@ "fix": "prettier --config ../../prettier-config.json --write 'index.ts' '{src,test}/**/*.ts'", "lint": "tslint --format stylish --project .", "test": "waffle waffle-config.json && mocha --require source-map-support/register --require ts-node/register 'test/**/*.spec.ts' --timeout 8000 --exit", - "server": "node ./build/src/exec/aggregator.js" + "server:aggregator": "env DEBUG=\"info:*,error:*\" node ./build/src/exec/aggregator.js", + "server:fullnode": "env DEBUG=\"info:*,error:*\" node ./build/src/exec/fullnode.js", + "server:fullnode:debug": "env DEBUG=\"info:*,error:*,debug:*\" node ./build/src/exec/fullnode.js" }, "keywords": [ "plasma", diff --git a/packages/rollup-full-node/src/app/handler.ts b/packages/rollup-full-node/src/app/handler.ts index e13a2ac5fe3..c3c7fd6e625 100644 --- a/packages/rollup-full-node/src/app/handler.ts +++ b/packages/rollup-full-node/src/app/handler.ts @@ -425,10 +425,7 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { { gasLimit: DEFAULT_ETHNODE_GAS_LIMIT } ) - log.debug( - 'Deployed execution manager to address:', - executionManager.address - ) + log.info('Deployed execution manager to address:', executionManager.address) return executionManager } diff --git a/packages/rollup-full-node/src/exec/fullnode.ts b/packages/rollup-full-node/src/exec/fullnode.ts new file mode 100644 index 00000000000..a4538b82a8e --- /dev/null +++ b/packages/rollup-full-node/src/exec/fullnode.ts @@ -0,0 +1,72 @@ +/* External Imports */ +import { + getLogger, + JsonRpcRequest, + JsonRpcResponse, + logError, + Logger, +} from '@eth-optimism/core-utils' +import cors = require('cors') +import * as fs from 'fs' +import { config, parse } from 'dotenv' + +/* Internal Imports */ +import { + FullnodeRpcServer, + deployOvmContract, + DefaultWeb3Handler, +} from '../app' +import { resolve } from 'path' + +const log: Logger = getLogger('rollup-fullnode') + +const supportedMethodsKey: string = 'supportedJsonRpcMethods' + +const getConfigFilePath = (filename: string): string => { + return resolve(__dirname, `../../../config/${filename}`) +} + +const getConfig = (): {} => { + // Starting from build/src/exec/ + if (!fs.existsSync(getConfigFilePath('.env'))) { + log.debug(`No override config found at 'config/.env'.`) + } else { + config({ path: getConfigFilePath('.env') }) + } + + const defaultFilepath: string = getConfigFilePath('default.json') + if (!fs.existsSync(defaultFilepath)) { + log.error(`No 'default.json' config file found in /config dir`) + process.exit(1) + } + + let defaultConfig: {} + try { + defaultConfig = JSON.parse( + fs.readFileSync(defaultFilepath, { encoding: 'utf8' }) + ) + } catch (e) { + log.error("Invalid JSON in 'config/default.json' config file.") + process.exit(1) + } + + return defaultConfig +} + +const runFullnode = async (): Promise => { + // TODO Get these from config + const host = '0.0.0.0' + const port = 8545 + + const fullnodeHandler = await DefaultWeb3Handler.create() + const fullnodeRpcServer = new FullnodeRpcServer(fullnodeHandler, host, port) + + fullnodeRpcServer.listen() + + const baseUrl = `http://${host}:${port}` + + log.info(`Listening on ${host}:${port}`) +} + +// Start Fullnode +runFullnode() From e756f471fba757c849815d9552eb00bcea40b0c3 Mon Sep 17 00:00:00 2001 From: Will Meister Date: Tue, 11 Feb 2020 19:23:18 -0600 Subject: [PATCH 04/13] Fixing output bytecode to not have 0x prepended (#70) --- packages/solc-transpiler/src/compiler.ts | 10 +++++++--- packages/solc-transpiler/test/wrapper.spec.ts | 5 +++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/solc-transpiler/src/compiler.ts b/packages/solc-transpiler/src/compiler.ts index 5b276e443f9..4b7c97e28bb 100644 --- a/packages/solc-transpiler/src/compiler.ts +++ b/packages/solc-transpiler/src/compiler.ts @@ -14,6 +14,7 @@ import { hexStrToBuf, isValidHexAddress, Logger, + remove0x, } from '@eth-optimism/core-utils' import * as solc from 'solc' @@ -83,10 +84,13 @@ export const compile = (configJsonString: string, callbacks?: any): string => { log.debug(`Transpiled output ${JSON.stringify(output)}`) - res.contracts[filename][contractName].evm.bytecode.object = + res.contracts[filename][contractName].evm.bytecode.object = remove0x( output.bytecode || '' - res.contracts[filename][contractName].evm.deployedBytecode.object = - output.deployedBytecode || '' + ) + res.contracts[filename][ + contractName + ].evm.deployedBytecode.object = remove0x(output.deployedBytecode || '') + if (!!output.errors) { if (!res.errors) { res.errors = [] diff --git a/packages/solc-transpiler/test/wrapper.spec.ts b/packages/solc-transpiler/test/wrapper.spec.ts index f269644fcf0..dded28fc35e 100644 --- a/packages/solc-transpiler/test/wrapper.spec.ts +++ b/packages/solc-transpiler/test/wrapper.spec.ts @@ -12,6 +12,7 @@ import { import { bufToHexString, hexStrToBuf, + remove0x, ZERO_ADDRESS, } from '@eth-optimism/core-utils' import * as path from 'path' @@ -80,8 +81,8 @@ describe('Wrapper tests', () => { 'Cannot evaluate test because transpiling solc bytecode failed.' ) - return bufToHexString( - (transpilationResult as SuccessfulTranspilation).bytecode + return remove0x( + bufToHexString((transpilationResult as SuccessfulTranspilation).bytecode) ) } From 0d9f8442f6ece1c50a8ca9b27b23fc75f177d249 Mon Sep 17 00:00:00 2001 From: Mason Fischer Date: Thu, 13 Feb 2020 09:34:06 -0500 Subject: [PATCH 05/13] Add test for SLOAD and SSTORE shims in the govm (#39) We've forked Geth to intercept calls to the ExecutionManger contract in ethereum-optimism/go-ethereum#1. Add a a test that tests these changes. The test is a copy of the existing simple storage spec with some minor changes. Namely, we don't test that storage events were emitted when ExecutionManager#ovmSSTORE is called because our forked version of Geth doesn't emit events. This also makes a couple changes to test helper file: We pass in the address of the ExecutionManager to manuallyDeployOvmContract instead of the ExecutionManager itself. This allows us to pass in an address of an ExecutionManager that's already been deployed which we need to do in our new test. Replace getTransactionReceipt with waitForTransaction. When we were using the Javascript provider transactions would be mined more-or-less immediately. This means that getTransactionReceipt could be called immediately after sendTransaction and the transaction would be ready. When we're talking to a Geth node this may not be the case. Switching to waitForTransaction allows time for the transaction to be mined. --- packages/ovm/deploy/execution-manager.ts | 5 +- packages/ovm/package.json | 4 +- packages/ovm/test/govm/simple-storage.spec.ts | 128 ++++++++++++++++++ packages/ovm/test/helpers.ts | 19 ++- 4 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 packages/ovm/test/govm/simple-storage.spec.ts diff --git a/packages/ovm/deploy/execution-manager.ts b/packages/ovm/deploy/execution-manager.ts index a6073568a06..9ff9a727276 100644 --- a/packages/ovm/deploy/execution-manager.ts +++ b/packages/ovm/deploy/execution-manager.ts @@ -6,6 +6,7 @@ import { Wallet } from 'ethers' import { deployPurityChecker } from './purity-checker' import * as ExecutionManager from '../build/contracts/ExecutionManager.json' import { resolve } from 'path' +import { GAS_LIMIT, OPCODE_WHITELIST_MASK } from '../src/app' const executionManagerDeploymentFunction = async ( wallet: Wallet @@ -17,8 +18,10 @@ const executionManagerDeploymentFunction = async ( const executionManager = await deployContract( ExecutionManager, wallet, + OPCODE_WHITELIST_MASK, purityCheckerContractAddress, - wallet.address + GAS_LIMIT, + true ) console.log(`Execution Manager deployed to ${executionManager.address}!\n\n`) diff --git a/packages/ovm/package.json b/packages/ovm/package.json index 9f9e96f74b9..38f15cfea08 100644 --- a/packages/ovm/package.json +++ b/packages/ovm/package.json @@ -8,7 +8,8 @@ ], "scripts": { "all": "yarn clean && yarn build && yarn test && yarn fix && yarn lint", - "test": "waffle waffle-config.json && mocha --require source-map-support/register --require ts-node/register 'test/*/*.spec.ts' --timeout 8000 --exit", + "test:govm": "waffle waffle-config.json && mocha --require source-map-support/register --require ts-node/register 'test/govm/*.spec.ts' --timeout 60000 --exit", + "test": "waffle waffle-config.json && mocha --require source-map-support/register --require ts-node/register 'test/contracts/*.spec.ts' --timeout 8000 --exit", "lint": "tslint --format stylish --project . && solium --no-soliumignore -d src/contracts/", "fix": "prettier --config ../../prettier-config.json --write 'index.ts' '{deploy,src,test}/**/*.ts' && solium -d src/contracts --no-soliumignore --fix", "build": "mkdir -p ./build && waffle waffle-config.json && tsc -p .", @@ -55,6 +56,7 @@ "ethereum-waffle": "2.1.0", "ethers": "^4.0.37", "ethlint": "^1.2.5", + "mathjs": "^6.6.0", "merkletreejs": "^0.1.7", "openzeppelin-solidity": "^2.2.0" } diff --git a/packages/ovm/test/govm/simple-storage.spec.ts b/packages/ovm/test/govm/simple-storage.spec.ts new file mode 100644 index 00000000000..065d5079124 --- /dev/null +++ b/packages/ovm/test/govm/simple-storage.spec.ts @@ -0,0 +1,128 @@ +import '../setup' + +/* External Imports */ +import { Address } from '@eth-optimism/rollup-core' +import { createMockProvider, deployContract, getWallets } from 'ethereum-waffle' +import { getLogger, add0x } from '@eth-optimism/core-utils' +import { Contract, ContractFactory, ethers } from 'ethers' +import { TransactionReceipt, JsonRpcProvider } from 'ethers/providers' +import * as ethereumjsAbi from 'ethereumjs-abi' + +/* Contract Imports */ +import * as ExecutionManager from '../../build/contracts/ExecutionManager.json' +import * as SimpleStorage from '../../build/contracts/SimpleStorage.json' + +/* Internal Imports */ +import { + ensureGovmIsConnected, + manuallyDeployOvmContract, + getUnsignedTransactionCalldata, + executeUnsignedEOACall, + DEFAULT_ETHNODE_GAS_LIMIT, +} from '../helpers' +import { + convertInternalLogsToOvmLogs, + CHAIN_ID, + GAS_LIMIT, + OPCODE_WHITELIST_MASK, +} from '../../src/app' + +const log = getLogger('simple-storage', true) + +/********* + * TESTS * + *********/ + +describe('SimpleStorage', () => { + const provider = new JsonRpcProvider() + const [wallet] = getWallets(provider) + // Create pointers to our execution manager & simple storage contract + let executionManager: Contract + let simpleStorage: ContractFactory + let simpleStorageOvmAddress: Address + const setStorageMethodId: string = ethereumjsAbi + .methodID('setStorage', []) + .toString('hex') + const getStorageMethodId: string = ethereumjsAbi + .methodID('getStorage', []) + .toString('hex') + + /* Deploy contracts before each test */ + beforeEach(async () => { + await ensureGovmIsConnected(provider) + // Before each test let's deploy a fresh ExecutionManager and SimpleStorage + // Deploy ExecutionManager the normal way + executionManager = new ethers.Contract( + process.env.EXECUTION_MANAGER_ADDRESS, + ExecutionManager.abi, + wallet + ) + + // Deploy SimpleStorage with the ExecutionManager + simpleStorageOvmAddress = await manuallyDeployOvmContract( + wallet, + provider, + executionManager, + SimpleStorage, + [executionManager.address] + ) + // Also set our simple storage ethers contract so we can generate unsigned transactions + simpleStorage = new ContractFactory( + SimpleStorage.abi as any, // For some reason the ABI type definition is not accepted + SimpleStorage.bytecode + ) + }) + + const setStorage = async (slot, value): Promise => { + const innerCallData: string = add0x(`${setStorageMethodId}${slot}${value}`) + return executeUnsignedEOACall( + executionManager, + wallet, + simpleStorageOvmAddress, + innerCallData + ) + } + + describe('setStorage', async () => { + it('properly sets storage for the contract we expect', async () => { + // create calldata vars + const slot: string = '99'.repeat(32) + const value: string = '01'.repeat(32) + + const reciept = await setStorage(slot, value) + }) + }) + + describe('getStorage', async () => { + it('correctly loads a value after we store it', async () => { + const slot = '99'.repeat(32) + const value = '01'.repeat(32) + const reciept = await setStorage(slot, value) + const innerCallData: string = add0x(`${getStorageMethodId}${slot}`) + const nonce = await executionManager.getOvmContractNonce(wallet.address) + const transaction = { + nonce, + gasLimit: GAS_LIMIT, + gasPrice: 0, + to: simpleStorageOvmAddress, + value: 0, + data: innerCallData, + chainId: CHAIN_ID, + } + const signedMessage = await wallet.sign(transaction) + const [v, r, s] = ethers.utils.RLP.decode(signedMessage).slice(-3) + const callData = getUnsignedTransactionCalldata( + executionManager, + 'executeEOACall', + [0, 0, transaction.nonce, transaction.to, transaction.data, v, r, s] + ) + + const result = await executionManager.provider.call({ + to: executionManager.address, + data: add0x(callData), + gasLimit: 6_700_000, + }) + result.should.equal(add0x(value)) + }) + }) +}) diff --git a/packages/ovm/test/helpers.ts b/packages/ovm/test/helpers.ts index 6662a9eeefb..84eb652217a 100644 --- a/packages/ovm/test/helpers.ts +++ b/packages/ovm/test/helpers.ts @@ -13,7 +13,7 @@ import { } from '@eth-optimism/core-utils' import * as ethereumjsAbi from 'ethereumjs-abi' import { Contract, ContractFactory, Wallet, ethers } from 'ethers' -import { Provider, TransactionReceipt } from 'ethers/providers' +import { Provider, TransactionReceipt, JsonRpcProvider } from 'ethers/providers' import { Transaction } from 'ethers/utils' /* Contract Imports */ @@ -26,6 +26,23 @@ export const DEFAULT_ETHNODE_GAS_LIMIT = 9_000_000 const log = getLogger('helpers', true) +/** + * Helper function to ensure GoVM is connected + */ +export const ensureGovmIsConnected = async (provider: JsonRpcProvider) => { + let connected + try { + connected = (await provider.send('web3_clientVersion', [])).startsWith( + 'govm' + ) + } catch { + connected = false + } + connected.should.be.equal( + true, + 'Govm is not connected. Please run govm as described [here](https://github.com/op-optimism/go-ethereum/blob/master/OPTIMISM_README.md)' + ) +} /** * Helper function for generating initcode based on a contract definition & constructor arguments */ From 64492273279b032b39d7886affaaad6a7df2aaf4 Mon Sep 17 00:00:00 2001 From: Will Meister Date: Thu, 13 Feb 2020 13:46:50 -0600 Subject: [PATCH 06/13] Truffle ERC-20 Example (#69) Working Truffle Example! Note: A small hack is required to get this to work -- documented in `packages/examples/truffle-config.js` Also adds: * Fix for nonces in ExecutionManager.sol * Gas limit fix setting it to the required 9_000_000 vs 5_000_000 in the fullnode * Util for adding padding to strings to make them of a certain length * Optional `add0x` param on `bufToHexStr(...)` * Lock around separate txs that are assumed to be run sequentially in DefaultWeb3Handler Co-authored-by: Mason Fischer --- packages/core-utils/src/app/misc.ts | 30 +- packages/examples/contracts/Dummy.sol | 17 - packages/examples/contracts/Dummy2.sol | 33 -- packages/examples/contracts/TestERC20.sol | 69 +++ packages/examples/package.json | 4 +- packages/examples/truffle-config.js | 48 +- packages/examples/truffle-tests/test-erc20.js | 51 +++ packages/ovm/src/app/constants.ts | 2 +- .../ovm/src/contracts/ExecutionManager.sol | 22 +- .../execution-manager.executeCall.spec.ts | 20 +- .../src/app/fullnode-rpc-server.ts | 1 - packages/rollup-full-node/src/app/handler.ts | 124 ++++-- .../rollup-full-node/src/exec/fullnode.ts | 56 +-- packages/rollup-full-node/src/exec/index.ts | 2 + packages/rollup-full-node/src/index.ts | 1 + .../rollup-full-node/src/types/handler.ts | 14 +- packages/solc-transpiler/src/compiler.ts | 6 + yarn.lock | 410 +++++++++++++++++- 18 files changed, 742 insertions(+), 168 deletions(-) delete mode 100644 packages/examples/contracts/Dummy.sol delete mode 100644 packages/examples/contracts/Dummy2.sol create mode 100644 packages/examples/contracts/TestERC20.sol create mode 100644 packages/examples/truffle-tests/test-erc20.js create mode 100644 packages/rollup-full-node/src/exec/index.ts diff --git a/packages/core-utils/src/app/misc.ts b/packages/core-utils/src/app/misc.ts index 9d730580e94..40ed85a1591 100644 --- a/packages/core-utils/src/app/misc.ts +++ b/packages/core-utils/src/app/misc.ts @@ -90,6 +90,27 @@ export const add0x = (str: string): string => { return str.startsWith('0x') ? str : '0x' + str } +/** + * Pads the provided string left with the provided string until it is the provided length. + * Note: This function accounts for hex strings padding inside of the 0x prefix. + * + * @param str The string to pad. + * @param length The desired resulting string length (excluding 0x prefix). + * @param padString The string to pad with. + * @returns The padded string. + */ +export const padToLength = ( + str: string, + length: number, + padString: string = '0' +): string => { + const base: string = remove0x(str) + const repeat: number = + (length < base.length ? 0 : length - base.length) / padString.length + const padded = padString.repeat(repeat) + base + return base === str ? padded : add0x(padded) +} + /** * Checks if something is an Object * @param obj Thing that might be an Object. @@ -163,11 +184,16 @@ export const hexStrToBuf = (hexString: string): Buffer => { /** * Converts the provided buffer into a hex string. * @param buff The buffer. + * @param prepend0x Whether or not to prepend '0x' to the resulting string. * @returns the hex string. */ -export const bufToHexString = (buff: Buffer): string => { +export const bufToHexString = ( + buff: Buffer, + prepend0x: boolean = true +): string => { const bufStr: string = buff.toString('hex') - return add0x(bufStr.length % 2 === 0 ? bufStr : `0${bufStr}`) + const str: string = bufStr.length % 2 === 0 ? bufStr : `0${bufStr}` + return prepend0x ? add0x(str) : str } /** diff --git a/packages/examples/contracts/Dummy.sol b/packages/examples/contracts/Dummy.sol deleted file mode 100644 index d9ab8f6ac59..00000000000 --- a/packages/examples/contracts/Dummy.sol +++ /dev/null @@ -1,17 +0,0 @@ -pragma solidity ^0.5.0; - -contract Dummy { - bytes32 someState; - - constructor() public { - someState = keccak256("Wooooooo!"); - } - - function getState() public view returns(bytes32) { - return someState; - } - - function updateState(bytes32 newValue) public { - someState = newValue; - } -} \ No newline at end of file diff --git a/packages/examples/contracts/Dummy2.sol b/packages/examples/contracts/Dummy2.sol deleted file mode 100644 index 795df605904..00000000000 --- a/packages/examples/contracts/Dummy2.sol +++ /dev/null @@ -1,33 +0,0 @@ -pragma solidity ^0.5.0; - -contract Dummy2 { - bytes32 someState; - - constructor() public { - someState = keccak256("Derp Derp Derp!"); - } - - function getState() public view returns(bytes32) { - return someState; - } - - function updateState(bytes32 newValue) public { - someState = newValue; - } -} - -contract Dummy3 { - bytes32 someState; - - constructor() public { - someState = keccak256("!!!!!!!!!!!"); - } - - function getState() public view returns(bytes32) { - return someState; - } - - function updateState(bytes32 newValue) public { - someState = newValue; - } -} \ No newline at end of file diff --git a/packages/examples/contracts/TestERC20.sol b/packages/examples/contracts/TestERC20.sol new file mode 100644 index 00000000000..59650cea81f --- /dev/null +++ b/packages/examples/contracts/TestERC20.sol @@ -0,0 +1,69 @@ +/* +Implements ERC20 token standard: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md +.*/ + +pragma solidity ^0.5.16; + +contract TestERC20 { + + uint256 constant private MAX_UINT256 = 2**256 - 1; + mapping (address => uint256) public balances; + mapping (address => mapping (address => uint256)) public allowed; + /* + NOTE: + The following variables are OPTIONAL vanities. One does not have to include them. + They allow one to customise the token contract & in no way influences the core functionality. + Some wallets/interfaces might not even bother to look at this information. + */ + string public name; //fancy name: eg Simon Bucks + uint8 public decimals; //How many decimals to show. + string public symbol; //An identifier: eg SBX + uint256 public totalSupply; + + constructor( + uint256 _initialAmount, + string memory _tokenName, + uint8 _decimalUnits, + string memory _tokenSymbol + ) public { + balances[msg.sender] = _initialAmount; // Give the creator all initial tokens + totalSupply = _initialAmount; // Update total supply + name = _tokenName; // Set the name for display purposes + decimals = _decimalUnits; // Amount of decimals for display purposes + symbol = _tokenSymbol; // Set the symbol for display purposes + } + + function transfer(address _to, uint256 _value) public returns (bool success) { + require(balances[msg.sender] >= _value); + balances[msg.sender] -= _value; + balances[_to] += _value; + // emit Transfer(msg.sender, _to, _value); //solhint-disable-line indent, no-unused-vars + return true; + } + + function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { + uint256 allowance = allowed[_from][msg.sender]; + require(balances[_from] >= _value && allowance >= _value); + balances[_to] += _value; + balances[_from] -= _value; + if (allowance < MAX_UINT256) { + allowed[_from][msg.sender] -= _value; + } + // emit Transfer(_from, _to, _value); //solhint-disable-line indent, no-unused-vars + return true; + } + + function balanceOf(address _owner) public view returns (uint256 balance) { + return balances[_owner]; + } + + function approve(address _spender, uint256 _value) public returns (bool success) { + allowed[msg.sender][_spender] = _value; + // emit Approval(msg.sender, _spender, _value); //solhint-disable-line indent, no-unused-vars + return true; + } + + function allowance(address _owner, address _spender) public view returns (uint256 remaining) { + return allowed[_owner][_spender]; + } +} \ No newline at end of file diff --git a/packages/examples/package.json b/packages/examples/package.json index b218ea40b0b..36d6bee4916 100644 --- a/packages/examples/package.json +++ b/packages/examples/package.json @@ -7,6 +7,7 @@ "build:truffle": "export EXECUTION_MANAGER_ADDRESS=\"0xA193E42526F1FEA8C99AF609dcEabf30C1c29fAA\" && truffle compile", "build:waffle": "mkdir -p build/waffle && waffle waffle-config.json", "build": "yarn build:waffle && yarn build:truffle", + "test:truffle": "export EXECUTION_MANAGER_ADDRESS=\"0xA193E42526F1FEA8C99AF609dcEabf30C1c29fAA\" && truffle test --network fullnode ./truffle-tests/test-erc20.js", "all": "yarn clean && yarn build" }, "keywords": [ @@ -27,7 +28,8 @@ "@eth-optimism/solc-transpiler": "0.0.1-alpha.1", "ethereum-waffle": "2.1.0", "rimraf": "^2.6.3", - "truffle": "^5.1.12" + "truffle": "^5.1.12", + "truffle-hdwallet-provider": "^1.0.17" }, "publishConfig": { "access": "public" diff --git a/packages/examples/truffle-config.js b/packages/examples/truffle-config.js index 10699398ccd..3d9e46a5aa2 100644 --- a/packages/examples/truffle-config.js +++ b/packages/examples/truffle-config.js @@ -1,8 +1,54 @@ -// Note, will need EXECUTION_MANAGER_ADDRESS environment variable set. +const HDWalletProvider = require('truffle-hdwallet-provider'); +// const infuraKey = "fj4jll3k....."; +// +// const fs = require('fs'); +const mnemonic = 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat'; // fs.readFileSync(".secret").toString().trim(); + module.exports = { + /** + * Networks define how you connect to your ethereum client and let you set the + * defaults web3 uses to send transactions. If you don't specify one truffle + * will spin up a development blockchain for you on port 9545 when you + * run `develop` or `test`. You can ask a truffle command to use a specific + * network from the command line, e.g + * + * $ truffle test --network fullnode ./truffle-tests/test-erc20.js + */ + + networks: { + // Note: Requires running the rollup-full-node locally. + fullnode: { + network_id: 108, + provider: function() { + const wallet = new HDWalletProvider(mnemonic, "http://127.0.0.1:8545/", 0, 10); + + const sendAsync = wallet.sendAsync + + wallet.sendAsync = function (...args) { + if (args[0].method === 'eth_sendTransaction') { + // HACK TO PROPERLY SET CHAIN ID + args[0].params[0].chainId = 108 + } + sendAsync.apply(this, args) + }; + + return wallet; + }, + gasPrice: 0, + gas: 9000000, + }, + }, + + // Set default mocha options here, use special reporters etc. + mocha: { + timeout: 100000 + }, + + compilers: { solc: { // Add path to the solc-transpiler + // TODO: will need EXECUTION_MANAGER_ADDRESS environment variable set. version: "../../node_modules/@eth-optimism/solc-transpiler", } } diff --git a/packages/examples/truffle-tests/test-erc20.js b/packages/examples/truffle-tests/test-erc20.js new file mode 100644 index 00000000000..d51c3e17895 --- /dev/null +++ b/packages/examples/truffle-tests/test-erc20.js @@ -0,0 +1,51 @@ +const TestERC20 = artifacts.require("TestERC20"); + +// TODO: Run `yarn server:fullnode` in rollup-full-node before executing this test +contract('TestERC20', accounts => { + const account = accounts[0]; + const account2 = accounts[1]; + const initialValue = 100000000; + const transferValue = 2000; + let erc20; + + beforeEach(async () => { + // Deploy a fresh contract every test + erc20 = await TestERC20.new(initialValue, 'Test Token', 100, 'TEST', {from: account}); + }) + + it('gets total supply', async () => { + const totalSupply = await erc20.totalSupply.call(); + assert.equal(totalSupply, initialValue, 'Total supply mismatch!'); + }) + + it('gets balance of main account', async () => { + const balance = await erc20.balanceOf.call(account); + assert.equal(balance, initialValue, 'Sender balance mismatch!'); + }) + + it('gets 0 balance of second account', async () => { + const balance = await erc20.balanceOf.call(account2); + assert.equal(balance, 0, 'Second account balance mismatch!'); + }) + + it('transfers from account 1 to account 2', async () => { + await erc20.transfer(account2, transferValue, {from: account}); + + const accountBalance = await erc20.balanceOf.call(account); + assert.equal(accountBalance, initialValue - transferValue, 'Account balance mismatch after transfer!'); + + const account2Balance = await erc20.balanceOf.call(account2); + assert.equal(account2Balance, transferValue, 'Account balance mismatch after transfer!'); + }) + + it('transfers from account 1 to account 2 and then back', async () => { + await erc20.transfer(account2, transferValue, {from: account}); + await erc20.transfer(account, transferValue, {from: account2}); + + const accountBalance = await erc20.balanceOf.call(account); + assert.equal(accountBalance, initialValue, 'Account balance mismatch after transfer!'); + + const account2Balance = await erc20.balanceOf.call(account2); + assert.equal(account2Balance, 0, 'Account balance mismatch after transfer!'); + }) +}); \ No newline at end of file diff --git a/packages/ovm/src/app/constants.ts b/packages/ovm/src/app/constants.ts index 630b06f657b..44e90d29578 100644 --- a/packages/ovm/src/app/constants.ts +++ b/packages/ovm/src/app/constants.ts @@ -1,7 +1,7 @@ import { ZERO_ADDRESS } from '@eth-optimism/core-utils' export const CREATOR_CONTRACT_ADDRESS = ZERO_ADDRESS -export const GAS_LIMIT = 5_000_000 +export const GAS_LIMIT = 9_000_000 export const CHAIN_ID = 108 export const OPCODE_WHITELIST_MASK = '0x600a0000000000000000001fffffffffffffffff0fcf000063f000013fff0fff' diff --git a/packages/ovm/src/contracts/ExecutionManager.sol b/packages/ovm/src/contracts/ExecutionManager.sol index 90e1a3b917c..921d1b23e76 100644 --- a/packages/ovm/src/contracts/ExecutionManager.sol +++ b/packages/ovm/src/contracts/ExecutionManager.sol @@ -215,25 +215,23 @@ contract ExecutionManager is FullStateManager { } else { methodId = ovmCallMethodId; callSize = _callBytes.length + 32 + 4; + // Creates will get incremented, but calls need to be as well! + incrementOvmContractNonce(_fromAddress); } assembly { - if eq(isCreate, 0) { - _callBytes := sub(_callBytes, 4) - mstore8(_callBytes, shr(24, methodId)) - mstore8(add(_callBytes, 1), shr(16, methodId)) - mstore8(add(_callBytes, 2), shr(8, methodId)) - mstore8(add(_callBytes, 3), methodId) - // And now set the ovmEntrypoint - mstore(add(_callBytes, 4), _ovmEntrypoint) - } - if eq(isCreate, 1) { - _callBytes := add(_callBytes, 28) + if eq(isCreate, 0) { + _callBytes := sub(_callBytes, 4) + // And now set the ovmEntrypoint + mstore(add(_callBytes, 4), _ovmEntrypoint) + } + if eq(isCreate, 1) { + _callBytes := add(_callBytes, 28) + } mstore8(_callBytes, shr(24, methodId)) mstore8(add(_callBytes, 1), shr(16, methodId)) mstore8(add(_callBytes, 2), shr(8, methodId)) mstore8(add(_callBytes, 3), methodId) - } } address addr = address(this); diff --git a/packages/ovm/test/contracts/execution-manager.executeCall.spec.ts b/packages/ovm/test/contracts/execution-manager.executeCall.spec.ts index a9d6de59130..808d86e6cab 100644 --- a/packages/ovm/test/contracts/execution-manager.executeCall.spec.ts +++ b/packages/ovm/test/contracts/execution-manager.executeCall.spec.ts @@ -2,7 +2,13 @@ import '../setup' /* External Imports */ import { Address } from '@eth-optimism/rollup-core' -import { getLogger, ZERO_ADDRESS } from '@eth-optimism/core-utils' +import { + add0x, + getLogger, + padToLength, + remove0x, + ZERO_ADDRESS, +} from '@eth-optimism/core-utils' import { Contract, ContractFactory, ethers } from 'ethers' import { createMockProvider, deployContract, getWallets } from 'ethereum-waffle' @@ -136,9 +142,9 @@ describe('Execution Manager -- Call opcodes', () => { transaction.nonce, transaction.to, transaction.data, - v, - r, - s + padToLength(v, 4), + padToLength(r, 64), + padToLength(s, 64) ) await provider.waitForTransaction(tx.hash) }) @@ -172,9 +178,9 @@ describe('Execution Manager -- Call opcodes', () => { transaction.nonce, transaction.to, transaction.data, - v, - r, - s + padToLength(v, 4), + padToLength(r, 64), + padToLength(s, 64) ) await provider.waitForTransaction(tx.hash) }) diff --git a/packages/rollup-full-node/src/app/fullnode-rpc-server.ts b/packages/rollup-full-node/src/app/fullnode-rpc-server.ts index 16394367fa2..e73de886be1 100644 --- a/packages/rollup-full-node/src/app/fullnode-rpc-server.ts +++ b/packages/rollup-full-node/src/app/fullnode-rpc-server.ts @@ -27,7 +27,6 @@ export class FullnodeRpcServer extends ExpressHttpServer { /** * Creates the Fullnode RPC server * - * @param supportedMethods The JSON RPC methods supported by this server * @param fullnodeHandler The fullnodeHandler that will fulfill requests * @param port Port to listen on. * @param hostname Hostname to listen on. diff --git a/packages/rollup-full-node/src/app/handler.ts b/packages/rollup-full-node/src/app/handler.ts index c3c7fd6e625..e2e53347fc0 100644 --- a/packages/rollup-full-node/src/app/handler.ts +++ b/packages/rollup-full-node/src/app/handler.ts @@ -14,10 +14,12 @@ import { OPCODE_WHITELIST_MASK, } from '@eth-optimism/ovm' -import { Contract, utils, Wallet } from 'ethers' +import { Contract, ethers, utils, Wallet } from 'ethers' import { Web3Provider } from 'ethers/providers' import { createMockProvider, deployContract, getWallets } from 'ethereum-waffle' +import AsyncLock from 'async-lock' + /* Internal Imports */ import { DEFAULT_ETHNODE_GAS_LIMIT } from '.' import { @@ -30,9 +32,13 @@ import { const log = getLogger('web3-handler') +const lockKey: string = 'LOCK' + const latestBlock: string = 'latest' export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { + private lock: AsyncLock + /** * Creates a local node, deploys the L2ExecutionManager to it, and returns a * Web3Handler that handles Web3 requests to it. @@ -59,7 +65,9 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { private readonly provider: Web3Provider, private readonly wallet: Wallet, private readonly executionManager: Contract - ) {} + ) { + this.lock = new AsyncLock() + } /** * Handles generic Web3 requests. @@ -71,10 +79,14 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { * @throws If the method is not supported or request is improperly formatted. */ public async handleRequest(method: string, params: any[]): Promise { - log.debug(`Handling request, method: [${method}], params: [${params}]`) + log.debug( + `Handling request, method: [${method}], params: [${JSON.stringify( + params + )}]` + ) // Make sure the method is available - let response: string + let response: any let args: any[] switch (method) { case Web3RpcMethods.blockNumber: @@ -93,6 +105,10 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { this.assertParameters(params, 0) response = await this.gasPrice() break + case Web3RpcMethods.getBlockByNumber: + args = this.assertParameters(params, 2) + response = await this.getBlockByNumber(args[0], args[1]) + break case Web3RpcMethods.getCode: args = this.assertParameters(params, 2, latestBlock) response = await this.getCode(args[0], args[1]) @@ -101,6 +117,10 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { this.assertParameters(params, 0) response = await this.getExecutionManagerAddress() break + case Web3RpcMethods.getLogs: + args = this.assertParameters(params, 1) + response = await this.getLogs([0]) + break case Web3RpcMethods.getTransactionCount: args = this.assertParameters(params, 2, latestBlock) response = await this.getTransactionCount(args[0], args[1]) @@ -118,13 +138,17 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { response = await this.networkVersion() break default: - const msg: string = `Method / params [${method} / ${params}] is not supported by this Web3 handler!` + const msg: string = `Method / params [${method} / ${JSON.stringify( + params + )}] is not supported by this Web3 handler!` log.error(msg) throw new UnsupportedMethodError(msg) } log.debug( - `Request: method [${method}], params: [${params}], got result: [${response}]` + `Request: method [${method}], params: [${JSON.stringify( + params + )}], got result: [${JSON.stringify(response)}]` ) return response } @@ -212,6 +236,23 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { return '0x0' } + public async getBlockByNumber( + defaultBlock: string, + fullObjects: boolean + ): Promise { + log.debug(`Got request to get block ${defaultBlock}.`) + const res: string = await this.provider.send( + Web3RpcMethods.getBlockByNumber, + [defaultBlock, fullObjects] + ) + log.debug( + `Returning block ${defaultBlock} (fullObj: ${fullObjects}): ${JSON.stringify( + res + )}` + ) + return res + } + public async getCode( address: Address, defaultBlock: string @@ -240,6 +281,13 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { return this.executionManager.address } + public async getLogs(filter: any): Promise { + log.debug(`Requesting logs with filter [${JSON.stringify(filter)}].`) + const res = await this.provider.send(Web3RpcMethods.getLogs, filter) + log.debug(`Log result: [${res}], filter: [${JSON.stringify(filter)}].`) + return res + } + public async getTransactionCount( address: Address, defaultBlock: string @@ -265,6 +313,7 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { Web3RpcMethods.getTransactionReceipt, [internalTxHash] ) + // Now let's parse the internal transaction reciept const ovmTxReceipt = await this.internalTxReceiptToOvmTxReceipt( internalTxReceipt @@ -285,31 +334,34 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { } public async sendRawTransaction(rawOvmTx: string): Promise { - log.debug('Sending raw transaction with params:', rawOvmTx) - // Convert the OVM transaction into an "internal" tx which we can use for our execution manager - const internalTx = await this.ovmTxToInternalTx(rawOvmTx) - // Now compute the hash of the OVM transaction which we will return - const ovmTxHash = await utils.keccak256(rawOvmTx) - const internalTxHash = await utils.keccak256(internalTx) - - // Make sure we have a way to look up our internal tx hash from the ovm tx hash. - await this.mapOvmTxHashToInternalTxHash(ovmTxHash, internalTxHash) - - // Then apply our transaction - const returnedInternalTxHash = await this.provider.send( - Web3RpcMethods.sendRawTransaction, - internalTx - ) + // lock here because the mapOmTxHash... tx and the sendRawTransaction tx need to be in order because of nonces. + return this.lock.acquire(lockKey, async () => { + log.debug('Sending raw transaction with params:', rawOvmTx) + // Convert the OVM transaction into an "internal" tx which we can use for our execution manager + const internalTx = await this.ovmTxToInternalTx(rawOvmTx) + // Now compute the hash of the OVM transaction which we will return + const ovmTxHash = await utils.keccak256(rawOvmTx) + const internalTxHash = await utils.keccak256(internalTx) + + // Make sure we have a way to look up our internal tx hash from the ovm tx hash. + await this.mapOvmTxHashToInternalTxHash(ovmTxHash, internalTxHash) + + // Then apply our transaction + const returnedInternalTxHash = await this.provider.send( + Web3RpcMethods.sendRawTransaction, + internalTx + ) - if (remove0x(internalTxHash) !== remove0x(returnedInternalTxHash)) { - const msg: string = `Interal Transaction hashes do not match for OVM Hash: [${ovmTxHash}]. Calculated: [${internalTxHash}], returned from tx: [${returnedInternalTxHash}]` - log.error(msg) - throw Error(msg) - } + if (remove0x(internalTxHash) !== remove0x(returnedInternalTxHash)) { + const msg: string = `Internal Transaction hashes do not match for OVM Hash: [${ovmTxHash}]. Calculated: [${internalTxHash}], returned from tx: [${returnedInternalTxHash}]` + log.error(msg) + throw Error(msg) + } - log.debug(`Completed send raw tx [${rawOvmTx}]. Response: [${ovmTxHash}]`) - // Return the *OVM* tx hash. We can do this because we store a mapping to the ovmTxHashs in the EM contract. - return ovmTxHash + log.debug(`Completed send raw tx [${rawOvmTx}]. Response: [${ovmTxHash}]`) + // Return the *OVM* tx hash. We can do this because we store a mapping to the ovmTxHashs in the EM contract. + return ovmTxHash + }) } /** @@ -340,7 +392,11 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { private async ovmTxToInternalTx(rawOvmTx: string): Promise { // Decode the OVM transaction -- this will be used to construct our internal transaction const ovmTx = utils.parseTransaction(rawOvmTx) - log.debug(`OVM Transaction being parsed ${JSON.stringify(ovmTx)}`) + log.debug( + `OVM Transaction being parsed ${rawOvmTx}, parsed: ${JSON.stringify( + ovmTx + )}` + ) // Verify that the transaction is not accidentally sending to the ZERO_ADDRESS if (ovmTx.to === ZERO_ADDRESS) { throw new Error('Sending to Zero Address disallowed') @@ -372,6 +428,8 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { ovmTx.s ) + log.debug(`EOA calldata: [${internalCalldata}]`) + const internalTx = { nonce, gasLimit: ovmTx.gasLimit, @@ -379,6 +437,7 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { to: this.executionManager.address, value: 0, data: internalCalldata, + chainId: 108, } log.debug('The internal tx:', internalTx) return this.wallet.sign(internalTx) @@ -460,6 +519,11 @@ export class DefaultWeb3Handler implements Web3Handler, FullnodeHandler { if (ovmEntrypoint === null || ovmEntrypoint === undefined) { ovmEntrypoint = ZERO_ADDRESS } + + log.debug( + `Generating EOA Calldata: v: [${v}], r: [${r}], s: [${s}], nonce: [${nonce}] entrypoint: [${ovmEntrypoint}], callBytes: [${callBytes}]` + ) + return this.executionManager.interface.functions['executeEOACall'].encode([ timestamp, queueOrigin, diff --git a/packages/rollup-full-node/src/exec/fullnode.ts b/packages/rollup-full-node/src/exec/fullnode.ts index a4538b82a8e..d13a0e0504f 100644 --- a/packages/rollup-full-node/src/exec/fullnode.ts +++ b/packages/rollup-full-node/src/exec/fullnode.ts @@ -1,59 +1,12 @@ /* External Imports */ -import { - getLogger, - JsonRpcRequest, - JsonRpcResponse, - logError, - Logger, -} from '@eth-optimism/core-utils' -import cors = require('cors') -import * as fs from 'fs' -import { config, parse } from 'dotenv' +import { getLogger, Logger } from '@eth-optimism/core-utils' /* Internal Imports */ -import { - FullnodeRpcServer, - deployOvmContract, - DefaultWeb3Handler, -} from '../app' -import { resolve } from 'path' +import { FullnodeRpcServer, DefaultWeb3Handler } from '../app' const log: Logger = getLogger('rollup-fullnode') -const supportedMethodsKey: string = 'supportedJsonRpcMethods' - -const getConfigFilePath = (filename: string): string => { - return resolve(__dirname, `../../../config/${filename}`) -} - -const getConfig = (): {} => { - // Starting from build/src/exec/ - if (!fs.existsSync(getConfigFilePath('.env'))) { - log.debug(`No override config found at 'config/.env'.`) - } else { - config({ path: getConfigFilePath('.env') }) - } - - const defaultFilepath: string = getConfigFilePath('default.json') - if (!fs.existsSync(defaultFilepath)) { - log.error(`No 'default.json' config file found in /config dir`) - process.exit(1) - } - - let defaultConfig: {} - try { - defaultConfig = JSON.parse( - fs.readFileSync(defaultFilepath, { encoding: 'utf8' }) - ) - } catch (e) { - log.error("Invalid JSON in 'config/default.json' config file.") - process.exit(1) - } - - return defaultConfig -} - -const runFullnode = async (): Promise => { +export const runFullnode = async (): Promise => { // TODO Get these from config const host = '0.0.0.0' const port = 8545 @@ -64,8 +17,7 @@ const runFullnode = async (): Promise => { fullnodeRpcServer.listen() const baseUrl = `http://${host}:${port}` - - log.info(`Listening on ${host}:${port}`) + log.info(`Listening at ${baseUrl}`) } // Start Fullnode diff --git a/packages/rollup-full-node/src/exec/index.ts b/packages/rollup-full-node/src/exec/index.ts new file mode 100644 index 00000000000..772e98f3595 --- /dev/null +++ b/packages/rollup-full-node/src/exec/index.ts @@ -0,0 +1,2 @@ +export * from './aggregator' +export * from './fullnode' diff --git a/packages/rollup-full-node/src/index.ts b/packages/rollup-full-node/src/index.ts index c88cbf1e5b8..20254307c10 100644 --- a/packages/rollup-full-node/src/index.ts +++ b/packages/rollup-full-node/src/index.ts @@ -1,2 +1,3 @@ export * from './app' +export * from './exec' export * from './types' diff --git a/packages/rollup-full-node/src/types/handler.ts b/packages/rollup-full-node/src/types/handler.ts index 277f9a59137..8bb159c0507 100644 --- a/packages/rollup-full-node/src/types/handler.ts +++ b/packages/rollup-full-node/src/types/handler.ts @@ -13,8 +13,10 @@ export interface Web3Handler { call(callObj: {}, defaultBlock: string): Promise estimateGas(txObject: {}, defaultBlock: string): Promise gasPrice(): Promise + getBlockByNumber(defaultBlock: string, fullObjects: boolean): Promise getCode(address: Address, defaultBlock: string): Promise getExecutionManagerAddress() + getLogs(filter: any): Promise getTransactionCount(address: Address, defaultBlock: string): Promise getTransactionReceipt(txHash: string): Promise networkVersion(): Promise @@ -23,14 +25,16 @@ export interface Web3Handler { // Enum of supported web3 rpc methods export enum Web3RpcMethods { - getTransactionCount = 'eth_getTransactionCount', - sendRawTransaction = 'eth_sendRawTransaction', - call = 'eth_call', - getTransactionReceipt = 'eth_getTransactionReceipt', blockNumber = 'eth_blockNumber', - gasPrice = 'eth_gasPrice', + call = 'eth_call', estimateGas = 'eth_estimateGas', + gasPrice = 'eth_gasPrice', + getBlockByNumber = 'eth_getBlockByNumber', getCode = 'eth_getCode', getExecutionManagerAddress = 'ovm_getExecutionManagerAddress', + getLogs = 'eth_getLogs', + getTransactionCount = 'eth_getTransactionCount', + getTransactionReceipt = 'eth_getTransactionReceipt', networkVersion = 'net_version', + sendRawTransaction = 'eth_sendRawTransaction', } diff --git a/packages/solc-transpiler/src/compiler.ts b/packages/solc-transpiler/src/compiler.ts index 4b7c97e28bb..ca96344aad7 100644 --- a/packages/solc-transpiler/src/compiler.ts +++ b/packages/solc-transpiler/src/compiler.ts @@ -84,6 +84,12 @@ export const compile = (configJsonString: string, callbacks?: any): string => { log.debug(`Transpiled output ${JSON.stringify(output)}`) + res.contracts[filename][contractName].evm.bytecode.object = remove0x( + output.bytecode || '' + ) + res.contracts[filename][ + contractName + ].evm.deployedBytecode.object = remove0x(output.deployedBytecode || '') res.contracts[filename][contractName].evm.bytecode.object = remove0x( output.bytecode || '' ) diff --git a/yarn.lock b/yarn.lock index e4d4cde46ef..26d2ecb8fad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,6 +18,84 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@eth-optimism/core-db@0.0.1-alpha.8": + version "0.0.1-alpha.8" + resolved "https://registry.yarnpkg.com/@eth-optimism/core-db/-/core-db-0.0.1-alpha.8.tgz#7f38f11b495853d02e0a8cab50ff76cb17fbd409" + integrity sha512-rR+EtW/zcjNL8TxN3wTc+jEgk5IsymZKhQ+CVWuc569ht0tlXKZ6ByS4CWWcrWEgu9qOHvJTYu+1MMw8kb9wBQ== + dependencies: + "@eth-optimism/core-utils" "0.0.1-alpha.8" + abstract-leveldown "^6.2.2" + async-lock "^1.2.2" + chai "^4.2.0" + chai-as-promised "^7.1.1" + debug "^4.1.1" + ethers "^4.0.39" + level "^6.0.0" + memdown "^4.0.0" + +"@eth-optimism/core-utils@0.0.1-alpha.8": + version "0.0.1-alpha.8" + resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.0.1-alpha.8.tgz#54965ec9c4c1eecbf49cb074da9e2d8b20dad9ae" + integrity sha512-DKYjj4sde6B3wtNTfME0XelvUz0mvqjilzPiooNg2+NMTufHIHr+TEQhwdI5kHHTBlozIeLg7l8uK0iJnkIOcQ== + dependencies: + abstract-leveldown "^6.2.2" + async-lock "^1.2.2" + axios "^0.19.0" + bn.js "^4.11.8" + body-parser "^1.19.0" + chai "^4.2.0" + chai-as-promised "^7.1.1" + debug "^4.1.1" + dotenv "^8.2.0" + ethers "^4.0.37" + express "^4.17.1" + memdown "^4.0.0" + ts-md5 "^1.2.4" + uuid "^3.3.3" + +"@eth-optimism/ovm@0.0.1-alpha.8": + version "0.0.1-alpha.8" + resolved "https://registry.yarnpkg.com/@eth-optimism/ovm/-/ovm-0.0.1-alpha.8.tgz#14e8f6af3adcf83f908a286ed2385178de600c3b" + integrity sha512-DAGVmC+CqpK5weqcgDVOMKCVK4FF3mbZp4zhykcRj6VrRAuJMk/MQ6uGrVig5zXagKkNR+WdmgfJrTJs8HRoGQ== + dependencies: + "@eth-optimism/core-db" "0.0.1-alpha.8" + "@eth-optimism/core-utils" "0.0.1-alpha.8" + "@eth-optimism/rollup-core" "0.0.1-alpha.8" + "@types/sinon-chai" "^3.2.2" + chai "^4.2.0" + ethereum-waffle "2.1.0" + ethers "^4.0.37" + ethlint "^1.2.5" + merkletreejs "^0.1.7" + openzeppelin-solidity "^2.2.0" + +"@eth-optimism/rollup-core@0.0.1-alpha.8": + version "0.0.1-alpha.8" + resolved "https://registry.yarnpkg.com/@eth-optimism/rollup-core/-/rollup-core-0.0.1-alpha.8.tgz#591793246f2c057e5a7ddd316c0764c397f566c0" + integrity sha512-+4Rr4NzWo36SHaX5214AvuaDs+qdoKKxPwjlI32u8bMxe9o+Lc6bfKlE/40P6IBc5cbqU5FTZiFJRxIw5daSEA== + dependencies: + "@eth-optimism/core-db" "0.0.1-alpha.8" + "@eth-optimism/core-utils" "0.0.1-alpha.8" + async-lock "^1.2.2" + ethers "^4.0.39" + +"@eth-optimism/rollup-full-node@^0.0.1-alpha.8": + version "0.0.1-alpha.8" + resolved "https://registry.yarnpkg.com/@eth-optimism/rollup-full-node/-/rollup-full-node-0.0.1-alpha.8.tgz#dbe6e57480844b01fd9ab7b6b077b8059c74c96d" + integrity sha512-fJWC05qt13cqCo4VkA8/8SpcgvADnAGOZGcyyYGxnAvTNzXRvBFeTMW5woZl5UX8FLOyHPyLUewY0/mVBeQ3BA== + dependencies: + "@eth-optimism/core-db" "0.0.1-alpha.8" + "@eth-optimism/core-utils" "0.0.1-alpha.8" + "@eth-optimism/ovm" "0.0.1-alpha.8" + "@eth-optimism/rollup-core" "0.0.1-alpha.8" + async-lock "^1.2.2" + axios "^0.19.0" + cors "^2.8.5" + dotenv "^8.2.0" + ethereum-waffle "2.1.0" + ethers "^4.0.39" + fastpriorityqueue "^0.6.3" + "@evocateur/libnpmaccess@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845" @@ -2137,7 +2215,7 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== -bindings@^1.2.1, bindings@^1.5.0: +bindings@^1.2.1, bindings@^1.3.1, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== @@ -2904,6 +2982,11 @@ compare-func@^1.3.1: array-ify "^1.0.0" dot-prop "^3.0.0" +complex.js@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/complex.js/-/complex.js-2.0.11.tgz#09a873fbf15ffd8c18c9c2201ccef425c32b8bf1" + integrity sha512-6IArJLApNtdg1P1dFtn3dnyzoZBEF0MwMnrfF1exSBRpZYoy4yieMkpZhQDC0uwctw48vii0CFVyHfpgZ/DfGw== + component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -3288,6 +3371,11 @@ decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decimal.js@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231" + integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -3814,6 +3902,11 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escape-latex@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/escape-latex/-/escape-latex-1.2.0.tgz#07c03818cf7dac250cce517f4fda1b001ef2bca1" + integrity sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw== + escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -4811,6 +4904,11 @@ forwarded@~0.1.2: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +fraction.js@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.0.12.tgz#0526d47c65a5fb4854df78bc77f7bec708d7b8c3" + integrity sha512-8Z1K0VTG4hzYY7kA/1sj4/r1/RWLBD3xwReT/RCrUCbzPszjNQCCsy3ktkU/eaEqX3MYa4pY37a52eiBlPMlhA== + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -6196,6 +6294,11 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" +javascript-natural-sort@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + integrity sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k= + jest-docblock@^21.0.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" @@ -6989,6 +7092,20 @@ math-random@^1.0.1: resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== +mathjs@^6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/mathjs/-/mathjs-6.6.0.tgz#0d71c7cc6b50bd112e160b55703a395caf4db4b1" + integrity sha512-gYYc1+irFbwuwYUx6O8G2YauvbD1+tPBbq829PaxAiRWpPzPEE8pvwGgvdMuk6c3pqhm6Do/mN26vLiQP46H5A== + dependencies: + complex.js "^2.0.11" + decimal.js "^10.2.0" + escape-latex "^1.2.0" + fraction.js "^4.0.12" + javascript-natural-sort "^0.7.1" + seed-random "^2.2.0" + tiny-emitter "^2.1.0" + typed-function "^1.1.1" + md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -9076,6 +9193,11 @@ scrypt@^6.0.2: dependencies: nan "^2.0.8" +scryptsy@2.1.0, scryptsy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" + integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== + scryptsy@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" @@ -9083,11 +9205,6 @@ scryptsy@^1.2.1: dependencies: pbkdf2 "^3.0.3" -scryptsy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" - integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== - secp256k1@^3.0.1: version "3.8.0" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" @@ -9102,6 +9219,11 @@ secp256k1@^3.0.1: nan "^2.14.0" safe-buffer "^5.1.2" +seed-random@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/seed-random/-/seed-random-2.2.0.tgz#2a9b19e250a817099231a5b99a4daf80b7fbed54" + integrity sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ= + seedrandom@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.1.tgz#eb3dde015bcf55df05a233514e5df44ef9dce083" @@ -9131,6 +9253,11 @@ semver-greatest-satisfied-range@^1.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" + integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== + semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -9934,6 +10061,11 @@ timed-out@^4.0.0, timed-out@^4.0.1: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= +tiny-emitter@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -10048,6 +10180,16 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= +truffle-hdwallet-provider@^1.0.17: + version "1.0.17" + resolved "https://registry.yarnpkg.com/truffle-hdwallet-provider/-/truffle-hdwallet-provider-1.0.17.tgz#fe8edd0d6974eeb31af9959e41525fb19abd74ca" + integrity sha512-s6DvSP83jiIAc6TUcpr7Uqnja1+sLGJ8og3X7n41vfyC4OCaKmBtXL5HOHf+SsU3iblOvnbFDgmN6Y1VBL/fsg== + dependencies: + any-promise "^1.3.0" + bindings "^1.3.1" + web3 "1.2.1" + websocket "^1.0.28" + truffle@^5.1.12: version "5.1.12" resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.1.12.tgz#7d41fe2205b223e5631fcbe5c7faa09899b6ca38" @@ -10179,6 +10321,11 @@ type@^2.0.0: resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== +typed-function@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/typed-function/-/typed-function-1.1.1.tgz#a1316187ec3628c9e219b91ca96918660a10138e" + integrity sha512-RbN7MaTQBZLJYzDENHPA0nUmWT0Ex80KHItprrgbTPufYhIlTePvCXZxyQK7wgn19FW5bnuaBIKcBb5mRWjB1Q== + typedarray-to-buffer@^3.1.2, typedarray-to-buffer@^3.1.5, typedarray-to-buffer@~3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -10552,6 +10699,15 @@ web3-bzz@1.0.0-beta.35: swarm-js "0.1.37" underscore "1.8.3" +web3-bzz@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.1.tgz#c3bd1e8f0c02a13cd6d4e3c3e9e1713f144f6f0d" + integrity sha512-LdOO44TuYbGIPfL4ilkuS89GQovxUpmLz6C1UC7VYVVRILeZS740FVB3j9V4P4FHUk1RenaDfKhcntqgVCHtjw== + dependencies: + got "9.6.0" + swarm-js "0.1.39" + underscore "1.9.1" + web3-bzz@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.4.tgz#a4adb7a8cba3d260de649bdb1f14ed359bfb3821" @@ -10571,6 +10727,15 @@ web3-core-helpers@1.0.0-beta.35: web3-eth-iban "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-core-helpers@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz#f5f32d71c60a4a3bd14786118e633ce7ca6d5d0d" + integrity sha512-Gx3sTEajD5r96bJgfuW377PZVFmXIH4TdqDhgGwd2lZQCcMi+DA4TgxJNJGxn0R3aUVzyyE76j4LBrh412mXrw== + dependencies: + underscore "1.9.1" + web3-eth-iban "1.2.1" + web3-utils "1.2.1" + web3-core-helpers@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.4.tgz#ffd425861f4d66b3f38df032afdb39ea0971fc0f" @@ -10591,6 +10756,17 @@ web3-core-method@1.0.0-beta.35: web3-core-subscriptions "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-core-method@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.1.tgz#9df1bafa2cd8be9d9937e01c6a47fc768d15d90a" + integrity sha512-Ghg2WS23qi6Xj8Od3VCzaImLHseEA7/usvnOItluiIc5cKs00WYWsNy2YRStzU9a2+z8lwQywPYp0nTzR/QXdQ== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.2.1" + web3-core-promievent "1.2.1" + web3-core-subscriptions "1.2.1" + web3-utils "1.2.1" + web3-core-method@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.4.tgz#a0fbc50b8ff5fd214021435cc2c6d1e115807aed" @@ -10610,6 +10786,14 @@ web3-core-promievent@1.0.0-beta.35: any-promise "1.3.0" eventemitter3 "1.1.1" +web3-core-promievent@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz#003e8a3eb82fb27b6164a6d5b9cad04acf733838" + integrity sha512-IVUqgpIKoeOYblwpex4Hye6npM0aMR+kU49VP06secPeN0rHMyhGF0ZGveWBrGvf8WDPI7jhqPBFIC6Jf3Q3zw== + dependencies: + any-promise "1.3.0" + eventemitter3 "3.1.2" + web3-core-promievent@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.4.tgz#75e5c0f2940028722cdd21ba503ebd65272df6cb" @@ -10629,6 +10813,17 @@ web3-core-requestmanager@1.0.0-beta.35: web3-providers-ipc "1.0.0-beta.35" web3-providers-ws "1.0.0-beta.35" +web3-core-requestmanager@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz#fa2e2206c3d738db38db7c8fe9c107006f5c6e3d" + integrity sha512-xfknTC69RfYmLKC+83Jz73IC3/sS2ZLhGtX33D4Q5nQ8yc39ElyAolxr9sJQS8kihOcM6u4J+8gyGMqsLcpIBg== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.2.1" + web3-providers-http "1.2.1" + web3-providers-ipc "1.2.1" + web3-providers-ws "1.2.1" + web3-core-requestmanager@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.4.tgz#0a7020a23fb91c6913c611dfd3d8c398d1e4b4a8" @@ -10649,6 +10844,15 @@ web3-core-subscriptions@1.0.0-beta.35: underscore "1.8.3" web3-core-helpers "1.0.0-beta.35" +web3-core-subscriptions@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz#8c2368a839d4eec1c01a4b5650bbeb82d0e4a099" + integrity sha512-nmOwe3NsB8V8UFsY1r+sW6KjdOS68h8nuh7NzlWxBQT/19QSUGiERRTaZXWu5BYvo1EoZRMxCKyCQpSSXLc08g== + dependencies: + eventemitter3 "3.1.2" + underscore "1.9.1" + web3-core-helpers "1.2.1" + web3-core-subscriptions@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.4.tgz#0dc095b5cfd82baa527a39796e3515a846b21b99" @@ -10668,6 +10872,16 @@ web3-core@1.0.0-beta.35: web3-core-requestmanager "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-core@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.1.tgz#7278b58fb6495065e73a77efbbce781a7fddf1a9" + integrity sha512-5ODwIqgl8oIg/0+Ai4jsLxkKFWJYE0uLuE1yUKHNVCL4zL6n3rFjRMpKPokd6id6nJCNgeA64KdWQ4XfpnjdMg== + dependencies: + web3-core-helpers "1.2.1" + web3-core-method "1.2.1" + web3-core-requestmanager "1.2.1" + web3-utils "1.2.1" + web3-core@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.4.tgz#2df13b978dcfc59c2abaa887d27f88f21ad9a9d6" @@ -10691,6 +10905,15 @@ web3-eth-abi@1.0.0-beta.35: web3-core-helpers "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-eth-abi@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz#9b915b1c9ebf82f70cca631147035d5419064689" + integrity sha512-jI/KhU2a/DQPZXHjo2GW0myEljzfiKOn+h1qxK1+Y9OQfTcBMxrQJyH5AP89O6l6NZ1QvNdq99ThAxBFoy5L+g== + dependencies: + ethers "4.0.0-beta.3" + underscore "1.9.1" + web3-utils "1.2.1" + web3-eth-abi@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.4.tgz#5b73e5ef70b03999227066d5d1310b168845e2b8" @@ -10716,6 +10939,23 @@ web3-eth-accounts@1.0.0-beta.35: web3-core-method "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-eth-accounts@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz#2741a8ef337a7219d57959ac8bd118b9d68d63cf" + integrity sha512-26I4qq42STQ8IeKUyur3MdQ1NzrzCqPsmzqpux0j6X/XBD7EjZ+Cs0lhGNkSKH5dI3V8CJasnQ5T1mNKeWB7nQ== + dependencies: + any-promise "1.3.0" + crypto-browserify "3.12.0" + eth-lib "0.2.7" + scryptsy "2.1.0" + semver "6.2.0" + underscore "1.9.1" + uuid "3.3.2" + web3-core "1.2.1" + web3-core-helpers "1.2.1" + web3-core-method "1.2.1" + web3-utils "1.2.1" + web3-eth-accounts@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.4.tgz#ada6edc49542354328a85cafab067acd7f88c288" @@ -10748,6 +10988,20 @@ web3-eth-contract@1.0.0-beta.35: web3-eth-abi "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-eth-contract@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz#3542424f3d341386fd9ff65e78060b85ac0ea8c4" + integrity sha512-kYFESbQ3boC9bl2rYVghj7O8UKMiuKaiMkxvRH5cEDHil8V7MGEGZNH0slSdoyeftZVlaWSMqkRP/chfnKND0g== + dependencies: + underscore "1.9.1" + web3-core "1.2.1" + web3-core-helpers "1.2.1" + web3-core-method "1.2.1" + web3-core-promievent "1.2.1" + web3-core-subscriptions "1.2.1" + web3-eth-abi "1.2.1" + web3-utils "1.2.1" + web3-eth-contract@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.4.tgz#68ef7cc633232779b0a2c506a810fbe903575886" @@ -10763,6 +11017,20 @@ web3-eth-contract@1.2.4: web3-eth-abi "1.2.4" web3-utils "1.2.4" +web3-eth-ens@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz#a0e52eee68c42a8b9865ceb04e5fb022c2d971d5" + integrity sha512-lhP1kFhqZr2nnbu3CGIFFrAnNxk2veXpOXBY48Tub37RtobDyHijHgrj+xTh+mFiPokyrapVjpFsbGa+Xzye4Q== + dependencies: + eth-ens-namehash "2.0.8" + underscore "1.9.1" + web3-core "1.2.1" + web3-core-helpers "1.2.1" + web3-core-promievent "1.2.1" + web3-eth-abi "1.2.1" + web3-eth-contract "1.2.1" + web3-utils "1.2.1" + web3-eth-ens@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.4.tgz#b95b3aa99fb1e35c802b9e02a44c3046a3fa065e" @@ -10785,6 +11053,14 @@ web3-eth-iban@1.0.0-beta.35: bn.js "4.11.6" web3-utils "1.0.0-beta.35" +web3-eth-iban@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz#2c3801718946bea24e9296993a975c80b5acf880" + integrity sha512-9gkr4QPl1jCU+wkgmZ8EwODVO3ovVj6d6JKMos52ggdT2YCmlfvFVF6wlGLwi0VvNa/p+0BjJzaqxnnG/JewjQ== + dependencies: + bn.js "4.11.8" + web3-utils "1.2.1" + web3-eth-iban@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.4.tgz#8e0550fd3fd8e47a39357d87fe27dee9483ee476" @@ -10804,6 +11080,17 @@ web3-eth-personal@1.0.0-beta.35: web3-net "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-eth-personal@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz#244e9911b7b482dc17c02f23a061a627c6e47faf" + integrity sha512-RNDVSiaSoY4aIp8+Hc7z+X72H7lMb3fmAChuSBADoEc7DsJrY/d0R5qQDK9g9t2BO8oxgLrLNyBP/9ub2Hc6Bg== + dependencies: + web3-core "1.2.1" + web3-core-helpers "1.2.1" + web3-core-method "1.2.1" + web3-net "1.2.1" + web3-utils "1.2.1" + web3-eth-personal@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.4.tgz#3224cca6851c96347d9799b12c1b67b2a6eb232b" @@ -10834,6 +11121,25 @@ web3-eth@1.0.0-beta.35: web3-net "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-eth@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.1.tgz#b9989e2557c73a9e8ffdc107c6dafbe72c79c1b0" + integrity sha512-/2xly4Yry5FW1i+uygPjhfvgUP/MS/Dk+PDqmzp5M88tS86A+j8BzKc23GrlA8sgGs0645cpZK/999LpEF5UdA== + dependencies: + underscore "1.9.1" + web3-core "1.2.1" + web3-core-helpers "1.2.1" + web3-core-method "1.2.1" + web3-core-subscriptions "1.2.1" + web3-eth-abi "1.2.1" + web3-eth-accounts "1.2.1" + web3-eth-contract "1.2.1" + web3-eth-ens "1.2.1" + web3-eth-iban "1.2.1" + web3-eth-personal "1.2.1" + web3-net "1.2.1" + web3-utils "1.2.1" + web3-eth@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.4.tgz#24c3b1f1ac79351bbfb808b2ab5c585fa57cdd00" @@ -10862,6 +11168,15 @@ web3-net@1.0.0-beta.35: web3-core-method "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3-net@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.1.tgz#edd249503315dd5ab4fa00220f6509d95bb7ab10" + integrity sha512-Yt1Bs7WgnLESPe0rri/ZoPWzSy55ovioaP35w1KZydrNtQ5Yq4WcrAdhBzcOW7vAkIwrsLQsvA+hrOCy7mNauw== + dependencies: + web3-core "1.2.1" + web3-core-method "1.2.1" + web3-utils "1.2.1" + web3-net@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.4.tgz#1d246406d3aaffbf39c030e4e98bce0ca5f25458" @@ -10931,6 +11246,14 @@ web3-providers-http@1.0.0-beta.35: web3-core-helpers "1.0.0-beta.35" xhr2-cookies "1.1.0" +web3-providers-http@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.1.tgz#c93ea003a42e7b894556f7e19dd3540f947f5013" + integrity sha512-BDtVUVolT9b3CAzeGVA/np1hhn7RPUZ6YYGB/sYky+GjeO311Yoq8SRDUSezU92x8yImSC2B+SMReGhd1zL+bQ== + dependencies: + web3-core-helpers "1.2.1" + xhr2-cookies "1.1.0" + web3-providers-http@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.4.tgz#514fcad71ae77832c2c15574296282fbbc5f4a67" @@ -10948,6 +11271,15 @@ web3-providers-ipc@1.0.0-beta.35: underscore "1.8.3" web3-core-helpers "1.0.0-beta.35" +web3-providers-ipc@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz#017bfc687a8fc5398df2241eb98f135e3edd672c" + integrity sha512-oPEuOCwxVx8L4CPD0TUdnlOUZwGBSRKScCz/Ws2YHdr9Ium+whm+0NLmOZjkjQp5wovQbyBzNa6zJz1noFRvFA== + dependencies: + oboe "2.1.4" + underscore "1.9.1" + web3-core-helpers "1.2.1" + web3-providers-ipc@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.4.tgz#9d6659f8d44943fb369b739f48df09092be459bd" @@ -10966,6 +11298,15 @@ web3-providers-ws@1.0.0-beta.35: web3-core-helpers "1.0.0-beta.35" websocket "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible" +web3-providers-ws@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz#2d941eaf3d5a8caa3214eff8dc16d96252b842cb" + integrity sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.2.1" + websocket "github:web3-js/WebSocket-Node#polyfill/globalThis" + web3-providers-ws@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.4.tgz#099ee271ee03f6ea4f5df9cfe969e83f4ce0e36f" @@ -10985,6 +11326,16 @@ web3-shh@1.0.0-beta.35: web3-core-subscriptions "1.0.0-beta.35" web3-net "1.0.0-beta.35" +web3-shh@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.1.tgz#4460e3c1e07faf73ddec24ccd00da46f89152b0c" + integrity sha512-/3Cl04nza5kuFn25bV3FJWa0s3Vafr5BlT933h26xovQ6HIIz61LmvNQlvX1AhFL+SNJOTcQmK1SM59vcyC8bA== + dependencies: + web3-core "1.2.1" + web3-core-method "1.2.1" + web3-core-subscriptions "1.2.1" + web3-net "1.2.1" + web3-shh@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.4.tgz#5c8ff5ab624a3b14f08af0d24d2b16c10e9f70dd" @@ -11008,6 +11359,19 @@ web3-utils@1.0.0-beta.35: underscore "1.8.3" utf8 "2.1.1" +web3-utils@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534" + integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA== + dependencies: + bn.js "4.11.8" + eth-lib "0.2.7" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randomhex "0.1.5" + underscore "1.9.1" + utf8 "3.0.0" + web3-utils@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.4.tgz#96832a39a66b05bf8862a5b0bdad2799d709d951" @@ -11035,6 +11399,19 @@ web3@1.0.0-beta.35: web3-shh "1.0.0-beta.35" web3-utils "1.0.0-beta.35" +web3@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.1.tgz#5d8158bcca47838ab8c2b784a2dee4c3ceb4179b" + integrity sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw== + dependencies: + web3-bzz "1.2.1" + web3-core "1.2.1" + web3-eth "1.2.1" + web3-eth-personal "1.2.1" + web3-net "1.2.1" + web3-shh "1.2.1" + web3-utils "1.2.1" + web3@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.4.tgz#6e7ab799eefc9b4648c2dab63003f704a1d5e7d9" @@ -11065,6 +11442,17 @@ websocket@1.0.29: typedarray-to-buffer "^3.1.5" yaeti "^0.0.6" +websocket@^1.0.28: + version "1.0.31" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.31.tgz#e5d0f16c3340ed87670e489ecae6144c79358730" + integrity sha512-VAouplvGKPiKFDTeCCO65vYHsyay8DqoBSlzIO3fayrfOgU94lQN5a1uWVnFrMLceTJw/+fQXR5PGbUVRaHshQ== + dependencies: + debug "^2.2.0" + es5-ext "^0.10.50" + nan "^2.14.0" + typedarray-to-buffer "^3.1.5" + yaeti "^0.0.6" + "websocket@git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible": version "1.0.26" resolved "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" @@ -11074,6 +11462,16 @@ websocket@1.0.29: typedarray-to-buffer "^3.1.2" yaeti "^0.0.6" +"websocket@github:web3-js/WebSocket-Node#polyfill/globalThis": + version "1.0.29" + resolved "https://codeload.github.com/web3-js/WebSocket-Node/tar.gz/905deb4812572b344f5801f8c9ce8bb02799d82e" + dependencies: + debug "^2.2.0" + es5-ext "^0.10.50" + nan "^2.14.0" + typedarray-to-buffer "^3.1.5" + yaeti "^0.0.6" + whatwg-fetch@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" From 5ebcd9b40bbcb7fe2913d48980dc8e18ac1c7816 Mon Sep 17 00:00:00 2001 From: Mason Fischer Date: Thu, 13 Feb 2020 17:03:13 -0500 Subject: [PATCH 07/13] Test that nonces are incremented on calls (#71) Before we were only incrementing nonces on CREATE. Wallets expect nonces to be incremented on CALLs aswell. This test tests that we are in fact inrementing nonces on CALLs aswell. Other changes: * Update the name of the executeCall test --- .../execution-manager.executeCall.spec.ts | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/packages/ovm/test/contracts/execution-manager.executeCall.spec.ts b/packages/ovm/test/contracts/execution-manager.executeCall.spec.ts index 808d86e6cab..0515ca7d82b 100644 --- a/packages/ovm/test/contracts/execution-manager.executeCall.spec.ts +++ b/packages/ovm/test/contracts/execution-manager.executeCall.spec.ts @@ -111,7 +111,7 @@ describe('Execution Manager -- Call opcodes', () => { }) }) - describe('executeCall', async () => { + describe('executeEOACall', async () => { it('properly executes a raw call -- 0 param', async () => { // Create the variables we will use for setStorage const intParam = 0 @@ -149,6 +149,47 @@ describe('Execution Manager -- Call opcodes', () => { await provider.waitForTransaction(tx.hash) }) + it('increments the senders nonce', async () => { + // Create the variables we will use for setStorage + const intParam = 0 + const bytesParam = '0xdeadbeef' + // Generate our tx calldata + const calldata = getUnsignedTransactionCalldata( + dummyContract, + 'dummyFunction', + [intParam, bytesParam] + ) + const nonce = await executionManager.getOvmContractNonce(wallet.address) + const transaction = { + nonce, + gasLimit: GAS_LIMIT, + gasPrice: 0, + to: dummyContractAddress, + value: 0, + data: calldata, + chainId: CHAIN_ID, + } + const signedMessage = await wallet.sign(transaction) + const [v, r, s] = ethers.utils.RLP.decode(signedMessage).slice(-3) + + // Call using Ethers + const tx = await executionManager.executeEOACall( + 0, + 0, + transaction.nonce, + transaction.to, + transaction.data, + v, + r, + s + ) + await provider.waitForTransaction(tx.hash) + const nonceAfter = await executionManager.getOvmContractNonce( + wallet.address + ) + nonceAfter.should.equal(parseInt(nonce, 10) + 1) + }) + it('properly executes a raw call -- 1 param', async () => { const intParam = 1 const bytesParam = '0xdeadbeef' From ab126f6919505fce1b7566de2994461b425d03ae Mon Sep 17 00:00:00 2001 From: Will Meister Date: Fri, 14 Feb 2020 08:47:44 -0600 Subject: [PATCH 08/13] Configuring OVM in separate truffle config as an easy example of side-by-side standard testing & ovm testing (#72) --- packages/examples/package.json | 10 +- packages/examples/truffle-config-ovm.js | 49 +++++++++ packages/examples/truffle-config.js | 102 +++++++++++++----- packages/examples/truffle-tests/test-erc20.js | 13 ++- 4 files changed, 135 insertions(+), 39 deletions(-) create mode 100644 packages/examples/truffle-config-ovm.js diff --git a/packages/examples/package.json b/packages/examples/package.json index 36d6bee4916..fdd9a880dc1 100644 --- a/packages/examples/package.json +++ b/packages/examples/package.json @@ -4,11 +4,15 @@ "description": "Example of using solc-transpiler & Web3 full node in place of solc-js and other Web3 providers", "scripts": { "clean": "rimraf build", - "build:truffle": "export EXECUTION_MANAGER_ADDRESS=\"0xA193E42526F1FEA8C99AF609dcEabf30C1c29fAA\" && truffle compile", + "build:truffle": "truffle compile", + "build:truffle-ovm": "truffle compile --config truffle-config-ovm.js", "build:waffle": "mkdir -p build/waffle && waffle waffle-config.json", "build": "yarn build:waffle && yarn build:truffle", - "test:truffle": "export EXECUTION_MANAGER_ADDRESS=\"0xA193E42526F1FEA8C99AF609dcEabf30C1c29fAA\" && truffle test --network fullnode ./truffle-tests/test-erc20.js", - "all": "yarn clean && yarn build" + "build:ovm": "mkdir -p build/waffle && waffle waffle-config.json && yarn build:truffle-ovm", + "test": "truffle test ./truffle-tests/test-erc20.js", + "test:ovm": "truffle test ./truffle-tests/test-erc20.js --config truffle-config-ovm.js", + "all": "yarn clean && yarn build && yarn test", + "all:ovm": "yarn clean && yarn build:ovm && yarn test:ovm" }, "keywords": [ "optimism", diff --git a/packages/examples/truffle-config-ovm.js b/packages/examples/truffle-config-ovm.js new file mode 100644 index 00000000000..ae469590199 --- /dev/null +++ b/packages/examples/truffle-config-ovm.js @@ -0,0 +1,49 @@ +const HDWalletProvider = require('truffle-hdwallet-provider'); + +const mnemonic = 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat'; + +// Set this to the desired Execution Manager Address -- required for the transpiler +process.env.EXECUTION_MANAGER_ADDRESS = process.env.EXECUTION_MANAGER_ADDRESS || "0xA193E42526F1FEA8C99AF609dcEabf30C1c29fAA" + +module.exports = { + /** + * Note: this expects the local fullnode to be running: + * // TODO: Run `yarn server:fullnode` in rollup-full-node before executing this test + * + * To run tests: + * $ truffle test ./truffle-tests/test-erc20.js --config truffle-config-ovm.js + */ + networks: { + // Note: Requires running the rollup-full-node locally. + test: { + network_id: 108, + provider: function() { + const wallet = new HDWalletProvider(mnemonic, "http://127.0.0.1:8545/", 0, 10); + const sendAsync = wallet.sendAsync + + wallet.sendAsync = function (...args) { + if (args[0].method === 'eth_sendTransaction') { + // HACK TO PROPERLY SET CHAIN ID + args[0].params[0].chainId = 108 + } + sendAsync.apply(this, args) + }; + return wallet; + }, + gasPrice: 0, + gas: 9000000, + }, + }, + + // Set default mocha options here, use special reporters etc. + mocha: { + timeout: 100000 + }, + + compilers: { + solc: { + // Add path to the solc-transpiler + version: "../../node_modules/@eth-optimism/solc-transpiler", + } + } +} diff --git a/packages/examples/truffle-config.js b/packages/examples/truffle-config.js index 3d9e46a5aa2..3e06c10288e 100644 --- a/packages/examples/truffle-config.js +++ b/packages/examples/truffle-config.js @@ -1,8 +1,28 @@ -const HDWalletProvider = require('truffle-hdwallet-provider'); +/** + * Use this file to configure your truffle project. It's seeded with some + * common settings for different networks and features like migrations, + * compilation and testing. Uncomment the ones you need or modify + * them to suit your project as necessary. + * + * More information about configuration can be found at: + * + * truffleframework.com/docs/advanced/configuration + * + * To deploy via Infura you'll need a wallet provider (like truffle-hdwallet-provider) + * to sign your transactions before they're sent to a remote public node. Infura accounts + * are available for free at: infura.io/register. + * + * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate + * public/private key pairs. If you're publishing your code to GitHub make sure you load this + * phrase from a file you've .gitignored so it doesn't accidentally become public. + * + */ + +// const HDWalletProvider = require('truffle-hdwallet-provider'); // const infuraKey = "fj4jll3k....."; // // const fs = require('fs'); -const mnemonic = 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat'; // fs.readFileSync(".secret").toString().trim(); +// const mnemonic = fs.readFileSync(".secret").toString().trim(); module.exports = { /** @@ -12,44 +32,68 @@ module.exports = { * run `develop` or `test`. You can ask a truffle command to use a specific * network from the command line, e.g * - * $ truffle test --network fullnode ./truffle-tests/test-erc20.js + * $ truffle test --network */ networks: { - // Note: Requires running the rollup-full-node locally. - fullnode: { - network_id: 108, - provider: function() { - const wallet = new HDWalletProvider(mnemonic, "http://127.0.0.1:8545/", 0, 10); - - const sendAsync = wallet.sendAsync - - wallet.sendAsync = function (...args) { - if (args[0].method === 'eth_sendTransaction') { - // HACK TO PROPERLY SET CHAIN ID - args[0].params[0].chainId = 108 - } - sendAsync.apply(this, args) - }; - - return wallet; - }, - gasPrice: 0, - gas: 9000000, - }, + // Useful for testing. The `development` name is special - truffle uses it by default + // if it's defined here and no other network is specified at the command line. + // You should run a client (like ganache-cli, geth or parity) in a separate terminal + // tab if you use this network and you must also set the `host`, `port` and `network_id` + // options below to some value. + // + // development: { + // host: "127.0.0.1", // Localhost (default: none) + // port: 8545, // Standard Ethereum port (default: none) + // network_id: "*", // Any network (default: none) + // }, + + // Another network with more advanced options... + // advanced: { + // port: 8777, // Custom port + // network_id: 1342, // Custom network + // gas: 8500000, // Gas sent with each transaction (default: ~6700000) + // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) + // from:
, // Account to send txs from (default: accounts[0]) + // websockets: true // Enable EventEmitter interface for web3 (default: false) + // }, + + // Useful for deploying to a public network. + // NB: It's important to wrap the provider as a function. + // ropsten: { + // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/v3/YOUR-PROJECT-ID`), + // network_id: 3, // Ropsten's id + // gas: 5500000, // Ropsten has a lower block limit than mainnet + // confirmations: 2, // # of confs to wait between deployments. (default: 0) + // timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) + // skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) + // }, + + // Useful for private networks + // private: { + // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), + // network_id: 2111, // This network is yours, in the cloud. + // production: true // Treats this network as if it was a public net. (default: false) + // } }, // Set default mocha options here, use special reporters etc. mocha: { - timeout: 100000 + // timeout: 100000 }, - + // Configure your compilers compilers: { solc: { - // Add path to the solc-transpiler - // TODO: will need EXECUTION_MANAGER_ADDRESS environment variable set. - version: "../../node_modules/@eth-optimism/solc-transpiler", + // version: "0.5.1", // Fetch exact version from solc-bin (default: truffle's version) + // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) + // settings: { // See the solidity docs for advice about optimization and evmVersion + // optimizer: { + // enabled: false, + // runs: 200 + // }, + // evmVersion: "byzantium" + // } } } } diff --git a/packages/examples/truffle-tests/test-erc20.js b/packages/examples/truffle-tests/test-erc20.js index d51c3e17895..796f636b536 100644 --- a/packages/examples/truffle-tests/test-erc20.js +++ b/packages/examples/truffle-tests/test-erc20.js @@ -1,6 +1,5 @@ const TestERC20 = artifacts.require("TestERC20"); -// TODO: Run `yarn server:fullnode` in rollup-full-node before executing this test contract('TestERC20', accounts => { const account = accounts[0]; const account2 = accounts[1]; @@ -11,22 +10,22 @@ contract('TestERC20', accounts => { beforeEach(async () => { // Deploy a fresh contract every test erc20 = await TestERC20.new(initialValue, 'Test Token', 100, 'TEST', {from: account}); - }) + }); it('gets total supply', async () => { const totalSupply = await erc20.totalSupply.call(); assert.equal(totalSupply, initialValue, 'Total supply mismatch!'); - }) + }); it('gets balance of main account', async () => { const balance = await erc20.balanceOf.call(account); assert.equal(balance, initialValue, 'Sender balance mismatch!'); - }) + }); it('gets 0 balance of second account', async () => { const balance = await erc20.balanceOf.call(account2); assert.equal(balance, 0, 'Second account balance mismatch!'); - }) + }); it('transfers from account 1 to account 2', async () => { await erc20.transfer(account2, transferValue, {from: account}); @@ -36,7 +35,7 @@ contract('TestERC20', accounts => { const account2Balance = await erc20.balanceOf.call(account2); assert.equal(account2Balance, transferValue, 'Account balance mismatch after transfer!'); - }) + }); it('transfers from account 1 to account 2 and then back', async () => { await erc20.transfer(account2, transferValue, {from: account}); @@ -47,5 +46,5 @@ contract('TestERC20', accounts => { const account2Balance = await erc20.balanceOf.call(account2); assert.equal(account2Balance, 0, 'Account balance mismatch after transfer!'); - }) + }); }); \ No newline at end of file From 27561c537f1f0542f52ce1775ecd6295a44694e7 Mon Sep 17 00:00:00 2001 From: ben-chain Date: Tue, 18 Feb 2020 16:59:27 -0800 Subject: [PATCH 09/13] pre rebase --- .../full-node-integration/CallerGetter.sol | 8 +++ .../full-node-integration/CallerReturner.sol | 7 ++ .../full-node-integration/ExtCode.sol | 19 +++++ .../full-node-integration/SelfAware.sol | 7 ++ .../full-node-integration/SimpleStorage.sol | 12 ++++ .../full-node-integration/TimeGetter.sol | 7 ++ .../constants-transpilation.spec.ts | 2 +- .../transpiler/full-node-integration.spec.ts | 70 +++++++++++++++++++ 8 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 packages/rollup-dev-tools/test/contracts/full-node-integration/CallerGetter.sol create mode 100644 packages/rollup-dev-tools/test/contracts/full-node-integration/CallerReturner.sol create mode 100644 packages/rollup-dev-tools/test/contracts/full-node-integration/ExtCode.sol create mode 100644 packages/rollup-dev-tools/test/contracts/full-node-integration/SelfAware.sol create mode 100644 packages/rollup-dev-tools/test/contracts/full-node-integration/SimpleStorage.sol create mode 100644 packages/rollup-dev-tools/test/contracts/full-node-integration/TimeGetter.sol create mode 100644 packages/rollup-dev-tools/test/transpiler/full-node-integration.spec.ts diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/CallerGetter.sol b/packages/rollup-dev-tools/test/contracts/full-node-integration/CallerGetter.sol new file mode 100644 index 00000000000..544b8c3e3a5 --- /dev/null +++ b/packages/rollup-dev-tools/test/contracts/full-node-integration/CallerGetter.sol @@ -0,0 +1,8 @@ +pragma solidity ^0.5.0; +import "./CallerReturner.sol"; + +contract CallerGetter { + function getMsgSenderFrom(address _callerReturner) public view returns(address) { + return CallerReturner(_callerReturner).getMsgSender(); + } +} \ No newline at end of file diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/CallerReturner.sol b/packages/rollup-dev-tools/test/contracts/full-node-integration/CallerReturner.sol new file mode 100644 index 00000000000..64ae5c4a46f --- /dev/null +++ b/packages/rollup-dev-tools/test/contracts/full-node-integration/CallerReturner.sol @@ -0,0 +1,7 @@ +pragma solidity ^0.5.0; + +contract CallerReturner { + function getMsgSender() public view returns(address) { + return msg.sender; + } +} \ No newline at end of file diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/ExtCode.sol b/packages/rollup-dev-tools/test/contracts/full-node-integration/ExtCode.sol new file mode 100644 index 00000000000..14aeb4978c1 --- /dev/null +++ b/packages/rollup-dev-tools/test/contracts/full-node-integration/ExtCode.sol @@ -0,0 +1,19 @@ +pragma solidity ^0.5.0; + +contract ExtCode { + function getExtCodeSizeOf(address _addr) public returns(uint) { + uint toReturn; + assembly { + toReturn:= extcodesize(_addr) + } + return toReturn; + } + + function getExtCodeHashOf(address _addr) public returns(bytes32) { + bytes32 toReturn; + assembly { + toReturn:= extcodehash(_addr) + } + return toReturn; + } +} \ No newline at end of file diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/SelfAware.sol b/packages/rollup-dev-tools/test/contracts/full-node-integration/SelfAware.sol new file mode 100644 index 00000000000..6c1b5dbdb77 --- /dev/null +++ b/packages/rollup-dev-tools/test/contracts/full-node-integration/SelfAware.sol @@ -0,0 +1,7 @@ +pragma solidity ^0.5.0; + +contract SelfAware { + function getMyAddress() public view returns(address) { + return address(this); + } +} \ No newline at end of file diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/SimpleStorage.sol b/packages/rollup-dev-tools/test/contracts/full-node-integration/SimpleStorage.sol new file mode 100644 index 00000000000..823562b6049 --- /dev/null +++ b/packages/rollup-dev-tools/test/contracts/full-node-integration/SimpleStorage.sol @@ -0,0 +1,12 @@ +pragma solidity ^0.5.0; + +contract SimpleStorage { + mapping(bytes32 => bytes32) public builtInStorage; + function setStorage(bytes32 key, bytes32 value) public { + builtInStorage[key] = value; + } + + function getStorage(bytes32 key) public view returns (bytes32) { + return builtInStorage[key]; + } +} diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/TimeGetter.sol b/packages/rollup-dev-tools/test/contracts/full-node-integration/TimeGetter.sol new file mode 100644 index 00000000000..00500c0457d --- /dev/null +++ b/packages/rollup-dev-tools/test/contracts/full-node-integration/TimeGetter.sol @@ -0,0 +1,7 @@ +pragma solidity ^0.5.0; + +contract TimeGetter { + function getTimestamp() public view returns(uint256) { + return block.timestamp; + } +} \ No newline at end of file diff --git a/packages/rollup-dev-tools/test/transpiler/constants-transpilation.spec.ts b/packages/rollup-dev-tools/test/transpiler/constants-transpilation.spec.ts index a1cb8ac61c3..cf5bf32838a 100644 --- a/packages/rollup-dev-tools/test/transpiler/constants-transpilation.spec.ts +++ b/packages/rollup-dev-tools/test/transpiler/constants-transpilation.spec.ts @@ -148,7 +148,7 @@ describe('Solitity contracts should have constants correctly accessible when usi const bytesMemoryConstB: Buffer = hexStrToBuf( 'BBBbeedfeedBBBBBBbeedfeedBBBBBBbeedfeedBBBBBBbeedfeedBBBBBBbeedfeedBBBBBBbeedfeedBBBBBBbeedfeedBBB' ) - it('should work for the first bytes memory constant', async () => { + it('should work for the second bytes memory constant', async () => { const retrievedBytesMemoryBVal: Buffer = await getGetterReturnedVal( deployedGetterAddress, 'getBytesMemoryConstantB', diff --git a/packages/rollup-dev-tools/test/transpiler/full-node-integration.spec.ts b/packages/rollup-dev-tools/test/transpiler/full-node-integration.spec.ts new file mode 100644 index 00000000000..554c61d941f --- /dev/null +++ b/packages/rollup-dev-tools/test/transpiler/full-node-integration.spec.ts @@ -0,0 +1,70 @@ +import '../setup' +/* External Imports */ +import { getLogger, remove0x, bufToHexString } from '@eth-optimism/core-utils' +import { DB, newInMemoryDB } from '@eth-optimism/core-db/' +import { + createMockProvider, getWallets, deployContract +} from '@eth-optimism/rollup-full-node' +import { ethers } from 'ethers' +import { solidity } from 'ethereum-waffle' +import { + Address, + bytecodeToBuffer, + EVMBytecode, + Opcode, + formatBytecode, + bufferToBytecode, + EVMOpcodeAndBytes, + EVMOpcode, + getPCOfEVMBytecodeIndex, +} from '@eth-optimism/rollup-core' + +/* Internal Imports */ + +import * as SimpleStorage from '../contracts/build/SimpleStorage.json' +import * as SelfAware from '../contracts/build/SelfAware.json' +import * as CallerGetter from '../contracts/build/CallerGetter.json' +import * as CallerReturner from '../contracts/build/CallerReturner.json' +import * as TimeGetter from '../contracts/build/TimeGetter.json' + +const log = getLogger('transpiler-full-node-integration') + +describe.only(`Various opcodes should be usable in combination with transpiler and full node`, () => { + // let fullnodeHandler: FullnodeHandler + // let fullnodeRpcServer: FullnodeRpcServer + // let baseUrl: string + + // let executionManagerAddress + // let httpProvider + // const host = '0.0.0.0' + // const port = 9999 + + // before(async () => { + // fullnodeHandler = await DefaultWeb3Handler.create() + // fullnodeRpcServer = new FullnodeRpcServer(fullnodeHandler, host, port) + + // fullnodeRpcServer.listen() + + // baseUrl = `http://${host}:${port}` + // log.debug( + // `setting up fullnode provider and get execution manager address...` + // ) + // httpProvider = new ethers.providers.JsonRpcProvider(baseUrl) + // executionManagerAddress = await httpProvider.send( + // 'ovm_getExecutionManagerAddress', + // [] + // ) + // log.debug(`execution manager address acquired: ${executionManagerAddress}`) + // }) + + // afterEach(() => { + // if (!!fullnodeRpcServer) { + // fullnodeRpcServer.close() + // } + // }) + + it('first one', async () => { + log.debug(FullnodeRpcServer) + }) +}) + From ce94b44b0833c1ae7e0a9e8aad3442b4b1847d19 Mon Sep 17 00:00:00 2001 From: ben-chain Date: Thu, 20 Feb 2020 13:23:58 -0800 Subject: [PATCH 10/13] move tests to fullnode pkg;2C --- .../ovm/test/contracts/revert-test.spec.ts | 2 +- packages/rollup-dev-tools/package.json | 2 +- .../src/tools/transpiler/opcode-whitelist.ts | 2 + .../src/tools/transpiler/transpiler.ts | 14 ++- .../transpiler/full-node-integration.spec.ts | 70 ------------ packages/rollup-full-node/package.json | 8 +- .../rollup-full-node/test/app/handler.spec.ts | 2 +- .../contracts/transpiled}/CallerGetter.sol | 0 .../contracts/transpiled}/CallerReturner.sol | 0 .../test/contracts/transpiled}/ExtCode.sol | 0 .../contracts/transpiled/OriginGetter.sol | 7 ++ .../test/contracts/transpiled}/SelfAware.sol | 0 .../contracts/transpiled/SimpleCaller.sol | 8 ++ .../contracts/transpiled}/SimpleStorage.sol | 0 .../test/contracts/transpiled}/TimeGetter.sol | 0 .../{ => untranspiled}/SimpleStorage.sol | 0 .../transpiler-integration.spec.ts | 100 ++++++++++++++++++ .../waffle-config-transpiled.json | 14 +++ .../waffle-config-untranspiled.json | 12 +++ packages/rollup-full-node/waffle-config.json | 5 - yarn.lock | 78 -------------- 21 files changed, 163 insertions(+), 161 deletions(-) delete mode 100644 packages/rollup-dev-tools/test/transpiler/full-node-integration.spec.ts rename packages/{rollup-dev-tools/test/contracts/full-node-integration => rollup-full-node/test/contracts/transpiled}/CallerGetter.sol (100%) rename packages/{rollup-dev-tools/test/contracts/full-node-integration => rollup-full-node/test/contracts/transpiled}/CallerReturner.sol (100%) rename packages/{rollup-dev-tools/test/contracts/full-node-integration => rollup-full-node/test/contracts/transpiled}/ExtCode.sol (100%) create mode 100644 packages/rollup-full-node/test/contracts/transpiled/OriginGetter.sol rename packages/{rollup-dev-tools/test/contracts/full-node-integration => rollup-full-node/test/contracts/transpiled}/SelfAware.sol (100%) create mode 100644 packages/rollup-full-node/test/contracts/transpiled/SimpleCaller.sol rename packages/{rollup-dev-tools/test/contracts/full-node-integration => rollup-full-node/test/contracts/transpiled}/SimpleStorage.sol (100%) rename packages/{rollup-dev-tools/test/contracts/full-node-integration => rollup-full-node/test/contracts/transpiled}/TimeGetter.sol (100%) rename packages/rollup-full-node/test/contracts/{ => untranspiled}/SimpleStorage.sol (100%) create mode 100644 packages/rollup-full-node/test/integration/transpiler-integration.spec.ts create mode 100644 packages/rollup-full-node/waffle-config-transpiled.json create mode 100644 packages/rollup-full-node/waffle-config-untranspiled.json delete mode 100644 packages/rollup-full-node/waffle-config.json diff --git a/packages/ovm/test/contracts/revert-test.spec.ts b/packages/ovm/test/contracts/revert-test.spec.ts index 0d75dae2334..14dca6ba0fb 100644 --- a/packages/ovm/test/contracts/revert-test.spec.ts +++ b/packages/ovm/test/contracts/revert-test.spec.ts @@ -28,7 +28,7 @@ describe('Revert Test', () => { }) describe('Test that revert will blow away modified state from successful sub-calls', async () => { - it.only('reverts sub-call state', async () => { + it('reverts sub-call state', async () => { await revertTestContract.entryPoint() const a = await revertTestContract.getA() diff --git a/packages/rollup-dev-tools/package.json b/packages/rollup-dev-tools/package.json index ee49f6aae07..2927c362b43 100644 --- a/packages/rollup-dev-tools/package.json +++ b/packages/rollup-dev-tools/package.json @@ -12,7 +12,7 @@ "clean": "rimraf build/ && yarn clean-contracts", "fix": "prettier --config ../../prettier-config.json --write 'index.ts' '{src,test}/**/*.ts'", "lint": "tslint --format stylish --project .", - "clean-contracts": "rimraf ./test/contracts/build && mkdir ./test/contracts/build", + "clean-contracts": "rimraf ./test/contracts/build && mkdir ./test/contracts/build && mkdir ./test/contracts/build/transpiled && mkdir ./test/contracts/build/untranspiled", "build-contracts": "yarn clean-contracts && waffle waffle-config.json", "test": "mocha --require ts-node/register 'test/**/*.spec.ts' --timeout 5000 --exit", "transpile": "node ./build/src/transpiler/exec/transpiler.js " diff --git a/packages/rollup-dev-tools/src/tools/transpiler/opcode-whitelist.ts b/packages/rollup-dev-tools/src/tools/transpiler/opcode-whitelist.ts index 6cf93aee8c5..6e7b934565f 100644 --- a/packages/rollup-dev-tools/src/tools/transpiler/opcode-whitelist.ts +++ b/packages/rollup-dev-tools/src/tools/transpiler/opcode-whitelist.ts @@ -71,6 +71,7 @@ const defaultWhitelist: EVMOpcode[] = [ Opcode.EXP, Opcode.EXTCODECOPY, Opcode.EXTCODESIZE, + Opcode.EXTCODEHASH, Opcode.GAS, Opcode.GT, Opcode.INVALID, @@ -93,6 +94,7 @@ const defaultWhitelist: EVMOpcode[] = [ Opcode.MULMOD, Opcode.NOT, Opcode.OR, + Opcode.ORIGIN, Opcode.PC, Opcode.POP, Opcode.PUSH1, diff --git a/packages/rollup-dev-tools/src/tools/transpiler/transpiler.ts b/packages/rollup-dev-tools/src/tools/transpiler/transpiler.ts index 35d36d5d4be..36c03d853de 100644 --- a/packages/rollup-dev-tools/src/tools/transpiler/transpiler.ts +++ b/packages/rollup-dev-tools/src/tools/transpiler/transpiler.ts @@ -135,16 +135,21 @@ export class TranspilerImpl implements Transpiler { const deployedBytecodeTranspilationResult: TaggedTranspilationResult = this.transpileBytecodePreservingTags( taggedDeployedEVMBytecode ) - // todo error handle however above + if (!deployedBytecodeTranspilationResult.succeeded) { errors.push( ...(deployedBytecodeTranspilationResult as ErroredTranspilation).errors ) + return { + succeeded: false, + errors, + } } const transpiledDeployedBytecode: EVMBytecode = deployedBytecodeTranspilationResult.bytecodeWithTags - log.debug(`Fixing constant indices for transpiled deployed bytecode...`) + log.debug(`Fixing the constant indices for transpiled deployed bytecode...`) + log.debug(`errors are: ${JSON.stringify(errors)}`) // Note that fixTaggedConstantOffsets() scrubs all fixed tags, so we do not re-fix when we use finalTranspiledDeployedBytecode to reconstruct the returned initcode const finalTranspiledDeployedBytecode: EVMBytecode = this.fixTaggedConstantOffsets( transpiledDeployedBytecode as EVMBytecode, @@ -176,6 +181,10 @@ export class TranspilerImpl implements Transpiler { ...(constructorInitLogicTranspilationResult as ErroredTranspilation) .errors ) + return { + succeeded: false, + errors, + } } const transpiledConstructorInitLogic: EVMBytecode = constructorInitLogicTranspilationResult.bytecodeWithTags @@ -241,6 +250,7 @@ export class TranspilerImpl implements Transpiler { taggedBytecode: EVMBytecode, errors ): EVMBytecode { + log.debug(`tagged input: ${formatBytecode(taggedBytecode)}`) const inputAsBuf: Buffer = bytecodeToBuffer(taggedBytecode) const bytecodeToReturn: EVMBytecode = [] for (const [index, op] of taggedBytecode.entries()) { diff --git a/packages/rollup-dev-tools/test/transpiler/full-node-integration.spec.ts b/packages/rollup-dev-tools/test/transpiler/full-node-integration.spec.ts deleted file mode 100644 index 554c61d941f..00000000000 --- a/packages/rollup-dev-tools/test/transpiler/full-node-integration.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import '../setup' -/* External Imports */ -import { getLogger, remove0x, bufToHexString } from '@eth-optimism/core-utils' -import { DB, newInMemoryDB } from '@eth-optimism/core-db/' -import { - createMockProvider, getWallets, deployContract -} from '@eth-optimism/rollup-full-node' -import { ethers } from 'ethers' -import { solidity } from 'ethereum-waffle' -import { - Address, - bytecodeToBuffer, - EVMBytecode, - Opcode, - formatBytecode, - bufferToBytecode, - EVMOpcodeAndBytes, - EVMOpcode, - getPCOfEVMBytecodeIndex, -} from '@eth-optimism/rollup-core' - -/* Internal Imports */ - -import * as SimpleStorage from '../contracts/build/SimpleStorage.json' -import * as SelfAware from '../contracts/build/SelfAware.json' -import * as CallerGetter from '../contracts/build/CallerGetter.json' -import * as CallerReturner from '../contracts/build/CallerReturner.json' -import * as TimeGetter from '../contracts/build/TimeGetter.json' - -const log = getLogger('transpiler-full-node-integration') - -describe.only(`Various opcodes should be usable in combination with transpiler and full node`, () => { - // let fullnodeHandler: FullnodeHandler - // let fullnodeRpcServer: FullnodeRpcServer - // let baseUrl: string - - // let executionManagerAddress - // let httpProvider - // const host = '0.0.0.0' - // const port = 9999 - - // before(async () => { - // fullnodeHandler = await DefaultWeb3Handler.create() - // fullnodeRpcServer = new FullnodeRpcServer(fullnodeHandler, host, port) - - // fullnodeRpcServer.listen() - - // baseUrl = `http://${host}:${port}` - // log.debug( - // `setting up fullnode provider and get execution manager address...` - // ) - // httpProvider = new ethers.providers.JsonRpcProvider(baseUrl) - // executionManagerAddress = await httpProvider.send( - // 'ovm_getExecutionManagerAddress', - // [] - // ) - // log.debug(`execution manager address acquired: ${executionManagerAddress}`) - // }) - - // afterEach(() => { - // if (!!fullnodeRpcServer) { - // fullnodeRpcServer.close() - // } - // }) - - it('first one', async () => { - log.debug(FullnodeRpcServer) - }) -}) - diff --git a/packages/rollup-full-node/package.json b/packages/rollup-full-node/package.json index ddfbd5ed15b..0670a014907 100644 --- a/packages/rollup-full-node/package.json +++ b/packages/rollup-full-node/package.json @@ -8,14 +8,16 @@ ], "scripts": { "all": "yarn clean && yarn build && yarn test && yarn fix && yarn lint", - "build": "waffle waffle-config.json && tsc -p .", + "build": "waffle waffle-config-untranspiled.json && waffle waffle-config-transpiled.json && tsc -p .", "clean": "rimraf build/ && rimraf test/contracts/build", "fix": "prettier --config ../../prettier-config.json --write 'index.ts' '{src,test}/**/*.ts'", "lint": "tslint --format stylish --project .", - "test": "waffle waffle-config.json && mocha --require source-map-support/register --require ts-node/register 'test/**/*.spec.ts' --timeout 8000 --exit", + "test": "yarn build-contracts && mocha --require source-map-support/register --require ts-node/register 'test/**/*.spec.ts' --timeout 8000 --exit", "server:aggregator": "env DEBUG=\"info:*,error:*\" node ./build/src/exec/aggregator.js", "server:fullnode": "env DEBUG=\"info:*,error:*\" node ./build/src/exec/fullnode.js", - "server:fullnode:debug": "env DEBUG=\"info:*,error:*,debug:*\" node ./build/src/exec/fullnode.js" + "server:fullnode:debug": "env DEBUG=\"info:*,error:*,debug:*\" node ./build/src/exec/fullnode.js", + "clean-contracts": "rimraf ./test/contracts/build && mkdir ./test/contracts/build", + "build-contracts": "yarn clean-contracts && waffle waffle-config-untranspiled.json && waffle waffle-config-transpiled.json" }, "keywords": [ "plasma", diff --git a/packages/rollup-full-node/test/app/handler.spec.ts b/packages/rollup-full-node/test/app/handler.spec.ts index 7b018fc7bed..5418865adb2 100644 --- a/packages/rollup-full-node/test/app/handler.spec.ts +++ b/packages/rollup-full-node/test/app/handler.spec.ts @@ -9,7 +9,7 @@ import { deployOvmContract, DefaultWeb3Handler, } from '../../src/app' -import * as SimpleStorage from '../contracts/build/SimpleStorage.json' +import * as SimpleStorage from '../contracts/build/untranspiled/SimpleStorage.json' import { ethers, ContractFactory } from 'ethers' import { FullnodeHandler } from '../../src/types' diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/CallerGetter.sol b/packages/rollup-full-node/test/contracts/transpiled/CallerGetter.sol similarity index 100% rename from packages/rollup-dev-tools/test/contracts/full-node-integration/CallerGetter.sol rename to packages/rollup-full-node/test/contracts/transpiled/CallerGetter.sol diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/CallerReturner.sol b/packages/rollup-full-node/test/contracts/transpiled/CallerReturner.sol similarity index 100% rename from packages/rollup-dev-tools/test/contracts/full-node-integration/CallerReturner.sol rename to packages/rollup-full-node/test/contracts/transpiled/CallerReturner.sol diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/ExtCode.sol b/packages/rollup-full-node/test/contracts/transpiled/ExtCode.sol similarity index 100% rename from packages/rollup-dev-tools/test/contracts/full-node-integration/ExtCode.sol rename to packages/rollup-full-node/test/contracts/transpiled/ExtCode.sol diff --git a/packages/rollup-full-node/test/contracts/transpiled/OriginGetter.sol b/packages/rollup-full-node/test/contracts/transpiled/OriginGetter.sol new file mode 100644 index 00000000000..61d41cbbbbb --- /dev/null +++ b/packages/rollup-full-node/test/contracts/transpiled/OriginGetter.sol @@ -0,0 +1,7 @@ +pragma solidity ^0.5.0; + +contract CallerGetter { + function getTxOrigin() public view returns(address) { + return tx.origin; + } +} \ No newline at end of file diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/SelfAware.sol b/packages/rollup-full-node/test/contracts/transpiled/SelfAware.sol similarity index 100% rename from packages/rollup-dev-tools/test/contracts/full-node-integration/SelfAware.sol rename to packages/rollup-full-node/test/contracts/transpiled/SelfAware.sol diff --git a/packages/rollup-full-node/test/contracts/transpiled/SimpleCaller.sol b/packages/rollup-full-node/test/contracts/transpiled/SimpleCaller.sol new file mode 100644 index 00000000000..2215e51fc04 --- /dev/null +++ b/packages/rollup-full-node/test/contracts/transpiled/SimpleCaller.sol @@ -0,0 +1,8 @@ +pragma solidity ^0.5.0; +import "./SimpleStorage.sol"; + +contract SimpleCaller { + function doGetStorageCall(address _target, bytes32 key) public view returns(bytes32) { + return SimpleStorage(_target).getStorage(key); + } +} \ No newline at end of file diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/SimpleStorage.sol b/packages/rollup-full-node/test/contracts/transpiled/SimpleStorage.sol similarity index 100% rename from packages/rollup-dev-tools/test/contracts/full-node-integration/SimpleStorage.sol rename to packages/rollup-full-node/test/contracts/transpiled/SimpleStorage.sol diff --git a/packages/rollup-dev-tools/test/contracts/full-node-integration/TimeGetter.sol b/packages/rollup-full-node/test/contracts/transpiled/TimeGetter.sol similarity index 100% rename from packages/rollup-dev-tools/test/contracts/full-node-integration/TimeGetter.sol rename to packages/rollup-full-node/test/contracts/transpiled/TimeGetter.sol diff --git a/packages/rollup-full-node/test/contracts/SimpleStorage.sol b/packages/rollup-full-node/test/contracts/untranspiled/SimpleStorage.sol similarity index 100% rename from packages/rollup-full-node/test/contracts/SimpleStorage.sol rename to packages/rollup-full-node/test/contracts/untranspiled/SimpleStorage.sol diff --git a/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts b/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts new file mode 100644 index 00000000000..f480013e178 --- /dev/null +++ b/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts @@ -0,0 +1,100 @@ +import '../../../rollup-dev-tools/test/setup' +/* External Imports */ +import { getLogger, remove0x, bufToHexString, hexStrToBuf } from '@eth-optimism/core-utils' +import { + Address, formatBytecode, bufferToBytecode +} from '@eth-optimism/rollup-core' + +/* Internal Imports */ + +import * as SimpleStorage from '../contracts/build/transpiled/SimpleStorage.json' +import * as SimpleCaller from '../contracts/build/transpiled/SimpleCaller.json' +import * as SelfAware from '../contracts/build/transpiled/SelfAware.json' +import * as CallerGetter from '../contracts/build/transpiled/CallerGetter.json' +import * as OriginGetter from '../contracts/build/transpiled/OriginGetter.json' +import * as CallerReturner from '../contracts/build/transpiled/CallerReturner.json' +import * as TimeGetter from '../contracts/build/transpiled/TimeGetter.json' + +import { + createMockProvider, getWallets, deployContract +} from '../../' + +describe.only(`Various opcodes should be usable in combination with transpiler and full node`, () => { + let provider + let wallet + + beforeEach(async () => { + provider = await createMockProvider() + const wallets = getWallets(provider) + wallet = wallets[0] + }) + + afterEach(() => { + provider.closeOVM() + }) + + // TEST BASIC FUNCTIONALITIES + + it('should process cross-ovm-contract calls', async () => { + const simpleStorage = await deployContract(wallet, SimpleStorage, [], []) + const simpleCaller = await deployContract(wallet, SimpleCaller, [], []) + + const storageKey = '0x' + '01'.repeat(32) + const storageValue = '0x' + '02'.repeat(32) + + await simpleStorage.setStorage(storageKey, storageValue) + + const res = await simpleCaller.doGetStorageCall( + simpleStorage.address, + storageKey + ) + res.should.equal(storageValue) + }) + it('should work for address(this)', async () => { + const selfAware = await deployContract(wallet, SelfAware, [], []) + const deployedAddress: Address = selfAware.address + const returnedAddress: Address = await selfAware.getMyAddress() + deployedAddress.should.equal(returnedAddress) + }) + it.skip('should work for block.timestamp', async () => { + // todo, handle timestamp and unskip this test + const timeGetter = await deployContract(wallet, TimeGetter, [], []) + console.log(`timegetter bytecode is: \n${formatBytecode(bufferToBytecode(hexStrToBuf(TimeGetter.bytecode)))}`) + const time = await timeGetter.getTimestamp() + time._hex.should.equal('???') + }) + it('should work for msg.sender', async () => { + const callerReturner = await deployContract(wallet, CallerReturner, [], []) + const callerGetter = await deployContract(wallet, CallerGetter, [], []) + const result = await callerGetter.getMsgSenderFrom( + callerReturner.address + ) + result.should.equal(callerGetter.address) + }) + it('should work for tx.origin', async () => { + const callerReturner = await deployContract(wallet, CallerReturner, [], []) + const callerGetter = await deployContract(wallet, CallerGetter, [], []) + const result = await callerGetter.getMsgSenderFrom( + callerReturner.address + ) + result.should.equal(callerGetter.address) + }) + + // SIMPLE STORAGE TEST + it('should set storage & retrieve the value', async () => { + const simpleStorage = await deployContract(wallet, SimpleStorage, [], []) + // Create some constants we will use for storage + const storageKey = '0x' + '01'.repeat(32) + const storageValue = '0x' + '02'.repeat(32) + // Set storage with our new storage elements + await simpleStorage.setStorage( + storageKey, + storageValue + ) + // Get the storage + const res = await simpleStorage.getStorage(storageKey) + // Verify we got the value! + res.should.equal(storageValue) + }) +}) + diff --git a/packages/rollup-full-node/waffle-config-transpiled.json b/packages/rollup-full-node/waffle-config-transpiled.json new file mode 100644 index 00000000000..f46bd52e831 --- /dev/null +++ b/packages/rollup-full-node/waffle-config-transpiled.json @@ -0,0 +1,14 @@ +{ + "sourcesPath": "./test/contracts/transpiled", + "targetPath": "./test/contracts/build/transpiled", + "npmPath": "../../node_modules", + "solcVersion": "../../node_modules/@eth-optimism/solc-transpiler", + "compilerOptions": { + "outputSelection": { + "*": { + "*": ["*"] + } + }, + "executionManagerAddress": "0xA193E42526F1FEA8C99AF609dcEabf30C1c29fAA" + } +} diff --git a/packages/rollup-full-node/waffle-config-untranspiled.json b/packages/rollup-full-node/waffle-config-untranspiled.json new file mode 100644 index 00000000000..dc9e37200bd --- /dev/null +++ b/packages/rollup-full-node/waffle-config-untranspiled.json @@ -0,0 +1,12 @@ +{ + "sourcesPath": "./test/contracts/untranspiled", + "targetPath": "./test/contracts/build/untranspiled", + "npmPath": "../../node_modules", + "compilerOptions": { + "outputSelection": { + "*": { + "*": ["*"] + } + } + } +} diff --git a/packages/rollup-full-node/waffle-config.json b/packages/rollup-full-node/waffle-config.json deleted file mode 100644 index 31feed29fcb..00000000000 --- a/packages/rollup-full-node/waffle-config.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "sourcesPath": "./test/contracts", - "targetPath": "./test/contracts/build", - "npmPath": "../../node_modules" -} diff --git a/yarn.lock b/yarn.lock index 26d2ecb8fad..83295b38829 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,84 +18,6 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@eth-optimism/core-db@0.0.1-alpha.8": - version "0.0.1-alpha.8" - resolved "https://registry.yarnpkg.com/@eth-optimism/core-db/-/core-db-0.0.1-alpha.8.tgz#7f38f11b495853d02e0a8cab50ff76cb17fbd409" - integrity sha512-rR+EtW/zcjNL8TxN3wTc+jEgk5IsymZKhQ+CVWuc569ht0tlXKZ6ByS4CWWcrWEgu9qOHvJTYu+1MMw8kb9wBQ== - dependencies: - "@eth-optimism/core-utils" "0.0.1-alpha.8" - abstract-leveldown "^6.2.2" - async-lock "^1.2.2" - chai "^4.2.0" - chai-as-promised "^7.1.1" - debug "^4.1.1" - ethers "^4.0.39" - level "^6.0.0" - memdown "^4.0.0" - -"@eth-optimism/core-utils@0.0.1-alpha.8": - version "0.0.1-alpha.8" - resolved "https://registry.yarnpkg.com/@eth-optimism/core-utils/-/core-utils-0.0.1-alpha.8.tgz#54965ec9c4c1eecbf49cb074da9e2d8b20dad9ae" - integrity sha512-DKYjj4sde6B3wtNTfME0XelvUz0mvqjilzPiooNg2+NMTufHIHr+TEQhwdI5kHHTBlozIeLg7l8uK0iJnkIOcQ== - dependencies: - abstract-leveldown "^6.2.2" - async-lock "^1.2.2" - axios "^0.19.0" - bn.js "^4.11.8" - body-parser "^1.19.0" - chai "^4.2.0" - chai-as-promised "^7.1.1" - debug "^4.1.1" - dotenv "^8.2.0" - ethers "^4.0.37" - express "^4.17.1" - memdown "^4.0.0" - ts-md5 "^1.2.4" - uuid "^3.3.3" - -"@eth-optimism/ovm@0.0.1-alpha.8": - version "0.0.1-alpha.8" - resolved "https://registry.yarnpkg.com/@eth-optimism/ovm/-/ovm-0.0.1-alpha.8.tgz#14e8f6af3adcf83f908a286ed2385178de600c3b" - integrity sha512-DAGVmC+CqpK5weqcgDVOMKCVK4FF3mbZp4zhykcRj6VrRAuJMk/MQ6uGrVig5zXagKkNR+WdmgfJrTJs8HRoGQ== - dependencies: - "@eth-optimism/core-db" "0.0.1-alpha.8" - "@eth-optimism/core-utils" "0.0.1-alpha.8" - "@eth-optimism/rollup-core" "0.0.1-alpha.8" - "@types/sinon-chai" "^3.2.2" - chai "^4.2.0" - ethereum-waffle "2.1.0" - ethers "^4.0.37" - ethlint "^1.2.5" - merkletreejs "^0.1.7" - openzeppelin-solidity "^2.2.0" - -"@eth-optimism/rollup-core@0.0.1-alpha.8": - version "0.0.1-alpha.8" - resolved "https://registry.yarnpkg.com/@eth-optimism/rollup-core/-/rollup-core-0.0.1-alpha.8.tgz#591793246f2c057e5a7ddd316c0764c397f566c0" - integrity sha512-+4Rr4NzWo36SHaX5214AvuaDs+qdoKKxPwjlI32u8bMxe9o+Lc6bfKlE/40P6IBc5cbqU5FTZiFJRxIw5daSEA== - dependencies: - "@eth-optimism/core-db" "0.0.1-alpha.8" - "@eth-optimism/core-utils" "0.0.1-alpha.8" - async-lock "^1.2.2" - ethers "^4.0.39" - -"@eth-optimism/rollup-full-node@^0.0.1-alpha.8": - version "0.0.1-alpha.8" - resolved "https://registry.yarnpkg.com/@eth-optimism/rollup-full-node/-/rollup-full-node-0.0.1-alpha.8.tgz#dbe6e57480844b01fd9ab7b6b077b8059c74c96d" - integrity sha512-fJWC05qt13cqCo4VkA8/8SpcgvADnAGOZGcyyYGxnAvTNzXRvBFeTMW5woZl5UX8FLOyHPyLUewY0/mVBeQ3BA== - dependencies: - "@eth-optimism/core-db" "0.0.1-alpha.8" - "@eth-optimism/core-utils" "0.0.1-alpha.8" - "@eth-optimism/ovm" "0.0.1-alpha.8" - "@eth-optimism/rollup-core" "0.0.1-alpha.8" - async-lock "^1.2.2" - axios "^0.19.0" - cors "^2.8.5" - dotenv "^8.2.0" - ethereum-waffle "2.1.0" - ethers "^4.0.39" - fastpriorityqueue "^0.6.3" - "@evocateur/libnpmaccess@^3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz#ecf7f6ce6b004e9f942b098d92200be4a4b1c845" From b5df6f04d50dcc985c28b700ece85446f2656ad5 Mon Sep 17 00:00:00 2001 From: ben-chain Date: Thu, 20 Feb 2020 13:37:12 -0800 Subject: [PATCH 11/13] add txorigin test --- .../test/contracts/transpiled/OriginGetter.sol | 2 +- .../test/integration/transpiler-integration.spec.ts | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/rollup-full-node/test/contracts/transpiled/OriginGetter.sol b/packages/rollup-full-node/test/contracts/transpiled/OriginGetter.sol index 61d41cbbbbb..15ee4b4fbba 100644 --- a/packages/rollup-full-node/test/contracts/transpiled/OriginGetter.sol +++ b/packages/rollup-full-node/test/contracts/transpiled/OriginGetter.sol @@ -1,6 +1,6 @@ pragma solidity ^0.5.0; -contract CallerGetter { +contract OriginGetter { function getTxOrigin() public view returns(address) { return tx.origin; } diff --git a/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts b/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts index f480013e178..670159fb4fb 100644 --- a/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts +++ b/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts @@ -56,7 +56,7 @@ describe.only(`Various opcodes should be usable in combination with transpiler a const returnedAddress: Address = await selfAware.getMyAddress() deployedAddress.should.equal(returnedAddress) }) - it.skip('should work for block.timestamp', async () => { + it('should work for block.timestamp', async () => { // todo, handle timestamp and unskip this test const timeGetter = await deployContract(wallet, TimeGetter, [], []) console.log(`timegetter bytecode is: \n${formatBytecode(bufferToBytecode(hexStrToBuf(TimeGetter.bytecode)))}`) @@ -72,12 +72,9 @@ describe.only(`Various opcodes should be usable in combination with transpiler a result.should.equal(callerGetter.address) }) it('should work for tx.origin', async () => { - const callerReturner = await deployContract(wallet, CallerReturner, [], []) - const callerGetter = await deployContract(wallet, CallerGetter, [], []) - const result = await callerGetter.getMsgSenderFrom( - callerReturner.address - ) - result.should.equal(callerGetter.address) + const originGetter = await deployContract(wallet, OriginGetter, [], []) + const result = await originGetter.getTxOrigin() + result.should.equal(wallet.address) }) // SIMPLE STORAGE TEST From 14b8401ef099c250cdf5ae1315af73c3d5ff570c Mon Sep 17 00:00:00 2001 From: ben-chain Date: Thu, 20 Feb 2020 21:22:24 -0800 Subject: [PATCH 12/13] finish dep struggles --- packages/rollup-dev-tools/package.json | 2 +- packages/rollup-full-node/package.json | 5 +- .../transpiler-integration.spec.ts | 34 +- yarn.lock | 392 +----------------- 4 files changed, 34 insertions(+), 399 deletions(-) diff --git a/packages/rollup-dev-tools/package.json b/packages/rollup-dev-tools/package.json index c1b2235b224..0b62afa059d 100644 --- a/packages/rollup-dev-tools/package.json +++ b/packages/rollup-dev-tools/package.json @@ -12,7 +12,7 @@ "clean": "rimraf build/ && yarn clean-contracts", "fix": "prettier --config ../../prettier-config.json --write 'index.ts' '{src,test}/**/*.ts'", "lint": "tslint --format stylish --project .", - "clean-contracts": "rimraf ./test/contracts/build && mkdir ./test/contracts/build && mkdir ./test/contracts/build/transpiled && mkdir ./test/contracts/build/untranspiled", + "clean-contracts": "rimraf ./test/contracts/build && mkdir ./test/contracts/build", "build-contracts": "yarn clean-contracts && waffle waffle-config.json", "test": "mocha --require ts-node/register 'test/**/*.spec.ts' --timeout 5000 --exit", "transpile": "node ./build/src/transpiler/exec/transpiler.js " diff --git a/packages/rollup-full-node/package.json b/packages/rollup-full-node/package.json index ef5fdac4242..0bc49401a98 100644 --- a/packages/rollup-full-node/package.json +++ b/packages/rollup-full-node/package.json @@ -9,14 +9,14 @@ "scripts": { "all": "yarn clean && yarn build && yarn test && yarn fix && yarn lint", "build": "waffle waffle-config-untranspiled.json && waffle waffle-config-transpiled.json && tsc -p .", - "clean": "rimraf build/ && rimraf test/contracts/build", + "clean": "rimraf build/ && yarn clean-contracts", "fix": "prettier --config ../../prettier-config.json --write 'index.ts' '{src,test}/**/*.ts'", "lint": "tslint --format stylish --project .", "test": "yarn build-contracts && mocha --require source-map-support/register --require ts-node/register 'test/**/*.spec.ts' --timeout 8000 --exit", "server:aggregator": "env DEBUG=\"info:*,error:*\" node ./build/src/exec/aggregator.js", "server:fullnode": "env DEBUG=\"info:*,error:*\" node ./build/src/exec/fullnode.js", "server:fullnode:debug": "env DEBUG=\"info:*,error:*,debug:*\" node ./build/src/exec/fullnode.js", - "clean-contracts": "rimraf ./test/contracts/build && mkdir ./test/contracts/build", + "clean-contracts": "rimraf ./test/contracts/build && mkdir ./test/contracts/build && mkdir ./test/contracts/build/transpiled && mkdir ./test/contracts/build/untranspiled", "build-contracts": "yarn clean-contracts && waffle waffle-config-untranspiled.json && waffle waffle-config-transpiled.json" }, "keywords": [ @@ -38,6 +38,7 @@ "@eth-optimism/core-utils": "0.0.1-alpha.9", "@eth-optimism/ovm": "0.0.1-alpha.9", "@eth-optimism/rollup-core": "0.0.1-alpha.9", + "@eth-optimism/solc-transpiler": "^0.0.1-alpha.9", "async-lock": "^1.2.2", "axios": "^0.19.0", "cors": "^2.8.5", diff --git a/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts b/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts index 670159fb4fb..df22cc5b841 100644 --- a/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts +++ b/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts @@ -1,8 +1,15 @@ import '../../../rollup-dev-tools/test/setup' /* External Imports */ -import { getLogger, remove0x, bufToHexString, hexStrToBuf } from '@eth-optimism/core-utils' import { - Address, formatBytecode, bufferToBytecode + getLogger, + remove0x, + bufToHexString, + hexStrToBuf, +} from '@eth-optimism/core-utils' +import { + Address, + formatBytecode, + bufferToBytecode, } from '@eth-optimism/rollup-core' /* Internal Imports */ @@ -15,11 +22,9 @@ import * as OriginGetter from '../contracts/build/transpiled/OriginGetter.json' import * as CallerReturner from '../contracts/build/transpiled/CallerReturner.json' import * as TimeGetter from '../contracts/build/transpiled/TimeGetter.json' -import { - createMockProvider, getWallets, deployContract -} from '../../' +import { createMockProvider, getWallets, deployContract } from '../../' -describe.only(`Various opcodes should be usable in combination with transpiler and full node`, () => { +describe(`Various opcodes should be usable in combination with transpiler and full node`, () => { let provider let wallet @@ -34,7 +39,7 @@ describe.only(`Various opcodes should be usable in combination with transpiler a }) // TEST BASIC FUNCTIONALITIES - + it('should process cross-ovm-contract calls', async () => { const simpleStorage = await deployContract(wallet, SimpleStorage, [], []) const simpleCaller = await deployContract(wallet, SimpleCaller, [], []) @@ -56,19 +61,16 @@ describe.only(`Various opcodes should be usable in combination with transpiler a const returnedAddress: Address = await selfAware.getMyAddress() deployedAddress.should.equal(returnedAddress) }) - it('should work for block.timestamp', async () => { - // todo, handle timestamp and unskip this test + it.skip('should work for block.timestamp', async () => { + // todo, once we handle timestamps, unskip this test const timeGetter = await deployContract(wallet, TimeGetter, [], []) - console.log(`timegetter bytecode is: \n${formatBytecode(bufferToBytecode(hexStrToBuf(TimeGetter.bytecode)))}`) const time = await timeGetter.getTimestamp() time._hex.should.equal('???') }) it('should work for msg.sender', async () => { const callerReturner = await deployContract(wallet, CallerReturner, [], []) const callerGetter = await deployContract(wallet, CallerGetter, [], []) - const result = await callerGetter.getMsgSenderFrom( - callerReturner.address - ) + const result = await callerGetter.getMsgSenderFrom(callerReturner.address) result.should.equal(callerGetter.address) }) it('should work for tx.origin', async () => { @@ -84,14 +86,10 @@ describe.only(`Various opcodes should be usable in combination with transpiler a const storageKey = '0x' + '01'.repeat(32) const storageValue = '0x' + '02'.repeat(32) // Set storage with our new storage elements - await simpleStorage.setStorage( - storageKey, - storageValue - ) + await simpleStorage.setStorage(storageKey, storageValue) // Get the storage const res = await simpleStorage.getStorage(storageKey) // Verify we got the value! res.should.equal(storageValue) }) }) - diff --git a/yarn.lock b/yarn.lock index f943fcb353d..0fb7e6ee418 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1254,11 +1254,6 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -app-module-path@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" - integrity sha1-ZBqlXft9am8KgUHEucCqULbCTdU= - append-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" @@ -2137,7 +2132,7 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== -bindings@^1.2.1, bindings@^1.3.1, bindings@^1.5.0: +bindings@^1.2.1, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== @@ -2874,11 +2869,6 @@ commander@2.11.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" integrity sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ== -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== - commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" @@ -3261,7 +3251,7 @@ debug@3.1.0, debug@=3.1.0: dependencies: ms "2.0.0" -debug@3.2.6, debug@^3.1.0, debug@^3.2.6: +debug@3.2.6, debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== @@ -3387,11 +3377,6 @@ deep-equal@~1.1.1: object-keys "^1.1.1" regexp.prototype.flags "^1.2.0" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - default-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" @@ -3523,11 +3508,6 @@ detect-indent@^5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - dezalgo@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" @@ -5679,7 +5659,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5776,7 +5756,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -7381,23 +7361,6 @@ mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: dependencies: minimist "0.0.8" -mocha@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== - dependencies: - browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" - diff "3.5.0" - escape-string-regexp "1.0.5" - glob "7.1.2" - growl "1.10.5" - he "1.1.1" - minimatch "3.0.4" - mkdirp "0.5.1" - supports-color "5.4.0" - mocha@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-4.1.0.tgz#7d86cfbcf35cb829e2754c32e17355ec05338794" @@ -7556,15 +7519,6 @@ napi-macros@~2.0.0: resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== -needle@^2.2.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.2.tgz#3342dea100b7160960a450dc8c22160ac712a528" - integrity sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -7642,22 +7596,6 @@ node-gyp@^5.0.2: tar "^4.4.12" which "^1.3.1" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -7741,7 +7679,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: semver "^5.6.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.6, npm-packlist@^1.4.4: +npm-packlist@^1.4.4: version "1.4.8" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== @@ -7766,7 +7704,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2, npmlog@^4.1.2: +npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -7959,11 +7897,6 @@ ordered-read-streams@^1.0.0: dependencies: readable-stream "^2.0.1" -original-require@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/original-require/-/original-require-1.0.1.tgz#0f130471584cd33511c5ec38c8d59213f9ac5e20" - integrity sha1-DxMEcVhM0zURxew4yNWSE/msXiA= - os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -8636,16 +8569,6 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - read-cmd-shim@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16" @@ -9044,7 +8967,7 @@ retry@^0.10.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -9121,11 +9044,6 @@ safe-regex@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - scrypt-js@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.3.tgz#bb0040be03043da9a012a2cea9fc9f852cfc87d4" @@ -9160,11 +9078,6 @@ scrypt@^6.0.2: dependencies: nan "^2.0.8" -scryptsy@2.1.0, scryptsy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" - integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== - scryptsy@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163" @@ -9172,6 +9085,11 @@ scryptsy@^1.2.1: dependencies: pbkdf2 "^3.0.3" +scryptsy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" + integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== + secp256k1@^3.0.1: version "3.8.0" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" @@ -9220,11 +9138,6 @@ semver-greatest-satisfied-range@^1.1.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.2.0.tgz#4d813d9590aaf8a9192693d6c85b9344de5901db" - integrity sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A== - semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -9785,7 +9698,7 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= -strip-json-comments@2.0.1, strip-json-comments@~2.0.1: +strip-json-comments@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= @@ -9806,13 +9719,6 @@ supports-color@4.4.0: dependencies: has-flag "^2.0.0" -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== - dependencies: - has-flag "^3.0.0" - supports-color@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" @@ -9931,7 +9837,7 @@ tar@^2.1.1: fstream "^1.0.12" inherits "2" -tar@^4.0.2, tar@^4.4.10, tar@^4.4.12, tar@^4.4.2, tar@^4.4.8: +tar@^4.0.2, tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -10147,25 +10053,6 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -truffle-hdwallet-provider@^1.0.17: - version "1.0.17" - resolved "https://registry.yarnpkg.com/truffle-hdwallet-provider/-/truffle-hdwallet-provider-1.0.17.tgz#fe8edd0d6974eeb31af9959e41525fb19abd74ca" - integrity sha512-s6DvSP83jiIAc6TUcpr7Uqnja1+sLGJ8og3X7n41vfyC4OCaKmBtXL5HOHf+SsU3iblOvnbFDgmN6Y1VBL/fsg== - dependencies: - any-promise "^1.3.0" - bindings "^1.3.1" - web3 "1.2.1" - websocket "^1.0.28" - -truffle@^5.1.12: - version "5.1.13" - resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.1.13.tgz#f0a071342616f23a52bceaedae4feaec0bc4d549" - integrity sha512-d+DKgNE389/WmSb68sDu/DnMpex18bx7edw4waSEESdynwTgocsPFumgWqzmmUTxjnaRAScPC7oA5X6ZVSKwLQ== - dependencies: - app-module-path "^2.2.0" - mocha "5.2.0" - original-require "1.0.1" - ts-md5@^1.2.4: version "1.2.7" resolved "https://registry.yarnpkg.com/ts-md5/-/ts-md5-1.2.7.tgz#b76471fc2fd38f0502441f6c3b9494ed04537401" @@ -10666,15 +10553,6 @@ web3-bzz@1.0.0-beta.35: swarm-js "0.1.37" underscore "1.8.3" -web3-bzz@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.1.tgz#c3bd1e8f0c02a13cd6d4e3c3e9e1713f144f6f0d" - integrity sha512-LdOO44TuYbGIPfL4ilkuS89GQovxUpmLz6C1UC7VYVVRILeZS740FVB3j9V4P4FHUk1RenaDfKhcntqgVCHtjw== - dependencies: - got "9.6.0" - swarm-js "0.1.39" - underscore "1.9.1" - web3-bzz@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.4.tgz#a4adb7a8cba3d260de649bdb1f14ed359bfb3821" @@ -10694,15 +10572,6 @@ web3-core-helpers@1.0.0-beta.35: web3-eth-iban "1.0.0-beta.35" web3-utils "1.0.0-beta.35" -web3-core-helpers@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.1.tgz#f5f32d71c60a4a3bd14786118e633ce7ca6d5d0d" - integrity sha512-Gx3sTEajD5r96bJgfuW377PZVFmXIH4TdqDhgGwd2lZQCcMi+DA4TgxJNJGxn0R3aUVzyyE76j4LBrh412mXrw== - dependencies: - underscore "1.9.1" - web3-eth-iban "1.2.1" - web3-utils "1.2.1" - web3-core-helpers@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.4.tgz#ffd425861f4d66b3f38df032afdb39ea0971fc0f" @@ -10723,17 +10592,6 @@ web3-core-method@1.0.0-beta.35: web3-core-subscriptions "1.0.0-beta.35" web3-utils "1.0.0-beta.35" -web3-core-method@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.1.tgz#9df1bafa2cd8be9d9937e01c6a47fc768d15d90a" - integrity sha512-Ghg2WS23qi6Xj8Od3VCzaImLHseEA7/usvnOItluiIc5cKs00WYWsNy2YRStzU9a2+z8lwQywPYp0nTzR/QXdQ== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.1" - web3-core-promievent "1.2.1" - web3-core-subscriptions "1.2.1" - web3-utils "1.2.1" - web3-core-method@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.4.tgz#a0fbc50b8ff5fd214021435cc2c6d1e115807aed" @@ -10753,14 +10611,6 @@ web3-core-promievent@1.0.0-beta.35: any-promise "1.3.0" eventemitter3 "1.1.1" -web3-core-promievent@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.1.tgz#003e8a3eb82fb27b6164a6d5b9cad04acf733838" - integrity sha512-IVUqgpIKoeOYblwpex4Hye6npM0aMR+kU49VP06secPeN0rHMyhGF0ZGveWBrGvf8WDPI7jhqPBFIC6Jf3Q3zw== - dependencies: - any-promise "1.3.0" - eventemitter3 "3.1.2" - web3-core-promievent@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.4.tgz#75e5c0f2940028722cdd21ba503ebd65272df6cb" @@ -10780,17 +10630,6 @@ web3-core-requestmanager@1.0.0-beta.35: web3-providers-ipc "1.0.0-beta.35" web3-providers-ws "1.0.0-beta.35" -web3-core-requestmanager@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.1.tgz#fa2e2206c3d738db38db7c8fe9c107006f5c6e3d" - integrity sha512-xfknTC69RfYmLKC+83Jz73IC3/sS2ZLhGtX33D4Q5nQ8yc39ElyAolxr9sJQS8kihOcM6u4J+8gyGMqsLcpIBg== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.1" - web3-providers-http "1.2.1" - web3-providers-ipc "1.2.1" - web3-providers-ws "1.2.1" - web3-core-requestmanager@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.4.tgz#0a7020a23fb91c6913c611dfd3d8c398d1e4b4a8" @@ -10811,15 +10650,6 @@ web3-core-subscriptions@1.0.0-beta.35: underscore "1.8.3" web3-core-helpers "1.0.0-beta.35" -web3-core-subscriptions@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.1.tgz#8c2368a839d4eec1c01a4b5650bbeb82d0e4a099" - integrity sha512-nmOwe3NsB8V8UFsY1r+sW6KjdOS68h8nuh7NzlWxBQT/19QSUGiERRTaZXWu5BYvo1EoZRMxCKyCQpSSXLc08g== - dependencies: - eventemitter3 "3.1.2" - underscore "1.9.1" - web3-core-helpers "1.2.1" - web3-core-subscriptions@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.4.tgz#0dc095b5cfd82baa527a39796e3515a846b21b99" @@ -10839,16 +10669,6 @@ web3-core@1.0.0-beta.35: web3-core-requestmanager "1.0.0-beta.35" web3-utils "1.0.0-beta.35" -web3-core@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.1.tgz#7278b58fb6495065e73a77efbbce781a7fddf1a9" - integrity sha512-5ODwIqgl8oIg/0+Ai4jsLxkKFWJYE0uLuE1yUKHNVCL4zL6n3rFjRMpKPokd6id6nJCNgeA64KdWQ4XfpnjdMg== - dependencies: - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-core-requestmanager "1.2.1" - web3-utils "1.2.1" - web3-core@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.4.tgz#2df13b978dcfc59c2abaa887d27f88f21ad9a9d6" @@ -10872,15 +10692,6 @@ web3-eth-abi@1.0.0-beta.35: web3-core-helpers "1.0.0-beta.35" web3-utils "1.0.0-beta.35" -web3-eth-abi@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.1.tgz#9b915b1c9ebf82f70cca631147035d5419064689" - integrity sha512-jI/KhU2a/DQPZXHjo2GW0myEljzfiKOn+h1qxK1+Y9OQfTcBMxrQJyH5AP89O6l6NZ1QvNdq99ThAxBFoy5L+g== - dependencies: - ethers "4.0.0-beta.3" - underscore "1.9.1" - web3-utils "1.2.1" - web3-eth-abi@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.4.tgz#5b73e5ef70b03999227066d5d1310b168845e2b8" @@ -10906,23 +10717,6 @@ web3-eth-accounts@1.0.0-beta.35: web3-core-method "1.0.0-beta.35" web3-utils "1.0.0-beta.35" -web3-eth-accounts@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.1.tgz#2741a8ef337a7219d57959ac8bd118b9d68d63cf" - integrity sha512-26I4qq42STQ8IeKUyur3MdQ1NzrzCqPsmzqpux0j6X/XBD7EjZ+Cs0lhGNkSKH5dI3V8CJasnQ5T1mNKeWB7nQ== - dependencies: - any-promise "1.3.0" - crypto-browserify "3.12.0" - eth-lib "0.2.7" - scryptsy "2.1.0" - semver "6.2.0" - underscore "1.9.1" - uuid "3.3.2" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-utils "1.2.1" - web3-eth-accounts@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.4.tgz#ada6edc49542354328a85cafab067acd7f88c288" @@ -10955,20 +10749,6 @@ web3-eth-contract@1.0.0-beta.35: web3-eth-abi "1.0.0-beta.35" web3-utils "1.0.0-beta.35" -web3-eth-contract@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.1.tgz#3542424f3d341386fd9ff65e78060b85ac0ea8c4" - integrity sha512-kYFESbQ3boC9bl2rYVghj7O8UKMiuKaiMkxvRH5cEDHil8V7MGEGZNH0slSdoyeftZVlaWSMqkRP/chfnKND0g== - dependencies: - underscore "1.9.1" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-core-promievent "1.2.1" - web3-core-subscriptions "1.2.1" - web3-eth-abi "1.2.1" - web3-utils "1.2.1" - web3-eth-contract@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.4.tgz#68ef7cc633232779b0a2c506a810fbe903575886" @@ -10984,20 +10764,6 @@ web3-eth-contract@1.2.4: web3-eth-abi "1.2.4" web3-utils "1.2.4" -web3-eth-ens@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.1.tgz#a0e52eee68c42a8b9865ceb04e5fb022c2d971d5" - integrity sha512-lhP1kFhqZr2nnbu3CGIFFrAnNxk2veXpOXBY48Tub37RtobDyHijHgrj+xTh+mFiPokyrapVjpFsbGa+Xzye4Q== - dependencies: - eth-ens-namehash "2.0.8" - underscore "1.9.1" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-promievent "1.2.1" - web3-eth-abi "1.2.1" - web3-eth-contract "1.2.1" - web3-utils "1.2.1" - web3-eth-ens@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.4.tgz#b95b3aa99fb1e35c802b9e02a44c3046a3fa065e" @@ -11020,14 +10786,6 @@ web3-eth-iban@1.0.0-beta.35: bn.js "4.11.6" web3-utils "1.0.0-beta.35" -web3-eth-iban@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.1.tgz#2c3801718946bea24e9296993a975c80b5acf880" - integrity sha512-9gkr4QPl1jCU+wkgmZ8EwODVO3ovVj6d6JKMos52ggdT2YCmlfvFVF6wlGLwi0VvNa/p+0BjJzaqxnnG/JewjQ== - dependencies: - bn.js "4.11.8" - web3-utils "1.2.1" - web3-eth-iban@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.4.tgz#8e0550fd3fd8e47a39357d87fe27dee9483ee476" @@ -11047,17 +10805,6 @@ web3-eth-personal@1.0.0-beta.35: web3-net "1.0.0-beta.35" web3-utils "1.0.0-beta.35" -web3-eth-personal@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.1.tgz#244e9911b7b482dc17c02f23a061a627c6e47faf" - integrity sha512-RNDVSiaSoY4aIp8+Hc7z+X72H7lMb3fmAChuSBADoEc7DsJrY/d0R5qQDK9g9t2BO8oxgLrLNyBP/9ub2Hc6Bg== - dependencies: - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-net "1.2.1" - web3-utils "1.2.1" - web3-eth-personal@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.4.tgz#3224cca6851c96347d9799b12c1b67b2a6eb232b" @@ -11088,25 +10835,6 @@ web3-eth@1.0.0-beta.35: web3-net "1.0.0-beta.35" web3-utils "1.0.0-beta.35" -web3-eth@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.1.tgz#b9989e2557c73a9e8ffdc107c6dafbe72c79c1b0" - integrity sha512-/2xly4Yry5FW1i+uygPjhfvgUP/MS/Dk+PDqmzp5M88tS86A+j8BzKc23GrlA8sgGs0645cpZK/999LpEF5UdA== - dependencies: - underscore "1.9.1" - web3-core "1.2.1" - web3-core-helpers "1.2.1" - web3-core-method "1.2.1" - web3-core-subscriptions "1.2.1" - web3-eth-abi "1.2.1" - web3-eth-accounts "1.2.1" - web3-eth-contract "1.2.1" - web3-eth-ens "1.2.1" - web3-eth-iban "1.2.1" - web3-eth-personal "1.2.1" - web3-net "1.2.1" - web3-utils "1.2.1" - web3-eth@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.4.tgz#24c3b1f1ac79351bbfb808b2ab5c585fa57cdd00" @@ -11135,15 +10863,6 @@ web3-net@1.0.0-beta.35: web3-core-method "1.0.0-beta.35" web3-utils "1.0.0-beta.35" -web3-net@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.1.tgz#edd249503315dd5ab4fa00220f6509d95bb7ab10" - integrity sha512-Yt1Bs7WgnLESPe0rri/ZoPWzSy55ovioaP35w1KZydrNtQ5Yq4WcrAdhBzcOW7vAkIwrsLQsvA+hrOCy7mNauw== - dependencies: - web3-core "1.2.1" - web3-core-method "1.2.1" - web3-utils "1.2.1" - web3-net@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.4.tgz#1d246406d3aaffbf39c030e4e98bce0ca5f25458" @@ -11213,14 +10932,6 @@ web3-providers-http@1.0.0-beta.35: web3-core-helpers "1.0.0-beta.35" xhr2-cookies "1.1.0" -web3-providers-http@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.1.tgz#c93ea003a42e7b894556f7e19dd3540f947f5013" - integrity sha512-BDtVUVolT9b3CAzeGVA/np1hhn7RPUZ6YYGB/sYky+GjeO311Yoq8SRDUSezU92x8yImSC2B+SMReGhd1zL+bQ== - dependencies: - web3-core-helpers "1.2.1" - xhr2-cookies "1.1.0" - web3-providers-http@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.4.tgz#514fcad71ae77832c2c15574296282fbbc5f4a67" @@ -11238,15 +10949,6 @@ web3-providers-ipc@1.0.0-beta.35: underscore "1.8.3" web3-core-helpers "1.0.0-beta.35" -web3-providers-ipc@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.1.tgz#017bfc687a8fc5398df2241eb98f135e3edd672c" - integrity sha512-oPEuOCwxVx8L4CPD0TUdnlOUZwGBSRKScCz/Ws2YHdr9Ium+whm+0NLmOZjkjQp5wovQbyBzNa6zJz1noFRvFA== - dependencies: - oboe "2.1.4" - underscore "1.9.1" - web3-core-helpers "1.2.1" - web3-providers-ipc@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.4.tgz#9d6659f8d44943fb369b739f48df09092be459bd" @@ -11265,15 +10967,6 @@ web3-providers-ws@1.0.0-beta.35: web3-core-helpers "1.0.0-beta.35" websocket "git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible" -web3-providers-ws@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.1.tgz#2d941eaf3d5a8caa3214eff8dc16d96252b842cb" - integrity sha512-oqsQXzu+ejJACVHy864WwIyw+oB21nw/pI65/sD95Zi98+/HQzFfNcIFneF1NC4bVF3VNX4YHTNq2I2o97LAiA== - dependencies: - underscore "1.9.1" - web3-core-helpers "1.2.1" - websocket "github:web3-js/WebSocket-Node#polyfill/globalThis" - web3-providers-ws@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.4.tgz#099ee271ee03f6ea4f5df9cfe969e83f4ce0e36f" @@ -11293,16 +10986,6 @@ web3-shh@1.0.0-beta.35: web3-core-subscriptions "1.0.0-beta.35" web3-net "1.0.0-beta.35" -web3-shh@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.1.tgz#4460e3c1e07faf73ddec24ccd00da46f89152b0c" - integrity sha512-/3Cl04nza5kuFn25bV3FJWa0s3Vafr5BlT933h26xovQ6HIIz61LmvNQlvX1AhFL+SNJOTcQmK1SM59vcyC8bA== - dependencies: - web3-core "1.2.1" - web3-core-method "1.2.1" - web3-core-subscriptions "1.2.1" - web3-net "1.2.1" - web3-shh@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.4.tgz#5c8ff5ab624a3b14f08af0d24d2b16c10e9f70dd" @@ -11326,19 +11009,6 @@ web3-utils@1.0.0-beta.35: underscore "1.8.3" utf8 "2.1.1" -web3-utils@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534" - integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA== - dependencies: - bn.js "4.11.8" - eth-lib "0.2.7" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randomhex "0.1.5" - underscore "1.9.1" - utf8 "3.0.0" - web3-utils@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.4.tgz#96832a39a66b05bf8862a5b0bdad2799d709d951" @@ -11366,19 +11036,6 @@ web3@1.0.0-beta.35: web3-shh "1.0.0-beta.35" web3-utils "1.0.0-beta.35" -web3@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.1.tgz#5d8158bcca47838ab8c2b784a2dee4c3ceb4179b" - integrity sha512-nNMzeCK0agb5i/oTWNdQ1aGtwYfXzHottFP2Dz0oGIzavPMGSKyVlr8ibVb1yK5sJBjrWVnTdGaOC2zKDFuFRw== - dependencies: - web3-bzz "1.2.1" - web3-core "1.2.1" - web3-eth "1.2.1" - web3-eth-personal "1.2.1" - web3-net "1.2.1" - web3-shh "1.2.1" - web3-utils "1.2.1" - web3@1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.4.tgz#6e7ab799eefc9b4648c2dab63003f704a1d5e7d9" @@ -11409,17 +11066,6 @@ websocket@1.0.29: typedarray-to-buffer "^3.1.5" yaeti "^0.0.6" -websocket@^1.0.28: - version "1.0.31" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.31.tgz#e5d0f16c3340ed87670e489ecae6144c79358730" - integrity sha512-VAouplvGKPiKFDTeCCO65vYHsyay8DqoBSlzIO3fayrfOgU94lQN5a1uWVnFrMLceTJw/+fQXR5PGbUVRaHshQ== - dependencies: - debug "^2.2.0" - es5-ext "^0.10.50" - nan "^2.14.0" - typedarray-to-buffer "^3.1.5" - yaeti "^0.0.6" - "websocket@git://github.com/frozeman/WebSocket-Node.git#browserifyCompatible": version "1.0.26" resolved "git://github.com/frozeman/WebSocket-Node.git#6c72925e3f8aaaea8dc8450f97627e85263999f2" @@ -11429,16 +11075,6 @@ websocket@^1.0.28: typedarray-to-buffer "^3.1.2" yaeti "^0.0.6" -"websocket@github:web3-js/WebSocket-Node#polyfill/globalThis": - version "1.0.29" - resolved "https://codeload.github.com/web3-js/WebSocket-Node/tar.gz/905deb4812572b344f5801f8c9ce8bb02799d82e" - dependencies: - debug "^2.2.0" - es5-ext "^0.10.50" - nan "^2.14.0" - typedarray-to-buffer "^3.1.5" - yaeti "^0.0.6" - whatwg-fetch@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" From a1e47d2b0417bd936b929bba13443b1a45900223 Mon Sep 17 00:00:00 2001 From: ben-chain Date: Wed, 4 Mar 2020 11:44:16 -0500 Subject: [PATCH 13/13] typo --- .../test/integration/transpiler-integration.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts b/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts index df22cc5b841..78a0405fbbd 100644 --- a/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts +++ b/packages/rollup-full-node/test/integration/transpiler-integration.spec.ts @@ -12,7 +12,7 @@ import { bufferToBytecode, } from '@eth-optimism/rollup-core' -/* Internal Imports */ +/* Contract Imports */ import * as SimpleStorage from '../contracts/build/transpiled/SimpleStorage.json' import * as SimpleCaller from '../contracts/build/transpiled/SimpleCaller.json'