diff --git a/.github/workflows/build-test-lint.yml b/.github/workflows/build-test-lint.yml index 00ed7c98a5d..20f52aee161 100644 --- a/.github/workflows/build-test-lint.yml +++ b/.github/workflows/build-test-lint.yml @@ -104,6 +104,13 @@ jobs: path: packages/examples/node_modules key: ${{ runner.os }}-${{ matrix.node }}-${{ hashFiles('packages/examples/package.json') }} + - name: Cache ovm-truffle-provider-wrapper deps + uses: actions/cache@v1 + id: cache_ovm-truffle-provider-wrapper + with: + path: packages/ovm-truffle-provider-wrapper/node_modules + key: ${{ runner.os }}-${{ matrix.node }}-${{ hashFiles('packages/ovm-truffle-provider-wrapper/package.json') }} + # END DEPENDENCY CACHING - name: Install Dependencies diff --git a/packages/docs/src/core/src/integrating-tests.rst b/packages/docs/src/core/src/integrating-tests.rst index c7828671302..66b18e853ef 100644 --- a/packages/docs/src/core/src/integrating-tests.rst +++ b/packages/docs/src/core/src/integrating-tests.rst @@ -49,14 +49,14 @@ Using With Truffle To use the transpiler with Truffle, set truffle's ``compilers.solc.version`` configuration to ``@eth-optimism/solc-transpiler``, and configure the ``EXECUTION_MANAGER_ADDRESS`` environment variable. -Currently, Truffle does not provide a clean way to use custom chain IDs, so we also need a custom function in Truffle's configuration file. +Currently, Truffle does not provide a clean way to use custom chain IDs, so we have created the ``@eth-optimism/ovm-truffle-provider-wrapper`` library to seamlessly wrap your provider of choice to handle this. example truffle-config.json: .. code-block:: json const HDWalletProvider = require('truffle-hdwallet-provider'); - + const wrapProvider = require('@eth-optimism/ovm-truffle-provider-wrapper'); 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 @@ -75,17 +75,7 @@ example truffle-config.json: 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; + return wrapProvider(new HDWalletProvider(mnemonic, "http://127.0.0.1:8545/", 0, 10)); }, gasPrice: 0, gas: 9000000, diff --git a/packages/examples/package.json b/packages/examples/package.json index 9456b630ef9..9b793c40da7 100644 --- a/packages/examples/package.json +++ b/packages/examples/package.json @@ -30,6 +30,7 @@ }, "dependencies": { "@eth-optimism/solc-transpiler": "~0.0.1-alpha.7", + "@eth-optimism/ovm-truffle-provider-wrapper": "~0.0.1-alpha.8", "ethereum-waffle": "2.1.0", "rimraf": "^2.6.3", "truffle": "^5.1.12", diff --git a/packages/examples/truffle-config-ovm.js b/packages/examples/truffle-config-ovm.js index e5de3bc3b33..d39b0e34b3e 100644 --- a/packages/examples/truffle-config-ovm.js +++ b/packages/examples/truffle-config-ovm.js @@ -1,12 +1,12 @@ -const HDWalletProvider = require('truffle-hdwallet-provider'); - -const mnemonic = 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat'; +const HDWalletProvider = require("truffle-hdwallet-provider"); +const wrapProvider = require("@eth-optimism/ovm-truffle-provider-wrapper"); +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"; const gasPrice = process.env.OVM_DEFAULT_GAS_PRICE || 0; const gas = process.env.OVM_DEFAULT_GAS || 9000000; -const chainId = process.env.OVM_CHAIN_ID || 108; + module.exports = { /** @@ -21,17 +21,7 @@ module.exports = { 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 = chainId - } - sendAsync.apply(this, args) - }; - return wallet; + return wrapProvider(new HDWalletProvider(mnemonic, "http://127.0.0.1:8545/", 0, 10)); }, gasPrice: gasPrice, gas: gas, diff --git a/packages/ovm-truffle-provider-wrapper/README.md b/packages/ovm-truffle-provider-wrapper/README.md new file mode 100644 index 00000000000..577a54b97c7 --- /dev/null +++ b/packages/ovm-truffle-provider-wrapper/README.md @@ -0,0 +1,29 @@ +# OVM Truffle Provider Wrapper +The OVM uses a specific `chainId`, which Truffle, at the moment, does not allow to be configured globally within a project, so this package simply wraps the provider that is used in order to set the `chainId` field on all transactions. + +## Configuration +ChainId defaults to 108 but is configurable by setting the `OVM_CHAIN_ID` environment variable. + +## Example Usage in truffle-config.js: +```$javascript +const HDWalletProvider = require('truffle-hdwallet-provider'); +const wrapProvider = require('@eth-optimism/ovm-truffle-provider-wrapper'); +const mnemonic = 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat'; + +module.exports = { + networks: { + // Note: Requires running the rollup-full-node locally. + test: { + provider: function () { + return wrapProvider(new HDWalletProvider(mnemonic, "http://127.0.0.1:8545/", 0, 10)); + }, + }, + }, + compilers: { + solc: { + // Add path to the solc-transpiler + version: "../../node_modules/@eth-optimism/solc-transpiler", + } + } +} +``` \ No newline at end of file diff --git a/packages/ovm-truffle-provider-wrapper/index.ts b/packages/ovm-truffle-provider-wrapper/index.ts new file mode 100644 index 00000000000..a5ae8708d14 --- /dev/null +++ b/packages/ovm-truffle-provider-wrapper/index.ts @@ -0,0 +1,19 @@ +module.exports = (provider: any) => { + if (typeof provider !== 'object' || !provider['sendAsync']) { + throw Error( + 'Invalid provider. Exepcted provider to conform to Truffle provider interface!' + ) + } + + const chainId = process.env.OVM_CHAIN_ID || 108 + const sendAsync = provider.sendAsync + + provider.sendAsync = function(...args) { + if (args[0].method === 'eth_sendTransaction') { + // To properly set chainID for all transactions. + args[0].params[0].chainId = chainId + } + sendAsync.apply(this, args) + } + return provider +} diff --git a/packages/ovm-truffle-provider-wrapper/package.json b/packages/ovm-truffle-provider-wrapper/package.json new file mode 100644 index 00000000000..7cf1b04a124 --- /dev/null +++ b/packages/ovm-truffle-provider-wrapper/package.json @@ -0,0 +1,41 @@ +{ + "name": "@eth-optimism/ovm-truffle-provider-wrapper", + "version": "0.0.1-alpha.8", + "description": "Optimism Truffle Provider Wrapper", + "main": "build/index.js", + "files": [ + "build/index.js" + ], + "scripts": { + "all": "yarn clean && yarn build && yarn fix && yarn lint", + "build": "tsc -p .", + "clean": "rimraf build/", + "fix": "prettier --config ../../prettier-config.json --write 'index.ts' ", + "lint": "tslint --format stylish --project ." + }, + "keywords": [ + "optimism", + "rollup", + "optimistic", + "ethereum", + "client" + ], + "homepage": "https://github.com/ethereum-optimism/optimism-monorepo/tree/master/packages/ovm-truffle-provider-wrapper#readme", + "license": "MIT", + "author": "Optimism PBC", + "repository": { + "type": "git", + "url": "https://github.com/ethereum-optimism/optimism-monorepo.git" + }, + "dependencies": { + }, + "devDependencies": { + "@types/node": "^12.0.7", + "rimraf": "^2.6.3", + "ts-node": "^8.2.0", + "typescript": "^3.5.1" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/ovm-truffle-provider-wrapper/tsconfig.json b/packages/ovm-truffle-provider-wrapper/tsconfig.json new file mode 100644 index 00000000000..4e8dbff6cfa --- /dev/null +++ b/packages/ovm-truffle-provider-wrapper/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "./../../tsconfig.json", + "compilerOptions": { + "outDir": "./build", + "resolveJsonModule": true + }, + "include": ["*.ts"] +} diff --git a/packages/ovm-truffle-provider-wrapper/tslint.json b/packages/ovm-truffle-provider-wrapper/tslint.json new file mode 100644 index 00000000000..7348d4d168d --- /dev/null +++ b/packages/ovm-truffle-provider-wrapper/tslint.json @@ -0,0 +1,6 @@ +{ + "extends": ["./../../tslint.json"], + "rules": { + "prettier": [true, "../../prettier-config.json"] + } +}